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.
350 lines
10 KiB
350 lines
10 KiB
local _, addon = ...
|
|
|
|
local DoEmote = DoEmote;
|
|
local TakeScreenshot = Screenshot;
|
|
|
|
local EmoteTokenList = {
|
|
{"Talk", EMOTE94_CMD1}, {"TALKEX", EMOTE95_CMD1}, {"TALKQ", EMOTE96_CMD2}, {"Flee", YELL},
|
|
{"Kiss", EMOTE59_CMD1}, {"Salute", EMOTE79_CMD1}, {"Bye", EMOTE102_CMD1}, {"Bow", EMOTE17_CMD1},
|
|
{"Dance", EMOTE35_CMD1}, {"Read", EMOTE453_CMD2}, {"Train", EMOTE155_CMD1}, {"Chicken", EMOTE22_CMD1},
|
|
{"Clap", EMOTE24_CMD1}, {"Cheer", EMOTE21_CMD1}, {"Cackle", EMOTE61_CMD1},
|
|
{"Nod", EMOTE68_CMD1}, {"Doubt", EMOTE67_CMD1}, {"Point", EMOTE73_CMD1},
|
|
{"Rude", EMOTE78_CMD1}, {"Flex", EMOTE42_CMD1}, {"ROAR", EMOTE76_CMD1},
|
|
{"Cower", EMOTE29_CMD1}, {"Beg", EMOTE8_CMD1}, {"Cry", EMOTE32_CMD1},
|
|
{"Laydown", EMOTE62_CMD1}, {"Stand", EMOTE143_CMD1}, {"Sit", EMOTE87_CMD1}, {"Kneel", EMOTE60_CMD1},
|
|
}
|
|
|
|
local NUM_ROWS = 7;
|
|
|
|
|
|
local MainFrame;
|
|
local EmoteFrame;
|
|
local EmoteButtons;
|
|
|
|
|
|
local function EmoteFrame_OnUpdate(self, elapsed)
|
|
self.t = self.t + elapsed;
|
|
if self.t > 1 then
|
|
self:SetScript("OnUpdate", nil);
|
|
self.inCooldown = nil;
|
|
if self.autocapture then
|
|
TakeScreenshot();
|
|
end
|
|
end
|
|
end
|
|
|
|
local function EmoteButton_OnClick(self)
|
|
if not EmoteFrame.inCooldown then
|
|
EmoteFrame.inCooldown = true;
|
|
EmoteFrame.t = 0;
|
|
EmoteFrame:SetScript("OnUpdate", EmoteFrame_OnUpdate);
|
|
DoEmote(self.token, "none");
|
|
end
|
|
end
|
|
|
|
local function EmoteButton_OnEnter(self)
|
|
self.ButtonText:SetTextColor(1, 1, 1);
|
|
MainFrame:OnEnter();
|
|
end
|
|
|
|
local function EmoteButton_OnLeave(self)
|
|
self.ButtonText:SetTextColor(0.67, 0.67, 0.67);
|
|
MainFrame:OnLeave();
|
|
end
|
|
|
|
|
|
local function AutoCaptureButton_AdjustSize(self)
|
|
local width = self.ButtonText:GetWidth() + 32;
|
|
if width < 80 then
|
|
width = 80;
|
|
end
|
|
self:SetWidth(width);
|
|
end
|
|
|
|
local function AutoCaptureButton_UpdateVisual(self, isMouseOver)
|
|
if EmoteFrame.autocapture then
|
|
if isMouseOver then
|
|
self.Background:SetColorTexture(0.541, 0.459, 0.176);
|
|
self.BackgroundLeft:SetVertexColor(0.541, 0.459, 0.176);
|
|
else
|
|
self.Background:SetColorTexture(0.435, 0.360, 0.07);
|
|
self.BackgroundLeft:SetVertexColor(0.435, 0.360, 0.07);
|
|
end
|
|
else
|
|
if isMouseOver then
|
|
self.Background:SetColorTexture(0.2, 0.2, 0.2);
|
|
self.BackgroundLeft:SetVertexColor(0.2, 0.2, 0.2);
|
|
else
|
|
self.Background:SetColorTexture(0.12, 0.12, 0.12);
|
|
self.BackgroundLeft:SetVertexColor(0.12, 0.12, 0.12);
|
|
end
|
|
end
|
|
end
|
|
|
|
local function AutoCaptureButton_OnClick(self)
|
|
EmoteFrame.autocapture = not EmoteFrame.autocapture;
|
|
AutoCaptureButton_UpdateVisual(self, true);
|
|
end
|
|
|
|
local function AutoCaptureButton_OnEnter(self)
|
|
self.ButtonText:SetTextColor(1, 1, 1);
|
|
AutoCaptureButton_UpdateVisual(self, true);
|
|
MainFrame:OnEnter();
|
|
end
|
|
|
|
local function AutoCaptureButton_OnLeave(self)
|
|
if EmoteFrame.autocapture then
|
|
self.ButtonText:SetTextColor(0.8, 0.8, 0.8);
|
|
else
|
|
self.ButtonText:SetTextColor(0.67, 0.67, 0.67);
|
|
end
|
|
|
|
AutoCaptureButton_UpdateVisual(self, false);
|
|
MainFrame:OnLeave();
|
|
end
|
|
|
|
NarciDoEmoteFrameMixin = {};
|
|
|
|
function NarciDoEmoteFrameMixin:OnLoad()
|
|
EmoteFrame = self;
|
|
MainFrame = self:GetParent();
|
|
end
|
|
|
|
function NarciDoEmoteFrameMixin:Init()
|
|
--Sort by name
|
|
local function SortByName(a, b)
|
|
if a[2] and b[2] then
|
|
return a[2] < b[2]
|
|
else
|
|
return a[1] < b[1]
|
|
end
|
|
end
|
|
|
|
table.sort(EmoteTokenList, SortByName);
|
|
|
|
local trim = string.trim;
|
|
|
|
--Auto Capture Button
|
|
local ac = self.AutoCaptureToggle;
|
|
local bt = ac.ButtonText;
|
|
bt:ClearAllPoints();
|
|
bt:SetPoint("LEFT", ac, "LEFT", 24, 0);
|
|
bt:SetText(Narci.L["Auto Capture"]);
|
|
AutoCaptureButton_AdjustSize(ac);
|
|
AutoCaptureButton_OnLeave(ac);
|
|
ac:SetScript("OnClick", AutoCaptureButton_OnClick);
|
|
ac:SetScript("OnEnter", AutoCaptureButton_OnEnter);
|
|
ac:SetScript("OnLeave", AutoCaptureButton_OnLeave);
|
|
|
|
|
|
|
|
local X_MAX = 4;
|
|
local Y_MAX = math.ceil(#EmoteTokenList / X_MAX);
|
|
|
|
NUM_ROWS = Y_MAX;
|
|
|
|
local BUTTON_WIDTH = 60;
|
|
local BUTTON_HEIGHT = 24;
|
|
local TEXT_PADDING2 = 12;
|
|
local OFFSET_Y = BUTTON_HEIGHT + 2;
|
|
|
|
|
|
--Create Backdrop
|
|
local bg;
|
|
local anchorTo;
|
|
|
|
self.bgs = {};
|
|
|
|
for i = 1, Y_MAX do
|
|
if i == 1 then
|
|
anchorTo = self;
|
|
else
|
|
anchorTo = bg;
|
|
end
|
|
|
|
bg = self:CreateTexture(nil, "BACKGROUND");
|
|
bg:SetHeight(BUTTON_HEIGHT);
|
|
|
|
if i == 1 then
|
|
bg:SetPoint("TOPLEFT", anchorTo, "TOPLEFT", 0, -OFFSET_Y);
|
|
bg:SetPoint("TOPRIGHT", anchorTo, "TOPRIGHT", 0, -OFFSET_Y);
|
|
else
|
|
bg:SetPoint("TOPLEFT", anchorTo, "BOTTOMLEFT", 0, 0);
|
|
bg:SetPoint("TOPRIGHT", anchorTo, "BOTTOMRIGHT", 0, 0);
|
|
end
|
|
|
|
if i % 2 == 1 then
|
|
bg:SetColorTexture(0.1, 0.1, 0.1, 0.9);
|
|
else
|
|
bg:SetColorTexture(0.12, 0.12, 0.12, 0.9);
|
|
end
|
|
|
|
self.bgs[i] = bg;
|
|
end
|
|
|
|
|
|
--Create Buttons
|
|
if not EmoteButtons then
|
|
EmoteButtons = {}
|
|
end
|
|
|
|
local row = 1;
|
|
local col = 1;
|
|
local maxColWidth = BUTTON_WIDTH;
|
|
local button, text, textWidth;
|
|
local totalWidth = 0;
|
|
|
|
local LanguageDetector = NarciAPI.LanguageDetector;
|
|
|
|
for i, info in ipairs(EmoteTokenList) do
|
|
if not EmoteButtons[i] then
|
|
EmoteButtons[i] = CreateFrame("Button", nil, self, "NarciEmoteButtonTemplate");
|
|
end
|
|
button = EmoteButtons[i];
|
|
--button:SetPoint("TOPLEFT", self, "TOPLEFT", totalWidth, BUTTON_HEIGHT * (1 - row) - OFFSET_Y); --from top to bottom then left to right
|
|
button:SetPoint("LEFT", self.bgs[row], "LEFT", totalWidth, 0);
|
|
button:SetWidth(BUTTON_WIDTH);
|
|
button.token = info[1];
|
|
|
|
if info[2] then
|
|
text = trim(info[2],"/"); --remove the slash
|
|
if LanguageDetector(text) == "RM" then
|
|
text = string.upper(string.sub(text, 1, 1)) .. string.sub(text, 2); --upper initial
|
|
end
|
|
button.ButtonText:SetText(text);
|
|
|
|
textWidth = button.ButtonText:GetWidth() + TEXT_PADDING2;
|
|
if textWidth > maxColWidth then
|
|
maxColWidth = math.ceil(textWidth);
|
|
end
|
|
|
|
button:SetScript("OnClick", EmoteButton_OnClick);
|
|
button:SetScript("OnEnter", EmoteButton_OnEnter);
|
|
button:SetScript("OnLeave", EmoteButton_OnLeave);
|
|
button.ButtonText:SetTextColor(0.67, 0.67, 0.67);
|
|
else
|
|
button:Hide();
|
|
print("Narissus: Emote "..info[2].." does not exist");
|
|
end
|
|
|
|
row = row + 1;
|
|
if row > Y_MAX then
|
|
row = 1;
|
|
col = col + 1;
|
|
totalWidth = totalWidth + maxColWidth;
|
|
if maxColWidth > BUTTON_WIDTH then
|
|
maxColWidth = BUTTON_WIDTH;
|
|
for j = i - 1, i - Y_MAX do
|
|
EmoteButtons[j]:SetWidth(maxColWidth);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
self:SetSize(totalWidth, (Y_MAX + 1) * BUTTON_HEIGHT + 2);
|
|
|
|
EmoteTokenList = nil;
|
|
self.Init = nil;
|
|
NarciDoEmoteFrameMixin.Init = nil;
|
|
end
|
|
|
|
function NarciDoEmoteFrameMixin:UseSmallerFont(state)
|
|
local buttonHeight, fontObject;
|
|
|
|
if state and not self.isSmallFont then
|
|
self.isSmallFont = true;
|
|
buttonHeight = 20;
|
|
fontObject = "NarciFontNormal10Outline";
|
|
elseif (not state) and self.isSmallFont then
|
|
self.isSmallFont = nil;
|
|
buttonHeight = 24;
|
|
fontObject = "NarciFontMedium12";
|
|
end
|
|
|
|
if buttonHeight then
|
|
fontObject = _G[fontObject];
|
|
if not fontObject then return end;
|
|
|
|
for _, button in ipairs(EmoteButtons) do
|
|
button:SetHeight(buttonHeight);
|
|
button.ButtonText:SetFontObject(fontObject);
|
|
end
|
|
|
|
self.AutoCaptureToggle:SetHeight(buttonHeight);
|
|
self.AutoCaptureToggle.BackgroundLeft:SetSize(buttonHeight, buttonHeight);
|
|
self.AutoCaptureToggle.ButtonText:SetFontObject(fontObject);
|
|
AutoCaptureButton_AdjustSize(self.AutoCaptureToggle);
|
|
|
|
for _, bg in ipairs(self.bgs) do
|
|
bg:SetHeight(buttonHeight);
|
|
end
|
|
|
|
local offsetY = buttonHeight + 2; --Auto Capture button height plus gap
|
|
self.bgs[1]:SetPoint("TOPLEFT", self, "TOPLEFT", 0, -offsetY);
|
|
self.bgs[1]:SetPoint("TOPRIGHT", self, "TOPRIGHT", 0, -offsetY);
|
|
|
|
self:SetHeight( NUM_ROWS * buttonHeight + offsetY);
|
|
end
|
|
end
|
|
|
|
function NarciDoEmoteFrameMixin:OnShow()
|
|
self:RegisterEvent("GLOBAL_MOUSE_DOWN");
|
|
end
|
|
|
|
function NarciDoEmoteFrameMixin:OnEvent(event)
|
|
if not (self:IsMouseOverButtons() or (self.parentButton and self.parentButton:IsMouseOver()) ) then
|
|
self:Hide();
|
|
end
|
|
end
|
|
|
|
function NarciDoEmoteFrameMixin:OnHide()
|
|
self:UnregisterEvent("GLOBAL_MOUSE_DOWN");
|
|
self:SetScript("OnUpdate", nil);
|
|
self.inCooldown = nil;
|
|
|
|
if self.parentButton then
|
|
self.parentButton.isOn = nil;
|
|
self.parentButton:UpdateIcon();
|
|
end
|
|
end
|
|
|
|
function NarciDoEmoteFrameMixin:IsMouseOverButtons()
|
|
return self:IsVisible() and (self:IsMouseOver() or self.AutoCaptureToggle:IsMouseOver());
|
|
end
|
|
|
|
function NarciDoEmoteFrameMixin:IsFocused()
|
|
return self:IsVisible() and (self:IsMouseOver(6, -6, -6, 6) or self.AutoCaptureToggle:IsMouseOver());
|
|
end
|
|
|
|
function NarciDoEmoteFrameMixin:OnEnter()
|
|
MainFrame:OnEnter();
|
|
end
|
|
|
|
function NarciDoEmoteFrameMixin:OnLeave()
|
|
MainFrame:OnLeave();
|
|
end
|
|
|
|
function NarciDoEmoteFrameMixin:ShowUI()
|
|
if self.Init then
|
|
self:Init();
|
|
end
|
|
|
|
if self.newFontSize then
|
|
if self.newFontSize == 10 then
|
|
self:UseSmallerFont(true);
|
|
else
|
|
self:UseSmallerFont(false);
|
|
end
|
|
self.newFontSize = nil;
|
|
end
|
|
|
|
self.FlyUp:Stop();
|
|
self.FlyUp:Play();
|
|
self:Show();
|
|
end
|
|
|
|
function NarciDoEmoteFrameMixin:HideUI()
|
|
self.FlyUp:Stop();
|
|
self:Hide();
|
|
end
|