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.
842 lines
25 KiB
842 lines
25 KiB
local _, addon = ...
|
|
local SetModelLight = addon.TransitionAPI.SetModelLight;
|
|
|
|
local PAGE_FORMAT = PAGED_LIST_PAGING_FORMAT or "Page %s / %s"; --PRODUCT_CHOICE_PAGE_NUMBER
|
|
local MAX_PETS = (NUM_PET_STABLE_PAGES and NUM_PET_STABLE_SLOTS and NUM_PET_STABLE_PAGES * NUM_PET_STABLE_SLOTS) or 200;
|
|
local MAX_ROW = 2;
|
|
local MAX_COL = 8;
|
|
local SLOT_PER_PAGE = MAX_ROW * MAX_COL;
|
|
|
|
local format = string.format;
|
|
local FadeFrame = NarciFadeUI.Fade;
|
|
|
|
local GetStablePetInfo = GetStablePetInfo;
|
|
local SetPetStablePaperdoll = SetPetStablePaperdoll;
|
|
local NEW_GetStablePetInfo = C_StableInfo and C_StableInfo.GetStablePetInfo;
|
|
|
|
local MainFrame, PetModel, ModelShadow, Tooltip, SelectionOverlay, PageText, PageControl, DropDownButtons, PetSlots;
|
|
local TARGET_MODEL_INDEX;
|
|
local ACTOR_CREATED = false;
|
|
|
|
-----------------------------------------------------
|
|
local function SetPetModel(model, index)
|
|
if SetPetStablePaperdoll then
|
|
SetPetStablePaperdoll(model, index);
|
|
elseif NEW_GetStablePetInfo then
|
|
local petInfo = C_StableInfo.GetStablePetInfo(index);
|
|
if petInfo and petInfo.displayID then
|
|
model:SetDisplayInfo(petInfo.displayID);
|
|
end
|
|
end
|
|
end
|
|
|
|
--UI Animations
|
|
local outQuart = addon.EasingFunctions.outQuart;
|
|
|
|
local animExpand = NarciAPI_CreateAnimationFrame(0.25);
|
|
animExpand:SetScript("OnUpdate", function(self, elapsed)
|
|
self.total = self.total + elapsed;
|
|
local height = outQuart(self.total, self.fromHeight, self.toHeight, self.duration);
|
|
if self.total >= self.duration then
|
|
height = self.toHeight;
|
|
self:Hide();
|
|
end
|
|
self.object:SetHeight(height);
|
|
end);
|
|
|
|
|
|
--Opening/closing animation
|
|
local cos = math.cos;
|
|
local pi = math.pi;
|
|
|
|
local function inOutSine(t, b, e, d)
|
|
return (b - e) / 2 * (cos(pi * t / d) - 1) + b
|
|
end
|
|
|
|
local animSizing = NarciAPI_CreateAnimationFrame(0.25);
|
|
animSizing.relativeTo = Narci_ActorPanelPopUp.PetStableToggle;
|
|
animSizing:SetScript("OnShow", function(self)
|
|
self.startWidth, self.startHeight = MainFrame:GetSize();
|
|
end);
|
|
|
|
local function Sizing_OnUpdate(self, elapsed)
|
|
self.total = self.total + elapsed;
|
|
local alpha = self.fromAlpha + self.increment * self.total / self.duration;
|
|
local height = inOutSine(self.total, self.startHeight, self.endHeight, self.duration);
|
|
if self.total >= self.duration then
|
|
alpha = 1;
|
|
height = self.endHeight;
|
|
self:Hide();
|
|
end
|
|
|
|
MainFrame:SetHeight(height);
|
|
if alpha > 1 then
|
|
alpha = 1;
|
|
elseif alpha < 0 then
|
|
alpha = 0;
|
|
end
|
|
--[[
|
|
if ModelShadow then
|
|
ModelShadow:SetAlpha(alpha);
|
|
PetModel:SetAlpha(alpha);
|
|
end
|
|
MainFrame.PetSlotFrame:SetAlpha(alpha);
|
|
MainFrame.FilterButton:SetAlpha(alpha);
|
|
PageControl:SetAlpha(alpha);
|
|
--]]
|
|
end
|
|
|
|
animSizing:SetScript("OnUpdate", Sizing_OnUpdate);
|
|
|
|
local function PlayToggleAnimation(state)
|
|
if animSizing:IsShown() then return end
|
|
|
|
if state then
|
|
animSizing.endHeight = 224;
|
|
animSizing.fromAlpha = 0;
|
|
animSizing.increment = 1;
|
|
FadeFrame(MainFrame, 0.25, 1);
|
|
else
|
|
animSizing.endHeight = 64;
|
|
animSizing.fromAlpha = 1;
|
|
animSizing.increment = -1;
|
|
FadeFrame(MainFrame, 0.2, 0);
|
|
end
|
|
|
|
animSizing:Show();
|
|
end
|
|
|
|
--Model Animation
|
|
local function SycAnimation(m)
|
|
PetModel:SetAnimation(0, 0);
|
|
ModelShadow:SetAnimation(0, 0);
|
|
end
|
|
-----------------------------------------------------
|
|
|
|
local AddButtonScripts = {};
|
|
|
|
function AddButtonScripts.OnClick(f)
|
|
MainFrame:ConfirmPet();
|
|
end
|
|
|
|
function AddButtonScripts.OnEnter(f)
|
|
f.Icon:SetVertexColor(1, 1, 1);
|
|
f.Label:SetTextColor(1, 1, 1);
|
|
end
|
|
|
|
function AddButtonScripts.OnLeave(f)
|
|
f.Icon:SetVertexColor(0.6, 0.6 ,0.6);
|
|
f.Label:SetTextColor(0.8, 0.8, 0.8);
|
|
end
|
|
|
|
function AddButtonScripts.OnMouseDown(f)
|
|
f.Icon:SetSize(28, 28);
|
|
f.Background:SetSize(28, 28);
|
|
end
|
|
|
|
function AddButtonScripts.OnMouseUp(f)
|
|
f.Icon:SetSize(32, 32);
|
|
f.Background:SetSize(32, 32);
|
|
end
|
|
|
|
|
|
local function SortFunc(a, b)
|
|
--active pet first (index <=5 ) else: icon then index
|
|
if a[1] > 5 and b[1] > 5 then
|
|
if a[2] == b[2] then
|
|
return a[1] < b[1]
|
|
else
|
|
return a[2] < b[2]
|
|
end
|
|
else
|
|
return a[1] < b[1]
|
|
end
|
|
end
|
|
|
|
local DataProvider = {};
|
|
|
|
local function DataRetriever_OnUpdate(self, elapsed)
|
|
self.index = self.index + 1;
|
|
local petIcon, petName, petLevel, petType, petTalents = GetStablePetInfo(self.index);
|
|
if petIcon then
|
|
DataProvider.numPets = DataProvider.numPets + 1;
|
|
local petTypeIndex = DataProvider:GetPetTypeIndex(petType);
|
|
DataProvider.data[DataProvider.numPets] = {self.index, petIcon, petName, petTypeIndex};
|
|
end
|
|
if self.index >= MAX_PETS then
|
|
self:Hide();
|
|
DataProvider:OnDataReceived();
|
|
end
|
|
|
|
self.t = self.t + elapsed;
|
|
if self.t > 0.08 then
|
|
self.t = 0;
|
|
self.ProgressText:SetText(format(self.progressFormat, self.index));
|
|
end
|
|
end
|
|
|
|
function DataProvider:ClearData()
|
|
if self.data then
|
|
wipe(self.data);
|
|
else
|
|
self.data = {};
|
|
end
|
|
if self.types then
|
|
wipe(self.types);
|
|
wipe(self.typeNames);
|
|
wipe(self.typeCounts);
|
|
else
|
|
self.types = {};
|
|
self.typeNames = {};
|
|
self.typeCounts = {};
|
|
end
|
|
self.numTypes = 0;
|
|
self.numPets = 0;
|
|
end
|
|
|
|
function DataProvider:GetPetTypeIndex(petName)
|
|
if not self.types[petName] then
|
|
self.numTypes = self.numTypes + 1;
|
|
self.types[petName] = self.numTypes;
|
|
self.typeNames[self.numTypes] = petName;
|
|
self.typeCounts[self.numTypes] = 1;
|
|
return self.numTypes;
|
|
else
|
|
self.typeCounts[self.numTypes] = self.typeCounts[self.numTypes] + 1;
|
|
return self.types[petName]
|
|
end
|
|
end
|
|
|
|
function DataProvider:GetPetTypeName(petTypeIndex)
|
|
return self.typeNames[petTypeIndex]
|
|
end
|
|
|
|
function DataProvider:GetTypeCount(petTypeIndex)
|
|
return self.typeCounts[petTypeIndex]
|
|
end
|
|
|
|
function DataProvider:GetNumTypes()
|
|
return self.numTypes or 0;
|
|
end
|
|
|
|
function DataProvider:GetNumPets()
|
|
return self.numPets or 0;
|
|
end
|
|
|
|
function DataProvider:GetPetName(petIndex)
|
|
return (self.filteredData[petIndex] and self.filteredData[petIndex][3]) or "Pet"
|
|
end
|
|
|
|
function DataProvider:UpdatePetData()
|
|
self:ClearData();
|
|
if not self.retriever then
|
|
self.retriever = CreateFrame("Frame");
|
|
self.retriever:Hide();
|
|
self.retriever:SetScript("OnUpdate", DataRetriever_OnUpdate);
|
|
self.retriever.progressFormat = "%s/" .. MAX_PETS;
|
|
self.retriever.ProgressText = MainFrame.LoadingIndicator.Progress;
|
|
end
|
|
self.isProcessing = true;
|
|
self.retriever:Hide();
|
|
self.retriever.index = 0;
|
|
self.retriever.t = 0;
|
|
self.retriever:Show();
|
|
SelectionOverlay:Hide();
|
|
MainFrame.LoadingIndicator:SetAlpha(1);
|
|
MainFrame.LoadingIndicator:Show();
|
|
--Instant Process
|
|
--[[
|
|
local petIcon, petName, petLevel, petType, petTalents, petTypeIndex;
|
|
local numPets = 0;
|
|
for i = 1, MAX_PETS do
|
|
petIcon, petName, petLevel, petType, petTalents = GetStablePetInfo(i);
|
|
if petIcon then
|
|
numPets = numPets + 1;
|
|
petTypeIndex = self:GetPetTypeIndex(petName);
|
|
self.data[numPets] = {i, petIcon, petName, petTypeIndex};
|
|
end
|
|
end
|
|
|
|
if numPets > 0 then
|
|
table.sort(self.data, SortFunc);
|
|
local numPages = math.ceil(numPets / SLOT_PER_PAGE);
|
|
MainFrame.numPages = numPages;
|
|
else
|
|
MainFrame.numPages = 0;
|
|
end
|
|
self.filteredData = self.data;
|
|
--]]
|
|
end
|
|
|
|
function DataProvider:OnDataReceived()
|
|
if self.numPets > 0 then
|
|
table.sort(self.data, SortFunc);
|
|
local numPages = math.ceil(self.numPets / SLOT_PER_PAGE);
|
|
MainFrame.numPages = numPages;
|
|
else
|
|
MainFrame.numPages = 0;
|
|
end
|
|
self.filteredData = self.data;
|
|
self.isProcessing = nil;
|
|
FadeFrame(MainFrame.LoadingIndicator, 0.12, 0);
|
|
MainFrame:UpdatePetSlots();
|
|
end
|
|
|
|
function DataProvider:GetPetInfoByIndex(index)
|
|
return self.filteredData[index];
|
|
end
|
|
|
|
function DataProvider:SetFilter(petTypeIndex)
|
|
local numData = 0;
|
|
if petTypeIndex then
|
|
self.filteredData = {};
|
|
for i = 1, #self.data do
|
|
if self.data[i][4] == petTypeIndex then
|
|
numData = numData + 1;
|
|
self.filteredData[numData] = self.data[i];
|
|
end
|
|
end
|
|
else
|
|
self.filteredData = self.data;
|
|
numData = #self.data;
|
|
end
|
|
return numData
|
|
end
|
|
|
|
local function SelectFilterDropDownButton(button)
|
|
for k, b in pairs(DropDownButtons) do
|
|
if b == button then
|
|
b.TypeName:SetTextColor(0.92, 0.92, 0.92);
|
|
else
|
|
b.TypeName:SetTextColor(0.65, 0.65, 0.65);
|
|
end
|
|
end
|
|
end
|
|
|
|
local function SetUpFilterOptions()
|
|
local f = MainFrame.FilterDropDown;
|
|
local numTypes = DataProvider:GetNumTypes();
|
|
if MainFrame.rebuiltDropDown then
|
|
MainFrame.rebuiltDropDown = nil;
|
|
local typeInfo = {};
|
|
for i = 1, numTypes do
|
|
typeInfo[i] = {i, DataProvider:GetPetTypeName(i)};
|
|
end
|
|
table.sort(typeInfo, function(a, b) return a[2] > b[2] end);
|
|
if numTypes > 0 then
|
|
if not DropDownButtons then
|
|
DropDownButtons = {};
|
|
end
|
|
local textWidth = 0;
|
|
local maxWidth = 0;
|
|
local buttons = DropDownButtons;
|
|
local button;
|
|
for i = 1, numTypes do
|
|
button = buttons[i];
|
|
if not button then
|
|
button = CreateFrame("Button", nil, f, "NarciPetTypeDropDownButtonTemplate");
|
|
button:SetPoint("BOTTOMLEFT", f, "BOTTOMLEFT", 0, 16 * (i - 1));
|
|
buttons[i] = button;
|
|
end
|
|
if typeInfo[i] then
|
|
textWidth = button:SetUp(typeInfo[i][1], typeInfo[i][2]);
|
|
if textWidth > maxWidth then
|
|
maxWidth = textWidth;
|
|
end
|
|
end
|
|
button:Show();
|
|
end
|
|
for i = numTypes + 1, #buttons do
|
|
buttons[i]:Hide();
|
|
end
|
|
|
|
--Adjust DropDown width
|
|
if maxWidth < 96 then
|
|
maxWidth = 96;
|
|
end
|
|
for i = 1, numTypes do
|
|
buttons[i]:SetButtonWidth(maxWidth);
|
|
end
|
|
f:SetSize(maxWidth, numTypes * 16);
|
|
f.height = numTypes * 16;
|
|
end
|
|
end
|
|
|
|
if numTypes > 0 then
|
|
MainFrame:ToggleDropDown(not f:IsShown());
|
|
end
|
|
end
|
|
|
|
local FilterButtonScripts = {};
|
|
|
|
function FilterButtonScripts.OnEnter(f)
|
|
f.Label:SetTextColor(1, 1, 1);
|
|
f.Highlight:Show();
|
|
end
|
|
|
|
function FilterButtonScripts.OnLeave(f)
|
|
if f.hasFilter then
|
|
f.Label:SetTextColor(0.25, 0.78, 0.92);
|
|
else
|
|
f.Label:SetTextColor(0.8, 0.8, 0.8);
|
|
end
|
|
f.Highlight:Hide();
|
|
end
|
|
|
|
function FilterButtonScripts:OnClick(f)
|
|
SetUpFilterOptions();
|
|
end
|
|
|
|
function FilterButtonScripts:OnDoubleClick(f)
|
|
return
|
|
end
|
|
|
|
|
|
local PageButtonScripts = {};
|
|
|
|
function PageButtonScripts.OnEnter(f)
|
|
f.Highlight:Show();
|
|
end
|
|
|
|
function PageButtonScripts.OnLeave(f)
|
|
f.Highlight:Hide();
|
|
end
|
|
|
|
function PageButtonScripts.OnClick(f)
|
|
MainFrame:OnMouseWheel(f.increment);
|
|
end
|
|
|
|
function PageButtonScripts.OnMouseDown(f)
|
|
f.Icon:SetSize(14, 14);
|
|
end
|
|
|
|
function PageButtonScripts.OnMouseUp(f)
|
|
f.Icon:SetSize(16, 16);
|
|
end
|
|
|
|
function PageButtonScripts.OnEnable(f)
|
|
f.Icon:SetVertexColor(1, 1, 1);
|
|
f.Background:SetTexCoord(0.875, 1, 0, 0.125);
|
|
end
|
|
|
|
function PageButtonScripts.OnDisable(f)
|
|
f.Icon:SetVertexColor(0.5, 0.5, 0.5);
|
|
f.Background:SetTexCoord(0.875, 1, 0.125, 0.25);
|
|
end
|
|
|
|
|
|
local RemoveFilterScripts = {};
|
|
RemoveFilterScripts.OnMouseDown = PageButtonScripts.OnMouseDown;
|
|
RemoveFilterScripts.OnMouseUp = PageButtonScripts.OnMouseUp;
|
|
RemoveFilterScripts.OnEnter = PageButtonScripts.OnEnter;
|
|
RemoveFilterScripts.OnLeave = PageButtonScripts.OnLeave;
|
|
|
|
function RemoveFilterScripts.OnClick(f)
|
|
local numData = DataProvider:SetFilter(nil);
|
|
MainFrame:ResetPage(numData);
|
|
MainFrame.FilterButton.Label:SetText(FILTER);
|
|
MainFrame.FilterButton.hasFilter = nil;
|
|
f:Hide();
|
|
SelectFilterDropDownButton(nil);
|
|
end
|
|
|
|
local FilterDropDownScripts = {};
|
|
|
|
function FilterDropDownScripts.OnEvent(f)
|
|
if not (f:IsMouseOver() or (MainFrame.FilterButton:IsMouseOver() and not MainFrame.FilterButton.RemoveFilter:IsMouseOver() ) ) then
|
|
MainFrame:ToggleDropDown(false);
|
|
end
|
|
end
|
|
|
|
function FilterDropDownScripts.OnShow(f)
|
|
f:RegisterEvent("GLOBAL_MOUSE_DOWN");
|
|
end
|
|
|
|
function FilterDropDownScripts.OnHide(f)
|
|
f:UnregisterEvent("GLOBAL_MOUSE_DOWN");
|
|
end
|
|
|
|
|
|
NarciPetStableMixin = {};
|
|
|
|
function NarciPetStableMixin:Init()
|
|
local SIZE = 24;
|
|
local row, col = 1, 1;
|
|
local button;
|
|
local container = self;
|
|
PetSlots = {};
|
|
for i = 1, MAX_ROW * MAX_COL do
|
|
button = CreateFrame("Button", nil, self.PetSlotFrame, "NarciPetSlotButtonTemplate");
|
|
PetSlots[i] = button;
|
|
button:SetPoint("BOTTOMLEFT", self, "BOTTOMLEFT", 0 + SIZE * (col - 1), 0 + SIZE * (2 - row));
|
|
button.index = i;
|
|
col = col + 1;
|
|
if col > MAX_COL then
|
|
col = 1;
|
|
row = row + 1;
|
|
end
|
|
end
|
|
self.numSlots = #PetSlots;
|
|
|
|
--Preview Model
|
|
PetModel = CreateFrame("PlayerModel", nil, container);
|
|
ModelShadow = CreateFrame("PlayerModel", nil, container);
|
|
|
|
for k, model in pairs( {PetModel, ModelShadow} ) do
|
|
model:SetKeepModelOnHide(true);
|
|
model:SetScript("OnModelLoaded", SycAnimation);
|
|
model:UseModelCenterToTransform(true);
|
|
model:SetFacing(math.pi/6);
|
|
model:SetCamDistanceScale(1.3);
|
|
model:SetPoint("TOPLEFT", self, "TOPLEFT", 0, -16);
|
|
model:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", 0, 64);
|
|
end
|
|
|
|
SetModelLight(PetModel, true, false, - 0.44699833180028 , 0.72403680806459 , -0.52532198881773, 0.8, 172/255, 172/255, 172/255, 1, 0.8, 0.8, 0.8);
|
|
local a = 0.1;
|
|
ModelShadow:SetFogColor(a, a, a);
|
|
SetModelLight(ModelShadow, false, false);
|
|
ModelShadow:SetViewTranslation(6, 0);
|
|
|
|
local backdrop = PetModel:CreateTexture(nil, "BACKGROUND");
|
|
backdrop:SetPoint("TOPLEFT", PetModel, "TOPLEFT", 0, 0);
|
|
backdrop:SetPoint("BOTTOMRIGHT", PetModel, "BOTTOMRIGHT", 0, 0);
|
|
backdrop:SetTexture("Interface/AddOns/Narcissus/Art/Modules/PhotoMode/PetStable/ModelBackground");
|
|
|
|
--Add Model Button
|
|
local AddButton = self.AddButton;
|
|
AddButton.Icon:SetTexture("Interface/AddOns/Narcissus/Art/Modules/PhotoMode/PetStable/AddButton", nil, nil, "TRILINEAR");
|
|
AddButton.Icon:SetTexCoord(0.5, 1, 0, 1);
|
|
AddButton.Background:SetTexture("Interface/AddOns/Narcissus/Art/Modules/PhotoMode/PetStable/AddButton", nil, nil, "TRILINEAR");
|
|
AddButton.Background:SetTexCoord(0, 0.5, 0, 1);
|
|
local offset = 16;
|
|
AddButton:ClearAllPoints();
|
|
AddButton:SetPoint("CENTER", self, "TOP", offset - 192/2, -offset - 16);
|
|
for methodName, method in pairs(AddButtonScripts) do
|
|
AddButton:SetScript(methodName, method);
|
|
end
|
|
AddButtonScripts.OnLeave(AddButton);
|
|
|
|
--Filter Button;
|
|
local FilterButton = self.FilterButton;
|
|
for methodName, method in pairs(FilterButtonScripts) do
|
|
FilterButton:SetScript(methodName, method);
|
|
end
|
|
FilterButtonScripts.OnLeave(FilterButton);
|
|
|
|
local RemoveFilter = FilterButton.RemoveFilter;
|
|
for methodName, method in pairs(RemoveFilterScripts) do
|
|
RemoveFilter:SetScript(methodName, method);
|
|
end
|
|
|
|
--Page Control
|
|
local LeftButton = PageControl.Left;
|
|
local RightButton = PageControl.Right;
|
|
LeftButton.increment = 1;
|
|
RightButton.increment = -1;
|
|
for methodName, method in pairs(PageButtonScripts) do
|
|
LeftButton:SetScript(methodName, method);
|
|
RightButton:SetScript(methodName, method);
|
|
end
|
|
|
|
self.Init = nil;
|
|
end
|
|
|
|
function NarciPetStableMixin:UpdatePetSlots()
|
|
if self.Init then
|
|
self:Init();
|
|
end
|
|
self:UpdatePage();
|
|
self.rebuiltDropDown = true;
|
|
PetSlots[1]:Click();
|
|
end
|
|
|
|
function NarciPetStableMixin:OnEvent(event)
|
|
if event then
|
|
self.requireUpdate = true;
|
|
end
|
|
end
|
|
|
|
function NarciPetStableMixin:OnLoad()
|
|
local _, _, classID = UnitClass("player");
|
|
if classID and classID == 3 then
|
|
MainFrame = self;
|
|
Tooltip = self.Tooltip;
|
|
SelectionOverlay = self.SelectionOverlay;
|
|
PageControl = self.PageControl;
|
|
PageText = PageControl.PageText;
|
|
self:RegisterEvent("PET_STABLE_UPDATE");
|
|
self.requireUpdate = true;
|
|
self.page = 1;
|
|
|
|
for methodName, method in pairs(FilterDropDownScripts) do
|
|
self.FilterDropDown:SetScript(methodName, method);
|
|
end
|
|
animExpand.object = self.FilterDropDown;
|
|
self.LoadingIndicator.ProgressHeader:SetText(Narci.L["PetStable Loading"]);
|
|
--Update Phantom Popup Layout
|
|
local popup = Narci_ActorPanelPopUp;
|
|
popup.BackdropMiddle:SetHeight(104); --88
|
|
local npcToggle = popup.BrowserToggle;
|
|
npcToggle:ClearAllPoints();
|
|
npcToggle:SetPoint("CENTER", popup, "CENTER", 0, 8 + 24 * 2);
|
|
npcToggle:SetHitRectInsets(0, 0, 0, 0);
|
|
popup.PetStableToggle:Show();
|
|
self:SetHeight(64);
|
|
self:SetAlpha(0);
|
|
else
|
|
self:Hide();
|
|
end
|
|
end
|
|
|
|
function NarciPetStableMixin:SelectPet(petIndex)
|
|
SetPetModel(PetModel, petIndex);
|
|
SetPetModel(ModelShadow, petIndex);
|
|
PetModel:SetAnimation(0, 0);
|
|
ModelShadow:SetAnimation(0, 0);
|
|
self.selectedPetIndex = petIndex;
|
|
end
|
|
|
|
function NarciPetStableMixin:ConfirmPet()
|
|
local petIndex = self.selectedPetIndex;
|
|
if petIndex then
|
|
ACTOR_CREATED = true;
|
|
NarciPhotoModeAPI.OverrideActorInfo(TARGET_MODEL_INDEX, DataProvider:GetPetName(petIndex), nil, self.petIcon);
|
|
local newActor = self.targetModel;
|
|
C_Timer.After(0, function()
|
|
SetPetModel(newActor, self.selectedPetIndex);
|
|
end);
|
|
end
|
|
end
|
|
|
|
function NarciPetStableMixin:UpdatePage()
|
|
local page = self.page;
|
|
local hasSelection = false;
|
|
if self.numPages > 0 then
|
|
local realIndex;
|
|
local indexOffset = SLOT_PER_PAGE * (page - 1);
|
|
local hasPet;
|
|
for i = 1, self.numSlots do
|
|
realIndex = i + indexOffset;
|
|
PetSlots[i]:Disable();
|
|
hasPet = PetSlots[i]:SetData( DataProvider:GetPetInfoByIndex(realIndex) );
|
|
if not hasSelection and hasPet and realIndex == self.selectedPetIndex then
|
|
hasSelection = true;
|
|
SelectionOverlay:ClearAllPoints();
|
|
SelectionOverlay:SetPoint("CENTER", PetSlots[i], "CENTER", 0, 0);
|
|
end
|
|
end
|
|
PageText:SetText(format(PAGE_FORMAT, self.page, self.numPages));
|
|
PageControl.Right:SetEnabled(self.page < self.numPages);
|
|
PageControl.Left:SetEnabled(self.page > 1);
|
|
else
|
|
for i = 1, self.numSlots do
|
|
PetSlots[i]:DisableSlot();
|
|
end
|
|
PageText:SetText(format(PAGE_FORMAT, 0, 0));
|
|
PageControl.Left:Disable();
|
|
PageControl.Right:Disable();
|
|
end
|
|
|
|
if hasSelection then
|
|
SelectionOverlay:Show();
|
|
else
|
|
SelectionOverlay:Hide();
|
|
end
|
|
end
|
|
|
|
function NarciPetStableMixin:ResetPage(numData)
|
|
self.page = 1;
|
|
local numPages = math.ceil(numData / SLOT_PER_PAGE);
|
|
self.numPages = numPages;
|
|
self:UpdatePage();
|
|
end
|
|
|
|
function NarciPetStableMixin:OnMouseWheel(delta)
|
|
if self.numPages and self.numPages > 0 then
|
|
if delta < 0 then
|
|
self.page = self.page + 1;
|
|
else
|
|
self.page = self.page - 1;
|
|
end
|
|
|
|
if self.page > self.numPages then
|
|
self.page = self.numPages;
|
|
elseif self.page < 1 then
|
|
self.page = 1;
|
|
else
|
|
self:UpdatePage();
|
|
end
|
|
end
|
|
end
|
|
|
|
function NarciPetStableMixin:ToggleDropDown(state)
|
|
if state then
|
|
FadeFrame(self.FilterDropDown, 0.2, 1);
|
|
animExpand.fromHeight = 8;
|
|
animExpand.toHeight = self.FilterDropDown.height;
|
|
else
|
|
FadeFrame(self.FilterDropDown, 0.25, 0);
|
|
animExpand.fromHeight = self.FilterDropDown.height;
|
|
animExpand.toHeight = 4;
|
|
end
|
|
animExpand:Show();
|
|
end
|
|
|
|
function NarciPetStableMixin:Open(anchorButton)
|
|
local PopUp = Narci_ActorPanelPopUp;
|
|
FadeFrame(PopUp, 0.15, 0);
|
|
self:ClearAllPoints();
|
|
self:SetPoint("TOP", anchorButton, "TOP", 0, 16);
|
|
Narci_ModelSettings:SetPanelAlpha(0.5, true);
|
|
local index = PopUp.Index;
|
|
local isPet = true;
|
|
self.targetModel = NarciPhotoModeAPI.CreateEmptyModelForNPCBrowser(index, isPet); --Defined in PlayerModel.lua
|
|
self:SetFrameLevel(76);
|
|
TARGET_MODEL_INDEX = index;
|
|
PlayToggleAnimation(true);
|
|
end
|
|
|
|
function NarciPetStableMixin:Close()
|
|
PlayToggleAnimation(false);
|
|
Narci_ModelSettings:SetPanelAlpha(1, true);
|
|
if not ACTOR_CREATED then
|
|
NarciPhotoModeAPI.RemoveActor(TARGET_MODEL_INDEX)
|
|
end
|
|
ACTOR_CREATED = false;
|
|
end
|
|
|
|
function NarciPetStableMixin:OnShow()
|
|
if self.requireUpdate then
|
|
self.requireUpdate = nil;
|
|
DataProvider:UpdatePetData();
|
|
end
|
|
end
|
|
|
|
function NarciPetStableMixin:OnHide()
|
|
self:Hide();
|
|
end
|
|
|
|
function NarciPetStableMixin:IsFocused()
|
|
return self:IsShown() and self:IsMouseOver()
|
|
end
|
|
|
|
|
|
NarciPetSlotButtonMixin = {};
|
|
|
|
function NarciPetSlotButtonMixin:OnEnter()
|
|
self:SetHighlight(true);
|
|
local petType = DataProvider:GetPetTypeName(self.petTypeIndex);
|
|
if self.petName and petType then
|
|
Tooltip:ClearAllPoints();
|
|
if self.petName == petType then
|
|
Tooltip.Name:SetText(self.petName);
|
|
else
|
|
Tooltip.Name:SetText(self.petName.. " ("..petType..")");
|
|
end
|
|
Tooltip:SetPoint("BOTTOMLEFT", self, "TOPLEFT", 0, 0);
|
|
Tooltip:Show();
|
|
end
|
|
end
|
|
|
|
function NarciPetSlotButtonMixin:OnLeave()
|
|
self:SetHighlight(false);
|
|
Tooltip:Hide();
|
|
end
|
|
|
|
function NarciPetSlotButtonMixin:SetHighlight(state)
|
|
if state then
|
|
self.Icon:SetVertexColor(1, 1, 1);
|
|
self.Icon:SetDesaturation(0);
|
|
else
|
|
self.Icon:SetVertexColor(0.80, 0.80, 0.80);
|
|
self.Icon:SetDesaturation(0.2);
|
|
end
|
|
end
|
|
|
|
function NarciPetSlotButtonMixin:OnClick()
|
|
MainFrame:SelectPet(self.index);
|
|
SelectionOverlay:ClearAllPoints();
|
|
SelectionOverlay:SetPoint("CENTER", self, "CENTER", 0, 0);
|
|
SelectionOverlay:Show();
|
|
|
|
local AddButton = MainFrame.AddButton;
|
|
AddButton.Label:SetText(self.petName);
|
|
local textWidth = AddButton.Label:GetWidth();
|
|
if textWidth < 32 then
|
|
textWidth = 32;
|
|
end
|
|
AddButton:SetHitRectInsets(-2, -textWidth - 4, 0, 0);
|
|
|
|
MainFrame.petIcon = self.Icon:GetTexture();
|
|
end
|
|
|
|
function NarciPetSlotButtonMixin:SetIcon(texture)
|
|
self.Icon:SetTexture(texture);
|
|
self.Icon:SetTexCoord(0.075, 0.925, 0.075, 0.925);
|
|
self:SetHighlight(false);
|
|
end
|
|
|
|
function NarciPetSlotButtonMixin:DisableSlot()
|
|
self:Disable();
|
|
self.Icon:SetTexture("Interface/AddOns/Narcissus/Art/Modules/PhotoMode/PetStable/EmptySlot");
|
|
self.Icon:SetTexCoord(0, 1, 0, 1);
|
|
self:SetHighlight(true);
|
|
self.petName = nil;
|
|
self.petTypeIndex = nil;
|
|
end
|
|
|
|
function NarciPetSlotButtonMixin:SetData(data)
|
|
--data = {index, petIcon, petName, petTypeIndex}
|
|
if data then
|
|
self.index = data[1];
|
|
self:SetIcon(data[2]);
|
|
self.petName = data[3];
|
|
self.petTypeIndex = data[4];
|
|
self:Enable();
|
|
return true
|
|
else
|
|
self:DisableSlot();
|
|
return false
|
|
end
|
|
end
|
|
|
|
|
|
NarciPetTypeDropDownButtonMixin = {};
|
|
|
|
function NarciPetTypeDropDownButtonMixin:OnEnter()
|
|
FadeFrame(self.Highlight, 0.12, 1);
|
|
end
|
|
|
|
function NarciPetTypeDropDownButtonMixin:OnLeave()
|
|
FadeFrame(self.Highlight, 0.2, 0);
|
|
end
|
|
|
|
function NarciPetTypeDropDownButtonMixin:OnClick()
|
|
local numData = DataProvider:SetFilter(self.petTypeIndex);
|
|
MainFrame:ResetPage(numData);
|
|
MainFrame.FilterButton.RemoveFilter:Show();
|
|
MainFrame.FilterButton.Label:SetText(self.TypeName:GetText());
|
|
MainFrame.FilterButton.Label:SetTextColor(0.25, 0.78, 0.92);
|
|
MainFrame.FilterButton.hasFilter = true;
|
|
SelectFilterDropDownButton(self);
|
|
end
|
|
|
|
function NarciPetTypeDropDownButtonMixin:SetButtonWidth(width)
|
|
--Min width 96
|
|
self:SetWidth(width);
|
|
self.BackdropCenter:SetWidth(width - 32);
|
|
end
|
|
|
|
function NarciPetTypeDropDownButtonMixin:SetUp(petTypeIndex, name)
|
|
if name then
|
|
self.TypeName:SetText(name);
|
|
else
|
|
self.TypeName:SetText( DataProvider:GetPetTypeName(petTypeIndex) );
|
|
end
|
|
|
|
self.Count:SetText( DataProvider:GetTypeCount(petTypeIndex) );
|
|
self.petTypeIndex = petTypeIndex;
|
|
|
|
return (self.TypeName:GetWidth() + self.Count:GetWidth() + 24);
|
|
end
|