You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
7.7 KiB

local _, addon = ...
local CloseSocketingFrame = addon.CloseSocketingFrame;
local GemDataProvider = addon.GemDataProvider;
local FadeFrame = NarciFadeUI.Fade;
local GetSocketTypes = GetSocketTypes;
local SocketInventoryItem = SocketInventoryItem;
local MainFrame;
local SocketButtons = {};
local SIZE_REGULAR = 16;
local SIZE_SELECTED = 20;
local GetPixelByScale = NarciAPI.GetPixelByScale;
local PIXEL = 1;
local PixelPerfectController = {};
addon.PixelPerfectController = PixelPerfectController;
PixelPerfectController.objects = {};
function PixelPerfectController:SetScale(scale)
local pixel = GetPixelByScale(scale, 1);
PIXEL = pixel;
for _, object in pairs(self.objects) do
object:UpdatePixel(pixel);
end
end
NarciEquipmentSharedSquareButtonMixin = {};
function NarciEquipmentSharedSquareButtonMixin:OnLoad()
self.Exclusion:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Masks\\Exclusion", "CLAMPTOWHITE", "CLAMPTOWHITE", "NEAREST");
tinsert(PixelPerfectController.objects, self);
end
function NarciEquipmentSharedSquareButtonMixin:UpdatePixel(pixel)
local sizeInPixel = math.floor( (self.size or SIZE_REGULAR) / pixel + 0.5);
sizeInPixel = sizeInPixel + sizeInPixel % 2;
local size = sizeInPixel * pixel;
local borderSize = size - 4 * pixel;
local innerSize = borderSize - 2 * pixel;
self:SetSize(SIZE_REGULAR, SIZE_REGULAR);
self.Stroke:SetSize(size, size);
self.Border:SetSize(borderSize, borderSize)
self.Exclusion:SetSize(innerSize, innerSize);
end
function NarciEquipmentSharedSquareButtonMixin:SetBorderColor(r, g, b)
self.Border:SetColorTexture(r, g, b);
end
function NarciEquipmentSharedSquareButtonMixin:SetStrokeColor(r, g, b)
self.Stroke:SetColorTexture(r, g, b);
end
NarciSocketSelectButtonMixin = CreateFromMixins(NarciEquipmentSharedSquareButtonMixin);
function NarciSocketSelectButtonMixin:OnLoad()
self.Exclusion:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Masks\\Exclusion", "CLAMPTOWHITE", "CLAMPTOWHITE", "NEAREST");
self.Border:SetTexture("Interface\\AddOns\\Narcissus\\Art\\EquipmentOption\\SocketTexture");
self:SetBorderColor(0.25, 0.25, 0.25);
end
function NarciSocketSelectButtonMixin:OnShow()
self:UpdatePixel(PIXEL);
end
function NarciSocketSelectButtonMixin:OnEnter()
self:SetBorderColor(1, 1, 1);
local fontString = self:GetParent().SocketName;
if self.gemName then
local r, g, b = NarciAPI.GetItemQualityColorByItemID(self.gemLink);
fontString:SetTextColor(r, g, b);
fontString:SetText(string.format("%s\n|cffcccccc#%d %s|r", self.gemName, self.id, self.localizedName));
else
fontString:SetText(string.format("#%d %s", self.id, self.localizedName));
fontString:SetTextColor(0.92, 0.92, 0.92);
end
fontString:Show();
FadeFrame(fontString, 0.15, 1);
FadeFrame(self:GetParent().TextShadow, 0.15, 1);
end
function NarciSocketSelectButtonMixin:OnLeave()
if not self.selected then
self:SetBorderColor(0.25, 0.25, 0.25);
end
FadeFrame(self:GetParent().SocketName, 0.2, 0);
FadeFrame(self:GetParent().TextShadow, 0.2, 0);
end
function NarciSocketSelectButtonMixin:Select()
for _, button in pairs(SocketButtons) do
if button == self then
button.selected = true;
button.size = SIZE_SELECTED;
button:SetBorderColor(1, 1, 1);
else
button.selected = nil;
button.size = SIZE_REGULAR;
button:SetBorderColor(0.25, 0.25, 0.25);
end
button:UpdatePixel(PIXEL);
end
end
function NarciSocketSelectButtonMixin:OnClick()
self:Select();
MainFrame:SetSocketOrderID(self.id);
MainFrame:ShowGemList(self.socketTypeName);
end
function NarciSocketSelectButtonMixin:SetSocketType(englishName)
local typeName;
if englishName then
typeName = _G["EMPTY_SOCKET_"..string.upper(englishName)];
end
self.localizedName = typeName or englishName;
self.socketTypeName = englishName;
end
NarciSocketSelectMixin = {};
function NarciSocketSelectMixin:OnLoad()
MainFrame = self:GetParent():GetParent();
end
function NarciSocketSelectMixin:OnHide()
self.anySelection = nil;
end
function NarciSocketSelectMixin:SetupFromItemLink(itemLink)
local anyPending;
local selectedSocketType;
local socektInfo = NarciAPI.GetItemSocketInfo(itemLink);
local numSockets = (socektInfo and #socektInfo) or 0;
local selectedSocketID = MainFrame:GetSocketOrderID() or 1;
if numSockets > 0 then
if selectedSocketID > numSockets then
selectedSocketID = 1
end
local socketName, icon, gemLink, socketType;
for i = 1, numSockets do
if not SocketButtons[i] then
SocketButtons[i] = CreateFrame("Button", nil, self, "NarciSocketSelectButtonTemplate");
SocketButtons[i].id = i;
SocketButtons[i]:SetPoint("CENTER", self, "LEFT", 8 + 24 * (i - 1), 0);
end
socketName, icon, gemLink, socketType = unpack(socektInfo[i]);
SocketButtons[i].Icon:SetTexture(icon);
if gemLink then
SocketButtons[i].Icon:SetTexCoord(0.075, 0.925, 0.075, 0.925);
SocketButtons[i].gemName = socketName;
SocketButtons[i].gemLink = gemLink;
anyPending = true;
else
socketType = GemDataProvider:GetSocketTypeByLocalizedName(socketName) or socketType;
SocketButtons[i].Icon:SetTexCoord(0, 1, 0, 1);
SocketButtons[i].gemName = nil;
SocketButtons[i].gemLink = nil;
SocketButtons[i]:SetSocketType(socketType);
if not selectedSocketType then
selectedSocketType = socketType;
end
end
SocketButtons[i]:Show();
end
for i = numSockets + 1, 3 do
if SocketButtons[i] then
SocketButtons[i]:Hide();
SocketButtons[i].gemName = nil;
SocketButtons[i].gemLink = nil;
end
end
if numSockets > 1 then
self:Show();
else
self:Hide();
end
MainFrame:SetSocketOrderID(selectedSocketID);
else
MainFrame:SetSocketOrderID(selectedSocketID);
self:Hide();
return
end
if anyPending then
--use ItemSocketingFrame to get socket type order
local isNarcissusUI = MainFrame.isNarcissusUI;
if isNarcissusUI then
SocketInventoryItem(MainFrame.slotID);
end
local socketType;
for i = 1, numSockets do
if SocketButtons[i] then
socketType = GetSocketTypes(i);
SocketButtons[i]:SetSocketType(socketType);
if not selectedSocketType then
selectedSocketType = socketType;
end
end
end
if isNarcissusUI then
CloseSocketingFrame();
end
end
if not self.anySelection then
self.anySelection = true;
SocketButtons[1]:Select();
MainFrame:SetSocketOrderID(1);
end
return selectedSocketType
end
function NarciSocketSelectMixin:SetTypeHomogeneous(numSockets, typeName)
for i = 1, numSockets do
if SocketButtons[i] then
SocketButtons[i]:SetSocketType(typeName);
end
end
for i = numSockets + 1, 3 do
if SocketButtons[i] then
SocketButtons[i]:Hide();
end
end
self:Show();
end