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.
957 lines
30 KiB
957 lines
30 KiB
local FadeFrame = NarciFadeUI.Fade;
|
|
|
|
local ActiveCharButton, ClassColorOption, MainContainer;
|
|
|
|
local LEVEL_CLASS_FORMAT = "|cffffffffLevel %d|r %s";
|
|
|
|
local expansionLogo = {
|
|
--Case-insensitive
|
|
[0] = "Classic",
|
|
[1] = "BC", --This one is somehow low-resolution
|
|
[2] = "Woltk",
|
|
[3] = "CC",
|
|
[4] = "MP",
|
|
[5] = "WOD",
|
|
[6] = "Legion",
|
|
[7] = "BattleforAzeroth",
|
|
[8] = "Shadowlands",
|
|
[9] = "Dragonflight",
|
|
[10] = "thewarwithin",
|
|
};
|
|
|
|
local expansionName = {
|
|
[0] = "Classic",
|
|
[1] = "The Burning Crusade",
|
|
[2] = "Wrath of the Lich King",
|
|
[3] = "Cataclysm",
|
|
[4] = "Mists of Pandaria",
|
|
[5] = "Warlords of Draenor",
|
|
[6] = "Legion",
|
|
[7] = "Battle for Azeroth",
|
|
[8] = "Shadowlands",
|
|
[9] = "Dragonflight",
|
|
[10] = "The War Within";
|
|
};
|
|
|
|
local classFiles = {
|
|
"WARRIOR", "PALADIN", "HUNTER", "ROGUE", "PRIEST", "DEATHKNIGHT", "SHAMAN", "MAGE", "WARLOCK", "MONK", "DRUID", "DEMONHUNTER", "EVOKER",
|
|
};
|
|
|
|
local InteractableWidgetSharedMixin = {}
|
|
|
|
function InteractableWidgetSharedMixin:ShowArea()
|
|
if not self.Area then
|
|
local tex = self:CreateTexture(nil, "BACKGROUND");
|
|
tex:SetColorTexture(0.5, 0.5, 1, 0.4);
|
|
tex:SetPoint("TOPLEFT", self, "TOPLEFT", 0, 0);
|
|
tex:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", 0, 0);
|
|
self.Area = tex;
|
|
end
|
|
self.Area:Show();
|
|
end
|
|
|
|
function InteractableWidgetSharedMixin:HideArea()
|
|
if self.Area then
|
|
self.Area:Hide();
|
|
end
|
|
end
|
|
|
|
function InteractableWidgetSharedMixin:OnEnter()
|
|
self:ShowArea();
|
|
end
|
|
|
|
function InteractableWidgetSharedMixin:OnLeave()
|
|
self:HideArea();
|
|
end
|
|
|
|
|
|
|
|
NarciGlueCharSelectCharacterButtonMixin = CreateFromMixins(InteractableWidgetSharedMixin);
|
|
|
|
function NarciGlueCharSelectCharacterButtonMixin:OnClick()
|
|
self:GetParent().CharacterOptionFrame:SetParentObject(self);
|
|
end
|
|
|
|
function NarciGlueCharSelectCharacterButtonMixin:SetFactionEmblem(factionID)
|
|
factionID = factionID or 0;
|
|
self.factionID = factionID;
|
|
if factionID == 0 then
|
|
self.FactionEmblem:Hide();
|
|
elseif factionID == 1 then
|
|
self.FactionEmblem:SetAtlas("CharacterSelection_Horde_Icon", true);
|
|
self.FactionEmblem:Show();
|
|
elseif factionID == 2 then
|
|
self.FactionEmblem:SetAtlas("CharacterSelection_Alliance_Icon", true);
|
|
self.FactionEmblem:Show();
|
|
end
|
|
end
|
|
|
|
function NarciGlueCharSelectCharacterButtonMixin:SetUp(name, level, className, classFileName, location, faction)
|
|
self:SetName(name);
|
|
self:SetLocation(location);
|
|
self.className = className;
|
|
local colorMixin = C_ClassColor.GetClassColor(classFileName);
|
|
if colorMixin then
|
|
self:SetClassColor( colorMixin:GetRGB() );
|
|
end
|
|
self:SetLevelAndName(level, className);
|
|
local factionID;
|
|
if faction then
|
|
if faction == "Horde" then
|
|
factionID = 1;
|
|
elseif faction == "Alliance" then
|
|
factionID = 2;
|
|
end
|
|
else
|
|
factionID = 0;
|
|
end
|
|
self:SetFactionEmblem(factionID);
|
|
self:Show();
|
|
end
|
|
|
|
function NarciGlueCharSelectCharacterButtonMixin:SetUnit(unit)
|
|
local name = UnitName(unit);
|
|
local level = UnitLevel(unit);
|
|
local className, classFileName = UnitClass(unit);
|
|
local location = GetRealZoneText();
|
|
local englishFaction = UnitFactionGroup(unit);
|
|
self:SetUp(name, level, className, classFileName, location, englishFaction);
|
|
end
|
|
|
|
function NarciGlueCharSelectCharacterButtonMixin:SetName(name)
|
|
if not name or name == "" then
|
|
name = "Player";
|
|
end
|
|
self.CharacterName:SetText(name);
|
|
end
|
|
|
|
function NarciGlueCharSelectCharacterButtonMixin:SetLevel(level)
|
|
level = tonumber(level or 0);
|
|
self.Info:SetText(string.format(LEVEL_CLASS_FORMAT, level, (self.className or "") ));
|
|
self.level = level;
|
|
end
|
|
|
|
function NarciGlueCharSelectCharacterButtonMixin:SetClass(className)
|
|
if not className or className == "" then
|
|
className = UnitClass("player");
|
|
end
|
|
self.className = className;
|
|
self.Info:SetText(string.format(LEVEL_CLASS_FORMAT, (self.level or 0), self.className));
|
|
end
|
|
|
|
function NarciGlueCharSelectCharacterButtonMixin:SetLevelAndName(level, className)
|
|
level = tonumber(level or 0);
|
|
self.level = level;
|
|
self.className = className;
|
|
self.Info:SetText(string.format(LEVEL_CLASS_FORMAT, level, (className or "") ));
|
|
end
|
|
|
|
function NarciGlueCharSelectCharacterButtonMixin:SetClassColor(r, g, b)
|
|
self.Info:SetTextColor(r, g, b);
|
|
end
|
|
|
|
function NarciGlueCharSelectCharacterButtonMixin:SetLocation(location)
|
|
if not location or location == "" then
|
|
location = GetRealZoneText();
|
|
end
|
|
self.Location:SetText(location);
|
|
end
|
|
|
|
|
|
NarciStickerExpansionLogoMixin = CreateFromMixins(InteractableWidgetSharedMixin);
|
|
|
|
function NarciStickerExpansionLogoMixin:OnClick()
|
|
local option = self.OptionFrame;
|
|
if not self.isLoaded then
|
|
--Create Options
|
|
self.isLoaded = true;
|
|
local button;
|
|
local numExpansions = #expansionName;
|
|
local height = 16;
|
|
local width;
|
|
local maxWidth = 0;
|
|
for i = 0, numExpansions, 1 do
|
|
button = CreateFrame("Button", nil, option, "NarciExpansionSelectionButtonTemplate");
|
|
button:SetPoint("TOPLEFT", option, "TOPLEFT", 0, -height * i - height*0.25);
|
|
width = button:Init(i) + 16;
|
|
if width > maxWidth then
|
|
maxWidth = width;
|
|
end
|
|
end
|
|
for k, b in pairs(option.ExpansionButtons) do
|
|
b:SetWidth(maxWidth);
|
|
end
|
|
option:SetHeight(height *(numExpansions + 1.5));
|
|
option:SetWidth(maxWidth);
|
|
end
|
|
option:Toggle();
|
|
end
|
|
|
|
local function SetExpansionLogo(expansionLevel)
|
|
local f = MainContainer.LogoSelect;
|
|
if expansionLogo[expansionLevel] then
|
|
local prefix;
|
|
if expansionLevel == 1 then
|
|
prefix = "Interface\\AddOns\\Narcissus\\Art\\Stickers\\Glues-WoW-%sLogo";
|
|
else
|
|
prefix = "Interface\\GLUES\\COMMON\\Glues-WoW-%sLogo";
|
|
end
|
|
f.ExpansionLogo:SetTexture( string.format(prefix, expansionLogo[expansionLevel]) );
|
|
f.ExpansionLogoMask:SetTexture( string.format(prefix, expansionLogo[expansionLevel]) );
|
|
|
|
local buttons = f.OptionFrame.ExpansionButtons;
|
|
if buttons then
|
|
for k, button in pairs(buttons) do
|
|
if button.id == expansionLevel then
|
|
button:DisableButton();
|
|
else
|
|
button:EnableButton();
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
NarciExpansionSelectionButtonMixin = {};
|
|
|
|
function NarciExpansionSelectionButtonMixin:Init(id)
|
|
self.id = id;
|
|
self.Label:SetText(expansionName[id]);
|
|
self:EnableButton();
|
|
self.Background:SetColorTexture(0.8, 0.8, 0.8, 0.85);
|
|
return self.Label:GetWidth();
|
|
end
|
|
|
|
function NarciExpansionSelectionButtonMixin:OnEnter()
|
|
self.Label:SetTextColor(1, 1, 1);
|
|
end
|
|
|
|
function NarciExpansionSelectionButtonMixin:OnLeave()
|
|
self.Label:SetTextColor(0.72, 0.72, 0.72);
|
|
end
|
|
|
|
function NarciExpansionSelectionButtonMixin:EnableButton()
|
|
self:Enable();
|
|
self.Label:SetTextColor(0.72, 0.72, 0.72);
|
|
self.Background:Hide();
|
|
end
|
|
|
|
function NarciExpansionSelectionButtonMixin:DisableButton()
|
|
self:Disable();
|
|
self.Label:SetTextColor(0, 0, 0);
|
|
self.Background:Show();
|
|
end
|
|
|
|
function NarciExpansionSelectionButtonMixin:OnClick()
|
|
SetExpansionLogo(self.id);
|
|
end
|
|
|
|
|
|
|
|
local function UpdateCharacterName(self, isUserInput)
|
|
if isUserInput then
|
|
if ActiveCharButton then
|
|
ActiveCharButton:SetName(self:GetText());
|
|
end
|
|
end
|
|
end
|
|
|
|
local function CharacterSelect_Init(self)
|
|
self:SetScript("OnShow", nil);
|
|
|
|
--Player name
|
|
local unit = "player";
|
|
local name = UnitName(unit);
|
|
|
|
local CharacterNameBox = CreateFrame("EditBox", nil, self, "NarciStickerEditableTextTemplate");
|
|
self.CharacterName = CharacterNameBox;
|
|
CharacterNameBox:SetSize(240, 32);
|
|
CharacterNameBox:SetFontObject("SystemFont22_Shadow_Outline");
|
|
CharacterNameBox:SetJustifyH("CENTER");
|
|
CharacterNameBox:SetJustifyV("BOTTOM");
|
|
CharacterNameBox:SetTextColor(1, 0.78, 0);
|
|
CharacterNameBox:SetPoint("BOTTOM", 0, 94);
|
|
CharacterNameBox:SetMaxLetters(16);
|
|
CharacterNameBox:SetText(name);
|
|
CharacterNameBox:SetScript("OnTextChanged", UpdateCharacterName);
|
|
|
|
local button;
|
|
button = CreateFrame("Frame", nil, self, "NarciGlueButtonSmallTemplate");
|
|
button:SetPoint("BOTTOMRIGHT", -10, 10);
|
|
button:SetSize(100, 28);
|
|
button:SetText("Back");
|
|
|
|
local DeleteButton = CreateFrame("Frame", nil, self, "NarciGlueButtonSmallTemplate");
|
|
DeleteButton:SetPoint("RIGHT", button, "LEFT", -10, 0);
|
|
DeleteButton:SetSize(144, 28);
|
|
DeleteButton:SetText("Delete Character");
|
|
|
|
button = CreateFrame("Frame", nil, self, "NarciGlueButtonSmallTemplate");
|
|
button:SetPoint("BOTTOMLEFT", 10, 10);
|
|
button:SetText("Menu");
|
|
|
|
local button2 = CreateFrame("Frame", nil, self, "NarciGlueButtonSmallTemplate");
|
|
button2:SetPoint("BOTTOM", button, "TOP", 0, 4);
|
|
button2:SetText("AddOns");
|
|
|
|
local button3 = CreateFrame("Frame", nil, self, "NarciGlueButtonSmallTemplate");
|
|
button3:SetPoint("BOTTOM", button2, "TOP", 0, 4);
|
|
button3:SetText("Shop");
|
|
button3:SetButtonAtlas("128-GoldRedButton");
|
|
button3.ButtonText:ClearAllPoints();
|
|
button3.ButtonText:SetPoint("CENTER", button3, "CENTER", 10, 0);
|
|
local logo = button3:CreateTexture(nil, "OVERLAY");
|
|
logo:SetSize(16, 16);
|
|
logo:SetPoint("RIGHT", button3.ButtonText, "LEFT", -3, 0);
|
|
logo:SetAtlas("128-Store-Main");
|
|
|
|
----Character List----
|
|
local cf = self.SelectCharacterFrame;
|
|
|
|
--Character Buttons
|
|
|
|
if not cf.CharacterButtons then
|
|
button = CreateFrame("Button", nil, cf, "NarciGlueCharSelectCharacterButtonTemplate");
|
|
button:SetPoint("TOP", cf, "TOP", 0, -60);
|
|
end
|
|
local buttons = cf.CharacterButtons;
|
|
button = buttons[1];
|
|
ActiveCharButton = button;
|
|
button:SetUnit("player");
|
|
|
|
--Change Realm
|
|
local realmName = GetRealmName();
|
|
local EditBox = CreateFrame("EditBox", nil, cf, "NarciStickerEditableTextTemplate");
|
|
EditBox:SetHeight(24);
|
|
EditBox:SetPoint("TOP", 0, -5);
|
|
EditBox:SetPoint("LEFT", 8, 0);
|
|
EditBox:SetPoint("RIGHT", -8, 0);
|
|
EditBox:SetFontObject("Narci_SystemFont_Shadow_Outline_Large");
|
|
EditBox:SetJustifyH("CENTER");
|
|
EditBox:SetTextColor(0.5, 0.5, 0.5);
|
|
EditBox:SetMaxLetters(20);
|
|
EditBox:SetScript("OnEditFocusLost", function(f)
|
|
f:OnEditFocusLost();
|
|
if f:GetText() then
|
|
f:SetText(realmName);
|
|
end
|
|
end);
|
|
EditBox:SetText(realmName);
|
|
|
|
button = CreateFrame("Frame", nil, cf, "NarciGlueButtonSmallTemplate");
|
|
button:SetPoint("TOP", EditBox, "BOTTOM", 0, 2);
|
|
button:SetText("Change Realm");
|
|
|
|
--Undelete Button
|
|
local Undelete = CreateFrame("Button", nil, cf);
|
|
Undelete:SetSize(28, 28);
|
|
Undelete:SetPoint("BOTTOMRIGHT", -16, 16);
|
|
Undelete:Disable();
|
|
Undelete:SetDisabledAtlas("128-RedButton-Refresh");
|
|
|
|
--"Create" Button
|
|
button = CreateFrame("Frame", nil, cf, "NarciGlueButtonSmallTemplate");
|
|
button:SetPoint("BOTTOMLEFT", cf, "BOTTOMLEFT", 16, 16);
|
|
button:SetPoint("RIGHT", Undelete, "LEFT", -10, 0);
|
|
button:SetText("Create New Character");
|
|
|
|
|
|
local EnterWorldButton = CreateFrame("Frame", nil, self, "NarciGlueButtonTemplate");
|
|
EnterWorldButton:SetPoint("BOTTOM", 0, 46);
|
|
EnterWorldButton:SetSize(185, 40);
|
|
EnterWorldButton:SetText("Enter World");
|
|
|
|
for i = 1, 2 do
|
|
local RotateButton = CreateFrame("Frame", nil, self);
|
|
RotateButton:SetSize(50, 50);
|
|
local Background = RotateButton:CreateTexture(nil, "BACKGROUND");
|
|
Background:SetSize(36, 36);
|
|
Background:SetPoint("CENTER", 0, 0);
|
|
Background:SetAtlas("common-button-square-gray-up");
|
|
local Icon = RotateButton:CreateTexture(nil, "OVERLAY");
|
|
Icon:SetSize(16, 16);
|
|
Icon:SetPoint("CENTER", 0, 0);
|
|
if i == 1 then
|
|
Icon:SetAtlas("common-icon-rotateleft");
|
|
RotateButton:SetPoint("TOP", EnterWorldButton, "BOTTOM", -16, 6);
|
|
else
|
|
Icon:SetAtlas("common-icon-rotateright");
|
|
RotateButton:SetPoint("TOP", EnterWorldButton, "BOTTOM", 16, 6);
|
|
end
|
|
end
|
|
end
|
|
|
|
local function LoginScreen_Init(self)
|
|
self:SetScript("OnShow", nil);
|
|
|
|
local version, internalVersion, date, tocVersion = GetBuildInfo();
|
|
local VERSION_TEMPLATE = "Version %s (%s) (Release x64)\n%s";
|
|
local ClientVersion = self:CreateFontString(nil, "OVERLAY", "NarciGlueFontNormalSmall");
|
|
ClientVersion:SetJustifyH("LEFT");
|
|
ClientVersion:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT", 10, 10);
|
|
ClientVersion:SetText( string.format(VERSION_TEMPLATE, version, internalVersion, date) );
|
|
|
|
local year = date:sub(#date - 3, #date);
|
|
local BLIZZ_DISCLAIMER_FORMAT = "Copyright 2004-%s Blizzard Entertainment. All Rights Reserved.";
|
|
local Disclaimer = self:CreateFontString(nil, "OVERLAY", "NarciGlueFontNormalSmall");
|
|
Disclaimer:SetPoint("BOTTOM", self, "BOTTOM", 0, 10);
|
|
Disclaimer:SetText( string.format(BLIZZ_DISCLAIMER_FORMAT, year) );
|
|
|
|
local button, lastButton;
|
|
|
|
local leftButtons = {
|
|
"Community Site", "My Account", "Create Account"
|
|
};
|
|
|
|
for i = 1, #leftButtons do
|
|
button = CreateFrame("Frame", nil, self, "NarciGlueButtonSmallTemplate");
|
|
if i == 1 then
|
|
button:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT", 17, 89);
|
|
else
|
|
button:SetPoint("BOTTOM", lastButton, "TOP", 0, 10);
|
|
end
|
|
button:SetSize(138, 28);
|
|
button:SetText(leftButtons[i]);
|
|
lastButton = button;
|
|
end
|
|
|
|
local rightButtons = {
|
|
"Quit", "Credits", "Cinematics", "System"
|
|
};
|
|
|
|
for i = 1, #rightButtons do
|
|
button = CreateFrame("Frame", nil, self, "NarciGlueButtonSmallTemplate");
|
|
if i == 1 then
|
|
button:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -12, 34);
|
|
elseif i == 2 then
|
|
button:SetPoint("BOTTOM", lastButton, "TOP", 0, 87);
|
|
else
|
|
button:SetPoint("BOTTOM", lastButton, "TOP", 0, 10);
|
|
end
|
|
button:SetSize(138, 28);
|
|
button:SetText(rightButtons[i]);
|
|
lastButton = button;
|
|
end
|
|
|
|
button = CreateFrame("Frame", nil, self, "NarciGlueEditBoxTemplate");
|
|
button.Label:SetText("Email or Phone");
|
|
button:SetPoint("BOTTOM", self, "BOTTOM", 0, 345);
|
|
|
|
button = CreateFrame("Frame", nil, self, "NarciGlueEditBoxTemplate");
|
|
button.Label:SetText("Password");
|
|
button:SetPoint("BOTTOM", self, "BOTTOM", 0, 275);
|
|
|
|
button = CreateFrame("Frame", nil, self, "NarciGlueButtonTemplate");
|
|
button:SetText("Log In");
|
|
button:SetSize(200, 30);
|
|
button:SetPoint("BOTTOM", self, "BOTTOM", 0, 180);
|
|
|
|
local logo = self:CreateTexture(nil, "OVERLAY");
|
|
logo:SetSize(100, 100);
|
|
logo:SetTexture("Interface\\Glues\\Mainmenu\\Glues-BlizzardLogo");
|
|
logo:SetPoint("BOTTOM", self, "BOTTOM", 0, 8);
|
|
end
|
|
|
|
local function LogoSelect_Init(self)
|
|
self:SetScript("OnShow", nil);
|
|
local expansionLevel = GetExpansionLevel();
|
|
if not expansionLogo[expansionLevel] then
|
|
expansionLevel = 8;
|
|
end
|
|
SetExpansionLogo(expansionLevel);
|
|
end
|
|
|
|
NarciPhotoModeStickerContainerMixin = {};
|
|
|
|
function NarciPhotoModeStickerContainerMixin:OnLoad()
|
|
MainContainer = self;
|
|
|
|
self.CharacterSelectUI:SetScript("OnShow", CharacterSelect_Init);
|
|
self.LoginScreen:SetScript("OnShow", LoginScreen_Init);
|
|
self.LogoSelect:SetScript("OnShow", LogoSelect_Init);
|
|
|
|
self.OnLoad = nil;
|
|
end
|
|
|
|
function NarciPhotoModeStickerContainerMixin:ShowOverlay(id)
|
|
self.LoginScreen:SetShown(id == 1);
|
|
self.CharacterSelectUI:SetShown(id == 2);
|
|
self:SetShown(id);
|
|
self.LogoSelect:SetShown(id);
|
|
end
|
|
|
|
function NarciPhotoModeStickerContainerMixin:OnHide()
|
|
self:ShowOverlay();
|
|
end
|
|
|
|
--/run NarciShowCharacterSelectUI()
|
|
|
|
|
|
NarciStickerEditableTextMixin = CreateFromMixins(InteractableWidgetSharedMixin); --EditBox
|
|
|
|
function NarciStickerEditableTextMixin:QuitEdit()
|
|
self:ClearFocus();
|
|
end
|
|
|
|
function NarciStickerEditableTextMixin:OnEditFocusGained()
|
|
|
|
end
|
|
|
|
function NarciStickerEditableTextMixin:OnEditFocusLost()
|
|
self:HighlightText(0, 0);
|
|
self:HideArea();
|
|
end
|
|
|
|
function NarciStickerEditableTextMixin:OnEnterPressed()
|
|
self:QuitEdit();
|
|
end
|
|
|
|
function NarciStickerEditableTextMixin:OnEscapePressed()
|
|
self:QuitEdit();
|
|
end
|
|
|
|
function NarciStickerEditableTextMixin:OnHide()
|
|
self:QuitEdit();
|
|
self:HideArea();
|
|
end
|
|
|
|
function NarciStickerEditableTextMixin:OnEnter()
|
|
self:ShowArea();
|
|
end
|
|
|
|
function NarciStickerEditableTextMixin:OnLeave()
|
|
if not self:HasFocus() then
|
|
self:HideArea();
|
|
end
|
|
end
|
|
|
|
|
|
NarciStickerCharacterOptionMixin = CreateFromMixins(NarciAutoCloseFrameMixin);
|
|
|
|
function NarciStickerCharacterOptionMixin:OnLoad()
|
|
ClassColorOption = self;
|
|
local ColorToggle = self.ColorToggle;
|
|
ColorToggle:SetScript("OnEnter", function(f)
|
|
f.Background:Show();
|
|
end);
|
|
ColorToggle:SetScript("OnLeave", function(f)
|
|
f.Background:Hide();
|
|
end);
|
|
ColorToggle:SetScript("OnClick", function(f)
|
|
self:ToggleColorOption();
|
|
end);
|
|
|
|
local FactionSwitch = self.FactionSwitch;
|
|
FactionSwitch:SetScript("OnEnter", function(f)
|
|
f.Background:Show();
|
|
end);
|
|
FactionSwitch:SetScript("OnLeave", function(f)
|
|
f.Background:Hide();
|
|
end);
|
|
FactionSwitch:SetScript("OnClick", function(f, button)
|
|
if not f.id then
|
|
f.id = 0;
|
|
end
|
|
if button == "LeftButton" then
|
|
f.id = f.id + 1;
|
|
if f.id > 2 then
|
|
f.id = 0;
|
|
end
|
|
else
|
|
f.id = f.id - 1;
|
|
if f.id < 0 then
|
|
f.id = 2;
|
|
end
|
|
end
|
|
|
|
self:SetFaction(f.id);
|
|
end);
|
|
end
|
|
|
|
function NarciStickerCharacterOptionMixin:SetParentObject(charButton)
|
|
if charButton == self.parentObject then
|
|
self:Hide();
|
|
return
|
|
end
|
|
ActiveCharButton = charButton;
|
|
self.parentObject = charButton;
|
|
self:ClearAllPoints();
|
|
self:SetPoint("TOPRIGHT", charButton, "TOPLEFT", -16, 0);
|
|
|
|
--Update Text
|
|
self.CharacterName:SetText(charButton.CharacterName:GetText() or "");
|
|
self.Level:SetText(charButton.level);
|
|
self.Class:SetText(charButton.className);
|
|
self.Class:SetTextColor(charButton.Info:GetTextColor());
|
|
self.Location:SetText(charButton.Location:GetText() or "");
|
|
self.ColorToggle.ColorBlock:SetColorTexture(charButton.Info:GetTextColor());
|
|
self:SetFaction(charButton.factionID);
|
|
self:Show();
|
|
end
|
|
|
|
function NarciStickerCharacterOptionMixin:ToggleColorOption()
|
|
if not self.ColorOption then
|
|
local f = CreateFrame("Frame", nil, self.ColorToggle, "NarciAutoCloseFrameTemplate");
|
|
local numButtons = #classFiles;
|
|
local size = 16;
|
|
local numPerRow = 4;
|
|
local row, col = 1, 1;
|
|
f:SetPoint("TOPLEFT", self.ColorToggle, "TOPRIGHT", 4, size);
|
|
local button;
|
|
local colorMixin;
|
|
for i = 1, numButtons do
|
|
button = CreateFrame("Button", nil, f, "NarciStickerColorButtonTemplate");
|
|
col = i % numPerRow;
|
|
if col == 0 then
|
|
col = numPerRow;
|
|
end
|
|
row = math.ceil(i / numPerRow);
|
|
button:SetPoint("TOPLEFT", f, "TOPLEFT", size * (col - 1), -size * (row - 1));
|
|
colorMixin = C_ClassColor.GetClassColor(classFiles[i]);
|
|
if colorMixin then
|
|
button:SetColor( colorMixin:GetRGB() );
|
|
end
|
|
end
|
|
f:SetSize(size * numPerRow, size * row);
|
|
self.ColorOption = f;
|
|
end
|
|
|
|
self.ColorOption:Toggle();
|
|
end
|
|
|
|
function NarciStickerCharacterOptionMixin:SetClassColor(r, g, b)
|
|
if self.parentObject then
|
|
self.parentObject:SetClassColor(r, g, b);
|
|
self.ColorToggle.ColorBlock:SetColorTexture(r, g, b);
|
|
self.Class:SetTextColor(r, g, b);
|
|
end
|
|
end
|
|
|
|
function NarciStickerCharacterOptionMixin:SetFaction(factionID)
|
|
if self.parentObject then
|
|
if not factionID then
|
|
factionID = self.parentObject.factionID;
|
|
if not factionID then
|
|
factionID = 0;
|
|
end
|
|
factionID = factionID + 1;
|
|
if factionID > 1 then
|
|
factionID = 0;
|
|
end
|
|
end
|
|
self.parentObject:SetFactionEmblem(factionID);
|
|
local icon;
|
|
if factionID == 0 then
|
|
icon = 136243;
|
|
elseif factionID == 1 then
|
|
icon = 2565244;
|
|
elseif factionID == 2 then
|
|
icon = 2565243;
|
|
end
|
|
self.FactionSwitch.Icon:SetTexture(icon);
|
|
self.FactionSwitch.id = factionID;
|
|
end
|
|
end
|
|
|
|
NarciStickerColorButtonMixin = {};
|
|
|
|
function NarciStickerColorButtonMixin:OnEnter()
|
|
self.Background:SetColorTexture(0.50, 0.50, 0.50);
|
|
end
|
|
|
|
function NarciStickerColorButtonMixin:OnLeave()
|
|
self.Background:SetColorTexture(0, 0, 0);
|
|
end
|
|
|
|
function NarciStickerColorButtonMixin:OnClick()
|
|
local buttons = self:GetParent().ColorButtons;
|
|
for k, b in pairs(buttons) do
|
|
if b ~= self then
|
|
b:EnableButton();
|
|
else
|
|
b:DisableButton();
|
|
end
|
|
end
|
|
ClassColorOption:SetClassColor(self.r, self.g, self.b);
|
|
end
|
|
|
|
function NarciStickerColorButtonMixin:DisableButton()
|
|
self:Disable();
|
|
--self.Background:SetColorTexture(0.8, 0.8, 0.8);
|
|
self.Selection:Show();
|
|
end
|
|
|
|
function NarciStickerColorButtonMixin:EnableButton()
|
|
self:Enable();
|
|
--self.Background:SetColorTexture(0, 0, 0);
|
|
self.Selection:Hide();
|
|
end
|
|
|
|
function NarciStickerColorButtonMixin:SetColor(r, g, b)
|
|
self.r, self.g, self.b = r, g, b;
|
|
self.ColorBlock:SetColorTexture(r, g, b);
|
|
end
|
|
|
|
|
|
|
|
|
|
local DROPDOWN_PADDING = 4;
|
|
|
|
local function Init(self)
|
|
--Create DropDown
|
|
local BUTTON_HEIGHT = 20;
|
|
|
|
self.DropDown = CreateFrame("Frame", nil, self);
|
|
local d = self.DropDown;
|
|
d:Hide();
|
|
d:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 0);
|
|
|
|
NarciAPI.NineSliceUtil.SetUpBackdrop(d, "photoModePopup");
|
|
|
|
local StickOptions = {
|
|
{"Login Screen", 1},
|
|
{"Character Select", 2},
|
|
};
|
|
|
|
local function OptionButton_OnEnter(f)
|
|
FadeFrame(f.Highlight, 0.2, 1);
|
|
self.rootFrame:OnEnter();
|
|
end
|
|
|
|
local function OptionButton_OnLeave(f)
|
|
FadeFrame(f.Highlight, 0.2, 0);
|
|
self.rootFrame:OnLeave();
|
|
end
|
|
|
|
local function OptionButton_OnClick(f)
|
|
self:CloseDropDown();
|
|
MainContainer:ShowOverlay(f.id);
|
|
self:UpdateState();
|
|
end
|
|
|
|
local numButtons = #StickOptions;
|
|
local button, divider;
|
|
for i = 1, numButtons do
|
|
button = CreateFrame("Button", nil, d);
|
|
button:SetSize(120, BUTTON_HEIGHT);
|
|
button:SetPoint("TOPLEFT", d, "TOPLEFT", DROPDOWN_PADDING, -DROPDOWN_PADDING + (1 - i) * BUTTON_HEIGHT);
|
|
button.Label = button:CreateFontString(nil, "OVERLAY", "NarciPastelBrownFont");
|
|
button.Label:SetPoint("LEFT", button, "LEFT", 8, 0);
|
|
button.Label:SetText(StickOptions[i][1]);
|
|
button.id = StickOptions[i][2];
|
|
|
|
button.Highlight = button:CreateTexture(nil, "ARTWORK");
|
|
button.Highlight:SetPoint("TOPLEFT", button, "TOPLEFT", 1, -1);
|
|
button.Highlight:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -1, 1);
|
|
button.Highlight:SetColorTexture(1, 1, 1, 0.2);
|
|
button.Highlight:Hide();
|
|
button.Highlight:SetAlpha(0);
|
|
|
|
button:SetScript("OnEnter", OptionButton_OnEnter);
|
|
button:SetScript("OnLeave", OptionButton_OnLeave);
|
|
button:SetScript("OnClick", OptionButton_OnClick);
|
|
|
|
if i ~= numButtons then
|
|
divider = button:CreateTexture(nil, "OVERLAY");
|
|
divider:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Widgets\\ActorPanel\\DividerH");
|
|
divider:SetHeight(4);
|
|
divider:SetPoint("LEFT", button, "BOTTOMLEFT", 0, 0);
|
|
divider:SetPoint("RIGHT", button, "BOTTOMRIGHT", 0, 0);
|
|
end
|
|
end
|
|
|
|
d:SetSize(120 + 2*DROPDOWN_PADDING, BUTTON_HEIGHT * numButtons + 2*DROPDOWN_PADDING);
|
|
end
|
|
|
|
NarciPhotoModeStickerToggleMixin = {};
|
|
|
|
function NarciPhotoModeStickerToggleMixin:OnLoad()
|
|
self.Icon:SetVertexColor(0.6, 0.6, 0.6);
|
|
self.rootFrame = Narci_ModelSettings;
|
|
Narci_ModelSettings:AddSubFrame(self, "StickerToggle");
|
|
self:ClearAllPoints();
|
|
self:SetPoint("LEFT", Narci_TextOverlay, "RIGHT", 4, 0);
|
|
self.Label:SetText(Narci.L["Photo Mode Frame"]);
|
|
end
|
|
|
|
function NarciPhotoModeStickerToggleMixin:OnEnter()
|
|
FadeFrame(self.Highlight, 0.12, 1);
|
|
|
|
if not self.isOn then
|
|
self.Arrow:Show();
|
|
self.Arrow.flyInDown:Play();
|
|
end
|
|
end
|
|
|
|
function NarciPhotoModeStickerToggleMixin:OnLeave()
|
|
if not self.isOn then
|
|
FadeFrame(self.Highlight, 0.25, 0);
|
|
end
|
|
self.Arrow:Hide();
|
|
end
|
|
|
|
function NarciPhotoModeStickerToggleMixin:OnClick(button)
|
|
if Init then
|
|
Init(self);
|
|
Init = nil;
|
|
end
|
|
|
|
if button == "RightButton" then
|
|
self:ShowDropDown();
|
|
else
|
|
if self.isOn then
|
|
MainContainer:Hide();
|
|
else
|
|
if self.DropDown:IsShown() then
|
|
self:CloseDropDown();
|
|
else
|
|
self:ShowDropDown();
|
|
end
|
|
end
|
|
end
|
|
|
|
self:UpdateState();
|
|
end
|
|
|
|
function NarciPhotoModeStickerToggleMixin:OnShow()
|
|
self:UpdateState();
|
|
end
|
|
|
|
function NarciPhotoModeStickerToggleMixin:OnHide()
|
|
self:CloseDropDown();
|
|
MainContainer:Hide();
|
|
end
|
|
|
|
function NarciPhotoModeStickerToggleMixin:UpdateState()
|
|
self.isOn = MainContainer:IsShown();
|
|
if self.isOn then
|
|
self.Highlight:Show();
|
|
self.Highlight:SetAlpha(1);
|
|
self.Label:SetTextColor(0.88, 0.88, 0.88);
|
|
self.Icon:SetVertexColor(1, 1, 1);
|
|
else
|
|
if not self:IsMouseOver() then
|
|
self.Highlight:Hide();
|
|
self.Highlight:SetAlpha(0);
|
|
end
|
|
self.Label:SetTextColor(0.65, 0.65, 0.65);
|
|
self.Icon:SetVertexColor(0.6, 0.6, 0.6);
|
|
end
|
|
end
|
|
|
|
function NarciPhotoModeStickerToggleMixin:ShowDropDown()
|
|
self.DropDown:Show();
|
|
self:RegisterEvent("GLOBAL_MOUSE_DOWN");
|
|
end
|
|
|
|
function NarciPhotoModeStickerToggleMixin:CloseDropDown()
|
|
if self.DropDown then
|
|
self.DropDown:Hide();
|
|
end
|
|
self:UnregisterEvent("GLOBAL_MOUSE_DOWN");
|
|
end
|
|
|
|
function NarciPhotoModeStickerToggleMixin:OnEvent(event)
|
|
if event == "GLOBAL_MOUSE_DOWN" then
|
|
if not self:IsFocused() then
|
|
self:CloseDropDown();
|
|
end
|
|
end
|
|
end
|
|
|
|
function NarciPhotoModeStickerToggleMixin:IsFocused()
|
|
return self:IsShown() and self:IsMouseOver() or ( self.DropDown and self.DropDown:IsShown() and self.DropDown:IsMouseOver(-DROPDOWN_PADDING, DROPDOWN_PADDING, DROPDOWN_PADDING, -DROPDOWN_PADDING) )
|
|
end
|
|
|
|
|
|
NarciPseudoRedButtonMixin = {};
|
|
|
|
function NarciPseudoRedButtonMixin:SetButtonAtlas(atlasName, atlasNamePostfix)
|
|
atlasName = atlasName or "128-RedButton";
|
|
atlasNamePostfix = atlasNamePostfix or ""; --Disabled, Pressed
|
|
|
|
self.Left:SetAtlas(atlasName.."-Left"..atlasNamePostfix, true);
|
|
self.Center:SetAtlas("_"..atlasName.."-Center"..atlasNamePostfix);
|
|
self.Right:SetAtlas(atlasName.."-Right"..atlasNamePostfix, true);
|
|
end
|
|
|
|
function NarciPseudoRedButtonMixin:OnLoad()
|
|
self:SetButtonAtlas(self.atlasName, self.atlasNamePostfix);
|
|
self:UpdateScale();
|
|
|
|
if self.fontName then
|
|
self:SetFont(self.fontName);
|
|
self.fontName = nil;
|
|
end
|
|
|
|
if self.buttonText then
|
|
self:SetText(self.buttonText);
|
|
self.buttonText = nil;
|
|
end
|
|
end
|
|
|
|
function NarciPseudoRedButtonMixin:SetFont(fontName)
|
|
self.ButtonText:SetFontObject(fontName);
|
|
end
|
|
|
|
function NarciPseudoRedButtonMixin:SetText(text)
|
|
self.ButtonText:SetText(text);
|
|
end
|
|
|
|
function NarciPseudoRedButtonMixin:UpdateScale()
|
|
--This is basically a copy of Blizzard code from SharedUIPanelTemplates.lua
|
|
|
|
local atlasName = self.atlasName or "128-RedButton";
|
|
|
|
local leftAtlasInfo = C_Texture.GetAtlasInfo(atlasName.."-Left");
|
|
local rightAtlasInfo = C_Texture.GetAtlasInfo(atlasName.."-Right");
|
|
|
|
if not (leftAtlasInfo and rightAtlasInfo) then
|
|
return
|
|
end
|
|
|
|
local buttonHeight = self:GetHeight();
|
|
local buttonWidth = self:GetWidth();
|
|
|
|
local scale = buttonHeight / leftAtlasInfo.height;
|
|
self.Left:SetScale(scale);
|
|
self.Right:SetScale(scale);
|
|
|
|
local leftWidth = leftAtlasInfo.width * scale;
|
|
local rightWidth = rightAtlasInfo.width * scale;
|
|
local leftAndRightWidth = leftWidth + rightWidth;
|
|
|
|
if leftAndRightWidth > buttonWidth then
|
|
local extraWidth = leftAndRightWidth - buttonWidth;
|
|
local newLeftWidth = leftWidth;
|
|
local newRightWidth = rightWidth;
|
|
if (leftWidth - extraWidth) > rightWidth then
|
|
newLeftWidth = leftWidth - extraWidth;
|
|
elseif (rightWidth - extraWidth) > leftWidth then
|
|
newRightWidth = rightWidth - extraWidth;
|
|
else
|
|
if leftWidth ~= rightWidth then
|
|
local unevenAmount = math.abs(leftWidth - rightWidth);
|
|
extraWidth = extraWidth - unevenAmount;
|
|
newLeftWidth = math.min(leftWidth, rightWidth);
|
|
newRightWidth = newLeftWidth;
|
|
end
|
|
local equallyDividedExtraWidth = extraWidth / 2;
|
|
newLeftWidth = newLeftWidth - equallyDividedExtraWidth;
|
|
newRightWidth = newRightWidth - equallyDividedExtraWidth;
|
|
end
|
|
local leftPercentage = newLeftWidth / leftWidth;
|
|
self.Left:SetTexCoord(0, leftPercentage, 0, 1);
|
|
self.Left:SetWidth(newLeftWidth / scale);
|
|
local rightPercentage = newRightWidth / rightWidth;
|
|
self.Right:SetTexCoord(1 - rightPercentage, 1, 0, 1);
|
|
self.Right:SetWidth(newRightWidth / scale);
|
|
else
|
|
self.Left:SetTexCoord(0, 1, 0, 1);
|
|
self.Left:SetWidth(leftAtlasInfo.width);
|
|
self.Right:SetTexCoord(0, 1, 0, 1);
|
|
self.Right:SetWidth(rightAtlasInfo.width);
|
|
end
|
|
|
|
leftAtlasInfo, rightAtlasInfo = nil, nil;
|
|
end
|