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.
259 lines
7.3 KiB
259 lines
7.3 KiB
local _, addon = ...
|
|
|
|
local outQuart = addon.EasingFunctions.outQuart;
|
|
|
|
|
|
local EXPANDED_WIDTH, EXPANDED_HEIGHT = 256, 156;
|
|
local COLLAPSED_WIDTH, COLLAPSED_HEIGHT = 60, 24;
|
|
|
|
local Toolbar, MainFrame;
|
|
|
|
|
|
local function SharedOnMouseMotionCallback(frame, mouseEnter)
|
|
if mouseEnter then
|
|
Toolbar:OnEnter();
|
|
else
|
|
Toolbar:OnLeave();
|
|
end
|
|
end
|
|
|
|
NarciScreenshotToolbarTransmogListMixin = {};
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:OnShow()
|
|
if self.Init then
|
|
self:Init();
|
|
end
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:OnHide()
|
|
self:SetScript("OnUpdate", nil);
|
|
self:SetSize(COLLAPSED_WIDTH, COLLAPSED_HEIGHT);
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:OnEvent()
|
|
if not self:IsFocused() then
|
|
self:Collapse();
|
|
end
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:SetFormat(token)
|
|
self.textFormat = token;
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:GetFormat()
|
|
return self.textFormat
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:UpdateTransmogList(forceUpdateWhenHidden)
|
|
if self.getItemListFunc and (self.Subframe:IsShown() or forceUpdateWhenHidden) then
|
|
self.Subframe.TextContainer:SetText(self.getItemListFunc(self:GetFormat(), self.includeItemID));
|
|
end
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:IsFocused()
|
|
return self:IsVisible() and self:IsMouseOver()
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:OnEnter()
|
|
SharedOnMouseMotionCallback(self, true);
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:OnLeave()
|
|
SharedOnMouseMotionCallback(self, false);
|
|
end
|
|
|
|
|
|
local function TokenButton_OnClick(self)
|
|
MainFrame:SetFormat(self.token);
|
|
for i, button in ipairs(MainFrame.tokens) do
|
|
if button == self then
|
|
button.Icon:SetSize(20, 20);
|
|
button.Icon:SetDesaturation(0);
|
|
else
|
|
button.Icon:SetSize(16, 16);
|
|
button.Icon:SetDesaturation(1);
|
|
end
|
|
end
|
|
MainFrame:UpdateTransmogList(true);
|
|
end
|
|
|
|
local function TokenButton_OnEnter(self)
|
|
self.Icon:SetVertexColor(1, 1, 1);
|
|
SharedOnMouseMotionCallback(self, true);
|
|
end
|
|
|
|
local function TokenButton_OnLeave(self)
|
|
self.Icon:SetVertexColor(0.8, 0.8, 0.8);
|
|
SharedOnMouseMotionCallback(self, false);
|
|
end
|
|
|
|
local function TokenButton_Create(parent, id)
|
|
local button = CreateFrame("Button", nil, parent);
|
|
button:SetSize(20, 20);
|
|
button.Icon = button:CreateTexture();
|
|
|
|
if id == 1 then
|
|
button.Icon:SetSize(20, 20);
|
|
button.Icon:SetDesaturation(0);
|
|
else
|
|
button.Icon:SetSize(16, 16);
|
|
button.Icon:SetDesaturation(1);
|
|
end
|
|
|
|
button.Icon:SetPoint("CENTER", button, "CENTER", 0, 0);
|
|
button.Icon:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Logos\\TextFormatTokens");
|
|
button.Icon:SetTexCoord((id - 1)*0.125, id*0.125, 0, 1);
|
|
button:SetScript("OnClick", TokenButton_OnClick);
|
|
button:SetScript("OnEnter", TokenButton_OnEnter);
|
|
button:SetScript("OnLeave", TokenButton_OnLeave);
|
|
button.Icon:SetVertexColor(0.8, 0.8, 0.8);
|
|
button:SetHitRectInsets(-2, -2, -2, -2);
|
|
|
|
return button
|
|
end
|
|
|
|
local function ItemIDButton_OnClick(self)
|
|
MainFrame.includeItemID = not MainFrame.includeItemID;
|
|
self.Tick:SetShown(MainFrame.includeItemID);
|
|
MainFrame:UpdateTransmogList(true);
|
|
end
|
|
|
|
local function ItemIDButton_OnEnter(self)
|
|
MainFrame.Subframe.ItemIDLabel:SetTextColor(1, 1, 1);
|
|
SharedOnMouseMotionCallback(self, true);
|
|
end
|
|
|
|
local function ItemIDButton_OnLeave(self)
|
|
MainFrame.Subframe.ItemIDLabel:SetTextColor(0.72, 0.72, 0.72);
|
|
SharedOnMouseMotionCallback(self, false);
|
|
end
|
|
|
|
|
|
local function ExpandButton_OnEnter(self)
|
|
self.ButtonText:SetTextColor(1, 1, 1);
|
|
SharedOnMouseMotionCallback(self, true);
|
|
end
|
|
|
|
local function ExpandButton_OnLeave(self)
|
|
self.ButtonText:SetTextColor(0.78, 0.33, 1);
|
|
SharedOnMouseMotionCallback(self, false);
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:OnLoad()
|
|
Toolbar = self:GetParent();
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:Init()
|
|
MainFrame = self;
|
|
|
|
--Create Token Buttons
|
|
local textFormats = {
|
|
"text", "reddit", "wowhead", "nga", "mmochampion",
|
|
};
|
|
|
|
self.tokens = {};
|
|
for i, token in ipairs(textFormats) do
|
|
self.tokens[i] = TokenButton_Create(self.Subframe, i);
|
|
self.tokens[i]:SetPoint("TOPLEFT", self, "TOPLEFT", 14 + 22*(i - 1), -14);
|
|
self.tokens[i].token = token;
|
|
end
|
|
|
|
self.Subframe.ItemIDToggle:SetScript("OnClick", ItemIDButton_OnClick);
|
|
self.Subframe.ItemIDToggle:SetScript("OnEnter", ItemIDButton_OnEnter);
|
|
self.Subframe.ItemIDToggle:SetScript("OnLeave", ItemIDButton_OnLeave);
|
|
|
|
local eb = self.ExpandButton;
|
|
eb.ButtonText:SetText(Narci.L["Copy Texts"]);
|
|
|
|
local buttonWidth = math.floor((eb.ButtonText:GetWidth() or 120) + 0.5) + 26;
|
|
self.collapsedWidth = buttonWidth;
|
|
COLLAPSED_WIDTH = buttonWidth;
|
|
|
|
eb:SetWidth(buttonWidth);
|
|
eb:SetScript("OnClick", function()
|
|
self:Expand();
|
|
end);
|
|
eb:SetScript("OnEnter", ExpandButton_OnEnter);
|
|
eb:SetScript("OnLeave", ExpandButton_OnLeave);
|
|
ExpandButton_OnLeave(eb);
|
|
|
|
self.Subframe.TextContainer.onMouseMotion = SharedOnMouseMotionCallback;
|
|
|
|
self:Collapse(true);
|
|
self.Init = nil;
|
|
end
|
|
|
|
local function Expand_OnUpdate(self, elapsed)
|
|
self.t = self.t + elapsed;
|
|
|
|
local w = outQuart(self.t, self.fromW, self.toW, 0.35);
|
|
local h = outQuart(self.t, self.fromH, self.toH, 0.35);
|
|
|
|
local delta;
|
|
|
|
if self.lastW then
|
|
delta = w - self.lastW;
|
|
self.lastW = w;
|
|
if delta < 0.2 and delta > -0.2 then
|
|
delta = 0;
|
|
end
|
|
else
|
|
self.lastW = w;
|
|
end
|
|
|
|
if self.t >= 0.35 or (delta and delta == 0) then
|
|
self:SetScript("OnUpdate", nil);
|
|
w, h = self.toW, self.toH;
|
|
end
|
|
|
|
self:SetSize(w, h);
|
|
end
|
|
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:Expand(instant)
|
|
self.Subframe:Show();
|
|
self.ExpandButton:Hide();
|
|
self:RegisterEvent("GLOBAL_MOUSE_DOWN");
|
|
self.lastW = nil;
|
|
|
|
if instant then
|
|
self:SetScript("OnUpdate", nil);
|
|
self:SetSize(EXPANDED_WIDTH, EXPANDED_HEIGHT);
|
|
else
|
|
self.t = 0;
|
|
self.fromW, self.fromH = self:GetSize();
|
|
self.toW, self.toH = EXPANDED_WIDTH, EXPANDED_HEIGHT;
|
|
self:SetScript("OnUpdate", Expand_OnUpdate);
|
|
self.Subframe.FadeIn:Play();
|
|
end
|
|
|
|
self:UpdateTransmogList(true);
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:Collapse(instant)
|
|
self.Subframe:Hide();
|
|
self.ExpandButton:Show();
|
|
self:UnregisterEvent("GLOBAL_MOUSE_DOWN");
|
|
self.lastW = nil;
|
|
|
|
if instant then
|
|
self:SetScript("OnUpdate", nil);
|
|
self:SetSize(COLLAPSED_WIDTH, COLLAPSED_HEIGHT);
|
|
else
|
|
self.t = 0;
|
|
self.fromW, self.fromH = self:GetSize();
|
|
self.toW, self.toH = COLLAPSED_WIDTH, COLLAPSED_HEIGHT;
|
|
self:SetScript("OnUpdate", Expand_OnUpdate);
|
|
end
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:ShowUI()
|
|
self:Collapse(true);
|
|
self:Show();
|
|
end
|
|
|
|
function NarciScreenshotToolbarTransmogListMixin:OnMouseDown(button)
|
|
if button == "RightButton" then
|
|
self:Collapse();
|
|
end
|
|
end
|