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.
8006 lines
291 KiB
8006 lines
291 KiB
-- ///////////////////////////////////////////////////////////////////////////////////////////
|
|
--
|
|
-- Better Wardrobe and Collection;
|
|
-- Author: SLOKnightfall;
|
|
|
|
-- Wardrobe and Collection: Adds additional functionality and sets to the transmog and collection areas;
|
|
|
|
-- ///////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
BW_TRANSMOG_SHAPESHIFT_MIN_ZOOM = -0.3;
|
|
|
|
local addonName, addon = ...;
|
|
---addon = LibStub("AceAddon-3.0"):NewAddon(addon, addonName, "AceEvent-3.0", "AceConsole-3.0", "AceHook-3.0");
|
|
addon = LibStub("AceAddon-3.0"):GetAddon(addonName);
|
|
--_G[addonName] = {};
|
|
addon.ViewDelay = 3;
|
|
local newTransmogInfo = {["latestSource"] = NO_TRANSMOG_SOURCE_ID} --{[99999999] = {[58138] = 10}, };
|
|
addon.newTransmogInfo = newTransmogInfo
|
|
local playerInv_DB;
|
|
local Profile;
|
|
local playerNme;
|
|
local realmName;
|
|
local playerClass, classID, playerClassName;
|
|
|
|
local L = LibStub("AceLocale-3.0"):GetLocale(addonName);
|
|
|
|
local BASE_SET_BUTTON_HEIGHT = addon.Globals.BASE_SET_BUTTON_HEIGHT;
|
|
local VARIANT_SET_BUTTON_HEIGHT = addon.Globals.VARIANT_SET_BUTTON_HEIGHT;
|
|
local SET_PROGRESS_BAR_MAX_WIDTH = addon.Globals.SET_PROGRESS_BAR_MAX_WIDTH;
|
|
local IN_PROGRESS_FONT_COLOR =addon.Globals.IN_PROGRESS_FONT_COLOR;
|
|
local IN_PROGRESS_FONT_COLOR_CODE = addon.Globals.IN_PROGRESS_FONT_COLOR_CODE;
|
|
local COLLECTION_LIST_WIDTH = addon.Globals.COLLECTION_LIST_WIDTH;
|
|
|
|
|
|
local tabType = {"item", "set", "extraset"}
|
|
|
|
addon.useAltSet = false;
|
|
|
|
--local Sets = {};
|
|
--addon.Sets = Sets;
|
|
local inventoryTypes = {};
|
|
|
|
local EXCLUSION_CATEGORY_OFFHAND = 1;
|
|
local EXCLUSION_CATEGORY_MAINHAND = 2;
|
|
local Sets = addon.Sets;
|
|
|
|
|
|
TRANSMOG_SHAPESHIFT_MIN_ZOOM = -0.3;
|
|
|
|
local EXCLUSION_CATEGORY_OFFHAND = 1;
|
|
local EXCLUSION_CATEGORY_MAINHAND = 2;
|
|
|
|
local g_selectionBehavior = nil;
|
|
|
|
local function GetPage(entryIndex, pageSize)
|
|
return floor((entryIndex-1) / pageSize) + 1;
|
|
end
|
|
|
|
local function GetAdjustedDisplayIndexFromKeyPress(contentFrame, index, numEntries, key)
|
|
if ( key == WARDROBE_PREV_VISUAL_KEY ) then
|
|
index = index - 1;
|
|
if ( index < 1 ) then
|
|
index = numEntries;
|
|
end
|
|
elseif ( key == WARDROBE_NEXT_VISUAL_KEY ) then
|
|
index = index + 1;
|
|
if ( index > numEntries ) then
|
|
index = 1;
|
|
end
|
|
elseif ( key == WARDROBE_DOWN_VISUAL_KEY ) then
|
|
local newIndex = index + contentFrame.NUM_COLS;
|
|
if ( newIndex > numEntries ) then
|
|
-- If you're at the last entry, wrap back around; otherwise go to the last entry.
|
|
index = index == numEntries and 1 or numEntries;
|
|
else
|
|
index = newIndex;
|
|
end
|
|
elseif ( key == WARDROBE_UP_VISUAL_KEY ) then
|
|
local newIndex = index - contentFrame.NUM_COLS;
|
|
if ( newIndex < 1 ) then
|
|
-- If you're at the first entry, wrap back around; otherwise go to the first entry.
|
|
index = index == 1 and numEntries or 1;
|
|
else
|
|
index = newIndex;
|
|
end
|
|
end
|
|
return index;
|
|
end
|
|
|
|
-- ************************************************************************************************************************************************************
|
|
-- **** MAIN **********************************************************************************************************************************************
|
|
-- ************************************************************************************************************************************************************
|
|
|
|
BetterWardrobeFrameMixin = CreateFromMixins(CallbackRegistryMixin);
|
|
|
|
BetterWardrobeFrameMixin:GenerateCallbackEvents(
|
|
{
|
|
"OnCollectionTabChanged",
|
|
});
|
|
|
|
function BetterWardrobeFrameMixin:OnLoad()
|
|
self:SetPortraitToAsset("Interface\\Icons\\INV_Arcane_Orb");
|
|
self:SetTitle(TRANSMOGRIFY);
|
|
CallbackRegistryMixin.OnLoad(self);
|
|
end
|
|
|
|
-- ************************************************************************************************************************************************************
|
|
-- **** TRANSMOG **********************************************************************************************************************************************
|
|
-- ************************************************************************************************************************************************************
|
|
|
|
BW_TransmogFrameMixin = { };
|
|
|
|
function BW_TransmogFrameMixin:OnLoad()
|
|
local race, fileName = UnitRace("player");
|
|
local atlas = "transmog-background-race-"..fileName;
|
|
self.Inset.BG:SetAtlas(atlas);
|
|
|
|
self:RegisterEvent("TRANSMOGRIFY_UPDATE");
|
|
self:RegisterEvent("TRANSMOGRIFY_ITEM_UPDATE");
|
|
self:RegisterEvent("TRANSMOGRIFY_SUCCESS");
|
|
|
|
-- set up dependency links
|
|
self.MainHandButton.dependentSlot = self.MainHandEnchantButton;
|
|
self.MainHandEnchantButton.dependencySlot = self.MainHandButton;
|
|
self.SecondaryHandButton.dependentSlot = self.SecondaryHandEnchantButton;
|
|
self.SecondaryHandEnchantButton.dependencySlot = self.SecondaryHandButton;
|
|
self.ShoulderButton.dependentSlot = self.SecondaryShoulderButton;
|
|
self.SecondaryShoulderButton.dependencySlot = self.ShoulderButton;
|
|
|
|
self.ModelScene.ControlFrame:SetModelScene(WardrobeTransmogFrame.ModelScene);
|
|
self.ToggleSecondaryAppearanceCheckbox.Label:SetPoint("RIGHT", BetterWardrobeCollectionFrame.ItemsCollectionFrame.PagingFrame.PageText, "LEFT", -40, 0);
|
|
--[[
|
|
self.SpecDropdown:SetupMenu(function(dropdown, rootDescription)
|
|
rootDescription:SetTag("MENU_TRANSMOG");
|
|
|
|
rootDescription:CreateTitle(TRANSMOG_APPLY_TO);
|
|
|
|
local function IsSelected(currentSpecOnly)
|
|
return GetCVarBool("transmogCurrentSpecOnly") == currentSpecOnly;
|
|
end
|
|
|
|
local function SetSelected(currentSpecOnly)
|
|
SetCVar("transmogCurrentSpecOnly", currentSpecOnly);
|
|
end
|
|
|
|
local currentSpecOnly = true;
|
|
rootDescription:CreateRadio(TRANSMOG_ALL_SPECIALIZATIONS, IsSelected, SetSelected, not currentSpecOnly);
|
|
|
|
local spec = GetSpecialization();
|
|
local name = spec and select(2, GetSpecializationInfo(spec)) or nil;
|
|
if name then
|
|
rootDescription:CreateRadio(TRANSMOG_CURRENT_SPECIALIZATION, IsSelected, SetSelected, currentSpecOnly);
|
|
|
|
local title = rootDescription:CreateTitle(format(PARENS_TEMPLATE, name));
|
|
title:AddInitializer(function(button, description, menu)
|
|
button.fontString:SetTextColor(HIGHLIGHT_FONT_COLOR:GetRGBA());
|
|
button.fontString:AdjustPointsOffset(16, 0);
|
|
end);
|
|
end
|
|
end);
|
|
]]
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:OnEvent(event, ...)
|
|
if ( event == "TRANSMOGRIFY_UPDATE" or event == "TRANSMOGRIFY_ITEM_UPDATE" ) then
|
|
local transmogLocation = ...;
|
|
-- play sound?
|
|
local slotButton = self:GetSlotButton(transmogLocation);
|
|
if ( slotButton ) then
|
|
local isTransmogrified, hasPending, isPendingCollected, canTransmogrify, cannotTransmogrifyReason, hasUndo = C_Transmog.GetSlotInfo(transmogLocation);
|
|
if ( hasUndo ) then
|
|
PlaySound(SOUNDKIT.UI_TRANSMOGRIFY_UNDO);
|
|
elseif ( not hasPending ) then
|
|
if ( slotButton.hadUndo ) then
|
|
PlaySound(SOUNDKIT.UI_TRANSMOGRIFY_REDO);
|
|
slotButton.hadUndo = nil;
|
|
end
|
|
end
|
|
-- specs button tutorial
|
|
if ( hasPending and not hasUndo ) then
|
|
if ( not GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_SPECS_BUTTON) ) then
|
|
local helpTipInfo = {
|
|
text = TRANSMOG_SPECS_BUTTON_TUTORIAL,
|
|
buttonStyle = HelpTip.ButtonStyle.Close,
|
|
cvarBitfield = "closedInfoFrames",
|
|
bitfieldFlag = LE_FRAME_TUTORIAL_TRANSMOG_SPECS_BUTTON,
|
|
targetPoint = HelpTip.Point.BottomEdgeCenter,
|
|
onAcknowledgeCallback = function() BetterWardrobeCollectionFrame.ItemsCollectionFrame:CheckHelpTip(); end,
|
|
acknowledgeOnHide = true,
|
|
};
|
|
--HelpTip:Show(self, helpTipInfo, self.SpecDropdown);
|
|
end
|
|
end
|
|
end
|
|
if ( event == "TRANSMOGRIFY_UPDATE" ) then
|
|
StaticPopup_Hide("TRANSMOG_APPLY_WARNING");
|
|
elseif ( event == "TRANSMOGRIFY_ITEM_UPDATE" and self.redoApply ) then
|
|
self:ApplyPending(0);
|
|
end
|
|
self:MarkDirty();
|
|
elseif ( event == "PLAYER_EQUIPMENT_CHANGED" ) then
|
|
local slotID = ...;
|
|
self:OnEquipmentChanged(slotID);
|
|
elseif ( event == "TRANSMOGRIFY_SUCCESS" ) then
|
|
local transmogLocation = ...;
|
|
local slotButton = self:GetSlotButton(transmogLocation);
|
|
if ( slotButton ) then
|
|
slotButton:OnTransmogrifySuccess();
|
|
end
|
|
elseif ( event == "UNIT_FORM_CHANGED" ) then
|
|
local unit = ...;
|
|
if ( unit == "player" ) then
|
|
self:HandleFormChanged();
|
|
end
|
|
end
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:HandleFormChanged()
|
|
self.needsFormChangedHandling = true;
|
|
if IsUnitModelReadyForUI("player") then
|
|
local hasAlternateForm, inAlternateForm = C_PlayerInfo.GetAlternateFormInfo();
|
|
if ( self.inAlternateForm ~= inAlternateForm ) then
|
|
self.inAlternateForm = inAlternateForm;
|
|
self:RefreshPlayerModel();
|
|
self.needsFormChangedHandling = false;
|
|
end
|
|
end
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:OnShow()
|
|
HideUIPanel(CollectionsJournal);
|
|
BetterWardrobeCollectionFrame:SetContainer(WardrobeFrame);
|
|
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_OPEN_WINDOW);
|
|
self:RegisterEvent("PLAYER_EQUIPMENT_CHANGED");
|
|
local hasAlternateForm, inAlternateForm = C_PlayerInfo.GetAlternateFormInfo();
|
|
if ( hasAlternateForm ) then
|
|
self:RegisterUnitEvent("UNIT_FORM_CHANGED", "player");
|
|
self.inAlternateForm = inAlternateForm;
|
|
end
|
|
self.ModelScene:TransitionToModelSceneID(290, CAMERA_TRANSITION_TYPE_IMMEDIATE, CAMERA_MODIFICATION_TYPE_DISCARD, true);
|
|
self:RefreshPlayerModel();
|
|
WardrobeFrame:RegisterCallback(BetterWardrobeFrameMixin.Event.OnCollectionTabChanged, self.EvaluateSecondaryAppearanceCheckbox, self);
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:OnHide()
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_CLOSE_WINDOW);
|
|
StaticPopup_Hide("TRANSMOG_APPLY_WARNING");
|
|
self:UnregisterEvent("PLAYER_EQUIPMENT_CHANGED");
|
|
self:UnregisterEvent("UNIT_FORM_CHANGED");
|
|
C_PlayerInteractionManager.ClearInteraction(Enum.PlayerInteractionType.Transmogrifier);
|
|
WardrobeFrame:UnregisterCallback(BetterWardrobeFrameMixin.Event.OnCollectionTabChanged, self);
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:MarkDirty()
|
|
self.dirty = true;
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:OnUpdate()
|
|
if self.dirty then
|
|
self:Update();
|
|
end
|
|
|
|
if self.needsFormChangedHandling then
|
|
self:HandleFormChanged();
|
|
end
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:OnEquipmentChanged(slotID)
|
|
local resetHands = false;
|
|
for i, slotButton in ipairs(self.SlotButtons) do
|
|
if slotButton.transmogLocation:GetSlotID() == slotID then
|
|
C_Transmog.ClearPending(slotButton.transmogLocation);
|
|
if slotButton.transmogLocation:IsEitherHand() then
|
|
resetHands = true;
|
|
end
|
|
self:MarkDirty();
|
|
end
|
|
end
|
|
if resetHands then
|
|
-- Have to do this because of possible weirdness with RANGED type combined with other weapon types
|
|
local actor = self.ModelScene:GetPlayerActor();
|
|
if actor then
|
|
actor:UndressSlot(INVSLOT_MAINHAND);
|
|
actor:UndressSlot(INVSLOT_OFFHAND);
|
|
end
|
|
end
|
|
if C_Transmog.CanHaveSecondaryAppearanceForSlotID(slotID) then
|
|
self:CheckSecondarySlotButtons();
|
|
end
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:GetRandomAppearanceID()
|
|
if not self.selectedSlotButton or not C_Item.DoesItemExist(self.selectedSlotButton.itemLocation) then
|
|
return Constants.Transmog.NoTransmogID;
|
|
end
|
|
|
|
-- we need to skip any appearances that match base or current
|
|
local baseItemTransmogInfo = C_Item.GetBaseItemTransmogInfo(self.selectedSlotButton.itemLocation);
|
|
local baseInfo = C_TransmogCollection.GetAppearanceInfoBySource(baseItemTransmogInfo.appearanceID);
|
|
local baseVisual = baseInfo and baseInfo.appearanceID;
|
|
local appliedItemTransmogInfo = C_Item.GetAppliedItemTransmogInfo(self.selectedSlotButton.itemLocation);
|
|
local appliedInfo = C_TransmogCollection.GetAppearanceInfoBySource(appliedItemTransmogInfo.appearanceID);
|
|
local appliedVisual = appliedInfo and appliedInfo.appearanceID or Constants.Transmog.NoTransmogID;
|
|
|
|
-- the collection should always be matched with the slot
|
|
local visualsList = BetterWardrobeCollectionFrame.ItemsCollectionFrame:GetFilteredVisualsList();
|
|
|
|
local function GetValidRandom(minIndex, maxIndex)
|
|
local range = maxIndex - minIndex + 1;
|
|
local startPoint = math.random(minIndex, maxIndex);
|
|
for i = minIndex, maxIndex do
|
|
local currentIndex = startPoint + i;
|
|
if currentIndex > maxIndex then
|
|
currentIndex = currentIndex - range;
|
|
end
|
|
local visualInfo = visualsList[currentIndex];
|
|
local visualID = visualInfo.visualID;
|
|
if visualID ~= baseVisual and visualID ~= appliedVisual and not visualInfo.isHideVisual then
|
|
return BetterWardrobeCollectionFrame.ItemsCollectionFrame:GetAnAppearanceSourceFromVisual(visualID, true);
|
|
end
|
|
end
|
|
return nil;
|
|
end
|
|
|
|
-- first try favorites
|
|
local numFavorites = 0;
|
|
for i, visualInfo in ipairs(visualsList) do
|
|
-- favorites are all at the front
|
|
if not visualInfo.isFavorite then
|
|
numFavorites = i - 1;
|
|
break;
|
|
end
|
|
end
|
|
if numFavorites > 0 then
|
|
local appearanceID = GetValidRandom(1, numFavorites);
|
|
if appearanceID then
|
|
return appearanceID;
|
|
end
|
|
end
|
|
-- now try the rest
|
|
if numFavorites < #visualsList then
|
|
local appearanceID = GetValidRandom(numFavorites + 1, #visualsList);
|
|
if appearanceID then
|
|
return appearanceID;
|
|
end
|
|
end
|
|
-- This is the case of only 1, maybe 2 collected appearances
|
|
return Constants.Transmog.NoTransmogID;
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:ToggleSecondaryForSelectedSlotButton()
|
|
local transmogLocation = self.selectedSlotButton and self.selectedSlotButton.transmogLocation;
|
|
-- if on the main slot, switch to secondary
|
|
if transmogLocation.modification == Enum.TransmogModification.Main then
|
|
transmogLocation = TransmogUtil.GetTransmogLocation(transmogLocation.slotID, transmogLocation.type, Enum.TransmogModification.Secondary);
|
|
end
|
|
local isSecondaryTransmogrified = TransmogUtil.IsSecondaryTransmoggedForItemLocation(self.selectedSlotButton.itemLocation);
|
|
local toggledOn = self.ToggleSecondaryAppearanceCheckbox:GetChecked();
|
|
if toggledOn then
|
|
-- if the item does not already have secondary then set a random pending, otherwise clear any pending
|
|
if not isSecondaryTransmogrified then
|
|
local pendingInfo;
|
|
local randomAppearanceID = self:GetRandomAppearanceID();
|
|
if randomAppearanceID == Constants.Transmog.NoTransmogID then
|
|
pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.ToggleOn);
|
|
else
|
|
pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, randomAppearanceID);
|
|
end
|
|
C_Transmog.SetPending(transmogLocation, pendingInfo);
|
|
else
|
|
C_Transmog.ClearPending(transmogLocation);
|
|
end
|
|
else
|
|
-- if the item already has secondary then it's a toggle off, otherwise clear any pending
|
|
if isSecondaryTransmogrified then
|
|
local pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.ToggleOff);
|
|
C_Transmog.SetPending(transmogLocation, pendingInfo);
|
|
else
|
|
C_Transmog.ClearPending(transmogLocation);
|
|
end
|
|
end
|
|
self:CheckSecondarySlotButtons();
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:CheckSecondarySlotButtons()
|
|
local headButton = self.HeadButton;
|
|
local mainShoulderButton = self.ShoulderButton;
|
|
local secondaryShoulderButton = self.SecondaryShoulderButton;
|
|
local secondaryShoulderTransmogged = TransmogUtil.IsSecondaryTransmoggedForItemLocation(secondaryShoulderButton.itemLocation);
|
|
|
|
local pendingInfo = C_Transmog.GetPending(secondaryShoulderButton.transmogLocation);
|
|
local showSecondaryShoulder = false;
|
|
if not pendingInfo then
|
|
showSecondaryShoulder = secondaryShoulderTransmogged;
|
|
elseif pendingInfo.type == Enum.TransmogPendingType.ToggleOff then
|
|
showSecondaryShoulder = false;
|
|
else
|
|
showSecondaryShoulder = true;
|
|
end
|
|
|
|
secondaryShoulderButton:SetShown(showSecondaryShoulder);
|
|
self.ToggleSecondaryAppearanceCheckbox:SetChecked(showSecondaryShoulder);
|
|
|
|
if showSecondaryShoulder then
|
|
headButton:SetPoint("TOP", -121, -15);
|
|
secondaryShoulderButton:SetPoint("TOP", mainShoulderButton, "BOTTOM", 0, -10);
|
|
else
|
|
headButton:SetPoint("TOP", -121, -41);
|
|
secondaryShoulderButton:SetPoint("TOP", mainShoulderButton, "TOP");
|
|
end
|
|
|
|
if not showSecondaryShoulder and self.selectedSlotButton == secondaryShoulderButton then
|
|
self:SelectSlotButton(mainShoulderButton);
|
|
end
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:HasActiveSecondaryAppearance()
|
|
local checkbox = self.ToggleSecondaryAppearanceCheckbox;
|
|
return checkbox:IsShown() and checkbox:GetChecked();
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:SelectSlotButton(slotButton, fromOnClick)
|
|
if self.selectedSlotButton then
|
|
self.selectedSlotButton:SetSelected(false);
|
|
end
|
|
self.selectedSlotButton = slotButton;
|
|
if slotButton then
|
|
slotButton:SetSelected(true);
|
|
if (fromOnClick and BetterWardrobeCollectionFrame.activeFrame ~= BetterWardrobeCollectionFrame.ItemsCollectionFrame) then
|
|
BetterWardrobeCollectionFrame:ClickTab(BetterWardrobeCollectionFrame.ItemsTab);
|
|
end
|
|
if ( BetterWardrobeCollectionFrame.activeFrame == BetterWardrobeCollectionFrame.ItemsCollectionFrame ) then
|
|
local _, _, selectedSourceID = TransmogUtil.GetInfoForEquippedSlot(slotButton.transmogLocation);
|
|
local forceGo = slotButton.transmogLocation:IsIllusion();
|
|
local forTransmog = true;
|
|
local effectiveCategory;
|
|
if slotButton.transmogLocation:IsEitherHand() then
|
|
effectiveCategory = C_Transmog.GetSlotEffectiveCategory(slotButton.transmogLocation);
|
|
end
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:GoToSourceID(selectedSourceID, slotButton.transmogLocation, forceGo, forTransmog, effectiveCategory);
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:SetTransmogrifierAppearancesShown(true);
|
|
end
|
|
else
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:SetTransmogrifierAppearancesShown(false);
|
|
end
|
|
self:EvaluateSecondaryAppearanceCheckbox();
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:EvaluateSecondaryAppearanceCheckbox()
|
|
local showToggleCheckbox = false;
|
|
if self.selectedSlotButton and (BetterWardrobeCollectionFrame.activeFrame == BetterWardrobeCollectionFrame.ItemsCollectionFrame) then
|
|
|
|
showToggleCheckbox = C_Transmog.CanHaveSecondaryAppearanceForSlotID(self.selectedSlotButton.transmogLocation.slotID);
|
|
end
|
|
WardrobeTransmogFrame.ToggleSecondaryAppearanceCheckbox:SetShown(showToggleCheckbox);
|
|
WardrobeTransmogFrame.ToggleSecondaryAppearanceCheckbox:ClearAllPoints();
|
|
---- WardrobeTransmogFrame.ToggleSecondaryAppearanceCheckbox:SetParent(BetterWardrobeCollectionFrame.ItemsCollectionFrame)
|
|
|
|
WardrobeTransmogFrame.ToggleSecondaryAppearanceCheckbox:SetPoint("LEFT", BetterWardrobeCollectionFrame.ItemsCollectionFrame.ModelR3C1, "LEFT", -2, -110);
|
|
WardrobeTransmogFrame.ToggleSecondaryAppearanceCheckbox:SetFrameLevel(400);
|
|
WardrobeTransmogFrame.ToggleSecondaryAppearanceCheckbox:SetShown(showToggleCheckbox);
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:GetSelectedTransmogLocation()
|
|
if self.selectedSlotButton then
|
|
return self.selectedSlotButton.transmogLocation;
|
|
end
|
|
return nil;
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:RefreshPlayerModel()
|
|
if self.ModelScene.previousActor then
|
|
self.ModelScene.previousActor:ClearModel();
|
|
self.ModelScene.previousActor = nil;
|
|
end
|
|
|
|
local actor = self.ModelScene:GetPlayerActor();
|
|
if actor then
|
|
local sheatheWeapons = false;
|
|
local autoDress = true;
|
|
local hideWeapons = false;
|
|
local useNativeForm = true;
|
|
local _, raceFilename = UnitRace("Player");
|
|
if (raceFilename == "Dracthyr" or raceFilename == "Worgen") then
|
|
useNativeForm = not self.inAlternateForm;
|
|
end
|
|
actor:SetModelByUnit("player", sheatheWeapons, autoDress, hideWeapons, useNativeForm);
|
|
self.ModelScene.previousActor = actor;
|
|
end
|
|
self:Update();
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:Update()
|
|
self.dirty = false;
|
|
for i, slotButton in ipairs(self.SlotButtons) do
|
|
slotButton:Update();
|
|
end
|
|
for i, slotButton in ipairs(self.SlotButtons) do
|
|
slotButton:RefreshItemModel();
|
|
end
|
|
|
|
self:UpdateApplyButton();
|
|
self.OutfitDropdown:UpdateSaveButton();
|
|
|
|
self:CheckSecondarySlotButtons();
|
|
|
|
if not self.selectedSlotButton or not self.selectedSlotButton:IsEnabled() then
|
|
-- select first valid slot or clear selection
|
|
local validSlotButton;
|
|
for i, slotButton in ipairs(self.SlotButtons) do
|
|
if slotButton:IsEnabled() and slotButton.transmogLocation:IsAppearance() then
|
|
validSlotButton = slotButton;
|
|
break;
|
|
end
|
|
end
|
|
self:SelectSlotButton(validSlotButton);
|
|
else
|
|
self:SelectSlotButton(self.selectedSlotButton);
|
|
end
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:SetPendingTransmog(transmogID, category)
|
|
if self.selectedSlotButton then
|
|
local transmogLocation = self.selectedSlotButton.transmogLocation;
|
|
if transmogLocation:IsSecondary() then
|
|
local currentPendingInfo = C_Transmog.GetPending(transmogLocation);
|
|
if currentPendingInfo and currentPendingInfo.type == Enum.TransmogPendingType.Apply then
|
|
self.selectedSlotButton.priorTransmogID = currentPendingInfo.transmogID;
|
|
end
|
|
end
|
|
local pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, transmogID, category);
|
|
C_Transmog.SetPending(transmogLocation, pendingInfo);
|
|
end
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:UpdateApplyButton()
|
|
local cost = C_Transmog.GetApplyCost();
|
|
local canApply;
|
|
if cost and cost > GetMoney() then
|
|
SetMoneyFrameColor("WardrobeTransmogMoneyFrame", "red");
|
|
else
|
|
SetMoneyFrameColor("WardrobeTransmogMoneyFrame");
|
|
if cost then
|
|
canApply = true;
|
|
end
|
|
end
|
|
if StaticPopup_FindVisible("TRANSMOG_APPLY_WARNING") then
|
|
canApply = false;
|
|
end
|
|
MoneyFrame_Update("WardrobeTransmogMoneyFrame", cost or 0, true); -- always show 0 copper
|
|
self.ApplyButton:SetEnabled(canApply);
|
|
self.ModelScene.ClearAllPendingButton:SetShown(canApply);
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:GetSlotButton(transmogLocation)
|
|
for i, slotButton in ipairs(self.SlotButtons) do
|
|
if slotButton.transmogLocation:IsEqual(transmogLocation) then
|
|
return slotButton;
|
|
end
|
|
end
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:ApplyPending(lastAcceptedWarningIndex)
|
|
if ( lastAcceptedWarningIndex == 0 or not self.applyWarningsTable ) then
|
|
self.applyWarningsTable = C_Transmog.GetApplyWarnings();
|
|
end
|
|
self.redoApply = nil;
|
|
if ( self.applyWarningsTable and lastAcceptedWarningIndex < #self.applyWarningsTable ) then
|
|
lastAcceptedWarningIndex = lastAcceptedWarningIndex + 1;
|
|
local data = {
|
|
["link"] = self.applyWarningsTable[lastAcceptedWarningIndex].itemLink,
|
|
["useLinkForItemInfo"] = true,
|
|
["warningIndex"] = lastAcceptedWarningIndex;
|
|
};
|
|
StaticPopup_Show("TRANSMOG_APPLY_WARNING", self.applyWarningsTable[lastAcceptedWarningIndex].text, nil, data);
|
|
self:UpdateApplyButton();
|
|
-- return true to keep static popup open when chaining warnings
|
|
return true;
|
|
else
|
|
local success = C_Transmog.ApplyAllPending(GetCVarBool("transmogCurrentSpecOnly"));
|
|
if ( success ) then
|
|
self:OnTransmogApplied();
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_APPLY);
|
|
self.applyWarningsTable = nil;
|
|
-- outfit tutorial
|
|
if ( not GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_OUTFIT_DROPDOWN) ) then
|
|
local outfits = C_TransmogCollection.GetOutfits();
|
|
if ( #outfits == 0 ) then
|
|
local helpTipInfo = {
|
|
text = TRANSMOG_OUTFIT_DROPDOWN_TUTORIAL,
|
|
buttonStyle = HelpTip.ButtonStyle.Close,
|
|
cvarBitfield = "closedInfoFrames",
|
|
bitfieldFlag = LE_FRAME_TUTORIAL_TRANSMOG_OUTFIT_DROPDOWN,
|
|
targetPoint = HelpTip.Point.RightEdgeCenter,
|
|
offsetX = -18,
|
|
onAcknowledgeCallback = function() BetterWardrobeCollectionFrame.ItemsCollectionFrame:CheckHelpTip(); end,
|
|
acknowledgeOnHide = true,
|
|
};
|
|
--HelpTip:Show(self, helpTipInfo, self.OutfitDropdown);
|
|
end
|
|
end
|
|
else
|
|
-- it's retrieving item info
|
|
self.redoApply = true;
|
|
end
|
|
return false;
|
|
end
|
|
end
|
|
|
|
function BW_TransmogFrameMixin:OnTransmogApplied()
|
|
local dropdown = self.OutfitDropdown;
|
|
if dropdown.selectedOutfitID and dropdown:IsOutfitDressed() then
|
|
WardrobeOutfitManager:SaveLastOutfit(dropdown.selectedOutfitID);
|
|
end
|
|
end
|
|
|
|
BetterWardrobeOutfitDropdownOverrideMixin = {};
|
|
|
|
function BetterWardrobeOutfitDropdownOverrideMixin:LoadOutfit(outfitID)
|
|
if ( not outfitID ) then
|
|
return;
|
|
end
|
|
addon.C_Transmog.LoadOutfit(outfitID);
|
|
end
|
|
|
|
function BetterWardrobeOutfitDropdownOverrideMixin:GetItemTransmogInfoList()
|
|
local playerActor = WardrobeTransmogFrame.ModelScene:GetPlayerActor();
|
|
if playerActor then
|
|
return playerActor:GetItemTransmogInfoList();
|
|
end
|
|
return nil;
|
|
end
|
|
|
|
function BetterWardrobeOutfitDropdownOverrideMixin:OnSelectOutfit(outfitID)
|
|
addon.OutfitDB.char.lastTransmogOutfitIDSpec = addon.OutfitDB.char.lastTransmogOutfitIDSpec or {}
|
|
|
|
if addon.IsDefaultSet(outfitID) then
|
|
|
|
-- outfitID can be 0, so use empty string for none
|
|
local value = addon:GetBlizzID(outfitID) or ""
|
|
for specIndex = 1, GetNumSpecializations() do
|
|
if GetCVar("lastTransmogOutfitIDSpec"..specIndex) == "" then
|
|
SetCVar("lastTransmogOutfitIDSpec"..specIndex, value)
|
|
addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex] = outfitID;
|
|
end
|
|
end
|
|
else
|
|
local value = outfitID or ""
|
|
for specIndex = 1, GetNumSpecializations() do
|
|
if addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex] == "" then
|
|
addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex] = value;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeOutfitDropdownOverrideMixin:GetLastOutfitID()
|
|
local specIndex = GetSpecialization();
|
|
local lastOutfit = addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex]
|
|
|
|
if lastOutfit == "" then lastOutfit = nil end
|
|
return lastOutfit;
|
|
--return tonumber(GetCVar(addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex]));
|
|
end
|
|
|
|
BetterTransmogSlotButtonMixin = { };
|
|
|
|
function BetterTransmogSlotButtonMixin:OnLoad()
|
|
local slotID, textureName = GetInventorySlotInfo(self.slot);
|
|
self.slotID = slotID;
|
|
self.transmogLocation = TransmogUtil.GetTransmogLocation(slotID, self.transmogType, self.modification);
|
|
if self.transmogLocation:IsAppearance() then
|
|
self.Icon:SetTexture(textureName);
|
|
else
|
|
self.Icon:SetTexture(ENCHANT_EMPTY_SLOT_FILEDATAID);
|
|
end
|
|
self.itemLocation = ItemLocation:CreateFromEquipmentSlot(slotID);
|
|
self:RegisterForClicks("LeftButtonUp", "RightButtonUp");
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:OnClick(mouseButton)
|
|
local isTransmogrified, hasPending, isPendingCollected, canTransmogrify, cannotTransmogrifyReason, hasUndo = C_Transmog.GetSlotInfo(self.transmogLocation);
|
|
-- save for sound to play on TRANSMOGRIFY_UPDATE event
|
|
self.hadUndo = hasUndo;
|
|
if mouseButton == "RightButton" then
|
|
if hasPending or hasUndo then
|
|
local newPendingInfo;
|
|
-- for secondary this action might require setting a different pending instead of clearing current pending
|
|
if self.transmogLocation:IsSecondary() then
|
|
if not TransmogUtil.IsSecondaryTransmoggedForItemLocation(self.itemLocation) then
|
|
local currentPendingInfo = C_Transmog.GetPending(self.transmogLocation);
|
|
if currentPendingInfo.type == Enum.TransmogPendingType.ToggleOn then
|
|
if self.priorTransmogID then
|
|
newPendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, self.priorTransmogID);
|
|
else
|
|
newPendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.ToggleOn);
|
|
end
|
|
else
|
|
self.priorTransmogID = currentPendingInfo.transmogID;
|
|
newPendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.ToggleOn);
|
|
end
|
|
end
|
|
end
|
|
if newPendingInfo then
|
|
C_Transmog.SetPending(self.transmogLocation, newPendingInfo);
|
|
else
|
|
C_Transmog.ClearPending(self.transmogLocation);
|
|
end
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_REVERTING_GEAR_SLOT);
|
|
self:OnUserSelect();
|
|
elseif isTransmogrified then
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_REVERTING_GEAR_SLOT);
|
|
local newPendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Revert);
|
|
C_Transmog.SetPending(self.transmogLocation, newPendingInfo);
|
|
self:OnUserSelect();
|
|
end
|
|
else
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_GEAR_SLOT_CLICK);
|
|
self:OnUserSelect();
|
|
end
|
|
if self.UndoButton then
|
|
self.UndoButton:Hide();
|
|
end
|
|
self:OnEnter();
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:OnUserSelect()
|
|
local fromOnClick = true;
|
|
self:GetParent():SelectSlotButton(self, fromOnClick);
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:OnEnter()
|
|
local isTransmogrified, hasPending, isPendingCollected, canTransmogrify, cannotTransmogrifyReason, hasUndo = C_Transmog.GetSlotInfo(self.transmogLocation);
|
|
|
|
if ( self.transmogLocation:IsIllusion() ) then
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT", 0, 0);
|
|
GameTooltip:SetText(WEAPON_ENCHANTMENT);
|
|
local baseSourceID, baseVisualID, appliedSourceID, appliedVisualID, pendingSourceID, pendingVisualID, hasPendingUndo = C_Transmog.GetSlotVisualInfo(self.transmogLocation);
|
|
if ( self.invalidWeapon ) then
|
|
GameTooltip:AddLine(TRANSMOGRIFY_ILLUSION_INVALID_ITEM, TRANSMOGRIFY_FONT_COLOR.r, TRANSMOGRIFY_FONT_COLOR.g, TRANSMOGRIFY_FONT_COLOR.b, true);
|
|
elseif ( hasPending or hasUndo or canTransmogrify ) then
|
|
if ( baseSourceID > 0 ) then
|
|
local name = C_TransmogCollection.GetIllusionStrings(baseSourceID);
|
|
GameTooltip:AddLine(name, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
|
|
end
|
|
if ( hasUndo ) then
|
|
GameTooltip:AddLine(TRANSMOGRIFY_TOOLTIP_REVERT, TRANSMOGRIFY_FONT_COLOR.r, TRANSMOGRIFY_FONT_COLOR.g, TRANSMOGRIFY_FONT_COLOR.b);
|
|
elseif ( pendingSourceID > 0 ) then
|
|
GameTooltip:AddLine(WILL_BE_TRANSMOGRIFIED_HEADER, TRANSMOGRIFY_FONT_COLOR.r, TRANSMOGRIFY_FONT_COLOR.g, TRANSMOGRIFY_FONT_COLOR.b);
|
|
local name = C_TransmogCollection.GetIllusionStrings(pendingSourceID);
|
|
GameTooltip:AddLine(name, TRANSMOGRIFY_FONT_COLOR.r, TRANSMOGRIFY_FONT_COLOR.g, TRANSMOGRIFY_FONT_COLOR.b);
|
|
elseif ( appliedSourceID > 0 ) then
|
|
GameTooltip:AddLine(TRANSMOGRIFIED_HEADER, TRANSMOGRIFY_FONT_COLOR.r, TRANSMOGRIFY_FONT_COLOR.g, TRANSMOGRIFY_FONT_COLOR.b);
|
|
local name = C_TransmogCollection.GetIllusionStrings(appliedSourceID);
|
|
GameTooltip:AddLine(name, TRANSMOGRIFY_FONT_COLOR.r, TRANSMOGRIFY_FONT_COLOR.g, TRANSMOGRIFY_FONT_COLOR.b);
|
|
end
|
|
else
|
|
if not C_Item.DoesItemExist(self.itemLocation) then
|
|
GameTooltip:AddLine(TRANSMOGRIFY_INVALID_NO_ITEM, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, true);
|
|
else
|
|
GameTooltip:AddLine(TRANSMOGRIFY_ILLUSION_INVALID_ITEM, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, true);
|
|
end
|
|
end
|
|
GameTooltip:Show();
|
|
else
|
|
if ( self.UndoButton and canTransmogrify and isTransmogrified and not ( hasPending or hasUndo ) ) then
|
|
self.UndoButton:Show();
|
|
end
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT", 14, 0);
|
|
if not canTransmogrify and not hasUndo then
|
|
GameTooltip:SetText(_G[self.slot]);
|
|
local tag = TRANSMOG_INVALID_CODES[cannotTransmogrifyReason];
|
|
local errorMsg;
|
|
if ( tag == "CANNOT_USE" ) then
|
|
local errorCode, errorString = C_Transmog.GetSlotUseError(self.transmogLocation);
|
|
errorMsg = errorString;
|
|
else
|
|
errorMsg = tag and _G["TRANSMOGRIFY_INVALID_"..tag];
|
|
end
|
|
if ( errorMsg ) then
|
|
GameTooltip:AddLine(errorMsg, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, true);
|
|
end
|
|
GameTooltip:Show();
|
|
else
|
|
GameTooltip:SetTransmogrifyItem(self.transmogLocation);
|
|
end
|
|
end
|
|
WardrobeTransmogFrame.ModelScene.ControlFrame:Show();
|
|
self.UpdateTooltip = GenerateClosure(self.OnEnter, self);
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:OnLeave()
|
|
if ( self.UndoButton and not self.UndoButton:IsMouseOver() ) then
|
|
self.UndoButton:Hide();
|
|
end
|
|
WardrobeTransmogFrame.ModelScene.ControlFrame:Hide();
|
|
GameTooltip:Hide();
|
|
self.UpdateTooltip = nil;
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:OnShow()
|
|
self:Update();
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:OnHide()
|
|
self.priorTransmogID = nil;
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:SetSelected(selected)
|
|
self.SelectedTexture:SetShown(selected);
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:OnTransmogrifySuccess()
|
|
self:Animate();
|
|
self:GetParent():MarkDirty();
|
|
self.priorTransmogID = nil;
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:Animate()
|
|
-- don't do anything if already animating;
|
|
if self.AnimFrame:IsShown() then
|
|
return;
|
|
end
|
|
local isTransmogrified = C_Transmog.GetSlotInfo(self.transmogLocation);
|
|
if isTransmogrified then
|
|
self.AnimFrame.Transition:Show();
|
|
else
|
|
self.AnimFrame.Transition:Hide();
|
|
end
|
|
self.AnimFrame:Show();
|
|
self.AnimFrame.Anim:Play();
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:OnAnimFinished()
|
|
self.AnimFrame:Hide();
|
|
self:Update();
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:Update()
|
|
if not self:IsShown() then
|
|
return;
|
|
end
|
|
|
|
local isTransmogrified, hasPending, isPendingCollected, canTransmogrify, cannotTransmogrifyReason, hasUndo, isHideVisual, texture = C_Transmog.GetSlotInfo(self.transmogLocation);
|
|
local baseTexture = GetInventoryItemTexture("player", self.transmogLocation.slotID);
|
|
|
|
if C_Transmog.IsSlotBeingCollapsed(self.transmogLocation) then
|
|
-- This will indicate a pending change for the item
|
|
hasPending = true;
|
|
isPendingCollected = true;
|
|
canTransmogrify = true;
|
|
end
|
|
|
|
local hasChange = (hasPending and canTransmogrify) or hasUndo;
|
|
|
|
if self.transmogLocation:IsAppearance() then
|
|
if canTransmogrify or hasChange then
|
|
if hasUndo then
|
|
self.Icon:SetTexture(baseTexture);
|
|
else
|
|
self.Icon:SetTexture(texture);
|
|
end
|
|
self.NoItemTexture:Hide();
|
|
else
|
|
local tag = TRANSMOG_INVALID_CODES[cannotTransmogrifyReason];
|
|
local slotID, defaultTexture = GetInventorySlotInfo(self.slot);
|
|
|
|
if tag == "SLOT_FOR_FORM" then
|
|
if texture then
|
|
self.Icon:SetTexture(texture);
|
|
else
|
|
self.Icon:SetTexture(defaultTexture);
|
|
end
|
|
elseif tag == "NO_ITEM" or tag == "SLOT_FOR_RACE" then
|
|
self.Icon:SetTexture(defaultTexture);
|
|
else
|
|
self.Icon:SetTexture(texture);
|
|
end
|
|
|
|
self.NoItemTexture:Show();
|
|
end
|
|
else
|
|
-- check for weapons lacking visual attachments
|
|
local sourceID = self.dependencySlot:GetEffectiveTransmogID();
|
|
if sourceID ~= Constants.Transmog.NoTransmogID and not BetterWardrobeCollectionFrame.ItemsCollectionFrame:CanEnchantSource(sourceID) then
|
|
-- clear anything in the enchant slot, otherwise cost and Apply button state will still reflect anything pending
|
|
C_Transmog.ClearPending(self.transmogLocation);
|
|
isTransmogrified = false; -- handle legacy, this weapon could have had an illusion applied previously
|
|
canTransmogrify = false;
|
|
self.invalidWeapon = true;
|
|
else
|
|
self.invalidWeapon = false;
|
|
end
|
|
|
|
if ( hasPending or hasUndo or canTransmogrify ) then
|
|
self.Icon:SetTexture(texture or ENCHANT_EMPTY_SLOT_FILEDATAID);
|
|
self.NoItemTexture:Hide();
|
|
else
|
|
self.Icon:SetColorTexture(0, 0, 0);
|
|
self.NoItemTexture:Show();
|
|
end
|
|
end
|
|
self:SetEnabled(canTransmogrify or hasUndo);
|
|
|
|
-- show transmogged border if the item is transmogrified and doesn't have a pending transmogrification or is animating
|
|
local showStatusBorder = false;
|
|
if hasPending then
|
|
showStatusBorder = hasUndo or (isPendingCollected and canTransmogrify);
|
|
else
|
|
showStatusBorder = isTransmogrified and not hasChange and not self.AnimFrame:IsShown();
|
|
end
|
|
self.StatusBorder:SetShown(showStatusBorder);
|
|
|
|
-- show ants frame is the item has a pending transmogrification and is not animating
|
|
if ( hasChange and (hasUndo or isPendingCollected) and not self.AnimFrame:IsShown() ) then
|
|
self.PendingFrame:Show();
|
|
if ( hasUndo ) then
|
|
self.PendingFrame.Undo:Show();
|
|
else
|
|
self.PendingFrame.Undo:Hide();
|
|
end
|
|
else
|
|
self.PendingFrame:Hide();
|
|
end
|
|
|
|
if ( isHideVisual and not hasUndo ) then
|
|
if ( self.HiddenVisualIcon ) then
|
|
if ( canTransmogrify ) then
|
|
self.HiddenVisualCover:Show();
|
|
self.HiddenVisualIcon:Show();
|
|
else
|
|
self.HiddenVisualCover:Hide();
|
|
self.HiddenVisualIcon:Hide();
|
|
end
|
|
end
|
|
|
|
self.Icon:SetTexture(baseTexture);
|
|
else
|
|
if ( self.HiddenVisualIcon ) then
|
|
self.HiddenVisualCover:Hide();
|
|
self.HiddenVisualIcon:Hide();
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:GetEffectiveTransmogID()
|
|
if not C_Item.DoesItemExist(self.itemLocation) then
|
|
return Constants.Transmog.NoTransmogID;
|
|
end
|
|
|
|
local function GetTransmogIDFrom(fn)
|
|
local itemTransmogInfo = fn(self.itemLocation);
|
|
return TransmogUtil.GetRelevantTransmogID(itemTransmogInfo, self.transmogLocation);
|
|
end
|
|
|
|
local pendingInfo = C_Transmog.GetPending(self.transmogLocation);
|
|
if pendingInfo then
|
|
if pendingInfo.type == Enum.TransmogPendingType.Apply then
|
|
return pendingInfo.transmogID;
|
|
elseif pendingInfo.type == Enum.TransmogPendingType.Revert then
|
|
return GetTransmogIDFrom(C_Item.GetBaseItemTransmogInfo);
|
|
elseif pendingInfo.type == Enum.TransmogPendingType.ToggleOff then
|
|
return Constants.Transmog.NoTransmogID;
|
|
end
|
|
end
|
|
local appliedTransmogID = GetTransmogIDFrom(C_Item.GetAppliedItemTransmogInfo);
|
|
-- if nothing is applied, get base
|
|
if appliedTransmogID == Constants.Transmog.NoTransmogID then
|
|
return GetTransmogIDFrom(C_Item.GetBaseItemTransmogInfo);
|
|
else
|
|
return appliedTransmogID;
|
|
end
|
|
end
|
|
|
|
function BetterTransmogSlotButtonMixin:RefreshItemModel()
|
|
local actor = WardrobeTransmogFrame.ModelScene:GetPlayerActor();
|
|
if not actor then
|
|
return;
|
|
end
|
|
-- this slot will be handled by the dependencySlot
|
|
if self.dependencySlot then
|
|
return;
|
|
end
|
|
|
|
local appearanceID = self:GetEffectiveTransmogID();
|
|
local secondaryAppearanceID = Constants.Transmog.NoTransmogID;
|
|
local illusionID = Constants.Transmog.NoTransmogID;
|
|
if self.dependentSlot then
|
|
if self.transmogLocation:IsEitherHand() then
|
|
illusionID = self.dependentSlot:GetEffectiveTransmogID();
|
|
else
|
|
secondaryAppearanceID = self.dependentSlot:GetEffectiveTransmogID();
|
|
end
|
|
end
|
|
|
|
if appearanceID ~= Constants.Transmog.NoTransmogID then
|
|
local slotID = self.transmogLocation.slotID;
|
|
local itemTransmogInfo = ItemUtil.CreateItemTransmogInfo(appearanceID, secondaryAppearanceID, illusionID);
|
|
local currentItemTransmogInfo = actor:GetItemTransmogInfo(slotID);
|
|
-- need the main category for mainhand
|
|
local mainHandCategoryID;
|
|
local isLegionArtifact = false;
|
|
if self.transmogLocation:IsMainHand() then
|
|
mainHandCategoryID = C_Transmog.GetSlotEffectiveCategory(self.transmogLocation);
|
|
isLegionArtifact = TransmogUtil.IsCategoryLegionArtifact(mainHandCategoryID);
|
|
itemTransmogInfo:ConfigureSecondaryForMainHand(isLegionArtifact);
|
|
end
|
|
-- update only if there is a change or it can recurse (offhand is processed first and mainhand might override offhand)
|
|
if not itemTransmogInfo:IsEqual(currentItemTransmogInfo) or isLegionArtifact then
|
|
-- don't specify a slot for ranged weapons
|
|
if mainHandCategoryID and TransmogUtil.IsCategoryRangedWeapon(mainHandCategoryID) then
|
|
slotID = nil;
|
|
end
|
|
actor:SetItemTransmogInfo(itemTransmogInfo, slotID);
|
|
end
|
|
end
|
|
end
|
|
|
|
BetterWardrobeTransmogClearAllPendingButtonMixin = {};
|
|
|
|
function BetterWardrobeTransmogClearAllPendingButtonMixin:OnClick()
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_REVERTING_GEAR_SLOT);
|
|
for index, button in ipairs(WardrobeTransmogFrame.SlotButtons) do
|
|
C_Transmog.ClearPending(button.transmogLocation);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeTransmogClearAllPendingButtonMixin:OnEnter()
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
|
GameTooltip:SetText(TRANSMOGRIFY_CLEAR_ALL_PENDING);
|
|
end
|
|
|
|
function BetterWardrobeTransmogClearAllPendingButtonMixin:OnLeave()
|
|
GameTooltip:Hide();
|
|
end
|
|
|
|
-- ************************************************************************************************************************************************************
|
|
-- **** COLLECTION ********************************************************************************************************************************************
|
|
-- ************************************************************************************************************************************************************
|
|
|
|
local MAIN_HAND_INV_TYPE = 21;
|
|
local OFF_HAND_INV_TYPE = 22;
|
|
local RANGED_INV_TYPE = 15;
|
|
local TAB_ITEMS = 1;
|
|
local TAB_SETS = 2;
|
|
local TAB_EXTRASETS = addon.Globals.TAB_EXTRASETS;
|
|
local TAB_SAVED_SETS = addon.Globals.TAB_SAVED_SETS;
|
|
local TABS_MAX_WIDTH = 85;
|
|
|
|
local WARDROBE_MODEL_SETUP = {
|
|
["HEADSLOT"] = { useTransmogSkin = false, useTransmogChoices = false, obeyHideInTransmogFlag = false, slots = { CHESTSLOT = true, HANDSSLOT = false, LEGSSLOT = false, FEETSLOT = false, HEADSLOT = false } },
|
|
["SHOULDERSLOT"] = { useTransmogSkin = true, useTransmogChoices = true, obeyHideInTransmogFlag = true, slots = { CHESTSLOT = false, HANDSSLOT = false, LEGSSLOT = false, FEETSLOT = false, HEADSLOT = true } },
|
|
["BACKSLOT"] = { useTransmogSkin = true, useTransmogChoices = true, obeyHideInTransmogFlag = true, slots = { CHESTSLOT = false, HANDSSLOT = false, LEGSSLOT = false, FEETSLOT = false, HEADSLOT = true } },
|
|
["CHESTSLOT"] = { useTransmogSkin = true, useTransmogChoices = true, obeyHideInTransmogFlag = true, slots = { CHESTSLOT = false, HANDSSLOT = false, LEGSSLOT = false, FEETSLOT = false, HEADSLOT = true } },
|
|
["TABARDSLOT"] = { useTransmogSkin = true, useTransmogChoices = true, obeyHideInTransmogFlag = true, slots = { CHESTSLOT = false, HANDSSLOT = false, LEGSSLOT = false, FEETSLOT = false, HEADSLOT = true } },
|
|
["SHIRTSLOT"] = { useTransmogSkin = true, useTransmogChoices = true, obeyHideInTransmogFlag = true, slots = { CHESTSLOT = false, HANDSSLOT = false, LEGSSLOT = false, FEETSLOT = false, HEADSLOT = true } },
|
|
["WRISTSLOT"] = { useTransmogSkin = true, useTransmogChoices = true, obeyHideInTransmogFlag = true, slots = { CHESTSLOT = false, HANDSSLOT = false, LEGSSLOT = false, FEETSLOT = false, HEADSLOT = true } },
|
|
["HANDSSLOT"] = { useTransmogSkin = false, useTransmogChoices = true, obeyHideInTransmogFlag = true, slots = { CHESTSLOT = true, HANDSSLOT = false, LEGSSLOT = true, FEETSLOT = true, HEADSLOT = true } },
|
|
["WAISTSLOT"] = { useTransmogSkin = true, useTransmogChoices = true, obeyHideInTransmogFlag = true, slots = { CHESTSLOT = false, HANDSSLOT = false, LEGSSLOT = false, FEETSLOT = false, HEADSLOT = true } },
|
|
["LEGSSLOT"] = { useTransmogSkin = true, useTransmogChoices = true, obeyHideInTransmogFlag = true, slots = { CHESTSLOT = false, HANDSSLOT = false, LEGSSLOT = false, FEETSLOT = false, HEADSLOT = true } },
|
|
["FEETSLOT"] = { useTransmogSkin = false, useTransmogChoices = true, obeyHideInTransmogFlag = true, slots = { CHESTSLOT = true, HANDSSLOT = true, LEGSSLOT = true, FEETSLOT = false, HEADSLOT = true } },
|
|
}
|
|
|
|
local function GetUseTransmogSkin(slot)
|
|
local modelSetupTable = WARDROBE_MODEL_SETUP[slot];
|
|
if not modelSetupTable or modelSetupTable.useTransmogSkin then
|
|
return true;
|
|
end
|
|
|
|
-- this exludes head slot
|
|
if modelSetupTable.useTransmogChoices then
|
|
local transmogLocation = TransmogUtil.GetTransmogLocation(slot, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
if transmogLocation then
|
|
if not C_PlayerInfo.HasVisibleInvSlot(transmogLocation.slotID) then
|
|
return true;
|
|
end
|
|
end
|
|
end
|
|
|
|
return false;
|
|
end
|
|
|
|
local WARDROBE_MODEL_SETUP_GEAR = {
|
|
["CHESTSLOT"] = 78420,
|
|
["LEGSSLOT"] = 78425,
|
|
["FEETSLOT"] = 78427,
|
|
["HANDSSLOT"] = 78426,
|
|
["HEADSLOT"] = 78416,
|
|
}
|
|
|
|
local SET_MODEL_PAN_AND_ZOOM_LIMITS = {
|
|
["Draenei2"] = { maxZoom = 2.2105259895325, panMaxLeft = -0.56983226537705, panMaxRight = 0.82581323385239, panMaxTop = -0.17342753708363, panMaxBottom = -2.6428601741791 },
|
|
["Draenei3"] = { maxZoom = 3.0592098236084, panMaxLeft = -0.33429977297783, panMaxRight = 0.29183092713356, panMaxTop = -0.079871296882629, panMaxBottom = -2.4141833782196 },
|
|
["Worgen2"] = { maxZoom = 1.9605259895325, panMaxLeft = -0.64045578241348, panMaxRight = 0.59410041570663, panMaxTop = -0.11050206422806, panMaxBottom = -2.2492413520813 },
|
|
["Worgen3"] = { maxZoom = 2.9013152122498, panMaxLeft = -0.2526838183403, panMaxRight = 0.38198262453079, panMaxTop = -0.10407017171383, panMaxBottom = -2.4137926101685 },
|
|
["Worgen3Alt"] = { maxZoom = 3.3618412017822, panMaxLeft = -0.19753229618072, panMaxRight = 0.26802557706833, panMaxTop = -0.073476828634739, panMaxBottom = -1.9255120754242 },
|
|
["Worgen2Alt"] = { maxZoom = 2.9605259895325, panMaxLeft = -0.33268970251083, panMaxRight = 0.36896070837975, panMaxTop = -0.14780110120773, panMaxBottom = -2.1662468910217 },
|
|
["Scourge2"] = { maxZoom = 3.1710526943207, panMaxLeft = -0.3243542611599, panMaxRight = 0.5625838637352, panMaxTop = -0.054175414144993, panMaxBottom = -1.7261047363281 },
|
|
["Scourge3"] = { maxZoom = 2.7105259895325, panMaxLeft = -0.35650563240051, panMaxRight = 0.41562974452972, panMaxTop = -0.07072202116251, panMaxBottom = -1.877711892128 },
|
|
["Orc2"] = { maxZoom = 2.5526309013367, panMaxLeft = -0.64236557483673, panMaxRight = 0.77098786830902, panMaxTop = -0.075792260468006, panMaxBottom = -2.0818419456482 },
|
|
["Orc3"] = { maxZoom = 3.2960524559021, panMaxLeft = -0.22763830423355, panMaxRight = 0.32022559642792, panMaxTop = -0.038521766662598, panMaxBottom = -2.0473554134369 },
|
|
["Gnome3"] = { maxZoom = 2.9605259895325, panMaxLeft = -0.29900181293488, panMaxRight = 0.35779395699501, panMaxTop = -0.076380833983421, panMaxBottom = -0.99909907579422 },
|
|
["Gnome2"] = { maxZoom = 2.8552639484406, panMaxLeft = -0.2777853012085, panMaxRight = 0.29651582241058, panMaxTop = -0.095201380550861, panMaxBottom = -1.0263166427612 },
|
|
["Dwarf2"] = { maxZoom = 2.9605259895325, panMaxLeft = -0.50352156162262, panMaxRight = 0.4159924685955, panMaxTop = -0.07211934030056, panMaxBottom = -1.4946432113648 },
|
|
["Dwarf3"] = { maxZoom = 2.8947370052338, panMaxLeft = -0.37057432532311, panMaxRight = 0.43383255600929, panMaxTop = -0.084960877895355, panMaxBottom = -1.7173190116882 },
|
|
["BloodElf3"] = { maxZoom = 3.1644730567932, panMaxLeft = -0.2654082775116, panMaxRight = 0.28886350989342, panMaxTop = -0.049619361758232, panMaxBottom = -1.9943760633469 },
|
|
["BloodElf2"] = { maxZoom = 3.1710524559021, panMaxLeft = -0.25901651382446, panMaxRight = 0.45525884628296, panMaxTop = -0.085230752825737, panMaxBottom = -2.0548067092895 },
|
|
["Troll2"] = { maxZoom = 2.2697355747223, panMaxLeft = -0.58214980363846, panMaxRight = 0.5104039311409, panMaxTop = -0.05494449660182, panMaxBottom = -2.3443803787231 },
|
|
["Troll3"] = { maxZoom = 3.1249995231628, panMaxLeft = -0.35141581296921, panMaxRight = 0.50875341892242, panMaxTop = -0.063820324838161, panMaxBottom = -2.4224486351013 },
|
|
["Tauren2"] = { maxZoom = 2.1118416786194, panMaxLeft = -0.82946360111237, panMaxRight = 0.83975899219513, panMaxTop = -0.061676319688559, panMaxBottom = -2.035267829895 },
|
|
["Tauren3"] = { maxZoom = 2.9605259895325, panMaxLeft = -0.37433895468712, panMaxRight = 0.40420442819595, panMaxTop = -0.1868137717247, panMaxBottom = -2.2116675376892 },
|
|
["NightElf3"] = { maxZoom = 2.9539475440979, panMaxLeft = -0.27334463596344, panMaxRight = 0.27148312330246, panMaxTop = -0.094710879027844, panMaxBottom = -2.3087983131409 },
|
|
["NightElf2"] = { maxZoom = 2.9144732952118, panMaxLeft = -0.45042458176613, panMaxRight = 0.47114592790604, panMaxTop = -0.10513981431723, panMaxBottom = -2.4612309932709 },
|
|
["Human3"] = { maxZoom = 3.3618412017822, panMaxLeft = -0.19753229618072, panMaxRight = 0.26802557706833, panMaxTop = -0.073476828634739, panMaxBottom = -1.9255120754242 },
|
|
["Human2"] = { maxZoom = 2.9605259895325, panMaxLeft = -0.33268970251083, panMaxRight = 0.36896070837975, panMaxTop = -0.14780110120773, panMaxBottom = -2.1662468910217 },
|
|
["Pandaren3"] = { maxZoom = 2.5921046733856, panMaxLeft = -0.45187762379646, panMaxRight = 0.54132586717606, panMaxTop = -0.11439494043589, panMaxBottom = -2.2257535457611 },
|
|
["Pandaren2"] = { maxZoom = 2.9342107772827, panMaxLeft = -0.36421552300453, panMaxRight = 0.50203305482864, panMaxTop = -0.11241528391838, panMaxBottom = -2.3707413673401 },
|
|
["Goblin2"] = { maxZoom = 2.4605259895325, panMaxLeft = -0.31328883767128, panMaxRight = 0.39014467597008, panMaxTop = -0.089733943343162, panMaxBottom = -1.3402827978134 },
|
|
["Goblin3"] = { maxZoom = 2.9605259895325, panMaxLeft = -0.26144406199455, panMaxRight = 0.30945864319801, panMaxTop = -0.07625275105238, panMaxBottom = -1.2928194999695 },
|
|
["LightforgedDraenei2"] = { maxZoom = 2.2105259895325, panMaxLeft = -0.56983226537705, panMaxRight = 0.82581323385239, panMaxTop = -0.17342753708363, panMaxBottom = -2.6428601741791 },
|
|
["LightforgedDraenei3"] = { maxZoom = 3.0592098236084, panMaxLeft = -0.33429977297783, panMaxRight = 0.29183092713356, panMaxTop = -0.079871296882629, panMaxBottom = -2.4141833782196 },
|
|
["HighmountainTauren2"] = { maxZoom = 2.1118416786194, panMaxLeft = -0.82946360111237, panMaxRight = 0.83975899219513, panMaxTop = -0.061676319688559, panMaxBottom = -2.035267829895 },
|
|
["HighmountainTauren3"] = { maxZoom = 2.9605259895325, panMaxLeft = -0.37433895468712, panMaxRight = 0.40420442819595, panMaxTop = -0.1868137717247, panMaxBottom = -2.2116675376892 },
|
|
["Nightborne3"] = { maxZoom = 2.9539475440979, panMaxLeft = -0.27334463596344, panMaxRight = 0.27148312330246, panMaxTop = -0.094710879027844, panMaxBottom = -2.3087983131409 },
|
|
["Nightborne2"] = { maxZoom = 2.9144732952118, panMaxLeft = -0.45042458176613, panMaxRight = 0.47114592790604, panMaxTop = -0.10513981431723, panMaxBottom = -2.4612309932709 },
|
|
["VoidElf3"] = { maxZoom = 3.1644730567932, panMaxLeft = -0.2654082775116, panMaxRight = 0.28886350989342, panMaxTop = -0.049619361758232, panMaxBottom = -1.9943760633469 },
|
|
["VoidElf2"] = { maxZoom = 3.1710524559021, panMaxLeft = -0.25901651382446, panMaxRight = 0.45525884628296, panMaxTop = -0.085230752825737, panMaxBottom = -2.0548067092895 },
|
|
["MagharOrc2"] = { maxZoom = 2.5526309013367, panMaxLeft = -0.64236557483673, panMaxRight = 0.77098786830902, panMaxTop = -0.075792260468006, panMaxBottom = -2.0818419456482 },
|
|
["MagharOrc3"] = { maxZoom = 3.2960524559021, panMaxLeft = -0.22763830423355, panMaxRight = 0.32022559642792, panMaxTop = -0.038521766662598, panMaxBottom = -2.0473554134369 },
|
|
["DarkIronDwarf2"] = { maxZoom = 2.9605259895325, panMaxLeft = -0.50352156162262, panMaxRight = 0.4159924685955, panMaxTop = -0.07211934030056, panMaxBottom = -1.4946432113648 },
|
|
["DarkIronDwarf3"] = { maxZoom = 2.8947370052338, panMaxLeft = -0.37057432532311, panMaxRight = 0.43383255600929, panMaxTop = -0.084960877895355, panMaxBottom = -1.7173190116882 },
|
|
["KulTiran2"] = { maxZoom = 1.71052598953247, panMaxLeft = -0.667941331863403, panMaxRight = 0.589463412761688, panMaxTop = -0.373320609331131, panMaxBottom = -2.7329957485199 },
|
|
["KulTiran3"] = { maxZoom = 2.22368383407593, panMaxLeft = -0.43183308839798, panMaxRight = 0.445900857448578, panMaxTop = -0.303212702274323, panMaxBottom = -2.49550628662109 },
|
|
["ZandalariTroll2"] = { maxZoom = 2.1710512638092, panMaxLeft = -0.487841755151749, panMaxRight = 0.561356604099274, panMaxTop = -0.385127544403076, panMaxBottom = -2.78562784194946 },
|
|
["ZandalariTroll3"] = { maxZoom = 3.32894563674927, panMaxLeft = -0.376705944538116, panMaxRight = 0.488780438899994, panMaxTop = -0.20890490710735, panMaxBottom = -2.67064166069031 },
|
|
["Mechagnome3"] = { maxZoom = 2.9605259895325, panMaxLeft = -0.29900181293488, panMaxRight = 0.35779395699501, panMaxTop = -0.076380833983421, panMaxBottom = -0.99909907579422 },
|
|
["Mechagnome2"] = { maxZoom = 2.8552639484406, panMaxLeft = -0.2777853012085, panMaxRight = 0.29651582241058, panMaxTop = -0.095201380550861, panMaxBottom = -1.0263166427612 },
|
|
["Vulpera2"] = { maxZoom = 2.4605259895325, panMaxLeft = -0.31328883767128, panMaxRight = 0.39014467597008, panMaxTop = -0.089733943343162, panMaxBottom = -1.3402827978134 },
|
|
["Vulpera3"] = { maxZoom = 2.9605259895325, panMaxLeft = -0.26144406199455, panMaxRight = 0.30945864319801, panMaxTop = -0.07625275105238, panMaxBottom = -1.2928194999695 },
|
|
["Dracthyr2"] = { maxZoom = 2.1118416786194, panMaxLeft = -0.72946360111237, panMaxRight = 0.83975899219513, panMaxTop = -0.061676319688559, panMaxBottom = -2.035267829895 },
|
|
["Dracthyr3"] = { maxZoom = 2.9605259895325, panMaxLeft = -0.37433895468712, panMaxRight = 0.40420442819595, panMaxTop = -0.1868137717247, panMaxBottom = -2.2116675376892 },
|
|
["Dracthyr3Alt"] = { maxZoom = 3.3618412017822, panMaxLeft = -0.19753229618072, panMaxRight = 0.26802557706833, panMaxTop = -0.073476828634739, panMaxBottom = -1.9255120754242 },
|
|
["Dracthyr2Alt"] = { maxZoom = 3.1710524559021, panMaxLeft = -0.25901651382446, panMaxRight = 0.45525884628296, panMaxTop = -0.085230752825737, panMaxBottom = -2.0548067092895 },
|
|
};
|
|
|
|
BetterWardrobeCollectionFrameMixin = { };
|
|
|
|
function BetterWardrobeCollectionFrameMixin:ReloadTab()
|
|
self.ItemsCollectionFrame:Hide()
|
|
self.SetsCollectionFrame:Hide()
|
|
self.SetsTransmogFrame:Hide()
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:CheckTab(tab)
|
|
local atTransmogrifier = C_Transmog.IsAtTransmogNPC()
|
|
if (atTransmogrifier and BetterWardrobeCollectionFrame.selectedTransmogTab == tab) or BetterWardrobeCollectionFrame.selectedCollectionTab == tab then
|
|
return true;
|
|
end
|
|
end
|
|
BW_CheckTab = BetterWardrobeCollectionFrameMixin.CheckTab
|
|
|
|
|
|
function BetterWardrobeCollectionFrameMixin:SetContainer(parent)
|
|
self:SetParent(parent);
|
|
self:ClearAllPoints();
|
|
if parent == CollectionsJournal then
|
|
self:SetPoint("TOPLEFT", CollectionsJournal);
|
|
self:SetPoint("BOTTOMRIGHT", CollectionsJournal);
|
|
self.ItemsCollectionFrame.ModelR1C1:SetPoint("TOP", -238, -94);
|
|
self.ItemsCollectionFrame.PagingFrame:SetPoint("BOTTOM", 22, 40);
|
|
self.ItemsCollectionFrame.SlotsFrame:Show();
|
|
self.ItemsCollectionFrame.BGCornerTopLeft:Hide();
|
|
self.ItemsCollectionFrame.BGCornerTopRight:Hide();
|
|
self.ItemsCollectionFrame.WeaponDropdown:SetPoint("TOPRIGHT", -70, -58);
|
|
self.ClassDropdown:Show();
|
|
self.ItemsCollectionFrame.NoValidItemsLabel:Hide();
|
|
self.ItemsTab:SetPoint("TOPLEFT", 58, -28);
|
|
self:SetTab(self.selectedCollectionTab);
|
|
elseif parent == WardrobeFrame then
|
|
self:SetPoint("TOPRIGHT", 0, 0);
|
|
self:SetSize(662, 606);
|
|
self.ItemsCollectionFrame.ModelR1C1:SetPoint("TOP", -235, -71);
|
|
self.ItemsCollectionFrame.PagingFrame:SetPoint("BOTTOM", 22, 38);
|
|
self.ItemsCollectionFrame.SlotsFrame:Hide();
|
|
self.ItemsCollectionFrame.BGCornerTopLeft:Show();
|
|
self.ItemsCollectionFrame.BGCornerTopRight:Show();
|
|
self.ItemsCollectionFrame.WeaponDropdown:SetPoint("TOPRIGHT", -48, -38);
|
|
self.ClassDropdown:Hide();
|
|
self.ItemsTab:SetPoint("TOPLEFT", 8, -28);
|
|
self:SetTab(self.selectedTransmogTab);
|
|
end
|
|
self:Show();
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:ClickTab(tab)
|
|
self:SetTab(tab:GetID());
|
|
PanelTemplates_ResizeTabsToFit(BetterWardrobeCollectionFrame, TABS_MAX_WIDTH);
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:SetTab(tabID)
|
|
PanelTemplates_SetTab(self, tabID);
|
|
local atTransmogrifier = C_Transmog.IsAtTransmogNPC();
|
|
if atTransmogrifier then
|
|
self.selectedTransmogTab = tabID;
|
|
self.selectedCollectionTab = 1;
|
|
else
|
|
self.selectedCollectionTab = tabID;
|
|
self.selectedTransmogTab = 1;
|
|
end
|
|
|
|
|
|
local ElvUI = C_AddOns.IsAddOnLoaded("ElvUI");
|
|
|
|
--if SavedOutfitDropDownMenu then
|
|
--SavedOutfitDropDownMenu:Hide();
|
|
--end
|
|
|
|
--self.BW_SetsHideSlotButton:Hide();
|
|
BetterWardrobeVisualToggle.VisualMode = false;
|
|
self.TransmogOptionsButton:Hide();
|
|
----self.ItemsCollectionFrame:Hide();
|
|
self.SetsCollectionFrame:Hide();
|
|
self.SetsTransmogFrame:Hide();
|
|
self.SavedOutfitDropDown:Hide();
|
|
|
|
|
|
-----addon.ColorFilterFrame:Hide()
|
|
|
|
BetterWardrobeVisualToggle:Hide() --until toggle gets fixed
|
|
|
|
if tabID == TAB_ITEMS then
|
|
|
|
BetterWardrobeVisualToggle:Hide()
|
|
-----addon.ColorFilterFrame:Show()
|
|
if BW_ColectionListFrame then
|
|
BW_ColectionListFrame:SetShown(BetterWardrobeCollectionFrame:IsShown() and not atTransmogrifier)
|
|
end
|
|
|
|
self.activeFrame = self.ItemsCollectionFrame;
|
|
self.ItemsCollectionFrame:Show();
|
|
self.SetsCollectionFrame:Hide();
|
|
self.SetsTransmogFrame:Hide();
|
|
self.SearchBox:ClearAllPoints();
|
|
self.SearchBox:SetPoint("TOPRIGHT", -107, -35);
|
|
self.SearchBox:SetWidth(115);
|
|
local enableSearchAndFilter = self.ItemsCollectionFrame.transmogLocation and self.ItemsCollectionFrame.transmogLocation:IsAppearance()
|
|
self.SearchBox:SetEnabled(enableSearchAndFilter);
|
|
self.FilterButton:Show();
|
|
self.FilterButton:SetEnabled(enableSearchAndFilter);
|
|
self.ClassDropdown:ClearAllPoints();
|
|
self.ClassDropdown:SetPoint("TOPRIGHT", self.ItemsCollectionFrame.SlotsFrame, "TOPLEFT", -12, -2);
|
|
|
|
self:InitItemsFilterButton();
|
|
self.SearchBox:Show()
|
|
|
|
|
|
|
|
BW_SortDropDown:Show()
|
|
BW_SortDropDown:ClearAllPoints()
|
|
|
|
local _, isWeapon = C_TransmogCollection.GetCategoryInfo((BetterWardrobeCollectionFrame and BetterWardrobeCollectionFrame.ItemsCollectionFrame:GetActiveCategory()) or 1)
|
|
local yOffset = (atTransmogrifier and (isWeapon and 55 or 32)) or LegionWardrobeY;
|
|
if atTransmogrifier then
|
|
self.TransmogOptionsButton:Show();
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame.ApplyOnClickCheckbox:Hide();
|
|
self.ClassDropdown:Hide();
|
|
|
|
if ElvUI then
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame.WeaponDropdown:SetPoint("TOPRIGHT", -42, -10)
|
|
BW_SortDropDown:SetPoint("TOPLEFT", BetterWardrobeCollectionFrame.ItemsCollectionFrame.WeaponDropdown, "BOTTOMLEFT", 0, 0)
|
|
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:ClearAllPoints();
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:SetPoint("TOPRIGHT",self:GetParent(), "TOPRIGHT", -17,-45)
|
|
else
|
|
--BetterWardrobeCollectionFrame.ItemsCollectionFrame.WeaponDropdown:SetPoint("TOPRIGHT", -48, -38)
|
|
BW_SortDropDown:SetPoint("BOTTOMLEFT", BetterWardrobeCollectionFrame.ItemsCollectionFrame.WeaponDropdown, "TOPLEFT", 0, 3)
|
|
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:ClearAllPoints();
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:SetPoint("TOPRIGHT",self:GetParent(), "TOPRIGHT", -12,-50)
|
|
end
|
|
|
|
else
|
|
self.ClassDropdown:Show();
|
|
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame.ApplyOnClickCheckbox:Show();
|
|
BW_SortDropDown:SetPoint("TOPRIGHT", self.ItemsCollectionFrame.SlotsFrame, "TOPLEFT", -12, -35);
|
|
|
|
----BetterWardrobeCollectionFrame.ItemsCollectionFrame.WeaponDropdown:SetPoint("TOPRIGHT", -32, -25)
|
|
if ElvUI then
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:ClearAllPoints()
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:SetPoint("TOPRIGHT",self:GetParent(), "TOPRIGHT", -13,-55)
|
|
else
|
|
--BW_SortDropDown:SetPoint("TOPLEFT", BetterWardrobeCollectionFrame, "TOPLEFT", 0, -110)
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:ClearAllPoints()
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:SetPoint("TOPRIGHT",BetterWardrobeCollectionFrame.ItemsCollectionFrame.WeaponDropdown, "TOPRIGHT", 35, 13)
|
|
------BetterWardrobeCollectionFrame.AlteredFormSwapButton:ClearAllPoints()
|
|
-----BetterWardrobeCollectionFrame.AlteredFormSwapButton:SetPoint("TOPRIGHT",self:GetParent(), "TOPRIGHT", -19,-65)
|
|
end
|
|
end
|
|
|
|
elseif tabID == TAB_SETS or tabID == TAB_EXTRASETS or tabID == TAB_SAVED_SETS then
|
|
--BetterWardrobeVisualToggle:Show()
|
|
BW_SortDropDown:Hide()
|
|
if BW_ColectionListFrame then
|
|
BW_ColectionListFrame:Hide()
|
|
end
|
|
self.ItemsCollectionFrame:Hide();
|
|
self.SearchBox:ClearAllPoints();
|
|
self.SearchBox:Show()
|
|
|
|
if ( atTransmogrifier ) then
|
|
self.TransmogOptionsButton:Show();
|
|
|
|
self.activeFrame = self.SetsTransmogFrame;
|
|
self.SearchBox:SetPoint("TOPRIGHT", -95, -35);
|
|
self.SearchBox:SetWidth(115);
|
|
self.FilterButton:Hide();
|
|
if tabID == TAB_SAVED_SETS then
|
|
self.SearchBox:SetPoint("TOPRIGHT", -57, -75);
|
|
else
|
|
self.SearchBox:SetPoint("TOPRIGHT", -97, -35)
|
|
end
|
|
|
|
----self.SearchBox:SetWidth(115)
|
|
BW_SortDropDown:SetPoint("TOPRIGHT", BetterWardrobeCollectionFrame.ItemsCollectionFrame, "TOPRIGHT",-30, -10);
|
|
if ElvUI then
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:ClearAllPoints()
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:SetPoint("TOPRIGHT",BetterWardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame, "TOPRIGHT", 0 ,-5);
|
|
|
|
else
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:ClearAllPoints()
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:SetPoint("TOPRIGHT",BetterWardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame, "TOPRIGHT", -5 ,10);
|
|
|
|
end
|
|
else
|
|
self.activeFrame = self.SetsCollectionFrame;
|
|
self.SearchBox:SetPoint("TOPLEFT", 19, -69);
|
|
self.SearchBox:SetWidth(145);
|
|
self.FilterButton:Show();
|
|
self.FilterButton:SetEnabled(true);
|
|
self:InitBaseSetsFilterButton();
|
|
--self.BW_SetsHideSlotButton:Show();
|
|
self.ClassDropdown:Show();
|
|
|
|
|
|
|
|
end
|
|
|
|
self.SearchBox:SetEnabled(true);
|
|
self.ClassDropdown:ClearAllPoints();
|
|
self.ClassDropdown:SetPoint("BOTTOMRIGHT", self.SetsCollectionFrame, "TOPRIGHT", -9, 4);
|
|
|
|
self.SetsCollectionFrame:SetShown(not atTransmogrifier);
|
|
self.SetsTransmogFrame:SetShown(atTransmogrifier);
|
|
local sortValue
|
|
if tabID == TAB_SAVED_SETS then
|
|
BW_SortDropDown:Hide()
|
|
--SavedOutfitDropDownMenu:Show()
|
|
--BW_SortDropDown:SetPoint("TOPLEFT", BetterWardrobeVisualToggle, "TOPRIGHT", 5, 0)
|
|
BW_SortDropDown:ClearAllPoints()
|
|
BW_SortDropDown:SetPoint("TOPRIGHT", self.SearchBox, "TOPRIGHT", 21, 5)
|
|
--BW_SortDropDown:Show()
|
|
self.FilterButton:Hide()
|
|
self.SearchBox:Hide()
|
|
self.ClassDropdown:Hide()
|
|
self.SavedOutfitDropDown:Show()
|
|
|
|
--BW_SortDropDown:Hide()
|
|
local savedCount = #addon.GetSavedList()
|
|
--WardrobeCollectionFrame_UpdateProgressBar(savedCount, savedCount)
|
|
|
|
--tempSorting = BW_SortDropDown.selectedValue
|
|
--addon.setdb.profile.sorting = BW_SortDropDown.selectedValue
|
|
|
|
sortValue = addon.setdb.profile.sorting
|
|
|
|
|
|
else
|
|
--db.sortDropdown = BW_SortDropDown.selectedValue;
|
|
--sortValue = db.sortDropdown
|
|
end
|
|
end
|
|
|
|
WardrobeFrame:TriggerEvent(BetterWardrobeFrameMixin.Event.OnCollectionTabChanged);
|
|
end
|
|
|
|
local transmogSourceOrderPriorities = {
|
|
[Enum.TransmogSource.JournalEncounter] = 5,
|
|
[Enum.TransmogSource.Quest] = 5,
|
|
[Enum.TransmogSource.Vendor] = 5,
|
|
[Enum.TransmogSource.WorldDrop] = 5,
|
|
[Enum.TransmogSource.Achievement] = 5,
|
|
[Enum.TransmogSource.Profession] = 5,
|
|
[Enum.TransmogSource.TradingPost] = 4,
|
|
};
|
|
|
|
function BetterWardrobeCollectionFrameMixin:InitItemsFilterButton()
|
|
-- Source filters are in a submenu when unless we're at a transmogrifier.
|
|
local function CreateSourceFilters(description)
|
|
description:CreateButton(CHECK_ALL, function()
|
|
C_TransmogCollection.SetAllSourceTypeFilters(true);
|
|
return MenuResponse.Refresh;
|
|
end);
|
|
|
|
description:CreateButton(UNCHECK_ALL, function()
|
|
C_TransmogCollection.SetAllSourceTypeFilters(false);
|
|
return MenuResponse.Refresh;
|
|
end);
|
|
|
|
local function IsChecked(filter)
|
|
return C_TransmogCollection.IsSourceTypeFilterChecked(filter);
|
|
end
|
|
|
|
local function SetChecked(filter)
|
|
C_TransmogCollection.SetSourceTypeFilter(filter, not IsChecked(filter));
|
|
end
|
|
|
|
local filterIndexList = CollectionsUtil.GetSortedFilterIndexList("TRANSMOG", transmogSourceOrderPriorities);
|
|
for index = 1, C_TransmogCollection.GetNumTransmogSources() do
|
|
local filterIndex = filterIndexList[i] and filterIndexList[i].index or index;
|
|
description:CreateCheckbox(_G["TRANSMOG_SOURCE_"..filterIndex], IsChecked, SetChecked, filterIndex);
|
|
end
|
|
|
|
end
|
|
|
|
self.FilterButton:SetIsDefaultCallback(function()
|
|
return C_TransmogCollection.IsUsingDefaultFilters();
|
|
end);
|
|
|
|
self.FilterButton:SetDefaultCallback(function()
|
|
return C_TransmogCollection.SetDefaultFilters();
|
|
end);
|
|
|
|
local function shouldShowHidden()
|
|
return addon.Profile.ShowHidden;
|
|
end
|
|
|
|
local function setShowHidden()
|
|
addon.Profile.ShowHidden = not addon.Profile.ShowHidden;
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList();
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:UpdateItems();
|
|
end
|
|
|
|
if C_Transmog.IsAtTransmogNPC() then
|
|
self.FilterButton:SetText(SOURCES);
|
|
self.FilterButton:SetupMenu(function(dropdown, rootDescription)
|
|
rootDescription:SetTag("MENU_WARDROBE_FILTER");
|
|
|
|
CreateSourceFilters(rootDescription);
|
|
end);
|
|
else
|
|
self.FilterButton:SetupMenu(function(dropdown, rootDescription)
|
|
rootDescription:SetTag("MENU_WARDROBE_FILTER");
|
|
|
|
rootDescription:CreateCheckbox(L["Show Hidden Items"], shouldShowHidden, setShowHidden);
|
|
rootDescription:CreateCheckbox(COLLECTED, C_TransmogCollection.GetCollectedShown, function()
|
|
C_TransmogCollection.SetCollectedShown(not C_TransmogCollection.GetCollectedShown());
|
|
end);
|
|
|
|
rootDescription:CreateCheckbox(NOT_COLLECTED, C_TransmogCollection.GetUncollectedShown, function()
|
|
C_TransmogCollection.SetUncollectedShown(not C_TransmogCollection.GetUncollectedShown());
|
|
end);
|
|
|
|
rootDescription:CreateCheckbox(TRANSMOG_SHOW_ALL_FACTIONS, C_TransmogCollection.GetAllFactionsShown, function()
|
|
C_TransmogCollection.SetAllFactionsShown(not C_TransmogCollection.GetAllFactionsShown());
|
|
end);
|
|
|
|
rootDescription:CreateCheckbox(TRANSMOG_SHOW_ALL_RACES, C_TransmogCollection.GetAllRacesShown, function()
|
|
C_TransmogCollection.SetAllRacesShown(not C_TransmogCollection.GetAllRacesShown());
|
|
end);
|
|
|
|
local submenu = rootDescription:CreateButton(SOURCES);
|
|
CreateSourceFilters(submenu);
|
|
end);
|
|
end
|
|
end
|
|
|
|
local FILTER_SOURCES = {L["MISC"], L["Classic Set"], L["Quest Set"], L["Dungeon Set"], L["Raid Set"], L["Recolor"], L["PvP"],L["Garrison"], L["Island Expedition"], L["Warfronts"], L["Covenants"], L["Trading Post"], L["Holiday"], L["NOTE_119"],L["NOTE_120"]}
|
|
local EXPANSIONS = {EXPANSION_NAME0, EXPANSION_NAME1, EXPANSION_NAME2, EXPANSION_NAME3, EXPANSION_NAME4, EXPANSION_NAME5, EXPANSION_NAME6, EXPANSION_NAME7, EXPANSION_NAME8, EXPANSION_NAME9,EXPANSION_NAME10}
|
|
|
|
addon.Filters = {
|
|
["Base"] = {
|
|
["filterCollected"] = {true, true},
|
|
["missingSelection"] = {},
|
|
["filterSelection"] = {},
|
|
["xpacSelection"] = {},
|
|
},
|
|
["Extra"] = {
|
|
["filterCollected"] = {true, true},
|
|
["missingSelection"] = {},
|
|
["filterSelection"] = {},
|
|
["xpacSelection"] = {},
|
|
},
|
|
|
|
}
|
|
local filterCollected = addon.Filters.Base.filterCollected;
|
|
local missingSelection = addon.Filters.Base.missingSelection;
|
|
local filterSelection = addon.Filters.Base.filterSelection;
|
|
local xpacSelection = addon.Filters.Base.xpacSelection;
|
|
local sets = {"Base", "Extra"}
|
|
|
|
for i, types in ipairs(sets) do
|
|
for i = 1, #FILTER_SOURCES do
|
|
addon.Filters[types].filterSelection[i] = true;
|
|
end
|
|
|
|
for i = 1, #EXPANSIONS do
|
|
addon.Filters[types].xpacSelection[i] = true;
|
|
end
|
|
|
|
for i in pairs(addon.Globals.locationDropDown) do
|
|
|
|
addon.Filters[types].missingSelection[i] = true;
|
|
end
|
|
end
|
|
|
|
local function RefreshLists()
|
|
local atTransmog =C_Transmog.IsAtTransmogNPC()
|
|
if atTransmog then
|
|
addon.SetsDataProvider:ClearUsableSets()
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:UpdateSets()
|
|
else
|
|
addon.SetsDataProvider:ClearBaseSets()
|
|
addon.SetsDataProvider:ClearVariantSets()
|
|
addon.SetsDataProvider:ClearUsableSets()
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:Refresh()
|
|
end
|
|
end
|
|
addon.RefreshLists = RefreshLists;
|
|
local locationDropDown = addon.Globals.locationDropDown;
|
|
|
|
function BetterWardrobeCollectionFrameMixin:InitBaseSetsFilterButton()
|
|
self.FilterButton:SetIsDefaultCallback(function()
|
|
return C_TransmogSets.IsUsingDefaultBaseSetsFilters();
|
|
end);
|
|
|
|
self.FilterButton:SetDefaultCallback(function()
|
|
return C_TransmogSets.SetDefaultBaseSetsFilters();
|
|
end);
|
|
|
|
self.FilterButton:SetupMenu(function(dropdown, rootDescription)
|
|
rootDescription:SetTag("MENU_WARDROBE_BASE_SETS_FILTER");
|
|
|
|
local function GetBaseSetsFilter(filter)
|
|
C_TransmogSets.SetBaseSetsFilter(filter, not C_TransmogSets.GetBaseSetsFilter(filter));
|
|
end
|
|
|
|
local function shouldShowHidden()
|
|
return addon.Profile.ShowHidden;
|
|
end
|
|
|
|
local function setShowHidden()
|
|
addon.Profile.ShowHidden = not addon.Profile.ShowHidden;
|
|
RefreshLists();
|
|
end
|
|
|
|
local function ShowIgnoreClassRestrictions()
|
|
return addon.Profile.IgnoreClassRestrictions;
|
|
end
|
|
|
|
local function setIgnoreClassRestrictions()
|
|
addon.Profile.IgnoreClassRestrictions = not addon.Profile.IgnoreClassRestrictions;
|
|
addon.Init:InitDB();
|
|
RefreshLists();
|
|
end
|
|
local function ShowFactionOnly()
|
|
return addon.Profile.CurrentFactionSets;
|
|
end
|
|
|
|
local function setShowFactionOnly()
|
|
addon.Profile.CurrentFactionSets = not addon.Profile.CurrentFactionSets;
|
|
addon.Init:InitDB();
|
|
RefreshLists();
|
|
end
|
|
|
|
--rootDescription:CreateCheckbox(L["Ignore Class Restriction Filter"], ShowIgnoreClassRestrictions, setIgnoreClassRestrictions, 5);
|
|
|
|
rootDescription:CreateCheckbox(L["Show Only Player's Faction"], ShowFactionOnly, setShowFactionOnly, 5);
|
|
|
|
rootDescription:CreateDivider();
|
|
rootDescription:CreateCheckbox(L["Combine Special Sets"],
|
|
function()
|
|
return addon.Profile.CombineSpecial
|
|
end,
|
|
function()
|
|
addon.Profile.CombineSpecial = not addon.Profile.CombineSpecial;
|
|
--addon.Init:BuildDB()
|
|
--BetterWardrobeCollectionFrame.SetsTransmogFrame:UpdateProgressBar()
|
|
addon.Init:InitDB()
|
|
RefreshLists()
|
|
|
|
end, 6);
|
|
|
|
rootDescription:CreateCheckbox(L["Combine Trading Post Sets"],
|
|
function()
|
|
return addon.Profile.CombineTradingPost
|
|
end,
|
|
function()
|
|
addon.Profile.CombineTradingPost = not addon.Profile.CombineTradingPost;
|
|
--addon.Init:BuildDB()
|
|
--BetterWardrobeCollectionFrame.SetsTransmogFrame:UpdateProgressBar()
|
|
addon.Init:InitDB()
|
|
RefreshLists()
|
|
|
|
end, 6);
|
|
|
|
----TODO: FIX
|
|
--[[
|
|
rootDescription:CreateCheckbox(L["Hide Unavailable Sets"],
|
|
function()
|
|
return not addon.Profile.HideUnavalableSets;
|
|
end,
|
|
function()
|
|
addon.Profile.HideUnavalableSets = not addon.Profile.HideUnavalableSets;
|
|
--addon.Init:BuildDB()
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:UpdateProgressBar()
|
|
RefreshLists()
|
|
end, 7);
|
|
]]--
|
|
rootDescription:CreateDivider();
|
|
|
|
rootDescription:CreateCheckbox(COLLECTED, C_TransmogSets.GetBaseSetsFilter, GetBaseSetsFilter, LE_TRANSMOG_SET_FILTER_COLLECTED);
|
|
rootDescription:CreateCheckbox(NOT_COLLECTED, C_TransmogSets.GetBaseSetsFilter, GetBaseSetsFilter, LE_TRANSMOG_SET_FILTER_UNCOLLECTED);
|
|
rootDescription:CreateDivider();
|
|
rootDescription:CreateCheckbox(TRANSMOG_SET_PVE, C_TransmogSets.GetBaseSetsFilter, GetBaseSetsFilter, LE_TRANSMOG_SET_FILTER_PVE);
|
|
rootDescription:CreateCheckbox(TRANSMOG_SET_PVP, C_TransmogSets.GetBaseSetsFilter, GetBaseSetsFilter, LE_TRANSMOG_SET_FILTER_PVP);
|
|
rootDescription:CreateDivider();
|
|
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
|
|
local submenu = rootDescription:CreateButton(SOURCES);
|
|
submenu:CreateButton(CHECK_ALL, function()
|
|
for index = 1, #FILTER_SOURCES do
|
|
filterSelection[index] = true;
|
|
end
|
|
RefreshLists();
|
|
end);
|
|
|
|
submenu:CreateButton(UNCHECK_ALL, function()
|
|
for index = 1, #FILTER_SOURCES do
|
|
filterSelection[index] = false;
|
|
end
|
|
RefreshLists();
|
|
|
|
end);
|
|
|
|
submenu:CreateDivider();
|
|
|
|
for index = 1, #FILTER_SOURCES do
|
|
local filterIndex = index;
|
|
submenu:CreateCheckbox(FILTER_SOURCES[index],
|
|
function() return filterSelection[index] end,
|
|
function()
|
|
filterSelection[index] = not filterSelection[index];
|
|
RefreshLists()
|
|
end,
|
|
index);
|
|
end
|
|
end
|
|
|
|
local submenu = rootDescription:CreateButton(L["Expansion"]);
|
|
submenu:CreateButton(CHECK_ALL, function()
|
|
for i = 1, #xpacSelection do
|
|
xpacSelection[i] = true;
|
|
end
|
|
RefreshLists()
|
|
end);
|
|
|
|
submenu:CreateButton(UNCHECK_ALL, function()
|
|
for i = 1, #xpacSelection do
|
|
xpacSelection[i] = false;
|
|
end
|
|
RefreshLists()
|
|
end);
|
|
|
|
submenu:CreateDivider();
|
|
|
|
local filterIndexList = CollectionsUtil.GetSortedFilterIndexList("TRANSMOG", transmogSourceOrderPriorities);
|
|
local numSources = #EXPANSIONS --C_TransmogCollection.GetNumTransmogSources()
|
|
for index = 1, numSources do
|
|
local filterIndex = index;
|
|
submenu:CreateCheckbox(EXPANSIONS[index],
|
|
function()
|
|
return xpacSelection[index]
|
|
end,
|
|
function()
|
|
xpacSelection[index] = not xpacSelection[index];
|
|
RefreshLists()
|
|
end,
|
|
index);
|
|
end
|
|
|
|
local locationDropDown = addon.Globals.locationDropDown;
|
|
|
|
local submenu = rootDescription:CreateButton("Missing");
|
|
submenu:CreateButton(CHECK_ALL, function()
|
|
for i in pairs(locationDropDown) do
|
|
missingSelection[i] = true;
|
|
end
|
|
RefreshLists()
|
|
end);
|
|
|
|
submenu:CreateButton(UNCHECK_ALL, function()
|
|
for i in pairs(locationDropDown) do
|
|
missingSelection[i] = false;
|
|
end
|
|
RefreshLists()
|
|
end);
|
|
|
|
submenu:CreateDivider();
|
|
for index, id in pairs(locationDropDown) do
|
|
if index ~= 21 then --Skip "robe" type;
|
|
submenu:CreateCheckbox(id,
|
|
function()
|
|
return missingSelection[index]
|
|
end,
|
|
function()
|
|
missingSelection[index] = not missingSelection[index];
|
|
RefreshLists()
|
|
end,
|
|
index);
|
|
end
|
|
end
|
|
end);
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:GetActiveTab()
|
|
if C_Transmog.IsAtTransmogNPC() then
|
|
return self.selectedTransmogTab;
|
|
else
|
|
return self.selectedCollectionTab;
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:OnLoad()
|
|
PanelTemplates_SetNumTabs(self, 4);
|
|
PanelTemplates_SetTab(self, TAB_ITEMS);
|
|
PanelTemplates_ResizeTabsToFit(self, TABS_MAX_WIDTH);
|
|
self.selectedCollectionTab = TAB_ITEMS;
|
|
self.selectedTransmogTab = TAB_ITEMS;
|
|
|
|
CollectionsJournal:SetPortraitToAsset("Interface\\Icons\\inv_misc_enggizmos_19");
|
|
|
|
self.FilterButton:SetWidth(85);
|
|
self.activeFrame = self.ItemsCollectionFrame
|
|
|
|
-- TODO: Remove this at the next deprecation reset
|
|
self.searchBox = self.SearchBox;
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:OnEvent(event, ...)
|
|
if ( event == "TRANSMOG_COLLECTION_ITEM_UPDATE" ) then
|
|
if ( self.tooltipContentFrame ) then
|
|
self.tooltipContentFrame:RefreshAppearanceTooltip();
|
|
end
|
|
if ( self.ItemsCollectionFrame:IsShown() ) then
|
|
self.ItemsCollectionFrame:ValidateChosenVisualSources();
|
|
end
|
|
elseif ( event == "UNIT_FORM_CHANGED" ) then
|
|
self:HandleFormChanged();
|
|
elseif ( event == "PLAYER_LEVEL_UP" or event == "SKILL_LINES_CHANGED" or event == "UPDATE_FACTION" or event == "SPELLS_CHANGED" ) then
|
|
self:UpdateUsableAppearances();
|
|
elseif ( event == "TRANSMOG_SEARCH_UPDATED" ) then
|
|
local searchType, arg1 = ...;
|
|
if ( searchType == self:GetSearchType() ) then
|
|
self.activeFrame:OnSearchUpdate(arg1);
|
|
end
|
|
elseif ( event == "SEARCH_DB_LOADED" ) then
|
|
self:RestartSearchTracking();
|
|
elseif ( event == "UI_SCALE_CHANGED" or event == "DISPLAY_SIZE_CHANGED" or event == "TRANSMOG_COLLECTION_CAMERA_UPDATE" ) then
|
|
self:RefreshCameras();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:HandleFormChanged()
|
|
local hasAlternateForm, inAlternateForm = C_PlayerInfo.GetAlternateFormInfo();
|
|
self.needsFormChangedHandling = false;
|
|
if ( self.inAlternateForm ~= inAlternateForm or self.updateOnModelChanged ) then
|
|
if ( self.activeFrame:OnUnitModelChangedEvent() ) then
|
|
self.inAlternateForm = inAlternateForm;
|
|
self.updateOnModelChanged = nil;
|
|
else
|
|
self.needsFormChangedHandling = true;
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function BetterWardrobeCollectionFrameMixin:OnUpdate()
|
|
if self.needsFormChangedHandling then
|
|
self:HandleFormChanged();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:OnShow()
|
|
playerClassName,playerClass, classID = UnitClass("player");
|
|
|
|
CollectionsJournal:SetPortraitToAsset("Interface\\Icons\\inv_chest_cloth_17");
|
|
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_ITEM_UPDATE");
|
|
self:RegisterUnitEvent("UNIT_FORM_CHANGED", "player");
|
|
self:RegisterEvent("TRANSMOG_SEARCH_UPDATED");
|
|
self:RegisterEvent("SEARCH_DB_LOADED");
|
|
self:RegisterEvent("PLAYER_LEVEL_UP");
|
|
self:RegisterEvent("SKILL_LINES_CHANGED");
|
|
self:RegisterEvent("UPDATE_FACTION");
|
|
self:RegisterEvent("SPELLS_CHANGED");
|
|
self:RegisterEvent("UI_SCALE_CHANGED");
|
|
self:RegisterEvent("DISPLAY_SIZE_CHANGED");
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_CAMERA_UPDATE");
|
|
|
|
local hasAlternateForm, inAlternateForm = C_PlayerInfo.GetAlternateFormInfo();
|
|
self.inAlternateForm = inAlternateForm;
|
|
|
|
local isAtTransmogNPC = C_Transmog.IsAtTransmogNPC();
|
|
--self.InfoButton:SetShown(not isAtTransmogNPC);
|
|
if isAtTransmogNPC then
|
|
self:SetTab(self.selectedTransmogTab);
|
|
else
|
|
self:SetTab(self.selectedCollectionTab);
|
|
end
|
|
self:UpdateTabButtons();
|
|
|
|
addon.selectedArmorType = addon.Globals.CLASS_INFO[playerClass][3]
|
|
addon.refreshData = true;
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:OnHide()
|
|
self:UnregisterEvent("TRANSMOG_COLLECTION_ITEM_UPDATE");
|
|
self:UnregisterEvent("UNIT_FORM_CHANGED");
|
|
self:UnregisterEvent("TRANSMOG_SEARCH_UPDATED");
|
|
self:UnregisterEvent("SEARCH_DB_LOADED");
|
|
self:UnregisterEvent("PLAYER_LEVEL_UP");
|
|
self:UnregisterEvent("SKILL_LINES_CHANGED");
|
|
self:UnregisterEvent("UPDATE_FACTION");
|
|
self:UnregisterEvent("SPELLS_CHANGED");
|
|
self:UnregisterEvent("UI_SCALE_CHANGED");
|
|
self:UnregisterEvent("DISPLAY_SIZE_CHANGED");
|
|
self:UnregisterEvent("TRANSMOG_COLLECTION_CAMERA_UPDATE");
|
|
C_TransmogCollection.EndSearch();
|
|
self.jumpToVisualID = nil;
|
|
for i, frame in ipairs(self.ContentFrames) do
|
|
frame:Hide();
|
|
end
|
|
end
|
|
|
|
local function SetPropagateKeyboardInput(frame, value)
|
|
if InCombatLockdown() then return end
|
|
|
|
frame:SetPropagateKeyboardInput(value)
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:OnKeyDown(key)
|
|
if self.tooltipCycle and key == WARDROBE_CYCLE_KEY then
|
|
SetPropagateKeyboardInput(self, false);
|
|
if IsShiftKeyDown() then
|
|
self.tooltipSourceIndex = self.tooltipSourceIndex - 1;
|
|
else
|
|
self.tooltipSourceIndex = self.tooltipSourceIndex + 1;
|
|
end
|
|
self.tooltipContentFrame:RefreshAppearanceTooltip();
|
|
elseif key == WARDROBE_PREV_VISUAL_KEY or key == WARDROBE_NEXT_VISUAL_KEY or key == WARDROBE_UP_VISUAL_KEY or key == WARDROBE_DOWN_VISUAL_KEY then
|
|
if self.activeFrame:CanHandleKey(key) then
|
|
SetPropagateKeyboardInput(self, false);
|
|
self.activeFrame:HandleKey(key);
|
|
else
|
|
SetPropagateKeyboardInput(self, true);
|
|
end
|
|
else
|
|
SetPropagateKeyboardInput(self, true);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:OpenTransmogLink(link)
|
|
if ( not CollectionsJournal:IsVisible() or not self:IsVisible() ) then
|
|
ToggleCollectionsJournal(5);
|
|
end
|
|
|
|
local linkType, id = strsplit(":", link);
|
|
C_Timer.After(0, function()
|
|
|
|
if ( linkType == "transmogappearance" ) then
|
|
local sourceID = tonumber(id);
|
|
self:SetTab(TAB_ITEMS);
|
|
-- For links a base appearance is fine
|
|
local categoryID = C_TransmogCollection.GetAppearanceSourceInfo(sourceID);
|
|
local slot = CollectionWardrobeUtil.GetSlotFromCategoryID(categoryID);
|
|
local transmogLocation = TransmogUtil.GetTransmogLocation(slot, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
self.ItemsCollectionFrame:GoToSourceID(sourceID, transmogLocation);
|
|
elseif ( linkType == "BW_transmogset" or linkType == "transmogset") then
|
|
local setID = tonumber(id);
|
|
self:SetTab(TAB_SETS);
|
|
self.SetsCollectionFrame:SelectSet(setID);
|
|
self.SetsCollectionFrame:ScrollToSet(self.SetsCollectionFrame:GetSelectedSetID(), ScrollBoxConstants.AlignCenter);
|
|
elseif ( linkType == "BW_transmogset-extra") then
|
|
local setID = tonumber(id);
|
|
addon:RegisterMessage("BW_TRANSMOG_EXTRASETSHOWN", function(self)
|
|
addon:UnregisterMessage("BW_TRANSMOG_EXTRASETSHOWN");
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:DisplaySet(setID);
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:ScrollToSet(setID);
|
|
end)
|
|
|
|
local setInfo = addon.GetSetInfo(setID);
|
|
local armorType = setInfo.armorType;
|
|
if armorType ~= addon.selectedArmorType then
|
|
self:SetTab(TAB_EXTRASETS);
|
|
addon.selectedArmorType = armorType;
|
|
|
|
else
|
|
self:SetTab(TAB_ITEMS);
|
|
self:SetTab(TAB_EXTRASETS);
|
|
end
|
|
self.SetsCollectionFrame:SelectSet(setID);
|
|
|
|
|
|
--BetterWardrobeCollectionFrame:SetTab(TAB_EXTRASETS);
|
|
--BetterWardrobeCollectionFrame.SetsCollectionFrame:SelectSet(setID);
|
|
--BetterWardrobeCollectionFrame.SetsCollectionFrame:DisplaySet(setID)
|
|
--BetterWardrobeCollectionFrame.SetsCollectionFrame:ScrollToSet(setID)
|
|
end
|
|
|
|
end)
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:GoToItem(sourceID)
|
|
self:SetTab(TAB_ITEMS);
|
|
local categoryID = C_TransmogCollection.GetAppearanceSourceInfo(sourceID);
|
|
local slot = CollectionWardrobeUtil.GetSlotFromCategoryID(categoryID);
|
|
if slot then
|
|
local transmogLocation = TransmogUtil.GetTransmogLocation(slot, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
self.ItemsCollectionFrame:GoToSourceID(sourceID, transmogLocation);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:GoToSet(setID)
|
|
self:SetTab(TAB_SETS);
|
|
self.SetsCollectionFrame:SelectSet(setID);
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:UpdateTabButtons()
|
|
-- sets tab
|
|
self.SetsTab.FlashFrame:SetShown(C_TransmogSets.GetLatestSource() ~= Constants.Transmog.NoTransmogID and not C_Transmog.IsAtTransmogNPC());
|
|
self.ExtraSetsTab.FlashFrame:SetShown(newTransmogInfo["latestSource"] and (newTransmogInfo["latestSource"] ~= Constants.Transmog.NoTransmogID) and not C_Transmog.IsAtTransmogNPC());
|
|
|
|
end
|
|
|
|
local function IsAnySourceCollected(sources)
|
|
for i, source in ipairs(sources) do
|
|
if source.isCollected then
|
|
return true;
|
|
end
|
|
end
|
|
|
|
return false;
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:SetAppearanceTooltip(contentFrame, sources, primarySourceID, warningString, slot)
|
|
self.tooltipContentFrame = contentFrame;
|
|
local selectedIndex = self.tooltipSourceIndex;
|
|
local showUseError = true;
|
|
local inLegionArtifactCategory = TransmogUtil.IsCategoryLegionArtifact(self.ItemsCollectionFrame:GetActiveCategory());
|
|
local subheaderString = nil;
|
|
local showTrackingInfo = not IsAnySourceCollected(sources) and not C_Transmog.IsAtTransmogNPC();
|
|
if BetterWardrobeCollectionFrame.activeFrame == BetterWardrobeCollectionFrame.SetsCollectionFrame then
|
|
showTrackingInfo = false;
|
|
end
|
|
self.tooltipSourceIndex, self.tooltipCycle = CollectionWardrobeUtil.SetAppearanceTooltip(GameTooltip, sources, primarySourceID, selectedIndex, showUseError, inLegionArtifactCategory, subheaderString, warningString, showTrackingInfo, slot);
|
|
|
|
local index = 1;
|
|
if selectedIndex then
|
|
index = selectedIndex - 1;
|
|
end
|
|
|
|
local itemID = sources[index] and sources[index].itemID;
|
|
local visualID = sources[index] and sources[index].visualID;
|
|
local sourceID = sources[index] and sources[index].sourceID;
|
|
|
|
if addon.Profile.ShowItemIDTooltips and itemID then
|
|
GameTooltip_AddNormalLine(GameTooltip, "ItemID: " .. itemID);
|
|
GameTooltip:Show();
|
|
end
|
|
|
|
if addon.Profile.ShowVisualIDTooltips and visualID then
|
|
GameTooltip_AddNormalLine(GameTooltip, "VisualID: " .. visualID);
|
|
GameTooltip:Show();
|
|
end
|
|
|
|
if addon.Profile.ShowVisualIDTooltips and sourceID then
|
|
GameTooltip_AddNormalLine(GameTooltip, "SourceID: " .. sourceID);
|
|
GameTooltip:Show();
|
|
end
|
|
|
|
if addon.Profile.ShowILevelTooltips and itemID then
|
|
local GetItemInfo = C_Item and C_Item.GetItemInfo
|
|
local ilevel = select(4, GetItemInfo(itemID))
|
|
if ilevel then
|
|
GameTooltip_AddNormalLine(GameTooltip, "ILevel: " .. ilevel);
|
|
GameTooltip:Show();
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:HideAppearanceTooltip()
|
|
self.tooltipContentFrame = nil;
|
|
self.tooltipCycle = nil;
|
|
self.tooltipSourceIndex = nil;
|
|
GameTooltip:Hide();
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:UpdateUsableAppearances()
|
|
if not self.updateUsableAppearances then
|
|
self.updateUsableAppearances = true;
|
|
C_Timer.After(0, function() self.updateUsableAppearances = nil; C_TransmogCollection.UpdateUsableAppearances(); end); --Causes Taint
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:RefreshCameras()
|
|
for i, frame in ipairs(self.ContentFrames) do
|
|
frame:RefreshCameras();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:GetAppearanceNameTextAndColor(appearanceInfo)
|
|
local inLegionArtifactCategory = TransmogUtil.IsCategoryLegionArtifact(self.ItemsCollectionFrame:GetActiveCategory());
|
|
return CollectionWardrobeUtil.GetAppearanceNameTextAndColor(appearanceInfo, inLegionArtifactCategory);
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:GetAppearanceSourceTextAndColor(appearanceInfo)
|
|
return CollectionWardrobeUtil.GetAppearanceSourceTextAndColor(appearanceInfo);
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:GetAppearanceItemHyperlink(appearanceInfo)
|
|
local link = select(6, C_TransmogCollection.GetAppearanceSourceInfo(appearanceInfo.sourceID));
|
|
if self.selectedTransmogTab == TAB_ITEMS and self.ItemsCollectionFrame:GetActiveCategory() == Enum.TransmogCollectionType.Paired then
|
|
local artifactName, artifactLink = C_TransmogCollection.GetArtifactAppearanceStrings(appearanceInfo.sourceID);
|
|
if artifactLink then
|
|
link = artifactLink;
|
|
end
|
|
end
|
|
return link;
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:UpdateProgressBar(value, max)
|
|
self.progressBar:SetMinMaxValues(0, max);
|
|
self.progressBar:SetValue(value);
|
|
self.progressBar.text:SetFormattedText(HEIRLOOMS_PROGRESS_FORMAT, value, max);
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:SwitchSearchCategory()
|
|
if self.ItemsCollectionFrame.transmogLocation:IsIllusion() then
|
|
self:ClearSearch();
|
|
self.SearchBox:Disable();
|
|
self.FilterButton:Disable();
|
|
return;
|
|
end
|
|
|
|
self.SearchBox:Enable();
|
|
self.FilterButton:Enable();
|
|
if self.SearchBox:GetText() ~= "" then
|
|
local finished = C_TransmogCollection.SetSearch(self:GetSearchType(), self.SearchBox:GetText());
|
|
if not finished then
|
|
self:RestartSearchTracking();
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:RestartSearchTracking()
|
|
if self.activeFrame.transmogLocation and self.activeFrame.transmogLocation:IsIllusion() then
|
|
return;
|
|
end
|
|
|
|
self.SearchBox.ProgressFrame:Hide();
|
|
self.SearchBox.updateDelay = 0;
|
|
if not C_TransmogCollection.IsSearchInProgress(self:GetSearchType()) then
|
|
self.activeFrame:OnSearchUpdate();
|
|
else
|
|
self.SearchBox:StartCheckingProgress();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:SetSearch(text)
|
|
if text == "" then
|
|
C_TransmogCollection.ClearSearch(self:GetSearchType());
|
|
else
|
|
C_TransmogCollection.SetSearch(self:GetSearchType(), text);
|
|
end
|
|
self:RestartSearchTracking();
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:ClearSearch(searchType)
|
|
self.SearchBox:SetText("");
|
|
self.SearchBox.ProgressFrame:Hide();
|
|
C_TransmogCollection.ClearSearch(searchType or self:GetSearchType());
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:GetSearchType()
|
|
return self.activeFrame.searchType;
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:ShowItemTrackingHelptipOnShow()
|
|
if (not GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_MODEL_CLICK)) then
|
|
self.fromSuggestedContent = true;
|
|
end
|
|
end
|
|
|
|
BetterWardrobeItemsCollectionSlotButtonMixin = { }
|
|
|
|
function BetterWardrobeItemsCollectionSlotButtonMixin:OnClick()
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_GEAR_SLOT_CLICK);
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:SetActiveSlot(self.transmogLocation);
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionSlotButtonMixin:OnEnter()
|
|
if self.transmogLocation:IsIllusion() then
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
|
GameTooltip:SetText(WEAPON_ENCHANTMENT);
|
|
else
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
|
local slotName = _G[self.slot];
|
|
-- for shoulders check if equipped item has the secondary appearance toggled on
|
|
if self.transmogLocation:GetSlotName() == "SHOULDERSLOT" then
|
|
local itemLocation = TransmogUtil.GetItemLocationFromTransmogLocation(self.transmogLocation);
|
|
if TransmogUtil.IsSecondaryTransmoggedForItemLocation(itemLocation) then
|
|
if self.transmogLocation:IsSecondary() then
|
|
slotName = LEFTSHOULDERSLOT;
|
|
else
|
|
slotName = RIGHTSHOULDERSLOT;
|
|
end
|
|
end
|
|
end
|
|
GameTooltip:SetText(slotName);
|
|
end
|
|
end
|
|
|
|
BetterWardrobeItemsCollectionMixin = { };
|
|
|
|
local spacingNoSmallButton = 2;
|
|
local spacingWithSmallButton = 12;
|
|
local defaultSectionSpacing = 24;
|
|
local shorterSectionSpacing = 19;
|
|
|
|
function BetterWardrobeItemsCollectionMixin:CreateSlotButtons()
|
|
local slots = { "head", "shoulder", "back", "chest", "shirt", "tabard", "wrist", defaultSectionSpacing, "hands", "waist", "legs", "feet", defaultSectionSpacing, "mainhand", spacingWithSmallButton, "secondaryhand" };
|
|
local parentFrame = self.SlotsFrame;
|
|
local lastButton;
|
|
local xOffset = spacingNoSmallButton;
|
|
for i = 1, #slots do
|
|
local value = tonumber(slots[i]);
|
|
if ( value ) then
|
|
-- this is a spacer
|
|
xOffset = value;
|
|
else
|
|
local slotString = slots[i];
|
|
local button = CreateFrame("BUTTON", nil, parentFrame, "BetterWardrobeSlotButtonTemplate");
|
|
button.NormalTexture:SetAtlas("transmog-nav-slot-"..slotString, true);
|
|
if ( lastButton ) then
|
|
button:SetPoint("LEFT", lastButton, "RIGHT", xOffset, 0);
|
|
else
|
|
button:SetPoint("TOPLEFT");
|
|
end
|
|
button.slot = string.upper(slotString).."SLOT";
|
|
xOffset = spacingNoSmallButton;
|
|
lastButton = button;
|
|
-- small buttons
|
|
if ( slotString == "mainhand" or slotString == "secondaryhand" or slotString == "shoulder" ) then
|
|
local smallButton = CreateFrame("BUTTON", nil, parentFrame, "BetterWardrobeSmallSlotButtonTemplate");
|
|
smallButton:SetPoint("BOTTOMRIGHT", button, "TOPRIGHT", 16, -15);
|
|
smallButton.slot = button.slot;
|
|
if ( slotString == "shoulder" ) then
|
|
smallButton.transmogLocation = TransmogUtil.GetTransmogLocation(smallButton.slot, Enum.TransmogType.Appearance, Enum.TransmogModification.Secondary);
|
|
|
|
smallButton.NormalTexture:SetAtlas("transmog-nav-slot-shoulder", false);
|
|
smallButton:Hide();
|
|
else
|
|
smallButton.transmogLocation = TransmogUtil.GetTransmogLocation(smallButton.slot, Enum.TransmogType.Illusion, Enum.TransmogModification.Main);
|
|
end
|
|
end
|
|
|
|
button.transmogLocation = TransmogUtil.GetTransmogLocation(button.slot, button.transmogType, button.modification);
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:OnEvent(event, ...)
|
|
if ( event == "TRANSMOGRIFY_UPDATE" or event == "TRANSMOGRIFY_SUCCESS" or event == "PLAYER_EQUIPMENT_CHANGED" ) then
|
|
local slotID = ...;
|
|
if ( slotID and self.transmogLocation:IsAppearance() ) then
|
|
if ( slotID == self.transmogLocation:GetSlotID() ) then
|
|
self:UpdateItems();
|
|
end
|
|
else
|
|
-- generic update
|
|
self:UpdateItems();
|
|
end
|
|
if event == "PLAYER_EQUIPMENT_CHANGED" then
|
|
if C_Transmog.CanHaveSecondaryAppearanceForSlotID(slotID) then
|
|
self:UpdateSlotButtons();
|
|
end
|
|
end
|
|
elseif ( event == "TRANSMOG_COLLECTION_UPDATED") then
|
|
self:CheckLatestAppearance(true);
|
|
self:ValidateChosenVisualSources();
|
|
if ( self:IsVisible() ) then
|
|
self:RefreshVisualsList();
|
|
self:UpdateItems();
|
|
end
|
|
BetterWardrobeCollectionFrame:UpdateTabButtons();
|
|
elseif ( event == "TRANSMOG_COLLECTION_ITEM_UPDATE" ) then
|
|
if ( self:IsVisible() ) then
|
|
for i = 1, #self.Models do
|
|
self.Models[i]:UpdateContentTracking();
|
|
self.Models[i]:UpdateTrackingDisabledOverlay();
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:CheckLatestAppearance(changeTab)
|
|
local latestAppearanceID, latestAppearanceCategoryID = C_TransmogCollection.GetLatestAppearance();
|
|
if ( self.latestAppearanceID ~= latestAppearanceID ) then
|
|
self.latestAppearanceID = latestAppearanceID;
|
|
self.jumpToLatestAppearanceID = latestAppearanceID;
|
|
self.jumpToLatestCategoryID = latestAppearanceCategoryID;
|
|
|
|
--if ( changeTab and not CollectionsJournal:IsShown() ) then
|
|
--CollectionsJournal_SetTab(CollectionsJournal, 5);
|
|
--end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:OnLoad()
|
|
self:CreateSlotButtons();
|
|
self.BGCornerTopLeft:Hide();
|
|
self.BGCornerTopRight:Hide();
|
|
self.HiddenModel:SetKeepModelOnHide(true);
|
|
|
|
self.chosenVisualSources = { };
|
|
|
|
self.NUM_ROWS = 3;
|
|
self.NUM_COLS = 6;
|
|
self.PAGE_SIZE = self.NUM_ROWS * self.NUM_COLS;
|
|
|
|
self.WeaponDropdown:SetWidth(157);
|
|
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_UPDATED");
|
|
|
|
self:CheckLatestAppearance();
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:CheckHelpTip()
|
|
--[[
|
|
if (C_Transmog.IsAtTransmogNPC()) then
|
|
if (GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_SETS_VENDOR_TAB)) then
|
|
return;
|
|
end
|
|
|
|
if (not GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_SPECS_BUTTON)) then
|
|
return;
|
|
end
|
|
|
|
if (not GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_OUTFIT_DROPDOWN)) then
|
|
return;
|
|
end
|
|
|
|
local sets = C_TransmogSets.GetAllSets();
|
|
local hasCollected = false;
|
|
if (sets) then
|
|
for i = 1, #sets do
|
|
if (sets[i].collected) then
|
|
hasCollected = true;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
if (not hasCollected) then
|
|
return;
|
|
end
|
|
|
|
local helpTipInfo = {
|
|
text = TRANSMOG_SETS_VENDOR_TUTORIAL,
|
|
buttonStyle = HelpTip.ButtonStyle.Close,
|
|
cvarBitfield = "closedInfoFrames",
|
|
bitfieldFlag = LE_FRAME_TUTORIAL_TRANSMOG_SETS_VENDOR_TAB,
|
|
targetPoint = HelpTip.Point.BottomEdgeCenter,
|
|
};
|
|
HelpTip:Show(BetterWardrobeCollectionFrame, helpTipInfo, BetterWardrobeCollectionFrame.SetsTab);
|
|
else
|
|
if (GetCVarBitfield("closedInfoFramesAccountWide", LE_FRAME_TUTORIAL_ACCOUNT_TRANSMOG_SETS_TAB)) then
|
|
return;
|
|
end
|
|
|
|
local helpTipInfo = {
|
|
text = TRANSMOG_SETS_TAB_TUTORIAL,
|
|
buttonStyle = HelpTip.ButtonStyle.Close,
|
|
cvarBitfield = "closedInfoFramesAccountWide",
|
|
bitfieldFlag = LE_FRAME_TUTORIAL_ACCOUNT_TRANSMOG_SETS_TAB,
|
|
targetPoint = HelpTip.Point.BottomEdgeCenter,
|
|
checkCVars = true,
|
|
};
|
|
HelpTip:Show(BetterWardrobeCollectionFrame, helpTipInfo, BetterWardrobeCollectionFrame.SetsTab);
|
|
end
|
|
]]
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:OnShow()
|
|
self:RegisterEvent("TRANSMOGRIFY_UPDATE");
|
|
self:RegisterEvent("PLAYER_EQUIPMENT_CHANGED");
|
|
self:RegisterEvent("TRANSMOGRIFY_SUCCESS");
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_ITEM_UPDATE");
|
|
|
|
local needsUpdate = false; -- we don't need to update if we call :SetActiveSlot as that will do an update
|
|
if ( self.jumpToLatestCategoryID and self.jumpToLatestCategoryID ~= self.activeCategory and not C_Transmog.IsAtTransmogNPC() ) then
|
|
local slot = CollectionWardrobeUtil.GetSlotFromCategoryID(self.jumpToLatestCategoryID);
|
|
if slot then
|
|
-- The model got reset from OnShow, which restored all equipment.
|
|
-- But ChangeModelsSlot tries to be smart and only change the difference from the previous slot to the current slot, so some equipment will remain left on.
|
|
-- This is only set for new apperances, base transmogLocation is fine
|
|
local transmogLocation = TransmogUtil.GetTransmogLocation(slot, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
local ignorePreviousSlot = true;
|
|
self:SetActiveSlot(transmogLocation, self.jumpToLatestCategoryID, ignorePreviousSlot);
|
|
self.jumpToLatestCategoryID = nil;
|
|
else
|
|
-- In some cases getting a slot will fail (Ex. You gain a new weapon appearance but the selected class in the filter dropdown can't use that weapon type)
|
|
-- If we fail to get a slot then just default to the head slot as usual.
|
|
local transmogLocation = C_Transmog.IsAtTransmogNPC() and WardrobeTransmogFrame:GetSelectedTransmogLocation() or TransmogUtil.GetTransmogLocation("HEADSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
self:SetActiveSlot(transmogLocation);
|
|
end
|
|
elseif ( self.transmogLocation ) then
|
|
-- redo the model for the active slot
|
|
self:ChangeModelsSlot(self.transmogLocation);
|
|
needsUpdate = true;
|
|
else
|
|
local transmogLocation = C_Transmog.IsAtTransmogNPC() and WardrobeTransmogFrame:GetSelectedTransmogLocation() or TransmogUtil.GetTransmogLocation("HEADSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
self:SetActiveSlot(transmogLocation);
|
|
end
|
|
|
|
BetterWardrobeCollectionFrame.progressBar:SetShown(not TransmogUtil.IsCategoryLegionArtifact(self:GetActiveCategory()));
|
|
|
|
if ( needsUpdate ) then
|
|
BetterWardrobeCollectionFrame:UpdateUsableAppearances();
|
|
self:RefreshVisualsList();
|
|
self:UpdateItems();
|
|
self:UpdateWeaponDropdown();
|
|
end
|
|
|
|
self:UpdateSlotButtons();
|
|
|
|
-- tab tutorial
|
|
--self:CheckHelpTip();
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:OnHide()
|
|
self:UnregisterEvent("TRANSMOGRIFY_UPDATE");
|
|
self:UnregisterEvent("PLAYER_EQUIPMENT_CHANGED");
|
|
self:UnregisterEvent("TRANSMOGRIFY_SUCCESS");
|
|
self:UnregisterEvent("TRANSMOG_COLLECTION_ITEM_UPDATE");
|
|
|
|
StaticPopup_Hide("TRANSMOG_FAVORITE_WARNING");
|
|
|
|
self:GetParent():ClearSearch(Enum.TransmogSearchType.Items);
|
|
|
|
for i = 1, #self.Models do
|
|
self.Models[i]:SetKeepModelOnHide(false);
|
|
end
|
|
|
|
self.visualsList = nil;
|
|
self.filteredVisualsList = nil;
|
|
self.activeCategory = nil;
|
|
self.transmogLocation = nil;
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:DressUpVisual(visualInfo)
|
|
if self.transmogLocation:IsAppearance() then
|
|
local sourceID = self:GetAnAppearanceSourceFromVisual(visualInfo.visualID, nil);
|
|
DressUpCollectionAppearance(sourceID, self.transmogLocation, self:GetActiveCategory());
|
|
elseif self.transmogLocation:IsIllusion() then
|
|
local slot = self:GetActiveSlot();
|
|
DressUpVisual(self.illusionWeaponAppearanceID, slot, visualInfo.sourceID);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:OnMouseWheel(delta)
|
|
self.PagingFrame:OnMouseWheel(delta);
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:CanHandleKey(key)
|
|
if ( C_Transmog.IsAtTransmogNPC() and (key == WARDROBE_PREV_VISUAL_KEY or key == WARDROBE_NEXT_VISUAL_KEY or key == WARDROBE_UP_VISUAL_KEY or key == WARDROBE_DOWN_VISUAL_KEY) ) then
|
|
return true;
|
|
end
|
|
return false;
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:HandleKey(key)
|
|
local _, _, _, selectedVisualID = self:GetActiveSlotInfo();
|
|
local visualIndex;
|
|
local visualsList = self:GetFilteredVisualsList();
|
|
for i = 1, #visualsList do
|
|
if ( visualsList[i].visualID == selectedVisualID ) then
|
|
visualIndex = i;
|
|
break;
|
|
end
|
|
end
|
|
if ( visualIndex ) then
|
|
visualIndex = GetAdjustedDisplayIndexFromKeyPress(self, visualIndex, #visualsList, key);
|
|
self:SelectVisual(visualsList[visualIndex].visualID);
|
|
self.jumpToVisualID = visualsList[visualIndex].visualID;
|
|
self:ResetPage();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:ChangeModelsSlot(newTransmogLocation, oldTransmogLocation)
|
|
BetterWardrobeCollectionFrame.updateOnModelChanged = nil;
|
|
local oldSlot = oldTransmogLocation and oldTransmogLocation:GetSlotName();
|
|
local newSlot = newTransmogLocation:GetSlotName();
|
|
|
|
local undressSlot, reloadModel;
|
|
local newSlotIsArmor = newTransmogLocation:GetArmorCategoryID();
|
|
if ( newSlotIsArmor ) then
|
|
local oldSlotIsArmor = oldTransmogLocation and oldTransmogLocation:GetArmorCategoryID();
|
|
if ( oldSlotIsArmor ) then
|
|
if ( (GetUseTransmogSkin(oldSlot) ~= GetUseTransmogSkin(newSlot)) or
|
|
(WARDROBE_MODEL_SETUP[oldSlot].useTransmogChoices ~= WARDROBE_MODEL_SETUP[newSlot].useTransmogChoices) or
|
|
(WARDROBE_MODEL_SETUP[oldSlot].obeyHideInTransmogFlag ~= WARDROBE_MODEL_SETUP[newSlot].obeyHideInTransmogFlag) ) then
|
|
reloadModel = true;
|
|
else
|
|
undressSlot = true;
|
|
end
|
|
else
|
|
reloadModel = true;
|
|
end
|
|
end
|
|
|
|
if ( reloadModel and not IsUnitModelReadyForUI("player") ) then
|
|
BetterWardrobeCollectionFrame.updateOnModelChanged = true;
|
|
for i = 1, #self.Models do
|
|
self.Models[i]:ClearModel();
|
|
end
|
|
return;
|
|
end
|
|
|
|
for i = 1, #self.Models do
|
|
local model = self.Models[i];
|
|
if ( undressSlot ) then
|
|
local changedOldSlot = false;
|
|
-- dress/undress setup gear
|
|
for slot, equip in pairs(WARDROBE_MODEL_SETUP[newSlot].slots) do
|
|
if ( equip ~= WARDROBE_MODEL_SETUP[oldSlot].slots[slot] ) then
|
|
if ( equip ) then
|
|
model:TryOn(WARDROBE_MODEL_SETUP_GEAR[slot]);
|
|
else
|
|
model:UndressSlot(GetInventorySlotInfo(slot));
|
|
end
|
|
if ( slot == oldSlot ) then
|
|
changedOldSlot = true;
|
|
end
|
|
end
|
|
end
|
|
-- undress old slot
|
|
if ( not changedOldSlot ) then
|
|
local slotID = GetInventorySlotInfo(oldSlot);
|
|
model:UndressSlot(slotID);
|
|
end
|
|
elseif ( reloadModel ) then
|
|
model:Reload(newSlot);
|
|
end
|
|
model.visualInfo = nil;
|
|
end
|
|
self.illusionWeaponAppearanceID = nil;
|
|
|
|
self:EvaluateSlotAllowed();
|
|
end
|
|
|
|
-- For dracthyr/mechagnome
|
|
function BetterWardrobeItemsCollectionMixin:EvaluateSlotAllowed()
|
|
local isArmor = self.transmogLocation:GetArmorCategoryID();
|
|
-- Any model will do, using the 1st
|
|
local model = self.Models[1];
|
|
self.slotAllowed = not isArmor or model:IsSlotAllowed(self.transmogLocation:GetSlotID());
|
|
if not model:IsGeoReady() then
|
|
self:MarkGeoDirty();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:MarkGeoDirty()
|
|
self.geoDirty = true;
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:RefreshCameras()
|
|
if ( self:IsShown() ) then
|
|
for i, model in ipairs(self.Models) do
|
|
model:RefreshCamera();
|
|
if ( model.cameraID ) then
|
|
addon.Model_ApplyUICamera(model, model.cameraID);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:OnUnitModelChangedEvent()
|
|
if ( IsUnitModelReadyForUI("player") ) then
|
|
self:ChangeModelsSlot(self.transmogLocation);
|
|
self:UpdateItems();
|
|
return true;
|
|
else
|
|
return false;
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:GetActiveSlot()
|
|
return self.transmogLocation and self.transmogLocation:GetSlotName();
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:GetActiveCategory()
|
|
return self.activeCategory;
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:IsValidWeaponCategoryForSlot(categoryID)
|
|
local name, isWeapon, canEnchant, canMainHand, canOffHand = C_TransmogCollection.GetCategoryInfo(categoryID);
|
|
if ( name and isWeapon ) then
|
|
if ( (self.transmogLocation:IsMainHand() and canMainHand) or (self.transmogLocation:IsOffHand() and canOffHand) ) then
|
|
if ( C_Transmog.IsAtTransmogNPC() ) then
|
|
local equippedItemID = GetInventoryItemID("player", self.transmogLocation:GetSlotID());
|
|
return C_TransmogCollection.IsCategoryValidForItem(categoryID, equippedItemID);
|
|
else
|
|
return true;
|
|
end
|
|
end
|
|
end
|
|
return false;
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:SetActiveSlot(transmogLocation, category, ignorePreviousSlot)
|
|
local previousTransmogLocation;
|
|
if not ignorePreviousSlot then
|
|
previousTransmogLocation = self.transmogLocation;
|
|
end
|
|
local slotChanged = not previousTransmogLocation or not previousTransmogLocation:IsEqual(transmogLocation);
|
|
|
|
self.transmogLocation = transmogLocation;
|
|
|
|
-- figure out a category
|
|
if ( not category ) then
|
|
if ( self.transmogLocation:IsIllusion() ) then
|
|
category = nil;
|
|
elseif ( self.transmogLocation:IsAppearance() ) then
|
|
local useLastWeaponCategory = self.transmogLocation:IsEitherHand() and
|
|
self.lastWeaponCategory and
|
|
self:IsValidWeaponCategoryForSlot(self.lastWeaponCategory);
|
|
if ( useLastWeaponCategory ) then
|
|
category = self.lastWeaponCategory;
|
|
else
|
|
local appliedSourceID, appliedVisualID, selectedSourceID, selectedVisualID = self:GetActiveSlotInfo();
|
|
if ( selectedSourceID ~= Constants.Transmog.NoTransmogID ) then
|
|
category = C_TransmogCollection.GetAppearanceSourceInfo(selectedSourceID);
|
|
if category and not self:IsValidWeaponCategoryForSlot(category) then
|
|
category = nil;
|
|
end
|
|
end
|
|
end
|
|
if ( not category ) then
|
|
if ( self.transmogLocation:IsEitherHand() ) then
|
|
-- find the first valid weapon category
|
|
for categoryID = FIRST_TRANSMOG_COLLECTION_WEAPON_TYPE, LAST_TRANSMOG_COLLECTION_WEAPON_TYPE do
|
|
if ( self:IsValidWeaponCategoryForSlot(categoryID) ) then
|
|
category = categoryID;
|
|
break;
|
|
end
|
|
end
|
|
else
|
|
category = self.transmogLocation:GetArmorCategoryID();
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if ( slotChanged ) then
|
|
self:ChangeModelsSlot(transmogLocation, previousTransmogLocation);
|
|
end
|
|
-- set only if category is different or slot is different
|
|
if ( category ~= self.activeCategory or slotChanged ) then
|
|
self:SetActiveCategory(category);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:SetTransmogrifierAppearancesShown(hasAnyValidSlots)
|
|
self.NoValidItemsLabel:SetShown(not hasAnyValidSlots);
|
|
C_TransmogCollection.SetCollectedShown(hasAnyValidSlots);
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:UpdateWeaponDropdown()
|
|
local name, isWeapon;
|
|
if self.transmogLocation:IsAppearance() then
|
|
name, isWeapon = C_TransmogCollection.GetCategoryInfo(self:GetActiveCategory());
|
|
end
|
|
|
|
if self:GetActiveCategory() == 29 then
|
|
isWeapon = true;
|
|
end
|
|
|
|
self.WeaponDropdown:SetShown(isWeapon);
|
|
|
|
if not isWeapon then
|
|
return;
|
|
end
|
|
|
|
local function IsSelected(categoryID)
|
|
return categoryID == self:GetActiveCategory();
|
|
end
|
|
|
|
local function SetSelected(categoryID)
|
|
if self:GetActiveCategory() ~= categoryID then
|
|
self:SetActiveCategory(categoryID);
|
|
end
|
|
end
|
|
|
|
local transmogLocation = self.transmogLocation;
|
|
self.WeaponDropdown:SetupMenu(function(dropdown, rootDescription)
|
|
rootDescription:SetTag("MENU_WARDROBE_WEAPONS_FILTER");
|
|
|
|
local equippedItemID = GetInventoryItemID("player", transmogLocation:GetSlotID());
|
|
local checkCategory = equippedItemID and C_Transmog.IsAtTransmogNPC();
|
|
if checkCategory then
|
|
-- if the equipped item cannot be transmogrified, relax restrictions
|
|
local isTransmogrified, hasPending, isPendingCollected, canTransmogrify, cannotTransmogrifyReason, hasUndo = C_Transmog.GetSlotInfo(transmogLocation);
|
|
if not canTransmogrify and not hasUndo then
|
|
checkCategory = false;
|
|
end
|
|
|
|
end
|
|
|
|
local isForMainHand = transmogLocation:IsMainHand();
|
|
local isForOffHand = transmogLocation:IsOffHand();
|
|
for categoryID = FIRST_TRANSMOG_COLLECTION_WEAPON_TYPE, LAST_TRANSMOG_COLLECTION_WEAPON_TYPE do
|
|
local name, isWeapon, canEnchant, canMainHand, canOffHand = C_TransmogCollection.GetCategoryInfo(categoryID);
|
|
|
|
if name and isWeapon then
|
|
if (isForMainHand and canMainHand) or (isForOffHand and canOffHand) then
|
|
if not checkCategory or C_TransmogCollection.IsCategoryValidForItem(categoryID, equippedItemID) or categoryID == Enum.TransmogCollectionType.Paired then
|
|
rootDescription:CreateRadio(name, IsSelected, SetSelected, categoryID);
|
|
end
|
|
end
|
|
end
|
|
|
|
if categoryID == LAST_TRANSMOG_COLLECTION_WEAPON_TYPE and not name then
|
|
local name = "Legion Artifacts";
|
|
rootDescription:CreateRadio(name, IsSelected, SetSelected, categoryID);
|
|
end
|
|
end
|
|
|
|
self.WeaponDropdown:SetEnabled(rootDescription:HasElements());
|
|
end);
|
|
end
|
|
|
|
|
|
|
|
|
|
function BetterWardrobeItemsCollectionMixin:SetActiveCategory(category)
|
|
local previousCategory = self.activeCategory;
|
|
self.activeCategory = category;
|
|
if previousCategory ~= category and self.transmogLocation:IsAppearance() then
|
|
C_TransmogCollection.SetSearchAndFilterCategory(category);
|
|
local name, isWeapon = C_TransmogCollection.GetCategoryInfo(category);
|
|
if ( isWeapon ) then
|
|
self.lastWeaponCategory = category;
|
|
end
|
|
self:RefreshVisualsList();
|
|
else
|
|
self:RefreshVisualsList();
|
|
self:UpdateItems();
|
|
end
|
|
self:UpdateWeaponDropdown();
|
|
|
|
self:GetParent().progressBar:SetShown(not TransmogUtil.IsCategoryLegionArtifact(category));
|
|
|
|
local slotButtons = self.SlotsFrame.Buttons;
|
|
for i = 1, #slotButtons do
|
|
local button = slotButtons[i];
|
|
button.SelectedTexture:SetShown(button.transmogLocation:IsEqual(self.transmogLocation));
|
|
end
|
|
|
|
local resetPage = false;
|
|
local switchSearchCategory = false;
|
|
|
|
if C_Transmog.IsAtTransmogNPC() then
|
|
self.jumpToVisualID = select(4, self:GetActiveSlotInfo());
|
|
resetPage = true;
|
|
end
|
|
|
|
if previousCategory ~= category then
|
|
resetPage = true;
|
|
switchSearchCategory = true;
|
|
end
|
|
|
|
if resetPage then
|
|
self:ResetPage();
|
|
end
|
|
if switchSearchCategory then
|
|
self:GetParent():SwitchSearchCategory();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:ResetPage()
|
|
local page = 1;
|
|
local selectedVisualID = NO_TRANSMOG_VISUAL_ID;
|
|
if ( C_TransmogCollection.IsSearchInProgress(self:GetParent():GetSearchType()) ) then
|
|
self.resetPageOnSearchUpdated = true;
|
|
else
|
|
if ( self.jumpToVisualID ) then
|
|
selectedVisualID = self.jumpToVisualID;
|
|
self.jumpToVisualID = nil;
|
|
elseif ( self.jumpToLatestAppearanceID and not C_Transmog.IsAtTransmogNPC() ) then
|
|
selectedVisualID = self.jumpToLatestAppearanceID;
|
|
self.jumpToLatestAppearanceID = nil;
|
|
end
|
|
end
|
|
if ( selectedVisualID and selectedVisualID ~= NO_TRANSMOG_VISUAL_ID ) then
|
|
local visualsList = self:GetFilteredVisualsList();
|
|
for i = 1, #visualsList do
|
|
if ( visualsList[i].visualID == selectedVisualID ) then
|
|
page = GetPage(i, self.PAGE_SIZE);
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
self.PagingFrame:SetCurrentPage(page);
|
|
self:UpdateItems();
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:FilterVisuals()
|
|
local isAtTransmogrifier = C_Transmog.IsAtTransmogNPC();
|
|
local visualsList = self.visualsList;
|
|
local filteredVisualsList = { };
|
|
|
|
if self.recolors then
|
|
local recolorList = { };
|
|
for _, id in pairs(self.recolors) do recolorList[id] = true end
|
|
|
|
local visualsList = self.visualsList;
|
|
if self.transmogLocation:IsOffHand() then
|
|
for _,categoryID in pairs(Enum.TransmogCollectionType) do
|
|
local mainhand = select(4, C_TransmogCollection.GetCategoryInfo(categoryID));
|
|
if mainhand then
|
|
local appearances = C_TransmogCollection.GetCategoryAppearances(categoryID, 1);
|
|
if appearances then
|
|
for i = 1, #appearances do
|
|
visualsList[#visualsList + 1] = appearances[i];
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
elseif self.transmogLocation:IsMainHand() then
|
|
for _,categoryID in pairs(Enum.TransmogCollectionType) do
|
|
local offhand = select(5, C_TransmogCollection.GetCategoryInfo(categoryID));
|
|
if offhand then
|
|
local appearances = C_TransmogCollection.GetCategoryAppearances(categoryID, 2);
|
|
if appearances then
|
|
for i = 1, #appearances do
|
|
visualsList[#visualsList + 1] = appearances[i];
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
for i = 1, #visualsList do
|
|
local visualID = visualsList[i].visualID;
|
|
if recolorList[visualID] then
|
|
tinsert(filteredVisualsList, visualsList[i]);
|
|
recolorList[visualID] = nil;
|
|
end
|
|
end
|
|
|
|
self.filteredVisualsList = filteredVisualsList;
|
|
return;
|
|
end
|
|
|
|
local slotID = self.transmogLocation.slotID;
|
|
|
|
-- if isAtTransmogrifier and
|
|
|
|
-- end
|
|
|
|
local slotID = self.transmogLocation.slotID;
|
|
for i, visualInfo in ipairs(visualsList) do
|
|
local skip = false;
|
|
if visualInfo.restrictedSlotID then
|
|
skip = (slotID ~= visualInfo.restrictedSlotID)
|
|
end
|
|
if not skip then
|
|
if isAtTransmogrifier then
|
|
if (visualInfo.isUsable and visualInfo.isCollected) or visualInfo.alwaysShowItem then
|
|
table.insert(filteredVisualsList, visualInfo)
|
|
end
|
|
else
|
|
if not visualInfo.isHideVisual then
|
|
table.insert(filteredVisualsList, visualInfo)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if (self:GetActiveCategory() and self:GetActiveCategory() == Enum.TransmogCollectionType.Paired) then
|
|
filteredVisualsList = {}
|
|
for i, visualInfo in ipairs(visualsList) do
|
|
table.insert(filteredVisualsList, visualInfo);
|
|
end
|
|
end
|
|
filteredVisualsList = addon.Sets:ClearHidden(filteredVisualsList, "item")--self.visualsList;
|
|
|
|
|
|
self.filteredVisualsList = filteredVisualsList;
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:SortVisuals()
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 1 then
|
|
|
|
if self:GetActiveCategory() and self:GetActiveCategory() ~= Enum.TransmogCollectionType.Paired then
|
|
addon.SortItems(addon.sortDB.sortDropdown,self);
|
|
elseif self:GetActiveCategory() and self:GetActiveCategory() == Enum.TransmogCollectionType.Paired then
|
|
addon.SortItems(1, self);
|
|
|
|
else
|
|
addon.SortItems(1, self);
|
|
end
|
|
end
|
|
--[[
|
|
local comparison = function(source1, source2)
|
|
if ( source1.isCollected ~= source2.isCollected ) then
|
|
return source1.isCollected;
|
|
end
|
|
if ( source1.isUsable ~= source2.isUsable ) then
|
|
return source1.isUsable;
|
|
end
|
|
if ( source1.isFavorite ~= source2.isFavorite ) then
|
|
return source1.isFavorite;
|
|
end
|
|
if ( source1.canDisplayOnPlayer ~= source2.canDisplayOnPlayer ) then
|
|
return source1.canDisplayOnPlayer;
|
|
end
|
|
if ( source1.isHideVisual ~= source2.isHideVisual ) then
|
|
return source1.isHideVisual;
|
|
end
|
|
if ( source1.hasActiveRequiredHoliday ~= source2.hasActiveRequiredHoliday ) then
|
|
return source1.hasActiveRequiredHoliday;
|
|
end
|
|
if ( source1.uiOrder and source2.uiOrder ) then
|
|
return source1.uiOrder > source2.uiOrder;
|
|
end
|
|
return source1.sourceID > source2.sourceID;
|
|
end
|
|
|
|
table.sort(self.filteredVisualsList, comparison);
|
|
]]
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:GetActiveSlotInfo()
|
|
return TransmogUtil.GetInfoForEquippedSlot(self.transmogLocation);
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:GetWeaponInfoForEnchant()
|
|
if ( not C_Transmog.IsAtTransmogNPC() and DressUpFrame:IsShown() ) then
|
|
local playerActor = DressUpFrame.ModelScene:GetPlayerActor();
|
|
if playerActor then
|
|
local itemTransmogInfo = playerActor:GetItemTransmogInfo(self.transmogLocation:GetSlotID());
|
|
local appearanceID = itemTransmogInfo and itemTransmogInfo.appearanceID or Constants.Transmog.NoTransmogID;
|
|
if ( self:CanEnchantSource(appearanceID) ) then
|
|
local _, appearanceVisualID, _,_,_,_,_,_, appearanceSubclass = C_TransmogCollection.GetAppearanceSourceInfo(appearanceID);
|
|
return appearanceID, appearanceVisualID, appearanceSubclass;
|
|
end
|
|
end
|
|
end
|
|
|
|
local correspondingTransmogLocation = TransmogUtil.GetCorrespondingHandTransmogLocation(self.transmogLocation);
|
|
local appliedSourceID, appliedVisualID, selectedSourceID, selectedVisualID, itemSubclass = TransmogUtil.GetInfoForEquippedSlot(correspondingTransmogLocation);
|
|
if ( self:CanEnchantSource(selectedSourceID) ) then
|
|
return selectedSourceID, selectedVisualID, itemSubclass;
|
|
else
|
|
local appearanceSourceID = C_TransmogCollection.GetFallbackWeaponAppearance();
|
|
local _, appearanceVisualID, _,_,_,_,_,_, appearanceSubclass= C_TransmogCollection.GetAppearanceSourceInfo(appearanceSourceID);
|
|
return appearanceSourceID, appearanceVisualID, appearanceSubclass;
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:CanEnchantSource(sourceID)
|
|
local _, visualID, canEnchant,_,_,_,_,_, appearanceSubclass = C_TransmogCollection.GetAppearanceSourceInfo(sourceID);
|
|
if ( canEnchant ) then
|
|
self.HiddenModel:SetItemAppearance(visualID, 0, appearanceSubclass);
|
|
return self.HiddenModel:HasAttachmentPoints();
|
|
end
|
|
return false;
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:GetCameraVariation()
|
|
local checkSecondary = false;
|
|
if self.transmogLocation:GetSlotName() == "SHOULDERSLOT" then
|
|
if C_Transmog.IsAtTransmogNPC() then
|
|
checkSecondary = WardrobeTransmogFrame:HasActiveSecondaryAppearance();
|
|
else
|
|
local itemLocation = TransmogUtil.GetItemLocationFromTransmogLocation(self.transmogLocation);
|
|
checkSecondary = TransmogUtil.IsSecondaryTransmoggedForItemLocation(itemLocation);
|
|
end
|
|
end
|
|
if checkSecondary then
|
|
if self.transmogLocation:IsSecondary() then
|
|
return 0;
|
|
else
|
|
return 1;
|
|
end
|
|
end
|
|
return nil;
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:OnUpdate()
|
|
if self.geoDirty then
|
|
local model = self.Models[1];
|
|
if model:IsGeoReady() then
|
|
self.geoDirty = nil;
|
|
|
|
self:EvaluateSlotAllowed();
|
|
self:UpdateItems();
|
|
end
|
|
end
|
|
|
|
if (self.trackingModifierDown and not ContentTrackingUtil.IsTrackingModifierDown()) or (not self.trackingModifierDown and ContentTrackingUtil.IsTrackingModifierDown()) then
|
|
for i, model in ipairs(self.Models) do
|
|
model:UpdateTrackingDisabledOverlay();
|
|
end
|
|
self:RefreshAppearanceTooltip();
|
|
end
|
|
self.trackingModifierDown = ContentTrackingUtil.IsTrackingModifierDown();
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:UpdateItems()
|
|
local isArmor;
|
|
local cameraID;
|
|
local appearanceVisualID; -- for weapon when looking at enchants
|
|
local appearanceVisualSubclass;
|
|
local changeModel = false;
|
|
local isAtTransmogrifier = C_Transmog.IsAtTransmogNPC();
|
|
|
|
if ( self.transmogLocation and self.transmogLocation:IsIllusion() ) then
|
|
-- for enchants we need to get the visual of the item in that slot
|
|
local appearanceSourceID;
|
|
appearanceSourceID, appearanceVisualID, appearanceVisualSubclass = self:GetWeaponInfoForEnchant();
|
|
cameraID = C_TransmogCollection.GetAppearanceCameraIDBySource(appearanceSourceID);
|
|
if ( appearanceSourceID ~= self.illusionWeaponAppearanceID ) then
|
|
self.illusionWeaponAppearanceID = appearanceSourceID;
|
|
changeModel = true;
|
|
end
|
|
else
|
|
local _, isWeapon = C_TransmogCollection.GetCategoryInfo(self.activeCategory);
|
|
isArmor = not isWeapon and not addon:IsWeaponCat();
|
|
end
|
|
|
|
local tutorialAnchorFrame;
|
|
local checkTutorialFrame = self.transmogLocation:IsAppearance() and not C_Transmog.IsAtTransmogNPC()
|
|
and not GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_MODEL_CLICK) and BetterWardrobeCollectionFrame.fromSuggestedContent;
|
|
|
|
local baseSourceID, baseVisualID, appliedSourceID, appliedVisualID, pendingSourceID, pendingVisualID, hasPendingUndo;
|
|
local effectiveCategory;
|
|
local showUndoIcon;
|
|
if ( isAtTransmogrifier ) then
|
|
if self.transmogLocation:IsMainHand() then
|
|
effectiveCategory = C_Transmog.GetSlotEffectiveCategory(self.transmogLocation);
|
|
end
|
|
baseSourceID, baseVisualID, appliedSourceID, appliedVisualID, pendingSourceID, pendingVisualID, hasPendingUndo = C_Transmog.GetSlotVisualInfo(self.transmogLocation);
|
|
if ( appliedVisualID ~= NO_TRANSMOG_VISUAL_ID ) then
|
|
if ( hasPendingUndo ) then
|
|
pendingVisualID = baseVisualID;
|
|
showUndoIcon = true;
|
|
end
|
|
-- current border (yellow) should only show on untransmogrified items
|
|
baseVisualID = nil;
|
|
end
|
|
-- hide current border (yellow) or current-transmogged border (purple) if there's something pending
|
|
if ( pendingVisualID ~= NO_TRANSMOG_VISUAL_ID ) then
|
|
baseVisualID = nil;
|
|
appliedVisualID = nil;
|
|
end
|
|
end
|
|
|
|
local matchesCategory = not effectiveCategory or effectiveCategory == self.activeCategory or self.transmogLocation:IsIllusion();
|
|
local cameraVariation = self:GetCameraVariation();
|
|
|
|
-- for disabled slots (dracthyr)
|
|
local isHeadSlot = self.transmogLocation:GetArmorCategoryID() == Enum.TransmogCollectionType.Head;
|
|
|
|
local pendingTransmogModelFrame = nil;
|
|
local indexOffset = (self.PagingFrame:GetCurrentPage() - 1) * self.PAGE_SIZE;
|
|
for i = 1, self.PAGE_SIZE do
|
|
local model = self.Models[i];
|
|
local index = i + indexOffset;
|
|
local visualInfo = self.filteredVisualsList[index];
|
|
if ( visualInfo ) then
|
|
model:Show();
|
|
|
|
local isWeapon;
|
|
if self.activeCategory and self.activeCategory > 11 then
|
|
isWeapon = true;
|
|
end
|
|
|
|
-- camera
|
|
if ( self.transmogLocation:IsAppearance() ) then
|
|
if visualInfo.artifact then
|
|
cameraID = visualInfo.camera;
|
|
else
|
|
local inNativeForm = C_UnitAuras.WantsAlteredForm("player");
|
|
|
|
if (inNativeForm and addon.useNativeForm) or (not inNativeForm and not addon.useNativeForm) or isWeapon then
|
|
cameraID = C_TransmogCollection.GetAppearanceCameraID(visualInfo.visualID, cameraVariation);
|
|
else
|
|
cameraID = addon.Camera:GetCameraIDBySlot(self.activeCategory);
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
if ( model.cameraID ~= cameraID ) then
|
|
addon.Model_ApplyUICamera(model, cameraID);
|
|
model.cameraID = cameraID;
|
|
end
|
|
|
|
local canDisplayVisuals = self.transmogLocation:IsIllusion() or visualInfo.canDisplayOnPlayer;
|
|
|
|
--Dont really care about useable status for colelction list;
|
|
if BW_CollectionListButton.ToggleState then
|
|
visualInfo.isUsable = true;
|
|
end
|
|
|
|
if ( visualInfo ~= model.visualInfo or changeModel ) then
|
|
if ( not canDisplayVisuals ) then
|
|
if ( isArmor ) then
|
|
model:UndressSlot(self.transmogLocation:GetSlotID());
|
|
else
|
|
model:ClearModel();
|
|
end
|
|
elseif ( isArmor and not isWeapon) then
|
|
local sourceID = self:GetAnAppearanceSourceFromVisual(visualInfo.visualID, nil);
|
|
model:TryOn(sourceID);
|
|
model:Show();
|
|
|
|
elseif(visualInfo.shapeshiftID) then
|
|
model.cameraID = visualInfo.camera;
|
|
addon.Model_ApplyUICamera(model, visualInfo.camera);
|
|
model:SetDisplayInfo( visualInfo.shapeshiftID );
|
|
model:MakeCurrentCameraCustom();
|
|
|
|
if model.cameraID == 1602 then
|
|
model.zoom =-.75;
|
|
model:SetCameraDistance(-5);
|
|
model:SetPosition(-13.25,0,-2.447);
|
|
end
|
|
|
|
model:Show();
|
|
elseif ( appearanceVisualID ) then
|
|
-- appearanceVisualID is only set when looking at enchants
|
|
model:SetItemAppearance(appearanceVisualID, visualInfo.visualID, appearanceVisualSubclass);
|
|
else
|
|
model:SetItemAppearance(visualInfo.visualID);
|
|
if isWeapon then
|
|
model.needsReset = true;
|
|
end
|
|
end
|
|
end
|
|
model.visualInfo = visualInfo;
|
|
if self:GetActiveCategory() and self:GetActiveCategory() ~= Enum.TransmogCollectionType.Paired then
|
|
model:UpdateContentTracking();
|
|
model:UpdateTrackingDisabledOverlay();
|
|
end
|
|
|
|
-- state at the transmogrifier
|
|
local transmogStateAtlas;
|
|
if ( visualInfo.visualID == appliedVisualID and matchesCategory) then
|
|
transmogStateAtlas = "transmog-wardrobe-border-current-transmogged";
|
|
elseif ( visualInfo.visualID == baseVisualID ) then
|
|
transmogStateAtlas = "transmog-wardrobe-border-current";
|
|
elseif ( visualInfo.visualID == pendingVisualID and matchesCategory) then
|
|
transmogStateAtlas = "transmog-wardrobe-border-selected";
|
|
pendingTransmogModelFrame = model;
|
|
end
|
|
if ( transmogStateAtlas ) then
|
|
model.TransmogStateTexture:SetAtlas(transmogStateAtlas, true);
|
|
model.TransmogStateTexture:Show();
|
|
else
|
|
model.TransmogStateTexture:Hide();
|
|
end
|
|
|
|
-- border
|
|
if ( not visualInfo.isCollected ) then
|
|
model.Border:SetAtlas("transmog-wardrobe-border-uncollected");
|
|
elseif ( not visualInfo.isUsable ) then
|
|
model.Border:SetAtlas("transmog-wardrobe-border-unusable");
|
|
else
|
|
model.Border:SetAtlas("transmog-wardrobe-border-collected");
|
|
end
|
|
|
|
if ( C_TransmogCollection.IsNewAppearance(visualInfo.visualID) ) then
|
|
model.NewString:Show();
|
|
model.NewGlow:Show();
|
|
else
|
|
model.NewString:Hide();
|
|
model.NewGlow:Hide();
|
|
end
|
|
-- favorite
|
|
local isFavorite = visualInfo.isFavorite or addon:IsFavoriteItem(visualInfo.visualID);
|
|
model.Favorite.Icon:SetShown(isFavorite);
|
|
-- hide visual option
|
|
model.HideVisual.Icon:SetShown(isAtTransmogrifier and visualInfo.isHideVisual);
|
|
-- slots not allowed
|
|
--local showAsInvalid = not canDisplayVisuals or not self.slotAllowed;
|
|
local showAsInvalid = not self.slotAllowed;
|
|
if not BW_CollectionListTitle:IsShown() then
|
|
model.SlotInvalidTexture:SetShown(showAsInvalid);
|
|
model:SetDesaturated(showAsInvalid);
|
|
end
|
|
--model.SlotInvalidTexture:SetShown(showAsInvalid);
|
|
--model:SetDesaturated(showAsInvalid);
|
|
|
|
--model.SlotInvalidTexture:SetShown(not self.slotAllowed);
|
|
|
|
|
|
--model:SetDesaturated(isHeadSlot and not self.slotAllowed);
|
|
|
|
local setID = (model.visualInfo and model.visualInfo.visualID) or model.setID;
|
|
local isHidden = addon.HiddenAppearanceDB.profile.item[setID];
|
|
model.CollectionListVisual.Hidden.Icon:SetShown(isHidden);
|
|
local isInList = addon.CollectionList:IsInList(setID, "item")
|
|
model.CollectionListVisual.Collection.Collection_Icon:SetShown(isInList);
|
|
model.CollectionListVisual.Collection.Collected_Icon:SetShown(isInList and model.visualInfo and model.visualInfo.isCollected);
|
|
|
|
if ( GameTooltip:GetOwner() == model ) then
|
|
model:OnEnter();
|
|
end
|
|
|
|
-- find potential tutorial anchor for trackable item
|
|
if ( checkTutorialFrame ) then
|
|
if ( not BetterWardrobeCollectionFrame.tutorialVisualID and not visualInfo.isCollected and not visualInfo.isHideVisual and model:HasTrackableSource()) then
|
|
tutorialAnchorFrame = model;
|
|
elseif ( BetterWardrobeCollectionFrame.tutorialVisualID and BetterWardrobeCollectionFrame.tutorialVisualID == visualInfo.visualID ) then
|
|
tutorialAnchorFrame = model;
|
|
end
|
|
end
|
|
else
|
|
model:Hide();
|
|
model.visualInfo = nil;
|
|
end
|
|
end
|
|
if ( pendingTransmogModelFrame ) then
|
|
self.PendingTransmogFrame:SetParent(pendingTransmogModelFrame);
|
|
self.PendingTransmogFrame:SetPoint("CENTER");
|
|
self.PendingTransmogFrame:Show();
|
|
if ( self.PendingTransmogFrame.visualID ~= pendingVisualID ) then
|
|
self.PendingTransmogFrame.TransmogSelectedAnim:Stop();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim:Play();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim2:Stop();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim2:Play();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim3:Stop();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim3:Play();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim4:Stop();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim4:Play();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim5:Stop();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim5:Play();
|
|
end
|
|
self.PendingTransmogFrame.UndoIcon:SetShown(showUndoIcon);
|
|
self.PendingTransmogFrame.visualID = pendingVisualID;
|
|
else
|
|
self.PendingTransmogFrame:Hide();
|
|
end
|
|
-- progress bar
|
|
self:UpdateProgressBar();
|
|
-- tutorial
|
|
--[[
|
|
if ( checkTutorialFrame ) then
|
|
if ( tutorialAnchorFrame ) then
|
|
if ( not BetterWardrobeCollectionFrame.tutorialVisualID ) then
|
|
BetterWardrobeCollectionFrame.tutorialVisualID = tutorialAnchorFrame.visualInfo.visualID;
|
|
end
|
|
if ( BetterWardrobeCollectionFrame.tutorialVisualID ~= tutorialAnchorFrame.visualInfo.visualID ) then
|
|
tutorialAnchorFrame = nil;
|
|
end
|
|
end
|
|
end
|
|
if ( tutorialAnchorFrame ) then
|
|
local helpTipInfo = {
|
|
text = WARDROBE_TRACKING_TUTORIAL,
|
|
buttonStyle = HelpTip.ButtonStyle.Close,
|
|
cvarBitfield = "closedInfoFrames",
|
|
bitfieldFlag = LE_FRAME_TUTORIAL_TRANSMOG_MODEL_CLICK,
|
|
targetPoint = HelpTip.Point.RightEdgeCenter,
|
|
onAcknowledgeCallback = function() BetterWardrobeCollectionFrame.fromSuggestedContent = nil;
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:CheckHelpTip(); end,
|
|
acknowledgeOnHide = true,
|
|
};
|
|
HelpTip:Show(self, helpTipInfo, tutorialAnchorFrame);
|
|
else
|
|
HelpTip:Hide(self, WARDROBE_TRACKING_TUTORIAL);
|
|
end
|
|
]]
|
|
--if #addon.GetBaseList() == 0 then
|
|
--addon.Init:BuildDB();
|
|
--end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:UpdateProgressBar()
|
|
local collected, total;
|
|
if ( self.transmogLocation:IsIllusion() ) then
|
|
total = #self.visualsList;
|
|
collected = 0;
|
|
for i, illusion in ipairs(self.visualsList) do
|
|
if ( illusion.isCollected ) then
|
|
collected = collected + 1;
|
|
end
|
|
end
|
|
else
|
|
collected = C_TransmogCollection.GetFilteredCategoryCollectedCount(self.activeCategory);
|
|
total = C_TransmogCollection.GetFilteredCategoryTotal(self.activeCategory);
|
|
end
|
|
self:GetParent():UpdateProgressBar(collected, total);
|
|
end
|
|
|
|
local offspecartifact = {}
|
|
|
|
function BetterWardrobeItemsCollectionMixin:RefreshVisualsList()
|
|
if not self.transmogLocation then return end
|
|
if self.transmogLocation:IsIllusion() then
|
|
self.visualsList = C_TransmogCollection.GetIllusions()
|
|
|
|
else
|
|
if self:GetActiveCategory() == Enum.TransmogCollectionType.Paired and not C_Transmog.IsAtTransmogNPC() then
|
|
self.visualsList = addon.GetClassArtifactAppearanceList()
|
|
elseif self:GetActiveCategory() == Enum.TransmogCollectionType.Paired and C_Transmog.IsAtTransmogNPC() then
|
|
self.visualsList = C_TransmogCollection.GetCategoryAppearances(Enum.TransmogCollectionType.Paired, self.transmogLocation)
|
|
offspecartifact = {}
|
|
|
|
for i, data in ipairs(self.visualsList)do
|
|
|
|
local sourceID = BetterWardrobeCollectionFrame.ItemsCollectionFrame:GetAnAppearanceSourceFromVisual(data.visualID)
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID)
|
|
local invType = sourceInfo.invType;
|
|
|
|
local transmogLocation = WardrobeTransmogFrame:GetSelectedTransmogLocation()
|
|
local baseSourceID, baseVisualID, appliedSourceID, appliedVisualID, pendingSourceID, pendingVisualID, hasPendingUndo, _, itemSubclass = C_Transmog.GetSlotVisualInfo(transmogLocation)
|
|
--local appliedSourceID, _, selectedSourceID = TransmogUtil.GetInfoForEquippedSlot(transmogLocation)
|
|
local selecteSourceInfo = C_TransmogCollection.GetSourceInfo(baseSourceID)
|
|
local selectedInvType = selecteSourceInfo.invType;
|
|
|
|
if invType == selectedInvType then
|
|
if not data.isUsable then
|
|
data.isUsable = true;
|
|
offspecartifact[data.visualID] = true;
|
|
else
|
|
offspecartifact[data.visualID] = false;
|
|
end
|
|
end
|
|
end
|
|
else
|
|
self.visualsList = C_TransmogCollection.GetCategoryAppearances(self.activeCategory, self.transmogLocation)
|
|
end
|
|
|
|
end
|
|
--Mod to allow visual view of sets from the journal;
|
|
if BW_CollectionListButton.ToggleState then self.visualsList = addon.CollectionList:BuildCollectionList() end
|
|
|
|
self:FilterVisuals()
|
|
self:SortVisuals()
|
|
self.PagingFrame:SetMaxPages(ceil(#self.filteredVisualsList / self.PAGE_SIZE))
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:GetFilteredVisualsList()
|
|
return self.filteredVisualsList;
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:GetAnAppearanceSourceFromVisual(visualID, mustBeUsable)
|
|
local sourceID = self:GetChosenVisualSource(visualID)
|
|
if ( sourceID == Constants.Transmog.NoTransmogID ) then
|
|
local isArtifact = addon.GetArtifactSourceInfo(visualID)
|
|
if isArtifact then return isArtifact.sourceID end
|
|
local sources = CollectionWardrobeUtil.GetSortedAppearanceSources(visualID, self.activeCategory, self.transmogLocation)
|
|
for i = 1, #sources do
|
|
-- first 1 if it doesn't have to be usable
|
|
if ( not mustBeUsable or self:IsAppearanceUsableForActiveCategory(sources[i]) ) then
|
|
sourceID = sources[i].sourceID;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
return sourceID;
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:SelectVisual(visualID)
|
|
if not C_Transmog.IsAtTransmogNPC() then
|
|
return;
|
|
end
|
|
|
|
local sourceID;
|
|
if ( self.transmogLocation:IsAppearance() ) then
|
|
--Fix for shoulder and wrist hidden item appearance;
|
|
if visualID == 24531 or visualID == 40284 then
|
|
local modType = Enum.TransmogModification.Main;
|
|
local itemLocation = TransmogUtil.GetItemLocationFromTransmogLocation(self.transmogLocation)
|
|
local secondarySelected = self.transmogLocation:IsSecondary()
|
|
if secondarySelected then
|
|
modType = Enum.TransmogModification.Secondary;
|
|
end
|
|
|
|
local slotID = TransmogUtil.GetSlotID(self:GetActiveSlot())
|
|
local emptySlotData = Sets:GetEmptySlots()
|
|
local _, source = addon.GetItemSource(emptySlotData[slotID]) --C_TransmogCollection.GetItemInfo(emptySlotData[i])
|
|
local transmogLocation = TransmogUtil.GetTransmogLocation(slotID, Enum.TransmogType.Appearance, modType)
|
|
pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, source)
|
|
C_Transmog.SetPending(transmogLocation, pendingInfo)
|
|
|
|
return
|
|
end
|
|
|
|
sourceID = self:GetAnAppearanceSourceFromVisual(visualID, true)
|
|
else
|
|
local visualsList = self:GetFilteredVisualsList()
|
|
for i = 1, #visualsList do
|
|
if ( visualsList[i].visualID == visualID ) then
|
|
sourceID = visualsList[i].sourceID;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
|
|
local transmogLocation = WardrobeTransmogFrame:GetSelectedTransmogLocation()
|
|
local activeCategory = self.activeCategory;
|
|
local offhandTransmogLocation = TransmogUtil.GetTransmogLocation(INVSLOT_OFFHAND, Enum.TransmogType.Appearance, Enum.TransmogModification.Main)
|
|
--Clears offhand if artifact was a paired set;
|
|
if C_Transmog.GetSlotEffectiveCategory(offhandTransmogLocation) == Enum.TransmogCollectionType.None then
|
|
local actor = WardrobeTransmogFrame.ModelScene:GetPlayerActor()
|
|
actor:UndressSlot(INVSLOT_OFFHAND)
|
|
end
|
|
|
|
if self.activeCategory == Enum.TransmogCollectionType.Paired then
|
|
if offspecartifact[visualID] then
|
|
C_Transmog.ClearPending(transmogLocation)
|
|
local baseSourceID, baseVisualID, appliedSourceID, appliedVisualID, pendingSourceID, pendingVisualID, hasPendingUndo, _, itemSubclass = C_Transmog.GetSlotVisualInfo(transmogLocation)
|
|
if appliedVisualID == visualID then
|
|
self.activeCategory = Enum.TransmogCollectionType.Paired;
|
|
else
|
|
local appliedSourceID, _, selectedSourceID = TransmogUtil.GetInfoForEquippedSlot(transmogLocation)
|
|
local selecteSourceInfo = C_TransmogCollection.GetSourceInfo(baseSourceID)
|
|
self.activeCategory = selecteSourceInfo.categoryID
|
|
end
|
|
else
|
|
self.activeCategory = Enum.TransmogCollectionType.Paired;
|
|
end
|
|
end
|
|
|
|
-- artifacts from other specs will not have something valid
|
|
if sourceID ~= Constants.Transmog.NoTransmogID then
|
|
WardrobeTransmogFrame:SetPendingTransmog(sourceID, self.activeCategory)
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_ITEM_CLICK)
|
|
end
|
|
self.activeCategory = activeCategory;
|
|
|
|
if self.activeCategory == Enum.TransmogCollectionType.Paired then
|
|
self.jumpToVisualID = visualID;
|
|
C_Timer.After(0, function() BetterWardrobeCollectionFrame.ItemsCollectionFrame:ResetPage() end)
|
|
end
|
|
|
|
end
|
|
function BetterWardrobeItemsCollectionMixin:GoToSourceID(sourceID, transmogLocation, forceGo, forTransmog, overrideCategoryID)
|
|
local categoryID, visualID;
|
|
if ( transmogLocation:IsAppearance() ) then
|
|
categoryID, visualID = C_TransmogCollection.GetAppearanceSourceInfo(sourceID);
|
|
elseif ( transmogLocation:IsIllusion() ) then
|
|
local illusionInfo = C_TransmogCollection.GetIllusionInfo(sourceID);
|
|
visualID = illusionInfo and illusionInfo.visualID;
|
|
end
|
|
if overrideCategoryID then
|
|
categoryID = overrideCategoryID;
|
|
end
|
|
if ( visualID or forceGo ) then
|
|
self.jumpToVisualID = visualID;
|
|
if ( self.activeCategory ~= categoryID or not self.transmogLocation:IsEqual(transmogLocation) ) then
|
|
self:SetActiveSlot(transmogLocation, categoryID);
|
|
else
|
|
if not self.filteredVisualsList then
|
|
self:RefreshVisualsList();
|
|
end
|
|
self:ResetPage();
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:SetAppearanceTooltip(frame)
|
|
GameTooltip:SetOwner(frame, "ANCHOR_RIGHT")
|
|
self.tooltipModel = frame;
|
|
self.tooltipVisualID = frame.visualInfo.visualID;
|
|
local atTransmogrifier = C_Transmog.IsAtTransmogNPC()
|
|
|
|
if self.activeCategory == Enum.TransmogCollectionType.Paired and not atTransmogrifier then
|
|
if ( not self.tooltipVisualID ) then
|
|
return;
|
|
end
|
|
addon.SetArtifactAppearanceTooltip(self, frame.visualInfo)
|
|
else
|
|
self:RefreshAppearanceTooltip()
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:RefreshAppearanceTooltip()
|
|
if ( not self.tooltipVisualID ) then
|
|
return;
|
|
end
|
|
local sources = CollectionWardrobeUtil.GetSortedAppearanceSourcesForClass(self.tooltipVisualID, C_TransmogCollection.GetClassFilter(), self.activeCategory, self.transmogLocation);
|
|
local chosenSourceID = self:GetChosenVisualSource(self.tooltipVisualID);
|
|
local warningString = CollectionWardrobeUtil.GetBestVisibilityWarning(self.tooltipModel, self.transmogLocation, self.tooltipVisualID);
|
|
self:GetParent():SetAppearanceTooltip(self, sources, chosenSourceID, warningString);
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:ClearAppearanceTooltip()
|
|
self.tooltipVisualID = nil;
|
|
self:GetParent():HideAppearanceTooltip();
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:UpdateSlotButtons()
|
|
if C_Transmog.IsAtTransmogNPC() then
|
|
return;
|
|
end
|
|
|
|
local shoulderSlotID = TransmogUtil.GetSlotID("SHOULDERSLOT");
|
|
local itemLocation = ItemLocation:CreateFromEquipmentSlot(shoulderSlotID);
|
|
local showSecondaryShoulder = TransmogUtil.IsSecondaryTransmoggedForItemLocation(itemLocation);
|
|
|
|
local secondaryShoulderTransmogLocation = TransmogUtil.GetTransmogLocation("SHOULDERSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.Secondary);
|
|
local lastButton = nil;
|
|
for i, button in ipairs(self.SlotsFrame.Buttons) do
|
|
if not button.isSmallButton then
|
|
local slotName = button.transmogLocation:GetSlotName();
|
|
if slotName == "BACKSLOT" then
|
|
local xOffset = showSecondaryShoulder and spacingWithSmallButton or spacingNoSmallButton;
|
|
button:SetPoint("LEFT", lastButton, "RIGHT", xOffset, 0);
|
|
elseif slotName == "HANDSSLOT" or slotName == "MAINHANDSLOT" then
|
|
local xOffset = showSecondaryShoulder and shorterSectionSpacing or defaultSectionSpacing;
|
|
button:SetPoint("LEFT", lastButton, "RIGHT", xOffset, 0);
|
|
end
|
|
lastButton = button;
|
|
elseif button.transmogLocation:IsEqual(secondaryShoulderTransmogLocation) then
|
|
button:SetShown(showSecondaryShoulder);
|
|
end
|
|
end
|
|
|
|
if self.transmogLocation then
|
|
-- if it was selected and got hidden, reset to main shoulder
|
|
-- otherwise if main selected, update cameras
|
|
local mainShoulderTransmogLocation = TransmogUtil.GetTransmogLocation("SHOULDERSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
if not showSecondaryShoulder and self.transmogLocation:IsEqual(secondaryShoulderTransmogLocation) then
|
|
self:SetActiveSlot(mainShoulderTransmogLocation);
|
|
elseif self.transmogLocation:IsEqual(mainShoulderTransmogLocation) then
|
|
self:UpdateItems();
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:OnPageChanged(userAction)
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_PAGE_TURN);
|
|
if ( userAction ) then
|
|
self:UpdateItems();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:OnSearchUpdate(category)
|
|
if ( category ~= self.activeCategory ) then
|
|
return;
|
|
end
|
|
|
|
self:RefreshVisualsList();
|
|
if ( self.resetPageOnSearchUpdated ) then
|
|
self.resetPageOnSearchUpdated = nil;
|
|
self:ResetPage();
|
|
elseif ( C_Transmog.IsAtTransmogNPC() and WardrobeCollectionFrameSearchBox:GetText() == "" ) then
|
|
local _, _, selectedSourceID = TransmogUtil.GetInfoForEquippedSlot(self.transmogLocation);
|
|
local transmogLocation = WardrobeTransmogFrame:GetSelectedTransmogLocation();
|
|
local effectiveCategory = transmogLocation and C_Transmog.GetSlotEffectiveCategory(transmogLocation) or Enum.TransmogCollectionType.None;
|
|
if ( effectiveCategory == self:GetActiveCategory() ) then
|
|
self:GoToSourceID(selectedSourceID, self.transmogLocation, true);
|
|
else
|
|
self:UpdateItems();
|
|
end
|
|
else
|
|
self:UpdateItems();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:IsAppearanceUsableForActiveCategory(appearanceInfo)
|
|
local inLegionArtifactCategory = TransmogUtil.IsCategoryLegionArtifact(self.activeCategory);
|
|
return CollectionWardrobeUtil.IsAppearanceUsable(appearanceInfo, inLegionArtifactCategory);
|
|
end
|
|
|
|
BetterTransmogToggleSecondaryAppearanceCheckboxMixin = { }
|
|
|
|
function BetterTransmogToggleSecondaryAppearanceCheckboxMixin:OnClick()
|
|
local isOn = self:GetChecked();
|
|
if isOn then
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
|
|
else
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_OFF);
|
|
end
|
|
self:GetParent():ToggleSecondaryForSelectedSlotButton();
|
|
end
|
|
|
|
-- ***** MODELS
|
|
|
|
BetterWardrobeItemsModelMixin = { };
|
|
|
|
function BetterWardrobeItemsModelMixin:OnLoad()
|
|
self:SetAutoDress(false);
|
|
|
|
local lightValues = { omnidirectional = false, point = CreateVector3D(-1, 1, -1), ambientIntensity = 1.05, ambientColor = CreateColor(1, 1, 1), diffuseIntensity = 0, diffuseColor = CreateColor(1, 1, 1) };
|
|
local enabled = true;
|
|
self:SetLight(enabled, lightValues);
|
|
self.desaturated = false;
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:OnModelLoaded()
|
|
if ( self.cameraID ) then
|
|
addon.Model_ApplyUICamera(self, self.cameraID);
|
|
end
|
|
self.desaturated = false;
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:UpdateContentTracking()
|
|
self:ClearTrackables();
|
|
|
|
if ( self.visualInfo ) then
|
|
local itemsCollectionFrame = self:GetParent();
|
|
if ( not itemsCollectionFrame.transmogLocation:IsIllusion() ) then
|
|
local sources = CollectionWardrobeUtil.GetSortedAppearanceSourcesForClass(self.visualInfo.visualID, C_TransmogCollection.GetClassFilter(), itemsCollectionFrame:GetActiveCategory(), itemsCollectionFrame.transmogLocation);
|
|
for i, sourceInfo in ipairs(sources) do
|
|
if sourceInfo.playerCanCollect then
|
|
self:AddTrackable(Enum.ContentTrackingType.Appearance, sourceInfo.sourceID);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
self:UpdateTrackingCheckmark();
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:UpdateTrackingDisabledOverlay()
|
|
local contentTrackingDisabled = not ContentTrackingUtil.IsContentTrackingEnabled() or C_Transmog.IsAtTransmogNPC();
|
|
if ( contentTrackingDisabled ) then
|
|
self.DisabledOverlay:SetShown(false);
|
|
return;
|
|
end
|
|
|
|
local isCollected = self.visualInfo and self.visualInfo.isCollected;
|
|
local showDisabled = ContentTrackingUtil.IsTrackingModifierDown() and (isCollected or not self:HasTrackableSource());
|
|
self.DisabledOverlay:SetShown(showDisabled);
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:GetSourceInfoForTracking()
|
|
if ( not self.visualInfo ) then
|
|
return nil;
|
|
end
|
|
|
|
local itemsCollectionFrame = self:GetParent();
|
|
if ( itemsCollectionFrame.transmogLocation:IsIllusion() ) then
|
|
return nil;
|
|
else
|
|
local sourceIndex = BetterWardrobeCollectionFrame.tooltipSourceIndex or 1;
|
|
local sources = CollectionWardrobeUtil.GetSortedAppearanceSourcesForClass(self.visualInfo.visualID, C_TransmogCollection.GetClassFilter(), itemsCollectionFrame:GetActiveCategory(), itemsCollectionFrame.transmogLocation);
|
|
local index = CollectionWardrobeUtil.GetValidIndexForNumSources(sourceIndex, #sources);
|
|
return sources[index];
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:OnMouseDown(button)
|
|
if ( not self.visualInfo ) then
|
|
return;
|
|
end
|
|
|
|
local itemsCollectionFrame = self:GetParent();
|
|
local isChatLinkClick = IsModifiedClick("CHATLINK");
|
|
if ( isChatLinkClick ) then
|
|
local link;
|
|
if ( itemsCollectionFrame.transmogLocation:IsIllusion() ) then
|
|
local name;
|
|
name, link = C_TransmogCollection.GetIllusionStrings(self.visualInfo.sourceID);
|
|
else
|
|
local sources = CollectionWardrobeUtil.GetSortedAppearanceSourcesForClass(self.visualInfo.visualID, C_TransmogCollection.GetClassFilter(), itemsCollectionFrame:GetActiveCategory(), itemsCollectionFrame.transmogLocation);
|
|
if ( BetterWardrobeCollectionFrame.tooltipSourceIndex ) then
|
|
local index = CollectionWardrobeUtil.GetValidIndexForNumSources(BetterWardrobeCollectionFrame.tooltipSourceIndex, #sources);
|
|
link = BetterWardrobeCollectionFrame:GetAppearanceItemHyperlink(sources[index]);
|
|
end
|
|
end
|
|
if ( link ) then
|
|
if ( HandleModifiedItemClick(link) ) then
|
|
return;
|
|
end
|
|
end
|
|
elseif ( IsModifiedClick("DRESSUP") ) or (addon.Profile.AutoApply and not C_Transmog.IsAtTransmogNPC() and button == "LeftButton") then
|
|
addon:StoreItems()
|
|
itemsCollectionFrame:DressUpVisual(self.visualInfo)
|
|
return;
|
|
end
|
|
|
|
if ( self.visualInfo and not self.visualInfo.isCollected ) then
|
|
local sourceInfo = self:GetSourceInfoForTracking();
|
|
if ( sourceInfo ) then
|
|
if ( not sourceInfo.playerCanCollect ) then
|
|
ContentTrackingUtil.DisplayTrackingError(Enum.ContentTrackingError.Untrackable);
|
|
return;
|
|
end
|
|
|
|
if ( self:CheckTrackableClick(button, Enum.ContentTrackingType.Appearance, sourceInfo.sourceID) ) then
|
|
self:UpdateContentTracking();
|
|
itemsCollectionFrame:RefreshAppearanceTooltip();
|
|
return;
|
|
end
|
|
end
|
|
end
|
|
|
|
if ( isChatLinkClick ) then
|
|
return;
|
|
end
|
|
|
|
if ( button == "LeftButton" ) then
|
|
self:GetParent():SelectVisual(self.visualInfo.visualID);
|
|
end
|
|
end
|
|
|
|
local function ToggleHidden(model, isHidden)
|
|
local GetItemInfo = C_Item and C_Item.GetItemInfo
|
|
local tabID = addon.GetTab()
|
|
if tabID == 1 then
|
|
local visualID = model.visualInfo.visualID;
|
|
local _, _, _, _, _, itemLink = C_TransmogCollection.GetAppearanceSourceInfo(visualID);
|
|
local name, link;
|
|
if itemLink then
|
|
local source = CollectionWardrobeUtil.GetSortedAppearanceSources(visualID, addon.GetItemCategory(visualID), addon.GetTransmogLocation(itemLink))[1];
|
|
name, link = GetItemInfo(source.itemID);
|
|
end
|
|
|
|
if not link then
|
|
link = visualID
|
|
end
|
|
addon.HiddenAppearanceDB.profile.item[visualID] = not isHidden and link;
|
|
--self:UpdateWardrobe()
|
|
print(string.format("%s "..link.." %s", isHidden and L["unhiding_item"] or L["hiding_item"], isHidden and L["inhiding_item_end"] or L["hiding_item_end"] ));
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList();
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:UpdateItems();
|
|
|
|
elseif tabID == 2 then
|
|
|
|
local setInfo = C_TransmogSets.GetSetInfo(tonumber(model.setID));
|
|
local name = setInfo["name"];
|
|
|
|
local baseSetID = addon.SetsDataProvider:GetBaseSetID(model.setID);
|
|
|
|
local atTransmogrifier = C_Transmog.IsAtTransmogNPC()
|
|
|
|
--print(model.setID)
|
|
--print(baseSetID)
|
|
addon.HiddenAppearanceDB.profile.set[baseSetID] = not isHidden and name or nil;
|
|
|
|
|
|
--local sourceinfo = C_TransmogSets.GetSetPrimaryAppearances(baseSetID);
|
|
--for i,data in pairs(sourceinfo) do
|
|
--local info = C_TransmogCollection.GetSourceInfo(i);
|
|
-- addon.HiddenAppearanceDB.profile.item[info.visualID] = not isHidden and info.name or nil;
|
|
--end
|
|
|
|
local variantSets = addon.SetsDataProvider:GetVariantSets(baseSetID) --C_TransmogSets.GetVariantSets(baseSetID);
|
|
for i, data in ipairs(variantSets) do
|
|
addon.HiddenAppearanceDB.profile.set[data.setID] = not isHidden and data.name or nil;
|
|
|
|
--local sourceinfo = C_TransmogSets.GetSetPrimaryAppearances(data.setID);
|
|
--for i,data in pairs(sourceinfo) do
|
|
--local info = C_TransmogCollection.GetSourceInfo(i);
|
|
--addon.HiddenAppearanceDB.profile.item[info.visualID] = not isHidden and info.name or nil;
|
|
--end
|
|
end
|
|
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:OnSearchUpdate();
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate();
|
|
print(format("%s "..name.." %s", isHidden and L["unhiding_set"] or L["hiding_set"], isHidden and L["unhiding_set_end"] or L["hiding_set_end"]))
|
|
else
|
|
local setInfo = addon.GetSetInfo(model.setID);
|
|
local name = setInfo["name"];
|
|
addon.HiddenAppearanceDB.profile.extraset[model.setID] = not isHidden and name or nil;
|
|
print(format("%s "..name.." %s", isHidden and L["unhiding_set"] or L["hiding_set"], isHidden and L["unhiding_set_end"] or L["hiding_set_end"]));
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:OnSearchUpdate();
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate();
|
|
|
|
end
|
|
--self:UpdateWardrobe()
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:OnMouseUp(button)
|
|
if button == "RightButton" then
|
|
local itemsCollectionFrame = self:GetParent();
|
|
|
|
if itemsCollectionFrame:GetActiveCategory() == Enum.TransmogCollectionType.Paired then return end
|
|
if ( itemsCollectionFrame.transmogLocation:IsIllusion() ) then
|
|
return;
|
|
end
|
|
|
|
MenuUtil.CreateContextMenu(self, function(owner, rootDescription)
|
|
rootDescription:SetTag("MENU_WARDROBE_ITEMS_MODEL_FILTER");
|
|
|
|
local appearanceID = self.visualInfo.visualID;
|
|
local favorite = C_TransmogCollection.GetIsAppearanceFavorite(appearanceID);
|
|
local text = favorite and TRANSMOG_ITEM_UNSET_FAVORITE or TRANSMOG_ITEM_SET_FAVORITE;
|
|
rootDescription:CreateButton(text, function()
|
|
WardrobeCollectionFrameModelDropdown_SetFavorite(appearanceID, not favorite);
|
|
end);
|
|
|
|
local isHidden = addon.HiddenAppearanceDB.profile.item[self.visualInfo.visualID];
|
|
text = isHidden and SHOW or HIDE;
|
|
rootDescription:CreateButton(text, function()
|
|
ToggleHidden(self, isHidden);
|
|
end);
|
|
|
|
local collected = self.visualInfo.isCollected;
|
|
local collectionList = addon.CollectionList:CurrentList();
|
|
local isInList = match or addon.CollectionList:IsInList(self.visualInfo.visualID, "item");
|
|
local targetSet = match or variantTarget or self.visualInfo.visualID;
|
|
local targetText = match and " - "..matchType or variantTarget and " - "..variantType or "";
|
|
local isInList = collectionList["item"][targetSet];
|
|
|
|
text = isInList and L["Remove from Collection List"]..targetText or L["Add to Collection List"]..targetText;
|
|
|
|
rootDescription:CreateButton(text,function()
|
|
addon.CollectionList:UpdateList("item", targetSet, not isInList);
|
|
end);
|
|
|
|
text = L["View Sources"]
|
|
rootDescription:CreateButton(text, function()
|
|
addon.CollectionList:GenerateSourceListView(self.visualInfo.visualID);
|
|
end);
|
|
|
|
text = L["View Recolors"]
|
|
rootDescription:CreateButton(text, function()
|
|
if not C_AddOns.IsAddOnLoaded("BetterWardrobe_SourceData") then
|
|
C_AddOns.EnableAddOn("BetterWardrobe_SourceData");
|
|
C_AddOns.LoadAddOn("BetterWardrobe_SourceData");
|
|
end
|
|
local Recolors = _G.BetterWardrobeData.ItemRecolors or {};
|
|
for i = 1, #Recolors do
|
|
local visualList = Recolors[i];
|
|
for j = 1, #visualList do
|
|
if visualList[j] == visualID then
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame.recolors = visualList;
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList();
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:FilterVisuals();
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:SortVisuals();
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:UpdateItems();
|
|
addon.ColorFilterButton.revert:Show();
|
|
return;
|
|
end
|
|
end
|
|
end
|
|
print(L["No Recolors Found"]);
|
|
end);
|
|
|
|
rootDescription:QueueSpacer();
|
|
rootDescription:QueueTitle(WARDROBE_TRANSMOGRIFY_AS);
|
|
|
|
local activeCategory = itemsCollectionFrame:GetActiveCategory();
|
|
local transmogLocation = itemsCollectionFrame.transmogLocation;
|
|
local chosenSourceID = itemsCollectionFrame:GetChosenVisualSource(appearanceID);
|
|
for index, source in ipairs(CollectionWardrobeUtil.GetSortedAppearanceSources(appearanceID, activeCategory, transmogLocation)) do
|
|
if source.isCollected and itemsCollectionFrame:IsAppearanceUsableForActiveCategory(source) then
|
|
if chosenSourceID == Constants.Transmog.NoTransmogID then
|
|
chosenSourceID = source.sourceID;
|
|
end
|
|
|
|
local function IsChecked(data)
|
|
return chosenSourceID == data.sourceID;
|
|
end
|
|
|
|
local function SetChecked(data)
|
|
itemsCollectionFrame:SetChosenVisualSource(data.appearanceID, data.sourceID);
|
|
itemsCollectionFrame:SelectVisual(data.appearanceID);
|
|
end
|
|
|
|
local name, color = BetterWardrobeCollectionFrame:GetAppearanceNameTextAndColor(source);
|
|
local coloredText = color:WrapTextInColorCode(name);
|
|
local data = {appearanceID = appearanceID, sourceID = source.sourceID};
|
|
rootDescription:CreateRadio(coloredText, IsChecked, SetChecked, data);
|
|
end
|
|
end
|
|
end);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:OnEnter()
|
|
if ( not self.visualInfo ) then
|
|
return;
|
|
end
|
|
self:SetScript("OnUpdate", self.OnUpdate);
|
|
self.needsItemGeo = false;
|
|
local itemsCollectionFrame = self:GetParent();
|
|
if ( C_TransmogCollection.IsNewAppearance(self.visualInfo.visualID) ) then
|
|
C_TransmogCollection.ClearNewAppearance(self.visualInfo.visualID);
|
|
if itemsCollectionFrame.jumpToLatestAppearanceID == self.visualInfo.visualID then
|
|
itemsCollectionFrame.jumpToLatestAppearanceID = nil;
|
|
itemsCollectionFrame.jumpToLatestCategoryID = nil;
|
|
end
|
|
self.NewString:Hide();
|
|
self.NewGlow:Hide();
|
|
end
|
|
if ( itemsCollectionFrame.transmogLocation:IsIllusion() ) then
|
|
local name = C_TransmogCollection.GetIllusionStrings(self.visualInfo.sourceID);
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
|
GameTooltip:SetText(name);
|
|
if ( self.visualInfo.sourceText ) then
|
|
GameTooltip:AddLine(self.visualInfo.sourceText, 1, 1, 1, 1);
|
|
end
|
|
GameTooltip:Show();
|
|
else
|
|
self.needsItemGeo = not self:IsGeoReady();
|
|
itemsCollectionFrame:SetAppearanceTooltip(self);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:OnLeave()
|
|
self:SetScript("OnUpdate", nil);
|
|
ResetCursor();
|
|
self:GetParent():ClearAppearanceTooltip();
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:OnUpdate()
|
|
if IsModifiedClick("DRESSUP") then
|
|
ShowInspectCursor();
|
|
else
|
|
ResetCursor();
|
|
end
|
|
if self.needsItemGeo then
|
|
if self:IsGeoReady() then
|
|
self.needsItemGeo = false;
|
|
self:GetParent():SetAppearanceTooltip(self);
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:SetDesaturated(desaturated)
|
|
if self.desaturated ~= desaturated then
|
|
self.desaturated = desaturated;
|
|
self:SetDesaturation((desaturated and 1) or 0);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:Reload(reloadSlot)
|
|
if ( self:IsShown() ) then
|
|
if ( WARDROBE_MODEL_SETUP[reloadSlot] ) then
|
|
local useTransmogSkin = GetUseTransmogSkin(reloadSlot);
|
|
self:SetUseTransmogSkin(useTransmogSkin);
|
|
self:SetUseTransmogChoices(WARDROBE_MODEL_SETUP[reloadSlot].useTransmogChoices);
|
|
self:SetObeyHideInTransmogFlag(WARDROBE_MODEL_SETUP[reloadSlot].obeyHideInTransmogFlag);
|
|
self:SetUnit("player", false, PlayerUtil.ShouldUseNativeFormInModelScene());
|
|
self:SetDoBlend(false);
|
|
for slot, equip in pairs(WARDROBE_MODEL_SETUP[reloadSlot].slots) do
|
|
if ( equip ) then
|
|
self:TryOn(WARDROBE_MODEL_SETUP_GEAR[slot]);
|
|
end
|
|
end
|
|
end
|
|
|
|
local _, raceFilename = UnitRace("player");
|
|
local sex = UnitSex("player")
|
|
if (raceFilename == "Dracthyr" or raceFilename == "Worgen") then
|
|
local inNativeForm = C_UnitAuras.WantsAlteredForm("player");
|
|
self:SetUseTransmogSkin(false)
|
|
local modelID, altModelID;
|
|
if raceFilename == "Worgen" then
|
|
if sex == 3 then
|
|
modelID = 307453;
|
|
altModelID = 1000764;
|
|
else
|
|
modelID = 307454;
|
|
altModelID = 1011653;
|
|
end
|
|
elseif raceFilename == "Dracthyr" then
|
|
if sex == 3 then
|
|
modelID = 4207724;
|
|
altModelID = 4220448;
|
|
else
|
|
modelID = 4207724;
|
|
altModelID = 4395382;
|
|
end
|
|
end
|
|
|
|
if inNativeForm and not addon.useNativeForm then
|
|
self:SetUnit("player", false, false);
|
|
self:SetModel(altModelID);
|
|
|
|
elseif not inNativeForm and addon.useNativeForm then
|
|
self:SetUnit("player", false, true);
|
|
self:SetModel( modelID );
|
|
end
|
|
end
|
|
|
|
self:SetKeepModelOnHide(true);
|
|
self.cameraID = nil;
|
|
self.needsReload = nil;
|
|
else
|
|
self.needsReload = true;
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:OnShow()
|
|
if ( self.needsReload ) then
|
|
self:Reload(self:GetParent():GetActiveSlot());
|
|
end
|
|
end
|
|
|
|
BetterWardrobeSetsTransmogModelMixin = { };
|
|
|
|
function BetterWardrobeSetsTransmogModelMixin:OnLoad()
|
|
self:RegisterEvent("UI_SCALE_CHANGED");
|
|
self:RegisterEvent("DISPLAY_SIZE_CHANGED");
|
|
self:SetAutoDress(false);
|
|
self:SetUnit("player", false, PlayerUtil.ShouldUseNativeFormInModelScene());
|
|
self:FreezeAnimation(0, 0, 0);
|
|
local x, y, z = self:TransformCameraSpaceToModelSpace(CreateVector3D(0, 0, -0.25)):GetXYZ();
|
|
self:SetPosition(x, y, z);
|
|
|
|
local lightValues = { omnidirectional = false, point = CreateVector3D(-1, 1, -1), ambientIntensity = 1, ambientColor = CreateColor(1, 1, 1), diffuseIntensity = 0, diffuseColor = CreateColor(1, 1, 1) };
|
|
local enabled = true;
|
|
self:SetLight(enabled, lightValues);
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogModelMixin:OnEvent()
|
|
self:RefreshCamera();
|
|
local x, y, z = self:TransformCameraSpaceToModelSpace(CreateVector3D(0, 0, -0.25)):GetXYZ();
|
|
self:SetPosition(x, y, z);
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogModelMixin:OnMouseDown(button)
|
|
if ( button == "LeftButton" ) then
|
|
self:GetParent():SelectSet(self.setID);
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_ITEM_CLICK);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogModelMixin:OnMouseUp(button)
|
|
if button == "RightButton" then
|
|
local tab = addon.GetTab()
|
|
|
|
MenuUtil.CreateContextMenu(self, function(owner, rootDescription)
|
|
rootDescription:SetTag("MENU_WARDROBE_SETS_MODEL_FILTER");
|
|
|
|
local favorite, isGroupFavorite = C_TransmogSets.GetIsFavorite(self.setID) or addon.favoritesDB.profile.extraset[self.setID];
|
|
if favorite then
|
|
rootDescription:CreateButton(TRANSMOG_ITEM_UNSET_FAVORITE, function()
|
|
if tab == 2 then
|
|
C_TransmogSets.SetIsFavorite(self.setID, false);
|
|
else
|
|
addon.favoritesDB.profile.extraset[self.setID] = nil;
|
|
RefreshLists()
|
|
end
|
|
end);
|
|
else
|
|
rootDescription:CreateButton(TRANSMOG_ITEM_SET_FAVORITE, function()
|
|
if tab == 2 then
|
|
if isGroupFavorite then
|
|
local baseSetID = SetsDataProvider:GetBaseSetID(self.setID);
|
|
C_TransmogSets.SetIsFavorite(baseSetID, false);
|
|
|
|
for index, variantSet in ipairs(SetsDataProvider:GetVariantSets(baseSetID)) do
|
|
C_TransmogSets.SetIsFavorite(variantSet.setID, false);
|
|
end
|
|
end
|
|
|
|
C_TransmogSets.SetIsFavorite(self.setID, true);
|
|
elseif tab == 3 then
|
|
addon.favoritesDB.profile.extraset[self.setID] = true;
|
|
RefreshLists()
|
|
end
|
|
end);
|
|
end
|
|
|
|
if tab ~= 4 then
|
|
rootDescription:CreateDivider();
|
|
|
|
local type = tabType[addon.GetTab()]
|
|
|
|
local variantTarget, match, matchType;
|
|
local variantType = ""
|
|
if type == "set" or type =="extraset" then
|
|
rootDescription:CreateButton(L["Queue Transmog"], function()
|
|
local setInfo = addon.GetSetInfo(self.setID) or C_TransmogSets.GetSetInfo(self.setID)
|
|
local name = setInfo["name"]
|
|
--addon.QueueForTransmog(type, setID, name)
|
|
addon.QueueList = {type, self.setID, name}
|
|
end);
|
|
if type == "set" then
|
|
variantTarget, variantType, match, matchType = addon.Sets:SelectedVariant(self.setID)
|
|
end
|
|
end
|
|
rootDescription:CreateDivider();
|
|
local isHidden = addon.HiddenAppearanceDB.profile[type][self.setID]
|
|
--print(isHidden)
|
|
rootDescription:CreateButton(isHidden and SHOW or HIDE, function()
|
|
--self.setID = setID;
|
|
ToggleHidden(self, isHidden)
|
|
end);
|
|
end
|
|
end);
|
|
end
|
|
end
|
|
function BetterWardrobeSetsTransmogModelMixin:OnEnter()
|
|
self:GetParent().tooltipModel = self;
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
|
self:RefreshTooltip();
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogModelMixin:RefreshTooltip()
|
|
local totalQuality = 0;
|
|
local numTotalSlots = 0;
|
|
local waitingOnQuality = false;
|
|
local sourceQualityTable = self:GetParent().sourceQualityTable or {};
|
|
|
|
if BetterWardrobeCollectionFrame:CheckTab(4) then
|
|
return;
|
|
end
|
|
local sources = addon.SetsDataProvider:GetSetSources(self.setID);
|
|
|
|
if not self.setID then return end
|
|
|
|
local holidayName
|
|
for sourceID,_ in pairs(sources) do
|
|
if not holidayName then
|
|
holidayName = C_TransmogCollection.GetSourceRequiredHoliday(sourceID);
|
|
end
|
|
numTotalSlots = numTotalSlots + 1;
|
|
if ( sourceQualityTable[sourceID] ) then
|
|
totalQuality = totalQuality + sourceQualityTable[sourceID];
|
|
else
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID);
|
|
if ( sourceInfo and sourceInfo.quality ) then
|
|
sourceQualityTable[sourceID] = sourceInfo.quality;
|
|
totalQuality = totalQuality + sourceInfo.quality;
|
|
else
|
|
waitingOnQuality = true;
|
|
end
|
|
end
|
|
end
|
|
|
|
if ( waitingOnQuality ) then
|
|
GameTooltip:SetText(RETRIEVING_ITEM_INFO, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
|
|
else
|
|
local setQuality = (numTotalSlots > 0 and totalQuality > 0) and Round(totalQuality / numTotalSlots) or Enum.ItemQuality.Common;
|
|
local color = ITEM_QUALITY_COLORS[setQuality];
|
|
local setInfo = addon.SetsDataProvider:GetSetByID(self.setID);
|
|
GameTooltip:SetText(setInfo.name, color.r, color.g, color.b);
|
|
if ( setInfo.label ) then
|
|
GameTooltip:AddLine(setInfo.label);
|
|
GameTooltip:Show();
|
|
end
|
|
if ( holidayName ) then
|
|
GameTooltip:AddLine(TRANSMOG_APPEARANCE_USABLE_HOLIDAY:format(holidayName), LIGHTBLUE_FONT_COLOR.r, LIGHTBLUE_FONT_COLOR.g, LIGHTBLUE_FONT_COLOR.b);
|
|
GameTooltip:Show();
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogModelMixin:OnLeave()
|
|
GameTooltip:Hide();
|
|
self:GetParent().tooltipModel = nil;
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogModelMixin:OnShow()
|
|
self:SetUnit("player", false, PlayerUtil.ShouldUseNativeFormInModelScene());
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogModelMixin:OnHide()
|
|
self.setID = nil;
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogModelMixin:OnModelLoaded()
|
|
if ( self.cameraID ) then
|
|
addon.Model_ApplyUICamera(self, self.cameraID);
|
|
end
|
|
if self.setID then
|
|
self.setID = nil;
|
|
self:GetParent():MarkDirty();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:GetChosenVisualSource(visualID)
|
|
return self.chosenVisualSources[visualID] or Constants.Transmog.NoTransmogID;
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:SetChosenVisualSource(visualID, sourceID)
|
|
self.chosenVisualSources[visualID] = sourceID;
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:ValidateChosenVisualSources()
|
|
for visualID, sourceID in pairs(self.chosenVisualSources) do
|
|
if ( sourceID ~= Constants.Transmog.NoTransmogID ) then
|
|
local keep = false;
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID);
|
|
if sourceInfo then
|
|
if sourceInfo.isCollected and not sourceInfo.useError then
|
|
keep = true;
|
|
end
|
|
end
|
|
if ( not keep ) then
|
|
self.chosenVisualSources[visualID] = Constants.Transmog.NoTransmogID;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameModelDropDown_SetSource(self, visualID, sourceID)
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:SetChosenVisualSource(visualID, sourceID);
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:SelectVisual(visualID);
|
|
end
|
|
|
|
|
|
function addon:SetFavoriteItem(visualID, set)
|
|
if addon.favoritesDB.profile.item[visualID] then
|
|
addon.favoritesDB.profile.item[visualID] = nil;
|
|
else
|
|
addon.favoritesDB.profile.item[visualID] = true;
|
|
end
|
|
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList();
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:UpdateItems();
|
|
end
|
|
|
|
|
|
function addon:IsFavoriteItem(visualID)
|
|
return addon.favoritesDB.profile.item[visualID];
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameModelDropdown_SetFavorite(visualID, setFavorite, confirmed)
|
|
if ( setFavorite and not confirmed ) then
|
|
local allSourcesConditional = true;
|
|
local sources = C_TransmogCollection.GetAppearanceSources(visualID, BetterWardrobeCollectionFrame.ItemsCollectionFrame:GetActiveCategory(), BetterWardrobeCollectionFrame.ItemsCollectionFrame.transmogLocation);
|
|
for i, sourceInfo in ipairs(sources) do
|
|
local info = C_TransmogCollection.GetAppearanceInfoBySource(sourceInfo.sourceID);
|
|
if info.isCollected then
|
|
collected = true;
|
|
end
|
|
if ( info.sourceIsCollectedPermanent ) then
|
|
allSourcesConditional = false;
|
|
break;
|
|
end
|
|
end
|
|
if ( allSourcesConditional and collected ) then
|
|
StaticPopup_Show("TRANSMOG_FAVORITE_WARNING", nil, nil, visualID);
|
|
return;
|
|
elseif ( allSourcesConditional and not collected ) then
|
|
addon:SetFavoriteItem(visualID, set);
|
|
return
|
|
end
|
|
end
|
|
C_TransmogCollection.SetIsAppearanceFavorite(visualID, set);
|
|
SetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_MODEL_CLICK, true);
|
|
HelpTip:Hide(BetterWardrobeCollectionFrame.ItemsCollectionFrame, TRANSMOG_MOUSE_CLICK_TUTORIAL);
|
|
end
|
|
|
|
-- ***** TUTORIAL
|
|
--[[
|
|
WardrobeCollectionTutorialMixin = { };
|
|
|
|
function WardrobeCollectionTutorialMixin:OnLoad()
|
|
|
|
self.helpTipInfo = {
|
|
text = WARDROBE_SHORTCUTS_TUTORIAL_1,
|
|
buttonStyle = HelpTip.ButtonStyle.None,
|
|
targetPoint = HelpTip.Point.BottomEdgeLeft,
|
|
alignment = HelpTip.Alignment.Left,
|
|
offsetX = 32,
|
|
offsetY = 16,
|
|
appendFrame = TrackingInterfaceShortcutsFrame,
|
|
};
|
|
|
|
end
|
|
|
|
function WardrobeCollectionTutorialMixin:OnEnter()
|
|
HelpTip:Show(self, self.helpTipInfo);
|
|
end
|
|
|
|
function WardrobeCollectionTutorialMixin:OnLeave()
|
|
HelpTip:Hide(self, WARDROBE_SHORTCUTS_TUTORIAL_1);
|
|
end
|
|
|
|
]]
|
|
BetterWardrobeCollectionClassDropdownMixin = {};
|
|
|
|
function BetterWardrobeCollectionClassDropdownMixin:OnLoad()
|
|
self:SetWidth(150);
|
|
|
|
self:SetSelectionTranslator(function(selection)
|
|
local classInfo = selection.data;
|
|
local classColor = GetClassColorObj(classInfo.classFile) or HIGHLIGHT_FONT_COLOR;
|
|
return classColor:WrapTextInColorCode(classInfo.className);
|
|
end);
|
|
end
|
|
|
|
function BetterWardrobeCollectionClassDropdownMixin:OnShow()
|
|
self:Refresh();
|
|
|
|
WardrobeFrame:RegisterCallback(BetterWardrobeFrameMixin.Event.OnCollectionTabChanged, self.Refresh, self);
|
|
end
|
|
|
|
function BetterWardrobeCollectionClassDropdownMixin:OnHide()
|
|
WardrobeFrame:UnregisterCallback(BetterWardrobeFrameMixin.Event.OnCollectionTabChanged, self);
|
|
end
|
|
|
|
function BetterWardrobeCollectionClassDropdownMixin:GetClassFilter()
|
|
local searchType = BetterWardrobeCollectionFrame:GetSearchType();
|
|
if searchType == Enum.TransmogSearchType.Items then
|
|
return C_TransmogCollection.GetClassFilter();
|
|
elseif searchType == Enum.TransmogSearchType.BaseSets then
|
|
return C_TransmogSets.GetTransmogSetsClassFilter();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionClassDropdownMixin:SetClassFilter(classID)
|
|
local searchType = BetterWardrobeCollectionFrame:GetSearchType();
|
|
if searchType == Enum.TransmogSearchType.Items then
|
|
-- Let's reset to the helmet category if the class filter changes while a weapon category is active
|
|
-- Not all classes can use the same weapons so the current category might not be valid
|
|
local name, isWeapon = C_TransmogCollection.GetCategoryInfo(BetterWardrobeCollectionFrame.ItemsCollectionFrame:GetActiveCategory());
|
|
if isWeapon then
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:SetActiveSlot(TransmogUtil.GetTransmogLocation("HEADSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.Main));
|
|
end
|
|
|
|
C_TransmogCollection.SetClassFilter(classID);
|
|
elseif searchType == Enum.TransmogSearchType.BaseSets then
|
|
C_TransmogSets.SetTransmogSetsClassFilter(classID);
|
|
addon:ClearSets()
|
|
addon.Init:InitDB()
|
|
addon.RefreshLists()
|
|
end
|
|
|
|
self:Refresh();
|
|
end
|
|
|
|
function BetterWardrobeCollectionClassDropdownMixin:Refresh()
|
|
local classFilter = self:GetClassFilter();
|
|
if not classFilter then
|
|
return;
|
|
end
|
|
|
|
local classInfo = C_CreatureInfo.GetClassInfo(classFilter);
|
|
if not classInfo then
|
|
return;
|
|
end
|
|
|
|
self:SetupMenu(function(dropdown, rootDescription)
|
|
rootDescription:SetTag("MENU_WARDROBE_CLASS");
|
|
|
|
local function IsClassFilterSet(classInfo)
|
|
return self:GetClassFilter() == classInfo.classID;
|
|
end
|
|
|
|
local function SetClassFilter(classInfo)
|
|
self:SetClassFilter(classInfo.classID);
|
|
end
|
|
|
|
for classID = 1, GetNumClasses() do
|
|
local classInfo = C_CreatureInfo.GetClassInfo(classID);
|
|
rootDescription:CreateRadio(classInfo.className, IsClassFilterSet, SetClassFilter, classInfo);
|
|
end
|
|
end);
|
|
end
|
|
|
|
BetterWardrobeCollectionFrameSearchBoxProgressMixin = { };
|
|
|
|
function BetterWardrobeCollectionFrameSearchBoxProgressMixin:OnLoad()
|
|
self:SetFrameLevel(self:GetParent():GetFrameLevel() + 15);
|
|
|
|
self.ProgressBar:SetStatusBarColor(0, .6, 0, 1);
|
|
self.ProgressBar:SetMinMaxValues(0, 1000);
|
|
self.ProgressBar:SetValue(0);
|
|
self.ProgressBar:GetStatusBarTexture():SetDrawLayer("BORDER");
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameSearchBoxProgressMixin:OnHide()
|
|
self.ProgressBar:SetValue(0);
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameSearchBoxProgressMixin:OnUpdate(elapsed)
|
|
if self.updateProgressBar then
|
|
local searchType = BetterWardrobeCollectionFrame:GetSearchType();
|
|
if not C_TransmogCollection.IsSearchInProgress(searchType) then
|
|
self:Hide();
|
|
else
|
|
local _, maxValue = self.ProgressBar:GetMinMaxValues();
|
|
local searchSize = C_TransmogCollection.SearchSize(searchType);
|
|
local searchProgress = C_TransmogCollection.SearchProgress(searchType);
|
|
self.ProgressBar:SetValue((searchProgress * maxValue) / searchSize);
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameSearchBoxProgressMixin:ShowLoadingFrame()
|
|
self.LoadingFrame:Show();
|
|
self.ProgressBar:Hide();
|
|
self.updateProgressBar = false;
|
|
self:Show();
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameSearchBoxProgressMixin:ShowProgressBar()
|
|
self.LoadingFrame:Hide();
|
|
self.ProgressBar:Show();
|
|
self.updateProgressBar = true;
|
|
self:Show();
|
|
end
|
|
|
|
BetterWardrobeCollectionFrameSearchBoxMixin = { }
|
|
|
|
function BetterWardrobeCollectionFrameSearchBoxMixin:OnLoad()
|
|
SearchBoxTemplate_OnLoad(self);
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameSearchBoxMixin:OnHide()
|
|
self.ProgressFrame:Hide();
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameSearchBoxMixin:OnKeyDown(key, ...)
|
|
if key == WARDROBE_CYCLE_KEY then
|
|
BetterWardrobeCollectionFrame:OnKeyDown(key, ...);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameSearchBoxMixin:StartCheckingProgress()
|
|
self.checkProgress = true;
|
|
self.updateDelay = 0;
|
|
end
|
|
|
|
local WARDROBE_SEARCH_DELAY = 0.6;
|
|
function BetterWardrobeCollectionFrameSearchBoxMixin:OnUpdate(elapsed)
|
|
if not self.checkProgress then
|
|
return;
|
|
end
|
|
|
|
self.updateDelay = self.updateDelay + elapsed;
|
|
|
|
if not C_TransmogCollection.IsSearchInProgress(BetterWardrobeCollectionFrame:GetSearchType()) then
|
|
self.checkProgress = false;
|
|
elseif self.updateDelay >= WARDROBE_SEARCH_DELAY then
|
|
self.checkProgress = false;
|
|
if not C_TransmogCollection.IsSearchDBLoading() then
|
|
self.ProgressFrame:ShowProgressBar();
|
|
else
|
|
self.ProgressFrame:ShowLoadingFrame();
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameSearchBoxMixin:OnTextChanged()
|
|
SearchBoxTemplate_OnTextChanged(self);
|
|
BetterWardrobeCollectionFrame:SetSearch(self:GetText());
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameSearchBoxMixin:OnEnter()
|
|
if not self:IsEnabled() then
|
|
GameTooltip:ClearAllPoints();
|
|
GameTooltip:SetPoint("BOTTOM", self, "TOP", 0, 0);
|
|
GameTooltip:SetOwner(self, "ANCHOR_PRESERVE");
|
|
GameTooltip:SetText(WARDROBE_NO_SEARCH);
|
|
end
|
|
end
|
|
|
|
-- ************************************************************************************************************************************************************
|
|
-- **** SETS LIST *********************************************************************************************************************************************
|
|
-- ************************************************************************************************************************************************************
|
|
|
|
local BASE_SET_BUTTON_HEIGHT = 46;
|
|
local VARIANT_SET_BUTTON_HEIGHT = 20;
|
|
local SET_PROGRESS_BAR_MAX_WIDTH = 204;
|
|
local IN_PROGRESS_FONT_COLOR = CreateColor(0.251, 0.753, 0.251);
|
|
local IN_PROGRESS_FONT_COLOR_CODE = "|cff40c040";
|
|
|
|
BetterWardrobeSetsDataProviderMixin = {};
|
|
function BetterWardrobeSetsDataProviderMixin:GetSetByID(SetID)
|
|
local BaseSets = addon.BaseIDs
|
|
local VariantIDs = addon.VariantIDs
|
|
local VariantSets = addon.VariantSets
|
|
|
|
if (BaseSets[SetID] ~= nil) then
|
|
return BaseSets[SetID];
|
|
end
|
|
|
|
if (VariantIDs[SetID] ~= nil) then
|
|
local baseSet = VariantIDs[SetID];
|
|
|
|
for i=1,#VariantSets[baseSet] do
|
|
if VariantSets[baseSet][i].setID == SetID then
|
|
return VariantSets[baseSet][i];
|
|
end
|
|
end
|
|
end
|
|
|
|
return nil;
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetBaseSetID(SetID)
|
|
local BaseSets = addon.BaseIDs
|
|
local VariantIDs = addon.VariantIDs
|
|
|
|
if (BaseSets[SetID]) then
|
|
return SetID;
|
|
end
|
|
|
|
return VariantIDs[SetID];
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:SortSets(sets, reverseUIOrder, ignorePatchID)
|
|
addon.SortSet(sets, reverseUIOrder, ignorePatchID)
|
|
--[[
|
|
local comparison = function(set1, set2)
|
|
local groupFavorite1 = set1.favoriteSetID and true;
|
|
local groupFavorite2 = set2.favoriteSetID and true;
|
|
if ( groupFavorite1 ~= groupFavorite2 ) then
|
|
return groupFavorite1;
|
|
end
|
|
if ( set1.favorite ~= set2.favorite ) then
|
|
return set1.favorite;
|
|
end
|
|
if ( set1.expansionID ~= set2.expansionID ) then
|
|
return set1.expansionID > set2.expansionID;
|
|
end
|
|
if not ignorePatchID then
|
|
if ( set1.patchID ~= set2.patchID ) then
|
|
return set1.patchID > set2.patchID;
|
|
end
|
|
end
|
|
if ( set1.uiOrder ~= set2.uiOrder ) then
|
|
if ( reverseUIOrder ) then
|
|
return set1.uiOrder < set2.uiOrder;
|
|
else
|
|
return set1.uiOrder > set2.uiOrder;
|
|
end
|
|
end
|
|
if reverseUIOrder then
|
|
return set1.setID < set2.setID;
|
|
else
|
|
return set1.setID > set2.setID;
|
|
end
|
|
end
|
|
|
|
table.sort(sets, comparison);
|
|
]]
|
|
end
|
|
|
|
local function CheckMissingLocation(setInfo)
|
|
local filtered = false;
|
|
local missingSelection
|
|
if BetterWardrobeCollectionFrame:CheckTab(2) then
|
|
|
|
local invType = {}
|
|
missingSelection = addon.Filters.Base.missingSelection;
|
|
local sources = C_TransmogSets.GetSetPrimaryAppearances(setInfo.setID)
|
|
if not sources then return end
|
|
for sourceID in pairs(sources) do
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID)
|
|
local _, visualID, _, _, _, itemLink = C_TransmogCollection.GetAppearanceSourceInfo(sourceInfo.visualID)
|
|
local sources = sourceInfo and itemLink and C_TransmogCollection.GetAppearanceSources(sourceInfo.visualID, addon.GetItemCategory(sourceInfo.visualID), addon.GetTransmogLocation(itemLink))
|
|
if sources then
|
|
if #sources > 1 then
|
|
CollectionWardrobeUtil.SortSources(sources, sourceInfo.visualID, sourceID)
|
|
end
|
|
if missingSelection[sourceInfo.invType] and not sources[1].isCollected then
|
|
|
|
return true;
|
|
elseif missingSelection[sourceInfo.invType] then
|
|
filtered = true;
|
|
end
|
|
end
|
|
end
|
|
|
|
for type, value in pairs(missingSelection) do
|
|
if value and invType[type] then
|
|
filtered = true;
|
|
end
|
|
end
|
|
else
|
|
missingSelection = addon.Filters.Extra.missingSelection;
|
|
|
|
for type, value in pairs(missingSelection) do
|
|
if value then
|
|
filtered = true;
|
|
break;
|
|
end
|
|
end
|
|
--no need to filter if nothing is selected;
|
|
if not filtered then return true end
|
|
|
|
local invType = {}
|
|
if not setInfo.items then
|
|
local sources = C_TransmogSets.GetSetPrimaryAppearances(setInfo.setID)
|
|
for sourceID in pairs(sources) do
|
|
local isCollected = Sets.isMogKnown(sourceID)
|
|
if missingSelection[sourceInfo.invType] and not isCollected then
|
|
return true;
|
|
elseif missingSelection[sourceInfo.invType] then
|
|
filtered = true;
|
|
end
|
|
end
|
|
else
|
|
local setSources = SetsDataProvider:GetSetSources(setInfo.setID)
|
|
for sourceID, isCollected in pairs(setSources) do
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID)
|
|
if missingSelection[sourceInfo.invType] and not isCollected then
|
|
return true;
|
|
elseif missingSelection[sourceInfo.invType] then
|
|
filtered = true
|
|
end
|
|
end
|
|
end
|
|
|
|
for type, value in pairs(missingSelection) do
|
|
if value and invType[type] then
|
|
filtered = true;
|
|
end
|
|
end
|
|
end
|
|
return not filtered;
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetBaseSets(filter)
|
|
local filteredSets = {}
|
|
if BetterWardrobeCollectionFrame:CheckTab(4) then
|
|
basesets = self.baseSavedSets;
|
|
if not self.baseSavedSets then
|
|
self.baseSavedSets = addon.GetSavedList()
|
|
self:SortSets(self.baseSavedSets)
|
|
|
|
end
|
|
return self.baseSavedSets;
|
|
end
|
|
|
|
|
|
if ( not self.baseSets ) then
|
|
--self.baseSets = addon.BaseList --C_TransmogSets.GetBaseSets();
|
|
self.baseSets = addon:FilterSets(addon.BaseList)
|
|
self:DetermineFavorites();
|
|
self:SortSets(self.baseSets);
|
|
end
|
|
return self.baseSets;
|
|
end
|
|
|
|
|
|
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetBaseSetByID(baseSetID)
|
|
local baseSets = self:GetBaseSets();
|
|
for i = 1, #baseSets do
|
|
if ( baseSets[i].setID == baseSetID ) then
|
|
return baseSets[i], i;
|
|
end
|
|
end
|
|
return nil, nil;
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetUsableSets(incVariants)
|
|
local atTransmogrifier = C_Transmog.IsAtTransmogNPC()
|
|
local setIDS = {}
|
|
local Profile = addon.Profile;
|
|
|
|
if BetterWardrobeCollectionFrame:CheckTab(4) then
|
|
if ( not self.usableSavedSets ) then
|
|
self.usableSavedSets = addon.GetSavedList()
|
|
self:SortSets(self.usableSavedSets)
|
|
end
|
|
|
|
return self.usableSavedSets;
|
|
end
|
|
|
|
if not self.usableSets then
|
|
self.usableSets = {}
|
|
local sets = addon.GetSets();
|
|
local countData;
|
|
sets = addon:FilterSets(sets)
|
|
sets = addon:SearchSets(sets)
|
|
for _, data in pairs(sets) do
|
|
local topSourcesCollected, topSourcesTotal;
|
|
topSourcesCollected, topSourcesTotal = self:GetSetSourceCounts(data.setID)
|
|
local cutoffLimit = (Profile.ShowIncomplete and ((topSourcesTotal <= Profile.PartialLimit and topSourcesTotal) or Profile.PartialLimit)) or topSourcesTotal --self:GetSetSourceCounts(set.setID)
|
|
|
|
if (BetterWardrobeVisualToggle.viewAll and BetterWardrobeVisualToggle.VisualMode) or (not atTransmogrifier and BetterWardrobeVisualToggle.VisualMode) or topSourcesCollected >= cutoffLimit and topSourcesTotal > 0 then --and not C_TransmogSets.IsSetUsable(set.setID) then
|
|
tinsert(self.usableSets, data)
|
|
end
|
|
|
|
self:SortSets(self.usableSets)
|
|
end
|
|
end
|
|
|
|
return self.usableSets
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetVariantSets(baseSetID)
|
|
if ( not self.variantSets ) then
|
|
self.variantSets = { };
|
|
end
|
|
|
|
if BetterWardrobeCollectionFrame:CheckTab(4) or not baseSetID then return {} end
|
|
|
|
local variantSets = self.variantSets[baseSetID];
|
|
if ( not variantSets ) then
|
|
|
|
local variantSetsAll = addon.VariantSets[addon.VariantIDs[baseSetID]];
|
|
if not variantSetsAll then
|
|
variantSetsAll = {};
|
|
end
|
|
|
|
local variantSets = {};
|
|
for i=1, #variantSetsAll do
|
|
tinsert(variantSets, variantSetsAll[i]);
|
|
end
|
|
|
|
local reverseUIOrder = true;
|
|
local ignorePatchID = true;
|
|
|
|
addon.SortVariantSet(variantSets, reverseUIOrder, ignorePatchID);
|
|
self.variantSets[baseSetID] = variantSets;
|
|
end
|
|
|
|
return variantSets or {};
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetSetSourceData(setID)
|
|
if ( not self.sourceData ) then
|
|
self.sourceData = { };
|
|
end
|
|
|
|
local sourceData = self.sourceData[setID];
|
|
if ( not sourceData ) then
|
|
local setSources = self:GetSetSources(setID);
|
|
local numCollected = 0;
|
|
local numTotal = 0;
|
|
for sourceID, collected in pairs(setSources) do
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID);
|
|
if sourceInfo then
|
|
local visualID = sourceInfo.visualID;
|
|
if visualID then
|
|
local sources = C_TransmogCollection.GetAllAppearanceSources(visualID);
|
|
for _, id in pairs(sources) do
|
|
local info = C_TransmogCollection.GetSourceInfo(id);
|
|
if info then
|
|
if info.isCollected then
|
|
numCollected = numCollected + 1;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
numTotal = numTotal + 1;
|
|
end
|
|
sourceData = { numCollected = numCollected, numTotal = numTotal, sources = setSources, collected = numCollected == numTotal };
|
|
self.sourceData[setID] = sourceData;
|
|
end
|
|
|
|
return self.sourceData[setID];
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetSetSourceCounts(setID)
|
|
local sourceData = self:GetSetSourceData(setID);
|
|
if sourceData then
|
|
return sourceData.numCollected, sourceData.numTotal;
|
|
else
|
|
return 0,0;
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetBaseSetData(setID)
|
|
--if not setID then return {} end
|
|
if ( not self.baseSetsData ) then
|
|
self.baseSetsData = {}
|
|
end
|
|
if ( not self.baseSetsData[setID] ) then
|
|
local baseSetID = self:GetBaseSetID(setID);
|
|
if ( baseSetID ~= setID ) then
|
|
return;
|
|
end
|
|
local topCollected, topTotal = self:GetSetSourceCounts(baseSetID);
|
|
local variantSets = self:GetVariantSets(baseSetID);
|
|
for i = 1, #variantSets do
|
|
local numCollected, numTotal = self:GetSetSourceCounts(variantSets[i].setID);
|
|
if ( numCollected > topCollected ) then
|
|
topCollected = numCollected;
|
|
topTotal = numTotal;
|
|
end
|
|
end
|
|
local setInfo = { topCollected = topCollected, topTotal = topTotal, completed = (topCollected == topTotal)};
|
|
self.baseSetsData[setID] = setInfo;
|
|
end
|
|
return self.baseSetsData[setID];
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetSetSourceTopCounts(setID)
|
|
local baseSetData = self:GetBaseSetData(setID);
|
|
if ( baseSetData ) then
|
|
return baseSetData.topCollected, baseSetData.topTotal;
|
|
else
|
|
return self:GetSetSourceCounts(setID);
|
|
end
|
|
end
|
|
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetSetSources(setID)
|
|
local set = self:GetSetByID(setID) or {};
|
|
if not setID then return {} end
|
|
if set.sources == nil then
|
|
set.sources = {};
|
|
local setAppearances = C_TransmogSets.GetSetPrimaryAppearances(setID);
|
|
for i, appearanceInfo in ipairs(setAppearances) do
|
|
set.sources[appearanceInfo.appearanceID] = appearanceInfo.collected;
|
|
end
|
|
end
|
|
for id, data in pairs(set.sources) do
|
|
local newSourceID = addon.GetSubItem(id, setID)
|
|
if newSourceID then
|
|
local info = C_TransmogCollection.GetSourceInfo(newSourceID)
|
|
set.swap = set.swap or {}
|
|
set.swap[newSourceID] = true
|
|
set.sources[id]= nil
|
|
set.sources[newSourceID] = info.isCollected
|
|
end
|
|
end
|
|
|
|
return set.sources;
|
|
end
|
|
|
|
local NewVisualIDs = {}
|
|
function BetterWardrobeSetsDataProviderMixin:SetHasNewSources(setID)
|
|
if setID and setID >= 5000 then
|
|
local sources = self:GetSetSources(setID);
|
|
for sourceID,_ in pairs(sources) do
|
|
local visID = C_TransmogCollection.GetSourceInfo(sourceID).visualID;
|
|
for i=1,#NewVisualIDs do
|
|
if visID == NewVisualIDs[i] then
|
|
return true;
|
|
end
|
|
end
|
|
end
|
|
return false;
|
|
elseif setID then
|
|
return C_TransmogSets.SetHasNewSources(setID);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:IsBaseSetNew(baseSetID)
|
|
local baseSetData = self:GetBaseSetData(baseSetID);
|
|
|
|
if ( not baseSetData.newStatus ) then
|
|
local newStatus = self:SetHasNewSources(baseSetID);
|
|
if ( not newStatus ) then
|
|
-- check variants
|
|
local variantSets = self:GetVariantSets(baseSetID);
|
|
for i, variantSet in ipairs(variantSets) do
|
|
if ( variantSet.setID and self:SetHasNewSources(baseSetID) ) then
|
|
|
|
newStatus = true;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
baseSetData.newStatus = newStatus;
|
|
end
|
|
|
|
return baseSetData.newStatus;
|
|
end
|
|
|
|
local classGlobal = strsplit(" ", ITEM_CLASSES_ALLOWED)
|
|
local ClassSetCache = {}
|
|
local function CheckClass(itemLink)
|
|
local itemID = GetItemInfoInstant(itemLink)
|
|
if not ClassSetCache[itemID] then
|
|
--Calls twice since the first time usually does not contain actual data
|
|
local tooltipData = C_TooltipInfo.GetHyperlink(itemLink)
|
|
tooltipData = C_TooltipInfo.GetHyperlink(itemLink)
|
|
|
|
TooltipUtil.SurfaceArgs(tooltipData)
|
|
|
|
for _, line in ipairs(tooltipData.lines) do
|
|
TooltipUtil.SurfaceArgs(line)
|
|
end
|
|
|
|
for i=1,#tooltipData.lines do
|
|
local text = tooltipData.lines[i].leftText
|
|
if text and string.find(text, classGlobal) and not string.find(text, playerClassName) then
|
|
ClassSetCache[itemID] = false
|
|
break
|
|
elseif text and string.find(text, classGlobal) and string.find(text, playerClassName) then
|
|
ClassSetCache[itemID] = true
|
|
break
|
|
end
|
|
end
|
|
|
|
ClassSetCache[itemID] = true
|
|
end
|
|
|
|
return ClassSetCache[itemID]
|
|
end
|
|
|
|
|
|
--TODO: REVISIT
|
|
local function IsSetComplete(setID)
|
|
local sources = SetsDataProvider:GetSetSources(setID);
|
|
for sourceID,collected in pairs(sources) do
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID);
|
|
if sourceInfo then
|
|
local appearanceID = sourceInfo.visualID;
|
|
|
|
local thisCollected = false;
|
|
if sourceInfo.isCollected then
|
|
thisCollected = true;
|
|
elseif appearanceID then
|
|
local appSources = C_TransmogCollection.GetAllAppearanceSources(appearanceID);
|
|
|
|
for _,sourceID2 in pairs(appSources) do
|
|
|
|
local sourceInfos = C_TransmogCollection.GetSourceInfo(sourceID2);
|
|
if sourceInfos ~= nil then
|
|
if sourceInfos.isCollected then
|
|
thisCollected = true;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if not thisCollected then
|
|
return false;
|
|
end
|
|
end
|
|
end
|
|
return true;
|
|
end
|
|
|
|
|
|
local SetIDForSource = {};
|
|
|
|
--TODO: REVISIT
|
|
local function GetSetIDsBySourceID(sourceID)
|
|
local visID = C_TransmogCollection.GetSourceInfo(sourceID).visualID;
|
|
return SetIDForSource[visID];
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:ResetBaseSetNewStatus(baseSetID)
|
|
local baseSetData = self:GetBaseSetData(baseSetID)
|
|
if ( baseSetData ) then
|
|
baseSetData.newStatus = false;
|
|
end
|
|
end
|
|
|
|
local function GetCombinedAppearanceSources(appearanceID)
|
|
local categoryID, visualID, canEnchant, icon, isCollected, itemLink, transmogLink, unknown1, itemSubTypeIndex = C_TransmogCollection.GetAppearanceSourceInfo(appearanceID)
|
|
local sources = C_TransmogCollection.GetAllAppearanceSources(appearanceID) or {}
|
|
|
|
local sources2 = (appearanceID and itemLink and C_TransmogCollection.GetAppearanceSources(appearanceID, addon.GetItemCategory(appearanceID), addon.GetTransmogLocation(itemLink)) )or {}
|
|
|
|
if (sources2 and sources) then
|
|
for i = 1, #sources2 do
|
|
local addTosources = true;
|
|
for j = 1, #sources do
|
|
if sources2[i].sourceID == sources[j] then
|
|
addTosources = false;
|
|
break;
|
|
end
|
|
end
|
|
if addTosources then
|
|
table.insert(sources, sources2[i].sourceID)
|
|
end
|
|
end
|
|
elseif sources2 and not sources then
|
|
sources = sources2;
|
|
end
|
|
|
|
return sources;
|
|
end
|
|
|
|
local function CheckCollectionStatus(sources)
|
|
if not sources then return false, false end
|
|
local characterCollectable = false;
|
|
local characterUseable = false;
|
|
|
|
for _,sourceID in pairs(sources) do
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID)
|
|
|
|
local link = select(6, C_TransmogCollection.GetAppearanceSourceInfo(sourceInfo.sourceID))
|
|
--local classSet = CheckClass(link)
|
|
|
|
if not characterCollectable and classSet then
|
|
characterCollectable = true;
|
|
end
|
|
|
|
if not characterUseable and classSet and sourceInfo.isCollected then
|
|
characterUseable = true;
|
|
end
|
|
|
|
if sourceInfo.isCollected and characterCollectable and characterUseable then
|
|
break;
|
|
end
|
|
end
|
|
|
|
return characterCollectable, characterUseable;
|
|
end
|
|
function BetterWardrobeSetsDataProviderMixin:GetSortedSetSources(setID)
|
|
local returnTable = { }
|
|
|
|
local sourceData = self:GetSetSourceData(setID)
|
|
local setType = addon.GetSetType(setID)
|
|
|
|
|
|
|
|
|
|
|
|
----elseif BetterWardrobeCollectionFrame:CheckTab(3) then
|
|
for sourceID, collected in pairs(sourceData.sources) do
|
|
local newSourceInfo = addon.GetSubItem(sourceID, setID)
|
|
if newSourceInfo then
|
|
sourceID = newSourceInfo
|
|
end
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID)
|
|
local sources = (sourceInfo and GetCombinedAppearanceSources(sourceInfo.visualID)) or {}
|
|
local characterCollectable, characterUseable = CheckCollectionStatus(sources)
|
|
|
|
if (sourceInfo) then
|
|
local sortOrder = EJ_GetInvTypeSortOrder(sourceInfo.invType)
|
|
tinsert(returnTable, {sourceID = sourceID, collected = collected, sortOrder = sortOrder, itemID = sourceInfo.itemID, invType = sourceInfo.invType, visualID = sourceInfo.visualID, characterUseable = characterUseable, characterCollectable = characterCollectable })
|
|
end
|
|
end
|
|
|
|
|
|
local comparison = function(entry1, entry2)
|
|
if ( entry1.sortOrder == entry2.sortOrder ) then
|
|
return entry1.itemID < entry2.itemID;
|
|
else
|
|
return entry1.sortOrder < entry2.sortOrder;
|
|
end
|
|
end
|
|
|
|
table.sort(returnTable, comparison)
|
|
return returnTable;
|
|
end
|
|
function BetterWardrobeSetsDataProviderMixin:ClearSets()
|
|
self.baseSets = nil;
|
|
|
|
self.baseExtraSets = nil;
|
|
self.baseSavedSets = nil;
|
|
self.baseSetsData = nil;
|
|
self.baseExtraSetsData = nil;
|
|
self.variantSets = nil;
|
|
|
|
self.usableSets = nil;
|
|
self.usableExtraSets = nil;
|
|
self.usableSavedSets = nil;
|
|
|
|
self.sourceData = nil;
|
|
self.sourceExtraData = nil;
|
|
end
|
|
addon.ClearSets = BetterWardrobeSetsDataProviderMixin.ClearSets
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:ClearBaseSets()
|
|
self.baseSets = nil;
|
|
self.baseExtraSets = nil;
|
|
self.baseSavedSets = nil;
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:ClearVariantSets()
|
|
self.variantSets = nil;
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:ClearUsableSets()
|
|
self.usableSets = nil;
|
|
self.usableExtraSets = nil;
|
|
self.usableSavedSets = nil;
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetIconForSet(setID)
|
|
local sourceData = self:GetSetSourceData(setID);
|
|
if ( not sourceData.icon ) then
|
|
local sortedSources = self:GetSortedSetSources(setID);
|
|
if ( sortedSources[1] ) then
|
|
local _, _, _, _, icon = C_Item.GetItemInfoInstant(sortedSources[1].itemID);
|
|
sourceData.icon = icon;
|
|
else
|
|
sourceData.icon = QUESTION_MARK_ICON;
|
|
end
|
|
end
|
|
return sourceData.icon;
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:DetermineFavorites()
|
|
-- if a variant is favorited, so is the base set
|
|
-- keep track of which set is favorited
|
|
local baseSets = self:GetBaseSets();
|
|
for i = 1, #baseSets do
|
|
local baseSet = baseSets[i];
|
|
baseSet.favoriteSetID = nil;
|
|
if ( baseSet.favorite ) then
|
|
baseSet.favoriteSetID = baseSet.setID;
|
|
else
|
|
local variantSets = self:GetVariantSets(baseSet.setID);
|
|
if #variantSets < 0 then
|
|
for j = 1, #variantSets do
|
|
if ( variantSets[j].favorite ) then
|
|
baseSet.favoriteSetID = variantSets[j].setID;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:RefreshFavorites()
|
|
self.baseSets = nil;
|
|
self.variantSets = nil;
|
|
self.baseExtraSets = nil;
|
|
self.baseSavedSets = nil;
|
|
self:DetermineFavorites();
|
|
end
|
|
|
|
local SetsDataProvider = CreateFromMixins(BetterWardrobeSetsDataProviderMixin);
|
|
addon.SetsDataProvider = SetsDataProvider;
|
|
|
|
function addon.GetSetSourceCounts(setID)
|
|
if not setID then return 0,0 end
|
|
local sourceData = SetsDataProvider:GetSetSourceData(setID)
|
|
return sourceData.numCollected, sourceData.numTotal;
|
|
end
|
|
|
|
BetterWardrobeSetsCollectionMixin = {};
|
|
|
|
function BetterWardrobeSetsCollectionMixin:OnLoad()
|
|
self.RightInset.BGCornerTopLeft:Hide();
|
|
self.RightInset.BGCornerTopRight:Hide();
|
|
|
|
self.DetailsFrame.itemFramesPool = CreateFramePool("FRAME", self.DetailsFrame, "BetterWardrobeSetsDetailsItemFrameTemplate");
|
|
|
|
self.DetailsFrame.VariantSetsDropdown:SetSelectionTranslator(function(selection)
|
|
local variantSet = selection.data;
|
|
return variantSet.description or variantSet.name;
|
|
end);
|
|
|
|
self.selectedVariantSets = { };
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:OnShow()
|
|
self:RegisterEvent("GET_ITEM_INFO_RECEIVED");
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_ITEM_UPDATE");
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_UPDATED");
|
|
-- select the first set if not init
|
|
local baseSets = SetsDataProvider:GetBaseSets();
|
|
local defaultSetID = baseSets and baseSets[1] and self:GetDefaultSetIDForBaseSet(baseSets[1].setID) or nil;
|
|
if ( not self.init ) then
|
|
self.init = true;
|
|
if ( defaultSetID ) then
|
|
self.ListContainer:UpdateDataProvider();
|
|
self:SelectSet(defaultSetID);
|
|
end
|
|
|
|
local extraSets = addon.GetBaseList();
|
|
SetsDataProvider:SortSets(extraSets);
|
|
|
|
local savedSets = addon.GetSavedList();
|
|
if ( baseSets and baseSets[1] ) then
|
|
----self:SelectSet(defaultSetID); --Todo check;
|
|
self.selectedSetID = baseSets[1].setID;
|
|
end
|
|
if ( extraSets and extraSets[1] ) then
|
|
self.selectedExtraSetID = extraSets[1].setID;
|
|
|
|
end
|
|
if ( savedSets and savedSets[1] ) then
|
|
self.selectedSavedSetID = savedSets[1].setID;
|
|
end
|
|
|
|
else
|
|
local selectedSetID = self:GetSelectedSetID();
|
|
if ( not selectedSetID or not C_TransmogSets.IsSetVisible(selectedSetID) ) then
|
|
if ( defaultSetID ) then
|
|
self:SelectSet(defaultSetID);
|
|
end
|
|
end
|
|
self:Refresh();
|
|
end
|
|
|
|
local latestSource = C_TransmogSets.GetLatestSource();
|
|
if ( latestSource ~= Constants.Transmog.NoTransmogID ) then
|
|
local sets = C_TransmogSets.GetSetsContainingSourceID(latestSource);
|
|
local setID = sets and sets[1];
|
|
if ( setID ) then
|
|
self:SelectSet(setID);
|
|
local baseSetID = SetsDataProvider:GetBaseSetID(setID);
|
|
self:ScrollToSet(baseSetID, ScrollBoxConstants.AlignCenter);
|
|
end
|
|
self:ClearLatestSource();
|
|
end
|
|
|
|
self.DetailsFrame.VariantSetsDropdown:SetupMenu(function(dropdown, rootDescription)
|
|
rootDescription:SetTag("MENU_WARDROBE_VARIANT_SETS");
|
|
|
|
local selectedSetID = self:GetSelectedSetID();
|
|
local baseSetID = SetsDataProvider:GetBaseSetID(selectedSetID);
|
|
|
|
local function IsSelected(variantSet)
|
|
return variantSet.setID == self:GetSelectedSetID();
|
|
end
|
|
|
|
local function SetSelected(variantSet)
|
|
self:SelectSet(variantSet.setID);
|
|
local desc = variantSet.description or variantSet.name
|
|
|
|
self.DetailsFrame.VariantSetsDropdown:SetText(desc);
|
|
|
|
end
|
|
|
|
for index, variantSet in ipairs(SetsDataProvider:GetVariantSets(baseSetID)) do
|
|
--if not variantSet.hiddenUntilCollected or variantSet.collected then
|
|
local numSourcesCollected, numSourcesTotal = SetsDataProvider:GetSetSourceCounts(variantSet.setID);
|
|
local colorCode = IN_PROGRESS_FONT_COLOR_CODE;
|
|
if numSourcesCollected == numSourcesTotal then
|
|
colorCode = NORMAL_FONT_COLOR_CODE;
|
|
elseif numSourcesCollected == 0 then
|
|
colorCode = GRAY_FONT_COLOR_CODE;
|
|
end
|
|
|
|
local desc = variantSet.description or variantSet.name
|
|
local text = format(ITEM_SET_NAME, (desc)..colorCode, numSourcesCollected, numSourcesTotal);
|
|
if not addon.Profile.CurrentFactionSets and variantSet.requiredFaction then
|
|
if (variantSet.requiredFaction == "Horde") then
|
|
text = "|cFFB02626"..text.."|r";
|
|
else
|
|
text = "|cFF0E50D0"..text.."|r";
|
|
end
|
|
end
|
|
rootDescription:CreateRadio(text, IsSelected, SetSelected, variantSet);
|
|
--end
|
|
end
|
|
end);
|
|
|
|
--else
|
|
--local latestSource = newTransmogInfo["latestSource"]
|
|
|
|
--if (latestSource ~= NO_TRANSMOG_SOURCE_ID) then
|
|
--self:SelectSet(latestSource)
|
|
--self:ScrollToSet(latestSource)
|
|
--self:ClearLatestSource()
|
|
--end
|
|
--end
|
|
BetterWardrobeCollectionFrame.progressBar:Show();
|
|
self:UpdateProgressBar();
|
|
self:RefreshCameras();
|
|
|
|
--if HelpTip:IsShowing(BetterWardrobeCollectionFrame, TRANSMOG_SETS_TAB_TUTORIAL) then
|
|
--HelpTip:Hide(BetterWardrobeCollectionFrame, TRANSMOG_SETS_TAB_TUTORIAL);
|
|
--SetCVarBitfield("closedInfoFramesAccountWide", LE_FRAME_TUTORIAL_ACCOUNT_TRANSMOG_SETS_TAB, true);
|
|
--end
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:OnHide()
|
|
self:UnregisterEvent("GET_ITEM_INFO_RECEIVED");
|
|
self:UnregisterEvent("TRANSMOG_COLLECTION_ITEM_UPDATE");
|
|
self:UnregisterEvent("TRANSMOG_COLLECTION_UPDATED");
|
|
SetsDataProvider:ClearSets();
|
|
self:GetParent():ClearSearch(Enum.TransmogSearchType.BaseSets);
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:OnEvent(event, ...)
|
|
if ( event == "GET_ITEM_INFO_RECEIVED" ) then
|
|
local itemID = ...;
|
|
for itemFrame in self.DetailsFrame.itemFramesPool:EnumerateActive() do
|
|
if ( itemFrame.itemID == itemID ) then
|
|
self:SetItemFrameQuality(itemFrame);
|
|
break;
|
|
end
|
|
end
|
|
elseif ( event == "TRANSMOG_COLLECTION_ITEM_UPDATE" ) then
|
|
for itemFrame in self.DetailsFrame.itemFramesPool:EnumerateActive() do
|
|
self:SetItemFrameQuality(itemFrame);
|
|
end
|
|
elseif ( event == "TRANSMOG_COLLECTION_UPDATED" ) then
|
|
SetsDataProvider:ClearSets();
|
|
self:Refresh();
|
|
self:UpdateProgressBar();
|
|
self:ClearLatestSource();
|
|
end
|
|
end
|
|
|
|
function addon.SetHasNewSourcesForSlot(setID, transmogSlot)
|
|
if not newTransmogInfo[setID] then return false end
|
|
for itemID, location in pairs(newTransmogInfo[setID]) do
|
|
if location == transmogSlot then
|
|
return true;
|
|
end
|
|
end
|
|
return false;
|
|
end
|
|
|
|
|
|
function addon.SetHasNewSources(setID)
|
|
if not newTransmogInfo[setID] then return false end
|
|
|
|
return true;
|
|
|
|
end
|
|
|
|
function addon.ClearSetNewSourcesForSlot(setID, transmogSlot)
|
|
if not newTransmogInfo[setID] then return end
|
|
local count = 0;
|
|
for itemID, location in pairs(newTransmogInfo[setID]) do
|
|
count = count + 1;
|
|
if location == transmogSlot then
|
|
newTransmogInfo[setID][itemID] = nil;
|
|
count = count - 1;
|
|
end
|
|
end
|
|
|
|
if count <= 0 then
|
|
newTransmogInfo[setID] = nil;
|
|
SetsDataProvider:ResetBaseSetNewStatus(setID)
|
|
end
|
|
end
|
|
|
|
|
|
function addon.GetSetNewSources(setID)
|
|
local sources = {};
|
|
if not newTransmogInfo[setID] then return sources end
|
|
|
|
for itemID in pairs(newTransmogInfo[setID]) do
|
|
local _, soucre = C_TransmogCollection.GetItemInfo(itemID);
|
|
tinsert(sources, source);
|
|
end
|
|
return sources;
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:UpdateProgressBar()
|
|
self:GetParent():UpdateProgressBar(C_TransmogSets.GetFilteredBaseSetsCounts());
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:ClearLatestSource()
|
|
if BetterWardrobeCollectionFrame:CheckTab(2) then
|
|
C_TransmogSets.ClearLatestSource()
|
|
elseif BetterWardrobeCollectionFrame:CheckTab(3) then
|
|
newTransmogInfo["latestSource"] = NO_TRANSMOG_SOURCE_ID;
|
|
|
|
end
|
|
|
|
BetterWardrobeCollectionFrame:UpdateTabButtons()
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:Refresh()
|
|
self.ListContainer:UpdateDataProvider();
|
|
self:UpdateProgressBar();
|
|
--self:DisplaySet(self:GetSelectedSetID());
|
|
|
|
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
self:DisplaySet(self.selectedSetID);
|
|
elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
self:DisplaySet(self.selectedExtraSetID);
|
|
elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 4 then
|
|
self:DisplaySavedSet(self.selectedSavedSetID);
|
|
|
|
end
|
|
end
|
|
|
|
local function isAvailableItem(sourceID,setID)
|
|
local _, visualID, _, _, _, itemLink = C_TransmogCollection.GetAppearanceSourceInfo(sourceID);
|
|
local sources = (sourceID and itemLink and C_TransmogCollection.GetAppearanceSources(sourceID, addon.GetItemCategory(sourceID), addon.GetTransmogLocation(itemLink)) ) or {}; --Can return nil if no longer in game;
|
|
|
|
if (#sources == 0) then
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID);
|
|
local setInfo = addon.GetSetInfo(setID);
|
|
if not sourceInfo.sourceType then
|
|
return false;
|
|
end
|
|
end
|
|
return true;
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:DisplaySet(setID)
|
|
if not setID then return end
|
|
--=local setInfo = (setID and C_TransmogSets.GetSetInfo(setID)) or nil;
|
|
local setInfo = SetsDataProvider:GetSetByID(setID)
|
|
|
|
local buildID = (select(4, GetBuildInfo())) or nil;
|
|
|
|
if ( not setInfo ) then
|
|
self.DetailsFrame:Hide();
|
|
self.Model:Hide();
|
|
return;
|
|
else
|
|
self.DetailsFrame:Show();
|
|
self.Model:Show();
|
|
end
|
|
|
|
self.Model:SetUnit("player", false, PlayerUtil.ShouldUseNativeFormInModelScene());
|
|
|
|
local _, raceFile = UnitRace("player");
|
|
if (raceFile == "Dracthyr" or raceFile == "Worgen") then
|
|
local inNativeForm = C_UnitAuras.WantsAlteredForm("player");
|
|
|
|
local _, raceFilename = UnitRace("player");
|
|
local sex = UnitSex("player")
|
|
if (raceFilename == "Dracthyr" or raceFilename == "Worgen") then
|
|
local inNativeForm = C_UnitAuras.WantsAlteredForm("player");
|
|
--self:SetUseTransmogSkin(false)
|
|
local modelID, altModelID
|
|
if raceFilename == "Worgen" then
|
|
if sex == 3 then
|
|
modelID = 307453;
|
|
altModelID = 1000764;
|
|
else
|
|
modelID = 307454;
|
|
altModelID = 1011653;
|
|
end
|
|
elseif raceFilename == "Dracthyr" then
|
|
if sex == 3 then
|
|
modelID = 4207724;
|
|
altModelID = 4220448;
|
|
else
|
|
modelID = 4207724;
|
|
altModelID = 4395382;
|
|
end
|
|
end
|
|
|
|
if inNativeForm and not addon.useNativeForm then
|
|
self.Model:SetUnit("player", false, false)
|
|
self.Model:SetModel(altModelID);
|
|
|
|
elseif not inNativeForm and addon.useNativeForm then
|
|
self.Model:SetUnit("player", false, true)
|
|
self.Model:SetModel( modelID );
|
|
end
|
|
end
|
|
end
|
|
|
|
self.DetailsFrame.BW_LinkSetButton.setID = setID;
|
|
local sources = addon.SetsDataProvider:GetSetSources(setID);
|
|
|
|
local holidayName = ""
|
|
for sourceID,_ in pairs(sources) do
|
|
holidayName = C_TransmogCollection.GetSourceRequiredHoliday(sourceID);
|
|
if holidayName then
|
|
break
|
|
end
|
|
end
|
|
self.DetailsFrame.Name:SetText(setInfo.name);
|
|
if ( self.DetailsFrame.Name:IsTruncated() ) then
|
|
self.DetailsFrame.Name:Hide();
|
|
self.DetailsFrame.LongName:SetText(setInfo.name);
|
|
self.DetailsFrame.LongName:Show();
|
|
else
|
|
self.DetailsFrame.Name:Show();
|
|
self.DetailsFrame.LongName:Hide();
|
|
end
|
|
--GameTooltip:AddLine(TRANSMOG_APPEARANCE_USABLE_HOLIDAY:format(holidayName), LIGHTBLUE_FONT_COLOR.r, LIGHTBLUE_FONT_COLOR.g, LIGHTBLUE_FONT_COLOR.b);
|
|
if holidayName then
|
|
self.DetailsFrame.Label:SetText(TRANSMOG_APPEARANCE_USABLE_HOLIDAY:format(holidayName));
|
|
else
|
|
self.DetailsFrame.Label:SetText((setInfo.label or "")..((not setInfo.isClass and setInfo.className) and " -"..setInfo.className.."-" or "") );
|
|
end
|
|
--[==[@debug@
|
|
self.DetailsFrame.Label:SetText((setInfo.label or "")..((not setInfo.isClass and setInfo.className) and " -"..setInfo.className.."-" or "")..setID );
|
|
--@end-debug@]==]
|
|
--print(setInfo.label)
|
|
--self.DetailsFrame.LimitedSet:SetShown(setInfo.limitedTimeSet);P
|
|
|
|
if ((setInfo.description == ELITE) and setInfo.patchID < buildID) or (setID <= 1446 and setID >=1436) then
|
|
setInfo.noLongerObtainable = true;
|
|
setInfo.limitedTimeSet = nil;
|
|
end
|
|
|
|
if setInfo.limitedTimeSet then
|
|
self.DetailsFrame.LimitedSet.Text:SetText(TRANSMOG_SET_LIMITED_TIME_SET);
|
|
self.DetailsFrame.LimitedSet:Show();
|
|
|
|
--self.DetailsFrame.LimitedSet.Text:SetText(TRANSMOG_SET_LIMITED_TIME_SET)--factionNames.opposingFaction)--.." only");
|
|
elseif setInfo.noLongerObtainable then
|
|
self.DetailsFrame.LimitedSet.Icon:SetAtlas("transmog-icon-remove");
|
|
self.DetailsFrame.LimitedSet.Text:SetText(L["No Longer Obtainable"]);
|
|
self.DetailsFrame.LimitedSet:Show();
|
|
else
|
|
self.DetailsFrame.LimitedSet:Hide();
|
|
end
|
|
|
|
if setInfo.requiredFaction then
|
|
if setInfo.requiredFaction == "Alliance" then
|
|
self.DetailsFrame.Faction:Show()
|
|
self.DetailsFrame.Faction.Alliance:Show()
|
|
self.DetailsFrame.Faction.Horde:Hide()
|
|
|
|
|
|
elseif setInfo.requiredFaction == "Horde" then
|
|
self.DetailsFrame.Faction:Show()
|
|
self.DetailsFrame.Faction.Horde:Show()
|
|
self.DetailsFrame.Faction.Alliance:Hide()
|
|
|
|
end
|
|
self.DetailsFrame.Faction.Horde:SetDesaturated(true)
|
|
self.DetailsFrame.Faction.Horde:SetAlpha(.9)
|
|
self.DetailsFrame.Faction.Alliance:SetDesaturated(true)
|
|
self.DetailsFrame.Faction.Alliance:SetAlpha(.4)
|
|
|
|
else
|
|
self.DetailsFrame.Faction:Hide()
|
|
self.DetailsFrame.Faction.Horde:Hide()
|
|
self.DetailsFrame.Faction.Alliance:Hide()
|
|
|
|
end
|
|
|
|
local newSourceIDs = C_TransmogSets.GetSetNewSources(setID) or addon.GetSetNewSources(setID);
|
|
|
|
self.DetailsFrame.itemFramesPool:ReleaseAll();
|
|
self.Model:Undress();
|
|
local BUTTON_SPACE = 37; -- button width + spacing between 2 buttons
|
|
local sortedSources = SetsDataProvider:GetSortedSetSources(setID);
|
|
|
|
|
|
--local xOffset = -floor((#sortedSources - 1) * BUTTON_SPACE / 2);
|
|
|
|
local row1 = #sortedSources;
|
|
local row2 = 0;
|
|
local yOffset1 = -94;
|
|
if row1 > 10 then
|
|
row2 = row1 - 10;
|
|
row1 = 10;
|
|
yOffset1 = -74;
|
|
end
|
|
local xOffset = -floor((row1 - 1) * BUTTON_SPACE / 2)
|
|
local xOffset2 = -floor((row2 - 1) * BUTTON_SPACE / 2)
|
|
|
|
local yOffset2 = yOffset1 - 40;
|
|
local move = (#sortedSources > 10)
|
|
|
|
self.DetailsFrame.IconRowBackground:ClearAllPoints()
|
|
self.DetailsFrame.IconRowBackground:SetPoint("TOP", 0, move and -50 or -78)
|
|
self.DetailsFrame.IconRowBackground:SetHeight(move and 120 or 64)
|
|
self.DetailsFrame.Name:ClearAllPoints()
|
|
self.DetailsFrame.Name:SetPoint("TOP", 0, move and -17 or -37)
|
|
self.DetailsFrame.LongName:ClearAllPoints()
|
|
self.DetailsFrame.LongName:SetPoint("TOP", 0, move and -10 or -30)
|
|
self.DetailsFrame.Label:ClearAllPoints()
|
|
self.DetailsFrame.Label:SetPoint("TOP", 0, move and -43 or -63)
|
|
|
|
local mainShoulder, offShoulder, mainHand, offHand
|
|
|
|
for i = 1, #sortedSources do
|
|
local itemFrame = self.DetailsFrame.itemFramesPool:Acquire();
|
|
itemFrame.sourceID = sortedSources[i].sourceID;
|
|
itemFrame.itemID = sortedSources[i].itemID;
|
|
itemFrame.collected = sortedSources[i].collected;
|
|
itemFrame.invType = sortedSources[i].invType;
|
|
itemFrame.setID = setID
|
|
local slot = C_Transmog.GetSlotForInventoryType(itemFrame.invType)
|
|
local altid = addon:CheckAltItem(itemFrame.sourceID)
|
|
if altid and type(altid) ~= "table" then
|
|
altid = {altid}
|
|
end
|
|
|
|
if altid then
|
|
itemFrame.AltItem:Show()
|
|
itemFrame.AltItem.baseId = itemFrame.sourceID
|
|
itemFrame.AltItem.altid = altid
|
|
--itemFrame.AltItem.useAlt = false
|
|
itemFrame.AltItem.setID = setID
|
|
itemFrame.AltItem.index = itemFrame.AltItem.index or 0
|
|
|
|
else
|
|
itemFrame.AltItem:Hide()
|
|
itemFrame.AltItem.baseId = nil
|
|
itemFrame.AltItem.altid = nil
|
|
itemFrame.AltItem.useAlt = false
|
|
itemFrame.AltItem.setID = nil
|
|
itemFrame.AltItem.index = nil
|
|
end
|
|
|
|
if itemFrame.AltItem.useAlt then
|
|
itemFrame.sourceID = altid[itemFrame.AltItem.index]
|
|
end
|
|
|
|
if slot == 3 and not mainShoulder then
|
|
mainShoulder = itemFrame.sourceID;
|
|
offShoulder = setInfo.offShoulder;
|
|
elseif slot ==16 then
|
|
mainHand = itemFrame.sourceID;
|
|
elseif slot == 17 then
|
|
offhand = itemFrame.sourceID;
|
|
end
|
|
|
|
local texture = C_TransmogCollection.GetSourceIcon(sortedSources[i].sourceID);
|
|
itemFrame.Icon:SetTexture(texture);
|
|
if ( sortedSources[i].collected ) then
|
|
itemFrame.Icon:SetDesaturated(false);
|
|
itemFrame.Icon:SetAlpha(1);
|
|
itemFrame.IconBorder:SetDesaturation(0);
|
|
itemFrame.IconBorder:SetAlpha(1);
|
|
|
|
local transmogSlot = C_Transmog.GetSlotForInventoryType(itemFrame.invType);
|
|
if ( C_TransmogSets.SetHasNewSourcesForSlot(setID, transmogSlot) ) then
|
|
itemFrame.New:Show();
|
|
itemFrame.New.Anim:Play();
|
|
else
|
|
itemFrame.New:Hide();
|
|
itemFrame.New.Anim:Stop();
|
|
end
|
|
else
|
|
itemFrame.Icon:SetDesaturated(true);
|
|
itemFrame.Icon:SetAlpha(0.3);
|
|
itemFrame.IconBorder:SetDesaturation(1);
|
|
itemFrame.IconBorder:SetAlpha(0.3);
|
|
itemFrame.New:Hide();
|
|
end
|
|
|
|
itemFrame.Replacement:SetAlpha(0.3);
|
|
|
|
local hasSubItem = addon.HasSubItem(setID)
|
|
--Show marker if the item has been swapped
|
|
if hasSubItem and hasSubItem[itemFrame.sourceID] then
|
|
itemFrame.Replacement:Show()
|
|
else
|
|
itemFrame.Replacement:Hide()
|
|
end
|
|
|
|
----TODO: FIX Unavailable;
|
|
itemFrame.itemCollectionStatus = nil;
|
|
if ( sortedSources[i].collected ) then
|
|
if not sortedSources[i].characterUseable then
|
|
if sortedSources[i].characterCollectable then
|
|
itemFrame.itemCollectionStatus = "CollectedCharCantUse";
|
|
--else
|
|
-- itemFrame.itemCollectionStatus = "CollectedCharCantGet";
|
|
end
|
|
end
|
|
--else
|
|
--if (not sortedSources[i].characterCollectable) then
|
|
--itemFrame.itemCollectionStatus = "NotCollectedCharCantGet";
|
|
-- end
|
|
end
|
|
|
|
if isAvailableItem(itemFrame.sourceID, setInfo.setID) then
|
|
--itemFrame.unavailable:Hide();
|
|
--itemFrame.Icon:SetColorTexture(1,0,0,.5);
|
|
itemFrame.itemCollectionStatus = nil;
|
|
else
|
|
--We don't care if item is collected
|
|
if not sortedSources[i].collected then
|
|
itemFrame.itemCollectionStatus = "NotCollectedUnavailable";
|
|
end
|
|
--itemFrame.unavailable:Show();
|
|
|
|
--itemFrame.Icon:SetColorTexture(0,0,0,.5);
|
|
end
|
|
|
|
self:SetItemFrameQuality(itemFrame);
|
|
self:SetItemUseability(itemFrame);
|
|
|
|
|
|
--itemFrame:SetPoint("TOP", self.DetailsFrame, "TOP", xOffset + (i - 1) * BUTTON_SPACE, -94)
|
|
if i <= 10 then
|
|
itemFrame:SetPoint("TOP", self.DetailsFrame, "TOP", xOffset + (i - 1) * BUTTON_SPACE, yOffset1);
|
|
else
|
|
itemFrame:SetPoint("TOP", self.DetailsFrame, "TOP", xOffset2 + (i - 11) * BUTTON_SPACE, yOffset2);
|
|
end
|
|
|
|
itemFrame:Show()
|
|
-----self.Model:TryOn(sortedSources[i].sourceID)
|
|
local invType = sortedSources[i].invType - 1;
|
|
|
|
if invType == 20 then invType = 5 end
|
|
if not addon.setdb.profile.autoHideSlot.toggle or ( addon.setdb.profile.autoHideSlot.toggle and not addon.setdb.profile.autoHideSlot[invType]) then
|
|
if itemFrame.AltItem.useAlt then
|
|
self.Model:TryOn(itemFrame.AltItem.altid[itemFrame.AltItem.index]);
|
|
else
|
|
self.Model:TryOn(sortedSources[i].sourceID);
|
|
end
|
|
end
|
|
end
|
|
|
|
--Check for secondary Shoulder;
|
|
local setTransmogInfo = C_TransmogCollection.GetOutfitItemTransmogInfoList(addon:GetBlizzID(setID)) or {};
|
|
if setTransmogInfo and setTransmogInfo[3] and setTransmogInfo[3].secondaryAppearanceID ~= 0 then
|
|
local itemTransmogInfo = ItemUtil.CreateItemTransmogInfo(setTransmogInfo[3].appearanceID, setTransmogInfo[3].secondaryAppearanceID, 0);
|
|
self.Model:SetItemTransmogInfo(itemTransmogInfo, 3, false);
|
|
elseif (mainShoulder and offShoulder) then
|
|
local itemTransmogInfo = ItemUtil.CreateItemTransmogInfo(mainShoulder, offShoulder, 0);
|
|
self.Model:SetItemTransmogInfo(itemTransmogInfo, 3, false);
|
|
end
|
|
|
|
if setInfo.mainHandEnchant or setInfo.offHandEnchant then
|
|
if mainHand then
|
|
local itemTransmogInfo = ItemUtil.CreateItemTransmogInfo(mainHand, 0, setInfo.mainHandEnchant);
|
|
self.Model:SetItemTransmogInfo(itemTransmogInfo,16, false);
|
|
end
|
|
if offHand then
|
|
itemTransmogInfo = ItemUtil.CreateItemTransmogInfo(offHand, 0, setInfo.offHandEnchant);
|
|
self.Model:SetItemTransmogInfo(itemTransmogInfo,17, false);
|
|
end
|
|
elseif setTransmogInfo and setTransmogInfo[16] or setTransmogInfo[17] then
|
|
|
|
if setTransmogInfo and setTransmogInfo[16] and setTransmogInfo[16].illusionID then
|
|
local itemTransmogInfo = ItemUtil.CreateItemTransmogInfo(setTransmogInfo[16].appearanceID, 0, setTransmogInfo[16].illusionID);
|
|
self.Model:SetItemTransmogInfo(itemTransmogInfo, 3, false);
|
|
end
|
|
if setTransmogInfo and setTransmogInfo[17] and setTransmogInfo[17].illusionID then
|
|
local itemTransmogInfo = ItemUtil.CreateItemTransmogInfo(setTransmogInfo[17].appearanceID, 0, setTransmogInfo[17].illusionID);
|
|
self.Model:SetItemTransmogInfo(itemTransmogInfo, 3, false);
|
|
end
|
|
end
|
|
|
|
local showVariantSetsDropdown = false;
|
|
if (BetterWardrobeCollectionFrame.selectedCollectionTab ~= TAB_SAVED_SETS ) then
|
|
|
|
-- variant sets
|
|
local baseSetID = SetsDataProvider:GetBaseSetID(setID);
|
|
local variantSets = SetsDataProvider:GetVariantSets(baseSetID);
|
|
if variantSets then
|
|
local numVisibleSets = 0;
|
|
for i, set in ipairs(variantSets) do
|
|
--if not set.hiddenUntilCollected or set.collected then
|
|
numVisibleSets = numVisibleSets + 1;
|
|
--end
|
|
end
|
|
showVariantSetsDropdown = numVisibleSets > 1;
|
|
end
|
|
end
|
|
if (BetterWardrobeCollectionFrame.selectedCollectionTab == TAB_SAVED_SETS ) then
|
|
showVariantSetsDropdown = false
|
|
end
|
|
|
|
if showVariantSetsDropdown then
|
|
self.DetailsFrame.VariantSetsDropdown:Show();
|
|
self.DetailsFrame.VariantSetsDropdown:SetText(setInfo.description or setInfo.name);
|
|
else
|
|
self.DetailsFrame.VariantSetsDropdown:Hide();
|
|
end
|
|
end
|
|
|
|
----TODO:CHECK;
|
|
function BetterWardrobeSetsCollectionMixin:DisplaySavedSet(setID)
|
|
local setInfo = (setID and addon.GetSetInfo(setID)) or nil;
|
|
|
|
if (not setInfo) then
|
|
self.DetailsFrame:Hide();
|
|
self.Model:Hide();
|
|
return;
|
|
else
|
|
self.DetailsFrame:Show();
|
|
self.Model:Show();
|
|
end
|
|
|
|
self.DetailsFrame.Name:SetText(setInfo.name);
|
|
if (self.DetailsFrame.Name:IsTruncated()) then
|
|
self.DetailsFrame.Name:Hide();
|
|
self.DetailsFrame.LongName:SetText(setInfo.name);
|
|
self.DetailsFrame.LongName:Show();
|
|
else
|
|
self.DetailsFrame.Name:Show();
|
|
self.DetailsFrame.LongName:Hide();
|
|
end
|
|
|
|
self.DetailsFrame.Label:SetText(setInfo.label);
|
|
self.DetailsFrame.LimitedSet:Hide();
|
|
self.DetailsFrame.VariantSetsDropdown:Hide();
|
|
|
|
self.DetailsFrame.itemFramesPool:ReleaseAll();
|
|
self.Model:Undress();
|
|
local row1 = 0;
|
|
local row2 = 0;
|
|
local yOffset1 = -94;
|
|
|
|
setType = setInfo.setType
|
|
local sortedSources = {}
|
|
local mainShoulder;
|
|
local offShoulderindex;
|
|
local offShoulder;
|
|
--sortedSources = SetsDataProvider:GetSortedSetSources(setID);
|
|
|
|
if setType == "SavedBlizzard" then
|
|
--(setID and addon.GetSetInfo(setID)) or nil;
|
|
local sources = C_TransmogCollection.GetOutfitItemTransmogInfoList(addon:GetBlizzID(setID));
|
|
for slotID, itemTransmogInfo in ipairs(sources) do
|
|
if itemTransmogInfo.appearanceID ~= 0 then
|
|
if slotID == 3 and not mainShoulder then
|
|
mainShoulder = itemTransmogInfo.appearanceID;
|
|
offShoulder = itemTransmogInfo.secondaryAppearanceID;
|
|
offShoulderindex = #sortedSources + 2;
|
|
end
|
|
tinsert(sortedSources, itemTransmogInfo.appearanceID);
|
|
if offShoulder ~= 0 then
|
|
tinsert(sortedSources, itemTransmogInfo.secondaryAppearanceID);
|
|
end
|
|
end
|
|
end
|
|
--sortedSources = setInfo.sources;
|
|
|
|
elseif setType == "SavedMogIt" then
|
|
for i, sourceID in pairs(setInfo.sources) do
|
|
tinsert(sortedSources, sourceID);
|
|
end
|
|
elseif setType == "SavedExtra" then
|
|
for i, sourceID in ipairs(setInfo.sources) do
|
|
if sourceID ~= 0 then
|
|
tinsert(sortedSources, sourceID);
|
|
end
|
|
end
|
|
|
|
if setInfo.offShoulder and setInfo.offShoulder ~= 0 then
|
|
local baseSourceID = C_Transmog.GetSlotVisualInfo(TransmogUtil.GetTransmogLocation("SHOULDERSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.Secondary));
|
|
if setInfo.offShoulder ~= baseSourceID then
|
|
offShoulder = setInfo.offShoulder;
|
|
tinsert(sortedSources, offShoulderindex , offShoulder);
|
|
end
|
|
end
|
|
elseif setType == "SavedTransmogOutfit" or setType == "SavedExtra" then
|
|
for i, itemID in pairs(setInfo.items) do
|
|
if itemID ~= 0 then
|
|
local _, sourceID = C_TransmogCollection.GetItemInfo(itemID);
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID);
|
|
if sourceInfo.invType - 1 == 3 and not mainShoulder then
|
|
mainShoulder = sourceInfo.sourceID;
|
|
offShoulderindex = #sortedSources + 2;
|
|
end
|
|
tinsert(sortedSources, sourceID);
|
|
end
|
|
end
|
|
|
|
if setInfo.offShoulder and setInfo.offShoulder ~= 0 then
|
|
local baseSourceID = C_Transmog.GetSlotVisualInfo(TransmogUtil.GetTransmogLocation("SHOULDERSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.Secondary));
|
|
if setInfo.offShoulder ~= baseSourceID then
|
|
offShoulder = setInfo.offShoulder;
|
|
tinsert(sortedSources, offShoulderindex , offShoulder);
|
|
end
|
|
end
|
|
end
|
|
|
|
if setInfo then
|
|
for i = 1, #sortedSources do
|
|
local sourceInfo = sortedSources[i] and C_TransmogCollection.GetSourceInfo(sortedSources[i]);
|
|
if sourceInfo then
|
|
row1 = row1 + 1;
|
|
end
|
|
end
|
|
|
|
if row1 > 10 then
|
|
row2 = row1 - 10;
|
|
row1 = 10;
|
|
yOffset1 = -74;
|
|
end
|
|
end
|
|
|
|
local BUTTON_SPACE = 37 -- button width + spacing between 2 buttons
|
|
--local sortedSources = setInfo.sources --SetsDataProvider:GetSortedSetSources(setID)
|
|
local xOffset = -floor((row1 - 1) * BUTTON_SPACE / 2);
|
|
local xOffset2 = -floor((row2 - 1) * BUTTON_SPACE / 2);
|
|
local yOffset2 = yOffset1 - 40;
|
|
local itemCount = 0;
|
|
|
|
|
|
|
|
for i = 1, #sortedSources do
|
|
if sortedSources[i] then
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sortedSources[i]);
|
|
|
|
if sourceInfo then
|
|
itemCount = itemCount + 1;
|
|
local itemFrame = self.DetailsFrame.itemFramesPool:Acquire();
|
|
itemFrame.sourceID = sourceInfo.sourceID;
|
|
--itemFrame.itemID = sourceInfo.itemID;
|
|
itemFrame.collected = sourceInfo.isCollected;
|
|
itemFrame.invType = sourceInfo.invType;
|
|
local texture = C_TransmogCollection.GetSourceIcon(sourceInfo.sourceID);
|
|
itemFrame.Icon:SetTexture(texture);
|
|
if (sourceInfo.isCollected) then
|
|
itemFrame.Icon:SetDesaturated(false);
|
|
itemFrame.Icon:SetAlpha(1);
|
|
itemFrame.IconBorder:SetDesaturation(0);
|
|
itemFrame.IconBorder:SetAlpha(1);
|
|
else
|
|
itemFrame.Icon:SetDesaturated(true);
|
|
itemFrame.Icon:SetAlpha(0.3);
|
|
itemFrame.IconBorder:SetDesaturation(1);
|
|
itemFrame.IconBorder:SetAlpha(0.3);
|
|
itemFrame.New:Hide();
|
|
end
|
|
|
|
self:SetItemFrameQuality(itemFrame);
|
|
local move = (itemCount > 10);
|
|
if itemCount <= 10 then
|
|
itemFrame:SetPoint("TOP", self.DetailsFrame, "TOP", xOffset + (itemCount - 1) * BUTTON_SPACE, yOffset1);
|
|
|
|
else
|
|
itemFrame:SetPoint("TOP", self.DetailsFrame, "TOP", xOffset2 + (itemCount - 11) * BUTTON_SPACE, yOffset2);
|
|
end
|
|
|
|
self.DetailsFrame.IconRowBackground:ClearAllPoints();
|
|
self.DetailsFrame.IconRowBackground:SetPoint("TOP", 0, move and -50 or -78);
|
|
self.DetailsFrame.IconRowBackground:SetHeight(move and 120 or 64);
|
|
self.DetailsFrame.Name:ClearAllPoints();
|
|
self.DetailsFrame.Name:SetPoint("TOP", 0, move and -17 or -37);
|
|
self.DetailsFrame.LongName:ClearAllPoints();
|
|
self.DetailsFrame.LongName:SetPoint("TOP", 0, move and -10 or -30);
|
|
self.DetailsFrame.Label:ClearAllPoints();
|
|
self.DetailsFrame.Label:SetPoint("TOP", 0, move and -43 or -63);
|
|
|
|
itemFrame:Show();
|
|
self.Model:TryOn(sourceInfo.sourceID);
|
|
end
|
|
end
|
|
end
|
|
|
|
if mainShoulder and offShoulder then
|
|
local itemTransmogInfo = ItemUtil.CreateItemTransmogInfo(mainShoulder, offShoulder, 0);
|
|
self.Model:SetItemTransmogInfo(itemTransmogInfo, 3, false);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:SetItemFrameQuality(itemFrame)
|
|
if ( itemFrame.collected ) then
|
|
local quality = C_TransmogCollection.GetSourceInfo(itemFrame.sourceID).quality;
|
|
itemFrame.IconBorder:Show();
|
|
if ( quality == Enum.ItemQuality.Poor ) then
|
|
itemFrame.IconBorder:Hide();
|
|
--itemFrame.IconBorder:SetAtlas("dressingroom-itemborder-gray", true)
|
|
elseif ( quality == Enum.ItemQuality.Common ) then
|
|
itemFrame.IconBorder:SetAtlas("loottab-set-itemborder-white", true);
|
|
elseif ( quality == Enum.ItemQuality.Uncommon ) then
|
|
itemFrame.IconBorder:SetAtlas("loottab-set-itemborder-green", true);
|
|
elseif ( quality == Enum.ItemQuality.Rare ) then
|
|
itemFrame.IconBorder:SetAtlas("loottab-set-itemborder-blue", true);
|
|
elseif ( quality == Enum.ItemQuality.Epic ) then
|
|
itemFrame.IconBorder:SetAtlas("loottab-set-itemborder-purple", true);
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:SetItemUseability(itemFrame)
|
|
itemFrame.CanUse:Hide()
|
|
local itemCollectionStatus = itemFrame.itemCollectionStatus;
|
|
if itemCollectionStatus == "CollectedCharCantUse" then
|
|
itemFrame.CanUse:Show();
|
|
--itemFrame.Icon:SetDesaturated(false);
|
|
itemFrame.CanUse.Icon:SetDesaturation(0);
|
|
itemFrame.CanUse.Icon:SetVertexColor(1,0.8,0);
|
|
|
|
itemFrame.CanUse.Icon:SetAtlas("PlayerRaidBlip");
|
|
--itemFrame.Icon:SetAlpha(0.6);
|
|
itemFrame.CanUse.Icon:SetAlpha(0.5);
|
|
|
|
--elseif itemCollectionStatus == "CollectedCharCantGet" then
|
|
--itemFrame.CanUse:Show();
|
|
|
|
--itemFrame.Icon:SetDesaturated(false);
|
|
--itemFrame.CanUse.Icon:SetDesaturation(0);
|
|
|
|
--itemFrame.CanUse.Icon:ClearAllPoints();
|
|
--itemFrame.CanUse.Icon:SetPoint("CENTER",itemFrame,"TOP",0,-3);
|
|
--itemFrame.CanUse.Icon:SetVertexColor(1,0,0);
|
|
--itemFrame.CanUse.Icon:SetAtlas("PlayerRaidBlip");
|
|
--itemFrame.CanUse.Icon:SetSize(25,25);
|
|
|
|
--itemFrame.Icon:SetAlpha(0.6);
|
|
--itemFrame.CanUse.Icon:SetAlpha(0.5);
|
|
--itemFrame.New:Hide();
|
|
|
|
--elseif itemCollectionStatus == "NotCollectedCharCantGet" then
|
|
--itemFrame.CanUse:Show();
|
|
---itemFrame.Icon:SetDesaturated(true)
|
|
--itemFrame.CanUse.Icon:SetDesaturation(0);
|
|
--itemFrame.CanUse.Icon:SetVertexColor(1,0,0);
|
|
--itemFrame.CanUse.Icon:SetAtlas("PlayerDeadBlip");
|
|
--itemFrame.Icon:SetAlpha(0.3);
|
|
--.CanUse.Icon:SetAlpha(0.5);
|
|
--itemFrame.New:Hide();
|
|
elseif itemCollectionStatus == "NotCollectedUnavailable"then
|
|
itemFrame.CanUse:Show();
|
|
---itemFrame.Icon:SetDesaturated(true);
|
|
itemFrame.CanUse.Icon:SetDesaturation(0);
|
|
itemFrame.CanUse.Icon:SetVertexColor(1,1,1);
|
|
itemFrame.CanUse.Icon:SetAtlas("PlayerDeadBlip");
|
|
--itemFrame.Icon:SetAlpha(0.3);
|
|
itemFrame.CanUse.Icon:SetAlpha(0.5);
|
|
--itemFrame.New:Hide();
|
|
else
|
|
itemFrame.CanUse:Hide();
|
|
end
|
|
end
|
|
|
|
|
|
local function ContainsValue(data, searchValue)
|
|
local found = false;
|
|
|
|
searchValue = string.lower(searchValue);
|
|
|
|
found = string.find(string.lower(data.name), searchValue);
|
|
|
|
if data.label then
|
|
found = string.find(string.lower(data.label), searchValue);
|
|
end
|
|
|
|
local baseSetID = SetsDataProvider:GetBaseSetID(data.setID)
|
|
local variantSets = SetsDataProvider:GetVariantSets(baseSetID);
|
|
for _, variant in pairs(variantSets) do
|
|
found = string.find(string.lower(variant.name), searchValue);
|
|
end
|
|
|
|
return found;
|
|
end
|
|
|
|
local init = true
|
|
addon.searchSet = {}
|
|
function BetterWardrobeSetsCollectionMixin:OnSearchUpdate()
|
|
if ( init ) then
|
|
SetsDataProvider:ClearBaseSets();
|
|
SetsDataProvider:ClearVariantSets();
|
|
SetsDataProvider:ClearUsableSets();
|
|
self:Refresh();
|
|
init = false
|
|
else
|
|
local searchValue = string.lower(BetterWardrobeCollectionFrameSearchBox:GetText());
|
|
|
|
wipe(addon.searchSet);
|
|
if searchValue ~= "" then
|
|
for _, baseSet in pairs(addon.BaseIDs) do
|
|
if ContainsValue(baseSet, searchValue) then
|
|
table.insert(addon.searchSet, baseSet);
|
|
end
|
|
end
|
|
end
|
|
|
|
--addon:FilterSets(addon.searchSet)
|
|
RefreshLists();
|
|
--BetterWardrobeCollectionFrame.SetsCollectionFrame:Refresh()
|
|
|
|
--SetsFrame.SortSets(addon.searchSet, false);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:OnUnitModelChangedEvent()
|
|
if ( IsUnitModelReadyForUI("player") ) then
|
|
self.Model:RefreshUnit();
|
|
-- clearing cameraID so it resets zoom/pan
|
|
self.Model.cameraID = nil;
|
|
self.Model:UpdatePanAndZoomModelType();
|
|
self:RefreshCameras();
|
|
self:Refresh();
|
|
return true;
|
|
else
|
|
return false;
|
|
end
|
|
end
|
|
|
|
local function GetFormCameraInfo()
|
|
local detailsCameraID, transmogCameraID = C_TransmogSets.GetCameraIDs()
|
|
|
|
local inNativeForm = C_UnitAuras.WantsAlteredForm("player");
|
|
local _, raceFilename = UnitRace("player");
|
|
local sex = UnitSex("player")
|
|
|
|
if (not inNativeForm and addon.useNativeForm) then
|
|
if raceFilename == "Worgen" then
|
|
if sex == 3 then
|
|
detailsCameraID, transmogCameraID = 1020, 1045
|
|
else
|
|
detailsCameraID, transmogCameraID = 1021, 1024
|
|
end
|
|
elseif raceFilename == "Dracthyr" then
|
|
detailsCameraID, transmogCameraID = 1712, 1710
|
|
end
|
|
|
|
elseif inNativeForm and not addon.useNativeForm then
|
|
if raceFilename == "Worgen" then
|
|
if sex == 3 then
|
|
detailsCameraID, transmogCameraID = 997, 1022
|
|
else
|
|
detailsCameraID, transmogCameraID = 995, 996
|
|
end
|
|
|
|
elseif raceFilename == "Dracthyr" then
|
|
if sex == 3 then
|
|
detailsCameraID, transmogCameraID = 997, 1022
|
|
else
|
|
detailsCameraID, transmogCameraID = 998, 1024
|
|
end
|
|
end
|
|
end
|
|
return detailsCameraID, transmogCameraID
|
|
end
|
|
function BetterWardrobeSetsCollectionMixin:RefreshCameras()
|
|
if ( self:IsShown() ) then
|
|
local detailsCameraID, transmogCameraID = GetFormCameraInfo(); --C_TransmogSets.GetCameraIDs();
|
|
local model = self.Model;
|
|
self.Model:RefreshCamera();
|
|
addon.Model_ApplyUICamera(self.Model, detailsCameraID);
|
|
if ( model.cameraID ~= detailsCameraID ) then
|
|
model.cameraID = detailsCameraID;
|
|
model.defaultPosX, model.defaultPosY, model.defaultPosZ, model.yaw = GetUICameraInfo(detailsCameraID);
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:SelectBaseSetID(baseSetID)
|
|
self:SelectSet(self:GetDefaultSetIDForBaseSet(baseSetID));
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:GetDefaultSetIDForBaseSet(baseSetID)
|
|
if BetterWardrobeCollectionFrame:CheckTab(4) then
|
|
return baseSetID;
|
|
end
|
|
local baseSetID = SetsDataProvider:GetBaseSetID(baseSetID);
|
|
|
|
if ( SetsDataProvider:IsBaseSetNew(baseSetID) ) then
|
|
if ( SetsDataProvider:SetHasNewSources(baseSetID) ) then
|
|
return baseSetID;
|
|
else
|
|
local variantSets = SetsDataProvider:GetVariantSets(baseSetID);
|
|
for i, variantSet in ipairs(variantSets) do
|
|
if ( SetsDataProvider:SetHasNewSources(variantSet.setID) ) then
|
|
return variantSet.setID;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local baseSet = addon.BaseIDs[baseSetID];
|
|
if ( baseSet and baseSet.favoriteSetID ) then
|
|
return baseSet.favoriteSetID;
|
|
end
|
|
|
|
-- pick the one with most collected, higher difficulty wins ties
|
|
local highestCount = 0;
|
|
local highestCountSetID;
|
|
local variantSets = SetsDataProvider:GetVariantSets(baseSetID, true);
|
|
for i = 1, #variantSets do
|
|
local variantSetID = variantSets[i].setID
|
|
local numCollected = SetsDataProvider:GetSetSourceCounts(variantSetID);
|
|
if (numCollected > highestCount) then
|
|
highestCount = numCollected;
|
|
highestCountSetID = variantSetID;
|
|
end
|
|
end
|
|
|
|
return highestCountSetID or baseSetID;
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:SelectSetFromButton(setID)
|
|
CloseDropDownMenus()
|
|
self:SelectSet(self:GetDefaultSetIDForBaseSet(setID))
|
|
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:SelectSet(setID)
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab ~=4 then
|
|
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
self.selectedSetID = setID;
|
|
elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
self.selectedExtraSetID = setID;
|
|
|
|
end
|
|
self.selectedSetID = setID;
|
|
|
|
local baseSetID = SetsDataProvider:GetBaseSetID(setID);
|
|
local variantSets = SetsDataProvider:GetVariantSets(baseSetID);
|
|
if ( #variantSets > 0 ) then
|
|
self.selectedVariantSets[baseSetID] = setID;
|
|
end
|
|
|
|
elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 4 then
|
|
self.selectedSavedSetID = setID;
|
|
end
|
|
|
|
self:Refresh()
|
|
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:GetSelectedSetID()
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
return self.selectedSetID;
|
|
elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
return self.selectedExtraSetID;
|
|
elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 4 then
|
|
return self.selectedSavedSetID;
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:SetAppearanceTooltip(frame)
|
|
GameTooltip:SetOwner(frame, "ANCHOR_RIGHT");
|
|
self.tooltipTransmogSlot = C_Transmog.GetSlotForInventoryType(frame.invType);
|
|
self.tooltipPrimarySourceID = frame.sourceID;
|
|
self.tooltipSlot = _G[TransmogUtil.GetSlotName(frame.transmogSlot)];
|
|
self:RefreshAppearanceTooltip();
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:RefreshAppearanceTooltip()
|
|
if ( not self.tooltipTransmogSlot ) then
|
|
return;
|
|
end
|
|
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
local sources = C_TransmogSets.GetSourcesForSlot(self:GetSelectedSetID(), self.tooltipTransmogSlot);
|
|
if ( #sources == 0 ) then
|
|
-- can happen if a slot only has HiddenUntilCollected sources
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(self.tooltipPrimarySourceID);
|
|
tinsert(sources, sourceInfo);
|
|
end
|
|
CollectionWardrobeUtil.SortSources(sources, sources[1].visualID, self.tooltipPrimarySourceID);
|
|
local warningString = CollectionWardrobeUtil.GetBestVisibilityWarning(self.Model, self.transmogLocation, sources[1].visualID);
|
|
self:GetParent():SetAppearanceTooltip(self, sources, self.tooltipPrimarySourceID, warningString, self.tooltipSlot);
|
|
|
|
else
|
|
----elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(self.tooltipPrimarySourceID)
|
|
local visualID = sourceInfo.visualID;
|
|
local _, visualID, _, _, _, itemLink = C_TransmogCollection.GetAppearanceSourceInfo(self.tooltipPrimarySourceID)
|
|
local sources = (self.tooltipPrimarySourceID and itemLink and C_TransmogCollection.GetAppearanceSources(visualID, addon.GetItemCategory(self.tooltipPrimarySourceID), addon.GetTransmogLocation(itemLink)) ) or {} --Can return nil if no longer in game;
|
|
|
|
if (#sources == 0) then
|
|
-- can happen if a slot only has HiddenUntilCollected sources
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(self.tooltipPrimarySourceID)
|
|
tinsert(sources, sourceInfo)
|
|
end
|
|
|
|
CollectionWardrobeUtil.SortSources(sources, sources[1].visualID, self.tooltipPrimarySourceID)
|
|
local transmogLocation = TransmogUtil.CreateTransmogLocation(self.tooltipTransmogSlot, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
local warningString = CollectionWardrobeUtil.GetBestVisibilityWarning(self.tooltipModel, self.transmogLocation, visualID);
|
|
self:GetParent():SetAppearanceTooltip(self, sources, self.tooltipPrimarySourceID, warningString)
|
|
|
|
C_Timer.After(.05, function() if needsRefresh then self:RefreshAppearanceTooltip(); needsRefresh = false; end end) --Fix for items that returned retreaving info;
|
|
end
|
|
|
|
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:ClearAppearanceTooltip()
|
|
self.tooltipTransmogSlot = nil;
|
|
self.tooltipPrimarySourceID = nil;
|
|
self:GetParent():HideAppearanceTooltip();
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:CanHandleKey(key)
|
|
if ( key == WARDROBE_UP_VISUAL_KEY or key == WARDROBE_DOWN_VISUAL_KEY ) then
|
|
return true;
|
|
end
|
|
return false;
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:HandleKey(key)
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 4 then
|
|
if (not self:GetSelectedSavedSetID()) then
|
|
return false;
|
|
end
|
|
else
|
|
if ( not self:GetSelectedSetID() ) then
|
|
return false;
|
|
end
|
|
end
|
|
local selectedSetID;
|
|
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 4 then
|
|
selectedSetID = self:GetSelectedSavedSetID();
|
|
else
|
|
selectedSetID = SetsDataProvider:GetBaseSetID(self:GetSelectedSetID());
|
|
end
|
|
local _, index = SetsDataProvider:GetBaseSetByID(selectedSetID);
|
|
if ( not index ) then
|
|
return;
|
|
end
|
|
if ( key == WARDROBE_DOWN_VISUAL_KEY ) then
|
|
index = index + 1;
|
|
elseif ( key == WARDROBE_UP_VISUAL_KEY ) then
|
|
index = index - 1;
|
|
end
|
|
local sets = SetsDataProvider:GetBaseSets();
|
|
index = Clamp(index, 1, #sets);
|
|
self:SelectSet(self:GetDefaultSetIDForBaseSet(sets[index].setID));
|
|
|
|
self:ScrollToSet(sets[index].setID, ScrollBoxConstants.AlignNearest);
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:ScrollToSet(setID, alignment)
|
|
local scrollBox = self.ListContainer.ScrollBox;
|
|
|
|
local baseSetID = SetsDataProvider:GetBaseSetID(setID) or setID;
|
|
local function FindSet(elementData)
|
|
return elementData.setID == baseSetID;
|
|
end
|
|
|
|
scrollBox:ScrollToElementDataByPredicate(FindSet, alignment);
|
|
end
|
|
|
|
|
|
function BetterWardrobeSetsCollectionMixin:LinkSet(setID)
|
|
local emptySlotData = Sets:GetEmptySlots()
|
|
local itemList = TransmogUtil.GetEmptyItemTransmogInfoList()
|
|
|
|
for i = 1, 19 do
|
|
local _, source = addon.GetItemSource(emptySlotData[i] or 0)
|
|
itemList[i].appearanceID = source or 0;
|
|
itemList[i].illusionID = 0;
|
|
itemList[i].secondaryAppearanceID = 0;
|
|
end
|
|
|
|
local sortedSources = SetsDataProvider:GetSortedSetSources(setID)
|
|
for i = 1, #sortedSources do
|
|
local slot = C_Transmog.GetSlotForInventoryType(sortedSources[i].invType)
|
|
itemList[slot].appearanceID = sortedSources[i].sourceID;
|
|
end
|
|
|
|
local hyperlink = C_TransmogCollection.GetOutfitHyperlinkFromItemTransmogInfoList(itemList)
|
|
if not ChatEdit_InsertLink(hyperlink) then
|
|
ChatFrame_OpenChat(hyperlink)
|
|
end
|
|
end
|
|
|
|
|
|
local function GetTab(tab)
|
|
local atTransmogrifier = C_Transmog.IsAtTransmogNPC()
|
|
local tabID;
|
|
|
|
if ( atTransmogrifier ) then
|
|
tabID = BetterWardrobeCollectionFrame.selectedTransmogTab;
|
|
else
|
|
tabID = BetterWardrobeCollectionFrame.selectedCollectionTab;
|
|
end
|
|
return tabID, atTransmogrifier;
|
|
|
|
end
|
|
addon.GetTab = GetTab;
|
|
|
|
function BetterWardrobeSetsCollectionMixin:OpenInDressingRoom(setID)
|
|
|
|
if DressUpFrame:IsShown() then
|
|
else
|
|
DressUpFrame_Show(DressUpFrame)
|
|
C_Timer.After(0, function() self:OpenInDressingRoom(setID)
|
|
return
|
|
end)
|
|
end
|
|
|
|
local setType = tabType[addon.GetTab()]
|
|
setInfo = addon.GetSetInfo(setID) or C_TransmogSets.GetSetInfo(setID)
|
|
|
|
|
|
|
|
|
|
--local setType = addon.QueueList[1]
|
|
--local setID = addon.QueueList[2]
|
|
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
|
|
|
|
if not playerActor or not setID then
|
|
return false
|
|
end
|
|
|
|
if setType == "set" then
|
|
sources = {}
|
|
local sourceInfo = C_TransmogSets.GetSetPrimaryAppearances(setID)
|
|
for i, data in ipairs(sourceInfo) do
|
|
sources[data.appearanceID] = false
|
|
|
|
end
|
|
|
|
elseif setType == "extraset" then
|
|
sources = SetsDataProvider:GetSetSources(setID)
|
|
end
|
|
|
|
if not sources then return end
|
|
|
|
playerActor:Undress()
|
|
for i, d in pairs(sources)do
|
|
playerActor:TryOn(i)
|
|
end
|
|
|
|
import = true
|
|
--DressUpSources(sources)
|
|
import = false
|
|
addon:UpdateDressingRoom()
|
|
end
|
|
|
|
|
|
local function CheckSetAvailability(setID)
|
|
local setData = SetsDataProvider:GetSetSourceData(setID)
|
|
return setData.unavailable;
|
|
end
|
|
|
|
|
|
local function CheckSetAvailability2(setID)
|
|
local setData = addon.C_TransmogSets.GetSetInfo(setID)
|
|
local buildID = (select(4, GetBuildInfo()))
|
|
if ((setData.description == ELITE) and setData.patchID < buildID) or (setID <= 1446 and setID >=1436) then
|
|
|
|
return true;
|
|
|
|
end
|
|
end
|
|
|
|
|
|
|
|
function BetterWardrobeSetsCollectionMixin:GetSelectedSavedSetID()
|
|
if not self.selectedSavedSetID then
|
|
local savedSets = addon.GetSavedList()
|
|
if savedSets and #savedSets > 0 then
|
|
self.selectedSavedSetID = savedSets[1].setID;
|
|
else
|
|
self.selectedSavedSetID = nil;
|
|
end
|
|
end
|
|
|
|
return self.selectedSavedSetID;
|
|
end
|
|
|
|
|
|
local function variantsTooltip(elementData, variantSets)
|
|
--if not elementData.description then return "zz" end
|
|
|
|
--local ratioText = elementData.description..": "
|
|
--local have, total = addon.SetsDataProvider:GetSetSourceCounts(elementData.setID)
|
|
--ratioText = ratioText..have .. "/" .. total.."\n"
|
|
local ratioText = ""
|
|
table.sort(variantSets, function(a,b) return (a.name) < (b.name) end);
|
|
|
|
for i, setdata in ipairs(variantSets) do
|
|
local have, total = addon.SetsDataProvider:GetSetSourceCounts(setdata.setID)
|
|
text = setdata.description or setdata.name
|
|
ratioText = ratioText..text..": ".. have .. "/" .. total.."\n"
|
|
end
|
|
|
|
return ratioText
|
|
end
|
|
|
|
BetterWardrobeSetsScrollFrameButtonMixin = {};
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonMixin:Init(elementData)
|
|
local displayData = elementData;
|
|
if not displayData then return end
|
|
local variantSets = SetsDataProvider:GetVariantSets(elementData.setID) or {} --C_TransmogSets.GetVariantSets(elementData.setID) or {};
|
|
|
|
-- if the base set is hiddenUntilCollected and not collected, it's showing up because one of its variant sets is collected
|
|
-- in that case use any variant set to populate the info in the list
|
|
--if elementData.hiddenUntilCollected and not elementData.collected and BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
if #variantSets > 0 then
|
|
-- variant sets are already filtered for visibility (won't get a hiddenUntilCollected one unless it's collected)
|
|
-- any set will do so just picking first one
|
|
--displayData = variantSets[1];
|
|
end
|
|
--end
|
|
|
|
if #variantSets <= 1 or (C_AddOns.IsAddOnLoaded("CanIMogIt") and CanIMogItOptions["showSetInfo"]) then
|
|
self.Variants:Hide()
|
|
self.Variants.Count:SetText(0)
|
|
else
|
|
self.Variants:Show()
|
|
self.Variants.Count:SetText(#variantSets)
|
|
end
|
|
|
|
local subName = gsub(displayData.name, " %(Recolor%)", "")
|
|
----self.Name:SetText(subName..((displayData.className) and " ("..displayData.className..")" or "") );
|
|
self.Name:SetText(subName );
|
|
local topSourcesCollected, topSourcesTotal = SetsDataProvider:GetSetSourceTopCounts(displayData.setID);
|
|
-- progress visuals use the top collected progress, so collected visuals should reflect the top completion status as well
|
|
local setCollected = displayData.collected or topSourcesCollected == topSourcesTotal;
|
|
local color = IN_PROGRESS_FONT_COLOR;
|
|
if ( setCollected ) then
|
|
color = NORMAL_FONT_COLOR;
|
|
elseif ( topSourcesCollected == 0 ) then
|
|
color = GRAY_FONT_COLOR;
|
|
end
|
|
|
|
displayData.icon = displayData.icon or SetsDataProvider:GetIconForSet(displayData.setID)
|
|
self.Name:SetTextColor(color.r, color.g, color.b);
|
|
self.Label:SetText(displayData.label);
|
|
self.IconFrame:SetIconTexture(displayData.icon );
|
|
self.IconFrame:SetIconDesaturation((topSourcesCollected == 0) and 1 or 0);
|
|
self.IconFrame:SetIconCoverShown(not setCollected);
|
|
self.IconFrame:SetIconColor(displayData.validForCharacter and HIGHLIGHT_FONT_COLOR or RED_FONT_COLOR);
|
|
self.IconFrame:SetFavoriteIconShown(elementData.favoriteSetID)
|
|
self.setID = elementData.setID;
|
|
|
|
self.Store:SetShown(addon.MiscSets.TRADINGPOST_SETS[self.setID] or displayData.filter == 12);
|
|
self.Remix:SetShown(addon.MiscSets.REMIX_SETS[self.setID] );
|
|
self.EditButton:Hide();
|
|
|
|
self.variantInfo = variantsTooltip(elementData, variantSets);
|
|
|
|
local setInfo = addon.GetSetInfo(displayData.setID);
|
|
local isFavorite = C_TransmogSets.GetIsFavorite(displayData.setID);
|
|
local isHidden = addon.HiddenAppearanceDB.profile.set[displayData.setID];
|
|
local isInList = addon.CollectionList:IsInList(displayData.setID, "set");
|
|
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
isInList = addon.CollectionList:IsInList(displayData.setID, "extraset");
|
|
isFavorite = addon.favoritesDB.profile.extraset[displayData.setID];
|
|
isHidden = addon.HiddenAppearanceDB.profile.extraset[displayData.setID];
|
|
end
|
|
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 2 or BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
self.New:SetShown(SetsDataProvider:IsBaseSetNew(elementData.setID));
|
|
end
|
|
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 4 then
|
|
self.IconFrame:SetIconDesaturation(0);
|
|
self.IconFrame:SetIconCoverShown(false);
|
|
self.IconFrame:SetIconColor(HIGHLIGHT_FONT_COLOR);
|
|
self.Store:SetShown(false);
|
|
self.Remix:SetShown(false );
|
|
self.New:SetShown(false);
|
|
self.EditButton:Show();
|
|
|
|
end
|
|
|
|
self.IconFrame:SetFavoriteIconShown(isFavorite or elementData.favoriteSetID)
|
|
|
|
--self.Favorite:SetShown(isFavorite or elementData.favoriteSetID);
|
|
self.CollectionListVisual.Hidden.Icon:SetShown(isHidden);
|
|
self.CollectionListVisual.Unavailable:SetShown(CheckSetAvailability(displayData.setID));
|
|
self.CollectionListVisual.UnavailableItems:SetShown(CheckSetAvailability(displayData.setID));
|
|
--self.CollectionListVisual.InvalidTexture:SetShown(BetterWardrobeCollectionFrame.selectedCollectionTab == 3 and not displayData.isClass);
|
|
|
|
self.CollectionListVisual.Collection.Collection_Icon:SetShown(isInList);
|
|
self.CollectionListVisual.Collection.Collected_Icon:SetShown(isInList and setCollected);
|
|
|
|
self.EditButton:SetShown((BetterWardrobeCollectionFrame:CheckTab(4) and (self.setID < 50000 or self.setID >=70000 or C_AddOns.IsAddOnLoaded("MogIt"))))
|
|
|
|
if ( topSourcesCollected == 0 or setCollected ) then
|
|
self.ProgressBar:Hide();
|
|
else
|
|
self.ProgressBar:Show();
|
|
self.ProgressBar:SetWidth(SET_PROGRESS_BAR_MAX_WIDTH * topSourcesCollected / topSourcesTotal);
|
|
end
|
|
|
|
self:SetSelected(SelectionBehaviorMixin.IsElementDataIntrusiveSelected(elementData));
|
|
end
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonMixin:SetSelected(selected)
|
|
self.SelectedTexture:SetShown(selected);
|
|
end
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonMixin:OnClick(buttonName, down)
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 4 then
|
|
if ( buttonName == "LeftButton" ) then
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
|
|
g_selectionBehavior:Select(self);
|
|
end
|
|
end
|
|
if ( buttonName == "LeftButton" ) then
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON);
|
|
g_selectionBehavior:Select(self);
|
|
elseif ( buttonName == "RightButton" ) then
|
|
MenuUtil.CreateContextMenu(self, function(owner, rootDescription)
|
|
rootDescription:SetTag("MENU_WARDROBE_SETS_SET");
|
|
|
|
local baseSetID = self.setID;
|
|
local baseSet = SetsDataProvider:GetBaseSetByID(baseSetID);
|
|
local useDescription = (#SetsDataProvider:GetVariantSets(baseSetID) > 0);
|
|
local type = tabType[addon.GetTab()];
|
|
|
|
local isHidden = addon.HiddenAppearanceDB.profile[type][baseSetID]
|
|
rootDescription:CreateButton(TRANSMOG_OUTFIT_POST_IN_CHAT, function()
|
|
BetterWardrobeSetsCollectionMixin:LinkSet(self.baseSetID or self.setID);
|
|
end);
|
|
|
|
rootDescription:CreateButton(isHidden and SHOW or HIDE, function()
|
|
--self.setID = self.baseSetID;
|
|
ToggleHidden(self, isHidden);
|
|
end);
|
|
|
|
local text;
|
|
local targetSetID;
|
|
|
|
local favorite = (type == "set" and baseSet.favoriteSetID ~= nil) or addon.favoritesDB.profile.extraset[baseSetID]
|
|
--local favorite = baseSet.favoriteSetID ~= nil;
|
|
if favorite then
|
|
targetSetID = baseSet.favoriteSetID;
|
|
if useDescription then
|
|
local setInfo = C_TransmogSets.GetSetInfo(baseSet.favoriteSetID or baseSetIDP);
|
|
text = format(TRANSMOG_SETS_UNFAVORITE_WITH_DESCRIPTION, setInfo.description);
|
|
else
|
|
text = TRANSMOG_ITEM_UNSET_FAVORITE;
|
|
end
|
|
else
|
|
targetSetID = BetterWardrobeCollectionFrame.SetsCollectionFrame:GetDefaultSetIDForBaseSet(baseSetID);
|
|
if useDescription then
|
|
local setInfo = C_TransmogSets.GetSetInfo(targetSetID);
|
|
text = format(TRANSMOG_SETS_FAVORITE_WITH_DESCRIPTION, setInfo.description);
|
|
else
|
|
text = TRANSMOG_ITEM_SET_FAVORITE;
|
|
end
|
|
end
|
|
|
|
rootDescription:CreateButton(text, function()
|
|
if type == "set" then
|
|
C_TransmogSets.SetIsFavorite(targetSetID, not favorite)
|
|
|
|
elseif type == "extraset" then
|
|
addon.favoritesDB.profile.extraset[baseSetID] = not favorite;
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:Refresh()
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:OnSearchUpdate()
|
|
end
|
|
|
|
--C_TransmogSets.SetIsFavorite(targetSetID, not favorite);
|
|
end);
|
|
|
|
local collected = self.setCollected;
|
|
--Collection List Right Click options;
|
|
local collectionList = addon.CollectionList:CurrentList()
|
|
local isInList = match or addon.CollectionList:IsInList(self.baseSetID, type)
|
|
|
|
--if type == "set" or ((isInList and collected) or not collected)then --(type == "item" and not (model.visualInfo and model.visualInfo.isCollected)) or type == "set" or type == "extraset" then
|
|
local targetSet = match or variantTarget or self.baseSetID or self.setID;
|
|
local targetText = match and " - "..matchType or variantTarget and " - "..variantType or ""
|
|
--BW_UIDropDownMenu_AddSeparator()
|
|
local isInList = collectionList[type][targetSet]
|
|
local text = isInList and L["Remove from Collection List"]..targetText or L["Add to Collection List"]..targetText
|
|
rootDescription:CreateButton(text, function()
|
|
addon.CollectionList:UpdateList(type, targetSet, not isInList)
|
|
end);
|
|
end);
|
|
end
|
|
end
|
|
|
|
BetterWardrobeSetsScrollFrameButtonIconFrameMixin = {};
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonIconFrameMixin:OnEnter()
|
|
self:DisplaySetTooltip();
|
|
end
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonIconFrameMixin:OnLeave()
|
|
GameTooltip_Hide();
|
|
end
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonIconFrameMixin:SetIconTexture(texture)
|
|
self.Icon:SetTexture(texture);
|
|
end
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonIconFrameMixin:SetIconDesaturation(desaturation)
|
|
self.Icon:SetDesaturation(desaturation);
|
|
end
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonIconFrameMixin:SetIconCoverShown(shown)
|
|
self.Cover:SetShown(shown);
|
|
end
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonIconFrameMixin:SetFavoriteIconShown(shown)
|
|
self.Favorite:SetShown(shown);
|
|
end
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonIconFrameMixin:SetIconColor(color)
|
|
self.Icon:SetVertexColor(color:GetRGB());
|
|
end
|
|
|
|
local function ConvertClassMaskToClassList(classMask)
|
|
local classList = "";
|
|
for classID = 1, GetNumClasses() do
|
|
local classAllowed = FlagsUtil.IsSet(classMask, bit.lshift(1, (classID - 1)));
|
|
local allowedClassInfo = classAllowed and C_CreatureInfo.GetClassInfo(classID);
|
|
if allowedClassInfo then
|
|
if classList == "" then
|
|
classList = classList .. allowedClassInfo.className;
|
|
else
|
|
classList = classList .. LIST_DELIMITER .. allowedClassInfo.className;
|
|
end
|
|
end
|
|
end
|
|
|
|
return classList;
|
|
end
|
|
|
|
local function TryAppendUnmetSetRequirementsToTooltip(setInfo, tooltip)
|
|
if setInfo.validForCharacter then
|
|
return;
|
|
end
|
|
|
|
local classRequirementMet = setInfo.classMask == 0 or FlagsUtil.IsSet(setInfo.classMask, bit.lshift(1, (PlayerUtil.GetClassID() - 1)));
|
|
if not classRequirementMet then
|
|
local allowedClassList = ConvertClassMaskToClassList(setInfo.classMask);
|
|
if allowedClassList ~= "" then
|
|
GameTooltip_AddErrorLine(tooltip, ITEM_CLASSES_ALLOWED:format(allowedClassList));
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonIconFrameMixin:DisplaySetTooltip()
|
|
local setID = self:GetParent().setID;
|
|
local setInfo = setID and C_TransmogSets.GetSetInfo(setID);
|
|
if not setInfo then
|
|
return;
|
|
end
|
|
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
|
|
GameTooltip_AddHighlightLine(GameTooltip, setInfo.name);
|
|
TryAppendUnmetSetRequirementsToTooltip(setInfo, GameTooltip);
|
|
GameTooltip:Show();
|
|
end
|
|
|
|
BetterWardrobeSetsCollectionContainerMixin = { };
|
|
|
|
function BetterWardrobeSetsCollectionContainerMixin:OnLoad()
|
|
local view = CreateScrollBoxListLinearView();
|
|
view:SetElementInitializer("BetterWardrobeSetsScrollFrameButtonTemplate", function(button, elementData)
|
|
C_Timer.After(.05, function() button:Init(elementData); end)
|
|
end);
|
|
view:SetPadding(0,0,44,0,0);
|
|
|
|
local panExtent = buttonHeight;
|
|
ScrollUtil.InitScrollBoxListWithScrollBar(self.ScrollBox, self.ScrollBar, view);
|
|
|
|
g_selectionBehavior = ScrollUtil.AddSelectionBehavior(self.ScrollBox, SelectionBehaviorFlags.Intrusive);
|
|
g_selectionBehavior:RegisterCallback(SelectionBehaviorMixin.Event.OnSelectionChanged, function(o, elementData, selected)
|
|
local button = self.ScrollBox:FindFrame(elementData);
|
|
if button then
|
|
button:SetSelected(selected);
|
|
|
|
if selected then
|
|
local setCollectionFrame = self:GetParent();
|
|
setCollectionFrame:SelectBaseSetID(elementData.setID);
|
|
end
|
|
end
|
|
end, self);
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionContainerMixin:OnShow()
|
|
self:RegisterEvent("TRANSMOG_SETS_UPDATE_FAVORITE");
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionContainerMixin:OnHide()
|
|
self:UnregisterEvent("TRANSMOG_SETS_UPDATE_FAVORITE");
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionContainerMixin:OnEvent(event, ...)
|
|
if ( event == "TRANSMOG_SETS_UPDATE_FAVORITE" ) then
|
|
SetsDataProvider:RefreshFavorites();
|
|
self:UpdateDataProvider();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionContainerMixin:ReinitializeButtonWithBaseSetID(baseSetID)
|
|
local frame = self.ScrollBox:FindFrameByPredicate(function(frame, elementData)
|
|
return elementData.setID == baseSetID;
|
|
end);
|
|
|
|
if frame then
|
|
frame:Init(frame:GetElementData());
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionContainerMixin:UpdateDataProvider()
|
|
local dataProvider = CreateDataProvider(SetsDataProvider:GetBaseSets());
|
|
self.ScrollBox:SetDataProvider(dataProvider, ScrollBoxConstants.RetainScrollPosition);
|
|
|
|
self:UpdateListSelection();
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionContainerMixin:UpdateListSelection()
|
|
local selectedSetID = self:GetParent():GetSelectedSetID();
|
|
if selectedSetID then
|
|
--self:SelectElementDataMatchingSetID(C_TransmogSets.GetBaseSetID(selectedSetID));
|
|
self:SelectElementDataMatchingSetID(SetsDataProvider:GetBaseSetID(selectedSetID));
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionContainerMixin:SelectElementDataMatchingSetID(setID)
|
|
g_selectionBehavior:SelectElementDataByPredicate(function(elementData)
|
|
return elementData.setID == setID;
|
|
end);
|
|
end
|
|
|
|
BetterWardrobeSetsDetailsModelMixin = { };
|
|
|
|
function BetterWardrobeSetsDetailsModelMixin:OnLoad()
|
|
self:SetAutoDress(false);
|
|
self:SetUnit("player", false, PlayerUtil.ShouldUseNativeFormInModelScene());
|
|
self:UpdatePanAndZoomModelType();
|
|
|
|
local lightValues = { omnidirectional = false, point = CreateVector3D(-1, 0, 0), ambientIntensity = .7, ambientColor = CreateColor(.7, .7, .7), diffuseIntensity = .6, diffuseColor = CreateColor(1, 1, 1) };
|
|
local enabled = true;
|
|
self:SetLight(enabled, lightValues);
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsModelMixin:OnShow()
|
|
self:SetUnit("player", false, PlayerUtil.ShouldUseNativeFormInModelScene());
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsModelMixin:UpdatePanAndZoomModelType()
|
|
local hasAlternateForm, inAlternateForm = C_PlayerInfo.GetAlternateFormInfo();
|
|
if ( not self.panAndZoomModelType or self.inAlternateForm ~= inAlternateForm ) then
|
|
local _, race = UnitRace("player");
|
|
local sex = UnitSex("player");
|
|
if ( inAlternateForm ) then
|
|
self.panAndZoomModelType = race..sex.."Alt";
|
|
else
|
|
self.panAndZoomModelType = race..sex;
|
|
end
|
|
self.inAlternateForm = inAlternateForm;
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsModelMixin:GetPanAndZoomLimits()
|
|
return SET_MODEL_PAN_AND_ZOOM_LIMITS[self.panAndZoomModelType];
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsModelMixin:OnUpdate(elapsed)
|
|
if ( IsUnitModelReadyForUI("player") ) then
|
|
if ( self.rotating ) then
|
|
if ( self.yaw ) then
|
|
local x = GetCursorPosition();
|
|
local diff = (x - self.rotateStartCursorX) * MODELFRAME_DRAG_ROTATION_CONSTANT;
|
|
self.rotateStartCursorX = GetCursorPosition();
|
|
self.yaw = self.yaw + diff;
|
|
if ( self.yaw < 0 ) then
|
|
self.yaw = self.yaw + (2 * PI);
|
|
end
|
|
if ( self.yaw > (2 * PI) ) then
|
|
self.yaw = self.yaw - (2 * PI);
|
|
end
|
|
self:SetRotation(self.yaw, false);
|
|
end
|
|
elseif ( self.panning ) then
|
|
if ( self.defaultPosX ) then
|
|
local cursorX, cursorY = GetCursorPosition();
|
|
local modelX = self:GetPosition();
|
|
local panSpeedModifier = 100 * sqrt(1 + modelX - self.defaultPosX);
|
|
local modelY = self.panStartModelY + (cursorX - self.panStartCursorX) / panSpeedModifier;
|
|
local modelZ = self.panStartModelZ + (cursorY - self.panStartCursorY) / panSpeedModifier;
|
|
local limits = self:GetPanAndZoomLimits();
|
|
modelY = Clamp(modelY, limits.panMaxLeft, limits.panMaxRight);
|
|
modelZ = Clamp(modelZ, limits.panMaxBottom, limits.panMaxTop);
|
|
self:SetPosition(modelX, modelY, modelZ);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsModelMixin:OnMouseDown(button)
|
|
if ( button == "LeftButton" ) then
|
|
self.rotating = true;
|
|
self.rotateStartCursorX = GetCursorPosition();
|
|
elseif ( button == "RightButton" ) then
|
|
self.panning = true;
|
|
self.panStartCursorX, self.panStartCursorY = GetCursorPosition();
|
|
local modelX, modelY, modelZ = self:GetPosition();
|
|
self.panStartModelY = modelY;
|
|
self.panStartModelZ = modelZ;
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsModelMixin:OnMouseUp(button)
|
|
if ( button == "LeftButton" ) then
|
|
self.rotating = false;
|
|
elseif ( button == "RightButton" ) then
|
|
self.panning = false;
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsModelMixin:OnMouseWheel(delta)
|
|
local posX, posY, posZ = self:GetPosition();
|
|
posX = posX + delta * 0.5;
|
|
local limits = self:GetPanAndZoomLimits();
|
|
posX = Clamp(posX, self.defaultPosX, limits.maxZoom);
|
|
self:SetPosition(posX, posY, posZ);
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsModelMixin:OnModelLoaded()
|
|
if ( self.cameraID ) then
|
|
addon.Model_ApplyUICamera(self, self.cameraID);
|
|
end
|
|
end
|
|
|
|
BetterWardrobeSetsDetailsItemMixin = { };
|
|
|
|
function BetterWardrobeSetsDetailsItemMixin:OnShow()
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_ITEM_FAVORITE_UPDATE");
|
|
|
|
if ( not self.sourceID ) then
|
|
return;
|
|
end
|
|
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(self.sourceID);
|
|
self.visualID = sourceInfo.visualID;
|
|
|
|
self.Favorite.Icon:SetShown(C_TransmogCollection.GetIsAppearanceFavorite(self.visualID));
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsItemMixin:OnHide()
|
|
self:UnregisterEvent("TRANSMOG_COLLECTION_ITEM_FAVORITE_UPDATE");
|
|
end
|
|
|
|
|
|
function BetterWardrobeSetsDetailsItemMixin:OnEnter()
|
|
self.transmogSlot = C_Transmog.GetSlotForInventoryType(self.invType);
|
|
|
|
self:GetParent():GetParent():SetAppearanceTooltip(self)
|
|
|
|
self:SetScript("OnUpdate",
|
|
function()
|
|
if IsModifiedClick("DRESSUP") then
|
|
ShowInspectCursor();
|
|
else
|
|
ResetCursor();
|
|
end
|
|
end
|
|
);
|
|
|
|
if ( self.New:IsShown() ) then
|
|
self.New:Hide();
|
|
|
|
local setID = BetterWardrobeCollectionFrame.SetsCollectionFrame:GetSelectedSetID();
|
|
if BetterWardrobeCollectionFrame:CheckTab(2) then
|
|
C_TransmogSets.ClearSetNewSourcesForSlot(setID, self.transmogSlot)
|
|
else
|
|
addon.ClearSetNewSourcesForSlot(setID, self.transmogSlot)
|
|
end
|
|
--local baseSetID = C_TransmogSets.GetBaseSetID(setID)
|
|
local baseSetID = SetsDataProvider:GetBaseSetID(setID)
|
|
if baseSetID then
|
|
SetsDataProvider:ResetBaseSetNewStatus(baseSetID)
|
|
--BetterWardrobeCollectionFrame.SetsCollectionFrame:Refresh()
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame.ListContainer:ReinitializeButtonWithBaseSetID(baseSetID)
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsItemMixin:OnEvent(event, ...)
|
|
if ( event == "TRANSMOG_COLLECTION_ITEM_FAVORITE_UPDATE" ) then
|
|
local itemAppearanceID, isFavorite = ...;
|
|
|
|
if ( self.visualID == itemAppearanceID ) then
|
|
self.Favorite.Icon:SetShown(isFavorite);
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function BetterWardrobeSetsDetailsItemMixin:OnLeave()
|
|
self:SetScript("OnUpdate", nil);
|
|
ResetCursor();
|
|
BetterWardrobeCollectionFrame:HideAppearanceTooltip();
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsItemMixin:OnMouseDown(button)
|
|
if ( IsModifiedClick("CHATLINK") ) then
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(self.sourceID);
|
|
local slot = C_Transmog.GetSlotForInventoryType(sourceInfo.invType);
|
|
local sources = C_TransmogSets.GetSourcesForSlot(self:GetParent():GetParent():GetSelectedSetID(), slot);
|
|
if ( #sources == 0 ) then
|
|
-- can happen if a slot only has HiddenUntilCollected sources
|
|
tinsert(sources, sourceInfo);
|
|
end
|
|
CollectionWardrobeUtil.SortSources(sources, sourceInfo.visualID, self.sourceID);
|
|
if ( BetterWardrobeCollectionFrame.tooltipSourceIndex ) then
|
|
local index = CollectionWardrobeUtil.GetValidIndexForNumSources(BetterWardrobeCollectionFrame.tooltipSourceIndex, #sources);
|
|
local link = select(6, C_TransmogCollection.GetAppearanceSourceInfo(sources[index].sourceID));
|
|
if ( link ) then
|
|
HandleModifiedItemClick(link);
|
|
end
|
|
end
|
|
elseif ( IsModifiedClick("DRESSUP") ) then
|
|
DressUpVisual(self.sourceID);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsItemMixin:OnMouseUp(button)
|
|
if button == "RightButton" then
|
|
if not self.collected then
|
|
return;
|
|
end
|
|
|
|
MenuUtil.CreateContextMenu(self, function(owner, rootDescription)
|
|
rootDescription:SetTag("MENU_WARDROBE_SETS_SET_DETAIL");
|
|
|
|
local appearanceID = self.visualID;
|
|
local favorite = C_TransmogCollection.GetIsAppearanceFavorite(appearanceID);
|
|
local text = favorite and TRANSMOG_ITEM_UNSET_FAVORITE or TRANSMOG_ITEM_SET_FAVORITE;
|
|
rootDescription:CreateButton(text, function()
|
|
C_TransmogCollection.SetIsAppearanceFavorite(appearanceID, not favorite);
|
|
end);
|
|
end);
|
|
end
|
|
end
|
|
|
|
BetterWardrobeSetsTransmogMixin = CreateFromMixins(DirtiableMixin);
|
|
|
|
function BetterWardrobeSetsTransmogMixin:OnLoad()
|
|
self.NUM_ROWS = 2;
|
|
self.NUM_COLS = 4;
|
|
self.PAGE_SIZE = self.NUM_ROWS * self.NUM_COLS;
|
|
self.APPLIED_SOURCE_INDEX = 1;
|
|
self.SELECTED_SOURCE_INDEX = 3;
|
|
self:SetDirtyMethod(self.UpdateSets);
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:OnShow()
|
|
self:RegisterEvent("TRANSMOGRIFY_UPDATE");
|
|
self:RegisterEvent("TRANSMOGRIFY_SUCCESS");
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_ITEM_UPDATE");
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_UPDATED");
|
|
self:RegisterEvent("PLAYER_EQUIPMENT_CHANGED");
|
|
self:RegisterEvent("TRANSMOG_SETS_UPDATE_FAVORITE");
|
|
self:RefreshCameras();
|
|
local RESET_SELECTION = true;
|
|
self:Refresh(RESET_SELECTION);
|
|
BetterWardrobeCollectionFrame.progressBar:Show();
|
|
self:UpdateProgressBar();
|
|
self:RefreshNoValidSetsLabel();
|
|
self.sourceQualityTable = { };
|
|
|
|
--if HelpTip:IsShowing(BetterWardrobeCollectionFrame, TRANSMOG_SETS_VENDOR_TUTORIAL) then
|
|
--HelpTip:Hide(BetterWardrobeCollectionFrame, TRANSMOG_SETS_VENDOR_TUTORIAL);
|
|
--SetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_SETS_VENDOR_TAB, true);
|
|
--end
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:OnHide()
|
|
self:UnregisterEvent("TRANSMOGRIFY_UPDATE");
|
|
self:UnregisterEvent("TRANSMOGRIFY_SUCCESS");
|
|
self:UnregisterEvent("TRANSMOG_COLLECTION_ITEM_UPDATE");
|
|
self:UnregisterEvent("TRANSMOG_COLLECTION_UPDATED");
|
|
self:UnregisterEvent("PLAYER_EQUIPMENT_CHANGED");
|
|
self:UnregisterEvent("TRANSMOG_SETS_UPDATE_FAVORITE");
|
|
self.loadingSetID = nil;
|
|
SetsDataProvider:ClearSets();
|
|
self:GetParent():ClearSearch(Enum.TransmogSearchType.UsableSets);
|
|
self.sourceQualityTable = nil;
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:OnEvent(event, ...)
|
|
if ( event == "TRANSMOGRIFY_UPDATE" or event == "TRANSMOGRIFY_SUCCESS" ) then
|
|
-- these event can fire multiple times for set interaction, once for each slot in the set
|
|
if ( not self.pendingRefresh ) then
|
|
self.pendingRefresh = true;
|
|
C_Timer.After(0, function()
|
|
self.pendingRefresh = nil;
|
|
if self:IsShown() then
|
|
local resetSelection = (event == "TRANSMOGRIFY_UPDATE");
|
|
self:Refresh(resetSelection);
|
|
end
|
|
end);
|
|
end
|
|
elseif ( event == "TRANSMOG_COLLECTION_UPDATED" or event == "TRANSMOG_SETS_UPDATE_FAVORITE" ) then
|
|
SetsDataProvider:ClearSets();
|
|
self:Refresh();
|
|
self:UpdateProgressBar();
|
|
self:RefreshNoValidSetsLabel();
|
|
elseif ( event == "TRANSMOG_COLLECTION_ITEM_UPDATE" ) then
|
|
if ( self.loadingSetID ) then
|
|
local setID = self.loadingSetID;
|
|
self.loadingSetID = nil;
|
|
self:LoadSet(setID);
|
|
end
|
|
if ( self.tooltipModel ) then
|
|
self.tooltipModel:RefreshTooltip();
|
|
end
|
|
elseif ( event == "PLAYER_EQUIPMENT_CHANGED" ) then
|
|
if ( self.selectedSetID ) then
|
|
self:LoadSet(self.selectedSetID);
|
|
end
|
|
self:Refresh();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:OnMouseWheel(value)
|
|
self.PagingFrame:OnMouseWheel(value);
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:UpdateProgressBar()
|
|
self:GetParent():UpdateProgressBar(C_TransmogSets.GetValidBaseSetsCountsForCharacter());
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:Refresh(resetSelection)
|
|
--self.appliedSetID = self:GetFirstMatchingSetID(self.APPLIED_SOURCE_INDEX);
|
|
if ( resetSelection ) then
|
|
--self.selectedSetID = self:GetFirstMatchingSetID(self.SELECTED_SOURCE_INDEX);
|
|
self:ResetPage();
|
|
else
|
|
self:UpdateSets();
|
|
end
|
|
end
|
|
|
|
local function SetModelUnit(model)
|
|
local _, raceFilename = UnitRace("player");
|
|
local gender = UnitSex("player")
|
|
|
|
if (raceFilename == "Dracthyr" or raceFilename == "Worgen") then
|
|
local modelID, altModelID
|
|
if raceFilename == "Worgen" then
|
|
if gender == 3 then
|
|
modelID = 307453
|
|
altModelID = 1000764
|
|
else
|
|
modelID = 307454
|
|
altModelID = 1011653
|
|
end
|
|
|
|
elseif raceFilename == "Dracthyr" then
|
|
modelID = 4207724
|
|
|
|
if gender == 3 then
|
|
altModelID = 4220448
|
|
else
|
|
altModelID = 4395382
|
|
end
|
|
end
|
|
|
|
if not addon.useNativeForm then
|
|
model:SetUnit("player", false, false)
|
|
model:SetModel(altModelID)
|
|
else
|
|
model:SetUnit("player", false, true)
|
|
model:SetModel(modelID)
|
|
end
|
|
else
|
|
model:SetUnit("player", false, true)
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:UpdateSets()
|
|
local usableSets = SetsDataProvider:GetUsableSets(force);
|
|
self.PagingFrame:SetMaxPages(ceil(#usableSets / self.PAGE_SIZE));
|
|
local pendingTransmogModelFrame = nil;
|
|
local indexOffset = (self.PagingFrame:GetCurrentPage() - 1) * self.PAGE_SIZE;
|
|
for i = 1, self.PAGE_SIZE do
|
|
local model = self.Models[i];
|
|
local index = i + indexOffset;
|
|
local set = usableSets[index];
|
|
local hasAlternateForm = false
|
|
if ( set ) then
|
|
SetModelUnit(model);
|
|
model:Show();
|
|
local setType = set.setType
|
|
|
|
if setType == "SavedBlizzard" then
|
|
local sources = C_TransmogCollection.GetOutfitItemTransmogInfoList(addon:GetBlizzID(set.setID))
|
|
model:Undress()
|
|
for slotID, itemTransmogInfo in ipairs(sources) do
|
|
local canRecurse = false;
|
|
if slotID == 17 then
|
|
local transmogLocation = TransmogUtil.GetTransmogLocation("MAINHANDSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.Main)
|
|
local mainHandCategoryID = C_Transmog.GetSlotEffectiveCategory(transmogLocation)
|
|
canRecurse = TransmogUtil.IsCategoryLegionArtifact(mainHandCategoryID)
|
|
end
|
|
model:SetItemTransmogInfo(itemTransmogInfo, slotID, canRecurse)
|
|
|
|
model.AltItemtems:Hide()
|
|
|
|
end
|
|
|
|
elseif setType == "SavedExtra" then
|
|
model:Undress()
|
|
local primaryAppearances = {}
|
|
local sourceData = SetsDataProvider:GetSetSources(set.setID)
|
|
local tab = BetterWardrobeCollectionFrame.selectedTransmogTab;
|
|
for _, sourceID in ipairs(sourceData) do
|
|
if (tab == 4 and not BetterWardrobeVisualToggle.VisualMode) or
|
|
(CollectionsJournal:IsShown()) or
|
|
(not addon.Profile.HideMissing and (not BetterWardrobeVisualToggle.VisualMode or (Sets.isMogKnown(sourceID) and BetterWardrobeVisualToggle.VisualMode))) or
|
|
(addon.Profile.HideMissing and (BetterWardrobeVisualToggle.VisualMode or Sets.isMogKnown(sourceID))) then
|
|
model:TryOn(sourceID)
|
|
end
|
|
|
|
if not hasAlternateForm and addon:CheckAltItem(sourceID) then
|
|
hasAlternateForm = true
|
|
end
|
|
if hasAlternateForm then
|
|
model.AltItemtems:Show()--local f = CreateFrame("Frame", "112cd2", model, "AltItemtemplate")
|
|
else
|
|
model.AltItemtems:Hide()
|
|
end
|
|
end
|
|
else
|
|
if ( model.setID ~= set.setID ) then
|
|
model:Undress();
|
|
--local sourceData = GetSetSourceData(set.setID, set.sources);
|
|
local sources = SetsDataProvider:GetSetSources(set.setID);
|
|
|
|
for sourceID in pairs(sources) do
|
|
--if (not Profile.HideMissing and not BW_WardrobeToggle.VisualMode) or (Profile.HideMissing and BW_WardrobeToggle.VisualMode) or (Profile.HideMissing and isMogKnown(sourceID)) then
|
|
if (not addon.Profile.HideMissing and (not BetterWardrobeVisualToggle.VisualMode or (Sets.isMogKnown(sourceID) and BetterWardrobeVisualToggle.VisualMode))) or
|
|
(addon.Profile.HideMissing and (BetterWardrobeVisualToggle.VisualMode or Sets.isMogKnown(sourceID))) then
|
|
model:TryOn(sourceID)
|
|
end
|
|
if not hasAlternateForm and addon:CheckAltItem(sourceID) then
|
|
hasAlternateForm = true
|
|
end
|
|
if hasAlternateForm then
|
|
model.AltItemtems:Show()--local f = CreateFrame("Frame", "112cd2", model, "AltItemtemplate")
|
|
else
|
|
model.AltItemtems:Hide()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
local transmogStateAtlas;
|
|
if ( set.setID == self.appliedSetID and set.setID == self.selectedSetID ) then
|
|
transmogStateAtlas = "transmog-set-border-current-transmogged";
|
|
elseif ( set.setID == self.selectedSetID ) then
|
|
transmogStateAtlas = "transmog-set-border-selected";
|
|
pendingTransmogModelFrame = model;
|
|
end
|
|
if ( transmogStateAtlas ) then
|
|
model.TransmogStateTexture:SetAtlas(transmogStateAtlas, true);
|
|
model.TransmogStateTexture:Show();
|
|
else
|
|
model.TransmogStateTexture:Hide();
|
|
end
|
|
model.Favorite.Icon:SetShown(set.favorite);
|
|
|
|
if hasAlternateForm then
|
|
model.AltItemtems:Show();
|
|
else
|
|
model.AltItemtems:Hide();
|
|
end
|
|
|
|
|
|
local topSourcesCollected, topSourcesTotal;
|
|
topSourcesCollected, topSourcesTotal = SetsDataProvider:GetSetSourceCounts(set.setID)
|
|
|
|
local setInfo = addon.GetSetInfo(set.setID);
|
|
if setInfo then
|
|
|
|
local isFavorite = C_TransmogSets.GetIsFavorite(set.setID) or addon.favoritesDB.profile.extraset[set.setID];
|
|
local isHidden = addon.HiddenAppearanceDB.profile.extraset[set.setID];
|
|
|
|
model.Favorite.Icon:SetShown(isFavorite)
|
|
model.setID = set.setID;
|
|
|
|
local isHidden = addon.HiddenAppearanceDB.profile.set[set.setID] or addon.HiddenAppearanceDB.profile.extraset[set.setID]
|
|
model.CollectionListVisual.Hidden.Icon:SetShown(isHidden)
|
|
|
|
|
|
local isInList = addon.CollectionList:IsInList(set.setID, "set")
|
|
model.CollectionListVisual.Collection.Collection_Icon:SetShown(isInList)
|
|
model.CollectionListVisual.Collection.Collected_Icon:SetShown(isInList and C_TransmogSets.IsBaseSetCollected(set.setID))
|
|
|
|
--model.SetInfo.setName:SetText((addon.Profile.ShowNames and setInfo["name"].."\n"..(setInfo["description"] or "")) or "")
|
|
|
|
local name = setInfo["name"]
|
|
local description
|
|
if setInfo["description"] then
|
|
description = "\n"..("("..setInfo["description"]..")")
|
|
else
|
|
description = "\n"..("")
|
|
end
|
|
--local description = "\n"..("("..setInfo["description"]..")" or "")
|
|
|
|
--local description = (setInfo["description"] and "\n-"..setInfo["description"].."-") or ""
|
|
--local classname = (setInfo.className and "\n ("..setInfo.className..")") or ""
|
|
if addon.Profile.ShowNames then
|
|
model.SetInfo.setName:Show()
|
|
model.SetInfo.setName:SetText(("%s%s"):format(name, description))
|
|
else
|
|
model.SetInfo.setName:Hide()
|
|
end
|
|
local tab = BetterWardrobeCollectionFrame.selectedTransmogTab;
|
|
|
|
if (tab ~= 4) then
|
|
model.SetInfo.progress:Show()
|
|
model.SetInfo.progress:SetText((addon.Profile.ShowSetCount and topSourcesCollected.."/".. topSourcesTotal) or "")
|
|
else
|
|
model.SetInfo.setName:SetText(("%s%s"):format(name, ""))
|
|
model.SetInfo.progress:Hide()
|
|
end
|
|
model.setCollected = topSourcesCollected == topSourcesTotal;
|
|
|
|
end
|
|
|
|
else
|
|
model:Hide();
|
|
end
|
|
end
|
|
if ( pendingTransmogModelFrame ) then
|
|
self.PendingTransmogFrame:SetParent(pendingTransmogModelFrame);
|
|
self.PendingTransmogFrame:SetPoint("CENTER");
|
|
self.PendingTransmogFrame:Show();
|
|
if ( self.PendingTransmogFrame.setID ~= pendingTransmogModelFrame.setID ) then
|
|
self.PendingTransmogFrame.TransmogSelectedAnim:Stop();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim:Play();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim2:Stop();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim2:Play();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim3:Stop();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim3:Play();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim4:Stop();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim4:Play();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim5:Stop();
|
|
self.PendingTransmogFrame.TransmogSelectedAnim5:Play();
|
|
end
|
|
self.PendingTransmogFrame.setID = pendingTransmogModelFrame.setID;
|
|
else
|
|
self.PendingTransmogFrame:Hide();
|
|
end
|
|
|
|
self.NoValidSetsLabel:SetShown(not C_TransmogSets.HasUsableSets());
|
|
|
|
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:RefreshNoValidSetsLabel()
|
|
self.NoValidSetsLabel:SetShown(not C_TransmogSets.HasUsableSets());
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:OnPageChanged(userAction)
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_PAGE_TURN);
|
|
|
|
if ( userAction ) then
|
|
self:UpdateSets();
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:LoadSet(setID)
|
|
print(setID)
|
|
local waitingOnData = false;
|
|
local transmogSources = { };
|
|
local setType = addon.GetSetType(setID);
|
|
|
|
|
|
--Default Blizzard Saved sets;
|
|
if setType == "SavedBlizzard" then
|
|
local setSources = SetsDataProvider:GetSetSources(setID);
|
|
for sourceID in pairs(setSources) do
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID);
|
|
if sourceInfo then
|
|
local appearanceID = sourceInfo.visualID;
|
|
local slot = C_Transmog.GetSlotForInventoryType(sourceInfo.invType);
|
|
if slot then
|
|
local _, visualID, _, _, _, itemLink = C_TransmogCollection.GetAppearanceSourceInfo(sourceID);
|
|
local sources = (sourceInfo and itemLink and C_TransmogCollection.GetAppearanceSources(appearanceID, addon.GetItemCategory(appearanceID), addon.GetTransmogLocation(itemLink)) );
|
|
--local sources = sourceInfo and C_TransmogCollection.GetAppearanceSources(appearanceID)
|
|
if sources and #sources > 0 then
|
|
CollectionWardrobeUtil.SortSources(sources, appearanceID);
|
|
local index = CollectionWardrobeUtil.GetDefaultSourceIndex(sources, sourceID);
|
|
transmogSources[slot] = sources[index].sourceID;
|
|
|
|
for i, slotSourceInfo in ipairs(sources) do
|
|
if ( not slotSourceInfo.name ) then
|
|
waitingOnData = true;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
C_Transmog.LoadOutfit(addon:GetBlizzID(setID))
|
|
else
|
|
local setData = addon.GetSetInfo(setID);
|
|
if not setData or setType == "Unknown" then return end
|
|
|
|
local offShoulder = setData.offShoulder or 0;
|
|
local mainHandEnchant = setData.mainHandEnchant or 0;
|
|
local offHandEnchant = setData.offHandEnchant or 0;
|
|
|
|
--Load Default Blizzard set
|
|
if setData.setType == "Blizzard" then
|
|
local sources = setData.sources--GetSetSources(setID);
|
|
for sourceID,_ in pairs(sources) do
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID);
|
|
local slot = C_Transmog.GetSlotForInventoryType(sourceInfo.invType);
|
|
local tmogLocation = TransmogUtil.CreateTransmogLocation(slot, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
local slotSources = C_TransmogCollection.GetAppearanceSources(sourceInfo.visualID, sourceInfo.categoryID, tmogLocation);
|
|
CollectionWardrobeUtil.SortSources(slotSources, sourceInfo.visualID);
|
|
local index = CollectionWardrobeUtil.GetDefaultSourceIndex(slotSources, sourceID);
|
|
transmogSources[slot] = slotSources[index].sourceID;
|
|
for i, slotSourceInfo in ipairs(slotSources) do
|
|
if ( not slotSourceInfo.name ) then
|
|
waitingOnData = true;
|
|
end
|
|
end
|
|
end
|
|
--Load extra and extended sets
|
|
else
|
|
if setData.itemData then
|
|
for slotID, slotData in pairs(setData.itemData) do
|
|
local sourceID = slotData[2];
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID);
|
|
if sourceInfo then
|
|
|
|
local appearanceID = slotData[3];
|
|
local slot = C_Transmog.GetSlotForInventoryType(sourceInfo.invType);
|
|
if slot then
|
|
local _, visualID, _, _, _, itemLink = C_TransmogCollection.GetAppearanceSourceInfo(sourceID);
|
|
local sources = (sourceInfo and itemLink and C_TransmogCollection.GetAppearanceSources(sourceInfo.visualID, addon.GetItemCategory(sourceInfo.visualID), addon.GetTransmogLocation(itemLink)) );
|
|
--local sources = sourceInfo and C_TransmogCollection.GetAppearanceSources(sourceInfo.visualID);
|
|
|
|
if sources and #sources > 0 then
|
|
CollectionWardrobeUtil.SortSources(sources, sourceInfo.visualID);
|
|
local index = CollectionWardrobeUtil.GetDefaultSourceIndex(sources, sourceID);
|
|
transmogSources[slot] = sources[index].sourceID;
|
|
|
|
for i, slotSourceInfo in ipairs(sources) do
|
|
if ( not slotSourceInfo.name ) then
|
|
waitingOnData = true;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
--for slotID, data in pairs(setData.itemData) do
|
|
--transmogSources[slotID] = data[2]
|
|
--end
|
|
end
|
|
end
|
|
|
|
if ( waitingOnData ) then
|
|
self.loadingSetID = setID;
|
|
else
|
|
self.loadingSetID = nil;
|
|
local transmogLocation, pendingInfo;
|
|
for slotID, appearanceID in pairs(transmogSources) do
|
|
transmogLocation = TransmogUtil.CreateTransmogLocation(slotID, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, appearanceID);
|
|
C_Transmog.SetPending(transmogLocation, pendingInfo);
|
|
|
|
if addon:CheckAltItem(appearanceID) and _G["BW_AltIcon"..slotID] then
|
|
_G["BW_AltIcon"..slotID]:Show();
|
|
elseif not addon:CheckAltItem(appearanceID) and _G["BW_AltIcon"..slotID] then
|
|
_G["BW_AltIcon"..slotID]:Hide();
|
|
end
|
|
end
|
|
|
|
-- for slots that are be split, undo it
|
|
if C_Transmog.CanHaveSecondaryAppearanceForSlotID(3) then
|
|
local TransmogLocation = TransmogUtil.CreateTransmogLocation(3, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
local secondaryTransmogLocation = TransmogUtil.CreateTransmogLocation(3, Enum.TransmogType.Appearance, Enum.TransmogModification.Secondary);
|
|
local baseSourceID = C_Transmog.GetSlotVisualInfo(TransmogUtil.GetTransmogLocation("SHOULDERSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.Secondary));
|
|
|
|
if offShoulder and offShoulder ~= 0 and offShoulder ~= baseSourceID then
|
|
local secondaryPendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, offShoulder or Constants.Transmog.NoTransmogID);
|
|
C_Transmog.SetPending(secondaryTransmogLocation, secondaryPendingInfo);
|
|
else
|
|
-- local pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.ToggleOff);
|
|
--C_Transmog.SetPending(secondaryTransmogLocation, pendingInfo);
|
|
C_Transmog.ClearPending(secondaryTransmogLocation);
|
|
|
|
end
|
|
end
|
|
|
|
--[[if setData then
|
|
local TransmogLocation = TransmogUtil.CreateTransmogLocation(16, Enum.TransmogType.Illusion, Enum.TransmogModification.Main)
|
|
local pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, setData.mainHandEnchant or 0)
|
|
C_Transmog.SetPending(TransmogLocation, pendingInfo)
|
|
|
|
local TransmogLocation = TransmogUtil.CreateTransmogLocation(17, Enum.TransmogType.Illusion, Enum.TransmogModification.Main)
|
|
local pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, setData.offHandEnchant or 0)
|
|
C_Transmog.SetPending(TransmogLocation, pendingInfo)
|
|
end]]
|
|
end
|
|
end
|
|
|
|
local emptySlotData = Sets:GetEmptySlots();
|
|
if addon.Profile.HiddenMog and setData.setType then
|
|
local clearSlots = Sets:EmptySlots(transmogSources);
|
|
for i, x in pairs(clearSlots) do
|
|
local _, source = addon.GetItemSource(x) --C_TransmogCollection.GetItemInfo(x);
|
|
--C_Transmog.SetPending(i, Enum.TransmogType.Appearance,source);
|
|
local transmogLocation = TransmogUtil.GetTransmogLocation(i, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
local pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, source);
|
|
|
|
-----C_Transmog.SetPending(transmogLocation, source, Enum.TransmogType.Appearance);
|
|
C_Transmog.SetPending(transmogLocation, pendingInfo);
|
|
end
|
|
|
|
for i, x in pairs(transmogSources) do
|
|
if not C_TransmogCollection.PlayerHasTransmogItemModifiedAppearance(x) and (i ~= 7 or i ~= 4 or i ~= 19) and emptySlotData[i] then
|
|
local _, source = addon.GetItemSource(emptySlotData[i]) --C_TransmogCollection.GetItemInfo(emptySlotData[i]);
|
|
--C_Transmog.SetPending(i, Enum.TransmogType.Appearance, source);
|
|
local transmogLocation = TransmogUtil.GetTransmogLocation(i, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
local pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, source);
|
|
-----C_Transmog.SetPending(transmogLocation, source, Enum.TransmogType.Appearance)
|
|
C_Transmog.SetPending(transmogLocation, pendingInfo);
|
|
end
|
|
end
|
|
end
|
|
|
|
--hide any slots marked as alwayws hide;
|
|
local alwaysHideSlots = addon.setdb.profile.autoHideSlot;
|
|
for key, transmogSlot in pairs(TRANSMOG_SLOTS) do
|
|
local slotID = transmogSlot.location:GetSlotID();
|
|
if alwaysHideSlots[slotID] then
|
|
local transmogLocation = TransmogUtil.GetTransmogLocation(slotID, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
local _, source = addon.GetItemSource(emptySlotData[slotID]); -- C_TransmogCollection.GetItemInfo(emptySlotData[i])
|
|
local pendingInfo = TransmogUtil.CreateTransmogPendingInfo(Enum.TransmogPendingType.Apply, source);
|
|
|
|
-----C_Transmog.SetPending(transmogLocation, source, Enum.TransmogType.Appearance)
|
|
C_Transmog.SetPending(transmogLocation, pendingInfo);
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:GetFirstMatchingSetID(sourceIndex)
|
|
local transmogSourceIDs = { };
|
|
for _, button in ipairs(WardrobeTransmogFrame.SlotButtons) do
|
|
if not button.transmogLocation:IsSecondary() then
|
|
local sourceID = select(sourceIndex, TransmogUtil.GetInfoForEquippedSlot(button.transmogLocation));
|
|
if ( sourceID ~= Constants.Transmog.NoTransmogID ) then
|
|
transmogSourceIDs[button.transmogLocation:GetSlotID()] = sourceID;
|
|
end
|
|
end
|
|
end
|
|
|
|
local usableSets = SetsDataProvider:GetUsableSets();
|
|
for _, set in ipairs(usableSets) do
|
|
local setMatched = false;
|
|
for slotID, transmogSourceID in pairs(transmogSourceIDs) do
|
|
local sourceIDs = C_TransmogSets.GetSourceIDsForSlot(set.setID, slotID);
|
|
-- if there are no sources for a slot, that slot is considered matched
|
|
local slotMatched = (#sourceIDs == 0);
|
|
for _, sourceID in ipairs(sourceIDs) do
|
|
if ( transmogSourceID == sourceID ) then
|
|
slotMatched = true;
|
|
break;
|
|
end
|
|
end
|
|
setMatched = slotMatched;
|
|
if ( not setMatched ) then
|
|
break;
|
|
end
|
|
end
|
|
if ( setMatched ) then
|
|
return set.setID;
|
|
end
|
|
end
|
|
return nil;
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:OnUnitModelChangedEvent()
|
|
if ( IsUnitModelReadyForUI("player") ) then
|
|
for i, model in ipairs(self.Models) do
|
|
model:RefreshUnit();
|
|
model.setID = nil;
|
|
end
|
|
self:RefreshCameras();
|
|
self:UpdateSets();
|
|
return true;
|
|
else
|
|
return false;
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:RefreshCameras()
|
|
if ( self:IsShown() ) then
|
|
local detailsCameraID, transmogCameraID = GetFormCameraInfo()--C_TransmogSets.GetCameraIDs()
|
|
for i, model in ipairs(self.Models) do
|
|
model.cameraID = transmogCameraID;
|
|
model:RefreshCamera();
|
|
addon.Model_ApplyUICamera(model, transmogCameraID);
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:OnSearchUpdate()
|
|
SetsDataProvider:ClearUsableSets();
|
|
self:UpdateSets();
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:SelectSet(setID)
|
|
|
|
--TODO REVISIT FOR OTHE SET TYopes;
|
|
self.selectedSetID = setID;
|
|
selected = true;
|
|
self:LoadSet(setID)
|
|
if addon.GetSetType(setID) then
|
|
if (setID) then
|
|
name = addon.GetOutfitName(setID)
|
|
end
|
|
if ( name ) then
|
|
--BW_UIDropDownMenu_SetText(BetterWardrobeOutfitDropDown, name)
|
|
else
|
|
outfitID = nil;
|
|
--BW_UIDropDownMenu_SetText(BetterWardrobeOutfitDropDown, GRAY_FONT_COLOR_CODE..TRANSMOG_OUTFIT_NONE..FONT_COLOR_CODE_CLOSE)
|
|
end
|
|
|
|
----BetterWardrobeOutfitDropDown.selectedOutfitID = setID;
|
|
|
|
----BetterWardrobeOutfitDropDown:UpdateSaveButton()
|
|
----BetterWardrobeOutfitDropDown:OnSelectOutfit(setID)
|
|
end
|
|
--self:ResetPage()
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:CanHandleKey(key)
|
|
if ( key == WARDROBE_PREV_VISUAL_KEY or key == WARDROBE_NEXT_VISUAL_KEY or key == WARDROBE_UP_VISUAL_KEY or key == WARDROBE_DOWN_VISUAL_KEY ) then
|
|
return true;
|
|
end
|
|
return false;
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:HandleKey(key)
|
|
if ( not self.selectedSetID ) then
|
|
return;
|
|
end
|
|
|
|
local setIndex;
|
|
local usableSets = SetsDataProvider:GetUsableSets();
|
|
for i = 1, #usableSets do
|
|
if ( usableSets[i].setID == self.selectedSetID ) then
|
|
setIndex = i;
|
|
break;
|
|
end
|
|
end
|
|
|
|
if ( setIndex ) then
|
|
setIndex = GetAdjustedDisplayIndexFromKeyPress(self, setIndex, #usableSets, key);
|
|
self:SelectSet(usableSets[setIndex].setID);
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:ResetPage()
|
|
local page = 1;
|
|
if ( self.selectedSetID ) then
|
|
local usableSets = SetsDataProvider:GetUsableSets();
|
|
self.PagingFrame:SetMaxPages(ceil(#usableSets / self.PAGE_SIZE));
|
|
for i, set in ipairs(usableSets) do
|
|
if ( set.setID == self.selectedSetID ) then
|
|
page = GetPage(i, self.PAGE_SIZE);
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
self.PagingFrame:SetCurrentPage(page);
|
|
self:UpdateSets();
|
|
end
|
|
|
|
--Visual View TOggle;
|
|
BetterWardrobeVisualToggleMixin = {}
|
|
|
|
function BetterWardrobeVisualToggleMixin:OnClick()
|
|
end
|
|
|
|
function BetterWardrobeVisualToggleMixin:OnHide()
|
|
--BetterWardrobeCollectionFrame.BW_SetsTransmogFrame:Hide()
|
|
self.VisualMode = false;
|
|
end
|
|
|
|
function BetterWardrobeVisualToggleMixin:OnEnter()
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
|
|
GameTooltip:SetText(L["Visual View"])
|
|
GameTooltip:Show()
|
|
end
|
|
|
|
function BetterWardrobeVisualToggleMixin:OnLeave()
|
|
GameTooltip:Hide()
|
|
end
|
|
|
|
|
|
local EmptyArmor = addon.Globals.EmptyArmor
|
|
|
|
function Sets:GetEmptySlots()
|
|
local setInfo = {}
|
|
|
|
for i,x in pairs(EmptyArmor) do
|
|
setInfo[i]=x;
|
|
end
|
|
|
|
return setInfo;
|
|
end
|
|
|
|
function Sets:EmptySlots(transmogSources)
|
|
local EmptySet = self:GetEmptySlots()
|
|
|
|
for i, x in pairs(transmogSources) do
|
|
EmptySet[i] = nil;
|
|
end
|
|
|
|
return EmptySet;
|
|
end
|
|
|
|
function Sets.isMogKnown(sourceID)
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID)
|
|
|
|
if not sourceInfo then return false end
|
|
local allSources = C_TransmogCollection.GetAllAppearanceSources(sourceInfo.visualID)
|
|
|
|
local list = {}
|
|
for _, source_ID in ipairs(allSources) do
|
|
|
|
local info = C_TransmogCollection.GetSourceInfo(source_ID)
|
|
local isCollected = select(5,C_TransmogCollection.GetAppearanceSourceInfo(source_ID))
|
|
info.isCollected = isCollected;
|
|
tinsert(list, info)
|
|
end
|
|
|
|
if #list > 1 then
|
|
CollectionWardrobeUtil.SortSources(list, sourceInfo.visualID, sourceID)
|
|
end
|
|
|
|
return (list[1] and list[1].isCollected and list[1].sourceID) or false;
|
|
end
|
|
|
|
function addon.Sets:SelectedVariant(setID)
|
|
--local baseSetID = C_TransmogSets.GetBaseSetID(setID) --or setID;
|
|
local baseSetID = SetsDataProvider:GetBaseSetID(setID) --or setID;
|
|
if not baseSetID then return end
|
|
|
|
local variantSets = SetsDataProvider:GetVariantSets(baseSetID)
|
|
if not variantSets then return end
|
|
|
|
local useDescription = (#variantSets > 0)
|
|
local targetSetID = BetterWardrobeCollectionFrame.SetsCollectionFrame:GetDefaultSetIDForBaseSet(baseSetID)
|
|
local match = false;
|
|
|
|
for i, data in ipairs(variantSets) do
|
|
if addon.CollectionList:IsInList (data.setID, "set") then
|
|
match = data.setID;
|
|
end
|
|
end
|
|
|
|
if useDescription then
|
|
local setInfo = C_TransmogSets.GetSetInfo(targetSetID)
|
|
local matchInfo = match and C_TransmogSets.GetSetInfo(match).description or nil;
|
|
|
|
return targetSetID, setInfo.description, match, matchInfo;
|
|
end
|
|
end
|
|
|
|
|
|
function addon.Sets:GetLocationBasedCount(setInfo)
|
|
local collectedCount = 0;
|
|
local totalCount = 0;
|
|
local items = {}
|
|
local setID = setInfo.setID;
|
|
--local sources = addon.C_TransmogSets.GetSetSources(setID)
|
|
local sources = SetsDataProvider:GetSetSources(setID)
|
|
|
|
for sourceID in pairs(sources) do
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID)
|
|
if sourceInfo then
|
|
--local appearanceSources = sourceInfo and C_TransmogCollection.GetAppearanceSources(sourceInfo.visualID)
|
|
local _, visualID, _, _, _, itemLink = C_TransmogCollection.GetAppearanceSourceInfo(sourceID)
|
|
local appearanceSources = (sourceInfo and itemLink and C_TransmogCollection.GetAppearanceSources(sourceInfo.visualID, addon.GetItemCategory(sourceInfo.visualID), addon.GetTransmogLocation(itemLink)) )
|
|
if appearanceSources then
|
|
if #appearanceSources > 1 then
|
|
CollectionWardrobeUtil.SortSources(appearanceSources, sourceInfo.visualID, sourceID)
|
|
end
|
|
|
|
if addon.includeLocation[sourceInfo.invType] then
|
|
totalCount = totalCount + 1;
|
|
|
|
if appearanceSources[1].isCollected then
|
|
collectedCount = collectedCount + 1;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return collectedCount, totalCount;
|
|
end
|
|
--addon:SecureHook(WardrobeCollectionFrame, "OpenTransmogLink", function() print("test") end)
|
|
|
|
|
|
--TODO: FIX
|
|
--[[
|
|
addon:SecureHook("SetItemRef", function(link, ...)
|
|
if InCombatLockdown() then return end
|
|
|
|
local linkType, id = strsplit(":", link or "")
|
|
|
|
if (linkType == "transmogappearance" or linkType == "transmogset" or linkType == "BW_transmogset" or linkType == "BW_transmogset-extra") then
|
|
|
|
|
|
if not C_AddOns.IsAddOnLoaded("Blizzard_Collections") then
|
|
--C_AddOns.LoadAddOn("Blizzard_Collections")
|
|
end
|
|
|
|
if ( not CollectionsJournal or not CollectionsJournal:IsVisible() ) then
|
|
local _, sourceID = strsplit(":", addedLink);
|
|
--ToggleCollectionsJournal(5)
|
|
--print(addedLink)
|
|
TransmogUtil.OpenCollectionToItem(sourceID);
|
|
--WardrobeCollectionFrame:OpenTransmogLink(sourceID)
|
|
end
|
|
|
|
C_Timer.After(0.1, function() BetterWardrobeCollectionFrame:OpenTransmogLink(link) end)
|
|
|
|
return;
|
|
end
|
|
end)
|
|
]]--
|
|
|
|
function BW_JournalHideSlotMenu_OnClick(parent)
|
|
|
|
local function resetModel()
|
|
local tab = BetterWardrobeCollectionFrame.selectedCollectionTab;
|
|
if tab ==2 then
|
|
local set = BetterWardrobeCollectionFrame.SetsCollectionFrame:GetSelectedSetID()
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:DisplaySet(set)
|
|
else
|
|
local set = BetterWardrobeCollectionFrame.SetsCollectionFrame:GetSelectedSetID()
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:DisplaySet(set)
|
|
end
|
|
end
|
|
|
|
local Profile = addon.Profile
|
|
local armor = addon.Globals.EmptyArmor
|
|
local name = addon.QueueList[3]
|
|
local profile = addon.setdb.profile.autoHideSlot
|
|
|
|
local function GeneratorFunction(owner, rootDescription)
|
|
rootDescription:CreateCheckbox(L["Toggle Hidden View"], function() return addon.setdb.profile.autoHideSlot.toggle end, function () addon.setdb.profile.autoHideSlot.toggle = not addon.setdb.profile.autoHideSlot.toggle; resetModel() end);
|
|
rootDescription:CreateDivider();
|
|
rootDescription:CreateTitle(L["Select Slot to Hide"]);
|
|
for i = 1, 19 do
|
|
if armor[i] then
|
|
rootDescription:CreateCheckbox(_G[addon.Globals.INVENTORY_SLOT_NAMES[i]], function() return profile[i] end, function(data) profile[i] = not profile[i]; resetModel() end);
|
|
end
|
|
end
|
|
end
|
|
|
|
MenuUtil.CreateContextMenu(parent, GeneratorFunction);
|
|
|
|
end
|
|
|
|
BetterWardrobeSetsDetailsItemUseabiltiyMixin = { }
|
|
|
|
function BetterWardrobeSetsDetailsItemUseabiltiyMixin:OnEnter()
|
|
local status = self:GetParent().itemCollectionStatus;
|
|
local text;
|
|
if status == "CollectedCharCantUse" then
|
|
text = L["Class cant use appearance. Useable appearance available."];
|
|
elseif status == "CollectedCharCantGet" or status == "NotCollectedCharCantGet" then
|
|
text = L["Class can't collect or use appearance."];
|
|
elseif status == "NotCollectedUnavailable" then
|
|
|
|
text = L["Item No Longer Obtainable."];
|
|
else
|
|
text = "";
|
|
end
|
|
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT", 0, 0)
|
|
GameTooltip:SetText(text)
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsItemUseabiltiyMixin:OnLeave()
|
|
GameTooltip:Hide()
|
|
end
|
|
|
|
|
|
BW_ApplyOnClickCheckboxMixin = {}
|
|
function BW_ApplyOnClickCheckboxMixin:OnClick()
|
|
addon.Profile.AutoApply = not addon.Profile.AutoApply
|
|
self:SetChecked(addon.Profile.AutoApply)
|
|
end
|
|
|
|
function BW_ApplyOnClickCheckboxMixin:OnLoad()
|
|
self:SetChecked(addon.Profile.AutoApply)
|
|
end
|
|
|
|
BetterWardrobeSetsDetailsAltItemMixin = {}
|
|
|
|
function BetterWardrobeSetsDetailsAltItemMixin:OnMouseDown()
|
|
local sourceID
|
|
if self.index < #self.altid then
|
|
self.index = self.index + 1
|
|
self.useAlt = true
|
|
sourceID = self.altid[self.index]
|
|
elseif self.index >= #self.altid then
|
|
self.index = 0
|
|
self.useAlt = false
|
|
sourceID = self.baseId
|
|
end
|
|
|
|
sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID)
|
|
--print(sourceInfo.name)
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:DisplaySet(self.setID)
|
|
end
|
|
|
|
|
|
local SortOrder;
|
|
local DEFAULT = addon.Globals.DEFAULT;
|
|
local APPEARANCE = addon.Globals.APPEARANCE;
|
|
local ALPHABETIC = addon.Globals.ALPHABETIC;
|
|
local ITEM_SOURCE = addon.Globals.ITEM_SOURCE;
|
|
local EXPANSION = addon.Globals.EXPANSION;
|
|
local COLOR = addon.Globals.COLOR;
|
|
local ILEVEL = 8;
|
|
local ITEMID = 9;
|
|
local ARTIFACT = 7;
|
|
local TAB_ITEMS = addon.Globals.TAB_ITEMS;
|
|
local TAB_SETS = addon.Globals.TAB_SETS;
|
|
local TAB_EXTRASETS = addon.Globals.TAB_EXTRASETS;
|
|
local TAB_SAVED_SETS = addon.Globals.TAB_SAVED_SETS;
|
|
--local TABS_MAX_WIDTH = addon.Globals.TABS_MAX_WIDTH;
|
|
--local dropdownOrder = {DEFAULT, ALPHABETIC, APPEARANCE, COLOR, EXPANSION, ITEM_SOURCE};
|
|
local dropdownOrder = {DEFAULT, ALPHABETIC, APPEARANCE, COLOR, EXPANSION, ITEM_SOURCE};
|
|
|
|
--= {INVTYPE_HEAD, INVTYPE_SHOULDER, INVTYPE_CLOAK, INVTYPE_CHEST, INVTYPE_WAIST, INVTYPE_LEGS, INVTYPE_FEET, INVTYPE_WRIST, INVTYPE_HAND}
|
|
local defaults = {
|
|
sortDropdown = DEFAULT,
|
|
reverse = false,
|
|
}
|
|
|
|
|
|
BetterWardrobeCollectionSortDropdownMixin = {};
|
|
local sortid = 1
|
|
|
|
function BetterWardrobeCollectionSortDropdownMixin:OnLoad()
|
|
if not addon.sortDB then
|
|
addon.sortDB = CopyTable(defaults)
|
|
end
|
|
|
|
self:SetWidth(150);
|
|
self:SetSelectionTranslator(function(selection)
|
|
return COMPACT_UNIT_FRAME_PROFILE_SORTBY.." "..selection.text;
|
|
end);
|
|
end
|
|
|
|
function BetterWardrobeCollectionSortDropdownMixin:OnShow()
|
|
self:Refresh();
|
|
WardrobeFrame:RegisterCallback(BetterWardrobeFrameMixin.Event.OnCollectionTabChanged, self.Refresh, self);
|
|
end
|
|
|
|
function BetterWardrobeCollectionSortDropdownMixin:OnHide()
|
|
WardrobeFrame:UnregisterCallback(BetterWardrobeFrameMixin.Event.OnCollectionTabChanged, self);
|
|
end
|
|
|
|
function BetterWardrobeCollectionSortDropdownMixin:GetSortFilter()
|
|
return addon.sortDB.sortDropdown
|
|
end
|
|
|
|
function BetterWardrobeCollectionSortDropdownMixin:SetSortFilter(id)
|
|
addon.sortDB.sortDropdown = id;
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList();
|
|
|
|
self:Refresh();
|
|
end
|
|
|
|
|
|
function BetterWardrobeCollectionSortDropdownMixin:Refresh()
|
|
self:SetupMenu(function(dropdown, rootDescription)
|
|
rootDescription:SetTag("BW_SORT_MENU");
|
|
|
|
local function IsSortFilterSet(id)
|
|
return self:GetSortFilter() == id
|
|
end
|
|
|
|
local function SetSortFilter(id)
|
|
self:SetSortFilter(id);
|
|
end
|
|
|
|
for index, id in pairs(dropdownOrder) do
|
|
--if id == ITEM_SOURCE and (tabID == 2 or tabID == 3) then
|
|
--elseif (tabID == 4 and index <= 2) or tabID ~= 4 then
|
|
--info.value, info.text = id, L[id]
|
|
--info.checked = (id == selectedValue)
|
|
--BW_UIDropDownMenu_AddButton(info)
|
|
rootDescription:CreateRadio(L[id], IsSortFilterSet, SetSortFilter, id);
|
|
--end
|
|
end
|
|
end);
|
|
end
|
|
|
|
BetterWardrobeCollectionSavedOutfitDropdownMixin = {};
|
|
|
|
function BetterWardrobeCollectionSavedOutfitDropdownMixin:OnLoad()
|
|
self:SetWidth(150);
|
|
self:SetSelectionTranslator(function(selection)
|
|
return selection.text;
|
|
end);
|
|
end
|
|
|
|
function BetterWardrobeCollectionSavedOutfitDropdownMixin:OnShow()
|
|
self:Refresh();
|
|
WardrobeFrame:RegisterCallback(BetterWardrobeFrameMixin.Event.OnCollectionTabChanged, self.Refresh, self);
|
|
end
|
|
|
|
function BetterWardrobeCollectionSavedOutfitDropdownMixin:OnHide()
|
|
WardrobeFrame:UnregisterCallback(BetterWardrobeFrameMixin.Event.OnCollectionTabChanged, self);
|
|
end
|
|
|
|
function BetterWardrobeCollectionSavedOutfitDropdownMixin:Refresh()
|
|
self:SetupMenu(function(dropdown, rootDescription)
|
|
rootDescription:SetTag("BW_SAVED_SETS");
|
|
|
|
local function IsProfileSet(name)
|
|
if not addon.SelecteSavedList then
|
|
local unitName = UnitName("player");
|
|
local realm = GetRealmName();
|
|
return unitName .." - ".. realm == name;
|
|
else
|
|
return addon.SelecteSavedList == name;
|
|
end
|
|
end
|
|
|
|
local function SetProfile(name)
|
|
if ( name ~= addon.setdb:GetCurrentProfile() ) then
|
|
addon.SelecteSavedList = name;
|
|
else
|
|
addon.SelecteSavedList = false;
|
|
end
|
|
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:OnSearchUpdate();
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate();
|
|
end
|
|
|
|
local extent = 20;
|
|
local maxCharacters = 8;
|
|
local maxScrollExtent = extent * maxCharacters;
|
|
rootDescription:SetScrollMode(maxScrollExtent);
|
|
|
|
local temp = {}
|
|
for name, data in pairs(addon.setdb.global.sets) do
|
|
table.insert(temp, name);
|
|
end
|
|
|
|
table.sort(temp, function(a,b) return (a) < (b) end);
|
|
|
|
for _, name in pairs(temp) do
|
|
rootDescription:CreateRadio(name, IsProfileSet, SetProfile, name);
|
|
end
|
|
end)
|
|
end
|
|
|
|
BetterWardrobeTransmogOptionsDropdownMixin = {};
|
|
|
|
function BetterWardrobeTransmogOptionsDropdownMixin:OnLoad()
|
|
self:SetText("Options");
|
|
|
|
self:SetupMenu(function(dropdown, rootDescription)
|
|
rootDescription:SetTag("BW_TRANSMOG_OPTIONS");
|
|
|
|
rootDescription:CreateRadio(L["Show Hidden Items"], function() return addon.Profile.ShowHidden; end,
|
|
function()
|
|
addon.Profile.ShowHidden = not addon.Profile.ShowHidden;
|
|
if BetterWardrobeCollectionFrame.selectedTransmogTab == 1 then
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:RefreshVisualsList();
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate();
|
|
BetterWardrobeCollectionFrame:SetTab(2);
|
|
BetterWardrobeCollectionFrame:SetTab(1);
|
|
|
|
else
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate();
|
|
end
|
|
end,
|
|
1);
|
|
|
|
if BetterWardrobeCollectionFrame.selectedTransmogTab == 2 or BetterWardrobeCollectionFrame.selectedTransmogTab == 3 then
|
|
|
|
rootDescription:CreateRadio(L["Use Hidden Item for Unavilable Items"], function() return addon.Profile.HiddenMog; end,
|
|
function()
|
|
addon.Profile.HiddenMog = not addon.Profile.HiddenMog;
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate();
|
|
end,
|
|
7);
|
|
rootDescription:CreateRadio(L["Show Incomplete Sets"], function() return addon.Profile.ShowIncomplete end,
|
|
function()
|
|
addon.Profile.ShowIncomplete = not addon.Profile.ShowIncomplete;
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate();
|
|
end,
|
|
1);
|
|
|
|
if addon.Profile.ShowIncomplete then
|
|
rootDescription:CreateRadio(L["Hide Missing Set Pieces at Transmog Vendor"], function() return addon.Profile.HideMissing; end,
|
|
function()
|
|
addon.Profile.HideMissing = not addon.Profile.HideMissing;
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate();
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:UpdateSets();
|
|
end,
|
|
4);
|
|
|
|
local submenu = rootDescription:CreateButton("Include:");
|
|
submenu:CreateButton(CHECK_ALL,
|
|
function()
|
|
for index in pairs(locationDropDown) do
|
|
addon.includeLocation[index] = true;
|
|
end
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate();
|
|
end
|
|
);
|
|
|
|
submenu:CreateButton(UNCHECK_ALL,
|
|
function()
|
|
for index in pairs(locationDropDown) do
|
|
addon.includeLocation[index] = false;
|
|
end
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate();
|
|
end
|
|
);
|
|
|
|
for index, id in pairs(locationDropDown) do
|
|
if index ~= 21 then --Skip "robe" type
|
|
submenu:CreateCheckbox(id, function() return addon.includeLocation[index]; end,
|
|
function()
|
|
addon.includeLocation[index] = value;
|
|
if index == 6 then
|
|
addon.includeLocation[21] = value;
|
|
end
|
|
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate();
|
|
end,
|
|
index);
|
|
end
|
|
end
|
|
|
|
submenu = rootDescription:CreateButton("Cutoff:");
|
|
for index = 1, 9 do
|
|
submenu:CreateCheckbox(index, function() return index == addon.Profile.PartialLimit end,
|
|
function()
|
|
addon.Profile.PartialLimit = index
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate()
|
|
end,
|
|
index);
|
|
end
|
|
end
|
|
end
|
|
end);
|
|
end
|
|
|