|
|
|
|
local _, addon = ...
|
|
|
|
|
|
|
|
|
|
local TransitionAPI = addon.TransitionAPI;
|
|
|
|
|
|
|
|
|
|
------------------------------------------------------------------------
|
|
|
|
|
local VISUAL_ID_MAX = 220000;
|
|
|
|
|
local TAB_WIDTH = 116;
|
|
|
|
|
local NUM_MAX_HISTORY = 5;
|
|
|
|
|
local BROWSER_ANCHOR_OFFSET_COLLAPSED_X = 146;
|
|
|
|
|
local BROWSER_ANCHOR_OFFSET_EXPANED_X = -28;
|
|
|
|
|
local BROWSER_ANCHOR_OFFSET_Y = -6;
|
|
|
|
|
------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
local Narci = Narci;
|
|
|
|
|
local L = Narci.L;
|
|
|
|
|
local FadeFrame = NarciFadeUI.Fade;
|
|
|
|
|
local After = C_Timer.After;
|
|
|
|
|
local tinsert = table.insert;
|
|
|
|
|
|
|
|
|
|
local BrowserFrame, ListFrame, EntryTab, PreviewFrame, HistoryFrame, Tab1, HistoryButtonFrame, QuickFavoriteButton, SuggestionFrame, HomeButton, MyFavoriteEditFrame, EditBoxFavoriteButton, VisualIDEditBox, EditorPopup, SearchBox;
|
|
|
|
|
local NUM_VISIBLE_BUTTONS = 0;
|
|
|
|
|
|
|
|
|
|
local NarciSpellVisualUtil = NarciSpellVisualUtil;
|
|
|
|
|
local SpellVisualList = NarciSpellVisualUtil.Catalogue;
|
|
|
|
|
local GetSpellVisualKitInfo = NarciSpellVisualUtil.GetSpellVisualKitInfo;
|
|
|
|
|
local IsSpellVisualLogged = NarciSpellVisualUtil.IsSpellVisualLogged;
|
|
|
|
|
local NarciTooltip = NarciTooltip;
|
|
|
|
|
local SelectedVisualIndex;
|
|
|
|
|
|
|
|
|
|
local FavUtil = {};
|
|
|
|
|
|
|
|
|
|
local function CountLength(table)
|
|
|
|
|
local count = 0;
|
|
|
|
|
for i = 1, #table do
|
|
|
|
|
count = count + #table[i];
|
|
|
|
|
end
|
|
|
|
|
return count;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function PrintTable(table)
|
|
|
|
|
for k, v in pairs(table) do
|
|
|
|
|
if v ~= nil then
|
|
|
|
|
print(k.." - "..v);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-------------------------------------------
|
|
|
|
|
--Public method : Used in PlayerModel.lua
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualUtil:LoadHistory()
|
|
|
|
|
local model = Narci.ActiveModel;
|
|
|
|
|
if not model then return; end;
|
|
|
|
|
|
|
|
|
|
SelectedVisualIndex = nil;
|
|
|
|
|
local AppliedVisuals = model.AppliedVisuals;
|
|
|
|
|
NUM_VISIBLE_BUTTONS = #AppliedVisuals;
|
|
|
|
|
local buttons = HistoryFrame.HistoryButtonFrame.buttons;
|
|
|
|
|
local button;
|
|
|
|
|
local name, icon, animID;
|
|
|
|
|
for i = 1, #buttons do
|
|
|
|
|
button = buttons[i];
|
|
|
|
|
if AppliedVisuals[i] then
|
|
|
|
|
button:Show();
|
|
|
|
|
button:SetAlpha(1);
|
|
|
|
|
name, icon, animID = GetSpellVisualKitInfo( AppliedVisuals[i] );
|
|
|
|
|
button.Icon:SetTexture(icon);
|
|
|
|
|
button.Icon:SetAlpha(0.6);
|
|
|
|
|
button.name = name;
|
|
|
|
|
else
|
|
|
|
|
button:Hide();
|
|
|
|
|
end
|
|
|
|
|
button.Border:SetTexCoord(0, 0.25, 0, 1);
|
|
|
|
|
button.selected = false;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
button = buttons[1];
|
|
|
|
|
button:SetPoint("BOTTOMRIGHT", HistoryButtonFrame, "BOTTOMRIGHT", 24 * (1 - NUM_VISIBLE_BUTTONS), 0);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-------------------------------------------
|
|
|
|
|
------------Animation Container------------
|
|
|
|
|
-------------------------------------------
|
|
|
|
|
local AnimationContariner = CreateFrame("Frame");
|
|
|
|
|
|
|
|
|
|
local outSine = addon.EasingFunctions.outSine;
|
|
|
|
|
local inOutSine = addon.EasingFunctions.inOutSine;
|
|
|
|
|
local linear = addon.EasingFunctions.linear;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-------------------------------------------
|
|
|
|
|
--Toggle Spell Visual Brower frame
|
|
|
|
|
local ExpandAnim = CreateFrame("Frame");
|
|
|
|
|
ExpandAnim:Hide();
|
|
|
|
|
ExpandAnim.total = 0;
|
|
|
|
|
ExpandAnim.duration = 0.25;
|
|
|
|
|
ExpandAnim.baseOffsetX = -430;
|
|
|
|
|
ExpandAnim:SetScript("OnHide", function(self)
|
|
|
|
|
self.total = 0;
|
|
|
|
|
end);
|
|
|
|
|
ExpandAnim.duration2 = 0.5;
|
|
|
|
|
local ModelSettings = Narci_ModelSettings;
|
|
|
|
|
|
|
|
|
|
ExpandAnim:SetScript("OnShow", function(self)
|
|
|
|
|
self.StartHeight = BrowserFrame:GetHeight();
|
|
|
|
|
_, self.xRelativeTo, _, self.fromX = BrowserFrame:GetPoint();
|
|
|
|
|
_, self.yRelativeTo, _, _, self.fromY = BrowserFrame.ExpandableFrames:GetPoint();
|
|
|
|
|
self.fromWidth = ModelSettings:GetWidth();
|
|
|
|
|
end);
|
|
|
|
|
|
|
|
|
|
local function Expand_OnUpdate(self, elapsed)
|
|
|
|
|
self.total = self.total + elapsed;
|
|
|
|
|
local newTotal = self.total;
|
|
|
|
|
local offsetX = outSine(newTotal, self.fromX, self.toX, self.duration);
|
|
|
|
|
local width = outSine(newTotal, self.fromWidth, self.toWidth, self.duration);
|
|
|
|
|
if newTotal >= self.duration then
|
|
|
|
|
offsetX = self.toX;
|
|
|
|
|
width = self.toWidth;
|
|
|
|
|
local offsetY = outSine(newTotal - self.duration, self.fromY, self.EndY, 0.25);
|
|
|
|
|
if newTotal >= self.duration2 then
|
|
|
|
|
offsetY = self.EndY;
|
|
|
|
|
self:Hide();
|
|
|
|
|
end
|
|
|
|
|
BrowserFrame.ExpandableFrames:SetPoint("BOTTOM", self.yRelativeTo, "TOP", 0, offsetY);
|
|
|
|
|
end
|
|
|
|
|
BrowserFrame:SetPoint("BOTTOMRIGHT", self.xRelativeTo, "BOTTOMLEFT", offsetX, BROWSER_ANCHOR_OFFSET_Y);
|
|
|
|
|
ModelSettings:SetWidth(width);
|
|
|
|
|
|
|
|
|
|
--To keep the other panels still while widen this frame, their anchors must be updated
|
|
|
|
|
--10 is ActorPanel's offset to its parent frame
|
|
|
|
|
ModelSettings.ActorPanel:SetPoint("TOPLEFT", ModelSettings, "TOPLEFT", width + self.baseOffsetX, 0);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
ExpandAnim:SetScript("OnUpdate", Expand_OnUpdate);
|
|
|
|
|
|
|
|
|
|
local MODEL_SETTINGS_FRAME_WIDTH = ModelSettings:GetWidth();
|
|
|
|
|
|
|
|
|
|
local function ReAnchorBrowser()
|
|
|
|
|
--local oldRight = ModelSettings:GetRight();
|
|
|
|
|
local oldCenterX = ModelSettings:GetCenter();
|
|
|
|
|
local oldBottom = ModelSettings:GetBottom();
|
|
|
|
|
local screenWidth = WorldFrame:GetWidth();
|
|
|
|
|
local scale = ModelSettings:GetEffectiveScale();
|
|
|
|
|
if not scale or scale == 0 then
|
|
|
|
|
scale = 1;
|
|
|
|
|
--return;
|
|
|
|
|
end
|
|
|
|
|
local width = ModelSettings:GetWidth()/2;
|
|
|
|
|
ModelSettings:ClearAllPoints();
|
|
|
|
|
ModelSettings:SetPoint("BOTTOMRIGHT", nil, "BOTTOMRIGHT", oldCenterX + width - screenWidth / scale , oldBottom);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Narci_ToggleSpellVisualBrowser(self)
|
|
|
|
|
if ExpandAnim:IsShown() then return; end;
|
|
|
|
|
self.isActive = not self.isActive;
|
|
|
|
|
ReAnchorBrowser();
|
|
|
|
|
local state = self.isActive;
|
|
|
|
|
BrowserFrame.isActive = state;
|
|
|
|
|
|
|
|
|
|
local newWidth;
|
|
|
|
|
local newOffsetX, newOffsetY; --for 2 different widgets
|
|
|
|
|
if state then
|
|
|
|
|
newWidth = MODEL_SETTINGS_FRAME_WIDTH + 218;
|
|
|
|
|
newOffsetY = 0;
|
|
|
|
|
newOffsetX = BROWSER_ANCHOR_OFFSET_EXPANED_X;
|
|
|
|
|
FadeFrame(BrowserFrame, 0.15, 1);
|
|
|
|
|
FadeFrame(self.Background, 0.15, 0);
|
|
|
|
|
FadeFrame(self.Label, 0.15, 0);
|
|
|
|
|
After(0.25, function()
|
|
|
|
|
FadeFrame(BrowserFrame.ExpandableFrames, 0.25, 1);
|
|
|
|
|
end);
|
|
|
|
|
|
|
|
|
|
self:SetWidth(24);
|
|
|
|
|
else
|
|
|
|
|
newWidth = MODEL_SETTINGS_FRAME_WIDTH;
|
|
|
|
|
newOffsetX = BROWSER_ANCHOR_OFFSET_COLLAPSED_X;
|
|
|
|
|
newOffsetY = -40;
|
|
|
|
|
FadeFrame(BrowserFrame.ExpandableFrames, 0.15, 0);
|
|
|
|
|
After(0.15, function()
|
|
|
|
|
FadeFrame(BrowserFrame, 0.25, 0);
|
|
|
|
|
end);
|
|
|
|
|
|
|
|
|
|
self:SetWidth(58);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
ExpandAnim.EndY = newOffsetY; --ExpandableFrames
|
|
|
|
|
ExpandAnim.toX = newOffsetX; --BrowserFrame
|
|
|
|
|
ExpandAnim.toWidth = newWidth; --ModelSettings
|
|
|
|
|
|
|
|
|
|
if state then
|
|
|
|
|
--Expand
|
|
|
|
|
ExpandAnim.duration2 = 0.5;
|
|
|
|
|
ExpandAnim:Show();
|
|
|
|
|
else
|
|
|
|
|
ExpandAnim.duration2 = 0.25;
|
|
|
|
|
After(0.2, function()
|
|
|
|
|
ExpandAnim:Show();
|
|
|
|
|
FadeFrame(self.Background, 0.15, 1);
|
|
|
|
|
FadeFrame(self.Label, 0.15, 1);
|
|
|
|
|
end);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local ScrollHistory = {};
|
|
|
|
|
do
|
|
|
|
|
ScrollHistory.history = {};
|
|
|
|
|
|
|
|
|
|
function ScrollHistory:SetActiveCategory(categoryIndex)
|
|
|
|
|
if not self.history[categoryIndex] then
|
|
|
|
|
self.history[categoryIndex] = {};
|
|
|
|
|
end
|
|
|
|
|
self.activeCategoryIndex = categoryIndex;
|
|
|
|
|
self.activeHistory = self.history[categoryIndex];
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function ScrollHistory:GetActiveCategoryIndex()
|
|
|
|
|
return self.activeCategoryIndex
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function ScrollHistory:IsHeaderExpanded(headerIndex)
|
|
|
|
|
return self.activeHistory[headerIndex] == true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function ScrollHistory:ToggleHeaderExpanded(headerIndex)
|
|
|
|
|
if self:IsHeaderExpanded(headerIndex) then
|
|
|
|
|
self.activeHistory[headerIndex] = false;
|
|
|
|
|
else
|
|
|
|
|
self.activeHistory[headerIndex] = true;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function ScrollHistory:SaveOffset()
|
|
|
|
|
if self.activeHistory then
|
|
|
|
|
self.activeHistory.lastOffset = EntryTab.ScrollView:GetOffset();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function ScrollHistory:GetLastOffset()
|
|
|
|
|
return self.activeHistory.lastOffset
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function ScrollHistory:Reset()
|
|
|
|
|
self.history = {};
|
|
|
|
|
self.activeHistory = nil;
|
|
|
|
|
self.activeCategoryIndex = nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--Tab Changing Animation (Choose a category and go)
|
|
|
|
|
local SwipeAnim = NarciAPI_CreateAnimationFrame(0.25);
|
|
|
|
|
|
|
|
|
|
SwipeAnim:SetScript("OnShow", function(self)
|
|
|
|
|
self.point, self.relativeTo, self.relativePoint, self.startOffset = Tab1:GetPoint();
|
|
|
|
|
end);
|
|
|
|
|
|
|
|
|
|
local function Swipe_OnUpdate(self, elapsed)
|
|
|
|
|
self.total = self.total + elapsed;
|
|
|
|
|
local offset = outSine(self.total, self.startOffset, self.endOffset, self.duration);
|
|
|
|
|
|
|
|
|
|
if self.total >= self.duration then
|
|
|
|
|
offset = self.endOffset;
|
|
|
|
|
self:Hide();
|
|
|
|
|
end
|
|
|
|
|
Tab1:SetPoint(self.point, self.relativeTo, self.relativePoint, offset, 0);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
SwipeAnim:SetScript("OnUpdate", Swipe_OnUpdate);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local CURRENT_TAB_INDEX = 1;
|
|
|
|
|
local function GoToTab(index)
|
|
|
|
|
if index == CURRENT_TAB_INDEX then return end;
|
|
|
|
|
CURRENT_TAB_INDEX = index;
|
|
|
|
|
|
|
|
|
|
SwipeAnim:Hide();
|
|
|
|
|
|
|
|
|
|
if index == 1 then
|
|
|
|
|
ScrollHistory:SaveOffset();
|
|
|
|
|
SwipeAnim.endOffset = 0;
|
|
|
|
|
PreviewFrame:Enable();
|
|
|
|
|
FavUtil.sortedList = nil;
|
|
|
|
|
else
|
|
|
|
|
SwipeAnim.endOffset = -TAB_WIDTH;
|
|
|
|
|
FadeFrame(HomeButton, 0.2, 1);
|
|
|
|
|
PreviewFrame:Disable();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
SearchBox:SetShown(index == 3);
|
|
|
|
|
ListFrame.Header.Tab2Label:SetShown(index ~= 3);
|
|
|
|
|
HomeButton:SetHitRectInsets(0, (index == 3 and -1) or -10, -1, 0);
|
|
|
|
|
if EntryTab.ScrollView then
|
|
|
|
|
EntryTab.ScrollView:SetAlwaysHideScrollBar(index == 2);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
SwipeAnim:Show();
|
|
|
|
|
|
|
|
|
|
--Guide
|
|
|
|
|
if BrowserFrame.ShowGuide then
|
|
|
|
|
BrowserFrame.Guide.TabListener:SetValue(3);
|
|
|
|
|
BrowserFrame.ShowGuide = false;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--Add button onto History tab
|
|
|
|
|
local InsertAnim = NarciAPI_CreateAnimationFrame(0.5);
|
|
|
|
|
--Remove a button from History tab
|
|
|
|
|
local RemoveAnim = NarciAPI_CreateAnimationFrame(0.5);
|
|
|
|
|
|
|
|
|
|
local function RemapButton()
|
|
|
|
|
--print(NUM_VISIBLE_BUTTONS)
|
|
|
|
|
if NUM_VISIBLE_BUTTONS <= NUM_MAX_HISTORY then return; end
|
|
|
|
|
local buttons = HistoryButtonFrame.buttons;
|
|
|
|
|
local button, icon, name;
|
|
|
|
|
local numButton = #buttons;
|
|
|
|
|
|
|
|
|
|
local icons = {};
|
|
|
|
|
local names = {};
|
|
|
|
|
|
|
|
|
|
for i = 1, numButton do
|
|
|
|
|
button = buttons[i];
|
|
|
|
|
icon = button.textureID or 134400;
|
|
|
|
|
tinsert(icons, icon);
|
|
|
|
|
tinsert(names, button.name);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for i = 1, (numButton - 1) do
|
|
|
|
|
button = buttons[i];
|
|
|
|
|
icon = icons[i + 1];
|
|
|
|
|
name = names[i + 1];
|
|
|
|
|
button.Icon:SetTexture(icon);
|
|
|
|
|
button.name = name;
|
|
|
|
|
button.textureID = icon;
|
|
|
|
|
end
|
|
|
|
|
icon = icons[1];
|
|
|
|
|
name = names[1];
|
|
|
|
|
button = buttons[1];
|
|
|
|
|
button:SetPoint("BOTTOMRIGHT", HistoryButtonFrame, "BOTTOMRIGHT", -(24 * (NUM_MAX_HISTORY - 1)) , 0);
|
|
|
|
|
|
|
|
|
|
button = buttons[numButton];
|
|
|
|
|
button.Icon:SetTexture(icon); --icon[1], icon[2], icon[3]
|
|
|
|
|
button.name = name;
|
|
|
|
|
button.textureID = icon;
|
|
|
|
|
|
|
|
|
|
buttons[NUM_MAX_HISTORY + 1]:Hide();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
InsertAnim:SetScript("OnShow", function(self)
|
|
|
|
|
local buttons = HistoryButtonFrame.buttons;
|
|
|
|
|
local num = NUM_VISIBLE_BUTTONS;
|
|
|
|
|
local NewButton = buttons[num];
|
|
|
|
|
self.fromX = (num - 2) * 24;
|
|
|
|
|
self.toX = (num - 1) * 24;
|
|
|
|
|
self.fromY = HistoryButtonFrame.offsetY;
|
|
|
|
|
if num == 1 then
|
|
|
|
|
self.button1 = nil;
|
|
|
|
|
self.button2 = buttons[1]; --Drop down
|
|
|
|
|
self.button3 = nil;
|
|
|
|
|
else
|
|
|
|
|
self.button1 = buttons[1]; --Move left
|
|
|
|
|
self.button2 = NewButton; --Drop down
|
|
|
|
|
if num <= NUM_MAX_HISTORY then
|
|
|
|
|
self.button3 = buttons[num - 1]; --Anchor button
|
|
|
|
|
else
|
|
|
|
|
self.button3 = nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
FadeFrame(NewButton, 0.12, 1);
|
|
|
|
|
NewButton.animIn:Play();
|
|
|
|
|
end);
|
|
|
|
|
|
|
|
|
|
local function Insert_OnUpdate(self, elapsed)
|
|
|
|
|
self.total = self.total + elapsed;
|
|
|
|
|
local offsetX = inOutSine(self.total, self.fromX, self.toX, self.duration);
|
|
|
|
|
local offsetY = outSine(self.total, self.fromY, 0, self.duration);
|
|
|
|
|
|
|
|
|
|
if self.total >= self.duration then
|
|
|
|
|
offsetX = self.toX;
|
|
|
|
|
offsetY = 0;
|
|
|
|
|
self:Hide();
|
|
|
|
|
After(0, function()
|
|
|
|
|
if self.button3 then
|
|
|
|
|
self.button2:ClearAllPoints();
|
|
|
|
|
self.button2:SetPoint("LEFT", self.button3, "RIGHT", 0, 0);
|
|
|
|
|
end
|
|
|
|
|
RemapButton();
|
|
|
|
|
end);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if self.button1 then
|
|
|
|
|
self.button1:SetPoint("BOTTOMRIGHT", HistoryButtonFrame, "BOTTOMRIGHT", -offsetX, 0);
|
|
|
|
|
end
|
|
|
|
|
self.button2:SetPoint("BOTTOMRIGHT", HistoryButtonFrame, "BOTTOMRIGHT", 0, offsetY);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
InsertAnim:SetScript("OnUpdate", Insert_OnUpdate);
|
|
|
|
|
|
|
|
|
|
local function AddToHistory(visualID)
|
|
|
|
|
local model = Narci.ActiveModel;
|
|
|
|
|
if not model then return; end;
|
|
|
|
|
|
|
|
|
|
local AppliedVisuals = model.AppliedVisuals or {};
|
|
|
|
|
local NewHistory = {};
|
|
|
|
|
|
|
|
|
|
for i = 1, #AppliedVisuals do
|
|
|
|
|
NewHistory[i] = AppliedVisuals[i];
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if #NewHistory < NUM_MAX_HISTORY then
|
|
|
|
|
tinsert(NewHistory, visualID);
|
|
|
|
|
else
|
|
|
|
|
for i = 1, (#NewHistory - 1) do
|
|
|
|
|
NewHistory[i] = NewHistory[i + 1];
|
|
|
|
|
end
|
|
|
|
|
NewHistory[NUM_MAX_HISTORY] = visualID;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
model.AppliedVisuals = NewHistory;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function HistoryButton_ResetSelection()
|
|
|
|
|
local buttons = HistoryButtonFrame.buttons;
|
|
|
|
|
SelectedVisualIndex = nil;
|
|
|
|
|
local button;
|
|
|
|
|
for i = 1, #buttons do
|
|
|
|
|
button = buttons[i];
|
|
|
|
|
button.Border:SetTexCoord(0, 0.25, 0, 1);
|
|
|
|
|
button.selected = false;
|
|
|
|
|
button.Icon:SetAlpha(0.6);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function SmoothInsert(visualID, textureID, visualName)
|
|
|
|
|
if RemoveAnim:IsShown() or InsertAnim:IsShown() then return; end;
|
|
|
|
|
|
|
|
|
|
local model = Narci.ActiveModel;
|
|
|
|
|
if model then
|
|
|
|
|
model:ApplySpellVisualKit(visualID, false);
|
|
|
|
|
else
|
|
|
|
|
return;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local button;
|
|
|
|
|
if NUM_VISIBLE_BUTTONS <= NUM_MAX_HISTORY then
|
|
|
|
|
NUM_VISIBLE_BUTTONS = NUM_VISIBLE_BUTTONS + 1;
|
|
|
|
|
button = HistoryButtonFrame.buttons[NUM_VISIBLE_BUTTONS];
|
|
|
|
|
else
|
|
|
|
|
button = HistoryButtonFrame.buttons[NUM_MAX_HISTORY + 1];
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
HistoryButton_ResetSelection();
|
|
|
|
|
textureID = textureID or 134400;
|
|
|
|
|
button.Icon:SetTexture(textureID);
|
|
|
|
|
button.Icon:SetTexCoord(0, 1, 0, 1);
|
|
|
|
|
button.textureID = textureID;
|
|
|
|
|
button.visualID = visualID;
|
|
|
|
|
button.name = visualName;
|
|
|
|
|
InsertAnim:Show();
|
|
|
|
|
AddToHistory(visualID);
|
|
|
|
|
FadeFrame(HistoryFrame.Note, 0.25, 0);
|
|
|
|
|
FadeFrame(HistoryFrame.Label, 0.15, 1);
|
|
|
|
|
|
|
|
|
|
if model.isVirtual then
|
|
|
|
|
--Rewrite model index button's tooltip
|
|
|
|
|
local button = Narci_ActorPanel.ExtraPanel.buttons[model.buttonIndex];
|
|
|
|
|
if button then
|
|
|
|
|
button.Label:SetText(visualName);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
----------------------------------------------------------------
|
|
|
|
|
RemoveAnim:SetScript("OnShow", function(self)
|
|
|
|
|
self.ReAnchoredButton:ClearAllPoints();
|
|
|
|
|
self.toX = self.fromX + 24;
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
local function RemapIcons(buttonID)
|
|
|
|
|
local buttons = HistoryButtonFrame.buttons;
|
|
|
|
|
local button, icon, name;
|
|
|
|
|
local numButton = #buttons;
|
|
|
|
|
|
|
|
|
|
local icons = {};
|
|
|
|
|
local names = {};
|
|
|
|
|
|
|
|
|
|
for i = 1, numButton do
|
|
|
|
|
button = buttons[i];
|
|
|
|
|
icon = button.textureID or 134400;
|
|
|
|
|
tinsert(icons, icon);
|
|
|
|
|
tinsert(names, button.name);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if buttonID == 1 then
|
|
|
|
|
for i = 1, numButton - 1 do
|
|
|
|
|
button = buttons[i];
|
|
|
|
|
icon = icons[i + 1];
|
|
|
|
|
name = names[i + 1];
|
|
|
|
|
button.Icon:SetTexture(icon);
|
|
|
|
|
button.name = name;
|
|
|
|
|
button.textureID = icon;
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
for i = buttonID, numButton - 1 do
|
|
|
|
|
button = buttons[i];
|
|
|
|
|
icon = icons[i + 1];
|
|
|
|
|
name = names[i + 1];
|
|
|
|
|
button.Icon:SetTexture(icon);
|
|
|
|
|
button.name = name;
|
|
|
|
|
button.textureID = icon;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function Remove_OnUpdate(self, elapsed)
|
|
|
|
|
self.total = self.total + elapsed;
|
|
|
|
|
local alpha = linear(self.total, 1, 0, self.duration - 0.25) ;
|
|
|
|
|
local offsetX = inOutSine(self.total, self.fromX, self.toX, self.duration);
|
|
|
|
|
if self.total >= self.duration then
|
|
|
|
|
alpha = 0;
|
|
|
|
|
offsetX = self.toX;
|
|
|
|
|
self:Hide();
|
|
|
|
|
After(0, function()
|
|
|
|
|
HistoryButton_ResetSelection();
|
|
|
|
|
self.RemovedButton:SetAlpha(1);
|
|
|
|
|
if self.LeftButton then
|
|
|
|
|
self.RemovedButton:SetPoint("LEFT", self.LeftButton, "RIGHT", 0, 0);
|
|
|
|
|
end
|
|
|
|
|
if self.ReAnchoredButton then
|
|
|
|
|
self.ReAnchoredButton:SetPoint("LEFT", self.RemovedButton, "RIGHT", 0, 0);
|
|
|
|
|
end
|
|
|
|
|
if not self.Reposition then
|
|
|
|
|
self.LeadButton:SetPoint("BOTTOMRIGHT", HistoryButtonFrame, "BOTTOMRIGHT", offsetX, 0);
|
|
|
|
|
end
|
|
|
|
|
RemapIcons(self.buttonID)
|
|
|
|
|
end);
|
|
|
|
|
end
|
|
|
|
|
if alpha < 0 then
|
|
|
|
|
alpha = 0;
|
|
|
|
|
end
|
|
|
|
|
self.RemovedButton:SetAlpha(alpha);
|
|
|
|
|
if self.Reposition then
|
|
|
|
|
self.LeadButton:SetPoint("BOTTOMRIGHT", HistoryButtonFrame, "BOTTOMRIGHT", offsetX, 0);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
RemoveAnim:SetScript("OnUpdate", Remove_OnUpdate);
|
|
|
|
|
|
|
|
|
|
local function SmoothRemove(buttonID)
|
|
|
|
|
if not buttonID or RemoveAnim:IsShown() or InsertAnim:IsShown() then return; end;
|
|
|
|
|
local buttons = HistoryButtonFrame.buttons;
|
|
|
|
|
local RemovedButton = buttons[buttonID];
|
|
|
|
|
RemoveAnim.RemovedButton = RemovedButton;
|
|
|
|
|
RemoveAnim.LeadButton = buttons[1];
|
|
|
|
|
RemoveAnim.LeftButton = buttons[buttonID - 1];
|
|
|
|
|
RemoveAnim.ReAnchoredButton = buttons[buttonID + 1];
|
|
|
|
|
_, _, _, RemoveAnim.fromX = buttons[1]:GetPoint();
|
|
|
|
|
RemoveAnim.buttonID = buttonID;
|
|
|
|
|
if buttonID == 1 then
|
|
|
|
|
RemoveAnim.Reposition = false;
|
|
|
|
|
else
|
|
|
|
|
RemoveAnim.Reposition = true;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if buttonID ~= 1 then
|
|
|
|
|
RemovedButton:ClearAllPoints();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if NUM_VISIBLE_BUTTONS > NUM_MAX_HISTORY then
|
|
|
|
|
NUM_VISIBLE_BUTTONS = NUM_MAX_HISTORY - 1;
|
|
|
|
|
else
|
|
|
|
|
NUM_VISIBLE_BUTTONS = NUM_VISIBLE_BUTTONS - 1;
|
|
|
|
|
end
|
|
|
|
|
RemoveAnim:Show();
|
|
|
|
|
end
|
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local clickCounter = {};
|
|
|
|
|
clickCounter.leftButton = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function SuggestedID_OnClick(self)
|
|
|
|
|
if self.animID then
|
|
|
|
|
local model = Narci.ActiveModel;
|
|
|
|
|
if not model then return; end;
|
|
|
|
|
model:PlayAnimation(self.animID);
|
|
|
|
|
NarciModelControl_AnimationIDEditBox:SetText(self.animID);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-------------------------------------------------
|
|
|
|
|
----------------Set preview image----------------
|
|
|
|
|
-------------------------------------------------
|
|
|
|
|
local PreviewTimer = NarciAPI_CreateAnimationFrame(0.25);
|
|
|
|
|
PreviewTimer:SetScript("OnHide", function(self)
|
|
|
|
|
self:Hide();
|
|
|
|
|
self.total = 0;
|
|
|
|
|
end);
|
|
|
|
|
PreviewTimer:SetScript("OnUpdate", function(self, elapsed)
|
|
|
|
|
self.total = self.total + elapsed;
|
|
|
|
|
if self.total >= self.duration then
|
|
|
|
|
if self.visualID then
|
|
|
|
|
--print(self.visualID)
|
|
|
|
|
if IsSpellVisualLogged(self.visualID) then
|
|
|
|
|
PreviewFrame.TopImage.FadeOut:Play();
|
|
|
|
|
--print("Has preview")
|
|
|
|
|
else
|
|
|
|
|
--print("no preview")
|
|
|
|
|
PreviewFrame.BottomImage:SetTexture("Interface\\AddOns\\Narcissus\\Art\\SpellVisualPreviews\\Blank");
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
self:Hide();
|
|
|
|
|
end
|
|
|
|
|
end);
|
|
|
|
|
|
|
|
|
|
local function UpdatePreview(visualID)
|
|
|
|
|
if not visualID then return; end;
|
|
|
|
|
PreviewFrame.BottomImage:SetTexture("Interface\\AddOns\\Narcissus\\Art\\SpellVisualPreviews\\"..tostring(visualID));
|
|
|
|
|
PreviewTimer.total = 0;
|
|
|
|
|
PreviewTimer.visualID = visualID;
|
|
|
|
|
PreviewTimer:Show();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-------------------------------------------------
|
|
|
|
|
do --FavUtil
|
|
|
|
|
FavUtil.isFavorite = {};
|
|
|
|
|
FavUtil.numFavs = 0;
|
|
|
|
|
|
|
|
|
|
function FavUtil:Load()
|
|
|
|
|
if not NarcissusDB then
|
|
|
|
|
self.db = {};
|
|
|
|
|
self.numFavs = 0;
|
|
|
|
|
return 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not NarcissusDB.Favorites then
|
|
|
|
|
NarcissusDB.Favorites = {};
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not NarcissusDB.Favorites.FavoriteSpellVisualKitIDs then
|
|
|
|
|
NarcissusDB.Favorites.FavoriteSpellVisualKitIDs = {};
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
self.db = NarcissusDB.Favorites.FavoriteSpellVisualKitIDs;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local total = 0;
|
|
|
|
|
for visualID, info in pairs(self.db) do
|
|
|
|
|
total = total + 1;
|
|
|
|
|
self.isFavorite[visualID] = true;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
self.numFavs = total;
|
|
|
|
|
|
|
|
|
|
return total;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:IsFavorite(visualID)
|
|
|
|
|
return self.isFavorite[visualID];
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function SortFunc_Name(a, b)
|
|
|
|
|
if a[4] ~= b[4] then
|
|
|
|
|
return a[4] < b[4]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return a[1] > b[1]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:GetSortedList()
|
|
|
|
|
if self.sortedList then
|
|
|
|
|
return self.sortedList
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local n = 0;
|
|
|
|
|
local tbl = {};
|
|
|
|
|
local lower = string.lower;
|
|
|
|
|
local keyword = SearchBox:GetValidText();
|
|
|
|
|
|
|
|
|
|
if keyword then
|
|
|
|
|
keyword = lower(keyword);
|
|
|
|
|
local find = string.find;
|
|
|
|
|
local lowcaseName;
|
|
|
|
|
for visualID, info in pairs(self.db) do
|
|
|
|
|
lowcaseName = lower(info[1]);
|
|
|
|
|
if find(lowcaseName, keyword) then
|
|
|
|
|
n = n + 1;
|
|
|
|
|
tbl[n] = {
|
|
|
|
|
visualID, info[1], info[2], lower(info[1])
|
|
|
|
|
};
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
for visualID, info in pairs(self.db) do
|
|
|
|
|
n = n + 1;
|
|
|
|
|
tbl[n] = {
|
|
|
|
|
visualID, info[1], info[2], lower(info[1])
|
|
|
|
|
};
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
table.sort(tbl, SortFunc_Name);
|
|
|
|
|
self.sortedList = tbl;
|
|
|
|
|
|
|
|
|
|
return tbl
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:GetEntryNameByIndex(index)
|
|
|
|
|
if self.sortedList and index then
|
|
|
|
|
return self.sortedList[index][2]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:GetNumFavorites()
|
|
|
|
|
return self.numFavs or 0;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:Add(visualID, customName)
|
|
|
|
|
self.sortedList = nil;
|
|
|
|
|
local name, icon = GetSpellVisualKitInfo(visualID);
|
|
|
|
|
customName = customName or name or "";
|
|
|
|
|
self.db[visualID] = {customName};
|
|
|
|
|
if not self.isFavorite[visualID] then
|
|
|
|
|
self.isFavorite[visualID] = true;
|
|
|
|
|
self.numFavs = self.numFavs + 1;
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:Remove(visualID)
|
|
|
|
|
self.sortedList = nil;
|
|
|
|
|
self.isFavorite[visualID] = nil;
|
|
|
|
|
if self.db[visualID] then
|
|
|
|
|
self.db[visualID] = nil;
|
|
|
|
|
self.numFavs = self.numFavs - 1;
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:Rename(visualID, newName, index)
|
|
|
|
|
if self.db[visualID] then
|
|
|
|
|
newName = newName or "";
|
|
|
|
|
self.db[visualID] = {newName};
|
|
|
|
|
if self.sortedList and index and self.sortedList[index] then
|
|
|
|
|
self.sortedList[index][2] = newName;
|
|
|
|
|
end
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:MarkForRemoval(visualID)
|
|
|
|
|
if not self.pendingRemovalVisuals then
|
|
|
|
|
self.pendingRemovalVisuals = {};
|
|
|
|
|
end
|
|
|
|
|
self.pendingRemovalVisuals[visualID] = true;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:ToggleRemoval(visualID)
|
|
|
|
|
if not self.pendingRemovalVisuals then
|
|
|
|
|
self.pendingRemovalVisuals = {};
|
|
|
|
|
end
|
|
|
|
|
self.pendingRemovalVisuals[visualID] = not self.pendingRemovalVisuals[visualID];
|
|
|
|
|
return self.pendingRemovalVisuals[visualID]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:IsMarkedForRemoval(visualID)
|
|
|
|
|
return self.pendingRemovalVisuals and self.pendingRemovalVisuals[visualID] == true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:GetNumPendingRemoval()
|
|
|
|
|
local total = 0;
|
|
|
|
|
if self.pendingRemovalVisuals then
|
|
|
|
|
for visualID, state in pairs(self.pendingRemovalVisuals) do
|
|
|
|
|
if state and self.db[visualID] then
|
|
|
|
|
total = total + 1;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return total
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:CancelPendingRemoval()
|
|
|
|
|
self.pendingRemovalVisuals = nil;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:ConfirmPendingRemoval()
|
|
|
|
|
local total = 0;
|
|
|
|
|
if self.pendingRemovalVisuals then
|
|
|
|
|
for visualID, state in pairs(self.pendingRemovalVisuals) do
|
|
|
|
|
if state and self.db[visualID] then
|
|
|
|
|
total = total + 1;
|
|
|
|
|
self.db[visualID] = nil;
|
|
|
|
|
self.isFavorite[visualID] = nil;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
self.pendingRemovalVisuals = nil;
|
|
|
|
|
end
|
|
|
|
|
self.numFavs = self.numFavs - total;
|
|
|
|
|
|
|
|
|
|
if total > 0 then
|
|
|
|
|
self.sortedList = nil;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return total
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:SetMyCategoryButton(myCategoryButton)
|
|
|
|
|
self.myCategoryButton = myCategoryButton;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavUtil:UpdateMyCategoryButton(diff)
|
|
|
|
|
local button = self.myCategoryButton;
|
|
|
|
|
if button then
|
|
|
|
|
button.Count:SetText(self:GetNumFavorites());
|
|
|
|
|
if diff then
|
|
|
|
|
if diff > 0 then
|
|
|
|
|
button.Differential:SetText("|cff7cc576+"..diff.."|r");
|
|
|
|
|
else
|
|
|
|
|
button.Differential:SetText("|cffff5050-"..-diff.."|r");
|
|
|
|
|
end
|
|
|
|
|
button.Differential.FadeText:Play();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local EntryButtonMixin = {};
|
|
|
|
|
local FavoredEntryMixin = {};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function EntryTab_Init()
|
|
|
|
|
if EntryTab.ScrollView then return end;
|
|
|
|
|
|
|
|
|
|
local Mixin = NarciAPI.Mixin;
|
|
|
|
|
local ScrollView = NarciAPI.CreateScrollView(EntryTab);
|
|
|
|
|
EntryTab.ScrollView = ScrollView;
|
|
|
|
|
ScrollView:SetSize(116, 128);
|
|
|
|
|
ScrollView:SetPoint("BOTTOM", EntryTab, "BOTTOM", 0, 0);
|
|
|
|
|
ScrollView:SetStepSize(16 * 3);
|
|
|
|
|
ScrollView:OnSizeChanged();
|
|
|
|
|
ScrollView:SetBottomOvershoot(16);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function EntryButton_Create()
|
|
|
|
|
local obj = CreateFrame("Button", nil, ScrollView, "NarciSpellViusalBrowserEntryButtonTemplate");
|
|
|
|
|
Mixin(obj, EntryButtonMixin);
|
|
|
|
|
return obj
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
ScrollView:AddTemplate("EntryButton", EntryButton_Create);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function FavoredButton_Create()
|
|
|
|
|
local obj = CreateFrame("Button", nil, ScrollView, "Narci_SavedSpellVisualButtonTemplate");
|
|
|
|
|
Mixin(obj, FavoredEntryMixin);
|
|
|
|
|
obj:OnLoad();
|
|
|
|
|
return obj
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
ScrollView:AddTemplate("FavoredButton", FavoredButton_Create);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local BottomShadow = ScrollView:CreateTexture(nil, "OVERLAY", nil, 5);
|
|
|
|
|
BottomShadow:SetTexture("Interface/AddOns/Narcissus/Art/Widgets/SpellVisualBrowser/Panel");
|
|
|
|
|
BottomShadow:SetSize(126, 20);
|
|
|
|
|
BottomShadow:SetTexCoord(0, 0.228515625, 0.923828125, 0.970703125);
|
|
|
|
|
BottomShadow:SetPoint("BOTTOM", ScrollView, "BOTTOM", 0, -2);
|
|
|
|
|
BottomShadow:Hide();
|
|
|
|
|
|
|
|
|
|
ScrollView:SetOnScrollableChangedCallback(function(scrollable)
|
|
|
|
|
BottomShadow:SetShown(scrollable);
|
|
|
|
|
end);
|
|
|
|
|
|
|
|
|
|
ScrollView:SetOnScrollStartCallback(function()
|
|
|
|
|
MyFavoriteEditFrame.EditBox.anyChange = nil;
|
|
|
|
|
MyFavoriteEditFrame:Hide();
|
|
|
|
|
end);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local ButtonHighlight = ScrollView:CreateTexture(nil, "OVERLAY", nil, 4);
|
|
|
|
|
ButtonHighlight:Hide();
|
|
|
|
|
ButtonHighlight:SetSize(116, 16);
|
|
|
|
|
ButtonHighlight:SetColorTexture(1, 1, 1, 0.08);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function ScrollView:HighlightButton(button)
|
|
|
|
|
ButtonHighlight:Hide();
|
|
|
|
|
ButtonHighlight:ClearAllPoints();
|
|
|
|
|
if button then
|
|
|
|
|
ButtonHighlight:SetPoint("CENTER", button, "CENTER", 0, 0);
|
|
|
|
|
ButtonHighlight:Show();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function DisplayVisualsByCategory(categoryIndex, fromRefresh)
|
|
|
|
|
--scrollBar.BottomShadow:SetAlpha(0);
|
|
|
|
|
--scrollBar.TopShadow:SetAlpha(0);
|
|
|
|
|
|
|
|
|
|
ScrollHistory:SetActiveCategory(categoryIndex);
|
|
|
|
|
EntryTab_Init();
|
|
|
|
|
|
|
|
|
|
local content = {};
|
|
|
|
|
local buttonHeight = 16;
|
|
|
|
|
local offsetY = 0;
|
|
|
|
|
local n = 0;
|
|
|
|
|
local top, bottom;
|
|
|
|
|
|
|
|
|
|
local category = SpellVisualList[categoryIndex];
|
|
|
|
|
|
|
|
|
|
for headerIndex, visualInfoList in ipairs(category) do
|
|
|
|
|
n = n + 1;
|
|
|
|
|
top = offsetY;
|
|
|
|
|
bottom = offsetY + buttonHeight;
|
|
|
|
|
local count = #visualInfoList;
|
|
|
|
|
content[n] = {
|
|
|
|
|
dataIndex = n,
|
|
|
|
|
templateKey = "EntryButton",
|
|
|
|
|
setupFunc = function(obj)
|
|
|
|
|
obj:SetHeader(headerIndex, visualInfoList.name, count);
|
|
|
|
|
end,
|
|
|
|
|
top = top,
|
|
|
|
|
bottom = bottom,
|
|
|
|
|
};
|
|
|
|
|
offsetY = bottom;
|
|
|
|
|
|
|
|
|
|
if ScrollHistory:IsHeaderExpanded(headerIndex) then
|
|
|
|
|
for j, info in ipairs(visualInfoList) do
|
|
|
|
|
n = n + 1;
|
|
|
|
|
top = offsetY;
|
|
|
|
|
bottom = offsetY + buttonHeight;
|
|
|
|
|
content[n] = {
|
|
|
|
|
dataIndex = n,
|
|
|
|
|
templateKey = "EntryButton",
|
|
|
|
|
setupFunc = function(obj)
|
|
|
|
|
obj:SetEntry(info);
|
|
|
|
|
if j == count then
|
|
|
|
|
obj.Divider:Show();
|
|
|
|
|
end
|
|
|
|
|
end,
|
|
|
|
|
top = top,
|
|
|
|
|
bottom = bottom,
|
|
|
|
|
};
|
|
|
|
|
offsetY = bottom;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local retainPosition = fromRefresh;
|
|
|
|
|
EntryTab.ScrollView:SetContent(content, retainPosition);
|
|
|
|
|
|
|
|
|
|
if not fromRefresh then
|
|
|
|
|
local lastOffset = ScrollHistory:GetLastOffset();
|
|
|
|
|
if lastOffset then
|
|
|
|
|
EntryTab.ScrollView:SnapTo(lastOffset);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
do --EntryButtonMixin
|
|
|
|
|
function EntryButtonMixin:OnClick_Header()
|
|
|
|
|
if self.headerIndex then
|
|
|
|
|
ScrollHistory:ToggleHeaderExpanded(self.headerIndex);
|
|
|
|
|
DisplayVisualsByCategory(ScrollHistory:GetActiveCategoryIndex(), true);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EntryButtonMixin:OnEnter_Header()
|
|
|
|
|
self:GetParent():HighlightButton(self);
|
|
|
|
|
QuickFavoriteButton:Hide();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EntryButtonMixin:OnLeave_Header()
|
|
|
|
|
self:GetParent():HighlightButton();
|
|
|
|
|
--self:GetParent():SetAlpha(1);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EntryButtonMixin:OnClick_Entry(button)
|
|
|
|
|
local model = Narci.ActiveModel;
|
|
|
|
|
if not model then return; end;
|
|
|
|
|
if button == "LeftButton" then
|
|
|
|
|
model:ApplySpellVisualKit(self.visualID, true);
|
|
|
|
|
|
|
|
|
|
--Show Mouse Button Tooltip: Right-click to apply visuals
|
|
|
|
|
if not clickCounter.tooltipShown then
|
|
|
|
|
clickCounter.leftButton = clickCounter.leftButton + 1;
|
|
|
|
|
if clickCounter.leftButton >= 3 then
|
|
|
|
|
clickCounter.tooltipShown = true;
|
|
|
|
|
BrowserFrame.MouseButton:FadeIn();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
elseif button == "RightButton" then
|
|
|
|
|
SmoothInsert(self.visualID, self.texID, self:GetText());
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--Set Suggested AnimationID
|
|
|
|
|
local animID = self.animID;
|
|
|
|
|
SuggestionFrame.IDButton.animID = animID;
|
|
|
|
|
if animID then
|
|
|
|
|
if SuggestionFrame.AutoPlay.IsOn then
|
|
|
|
|
model:PlayAnimation(animID);
|
|
|
|
|
animID = "|cffd9cdb4"..animID;
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
animID = "|cffa7a7a7".."N/A";
|
|
|
|
|
end
|
|
|
|
|
SuggestionFrame.IDButton:SetText(animID);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EntryButtonMixin:OnEnter_Entry()
|
|
|
|
|
self:GetParent():HighlightButton(self);
|
|
|
|
|
if not self.visualID then return; end;
|
|
|
|
|
UpdatePreview(self.visualID);
|
|
|
|
|
local Star = QuickFavoriteButton;
|
|
|
|
|
Star:SetPoint("CENTER", self.Star, "CENTER", 0, 0);
|
|
|
|
|
Star:SetParent(self);
|
|
|
|
|
Star.parent = self;
|
|
|
|
|
Star:Show();
|
|
|
|
|
Star.visualID = self.visualID;
|
|
|
|
|
Star:SetFavorite(FavUtil:IsFavorite(self.visualID));
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EntryButtonMixin:OnLeave_Entry()
|
|
|
|
|
self:GetParent():HighlightButton();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function EntryButtonMixin:SetHeader(headerIndex, name, count)
|
|
|
|
|
self:SetText(name);
|
|
|
|
|
self.headerIndex = headerIndex;
|
|
|
|
|
self.Divider:Show()
|
|
|
|
|
self.collapsed = true;
|
|
|
|
|
self.ButtonText:SetJustifyH("CENTER");
|
|
|
|
|
self.ButtonText:SetPoint("CENTER", 0, 0);
|
|
|
|
|
self.Icon:SetTexture("Interface\\AddOns\\Narcissus\\Art\\Widgets\\SpellVisualBrowser\\ExpandMark");
|
|
|
|
|
self:UpdateCollapsed();
|
|
|
|
|
self.Star:Hide();
|
|
|
|
|
self.visualID = nil;
|
|
|
|
|
self.Count:SetText(count);
|
|
|
|
|
self.Count:Show();
|
|
|
|
|
self.Background:Show();
|
|
|
|
|
self:SetPushedTextOffset(0, 0);
|
|
|
|
|
self:SetScript("OnClick", self.OnClick_Header);
|
|
|
|
|
self:SetScript("OnEnter", self.OnEnter_Header);
|
|
|
|
|
self:SetScript("OnLeave", self.OnLeave_Header);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EntryButtonMixin:SetEntry(info)
|
|
|
|
|
self.visualID = info[1];
|
|
|
|
|
self.animID = info[4];
|
|
|
|
|
self.headerIndex = nil;
|
|
|
|
|
self.collapsed = nil;
|
|
|
|
|
self.Divider:Hide();
|
|
|
|
|
if FavUtil:IsFavorite(self.visualID) then
|
|
|
|
|
self.Star:Show();
|
|
|
|
|
else
|
|
|
|
|
self.Star:Hide();
|
|
|
|
|
end
|
|
|
|
|
self:SetText(info[2]);
|
|
|
|
|
self.ButtonText:SetJustifyH("LEFT");
|
|
|
|
|
self.ButtonText:SetPoint("CENTER", 13, 0);
|
|
|
|
|
self.Count:Hide();
|
|
|
|
|
self.Background:Hide();
|
|
|
|
|
self.texID = info[3];
|
|
|
|
|
if self.texID == 1 then
|
|
|
|
|
self.texID = 134400;
|
|
|
|
|
end
|
|
|
|
|
self.Icon:SetTexture(self.texID);
|
|
|
|
|
self.Icon:SetTexCoord(0.09375, 0.90625, 0.09375, 0.90625);
|
|
|
|
|
self:SetPushedTextOffset(1, -0.6);
|
|
|
|
|
self:SetScript("OnClick", self.OnClick_Entry);
|
|
|
|
|
self:SetScript("OnEnter", self.OnEnter_Entry);
|
|
|
|
|
self:SetScript("OnLeave", self.OnLeave_Entry);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EntryButtonMixin:UpdateCollapsed()
|
|
|
|
|
if self.headerIndex then
|
|
|
|
|
if ScrollHistory:IsHeaderExpanded(self.headerIndex) then
|
|
|
|
|
self.Icon:SetTexCoord(0, 1, 1, 0);
|
|
|
|
|
else
|
|
|
|
|
self.Icon:SetTexCoord(0, 1, 0, 1);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function CategoryButton_OnClick(self)
|
|
|
|
|
DisplayVisualsByCategory(self.index);
|
|
|
|
|
ListFrame.Header.Tab2Label:SetText(self:GetText());
|
|
|
|
|
After(0, function()
|
|
|
|
|
GoToTab(2);
|
|
|
|
|
end);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
do --FavoredEntryMixin
|
|
|
|
|
function FavoredEntryMixin:OnEnter()
|
|
|
|
|
self:GetParent():HighlightButton(self);
|
|
|
|
|
|
|
|
|
|
if not self.visualID then return; end;
|
|
|
|
|
UpdatePreview(self.visualID);
|
|
|
|
|
|
|
|
|
|
--Relocate edit buttons (rename, delete)
|
|
|
|
|
if MyFavoriteEditFrame.EditBox:HasFocus() then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
MyFavoriteEditFrame.parent = self;
|
|
|
|
|
MyFavoriteEditFrame.visualID = self.visualID;
|
|
|
|
|
MyFavoriteEditFrame:SetParent(self);
|
|
|
|
|
MyFavoriteEditFrame:SetFrameLevel(self:GetFrameLevel() + 1);
|
|
|
|
|
MyFavoriteEditFrame:SetPoint("RIGHT", self, "RIGHT", -4, 0);
|
|
|
|
|
MyFavoriteEditFrame:Show();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavoredEntryMixin:OnLeave()
|
|
|
|
|
if self:IsMouseOver() then return end;
|
|
|
|
|
self:GetParent():HighlightButton(nil);
|
|
|
|
|
if not MyFavoriteEditFrame.EditBox:HasFocus() then
|
|
|
|
|
MyFavoriteEditFrame:Hide();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavoredEntryMixin:OnClick(button)
|
|
|
|
|
local model = Narci.ActiveModel;
|
|
|
|
|
if not model then return; end;
|
|
|
|
|
if button == "LeftButton" then
|
|
|
|
|
model:ApplySpellVisualKit(self.visualID, true);
|
|
|
|
|
elseif button == "RightButton" then
|
|
|
|
|
SmoothInsert(self.visualID, self.texID, self:GetText());
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavoredEntryMixin:OnEnable()
|
|
|
|
|
self.Icon:SetDesaturated(false);
|
|
|
|
|
self:SetAlpha(1);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavoredEntryMixin:OnDisable()
|
|
|
|
|
self.Icon:SetDesaturated(true);
|
|
|
|
|
self:SetAlpha(0.4);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavoredEntryMixin:SetInfo(info)
|
|
|
|
|
self:Show();
|
|
|
|
|
self:Enable();
|
|
|
|
|
self.visualID = info[1];
|
|
|
|
|
self.text = info[2];
|
|
|
|
|
self:SetText(FavUtil:GetEntryNameByIndex(self.index) or self.text);
|
|
|
|
|
self.ButtonText:SetJustifyH("LEFT");
|
|
|
|
|
self.ButtonText:SetPoint("CENTER", 13, 0);
|
|
|
|
|
local _, icon = GetSpellVisualKitInfo(self.visualID);
|
|
|
|
|
local texID = icon or 134400;
|
|
|
|
|
self.Icon:SetTexture(texID);
|
|
|
|
|
self.Icon:SetTexCoord(0.09375, 0.90625, 0.09375, 0.90625);
|
|
|
|
|
self.texID = texID;
|
|
|
|
|
|
|
|
|
|
if FavUtil:IsMarkedForRemoval(self.visualID) then
|
|
|
|
|
self:Disable();
|
|
|
|
|
else
|
|
|
|
|
self:Enable();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function FavoredEntryMixin:OnLoad()
|
|
|
|
|
self:SetPushedTextOffset(1, -0.6);
|
|
|
|
|
self:SetScript("OnClick", self.OnClick);
|
|
|
|
|
self:SetScript("OnEnter", self.OnEnter);
|
|
|
|
|
self:SetScript("OnLeave", self.OnLeave);
|
|
|
|
|
self:SetScript("OnEnable", self.OnEnable);
|
|
|
|
|
self:SetScript("OnDisable", self.OnDisable);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
----------------------------------------------------------------
|
|
|
|
|
local function DisplayFavorites(fromRefresh)
|
|
|
|
|
ListFrame.Header.Tab2Label:SetText(L["My Favorites"]);
|
|
|
|
|
|
|
|
|
|
ScrollHistory:SetActiveCategory(0);
|
|
|
|
|
EntryTab_Init();
|
|
|
|
|
|
|
|
|
|
local content = {};
|
|
|
|
|
local buttonHeight = 16;
|
|
|
|
|
local offsetY = 2; --SearchBox's ClearTextButton is too close to the delete button on the top entry
|
|
|
|
|
local n = 0;
|
|
|
|
|
local top, bottom;
|
|
|
|
|
|
|
|
|
|
for index, info in pairs(FavUtil:GetSortedList()) do
|
|
|
|
|
n = n + 1;
|
|
|
|
|
top = offsetY;
|
|
|
|
|
bottom = offsetY + buttonHeight;
|
|
|
|
|
content[n] = {
|
|
|
|
|
dataIndex = n,
|
|
|
|
|
templateKey = "FavoredButton",
|
|
|
|
|
setupFunc = function(obj)
|
|
|
|
|
obj.index = index;
|
|
|
|
|
obj:SetInfo(info);
|
|
|
|
|
end,
|
|
|
|
|
top = top,
|
|
|
|
|
bottom = bottom,
|
|
|
|
|
};
|
|
|
|
|
offsetY = bottom;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local retainPosition = fromRefresh;
|
|
|
|
|
EntryTab.ScrollView:HighlightButton(nil);
|
|
|
|
|
EntryTab.ScrollView:SetContent(content, retainPosition);
|
|
|
|
|
|
|
|
|
|
if not fromRefresh then
|
|
|
|
|
local lastOffset = ScrollHistory:GetLastOffset();
|
|
|
|
|
if lastOffset then
|
|
|
|
|
EntryTab.ScrollView:SnapTo(lastOffset);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
MyFavoriteEditFrame:Hide();
|
|
|
|
|
SearchBox.NoMatchText:SetShown(n == 0);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function GoToMyFavorites()
|
|
|
|
|
DisplayFavorites();
|
|
|
|
|
After(0, function()
|
|
|
|
|
GoToTab(3);
|
|
|
|
|
end);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function UpdateCategoryButtons()
|
|
|
|
|
local frame = ListFrame.Category;
|
|
|
|
|
if not frame.CategoryButtons then
|
|
|
|
|
frame.CategoryButtons = {};
|
|
|
|
|
end
|
|
|
|
|
local button;
|
|
|
|
|
local buttons = frame.CategoryButtons;
|
|
|
|
|
local totalPresets = #SpellVisualList + 1; --The last one is reserved for My Favorites
|
|
|
|
|
for i = 1, totalPresets do
|
|
|
|
|
button = buttons[i];
|
|
|
|
|
if not button then
|
|
|
|
|
button = CreateFrame("Button", nil, frame, "Narci_SpellVisualCategoryButtonTemplate");
|
|
|
|
|
buttons[i] = button;
|
|
|
|
|
end
|
|
|
|
|
if i == 1 then
|
|
|
|
|
button:SetPoint("TOP", frame, "TOP", 0, -16);
|
|
|
|
|
else
|
|
|
|
|
button:SetPoint("TOP", buttons[i - 1], "BOTTOM", 0, 0);
|
|
|
|
|
end
|
|
|
|
|
button.index = i;
|
|
|
|
|
if i == totalPresets then
|
|
|
|
|
button:SetText(L["My Favorites"]);
|
|
|
|
|
button.Count:SetText(FavUtil:GetNumFavorites());
|
|
|
|
|
button:SetScript("OnClick", GoToMyFavorites);
|
|
|
|
|
FavUtil:SetMyCategoryButton(button);
|
|
|
|
|
else
|
|
|
|
|
button:SetText(SpellVisualList[i]["name"]);
|
|
|
|
|
button.Count:SetText( CountLength( SpellVisualList[i] ) );
|
|
|
|
|
button:SetScript("OnClick", CategoryButton_OnClick);
|
|
|
|
|
end
|
|
|
|
|
button:Show();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for i = totalPresets + 1, #buttons do
|
|
|
|
|
buttons[i]:Hide();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualUtil:SelectPack(index)
|
|
|
|
|
local packName;
|
|
|
|
|
SpellVisualList, packName = self:GetPack(index);
|
|
|
|
|
UpdateCategoryButtons();
|
|
|
|
|
ScrollHistory:Reset();
|
|
|
|
|
After(0, function()
|
|
|
|
|
HomeButton:Click();
|
|
|
|
|
end)
|
|
|
|
|
return packName
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualUtil:SelectFirstCategory()
|
|
|
|
|
--for tutorial
|
|
|
|
|
local categoryIndex = 1;
|
|
|
|
|
DisplayVisualsByCategory(categoryIndex);
|
|
|
|
|
ListFrame.Header.Tab2Label:SetText(SpellVisualList[categoryIndex].name);
|
|
|
|
|
After(0, function()
|
|
|
|
|
GoToTab(2);
|
|
|
|
|
end);
|
|
|
|
|
end
|
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
|
--History Tab
|
|
|
|
|
|
|
|
|
|
local function HistoryButton_OnClick(self)
|
|
|
|
|
local id = self:GetID();
|
|
|
|
|
local buttons = self:GetParent().buttons;
|
|
|
|
|
local button;
|
|
|
|
|
for i = 1, #buttons do
|
|
|
|
|
button = buttons[i];
|
|
|
|
|
button.Border:SetTexCoord(0, 0.25, 0, 1);
|
|
|
|
|
if i ~= id then
|
|
|
|
|
button.selected = false;
|
|
|
|
|
button.Icon:SetAlpha(0.6);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local DeleteIcon = self:GetParent():GetParent().DeleteButton.Icon;
|
|
|
|
|
self.selected = not self.selected;
|
|
|
|
|
if self.selected then
|
|
|
|
|
self.Border:SetTexCoord(0.25, 0.5, 0, 1);
|
|
|
|
|
SelectedVisualIndex = id;
|
|
|
|
|
DeleteIcon:SetDesaturated(false);
|
|
|
|
|
else
|
|
|
|
|
self.Border:SetTexCoord(0, 0.25, 0, 1);
|
|
|
|
|
SelectedVisualIndex = nil;
|
|
|
|
|
DeleteIcon:SetDesaturated(true);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function HistoryButton_OnEnter(self)
|
|
|
|
|
self.Icon:Show();
|
|
|
|
|
self.Icon:SetAlpha(1);
|
|
|
|
|
local tooltip = BrowserFrame.HistoryTooltip;
|
|
|
|
|
local formatedID = "|cff999999"..self.visualID.."|r ";
|
|
|
|
|
tooltip:SetPoint("BOTTOM", self, "TOP", 0, 0);
|
|
|
|
|
if self.name and self.name ~= "" then
|
|
|
|
|
tooltip.Label:SetText(formatedID.. self.name);
|
|
|
|
|
PreviewTimer.pendingID = self.visualID;
|
|
|
|
|
UpdatePreview(self.visualID);
|
|
|
|
|
else
|
|
|
|
|
tooltip.Label:SetText(formatedID.. "Custom");
|
|
|
|
|
end
|
|
|
|
|
tooltip:Show();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function HistoryButton_OnLeave(self)
|
|
|
|
|
BrowserFrame.HistoryTooltip:Hide();
|
|
|
|
|
if self.selected then return; end;
|
|
|
|
|
FadeFrame(self.Icon, 0.2, 0.6);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function CreateHistoryButtonFrame(self)
|
|
|
|
|
local NumVisibleButtons = NUM_MAX_HISTORY;
|
|
|
|
|
local offsetX = 24;
|
|
|
|
|
local offsetY = 18;
|
|
|
|
|
local button;
|
|
|
|
|
local buttons = {};
|
|
|
|
|
for i = 1, NumVisibleButtons + 1 do
|
|
|
|
|
button = CreateFrame("Button", nil, self, "Narci_HistoryButtonTemplate");
|
|
|
|
|
if i == 1 then
|
|
|
|
|
button:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", 0, 24);
|
|
|
|
|
else
|
|
|
|
|
button:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", offsetX * (i - 1) , 24);
|
|
|
|
|
end
|
|
|
|
|
button.Icon:SetSize(14, 14);
|
|
|
|
|
button.Icon:SetAlpha(0.6);
|
|
|
|
|
button.ID:SetText(i);
|
|
|
|
|
button:SetID(i);
|
|
|
|
|
button:SetScript("OnClick", HistoryButton_OnClick);
|
|
|
|
|
button:SetScript("OnEnter", HistoryButton_OnEnter);
|
|
|
|
|
button:SetScript("OnLeave", HistoryButton_OnLeave);
|
|
|
|
|
tinsert(buttons, button);
|
|
|
|
|
end
|
|
|
|
|
self.buttons = buttons;
|
|
|
|
|
self.numEffectiveButtons = 0;
|
|
|
|
|
self.offsetY = offsetY;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
|
--Edit box frame
|
|
|
|
|
local function EditBox_OnEnterPressed(self)
|
|
|
|
|
self:ClearFocus();
|
|
|
|
|
self.Highlight:Hide();
|
|
|
|
|
local id = math.min(self:GetNumber(), VISUAL_ID_MAX);
|
|
|
|
|
|
|
|
|
|
local model = Narci.ActiveModel;
|
|
|
|
|
if not model then return; end;
|
|
|
|
|
|
|
|
|
|
model:ApplySpellVisualKit(id, true);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function EditBox_OnMouseWheel(self, delta)
|
|
|
|
|
local id = self:GetNumber();
|
|
|
|
|
|
|
|
|
|
if delta < 0 and id < VISUAL_ID_MAX then
|
|
|
|
|
id = id + 1;
|
|
|
|
|
elseif delta > 0 and id > 0 then
|
|
|
|
|
id = id - 1;
|
|
|
|
|
else
|
|
|
|
|
return;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local model = Narci.ActiveModel;
|
|
|
|
|
if not model then return; end;
|
|
|
|
|
|
|
|
|
|
self:SetNumber(id)
|
|
|
|
|
model:ApplySpellVisualKit(id, true);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function EditBox_OnTextChanged(self)
|
|
|
|
|
--Update Favorite button
|
|
|
|
|
local Star = self:GetParent().FavoriteButton;
|
|
|
|
|
local visualID = self:GetNumber();
|
|
|
|
|
if FavUtil:IsFavorite(visualID) then
|
|
|
|
|
Star.Icon:SetAlpha(1);
|
|
|
|
|
Star.Icon:SetTexCoord(0.25, 0.5, 0, 1);
|
|
|
|
|
Star.isFav = true;
|
|
|
|
|
else
|
|
|
|
|
Star.Icon:SetAlpha(0.6);
|
|
|
|
|
Star.Icon:SetTexCoord(0, 0.25, 0, 1);
|
|
|
|
|
Star.isFav = false;
|
|
|
|
|
end
|
|
|
|
|
----
|
|
|
|
|
self.Timer:Stop();
|
|
|
|
|
EditorPopup:Hide();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function ResetModel()
|
|
|
|
|
local model = Narci.ActiveModel;
|
|
|
|
|
if not model then return; end;
|
|
|
|
|
|
|
|
|
|
local posX, posY, posZ = model:GetPosition();
|
|
|
|
|
local camX, camY, camZ = model:GetCameraPosition();
|
|
|
|
|
local _, _, dirX, dirY, dirZ, _, ambR, ambG, ambB, _, dirR, dirG, dirB = TransitionAPI.GetModelLight(model);
|
|
|
|
|
local distance = model.cameraDistance;
|
|
|
|
|
local animationID = model.animationID;
|
|
|
|
|
local isPaused = model.isPaused;
|
|
|
|
|
--[[
|
|
|
|
|
if model.isPlayer then
|
|
|
|
|
if model.hasRaceChanged then
|
|
|
|
|
model:SetCustomRace();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
--]]
|
|
|
|
|
|
|
|
|
|
model.isCameraDirty = false;
|
|
|
|
|
|
|
|
|
|
if model.creatureID then
|
|
|
|
|
model:SetCreature(model.creatureID);
|
|
|
|
|
elseif model.displayID then
|
|
|
|
|
model:SetDisplayInfo(model.displayID);
|
|
|
|
|
elseif model.fileID then
|
|
|
|
|
model:SetModel(model.fileID);
|
|
|
|
|
else
|
|
|
|
|
if model.unit and model.unit == "player" then
|
|
|
|
|
TransitionAPI.SetModelByUnit(model, "player");
|
|
|
|
|
else
|
|
|
|
|
model:RefreshUnit();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
After(0, function()
|
|
|
|
|
model:MakeCurrentCameraCustom();
|
|
|
|
|
model:SetPosition(posX, posY, posZ);
|
|
|
|
|
TransitionAPI.SetCameraTarget(model, 0, 0, 0.8);
|
|
|
|
|
TransitionAPI.SetCameraPosition(model, camX, camY, camZ);
|
|
|
|
|
model.cameraDistance = distance;
|
|
|
|
|
TransitionAPI.SetModelLight(model, true, false, dirX, dirY, dirZ, 1, ambR, ambG, ambB, 1, dirR, dirG, dirB);
|
|
|
|
|
if isPaused then
|
|
|
|
|
--model:Freeze(animationID);
|
|
|
|
|
NarciModelControl_AnimationSlider:SetValue(model.freezedFrame or 0, true)
|
|
|
|
|
else
|
|
|
|
|
model:PlayAnimation(animationID);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
After(0, function()
|
|
|
|
|
model:ReEquipWeapons();
|
|
|
|
|
|
|
|
|
|
if model.isVirtual then
|
|
|
|
|
model:SetModelAlpha(0);
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
NarciPhotoModeAPI.ResetModel = ResetModel;
|
|
|
|
|
|
|
|
|
|
local function ResetButton_OnClick(self)
|
|
|
|
|
ResetModel();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function DeleteButton_OnClick(self)
|
|
|
|
|
self.Icon:SetDesaturated(true);
|
|
|
|
|
NarciTooltip:HideTooltip();
|
|
|
|
|
if not SelectedVisualIndex then return; end;
|
|
|
|
|
|
|
|
|
|
local model = Narci.ActiveModel;
|
|
|
|
|
if not model then
|
|
|
|
|
return;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local AppliedVisuals = model.AppliedVisuals;
|
|
|
|
|
SmoothRemove(SelectedVisualIndex);
|
|
|
|
|
if AppliedVisuals[SelectedVisualIndex] then
|
|
|
|
|
local NewHistory = {};
|
|
|
|
|
local index = 1;
|
|
|
|
|
for i = 1, NUM_VISIBLE_BUTTONS do
|
|
|
|
|
if index == SelectedVisualIndex then
|
|
|
|
|
index = index + 1;
|
|
|
|
|
end
|
|
|
|
|
NewHistory[i] = AppliedVisuals[index];
|
|
|
|
|
index = index + 1;
|
|
|
|
|
end
|
|
|
|
|
model.AppliedVisuals = NewHistory;
|
|
|
|
|
else
|
|
|
|
|
return;
|
|
|
|
|
end
|
|
|
|
|
HistoryButton_ResetSelection();
|
|
|
|
|
--PrintTable(Narci.ActiveModel.AppliedVisuals);
|
|
|
|
|
ResetModel();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function DeleteButton_OnEnter(self)
|
|
|
|
|
self.Highlight:Show();
|
|
|
|
|
NarciTooltip:NewText(self, L["Remove Visual Tooltip"], nil, nil, true);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function ButtonWithTooltip_OnLeave(self)
|
|
|
|
|
self.Highlight:Hide();
|
|
|
|
|
NarciTooltip:HideTooltip();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function HistoryButton_RemoveAll()
|
|
|
|
|
SelectedVisualIndex = nil;
|
|
|
|
|
NUM_VISIBLE_BUTTONS = 0;
|
|
|
|
|
local buttons = HistoryButtonFrame.buttons;
|
|
|
|
|
local button;
|
|
|
|
|
for i = 1, #buttons do
|
|
|
|
|
button = buttons[i];
|
|
|
|
|
button.Border:SetTexCoord(0, 0.25, 0, 1);
|
|
|
|
|
After( (i - 1)/10, function()
|
|
|
|
|
FadeFrame(buttons[i], 0.25, 0);
|
|
|
|
|
end);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function DeleteButton_OnLongClick(self)
|
|
|
|
|
local model = Narci.ActiveModel;
|
|
|
|
|
if model then
|
|
|
|
|
HistoryButton_RemoveAll();
|
|
|
|
|
model.AppliedVisuals = {};
|
|
|
|
|
ResetModel();
|
|
|
|
|
self:GetParent().FadeOut:Play();
|
|
|
|
|
self:GetParent():GetParent().Icon:SetSize(18, 18);
|
|
|
|
|
else
|
|
|
|
|
local AlertFrame = Narci_AlertFrame_Autohide;
|
|
|
|
|
AlertFrame:SetAnchor(self, -24, true);
|
|
|
|
|
AlertFrame:AddMessage("No active model", true);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function PlusButton_OnClick(self, button)
|
|
|
|
|
local EditBox = self:GetParent().EditBox;
|
|
|
|
|
EditBox:ClearFocus();
|
|
|
|
|
local id = EditBox:GetNumber();
|
|
|
|
|
if button == "LeftButton" and id < VISUAL_ID_MAX then
|
|
|
|
|
id = id + 1;
|
|
|
|
|
elseif button == "RightButton" and id > 0 then
|
|
|
|
|
id = id - 1;
|
|
|
|
|
end
|
|
|
|
|
EditBox:SetNumber(id);
|
|
|
|
|
|
|
|
|
|
local model = Narci.ActiveModel;
|
|
|
|
|
if model then
|
|
|
|
|
model:ApplySpellVisualKit(id, true)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function ApplyButton_OnClick(self, button)
|
|
|
|
|
local EditBox = self:GetParent().EditBox;
|
|
|
|
|
EditBox:ClearFocus();
|
|
|
|
|
EditBox.Highlight:Hide();
|
|
|
|
|
local id = EditBox:GetNumber();
|
|
|
|
|
id = tonumber(id);
|
|
|
|
|
|
|
|
|
|
local name, icon, animationID = GetSpellVisualKitInfo(id);
|
|
|
|
|
SmoothInsert(id, icon, name);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local EditBoxFavoriteButtonMixin = {};
|
|
|
|
|
do
|
|
|
|
|
function EditBoxFavoriteButtonMixin:OnLoad()
|
|
|
|
|
self:SetScript("OnEnter", self.OnEnter);
|
|
|
|
|
self:SetScript("OnLeave", self.OnLeave);
|
|
|
|
|
self:SetScript("OnClick", self.OnClick);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EditBoxFavoriteButtonMixin:OnEnter()
|
|
|
|
|
self.Icon:SetAlpha(1);
|
|
|
|
|
self.Highlight:Show();
|
|
|
|
|
if not self:GetParent().PopUpFrame:IsShown() then
|
|
|
|
|
if self.isFav then
|
|
|
|
|
NarciTooltip:NewText(self, L["Favorites Remove"], nil, nil, true);
|
|
|
|
|
else
|
|
|
|
|
NarciTooltip:NewText(self, L["Favorites Add"], nil, nil, true);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EditBoxFavoriteButtonMixin:OnLeave()
|
|
|
|
|
NarciTooltip:HideTooltip();
|
|
|
|
|
self.Highlight:Hide();
|
|
|
|
|
if not self.isFav then
|
|
|
|
|
self.Icon:SetAlpha(0.6);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EditBoxFavoriteButtonMixin:Update()
|
|
|
|
|
local visualID = VisualIDEditBox:GetNumber();
|
|
|
|
|
if FavUtil:IsFavorite(visualID) then
|
|
|
|
|
self.Icon:SetAlpha(1);
|
|
|
|
|
self.Icon:SetTexCoord(0.25, 0.5, 0, 1);
|
|
|
|
|
self.isFav = true;
|
|
|
|
|
else
|
|
|
|
|
if self:IsMouseMotionFocus() then
|
|
|
|
|
self.Icon:SetAlpha(1);
|
|
|
|
|
else
|
|
|
|
|
self.Icon:SetAlpha(0.6);
|
|
|
|
|
end
|
|
|
|
|
self.Icon:SetTexCoord(0, 0.25, 0, 1);
|
|
|
|
|
self.isFav = false;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EditBoxFavoriteButtonMixin:OnClick()
|
|
|
|
|
NarciTooltip:HideTooltip();
|
|
|
|
|
local visualID = VisualIDEditBox:GetNumber();
|
|
|
|
|
if not visualID then return end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not self.isFav then
|
|
|
|
|
if EditorPopup:IsShown() then
|
|
|
|
|
EditorPopup:Confirm();
|
|
|
|
|
self.Icon:SetTexCoord(0.25, 0.5, 0, 1);
|
|
|
|
|
self.isFav = true;
|
|
|
|
|
self.Icon:SetAlpha(1);
|
|
|
|
|
else
|
|
|
|
|
BrowserFrame.ArtFrame.Bling.animIn:Play();
|
|
|
|
|
local index = FavUtil:GetNumFavorites() + 1;
|
|
|
|
|
EditorPopup.HiddenFrame.EditBox:SetText("Custom Visual " .. index);
|
|
|
|
|
FadeFrame(EditorPopup, 0.15, 1);
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
if FavUtil:Remove(visualID) then
|
|
|
|
|
self.isFav = false;
|
|
|
|
|
self.Icon:SetTexCoord(0, 0.25, 0, 1);
|
|
|
|
|
FavUtil:UpdateMyCategoryButton(-1);
|
|
|
|
|
if CURRENT_TAB_INDEX == 3 then
|
|
|
|
|
FavUtil:CancelPendingRemoval();
|
|
|
|
|
DisplayFavorites();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local EditorPopupMixin = {};
|
|
|
|
|
do
|
|
|
|
|
function EditorPopupMixin:Confirm()
|
|
|
|
|
local EditBox = EditorPopup.HiddenFrame.EditBox;
|
|
|
|
|
local visualID = VisualIDEditBox:GetNumber();
|
|
|
|
|
if FavUtil:Add(visualID, EditBox:GetText()) then
|
|
|
|
|
FavUtil:UpdateMyCategoryButton(1);
|
|
|
|
|
end
|
|
|
|
|
EditBox:ClearFocus();
|
|
|
|
|
EditBoxFavoriteButton:Update();
|
|
|
|
|
FadeFrame(EditorPopup, 0.25, 0);
|
|
|
|
|
|
|
|
|
|
if CURRENT_TAB_INDEX == 3 then
|
|
|
|
|
FavUtil:CancelPendingRemoval();
|
|
|
|
|
DisplayFavorites();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EditorPopupMixin:Cancel()
|
|
|
|
|
FadeFrame(EditorPopup, 0.15, 0);
|
|
|
|
|
EditBoxFavoriteButton:Update();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EditorPopupMixin:OnLoad()
|
|
|
|
|
local f = self.HiddenFrame;
|
|
|
|
|
f.Header:SetText(L["New Favorite"]);
|
|
|
|
|
f.ConfirmButton:SetScript("OnClick", self.Confirm);
|
|
|
|
|
f.CancelButton:SetScript("OnClick", self.Cancel);
|
|
|
|
|
f.EditBox:SetScript("OnEnterPressed", self.Confirm);
|
|
|
|
|
f.EditBox:SetScript("OnEscapePressed", self.Cancel);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function UpdateDeleteInfo()
|
|
|
|
|
local numToBeDeleted = FavUtil:GetNumPendingRemoval();
|
|
|
|
|
local TextFormat;
|
|
|
|
|
if numToBeDeleted > 1 then
|
|
|
|
|
TextFormat = L["Delete Entry Plural"]; --plural
|
|
|
|
|
else
|
|
|
|
|
TextFormat = L["Delete Entry Singular"]; --singular
|
|
|
|
|
end
|
|
|
|
|
ListFrame.Header.Tab2Label:SetText( string.format(TextFormat, numToBeDeleted) );
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function EditFrame_EditBox_Confirm()
|
|
|
|
|
local EntryButton = MyFavoriteEditFrame.parent;
|
|
|
|
|
local newName = MyFavoriteEditFrame.EditBox:GetText();
|
|
|
|
|
MyFavoriteEditFrame.EditBox.anyChange = nil;
|
|
|
|
|
MyFavoriteEditFrame.EditBox:SetText("");
|
|
|
|
|
MyFavoriteEditFrame.EditBox:Hide();
|
|
|
|
|
EntryButton:SetText(newName);
|
|
|
|
|
|
|
|
|
|
if FavUtil:Rename(EntryButton.visualID, newName, EntryButton.index) then
|
|
|
|
|
DisplayFavorites(true);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
NarciTooltip:HideTooltip();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function EditFrame_EditBox_Cancel(self)
|
|
|
|
|
self.anyChange = nil;
|
|
|
|
|
self:SetText("");
|
|
|
|
|
self:Hide();
|
|
|
|
|
NarciTooltip:HideTooltip();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function EditFrame_EditBox_OnTextChanged(self, isUserInput)
|
|
|
|
|
if isUserInput then
|
|
|
|
|
self.anyChange = true;
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function EditFrame_EditBox_OnEditFocusLost(self)
|
|
|
|
|
self:Hide();
|
|
|
|
|
Narci.UserIsInputing = false;
|
|
|
|
|
self:HighlightText(0,0);
|
|
|
|
|
if self.anyChange then
|
|
|
|
|
self.anyChange = nil;
|
|
|
|
|
EditFrame_EditBox_Confirm();
|
|
|
|
|
end
|
|
|
|
|
MyFavoriteEditFrame.EditBoxBackground:Hide();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function EditFrame_DeleteButton_OnClick(self)
|
|
|
|
|
local FavoredEntry = self:GetParent().parent;
|
|
|
|
|
if not FavoredEntry then return; end;
|
|
|
|
|
|
|
|
|
|
if FavoredEntry.visualID then
|
|
|
|
|
local markedForRemoval = FavUtil:ToggleRemoval(FavoredEntry.visualID);
|
|
|
|
|
if markedForRemoval then
|
|
|
|
|
FavoredEntry:Disable();
|
|
|
|
|
else
|
|
|
|
|
FavoredEntry:Enable();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
UpdateDeleteInfo();
|
|
|
|
|
|
|
|
|
|
local EditBox = self:GetParent().EditBox;
|
|
|
|
|
EditFrame_EditBox_Cancel(EditBox);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function EditFrame_RenameButton_OnClick(self)
|
|
|
|
|
local EditBox = MyFavoriteEditFrame.EditBox;
|
|
|
|
|
local FavoredEntry = MyFavoriteEditFrame.parent;
|
|
|
|
|
self.IsOn = not self.IsOn;
|
|
|
|
|
if self.IsOn then
|
|
|
|
|
MyFavoriteEditFrame.EditBoxBackground:Show();
|
|
|
|
|
|
|
|
|
|
local oldText = FavoredEntry:GetText();
|
|
|
|
|
EditBox:Show();
|
|
|
|
|
EditBox:SetText(oldText or "");
|
|
|
|
|
EditBox:SetFocus();
|
|
|
|
|
EditBox:HighlightText();
|
|
|
|
|
|
|
|
|
|
if FavUtil:IsMarkedForRemoval(FavoredEntry.visualID) then
|
|
|
|
|
--Rename a entry that is about to be deleted will cancel deletion
|
|
|
|
|
FavUtil:ToggleRemoval(FavoredEntry.visualID);
|
|
|
|
|
FavoredEntry:Enable();
|
|
|
|
|
UpdateDeleteInfo();
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
EditFrame_EditBox_Cancel(EditBox);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function QuickFavoriteButton_OnClick(self)
|
|
|
|
|
if not self.visualID then return end;
|
|
|
|
|
|
|
|
|
|
if FavUtil:IsFavorite(self.visualID) then
|
|
|
|
|
FavUtil:Remove(self.visualID);
|
|
|
|
|
self.isFav = false;
|
|
|
|
|
else
|
|
|
|
|
FavUtil:Add(self.visualID);
|
|
|
|
|
self.isFav = true;
|
|
|
|
|
end
|
|
|
|
|
FavUtil:UpdateMyCategoryButton();
|
|
|
|
|
|
|
|
|
|
self:PlayVisual();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function HomeButton_OnClick(self)
|
|
|
|
|
if CURRENT_TAB_INDEX == 3 then
|
|
|
|
|
--If you just go back from My Favorites, start removing selected favorites
|
|
|
|
|
local numDeleted = FavUtil:ConfirmPendingRemoval();
|
|
|
|
|
if numDeleted > 0 then
|
|
|
|
|
FavUtil:UpdateMyCategoryButton(-numDeleted);
|
|
|
|
|
EditBoxFavoriteButton:Update();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
GoToTab(1);
|
|
|
|
|
FadeFrame(self, 0.2, 0);
|
|
|
|
|
PreviewFrame:ResetCover();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function SetAutoPlayButtonScript(self)
|
|
|
|
|
local function SetFormat(self)
|
|
|
|
|
if self.IsOn then
|
|
|
|
|
self.Label:SetPoint("CENTER", self, "CENTER", 6, 0);
|
|
|
|
|
self:SetText(self.EnabledText);
|
|
|
|
|
else
|
|
|
|
|
self.Label:SetPoint("CENTER", self, "CENTER", 0, 0);
|
|
|
|
|
self:SetText(self.DisabledText);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local function OnClick(self)
|
|
|
|
|
self.IsOn = not self.IsOn;
|
|
|
|
|
NarcissusDB.AutoPlayAnimation = self.IsOn;
|
|
|
|
|
self.Tick:SetShown(self.IsOn);
|
|
|
|
|
self.Label:ClearAllPoints();
|
|
|
|
|
SetFormat(self);
|
|
|
|
|
end
|
|
|
|
|
local state = NarcissusDB.AutoPlayAnimation;
|
|
|
|
|
self.IsOn = state;
|
|
|
|
|
self.Tick:SetShown(state);
|
|
|
|
|
self.Label:ClearAllPoints();
|
|
|
|
|
SetFormat(self);
|
|
|
|
|
self:SetScript("OnClick", OnClick);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NarciSpellVisualBrowserMixin = {};
|
|
|
|
|
do
|
|
|
|
|
function NarciSpellVisualBrowserMixin:Init()
|
|
|
|
|
self.Init = nil;
|
|
|
|
|
|
|
|
|
|
SetAutoPlayButtonScript(SuggestionFrame.AutoPlay);
|
|
|
|
|
FavUtil:Load();
|
|
|
|
|
FavUtil:UpdateMyCategoryButton();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualBrowserMixin:OnShow()
|
|
|
|
|
if self.Init then
|
|
|
|
|
self:Init();
|
|
|
|
|
end
|
|
|
|
|
AnimationContariner:Show();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualBrowserMixin:OnHide()
|
|
|
|
|
AnimationContariner:Hide();
|
|
|
|
|
clickCounter.leftButton = 0;
|
|
|
|
|
clickCounter.tooltipShown = nil;
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualBrowserMixin:OnLoad()
|
|
|
|
|
BrowserFrame = self;
|
|
|
|
|
self:SetPoint("BOTTOMRIGHT", Narci_AnimationIDFrame, "BOTTOMLEFT", BROWSER_ANCHOR_OFFSET_COLLAPSED_X, BROWSER_ANCHOR_OFFSET_Y);
|
|
|
|
|
|
|
|
|
|
local ExpandableFrames = self.ExpandableFrames;
|
|
|
|
|
ListFrame = self.ExpandableFrames.ListFrame.Container;
|
|
|
|
|
SuggestionFrame = self.ExpandableFrames.SuggestionFrame;
|
|
|
|
|
HistoryFrame = self.ExpandableFrames.HistoryFrame;
|
|
|
|
|
Tab1 = ListFrame.Category;
|
|
|
|
|
EntryTab = ListFrame.EntryTab;
|
|
|
|
|
VisualIDEditBox = ExpandableFrames.EditBox;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ExpandableFrames.EditBox:SetScript("OnMouseWheel", EditBox_OnMouseWheel);
|
|
|
|
|
ExpandableFrames.EditBox:SetScript("OnEnterPressed", EditBox_OnEnterPressed);
|
|
|
|
|
ExpandableFrames.EditBox:SetScript("OnTextChanged", EditBox_OnTextChanged);
|
|
|
|
|
ExpandableFrames.PlusButton:SetScript("OnClick", PlusButton_OnClick);
|
|
|
|
|
ExpandableFrames.ApplyButton:SetScript("OnClick", ApplyButton_OnClick);
|
|
|
|
|
ExpandableFrames.ResetButton:SetScript("OnClick", ResetButton_OnClick);
|
|
|
|
|
|
|
|
|
|
EditBoxFavoriteButton = ExpandableFrames.FavoriteButton;
|
|
|
|
|
NarciAPI.Mixin(EditBoxFavoriteButton, EditBoxFavoriteButtonMixin);
|
|
|
|
|
EditBoxFavoriteButton:OnLoad();
|
|
|
|
|
|
|
|
|
|
EditorPopup = ExpandableFrames.PopUpFrame;
|
|
|
|
|
NarciAPI.Mixin(EditorPopup, EditorPopupMixin);
|
|
|
|
|
EditorPopup:OnLoad();
|
|
|
|
|
|
|
|
|
|
HomeButton = ListFrame.Header.HomeButton;
|
|
|
|
|
HomeButton:SetScript("OnClick", HomeButton_OnClick);
|
|
|
|
|
HomeButton.tooltipDescription = L["Return"];
|
|
|
|
|
|
|
|
|
|
HistoryFrame.DeleteButton:SetScript("OnClick", DeleteButton_OnClick);
|
|
|
|
|
HistoryFrame.DeleteButton:SetScript("OnEnter", DeleteButton_OnEnter);
|
|
|
|
|
HistoryFrame.DeleteButton:SetScript("OnLeave", ButtonWithTooltip_OnLeave);
|
|
|
|
|
HistoryFrame.DeleteButton.Fill.Timer:SetScript("OnFinished", DeleteButton_OnLongClick);
|
|
|
|
|
HistoryButtonFrame = HistoryFrame.HistoryButtonFrame;
|
|
|
|
|
|
|
|
|
|
SuggestionFrame.IDButton:SetScript("OnClick", SuggestedID_OnClick);
|
|
|
|
|
|
|
|
|
|
UpdateCategoryButtons();
|
|
|
|
|
CreateHistoryButtonFrame(HistoryButtonFrame);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QuickFavoriteButton = ListFrame.EntryTab.QuickFavoriteButton;
|
|
|
|
|
QuickFavoriteButton:SetScript("OnClick", QuickFavoriteButton_OnClick);
|
|
|
|
|
|
|
|
|
|
MyFavoriteEditFrame = ListFrame.EditFrame;
|
|
|
|
|
MyFavoriteEditFrame.DeleteButton:SetScript("OnClick", EditFrame_DeleteButton_OnClick);
|
|
|
|
|
MyFavoriteEditFrame.RenameButton:SetScript("OnClick", EditFrame_RenameButton_OnClick);
|
|
|
|
|
MyFavoriteEditFrame.EditBox:SetScript("OnEnterPressed", EditFrame_EditBox_Confirm);
|
|
|
|
|
MyFavoriteEditFrame.EditBox:SetScript("OnEscapePressed", EditFrame_EditBox_Cancel);
|
|
|
|
|
MyFavoriteEditFrame.EditBox:SetScript("OnEditFocusLost", EditFrame_EditBox_OnEditFocusLost);
|
|
|
|
|
MyFavoriteEditFrame.EditBox:SetScript("OnTextChanged", EditFrame_EditBox_OnTextChanged);
|
|
|
|
|
|
|
|
|
|
function MyFavoriteEditFrame.EditBox:HasStickyFocus()
|
|
|
|
|
return DoesAncestryIncludeAny(self, GetMouseFoci())
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local IDLabel = self.VisualIDFrame.Label;
|
|
|
|
|
IDLabel:SetText("ID");
|
|
|
|
|
IDLabel:SetPoint("LEFT", self.VisualIDFrame, "LEFT", 30, 0);
|
|
|
|
|
|
|
|
|
|
local b = CreateFrame("Frame", nil, self.ExpandableFrames, "NarciGenericInfoButtonTemplate");
|
|
|
|
|
self.InfoButton = b;
|
|
|
|
|
b:ClearAllPoints();
|
|
|
|
|
b:SetPoint("LEFT", self.VisualIDFrame, "LEFT", 6, 0);
|
|
|
|
|
b:SetSize(18, 18);
|
|
|
|
|
b:SetHitRectInsets(0, 0, 0, 0);
|
|
|
|
|
b:SetNormalColor(0.65, 0.65, 0.65);
|
|
|
|
|
b:SetHighlightColor(0.88, 0.88, 0.88);
|
|
|
|
|
b:SetVisualType(2);
|
|
|
|
|
b:SetCursorColor(2);
|
|
|
|
|
b:SetUsePrivateTooltip(true, L["FindVisual Tooltip"]);
|
|
|
|
|
b:SetFrameLevel(self.VisualIDFrame:GetFrameLevel() + 10);
|
|
|
|
|
b:SetScript("OnMouseDown", function()
|
|
|
|
|
NarciAPI.ToggleSpellVisualTutorial();
|
|
|
|
|
end);
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-------------------------------------------------
|
|
|
|
|
NarciSpellVisualBrowserPreviewFrameMixin = {};
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualBrowserPreviewFrameMixin:OnLoad()
|
|
|
|
|
PreviewFrame = self;
|
|
|
|
|
self.packName = "Standard";
|
|
|
|
|
self.isStandardPack = true;
|
|
|
|
|
self.tooltipDescription = L["Change Pack"];
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualBrowserPreviewFrameMixin:OnClick()
|
|
|
|
|
self.isStandardPack = not self.isStandardPack;
|
|
|
|
|
local packID;
|
|
|
|
|
if self.isStandardPack then
|
|
|
|
|
packID = 0;
|
|
|
|
|
else
|
|
|
|
|
packID = 1;
|
|
|
|
|
end
|
|
|
|
|
self.packName = NarciSpellVisualUtil:SelectPack(packID);
|
|
|
|
|
--]]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualBrowserPreviewFrameMixin:ResetCover()
|
|
|
|
|
PreviewFrame.BottomImage:SetTexture("Interface\\AddOns\\Narcissus\\Art\\SpellVisualPreviews\\Pack-".. self.packName);
|
|
|
|
|
After(0, function()
|
|
|
|
|
PreviewFrame.TopImage.FadeOut:Play();
|
|
|
|
|
end);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualBrowserPreviewFrameMixin:OnHide()
|
|
|
|
|
self:StopAnimating();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualBrowserPreviewFrameMixin:OnEnter()
|
|
|
|
|
NarciTooltip:ShowButtonTooltip(self);
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualBrowserPreviewFrameMixin:OnLeave()
|
|
|
|
|
NarciTooltip:HideTooltip();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NarciSpellVisualSearchBoxMixin = CreateFromMixins(NarciSearchBoxSharedMixin);
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualSearchBoxMixin:OnLoad()
|
|
|
|
|
SearchBox = self;
|
|
|
|
|
NarciSearchBoxSharedMixin.OnLoad(self);
|
|
|
|
|
self.DefaultText:SetText(SEARCH);
|
|
|
|
|
self.DefaultText:SetPoint("LEFT", self, "LEFT", 16, 0);
|
|
|
|
|
self.NoMatchText:ClearAllPoints();
|
|
|
|
|
self.NoMatchText:SetPoint("TOP", self:GetParent(), "TOP", 0, -16 - 4);
|
|
|
|
|
self.noAutoFocus = true;
|
|
|
|
|
|
|
|
|
|
self.onSearchFunc = function(word)
|
|
|
|
|
FavUtil.sortedList = nil;
|
|
|
|
|
if CURRENT_TAB_INDEX == 3 then
|
|
|
|
|
DisplayFavorites();
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualSearchBoxMixin:OnTextChanged(isUserInput)
|
|
|
|
|
local str = self:GetText();
|
|
|
|
|
if str and str ~= "" then
|
|
|
|
|
if isUserInput then
|
|
|
|
|
self.DefaultText:Hide();
|
|
|
|
|
end
|
|
|
|
|
self.EraseButton:Show();
|
|
|
|
|
else
|
|
|
|
|
self.DefaultText:Show();
|
|
|
|
|
self.EraseButton:Hide();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
self:Search(true);
|
|
|
|
|
self.NoMatchText:Hide();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function NarciSpellVisualSearchBoxMixin:OnFocusGained()
|
|
|
|
|
self:OnEditFocusGained();
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
--[[
|
|
|
|
|
function GetReAnchor()
|
|
|
|
|
ModelSettings:StartMoving();
|
|
|
|
|
ModelSettings:StopMovingOrSizing();
|
|
|
|
|
local point, _, relativePoint, offsetX, offsetY = ModelSettings:GetPoint();
|
|
|
|
|
print(point, relativePoint, offsetX, offsetY );
|
|
|
|
|
|
|
|
|
|
local oldCenterX = ModelSettings:GetCenter();
|
|
|
|
|
local width = ModelSettings:GetWidth()/2;
|
|
|
|
|
local screenWidth = WorldFrame:GetWidth();
|
|
|
|
|
local scale = ModelSettings:GetEffectiveScale();
|
|
|
|
|
print("1 ", oldCenterX + width - screenWidth)
|
|
|
|
|
print("2 ",oldCenterX + width - screenWidth/scale)
|
|
|
|
|
print("3 ",(oldCenterX + width)*scale - screenWidth)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function SetSpellVisualBrowserOffset(offsetX)
|
|
|
|
|
BrowserFrame:SetPoint("BOTTOMRIGHT", Narci_AnimationIDFrame, "BOTTOMLEFT", offsetX, BROWSER_ANCHOR_OFFSET_Y);
|
|
|
|
|
end
|
|
|
|
|
--]]
|