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.
8657 lines
314 KiB
8657 lines
314 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;
|
|
|
|
addon.useAltSet = false;
|
|
|
|
--local Sets = {};
|
|
--addon.Sets = Sets;
|
|
local inventoryTypes = {
|
|
|
|
};
|
|
|
|
local EXCLUSION_CATEGORY_OFFHAND = 1;
|
|
local EXCLUSION_CATEGORY_MAINHAND = 2;
|
|
local Sets = addon.Sets;
|
|
|
|
|
|
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.ToggleSecondaryAppearanceCheckbox.Label:ClearAllPoints()
|
|
--self.ToggleSecondaryAppearanceCheckbox.Label:SetPoint("RIGHT", WardrobeCollectionFrame.ItemsCollectionFrame.PagingFrame.PageText, "LEFT", 500, 0);
|
|
|
|
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.SpecButton);
|
|
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
|
|
-- overflow cycles from the beginning
|
|
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 or WardrobeCollectionFrame.activeFrame == WardrobeCollectionFrame.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.BW_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
|
|
dropDown:OnOutfitApplied(dropDown.selectedOutfitID)
|
|
end
|
|
end
|
|
|
|
BetterWardrobeOutfitMixin = CreateFromMixins(WardrobeOutfitFrameMixin)
|
|
|
|
function BetterWardrobeOutfitMixin:OnOutfitApplied(outfitID)
|
|
-----self:SaveLastOutfit(outfitID);
|
|
|
|
--revisit 9.1.5;
|
|
addon.OutfitDB.char.lastTransmogOutfitIDSpec = addon.OutfitDB.char.lastTransmogOutfitIDSpec or {}
|
|
|
|
if addon.IsDefaultSet(outfitID) then
|
|
local value = addon:GetBlizzID(outfitID) or ""
|
|
if GetCVarBool("transmogCurrentSpecOnly") then
|
|
local specIndex = GetSpecialization()
|
|
SetCVar("lastTransmogOutfitIDSpec"..specIndex, value)
|
|
addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex] = outfitID;
|
|
else
|
|
for specIndex = 1, GetNumSpecializations() do
|
|
SetCVar("lastTransmogOutfitIDSpec"..specIndex, value)
|
|
addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex] = outfitID;
|
|
end
|
|
end
|
|
else
|
|
local value = outfitID or ""
|
|
if GetCVarBool("transmogCurrentSpecOnly") then
|
|
local specIndex = GetSpecialization()
|
|
addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex] = value;
|
|
else
|
|
for specIndex = 1, GetNumSpecializations() do
|
|
addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex] = value;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
----todo revisit;
|
|
function BetterWardrobeOutfitMixin:LoadOutfit(outfitID)
|
|
if ( not outfitID ) then
|
|
return;
|
|
end
|
|
addon.C_Transmog.LoadOutfit(outfitID)
|
|
end
|
|
|
|
|
|
function BetterWardrobeOutfitMixin:GetItemTransmogInfoList()
|
|
if not WardrobeTransmogFrame then return nil end
|
|
local playerActor = WardrobeTransmogFrame.ModelScene:GetPlayerActor()
|
|
if playerActor then
|
|
return playerActor:GetItemTransmogInfoList()
|
|
end
|
|
return nil;
|
|
end
|
|
|
|
function BetterWardrobeOutfitMixin:OnOutfitSaved(outfitID)
|
|
if C_Transmog.GetApplyCost() then
|
|
self:OnOutfitApplied(outfitID)
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeOutfitMixin: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
|
|
|
|
|
|
--TODO U{PDATE}
|
|
function BetterWardrobeOutfitMixin:GetLastOutfitID()
|
|
local specIndex = GetSpecialization()
|
|
--if not specIndex then return end
|
|
--if addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex] then
|
|
return addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex]
|
|
--else
|
|
--return tonumber(GetCVar("lastTransmogOutfitIDSpec"..specIndex))
|
|
--end
|
|
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
|
|
|
|
local baseTexture = GetInventoryItemTexture("player", self.transmogLocation.slotID)
|
|
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
|
|
|
|
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, -85)
|
|
self.ItemsCollectionFrame.SlotsFrame:Show()
|
|
self.ItemsCollectionFrame.BGCornerTopLeft:Hide()
|
|
self.ItemsCollectionFrame.BGCornerTopRight:Hide()
|
|
self.ItemsCollectionFrame.WeaponDropDown:SetPoint("TOPRIGHT", -6, -22)
|
|
self.ItemsCollectionFrame.NoValidItemsLabel:Hide()
|
|
self.FilterButton:SetText(FILTER)
|
|
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.SlotsFrame:Hide()
|
|
self.ItemsCollectionFrame.BGCornerTopLeft:Show()
|
|
self.ItemsCollectionFrame.BGCornerTopRight:Show()
|
|
self.ItemsCollectionFrame.WeaponDropDown:SetPoint("TOPRIGHT", -32, -25)
|
|
self.FilterButton:SetText(SOURCES)
|
|
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
|
|
|
|
local tempSorting
|
|
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 = 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()
|
|
|
|
BetterWardrobeSetsCollectionVariantSetsButton:SetShown(tabID == TAB_SETS)
|
|
addon.ColorFilterFrame:Hide()
|
|
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)
|
|
self.SearchBox:Show()
|
|
|
|
local enableSearchAndFilter = self.ItemsCollectionFrame.transmogLocation and self.ItemsCollectionFrame.transmogLocation:IsAppearance()
|
|
self.SearchBox:SetEnabled(enableSearchAndFilter)
|
|
self.FilterButton:Show()
|
|
self.FilterButton:SetEnabled(enableSearchAndFilter)
|
|
|
|
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()
|
|
|
|
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", -30, -7)
|
|
BW_SortDropDown:SetPoint("TOPLEFT", BetterWardrobeCollectionFrame.ItemsCollectionFrame.WeaponDropDown, "BOTTOMLEFT", 0, 0)
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:ClearAllPoints()
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:SetPoint("TOPRIGHT",self:GetParent(), "TOPRIGHT", -12,-50)
|
|
end
|
|
|
|
else
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame.WeaponDropDown:SetPoint("TOPRIGHT", -32, -25)
|
|
if ElvUI then
|
|
BW_SortDropDown:SetPoint("TOPLEFT", BetterWardrobeCollectionFrame.ItemsCollectionFrame.WeaponDropDown, "BOTTOMLEFT", -55, yOffset)
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:ClearAllPoints()
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:SetPoint("TOPRIGHT",self:GetParent(), "TOPRIGHT", -13,-55)
|
|
else
|
|
BW_SortDropDown:SetPoint("TOPLEFT", BetterWardrobeCollectionFrame.ItemsCollectionFrame.WeaponDropDown, "BOTTOMLEFT", 0, yOffset)
|
|
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()
|
|
if BW_ColectionListFrame then
|
|
BW_ColectionListFrame:Hide()
|
|
end
|
|
self.ItemsCollectionFrame:Hide()
|
|
self.SearchBox:ClearAllPoints()
|
|
BW_SortDropDown:Show()
|
|
self.SearchBox:Show()
|
|
BW_SortDropDown:ClearAllPoints()
|
|
if ( atTransmogrifier ) then
|
|
self.TransmogOptionsButton:Show()
|
|
self.activeFrame = self.SetsTransmogFrame;
|
|
|
|
if tabID == TAB_SAVED_SETS then
|
|
self.SearchBox:SetPoint("TOPRIGHT", -57, -75)
|
|
else
|
|
self.SearchBox:SetPoint("TOPRIGHT", -97, -35)
|
|
end
|
|
|
|
----self.SearchBox:SetWidth(115)
|
|
self.FilterButton:Hide()
|
|
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)
|
|
BW_SortDropDown:SetPoint("TOPLEFT", BetterWardrobeVisualToggle, "TOPRIGHT", 5, 0)
|
|
self.BW_SetsHideSlotButton:Show()
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:ClearAllPoints()
|
|
BetterWardrobeCollectionFrame.AlteredFormSwapButton:SetPoint("TOPRIGHT",BetterWardrobeCollectionFrame.SetsCollectionFrame.DetailsFrame, "TOPRIGHT", 2, -15)
|
|
|
|
end
|
|
self.SearchBox:SetEnabled(true)
|
|
self.SetsCollectionFrame:SetShown(not atTransmogrifier)
|
|
self.SetsTransmogFrame:SetShown(atTransmogrifier)
|
|
local sortValue
|
|
if tabID == TAB_SAVED_SETS then
|
|
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()
|
|
|
|
--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
|
|
|
|
BW_UIDropDownMenu_SetSelectedValue(BW_SortDropDown, sortValue)
|
|
BW_UIDropDownMenu_SetText(BW_SortDropDown, COMPACT_UNIT_FRAME_PROFILE_SORTBY.." "..L[sortValue])
|
|
end
|
|
--xx-WardrobeResetFiltersButton_UpdateVisibility();
|
|
|
|
WardrobeFrame:TriggerEvent(BetterWardrobeFrameMixin.Event.OnCollectionTabChanged)
|
|
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, 50)
|
|
PanelTemplates_TabResize(BetterWardrobeCollectionFrameTab1, 30)
|
|
self.selectedCollectionTab = TAB_ITEMS;
|
|
self.selectedTransmogTab = TAB_ITEMS;
|
|
|
|
CollectionsJournal:SetPortraitToAsset("Interface\\Icons\\inv_misc_enggizmos_19")
|
|
--self.CloseButton:SetScript("OnClick", function() ToggleCollectionsJournal() end)
|
|
--self.CloseButton:Hide()
|
|
-- TODO: Remove this at the next deprecation reset
|
|
self.searchBox = self.SearchBox;
|
|
|
|
--self.Inset:Hide()
|
|
end
|
|
|
|
local addedLink
|
|
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()
|
|
|
|
elseif (event == "TRANSMOG_COLLECTION_SOURCE_ADDED") then
|
|
addon.ClearSourceDB()
|
|
addon.SetsDataProvider:ClearSets()
|
|
if not addon.Profile.ShowCollectionUpdates then return end
|
|
local sourceID = ...
|
|
if not sourceID then return end
|
|
local categoryID, visualID, canEnchant, icon, isCollected, itemLink, transmogLink, _ = C_TransmogCollection.GetAppearanceSourceInfo(sourceID)
|
|
if not itemLink then return end
|
|
local itemID, _, _, itemEquipLoc = GetItemInfoInstant(itemLink)
|
|
|
|
--print(ExtractHyperlinkString(transmogLink))
|
|
local setIDs = C_TransmogSets.GetSetsContainingSourceID(sourceID)
|
|
local setItem = addon.IsSetItem(itemLink)
|
|
addedLink = itemLink
|
|
|
|
if setIDs and not setItem and addon.Profile.ShowSetCollectionUpdates then
|
|
for i, setID in pairs(setIDs) do
|
|
local setInfo = C_TransmogSets.GetSetInfo(setID)
|
|
print((YELLOW_FONT_COLOR_CODE..L["Added missing appearances of: \124cffff7fff\124H%s:%s\124h[%s]\124h\124r"]):format("BW_transmogset", setID, setInfo.name))
|
|
return;
|
|
end
|
|
end
|
|
|
|
local isInList = addon.CollectionList:IsInList(visualID, "item")
|
|
if addon.Profile.ShowCollectionListCollectionUpdates and isInList then
|
|
print((YELLOW_FONT_COLOR_CODE..L["Added appearance in Collection List"]))
|
|
end
|
|
|
|
if setItem and addon.Profile.ShowExtraSetsCollectionUpdates then
|
|
--local item = tonumber(itemLink:match("item:(%d+)"))
|
|
|
|
newTransmogInfo = newTransmogInfo or {}
|
|
addon.newTransmogInfo = newTransmogInfo
|
|
for setID, setInfo in pairs(setItem) do
|
|
--local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID)
|
|
--local setInfo = C_TransmogSets.GetSetInfo(setID)
|
|
--local setInfo = addon.GetSetInfo(setID)
|
|
if setInfo then
|
|
newTransmogInfo["latestSource"] = setID;
|
|
newTransmogInfo[setID] = newTransmogInfo[setID] or {}
|
|
local inventoryTypes = C_Item.GetItemInventoryTypeByID(itemID)
|
|
|
|
newTransmogInfo[setID][itemID] = inventoryTypes
|
|
|
|
|
|
print((YELLOW_FONT_COLOR_CODE..L["Added missing appearances of: \124cffff7fff\124H%s:%s\124h[%s]\124h\124r"]):format("BW_transmogset-extra", setID, setInfo.name))
|
|
end
|
|
return;
|
|
end
|
|
end
|
|
----SetsDataProvider:ClearSets()
|
|
addon:SendMessage("BW_TRANSMOG_COLLECTION_UPDATED")
|
|
|
|
elseif (event == "TRANSMOG_COLLECTION_SOURCE_REMOVED") then
|
|
addon.ClearSourceDB()
|
|
local sourceID = ...
|
|
local categoryID, visualID, canEnchant, icon, isCollected, itemLink, transmogLink, _ = C_TransmogCollection.GetAppearanceSourceInfo(sourceID)
|
|
local setItem = addon.IsSetItem(itemLink)
|
|
if setItem then
|
|
--local item = tonumber(itemLink:match("item:(%d+)"))
|
|
local itemID, _, _, itemEquipLoc = GetItemInfoInstant(itemLink)
|
|
newTransmogInfo = newTransmogInfo or {}
|
|
addon.newTransmogInfo = newTransmogInfo
|
|
|
|
for setID, setInfo in pairs(setItem) do
|
|
addon.ClearSetNewSourcesForSlot(setID, inventoryTypes[itemEquipLoc])
|
|
SetsDataProvider:ResetBaseSetNewStatus(setID)
|
|
if newTransmogInfo["latestSource"] == setID then
|
|
self:ClearLatestSource()
|
|
end
|
|
end
|
|
end
|
|
----SetsDataProvider:ClearSets()
|
|
addon:SendMessage("BW_TRANSMOG_COLLECTION_UPDATED")
|
|
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
|
|
|
|
local setCollected,setUncollected,setPvE,setPvP;
|
|
local function clearFilters()
|
|
setCollected = C_TransmogSets.GetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_COLLECTED)
|
|
setUncollected = C_TransmogSets.GetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_UNCOLLECTED)
|
|
setPvE = C_TransmogSets.GetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_PVE)
|
|
setPvP = C_TransmogSets.GetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_PVP)
|
|
|
|
C_TransmogSets.SetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_UNCOLLECTED, true)
|
|
C_TransmogSets.SetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_COLLECTED, true)
|
|
C_TransmogSets.SetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_PVE, true)
|
|
C_TransmogSets.SetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_PVP, true)
|
|
RefreshLists()
|
|
|
|
--BetterWardrobeCollectionFrame:SetTab(1)
|
|
--BetterWardrobeCollectionFrame:SetTab(2)
|
|
end
|
|
|
|
local function resetFilters()
|
|
C_TransmogSets.SetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_UNCOLLECTED, setUncollected)
|
|
C_TransmogSets.SetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_COLLECTED, setCollected)
|
|
C_TransmogSets.SetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_PVE, setPvE)
|
|
C_TransmogSets.SetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_PVP, setPvP)
|
|
RefreshLists()
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:OnShow()
|
|
playerClassName,playerClass, classID = UnitClass("player")
|
|
CollectionsJournal:SetPortraitToAsset("Interface\\Icons\\inv_chest_cloth_17")
|
|
local level = CollectionsJournal:GetFrameLevel()
|
|
--BetterWardrobeCollectionFrame.NineSlice:Hide()
|
|
|
|
--BetterWardrobeCollectionFrame:SetFrameLevel(level+10)
|
|
--CollectionsJournal.NineSlice:SetFrameLevel(level-1)
|
|
|
|
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 selectedtab;
|
|
local isAtTransmogNPC = C_Transmog.IsAtTransmogNPC();
|
|
self.InfoButton:SetShown(false);
|
|
if isAtTransmogNPC then
|
|
self:SetTab(self.selectedTransmogTab);
|
|
else
|
|
self:SetTab(self.selectedCollectionTab);
|
|
end
|
|
self:UpdateTabButtons()
|
|
|
|
--if (not GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_MODEL_CLICK) and WardrobeCollectionFrame.fromSuggestedContent) then
|
|
--skip showing info tutorial if we came from suggested content and haven't seen the tracking tutorial
|
|
--elseif (not GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_WARDROBE_TRACKING_INTERFACE)) then
|
|
--HelpTip:Show(WardrobeCollectionFrame.InfoButton, WardrobeCollectionFrame.InfoButton.helpTipInfo);
|
|
--BW_TrackingInterfaceShortcutsFrame.NewAlert:ValidateIsShown();
|
|
--end
|
|
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
|
|
addon.sortDB.sortDropdown = 1;
|
|
BW_UIDropDownMenu_SetSelectedValue(BW_SortDropDown, addon.sortDB.sortDropdown)
|
|
BW_UIDropDownMenu_SetText(BW_SortDropDown, COMPACT_UNIT_FRAME_PROFILE_SORTBY.." "..L[addon.sortDB.sortDropdown])
|
|
addon.selectedArmorType = addon.Globals.CLASS_INFO[playerClass][3]
|
|
addon.useAltSet = false;
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:OnKeyDown(key)
|
|
if InCombatLockdown() then return end
|
|
if self.tooltipCycle and key == WARDROBE_CYCLE_KEY then
|
|
self:SetPropagateKeyboardInput(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
|
|
self:SetPropagateKeyboardInput(false)
|
|
self.activeFrame:HandleKey(key)
|
|
else
|
|
self:SetPropagateKeyboardInput(true)
|
|
end
|
|
else
|
|
self:SetPropagateKeyboardInput(true)
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:OpenTransmogLink(link)
|
|
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)
|
|
local transmogLocation = TransmogUtil.GetTransmogLocation(slot, Enum.TransmogType.Appearance, Enum.TransmogModification.Main)
|
|
self.ItemsCollectionFrame:GoToSourceID(sourceID, transmogLocation)
|
|
end
|
|
|
|
|
|
function BetterWardrobeCollectionFrameMixin:GoToSet(setID)
|
|
self:SetTab(TAB_SETS)
|
|
self.SetsCollectionFrame:SelectSet(setID)
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameMixin:UpdateTabButtons()
|
|
--Force Better Wardrobe frames higher than the default one
|
|
self:SetFrameLevel(WardrobeCollectionFrame:GetFrameLevel()+200);
|
|
|
|
-- 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)
|
|
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);
|
|
|
|
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 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 and self.activeFrame.searchType or 1;
|
|
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, ...)
|
|
--print(event)
|
|
--print(...)
|
|
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()
|
|
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;
|
|
|
|
--Don't call. Causes taint and it will get get called by the default wadrobe api
|
|
--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;
|
|
|
|
BW_UIDropDownMenu_Initialize(self.RightClickDropDown, nil, "MENU")
|
|
self.RightClickDropDown.initialize = BetterWardrobeCollectionFrameRightClickDropDown_Init;
|
|
addon.Init:InitFilterButtons()
|
|
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_UPDATED")
|
|
|
|
self:CheckLatestAppearance()
|
|
end
|
|
|
|
--Leave the help tips to the default game
|
|
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
|
|
|
|
if (not GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_WARDROBE_TRACKING_INTERFACE)) 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("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_SETS_TAB)) then
|
|
return;
|
|
end
|
|
|
|
if (not GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_WARDROBE_TRACKING_INTERFACE)) then
|
|
return;
|
|
end
|
|
|
|
local helpTipInfo = {
|
|
text = TRANSMOG_SETS_TAB_TUTORIAL,
|
|
buttonStyle = HelpTip.ButtonStyle.Close,
|
|
cvarBitfield = "closedInfoFrames",
|
|
bitfieldFlag = LE_FRAME_TUTORIAL_TRANSMOG_SETS_TAB,
|
|
targetPoint = HelpTip.Point.BottomEdgeCenter,
|
|
}
|
|
HelpTip:Show(BetterWardrobeCollectionFrame, helpTipInfo, BetterWardrobeCollectionFrame.SetsTab)
|
|
end
|
|
--]]
|
|
end
|
|
|
|
|
|
function BetterWardrobeItemsCollectionMixin:OnShow()
|
|
self:RegisterEvent("TRANSMOGRIFY_UPDATE")
|
|
self:RegisterEvent("PLAYER_EQUIPMENT_CHANGED")
|
|
self:RegisterEvent("TRANSMOGRIFY_SUCCESS")
|
|
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)
|
|
-- 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;
|
|
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")
|
|
|
|
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 and self.activeCategory ~= Enum.TransmogCollectionType.Paired) or slotChanged ) then
|
|
CloseDropDownMenus()
|
|
self:SetActiveCategory(category)
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:SetTransmogrifierAppearancesShown(hasAnyValidSlots)
|
|
self.NoValidItemsLabel:SetShown(not hasAnyValidSlots)
|
|
C_TransmogCollection.SetCollectedShown(hasAnyValidSlots)
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:UpdateWeaponDropDown()
|
|
local dropdown = self.WeaponDropDown;
|
|
local name, isWeapon;
|
|
if ( self.transmogLocation:IsAppearance() ) then
|
|
name, isWeapon = C_TransmogCollection.GetCategoryInfo(self.activeCategory)
|
|
end
|
|
if ( not isWeapon ) then
|
|
if ( C_Transmog.IsAtTransmogNPC() ) then
|
|
dropdown:Hide()
|
|
else
|
|
dropdown:Show()
|
|
BW_UIDropDownMenu_DisableDropDown(dropdown)
|
|
BW_UIDropDownMenu_SetText(dropdown, "")
|
|
end
|
|
else
|
|
dropdown:Show()
|
|
BW_UIDropDownMenu_SetSelectedValue(dropdown, self.activeCategory)
|
|
BW_UIDropDownMenu_SetText(dropdown, name)
|
|
local validCategories = BetterWardrobeCollectionFrameWeaponDropDown_Init(dropdown)
|
|
if ( validCategories > 1 ) then
|
|
BW_UIDropDownMenu_EnableDropDown(dropdown)
|
|
else
|
|
BW_UIDropDownMenu_DisableDropDown(dropdown)
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeItemsCollectionMixin:SetActiveCategory(category)
|
|
local previousCategory = self.activeCategory;
|
|
self.activeCategory = category;
|
|
if previousCategory == Enum.TransmogCollectionType.Paired then
|
|
--self.activeCategory = previousCategory;
|
|
end
|
|
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;
|
|
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
|
|
|
|
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.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()
|
|
if not BetterWardrobeCollectionFrame.ItemsCollectionFrame:IsShown() then return end
|
|
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() or self.activeCategory == Enum.TransmogCollectionType.Paired;
|
|
--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
|
|
model.zoom = nil;
|
|
|
|
--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 ( 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;
|
|
model:UpdateContentTracking();
|
|
model:UpdateTrackingDisabledOverlay();
|
|
|
|
-- 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
|
|
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 WardrobeCollectionFrame.tutorialVisualID ) then
|
|
WardrobeCollectionFrame.tutorialVisualID = tutorialAnchorFrame.visualInfo.visualID;
|
|
end
|
|
if ( WardrobeCollectionFrame.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() WardrobeCollectionFrame.fromSuggestedContent = nil;
|
|
WardrobeCollectionFrame.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.GetCategoryCollectedCount(self.activeCategory)
|
|
total = C_TransmogCollection.GetCategoryTotal(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
|
|
|
|
|
|
local function GetVisibilityWarning(model, transmogLocation)
|
|
local _, raceFilename = UnitRace("player");
|
|
|
|
if not (raceFilename == "Dracthyr" ) then return nil end
|
|
|
|
if transmogLocation and model then
|
|
local slotID = transmogLocation.slotID;
|
|
if model:IsGeoReady() and not model:IsSlotAllowed(slotID) and not model:IsSlotVisible(slotID) then
|
|
return TRANSMOG_DRACTHYR_APPEARANCE_INVISIBLE;
|
|
end
|
|
end
|
|
return nil;
|
|
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.GetSortedAppearanceSources(self.tooltipVisualID, self.activeCategory, self.transmogLocation)
|
|
local chosenSourceID = self:GetChosenVisualSource(self.tooltipVisualID)
|
|
local warningString = GetVisibilityWarning(self.tooltipModel, self.transmogLocation);
|
|
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)
|
|
CloseDropDownMenus()
|
|
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
|
|
|
|
BW_TransmogToggleSecondaryAppearanceCheckboxMixin = { }
|
|
|
|
function BW_TransmogToggleSecondaryAppearanceCheckboxMixin: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() and not itemsCollectionFrame == Enum.TransmogCollectionType.Paired) then
|
|
local sources = CollectionWardrobeUtil.GetSortedAppearanceSources(self.visualInfo.visualID, itemsCollectionFrame:GetActiveCategory(), itemsCollectionFrame.transmogLocation);
|
|
for i, sourceInfo in ipairs(sources) do
|
|
self:AddTrackable(Enum.ContentTrackingType.Appearance, sourceInfo.sourceID);
|
|
end
|
|
end
|
|
end
|
|
|
|
self:UpdateTrackingCheckmark();
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:UpdateTrackingDisabledOverlay()
|
|
if ( not ContentTrackingUtil.IsContentTrackingEnabled() ) then
|
|
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() or itemsCollectionFrame == Enum.TransmogCollectionType.Paired) then
|
|
return nil;
|
|
else
|
|
local sourceIndex = WardrobeCollectionFrame.tooltipSourceIndex or 1;
|
|
local sources = CollectionWardrobeUtil.GetSortedAppearanceSources(self.visualInfo.visualID, itemsCollectionFrame:GetActiveCategory(), itemsCollectionFrame.transmogLocation);
|
|
local index = CollectionWardrobeUtil.GetValidIndexForNumSources(sourceIndex, #sources);
|
|
return sources[index];
|
|
end
|
|
|
|
return nil;
|
|
end
|
|
|
|
function BetterWardrobeItemsModelMixin:OnMouseDown(button)
|
|
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.GetSortedAppearanceSources(self.visualInfo.visualID, 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 ( 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
|
|
CloseDropDownMenus()
|
|
self:GetParent():SelectVisual(self.visualInfo.visualID)
|
|
elseif ( button == "RightButton" ) then
|
|
if itemsCollectionFrame:GetActiveCategory() == Enum.TransmogCollectionType.Paired then return end
|
|
|
|
local dropDown = self:GetParent().RightClickDropDown;
|
|
if ( dropDown.activeFrame ~= self ) then
|
|
CloseDropDownMenus()
|
|
end
|
|
--if ( not self.visualInfo.isCollected or self.visualInfo.isHideVisual or itemsCollectionFrame.transmogLocation:IsIllusion() ) then
|
|
if ( self.visualInfo.isHideVisual or itemsCollectionFrame.transmogLocation:IsIllusion() ) then
|
|
return;
|
|
end
|
|
dropDown.activeFrame = self;
|
|
BW_ToggleDropDownMenu(1, nil, dropDown, self, -6, -3)
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
|
|
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: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)
|
|
elseif ( button == "RightButton" ) then
|
|
local dropDown = self:GetParent().RightClickDropDown;
|
|
if ( dropDown.activeFrame ~= self ) then
|
|
BW_CloseDropDownMenus()
|
|
end
|
|
dropDown.activeFrame = self;
|
|
BW_ToggleDropDownMenu(1, nil, dropDown, self, -6, -3)
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
|
|
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;
|
|
|
|
elseif BetterWardrobeCollectionFrame:CheckTab(2) then
|
|
|
|
local primaryAppearances = C_TransmogSets.GetSetPrimaryAppearances(self.setID)
|
|
for i, primaryAppearance in pairs(primaryAppearances) do
|
|
numTotalSlots = numTotalSlots + 1;
|
|
local sourceID = primaryAppearance.appearanceID;
|
|
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 = C_TransmogSets.GetSetInfo(self.setID)
|
|
GameTooltip:SetText(setInfo.name, color.r, color.g, color.b)
|
|
if ( setInfo.label ) then
|
|
GameTooltip:AddLine(setInfo.label)
|
|
GameTooltip:Show()
|
|
end
|
|
if not setInfo.isClass then
|
|
GameTooltip:AddLine(setInfo.className)
|
|
GameTooltip:Show()
|
|
end
|
|
end
|
|
|
|
elseif BetterWardrobeCollectionFrame:CheckTab(3) then
|
|
local sources = addon.GetSetsources(self.setID)
|
|
for sourceID in pairs(sources) do
|
|
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.GetSetInfo(self.setID)
|
|
GameTooltip:SetText(setInfo.name, color.r, color.g, color.b)
|
|
if (setInfo.label) then
|
|
GameTooltip:AddLine(setInfo.label)
|
|
GameTooltip:Show()
|
|
end
|
|
if not setInfo.isClass then
|
|
GameTooltip:AddLine(setInfo.className)
|
|
GameTooltip:Show()
|
|
end
|
|
|
|
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
|
|
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
|
|
|
|
local function ToggleHidden(model, isHidden)
|
|
local tabID = addon.GetTab()
|
|
if tabID == 1 then
|
|
local visualID = model.visualInfo.visualID;
|
|
local _, _, _, _, _, itemLink = C_TransmogCollection.GetAppearanceSourceInfo(visualID)
|
|
local source = CollectionWardrobeUtil.GetSortedAppearanceSources(visualID, addon.GetItemCategory(visualID), addon.GetTransmogLocation(itemLink))[1]
|
|
local name, link = GetItemInfo(source.itemID)
|
|
addon.HiddenAppearanceDB.profile.item[visualID] = not isHidden and name;
|
|
--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 = C_TransmogSets.GetBaseSetID(model.setID)
|
|
addon.HiddenAppearanceDB.profile.set[baseSetID] = not isHidden and name or nil;
|
|
|
|
local sourceinfo = C_TransmogSets.GetSetSources(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 = 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.GetSetSources(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 BetterWardrobeCollectionFrameRightClickDropDown_Init(self)
|
|
local appearanceID = self.activeFrame.visualInfo.visualID;
|
|
local info = BW_UIDropDownMenu_CreateInfo()
|
|
-- Set Favorite
|
|
if ( C_TransmogCollection.GetIsAppearanceFavorite(appearanceID) or addon:IsFavoriteItem(appearanceID) ) then
|
|
info.text = BATTLE_PET_UNFAVORITE;
|
|
info.arg1 = appearanceID;
|
|
info.arg2 = 0;
|
|
else
|
|
info.text = BATTLE_PET_FAVORITE;
|
|
info.arg1 = appearanceID;
|
|
info.arg2 = 1;
|
|
end
|
|
info.notCheckable = true;
|
|
info.func = function(_, visualID, value) BetterWardrobeCollectionFrameModelDropDown_SetFavorite(visualID, value); end
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
|
|
BW_UIDropDownMenu_AddSeparator()
|
|
local isHidden = addon.HiddenAppearanceDB.profile.item[self.activeFrame.visualInfo.visualID]
|
|
BW_UIDropDownMenu_AddButton({
|
|
notCheckable = true,
|
|
text = isHidden and SHOW or HIDE,
|
|
func = function() ToggleHidden(self.activeFrame, isHidden) end,
|
|
})
|
|
|
|
local collected = self.activeFrame.visualInfo.isCollected;
|
|
--Collection List Right Click options;
|
|
local collectionList = addon.CollectionList:CurrentList()
|
|
local isInList = match or addon.CollectionList:IsInList(self.activeFrame.visualInfo.visualID, "item")
|
|
|
|
--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.activeFrame.visualInfo.visualID;
|
|
local targetText = match and " - "..matchType or variantTarget and " - "..variantType or ""
|
|
BW_UIDropDownMenu_AddSeparator()
|
|
local isInList = collectionList["item"][targetSet]
|
|
BW_UIDropDownMenu_AddButton({
|
|
notCheckable = true,
|
|
text = isInList and L["Remove from Collection List"]..targetText or L["Add to Collection List"]..targetText,
|
|
func = function()
|
|
addon.CollectionList:UpdateList("item", targetSet, not isInList)
|
|
end,
|
|
})
|
|
|
|
info.text = L["View Sources"]
|
|
info.arg1 = appearanceID;
|
|
info.arg2 = 1;
|
|
|
|
info.notCheckable = true;
|
|
info.func = function(_, visualID, value)
|
|
addon.CollectionList:GenerateSourceListView(visualID)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
|
|
|
|
info.text = L["View Recolors"]
|
|
info.arg1 = appearanceID;
|
|
info.arg2 = 1;
|
|
|
|
info.notCheckable = true;
|
|
info.func = function(_, visualID, value)
|
|
if not IsAddOnLoaded("BetterWardrobe_SourceData") then
|
|
EnableAddOn("BetterWardrobe_SourceData")
|
|
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
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
|
|
-- Cancel
|
|
|
|
info = BW_UIDropDownMenu_CreateInfo()
|
|
info.notCheckable = true;
|
|
info.text = CANCEL;
|
|
BW_UIDropDownMenu_AddSeparator()
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
|
|
local headerInserted = false;
|
|
local sources = CollectionWardrobeUtil.GetSortedAppearanceSources(appearanceID, BetterWardrobeCollectionFrame.ItemsCollectionFrame:GetActiveCategory(), BetterWardrobeCollectionFrame.ItemsCollectionFrame.transmogLocation)
|
|
local chosenSourceID = BetterWardrobeCollectionFrame.ItemsCollectionFrame:GetChosenVisualSource(appearanceID)
|
|
info.func = WardrobeCollectionFrameModelDropDown_SetSource;
|
|
for i = 1, #sources do
|
|
if ( sources[i].isCollected and BetterWardrobeCollectionFrame.ItemsCollectionFrame:IsAppearanceUsableForActiveCategory(sources[i]) ) then
|
|
if ( not headerInserted ) then
|
|
headerInserted = true;
|
|
-- space
|
|
info.text = " "
|
|
info.disabled = true;
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
info.disabled = nil;
|
|
-- header
|
|
info.text = WARDROBE_TRANSMOGRIFY_AS;
|
|
info.isTitle = true;
|
|
info.colorCode = NORMAL_FONT_COLOR_CODE;
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
info.isTitle = nil;
|
|
-- turn off notCheckable
|
|
info.notCheckable = nil;
|
|
end
|
|
local name, nameColor = BetterWardrobeCollectionFrame:GetAppearanceNameTextAndColor(sources[i])
|
|
info.text = name;
|
|
info.colorCode = nameColor:GenerateHexColorMarkup()
|
|
info.disabled = nil;
|
|
info.arg1 = appearanceID;
|
|
info.arg2 = sources[i].sourceID;
|
|
-- choose the 1st valid source if one isn't explicitly chosen
|
|
if ( chosenSourceID == Constants.Transmog.NoTransmogID ) then
|
|
chosenSourceID = sources[i].sourceID;
|
|
end
|
|
info.checked = (chosenSourceID == sources[i].sourceID)
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
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, value, confirmed)
|
|
local set = (value == 1)
|
|
|
|
if ( set and not confirmed ) then
|
|
local allSourcesConditional = true;
|
|
local collected = false;
|
|
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
|
|
else
|
|
--addon:SetFavoriteItem(visualID, set)
|
|
|
|
end
|
|
|
|
--if addon:IsFavoriteItem(visualID) then
|
|
addon:SetFavoriteItem(visualID, set)
|
|
--else
|
|
C_TransmogCollection.SetIsAppearanceFavorite(visualID, set)
|
|
SetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_MODEL_CLICK, true)
|
|
--HelpTip:Hide(BetterWardrobeCollectionFrame.ItemsCollectionFrame, TRANSMOG_MOUSE_CLICK_TUTORIAL)
|
|
--end
|
|
end
|
|
|
|
-- ***** TUTORIAL
|
|
BetterWardrobeCollectionTutorialMixin = { }
|
|
|
|
function BetterWardrobeCollectionTutorialMixin: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 = BW_TrackingInterfaceShortcutsFrame,
|
|
appendFrameYOffset = 15,
|
|
};
|
|
]]
|
|
self:Hide()
|
|
|
|
end
|
|
|
|
function BetterWardrobeCollectionTutorialMixin:OnEnter()
|
|
--HelpTip:Show(self, self.helpTipInfo);
|
|
--BW_TrackingInterfaceShortcutsFrame.NewAlert:ValidateIsShown();
|
|
end
|
|
|
|
function BetterWardrobeCollectionTutorialMixin:OnLeave()
|
|
--HelpTip:Hide(self, WARDROBE_SHORTCUTS_TUTORIAL_1);
|
|
--BW_TrackingInterfaceShortcutsFrame.NewAlert:ClearAlert();
|
|
end
|
|
|
|
|
|
BW_AlertTrackingFeatureMixin = {}--CreateFromMixins(NewFeatureLabelMixin);
|
|
|
|
function BW_AlertTrackingFeatureMixin:ClearAlert()
|
|
--AlertTrackingFeatureMixin.ClearAlert(self);
|
|
--SetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_WARDROBE_TRACKING_INTERFACE, true);
|
|
--CollectionsMicroButton_SetAlertShown(false);
|
|
end
|
|
|
|
function BW_AlertTrackingFeatureMixin:ValidateIsShown()
|
|
--self:SetShown(not GetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_WARDROBE_TRACKING_INTERFACE));
|
|
end
|
|
|
|
-- ***** WEAPON DROPDOWN
|
|
|
|
function BetterWardrobeCollectionFrameWeaponDropDown_OnLoad(self)
|
|
BW_UIDropDownMenu_Initialize(self, BetterWardrobeCollectionFrameWeaponDropDown_Init)
|
|
BW_UIDropDownMenu_SetWidth(self, 140)
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameWeaponDropDown_Init(self)
|
|
local transmogLocation = BetterWardrobeCollectionFrame.ItemsCollectionFrame.transmogLocation;
|
|
if ( not transmogLocation ) then
|
|
return;
|
|
end
|
|
|
|
local selectedValue = BW_UIDropDownMenu_GetSelectedValue(self)
|
|
local info = BW_UIDropDownMenu_CreateInfo()
|
|
info.func = BetterWardrobeCollectionFrameWeaponDropDown_OnClick;
|
|
|
|
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 buttonsAdded = 0;
|
|
|
|
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) ) then
|
|
info.text = name;
|
|
info.arg1 = categoryID;
|
|
info.value = categoryID;
|
|
if ( info.value == selectedValue ) then
|
|
info.checked = 1;
|
|
else
|
|
info.checked = nil;
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
buttonsAdded = buttonsAdded + 1;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return buttonsAdded;
|
|
end
|
|
|
|
function BetterWardrobeCollectionFrameWeaponDropDown_OnClick(self, category)
|
|
if ( category and BetterWardrobeCollectionFrame.ItemsCollectionFrame:GetActiveCategory() ~= category ) then
|
|
CloseDropDownMenus()
|
|
BetterWardrobeCollectionFrame.ItemsCollectionFrame:SetActiveCategory(category)
|
|
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
|
|
WardrobeCollectionFrame: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
|
|
|
|
-- ***** FILTER
|
|
|
|
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}
|
|
|
|
|
|
addon.Filters = {
|
|
["Base"] = {
|
|
["filterCollected"] = {true, true},
|
|
["missingSelection"] = {},
|
|
["filterSelection"] = {},
|
|
["xpacSelection"] = {},
|
|
},
|
|
["Extra"] = {
|
|
["filterCollected"] = {true, true},
|
|
["missingSelection"] = {},
|
|
["filterSelection"] = {},
|
|
["xpacSelection"] = {},
|
|
},
|
|
|
|
}
|
|
local filterCollected = addon.Filters.Extra.filterCollected;
|
|
local missingSelection = addon.Filters.Extra.missingSelection;
|
|
local filterSelection = addon.Filters.Extra.filterSelection;
|
|
local xpacSelection = addon.Filters.Extra.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
|
|
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;
|
|
|
|
function BetterWardrobeFilterDropDown_OnLoad(self)
|
|
BW_UIDropDownMenu_Initialize(self, BetterWardrobeFilterDropDown_Initialize, "MENU")
|
|
end
|
|
|
|
function BetterWardrobeFilterDropDown_Initialize(self, level)
|
|
if ( not BetterWardrobeCollectionFrame.activeFrame ) then
|
|
return;
|
|
end
|
|
|
|
if ( BetterWardrobeCollectionFrame:GetSearchType() == Enum.TransmogSearchType.Items ) then
|
|
BetterWardrobeFilterDropDown_InitializeItems(self, level)
|
|
elseif ( BetterWardrobeCollectionFrame:GetSearchType() == Enum.TransmogSearchType.BaseSets ) then
|
|
BetterWardrobeFilterDropDown_InitializeBaseSets(self, level)
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeFilterDropDown_InitializeItems(self, level)
|
|
local info = BW_UIDropDownMenu_CreateInfo()
|
|
info.keepShownOnClick = true;
|
|
local atTransmogrifier = C_Transmog.IsAtTransmogNPC()
|
|
|
|
if level == 1 and not atTransmogrifier then
|
|
info.text = COLLECTED;
|
|
info.func = function(_, _, _, value)
|
|
C_TransmogCollection.SetCollectedShown(value)
|
|
end
|
|
info.checked = C_TransmogCollection.GetCollectedShown()
|
|
info.isNotRadio = true;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.text = NOT_COLLECTED;
|
|
info.func = function(_, _, _, value)
|
|
C_TransmogCollection.SetUncollectedShown(value)
|
|
end
|
|
info.checked = C_TransmogCollection.GetUncollectedShown()
|
|
info.isNotRadio = true;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.checked = nil;
|
|
info.isNotRadio = nil;
|
|
info.func = nil;
|
|
info.hasArrow = true;
|
|
info.notCheckable = true;
|
|
|
|
info.text = SOURCES;
|
|
info.value = 1;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
else
|
|
if level == 2 or atTransmogrifier then
|
|
local refreshLevel = atTransmogrifier and 1 or 2;
|
|
info.hasArrow = false;
|
|
info.isNotRadio = true;
|
|
info.notCheckable = true;
|
|
|
|
info.text = CHECK_ALL;
|
|
info.func = function()
|
|
C_TransmogCollection.SetAllSourceTypeFilters(true)
|
|
BW_UIDropDownMenu_Refresh(BetterWardrobeFilterDropDown, 1, refreshLevel)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.text = UNCHECK_ALL;
|
|
info.func = function()
|
|
C_TransmogCollection.SetAllSourceTypeFilters(false)
|
|
BW_UIDropDownMenu_Refresh(BetterWardrobeFilterDropDown, 1, refreshLevel)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
info.notCheckable = false;
|
|
|
|
local numSources = C_TransmogCollection.GetNumTransmogSources()
|
|
for i = 1, numSources do
|
|
info.text = _G["TRANSMOG_SOURCE_"..i]
|
|
info.func = function(_, _, _, value)
|
|
C_TransmogCollection.SetSourceTypeFilter(i, value)
|
|
end
|
|
info.checked = function() return C_TransmogCollection.IsSourceTypeFilterChecked(i) end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local locationDrowpDown = addon.Globals.locationDrowpDown;
|
|
|
|
function BetterWardrobeFilterDropDown_InitializeBaseSets(self, level)
|
|
local info = BW_UIDropDownMenu_CreateInfo()
|
|
info.keepShownOnClick = true;
|
|
info.isNotRadio = true;
|
|
local atTransmogrifier = C_Transmog.IsAtTransmogNPC()
|
|
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
local filterCollected = addon.Filters.Base.filterCollected;
|
|
local missingSelection = addon.Filters.Base.missingSelection;
|
|
local filterSelection = addon.Filters.Base.filterSelection;
|
|
local xpacSelection = addon.Filters.Base.xpacSelection;
|
|
|
|
if level == 1 then
|
|
local refreshLevel = 1;
|
|
|
|
info.text = COLLECTED;
|
|
info.func = function(_, _, _, value)
|
|
C_TransmogSets.SetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_COLLECTED, value)
|
|
addon.TRANSMOG_SET_FILTER[LE_TRANSMOG_SET_FILTER_COLLECTED] = value;
|
|
|
|
end
|
|
info.checked = C_TransmogSets.GetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_COLLECTED)
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.text = NOT_COLLECTED;
|
|
info.func = function(_, _, _, value)
|
|
C_TransmogSets.SetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_UNCOLLECTED, value)
|
|
addon.TRANSMOG_SET_FILTER[LE_TRANSMOG_SET_FILTER_UNCOLLECTED] = value;
|
|
|
|
end
|
|
info.checked = C_TransmogSets.GetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_UNCOLLECTED)
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
BW_UIDropDownMenu_AddSeparator()
|
|
|
|
info = BW_UIDropDownMenu_CreateInfo()
|
|
info.keepShownOnClick = true;
|
|
info.isNotRadio = true;
|
|
|
|
info.text = TRANSMOG_SET_PVE;
|
|
info.func = function(_, _, _, value)
|
|
C_TransmogSets.SetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_PVE, value)
|
|
end
|
|
info.checked = C_TransmogSets.GetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_PVE)
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.text = TRANSMOG_SET_PVP;
|
|
info.func = function(_, _, _, value)
|
|
C_TransmogSets.SetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_PVP, value)
|
|
end
|
|
info.checked = C_TransmogSets.GetBaseSetsFilter(LE_TRANSMOG_SET_FILTER_PVP)
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
BW_UIDropDownMenu_AddSeparator()
|
|
info.checked = true;
|
|
info.isNotRadio = true;
|
|
info.func = function(info, arg1, _, value)
|
|
addon.Profile.ShowHidden = not addon.Profile.ShowHidden;
|
|
RefreshLists()
|
|
end
|
|
info.hasArrow = false;
|
|
info.notCheckable = false;
|
|
info.checked = addon.Profile.ShowHidden;
|
|
info.text = L["Show Hidden Items"]
|
|
info.value = 4;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.checked = nil;
|
|
info.isNotRadio = nil;
|
|
info.func = nil;
|
|
info.hasArrow = true;
|
|
info.notCheckable = true;
|
|
|
|
info.text = L["Expansion"]
|
|
info.value = 2;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.text = "Missing:"
|
|
info.value = 3;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
elseif level == 2 and BW_UIDROPDOWNMENU_MENU_VALUE == 2 then
|
|
local refreshLevel = 2;
|
|
info.hasArrow = false;
|
|
info.isNotRadio = true;
|
|
info.notCheckable = true;
|
|
info.text = CHECK_ALL;
|
|
info.func = function()
|
|
for i = 1, #xpacSelection do
|
|
xpacSelection[i] = true;
|
|
end
|
|
RefreshLists()
|
|
BW_UIDropDownMenu_Refresh(self)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
local refreshLevel = 2;
|
|
info.hasArrow = false;
|
|
info.isNotRadio = true;
|
|
info.notCheckable = true;
|
|
|
|
info.text = UNCHECK_ALL;
|
|
info.func = function()
|
|
for i = 1, #xpacSelection do
|
|
xpacSelection[i] = false;
|
|
end
|
|
RefreshLists()
|
|
BW_UIDropDownMenu_Refresh(self)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
BW_UIDropDownMenu_AddSeparator(level)
|
|
|
|
info.notCheckable = false;
|
|
for i = 1, #EXPANSIONS do
|
|
info.text = EXPANSIONS[i]
|
|
info.func = function(_, _, _, value)
|
|
xpacSelection[i] = value;
|
|
RefreshLists()
|
|
end
|
|
info.checked = function() return xpacSelection[i] end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
end
|
|
|
|
elseif level == 2 and BW_UIDROPDOWNMENU_MENU_VALUE == 3 then
|
|
info.hasArrow = false;
|
|
info.isNotRadio = true;
|
|
info.notCheckable = true;
|
|
local refreshLevel = 2;
|
|
|
|
info.text = CHECK_ALL;
|
|
info.func = function()
|
|
for i in pairs(locationDrowpDown) do
|
|
missingSelection[i] = true;
|
|
end
|
|
RefreshLists()
|
|
BW_UIDropDownMenu_Refresh(self)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.text = UNCHECK_ALL;
|
|
info.func = function()
|
|
for i in pairs(locationDrowpDown) do
|
|
missingSelection[i] = false;
|
|
end
|
|
RefreshLists()
|
|
BW_UIDropDownMenu_Refresh(self)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
BW_UIDropDownMenu_AddSeparator(level)
|
|
|
|
for index, id in pairs(locationDrowpDown) do
|
|
if index ~= 21 then --Skip "robe" type;
|
|
info.text = id;
|
|
info.notCheckable = false;
|
|
info.func = function(_, _, _, value)
|
|
missingSelection[index] = value;
|
|
|
|
if index == 6 then
|
|
missingSelection[21] = value;
|
|
end
|
|
|
|
BW_UIDropDownMenu_Refresh(self)
|
|
RefreshLists()
|
|
end
|
|
info.checked = function() return missingSelection[index] end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
end
|
|
end
|
|
--[[elseif level == 2 and UIDROPDOWNMENU_MENU_VALUE == 4 then
|
|
local counter = 1;
|
|
for name in pairs(addon.Globals.ARMOR_MASK) do
|
|
info.keepShownOnClick = false;
|
|
|
|
info.text = name;
|
|
info.func = function(info, arg1, _, value)
|
|
addon.selectedArmorType = arg1;
|
|
addon.extraSetsCache = nil;
|
|
BW_WardrobeCollectionFrame_SetTab(3)
|
|
BW_WardrobeCollectionFrame_SetTab(2)
|
|
RefreshArmor()
|
|
end
|
|
info.arg1 = name;
|
|
info.checked = function() return addon.selectedArmorType == name end
|
|
UIDropDownMenu_AddButton(info, level)
|
|
end]]
|
|
end
|
|
|
|
elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
local filterCollected = addon.Filters.Extra.filterCollected;
|
|
local missingSelection = addon.Filters.Extra.missingSelection;
|
|
local filterSelection = addon.Filters.Extra.filterSelection;
|
|
local xpacSelection = addon.Filters.Extra.xpacSelection;
|
|
if level == 1 then
|
|
local refreshLevel = 1;
|
|
info.text = COLLECTED;
|
|
info.func = function(_, _, _, value)
|
|
filterCollected[1] = value;
|
|
RefreshLists()
|
|
--UIDropDownMenu_Refresh(BetterWardrobeFilterDropDown)
|
|
end
|
|
info.checked = function() return filterCollected[1] end
|
|
info.isNotRadio = true;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.text = NOT_COLLECTED;
|
|
info.func = function(_, _, _, value)
|
|
filterCollected[2] = value;
|
|
RefreshLists()
|
|
--UIDropDownMenu_Refresh(BetterWardrobeFilterDropDown)
|
|
end
|
|
info.checked = function() return filterCollected[2] end
|
|
info.isNotRadio = true;
|
|
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
BW_UIDropDownMenu_AddSeparator()
|
|
|
|
info.checked = true;
|
|
info.isNotRadio = true;
|
|
info.func = function(info, arg1, _, value)
|
|
addon.Profile.ShowHidden = not addon.Profile.ShowHidden;
|
|
RefreshLists()
|
|
end
|
|
info.hasArrow = false;
|
|
info.notCheckable = false;
|
|
info.checked = addon.Profile.ShowHidden;
|
|
info.text = L["Show Hidden Items"]
|
|
info.value = 4;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
|
|
info.text = L["Class Sets Only"]
|
|
info.func = function(_, _, _, value)
|
|
addon.Profile.IgnoreClassRestrictions = not addon.Profile.IgnoreClassRestrictions;
|
|
addon.Init:BuildDB()
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:UpdateProgressBar()
|
|
RefreshLists()
|
|
end
|
|
info.checked = function() return not addon.Profile.IgnoreClassRestrictions end
|
|
info.isNotRadio = true;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.text = L["Hide Unavailable Sets"]
|
|
info.func = function(_, _, _, value)
|
|
addon.Profile.HideUnavalableSets = not addon.Profile.HideUnavalableSets;
|
|
addon.Init:BuildDB()
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:UpdateProgressBar()
|
|
RefreshLists()
|
|
end
|
|
info.checked = function() return not addon.Profile.HideUnavalableSets end
|
|
info.isNotRadio = true;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.checked = nil;
|
|
info.isNotRadio = nil;
|
|
info.func = nil;
|
|
info.hasArrow = true;
|
|
info.notCheckable = true;
|
|
|
|
info.text = SOURCES;
|
|
info.value = 1;
|
|
info.isNotRadio = true;
|
|
--info.arg1 = self:GetName().."Check"
|
|
--info.func = function(dropdownbutton, arg1)
|
|
--_G[arg1]:Hide()
|
|
--end,
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.text = L["Expansion"]
|
|
info.value = 2;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.text = L["Missing:"]
|
|
info.value = 3;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.text = L["Armor Type"]
|
|
info.value = 4;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
elseif level == 2 and BW_UIDROPDOWNMENU_MENU_VALUE == 1 then
|
|
local refreshLevel = 2;
|
|
info.hasArrow = false;
|
|
info.isNotRadio = true;
|
|
info.notCheckable = true;
|
|
--tinsert(filterSelection,true)
|
|
info.text = CHECK_ALL;
|
|
info.func = function()
|
|
for i = 1, #filterSelection do
|
|
filterSelection[i] = true;
|
|
end
|
|
RefreshLists()
|
|
BW_UIDropDownMenu_Refresh(self)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
local refreshLevel = 2;
|
|
info.hasArrow = false;
|
|
info.isNotRadio = true;
|
|
info.notCheckable = true;
|
|
--tinsert(filterSelection,true)
|
|
|
|
info.text = UNCHECK_ALL;
|
|
info.func = function()
|
|
for i = 1, #filterSelection do
|
|
filterSelection[i] = false;
|
|
end
|
|
RefreshLists()
|
|
BW_UIDropDownMenu_Refresh(self)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
BW_UIDropDownMenu_AddSeparator(level)
|
|
|
|
info.notCheckable = false;
|
|
|
|
local numSources = #FILTER_SOURCES --C_TransmogCollection.GetNumTransmogSources()
|
|
for i = 1, numSources do
|
|
--tinsert(filterSelection,true)
|
|
info.text = FILTER_SOURCES[i]
|
|
info.func = function(_, _, _, value)
|
|
filterSelection[i] = value;
|
|
RefreshLists()
|
|
end
|
|
info.checked = function() return filterSelection[i] end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
end
|
|
|
|
elseif level == 2 and BW_UIDROPDOWNMENU_MENU_VALUE == 2 then
|
|
local refreshLevel = 2;
|
|
info.hasArrow = false;
|
|
info.isNotRadio = true;
|
|
info.notCheckable = true;
|
|
info.text = CHECK_ALL;
|
|
info.func = function()
|
|
for i = 1, #xpacSelection do
|
|
xpacSelection[i] = true;
|
|
end
|
|
RefreshLists()
|
|
BW_UIDropDownMenu_Refresh(self)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
local refreshLevel = 2;
|
|
info.hasArrow = false;
|
|
info.isNotRadio = true;
|
|
info.notCheckable = true;
|
|
|
|
info.text = UNCHECK_ALL;
|
|
info.func = function()
|
|
for i = 1, #xpacSelection do
|
|
xpacSelection[i] = false;
|
|
end
|
|
RefreshLists()
|
|
BW_UIDropDownMenu_Refresh(self)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
BW_UIDropDownMenu_AddSeparator(level)
|
|
|
|
info.notCheckable = false;
|
|
for i = 1, #EXPANSIONS do
|
|
info.text = EXPANSIONS[i]
|
|
info.func = function(_, _, _, value)
|
|
xpacSelection[i] = value;
|
|
RefreshLists()
|
|
end
|
|
info.checked = function() return xpacSelection[i] end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
end
|
|
|
|
elseif level == 2 and BW_UIDROPDOWNMENU_MENU_VALUE == 3 then
|
|
info.hasArrow = false;
|
|
info.isNotRadio = true;
|
|
info.notCheckable = true;
|
|
local refreshLevel = 2;
|
|
|
|
info.text = CHECK_ALL;
|
|
info.func = function()
|
|
for i in pairs(locationDrowpDown) do
|
|
missingSelection[i] = true;
|
|
end
|
|
RefreshLists()
|
|
BW_UIDropDownMenu_Refresh(self)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
info.text = UNCHECK_ALL;
|
|
info.func = function()
|
|
for i in pairs(locationDrowpDown) do
|
|
missingSelection[i] = false;
|
|
end
|
|
RefreshLists()
|
|
BW_UIDropDownMenu_Refresh(self)
|
|
end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
BW_UIDropDownMenu_AddSeparator(level)
|
|
|
|
for index, id in pairs(locationDrowpDown) do
|
|
if index ~= 21 then --Skip "robe" type;
|
|
info.text = id;
|
|
info.notCheckable = false;
|
|
info.func = function(_, _, _, value)
|
|
missingSelection[index] = value;
|
|
|
|
if index == 6 then
|
|
missingSelection[21] = value;
|
|
end
|
|
|
|
BW_UIDropDownMenu_Refresh(self)
|
|
RefreshLists()
|
|
end
|
|
info.checked = function() return missingSelection[index] end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
end
|
|
end
|
|
elseif level == 2 and BW_UIDROPDOWNMENU_MENU_VALUE == 4 then
|
|
local counter = 1;
|
|
for name in pairs(addon.Globals.ARMOR_MASK) do
|
|
info.keepShownOnClick = false;
|
|
info.text = L[name]
|
|
info.func = function(info, arg1, _, value)
|
|
addon.selectedArmorType = arg1;
|
|
addon.useAltSet = true;
|
|
RefreshLists()
|
|
end
|
|
info.arg1 = name;
|
|
info.checked = function() return addon.selectedArmorType == name end
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
-- ***** SPEC DROPDOWN
|
|
|
|
function BetterWardrobeTransmogFrameSpecDropDown_OnLoad(self)
|
|
BW_UIDropDownMenu_Initialize(self, BetterWardrobeTransmogFrameSpecDropDown_Initialize, "MENU")
|
|
end
|
|
|
|
function BetterWardrobeTransmogFrameSpecDropDown_Initialize()
|
|
local info = BW_UIDropDownMenu_CreateInfo()
|
|
|
|
info.text = TRANSMOG_APPLY_TO;
|
|
info.isTitle = true;
|
|
info.notCheckable = true;
|
|
BW_UIDropDownMenu_AddButton(info, BW_UIDROPDOWNMENU_MENU_LEVEL)
|
|
|
|
info = BW_UIDropDownMenu_CreateInfo()
|
|
|
|
local currentSpecOnly = GetCVarBool("transmogCurrentSpecOnly")
|
|
|
|
info.text = TRANSMOG_ALL_SPECIALIZATIONS;
|
|
info.func = BetterWardrobeTransmogFrameSpecDropDown_OnClick;
|
|
info.checked = not currentSpecOnly;
|
|
info.value = 0;
|
|
BW_UIDropDownMenu_AddButton(info, BW_UIDROPDOWNMENU_MENU_LEVEL)
|
|
|
|
-- We do not add a current specialization option if none is set.
|
|
local spec = GetSpecialization()
|
|
if spec then
|
|
local _, name = GetSpecializationInfo(spec)
|
|
if name and name ~= "" then
|
|
info.text = TRANSMOG_CURRENT_SPECIALIZATION;
|
|
info.func = BetterWardrobeTransmogFrameSpecDropDown_OnClick;
|
|
info.checked = currentSpecOnly;
|
|
info.value = 1;
|
|
BW_UIDropDownMenu_AddButton(info, BW_UIDROPDOWNMENU_MENU_LEVEL)
|
|
|
|
info.text = format(PARENS_TEMPLATE, name or "")
|
|
info.leftPadding = 16;
|
|
info.notCheckable = true;
|
|
info.notClickable = true;
|
|
BW_UIDropDownMenu_AddButton(info, BW_UIDROPDOWNMENU_MENU_LEVEL)
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeTransmogFrameSpecDropDown_OnClick(self)
|
|
SetCVar("transmogCurrentSpecOnly", self.value == 1)
|
|
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:SortSets(sets, reverseUIOrder, ignorePatchID)
|
|
addon.SortSet(sets, reverseUIOrder, ignorePatchID)
|
|
--[[if true then return end
|
|
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.GetSetSources(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.GetSetSources(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 = addon.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 = {}
|
|
local useBaseSet = not C_Transmog.IsAtTransmogNPC()
|
|
local atTransmogrifier = C_Transmog.IsAtTransmogNPC()
|
|
local searchString = string.lower(WardrobeCollectionFrameSearchBox:GetText())
|
|
local basesets = {}
|
|
|
|
if BetterWardrobeCollectionFrame:CheckTab(2) then
|
|
basesets = self.baseSets;
|
|
if ( not self.baseSets ) then
|
|
self.baseSets = C_TransmogSets.GetBaseSets()
|
|
--if not atTransmogrifier then
|
|
self.baseSets = addon:FilterSets(self.baseSets)
|
|
--else
|
|
|
|
--end
|
|
self:DetermineFavorites()
|
|
self:SortSets(self.baseSets)
|
|
end
|
|
return self.baseSets;
|
|
|
|
elseif BetterWardrobeCollectionFrame:CheckTab(3) then
|
|
basesets = self.baseExtraSets;
|
|
--if not self.baseExtraSets then
|
|
if addon.useAltSet then
|
|
addon.refreshData = true;
|
|
self.baseExtraSets = addon.GetBaseList()
|
|
else
|
|
self.baseExtraSets = addon.GetBaseList()
|
|
end
|
|
|
|
--if not atTransmogrifier then
|
|
self.baseExtraSets = addon:FilterSets(self.baseExtraSets)
|
|
--end
|
|
self:SortSets(self.baseExtraSets)
|
|
--ZSend
|
|
return self.baseExtraSets;
|
|
|
|
elseif 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
|
|
|
|
return {}
|
|
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
|
|
|
|
local buildUseable = false;
|
|
function BetterWardrobeSetsDataProviderMixin:GetUsableSets(incVariants)
|
|
|
|
local atTransmogrifier = C_Transmog.IsAtTransmogNPC()
|
|
local setIDS = {}
|
|
local Profile = addon.Profile;
|
|
if (BetterWardrobeCollectionFrame:CheckTab(2)) then
|
|
if ( not self.usableSets ) then
|
|
if not Profile.ShowIncomplete then
|
|
self.usableSets = C_TransmogSets.GetUsableSets()
|
|
self:SortSets(self.usableSets)
|
|
-- group sets by baseSetID, except for favorited sets since those are to remain bucketed to the front
|
|
for i, set in ipairs(self.usableSets) do
|
|
if ( not set.favorite ) then
|
|
local baseSetID = set.baseSetID or set.setID;
|
|
local numRelatedSets = 0;
|
|
for j = i + 1, #self.usableSets do
|
|
if ( self.usableSets[j].baseSetID == baseSetID or self.usableSets[j].setID == baseSetID ) then
|
|
numRelatedSets = numRelatedSets + 1;
|
|
-- no need to do anything if already contiguous
|
|
if ( j ~= i + numRelatedSets ) then
|
|
local relatedSet = self.usableSets[j]
|
|
tremove(self.usableSets, j)
|
|
tinsert(self.usableSets, i + numRelatedSets, relatedSet)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
elseif Profile.ShowIncomplete or BetterWardrobeVisualToggle.VisualMode then
|
|
self.usableSets = {}
|
|
local availableSets = self:GetBaseSets(BetterWardrobeCollectionFrame:CheckTab(2) )
|
|
for i, set in ipairs(availableSets) do
|
|
--if not setIDS[set.setID or set.baseSetID] then
|
|
local topSourcesCollected, topSourcesTotal = addon.Sets:GetLocationBasedCount(set) --SetsDataProvider:GetSetSourceCounts(set.setID)
|
|
local cutoffLimit = (topSourcesTotal <= Profile.PartialLimit and topSourcesTotal and topSourcesTotal) and topSourcesTotal or Profile.PartialLimit --SetsDataProvider:GetSetSourceCounts(set.setID)
|
|
--Show complete sets even if they are below the cut off
|
|
if topSourcesCollected == topSourcesTotal then
|
|
cutoffLimit = topSourcesTotal
|
|
end
|
|
|
|
if ((not atTransmogrifier and BetterWardrobeVisualToggle.VisualMode) or topSourcesCollected >= cutoffLimit and topSourcesTotal > 0 ) then --and not C_TransmogSets.IsSetUsable(set.setID) then
|
|
--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, set)
|
|
end
|
|
--end
|
|
|
|
if incVariants then
|
|
local variantSets = C_TransmogSets.GetVariantSets(set.setID)
|
|
if variantSets then
|
|
for i, set in ipairs(variantSets) do
|
|
--if not setIDS[set.setID or set.baseSetID] then
|
|
|
|
local topSourcesCollected, topSourcesTotal = addon.Sets:GetLocationBasedCount(set)--SetsDataProvider:GetSetSourceCounts(set.setID)
|
|
--if topSourcesCollected == topSourcesTotal then set.collected = true end
|
|
if ((not atTransmogrifier and BetterWardrobeVisualToggle.VisualMode) or set.collected or (not set.collected and (topSourcesCollected >= Profile.PartialLimit and topSourcesTotal > 0))) then --and not C_TransmogSets.IsSetUsable(set.setID) then
|
|
tinsert(self.usableSets, set)
|
|
end
|
|
--end
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
self.usableSets = addon:SearchSets(self.usableSets)
|
|
self:SortSets(self.usableSets)
|
|
|
|
end
|
|
|
|
return self.usableSets;
|
|
|
|
elseif BetterWardrobeCollectionFrame:CheckTab(3) then
|
|
if ( not self.usableExtraSets ) then
|
|
|
|
--Generates Useable Set;
|
|
local availableSets = self:GetBaseSets(false)
|
|
local countData;
|
|
self.usableExtraSets = {} --BetterWardrobeSetsDataProviderMixin:GetUsableSets()
|
|
for i, set in ipairs(availableSets) do
|
|
local topSourcesCollected, topSourcesTotal;
|
|
topSourcesCollected, topSourcesTotal = self:GetSetSourceCounts(set.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.usableExtraSets, set)
|
|
end
|
|
|
|
--[[if incVariants then
|
|
local variantSets = C_TransmogSets.GetVariantSets(set.setID)
|
|
for i, set in ipairs(variantSets) do
|
|
local topSourcesCollected, topSourcesTotal;
|
|
if Profile.ShowIncomplete then
|
|
topSourcesCollected, topSourcesTotal = addon.Sets:GetLocationBasedCount(set)
|
|
|
|
else
|
|
topSourcesCollected, topSourcesTotal = BetterWardrobeSetsDataProviderMixin:GetSetSourceCounts(set.setID)
|
|
end
|
|
|
|
if topSourcesCollected == topSourcesTotal then set.collected = true end
|
|
--local cutoffLimit = (topSourcesTotal <= Profile.PartialLimit and topSourcesTotal) or Profile.PartialLimit;
|
|
-- 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.usableExtraSets, set)
|
|
--end
|
|
end
|
|
end]]
|
|
|
|
end
|
|
self.usableExtraSets = addon:SearchSets(self.usableExtraSets)
|
|
self:SortSets(self.usableExtraSets)
|
|
end
|
|
|
|
|
|
return self.usableExtraSets;
|
|
elseif BetterWardrobeCollectionFrame:CheckTab(4) then
|
|
if ( not self.usableSavedSets ) then
|
|
self.usableSavedSets = addon.GetSavedList()
|
|
self:SortSets(self.usableSavedSets)
|
|
end
|
|
|
|
return self.usableSavedSets;
|
|
end
|
|
return {}
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetVariantSets(baseSetID)
|
|
if ( not self.variantSets ) then
|
|
self.variantSets = { }
|
|
end
|
|
|
|
local variantSets = self.variantSets[baseSetID]
|
|
if ( not variantSets and baseSetID) then
|
|
variantSets = C_TransmogSets.GetVariantSets(baseSetID) or {}
|
|
self.variantSets[baseSetID] = variantSets;
|
|
if ( #variantSets > 0 ) then
|
|
-- add base to variants and sort
|
|
local baseSet = self:GetBaseSetByID(baseSetID)
|
|
if ( baseSet ) then
|
|
tinsert(variantSets, baseSet)
|
|
end
|
|
local reverseUIOrder = true;
|
|
local ignorePatchID = true;
|
|
addon.SortVariantSet(variantSets, reverseUIOrder, ignorePatchID)
|
|
end
|
|
end
|
|
return variantSets;
|
|
end
|
|
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:GetSetSourceData(setID)
|
|
if ( not self.sourceData ) then
|
|
self.sourceData = { }
|
|
end
|
|
|
|
if ( not self.sourceExtraData ) then
|
|
self.sourceExtraData = { }
|
|
end
|
|
|
|
local setType = addon.GetSetType(setID)
|
|
if (setType == nil or setType == "BlizzardSet") then
|
|
-- sourceData = addon:CheckForExtraItems(setID, sourceData)
|
|
local sourceData = self.sourceData[setID]
|
|
if ( not sourceData ) then
|
|
local primaryAppearances = C_TransmogSets.GetSetPrimaryAppearances(setID)
|
|
primaryAppearances = addon:CheckForExtraItems(setID, primaryAppearances)
|
|
local numCollected = 0;
|
|
local numTotal = 0;
|
|
local sources = {}
|
|
for i, primaryAppearance in ipairs(primaryAppearances) do
|
|
sources[primaryAppearance.appearanceID] = true;
|
|
if primaryAppearance.collected then
|
|
numCollected = numCollected + 1;
|
|
end
|
|
numTotal = numTotal + 1;
|
|
end
|
|
sourceData = { numCollected = numCollected, numTotal = numTotal, sources = sources, primaryAppearances = primaryAppearances }
|
|
self.sourceData[setID] = sourceData;
|
|
end
|
|
|
|
return sourceData
|
|
|
|
else
|
|
local sourceExtraData = self.sourceExtraData[setID]
|
|
if ( not sourceExtraData ) then
|
|
local sources, unavailable = addon.GetSetsources(setID)
|
|
local numCollected = 0;
|
|
local numTotal = 0;
|
|
if sources then
|
|
for sourceID, collected in pairs(sources) do
|
|
if (collected) then
|
|
numCollected = numCollected + 1;
|
|
end
|
|
numTotal = numTotal + 1;
|
|
end
|
|
sourceExtraData = { numCollected = numCollected, numTotal = numTotal, sources = sources, unavailable = unavailable }
|
|
self.sourceExtraData[setID] = sourceExtraData
|
|
end
|
|
end
|
|
return sourceExtraData;
|
|
|
|
end
|
|
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.baseExtraSetsData ) then
|
|
self.baseExtraSetsData = { }
|
|
end
|
|
|
|
local setType = addon.GetSetType(setID)
|
|
if (setType == nil or setType == "BlizzardSet") then
|
|
if ( not self.baseSetsData[setID] ) then
|
|
local baseSetID = C_TransmogSets.GetBaseSetID(setID)
|
|
if ( baseSetID ~= setID ) then
|
|
return;
|
|
end
|
|
local topCollected, topTotal = self:GetSetSourceCounts(setID)
|
|
local variantSets = self:GetVariantSets(setID)
|
|
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]
|
|
|
|
else
|
|
if ( not self.baseExtraSetsData[setID] ) then
|
|
local baseSetID = setID;
|
|
if (baseSetID ~= setID) then
|
|
return;
|
|
end
|
|
local topCollected, topTotal = self:GetSetSourceCounts(setID)
|
|
local setInfo = {topCollected = topCollected, topTotal = topTotal, completed = (topCollected == topTotal) }
|
|
self.baseExtraSetsData[setID] = setInfo;
|
|
end
|
|
return self.baseExtraSetsData[setID]
|
|
end
|
|
return {}
|
|
end
|
|
|
|
local setsByExpansion = {}
|
|
local setsByFilter = {}
|
|
local filterinprogress = false;
|
|
function BetterWardrobeSetsDataProviderMixin:GetSetSourceTopCounts(setID)
|
|
local baseSetData = self:GetBaseSetData(setID)
|
|
if ( baseSetData ) then
|
|
return baseSetData.topCollected, baseSetData.topTotal;
|
|
else
|
|
return self:GetSetSourceCounts(setID)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
----TODO REVISIT;
|
|
function BetterWardrobeSetsDataProviderMixin:IsBaseSetNew(baseSetID)
|
|
local baseSetData = {}
|
|
--if not baseSetData then print(1) return false end
|
|
|
|
if BetterWardrobeCollectionFrame:CheckTab(2) then
|
|
baseSetData = self:GetBaseSetData(baseSetID)
|
|
|
|
if ( not baseSetData.newStatus ) then
|
|
local newStatus = C_TransmogSets.SetHasNewSources(baseSetID)
|
|
if ( not newStatus ) then
|
|
-- check variants
|
|
local variantSets = self:GetVariantSets(baseSetID)
|
|
for i, variantSet in ipairs(variantSets) do
|
|
if ( C_TransmogSets.SetHasNewSources(variantSet.setID) ) then
|
|
newStatus = true;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
baseSetData.newStatus = newStatus;
|
|
end
|
|
else
|
|
----elseif BetterWardrobeCollectionFrame:CheckTab(3) then
|
|
local newStatus = addon.C_TransmogSets.SetHasNewSources(baseSetID)
|
|
baseSetData.newStatus = newStatus;
|
|
end
|
|
|
|
return baseSetData.newStatus;
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:ResetBaseSetNewStatus(baseSetID)
|
|
local baseSetData = self:GetBaseSetData(baseSetID)
|
|
if ( baseSetData ) then
|
|
baseSetData.newStatus = nil;
|
|
end
|
|
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
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
if (setType == nil or setType == "BlizzardSet") then
|
|
--if BetterWardrobeCollectionFrame:CheckTab(2) then
|
|
for i, primaryAppearance in ipairs(sourceData.primaryAppearances) do
|
|
local sourceID = primaryAppearance.appearanceID;
|
|
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 = primaryAppearance.collected, sortOrder = sortOrder, itemID = sourceInfo.itemID, invType = sourceInfo.invType, characterUseable = characterUseable, characterCollectable = characterCollectable })
|
|
end
|
|
end
|
|
|
|
|
|
else
|
|
----elseif BetterWardrobeCollectionFrame:CheckTab(3) then
|
|
for sourceID, collected in pairs(sourceData.sources) do
|
|
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
|
|
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
|
|
|
|
|
|
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 = 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)
|
|
for j = 1, #variantSets do
|
|
if ( variantSets[j].favorite ) then
|
|
baseSet.favoriteSetID = variantSets[j].setID;
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsDataProviderMixin:RefreshFavorites()
|
|
self.baseSets = nil;
|
|
self.baseExtraSets = nil;
|
|
self.baseSavedSets = nil;
|
|
self.variantSets = 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.selectedVariantSets = { }
|
|
end
|
|
|
|
function addon:BW_TRANSMOG_COLLECTION_UPDATED()
|
|
--SetsDataProvider:ClearSets()
|
|
--WardrobeCollectionFrameScrollFrame:Refresh()
|
|
--WardrobeCollectionFrameScrollFrame:UpdateProgressBar()
|
|
--WardrobeCollectionFrameScrollFrame:ClearLatestSource()
|
|
C_Timer.After(0, function() RefreshLists() end)
|
|
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:OnShow()
|
|
self:RegisterEvent("GET_ITEM_INFO_RECEIVED")
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_ITEM_UPDATE")
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_UPDATED")
|
|
addon:RegisterMessage("BW_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
|
|
self:SelectSet(defaultSetID);
|
|
end
|
|
self:Refresh();
|
|
end
|
|
|
|
if BetterWardrobeCollectionFrame:CheckTab(2) then
|
|
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 = C_TransmogSets.GetBaseSetID(setID);
|
|
self:ScrollToSet(baseSetID, ScrollBoxConstants.AlignCenter);
|
|
end
|
|
self:ClearLatestSource();
|
|
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("closedInfoFrames", LE_FRAME_TUTORIAL_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")
|
|
addon:UnregisterMessage("BW_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(addon.C_TransmogSets.GetBaseSetsCounts())
|
|
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()
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
self:DisplaySet(self.selectedSetID)
|
|
elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
self:DisplaySet(self.selectedExtraSetID)
|
|
elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 4 then
|
|
self:DisplaySet(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 = addon.C_TransmogSets.GetSetInfo(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;
|
|
|
|
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 or "")..((not setInfo.isClass and setInfo.className) and " -"..setInfo.className.."-" or ""))--..setID )
|
|
--self.DetailsFrame.LimitedSet:SetShown(setInfo.limitedTimeSet)
|
|
|
|
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
|
|
|
|
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
|
|
-----itemFrame.visualID = sortedSources[i].visualID ---TODO:ISNEEDEd?
|
|
local texture = C_TransmogCollection.GetSourceIcon(sortedSources[i].sourceID)
|
|
|
|
if itemFrame.AltItem.useAlt then
|
|
texture = C_TransmogCollection.GetSourceIcon(itemFrame.sourceID)
|
|
end
|
|
----TODO: FIX Unavailable;
|
|
|
|
--[[if not itemFrame.unavailable then
|
|
itemFrame.unavailable = CreateFrame("Frame", nil, itemFrame, "BackdropTemplate")
|
|
itemFrame.unavailable:SetAllPoints()
|
|
itemFrame.unavailable = itemFrame:CreateTexture(nil, "ARTWORK")
|
|
itemFrame.unavailable:SetAllPoints()
|
|
itemFrame.unavailable:SetColorTexture(1,0,0,.1)
|
|
end]]
|
|
|
|
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 ( addon.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
|
|
|
|
|
|
|
|
----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
|
|
|
|
|
|
|
|
--if BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
-- variant sets
|
|
local showVariantSetsButton = false;
|
|
local baseSetID = C_TransmogSets.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
|
|
showVariantSetsButton = numVisibleSets > 1;
|
|
end
|
|
if showVariantSetsButton then
|
|
self.DetailsFrame.VariantSetsButton:Show()
|
|
self.DetailsFrame.VariantSetsButton:SetText(setInfo.description)
|
|
else
|
|
self.DetailsFrame.VariantSetsButton:Hide()
|
|
end
|
|
--elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
-- self.DetailsFrame.VariantSetsButton:Hide()
|
|
--self.DetailsFrame.VariantSetsButton:SetText(setInfo.description)
|
|
|
|
addon:SendMessage("BW_TRANSMOG_EXTRASETSHOWN")
|
|
--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.VariantSetsButton:Hide()
|
|
|
|
self.DetailsFrame.itemFramesPool:ReleaseAll()
|
|
self.Model:Undress()
|
|
local row1 = 0;
|
|
local row2 = 0;
|
|
local yOffset1 = -94;
|
|
|
|
local setType = addon.GetSetType(setID)
|
|
local sortedSources = {}
|
|
local mainShoulder;
|
|
local offShoulderindex;
|
|
local offShoulder;
|
|
|
|
local 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 == "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)
|
|
itemFrame.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
|
|
|
|
function BetterWardrobeSetsCollectionMixin:OnSearchUpdate()
|
|
if ( self.init ) then
|
|
SetsDataProvider:ClearBaseSets()
|
|
SetsDataProvider:ClearVariantSets()
|
|
SetsDataProvider:ClearUsableSets()
|
|
self:Refresh()
|
|
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()
|
|
|
|
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:OpenVariantSetsDropDown()
|
|
local selectedSetID = self:GetSelectedSetID()
|
|
if ( not selectedSetID ) then
|
|
return;
|
|
end
|
|
local info = BW_UIDropDownMenu_CreateInfo()
|
|
local baseSetID = C_TransmogSets.GetBaseSetID(selectedSetID)
|
|
local variantSets = SetsDataProvider:GetVariantSets(baseSetID)
|
|
for i = 1, #variantSets do
|
|
local variantSet = variantSets[i]
|
|
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
|
|
info.text = format(ITEM_SET_NAME, variantSet.description..colorCode, numSourcesCollected, numSourcesTotal)
|
|
info.checked = (variantSet.setID == selectedSetID)
|
|
info.func = function() self:SelectSet(variantSet.setID); end
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:SelectBaseSetID(baseSetID)
|
|
self:SelectSet(self:GetDefaultSetIDForBaseSet(baseSetID))
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:GetDefaultSetIDForBaseSet(baseSetID)
|
|
if ( SetsDataProvider:IsBaseSetNew(baseSetID) ) then
|
|
if ( C_TransmogSets.SetHasNewSources(baseSetID) ) then
|
|
return baseSetID;
|
|
else
|
|
local variantSets = SetsDataProvider:GetVariantSets(baseSetID)
|
|
for i, variantSet in ipairs(variantSets) do
|
|
if ( C_TransmogSets.SetHasNewSources(variantSet.setID) ) then
|
|
return variantSet.setID;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if ( self.selectedVariantSets[baseSetID] ) then
|
|
return self.selectedVariantSets[baseSetID]
|
|
end
|
|
|
|
local baseSet = SetsDataProvider:GetBaseSetByID(baseSetID)
|
|
if ( 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)
|
|
for i = 1, #variantSets do
|
|
local variantSetID = variantSets[i].setID;
|
|
local numCollected = SetsDataProvider:GetSetSourceCounts(variantSetID)
|
|
if ( numCollected > 0 and numCollected >= highestCount ) then
|
|
highestCount = numCollected;
|
|
highestCountSetID = variantSetID;
|
|
end
|
|
end
|
|
return highestCountSetID or baseSetID;
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:SelectSetFromButton(setID)
|
|
CloseDropDownMenus()
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
self:SelectSet(self:GetDefaultSetIDForBaseSet(setID))
|
|
----elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
else
|
|
self:SelectSet(setID)
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsCollectionMixin:SelectSet(setID)
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
self.selectedSetID = setID;
|
|
local baseSetID = C_TransmogSets.GetBaseSetID(setID)
|
|
local variantSets = SetsDataProvider:GetVariantSets(baseSetID)
|
|
if ( #variantSets > 0 ) then
|
|
self.selectedVariantSets[baseSetID] = setID;
|
|
end
|
|
elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
self.selectedExtraSetID = setID;
|
|
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:RefreshAppearanceTooltip()
|
|
end
|
|
|
|
local needsRefresh = false
|
|
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 transmogLocation = TransmogUtil.CreateTransmogLocation(self.tooltipTransmogSlot, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
|
|
|
local warningString = GetVisibilityWarning(self.Model, transmogLocation);
|
|
self:GetParent():SetAppearanceTooltip(self, sources, self.tooltipPrimarySourceID, warningString)
|
|
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 = GetVisibilityWarning(self.Model, transmogLocation);
|
|
self:GetParent():SetAppearanceTooltip(self, sources, self.tooltipPrimarySourceID, warningString)
|
|
--self:GetParent():SetAppearanceTooltip(self, sources, self.tooltipPrimarySourceID)
|
|
|
|
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()
|
|
elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then
|
|
selectedSetID = self:GetSelectedSetID()
|
|
elseif BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
selectedSetID = C_TransmogSets.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 = C_TransmogSets.GetBaseSetID(setID) or setID
|
|
local function FindSet(elementData)
|
|
return elementData.setID == baseSetID;
|
|
end
|
|
|
|
scrollBox:ScrollToElementDataByPredicate(FindSet, alignment, ScrollBoxConstants.NoScrollInterpolation)
|
|
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
|
|
|
|
do
|
|
local function OpenVariantSetsDropDown(self)
|
|
self:GetParent():GetParent():OpenVariantSetsDropDown()
|
|
end
|
|
function BetterWardrobeSetsCollectionVariantSetsDropDown_OnLoad(self)
|
|
BW_UIDropDownMenu_Initialize(self, OpenVariantSetsDropDown, "MENU")
|
|
end
|
|
end
|
|
|
|
local tabType = {"item", "set", "extraset"}
|
|
|
|
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 = addon.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 BetterWardrobeSetsCollectionScrollFrame_FavoriteDropDownInit(self)
|
|
if ( not self.baseSetID ) then
|
|
return;
|
|
end
|
|
local baseSet = SetsDataProvider:GetBaseSetByID(self.baseSetID)
|
|
local type = tabType[addon.GetTab()]
|
|
|
|
local variantSets = {}-- 0 -----SetsDataProvider:GetVariantSets(self.baseSetID); ---TODO:REvisit
|
|
local useDescription = (#variantSets > 0)
|
|
|
|
local info = BW_UIDropDownMenu_CreateInfo()
|
|
info.notCheckable = true;
|
|
info.disabled = nil;
|
|
|
|
BW_UIDropDownMenu_AddButton({
|
|
notCheckable = true,
|
|
text = TRANSMOG_OUTFIT_POST_IN_CHAT,
|
|
func = function() BetterWardrobeSetsCollectionMixin:LinkSet(self.baseSetID) end,
|
|
})
|
|
|
|
local isFavorite = (type == "set" and C_TransmogSets.GetIsFavorite(self.baseSetID)) or addon.favoritesDB.profile.extraset[self.baseSetID]
|
|
if (isFavorite) then
|
|
----if ( baseSet.favoriteSetID ) then
|
|
if ( useDescription ) then
|
|
local setInfo = C_TransmogSets.GetSetInfo(baseSet.favoriteSetID)
|
|
info.text = format(TRANSMOG_SETS_UNFAVORITE_WITH_DESCRIPTION, setInfo.description)
|
|
else
|
|
info.text = BATTLE_PET_UNFAVORITE;
|
|
end
|
|
|
|
if type == "set" then
|
|
info.func = function()
|
|
C_TransmogSets.SetIsFavorite(baseSet.favoriteSetID, false)
|
|
end
|
|
|
|
elseif type == "extraset" then
|
|
info.func = function()
|
|
addon.favoritesDB.profile.extraset[self.baseSetID] = nil;
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:Refresh()
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:OnSearchUpdate()
|
|
end
|
|
end
|
|
else
|
|
local targetSetID = BetterWardrobeCollectionFrame.SetsCollectionFrame:GetDefaultSetIDForBaseSet(self.baseSetID)
|
|
if ( useDescription ) then
|
|
local setInfo = C_TransmogSets.GetSetInfo(targetSetID)
|
|
info.text = format(TRANSMOG_SETS_FAVORITE_WITH_DESCRIPTION, setInfo.description)
|
|
else
|
|
info.text = BATTLE_PET_FAVORITE;
|
|
end
|
|
|
|
|
|
if type == "set" then
|
|
info.func = function()
|
|
C_TransmogSets.SetIsFavorite(targetSetID, true)
|
|
end
|
|
elseif type == "extraset" then
|
|
info.func = function()
|
|
addon.favoritesDB.profile.extraset[self.baseSetID] = true;
|
|
RefreshLists()
|
|
end
|
|
end
|
|
end
|
|
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
info.disabled = nil;
|
|
|
|
info.text = CANCEL;
|
|
info.func = nil;
|
|
BW_UIDropDownMenu_AddButton(info, level)
|
|
|
|
local tab = addon.GetTab()
|
|
|
|
if tab ~=4 then
|
|
--new;
|
|
local variantTarget, match, matchType;
|
|
local variantType = ""
|
|
if type == "set" or type =="extraset" then
|
|
BW_UIDropDownMenu_AddSeparator()
|
|
BW_UIDropDownMenu_AddButton({
|
|
notCheckable = true,
|
|
text = L["Queue Transmog"],
|
|
func = function()
|
|
|
|
local setInfo = addon.GetSetInfo(self.baseSetID) or C_TransmogSets.GetSetInfo(self.baseSetID)
|
|
local name = setInfo["name"]
|
|
--addon.QueueForTransmog(type, setID, name)
|
|
addon.QueueList = {type, self.baseSetID, name}
|
|
end,
|
|
})
|
|
if type == "set" then
|
|
variantTarget, variantType, match, matchType = addon.Sets:SelectedVariant(self.baseSetID)
|
|
end
|
|
end
|
|
|
|
BW_UIDropDownMenu_AddSeparator()
|
|
local isHidden = addon.HiddenAppearanceDB.profile[type][self.baseSetID]
|
|
|
|
BW_UIDropDownMenu_AddButton({
|
|
notCheckable = true,
|
|
text = isHidden and SHOW or HIDE,
|
|
func = function() self.setID = self.baseSetID; ToggleHidden(self, isHidden) 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;
|
|
local targetText = match and " - "..matchType or variantTarget and " - "..variantType or ""
|
|
BW_UIDropDownMenu_AddSeparator()
|
|
local isInList = collectionList[type][targetSet]
|
|
BW_UIDropDownMenu_AddButton({
|
|
notCheckable = true,
|
|
text = isInList and L["Remove from Collection List"]..targetText or L["Add to Collection List"]..targetText,
|
|
func = function()
|
|
addon.CollectionList:UpdateList(type, targetSet, not isInList)
|
|
end,
|
|
})
|
|
|
|
end
|
|
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 "" end
|
|
|
|
local ratioText = elementData.description..": "
|
|
local have, total = addon.SetsDataProvider:GetSetSourceCounts(elementData.setID)
|
|
ratioText = ratioText..have .. "/" .. total.."\n"
|
|
|
|
for i, setdata in ipairs(variantSets)do
|
|
local have, total = addon.SetsDataProvider:GetSetSourceCounts(setdata.setID)
|
|
ratioText = ratioText..setdata.description..": ".. have .. "/" .. total.."\n"
|
|
end
|
|
|
|
return ratioText
|
|
end
|
|
|
|
BetterWardrobeSetsScrollFrameButtonMixin = {}
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonMixin:Init(elementData)
|
|
local displayData = elementData;
|
|
if not displayData then return end
|
|
-- 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
|
|
local variantSets = C_TransmogSets.GetVariantSets(elementData.setID) or {}
|
|
if elementData.hiddenUntilCollected and not elementData.collected and BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
--local variantSets = C_TransmogSets.GetVariantSets(elementData.setID)
|
|
if variantSets 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 == 0 or IsAddOnLoaded("CanIMogIt") then
|
|
self.Variants:Hide()
|
|
self.Variants.Count:SetText(0)
|
|
else
|
|
self.Variants:Show()
|
|
self.Variants.Count:SetText(#variantSets + 1)
|
|
end
|
|
--self.Name:SetText(displayData.name)
|
|
self.Name:SetText(displayData.name..((displayData.className) and " ("..displayData.className..")" or "") )
|
|
|
|
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
|
|
|
|
local classIcon = ""
|
|
|
|
self.Name:SetTextColor(color.r, color.g, color.b)
|
|
self.Label:SetText(displayData.label)
|
|
self.Icon:SetTexture(SetsDataProvider:GetIconForSet(displayData.setID))
|
|
self.Icon:SetDesaturation((topSourcesCollected == 0) and 1 or 0)
|
|
self.Favorite:SetShown(displayData.favoriteSetID)
|
|
self.New:SetShown(addon.SetHasNewSources(displayData.setID))
|
|
self.setID = displayData.setID;
|
|
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
|
|
|
|
self.Favorite:SetShown(isFavorite or elementData.favoriteSetID)
|
|
self.CollectionListVisual.Hidden.Icon:SetShown(isHidden)
|
|
self.CollectionListVisual.Unavailable:SetShown(CheckSetAvailability2(displayData.setID))
|
|
self.CollectionListVisual.UnavailableItems:SetShown(CheckSetAvailability(displayData.setID))
|
|
self.CollectionListVisual.InvalidTexture:SetShown(BetterWardrobeCollectionFrame.selectedCollectionTab == 3 and not displayData.isClass)
|
|
|
|
self.Store:SetShown(addon.MiscSets.TRADINGPOST_SETS[self.setID] or displayData.filter == 12)
|
|
self.Remix:SetShown(addon.MiscSets.REMIX_SETS[self.setID])
|
|
|
|
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 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.IconCover:SetShown(not setCollected)
|
|
|
|
self:SetSelected(SelectionBehaviorMixin.IsElementDataIntrusiveSelected(elementData))
|
|
end
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonMixin:SetSelected(selected)
|
|
self.SelectedTexture:SetShown(selected)
|
|
end
|
|
|
|
function BetterWardrobeSetsScrollFrameButtonMixin:OnClick(buttonName, down)
|
|
if ( buttonName == "LeftButton" ) then
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
|
|
g_selectionBehavior:Select(self)
|
|
elseif ( buttonName == "RightButton" ) then
|
|
--local dropDown = self:GetParent():GetParent().FavoriteDropDown;
|
|
|
|
local dropDown = self:GetParent():GetParent():GetParent().FavoriteDropDown;
|
|
dropDown.baseSetID = self.setID;
|
|
--ToggleDropDownMenu(1, nil, dropDown, self, 0, 0)
|
|
BW_ToggleDropDownMenu(1, nil, dropDown, self, 0, 0)
|
|
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
|
|
end
|
|
end
|
|
|
|
BetterWardrobeSetsCollectionContainerMixin = { }
|
|
|
|
function BetterWardrobeSetsCollectionContainerMixin:OnLoad()
|
|
local view = CreateScrollBoxListLinearView()
|
|
|
|
view:SetElementInitializer("BetterWardrobeSetsScrollFrameButtonTemplate", function(button, elementData)
|
|
button:Init(elementData)
|
|
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)
|
|
|
|
BW_UIDropDownMenu_Initialize(self.FavoriteDropDown, BetterWardrobeSetsCollectionScrollFrame_FavoriteDropDownInit, "MENU")
|
|
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
|
|
if BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then
|
|
self:SelectElementDataMatchingSetID(C_TransmogSets.GetBaseSetID(selectedSetID))
|
|
else
|
|
self:SelectElementDataMatchingSetID(selectedSetID)
|
|
end
|
|
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:OnEnter()
|
|
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 transmogSlot = C_Transmog.GetSlotForInventoryType(self.invType)
|
|
local setID = BetterWardrobeCollectionFrame.SetsCollectionFrame:GetSelectedSetID()
|
|
if BetterWardrobeCollectionFrame:CheckTab(2) then
|
|
C_TransmogSets.ClearSetNewSourcesForSlot(setID, transmogSlot)
|
|
else
|
|
addon.ClearSetNewSourcesForSlot(setID, transmogSlot)
|
|
end
|
|
local baseSetID = C_TransmogSets.GetBaseSetID(setID)
|
|
if baseSetID then
|
|
SetsDataProvider:ResetBaseSetNewStatus(baseSetID)
|
|
--BetterWardrobeCollectionFrame.SetsCollectionFrame:Refresh()
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame.ListContainer:ReinitializeButtonWithBaseSetID(baseSetID)
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsDetailsItemMixin:OnLeave()
|
|
self:SetScript("OnUpdate", nil)
|
|
ResetCursor()
|
|
BetterWardrobeCollectionFrame:HideAppearanceTooltip()
|
|
end
|
|
|
|
local BW_ItemSubDropDownMenu = CreateFrame("Frame", "BW_ItemSubDropDownMenu", UIParent, "BW_UIDropDownMenuTemplate")
|
|
--local BW_ItemSubDropDownMenu = BW_UIDropDownMenu_Create("BW_ItemSubDropDownMenu", UIParent)
|
|
|
|
BW_ItemSubDropDownMenu:SetFrameLevel(500)
|
|
local clickedItemID = nil;
|
|
local BW_ItemSubDropDownMenu_Table = {
|
|
{
|
|
text = L["View Sources"],
|
|
func = function(self)
|
|
local appearanceID, sourceID = C_TransmogCollection.GetItemInfo(clickedItemID)
|
|
addon.CollectionList:GenerateSourceListView(appearanceID)
|
|
|
|
end,
|
|
notCheckable = 1,
|
|
},
|
|
{
|
|
text = CLOSE,
|
|
func = function() BW_CloseDropDownMenus() end,
|
|
notCheckable = 1,
|
|
},
|
|
}
|
|
local BW_ExtraItemSubDropDownMenu_Table = {
|
|
{
|
|
text = L["Substitute Item"],
|
|
func = function(self)
|
|
BetterWardrobeOutfitFrameMixin:ShowPopup("BETTER_WARDROBE_SUBITEM_POPUP")
|
|
end,
|
|
notCheckable = 1,
|
|
},
|
|
{
|
|
text = L["View Sources"],
|
|
func = function(self)
|
|
local appearanceID, sourceID = C_TransmogCollection.GetItemInfo(clickedItemID)
|
|
addon.CollectionList:GenerateSourceListView(appearanceID)
|
|
|
|
end,
|
|
notCheckable = 1,
|
|
},
|
|
{
|
|
text = CLOSE,
|
|
func = function() BW_CloseDropDownMenus() end,
|
|
notCheckable = 1,
|
|
},
|
|
}
|
|
|
|
StaticPopupDialogs["BETTER_WARDROBE_SUBITEM_INVALID_POPUP"] = {
|
|
text = L["Not a valid itemID"],
|
|
preferredIndex = 3,
|
|
button1 = "OK",
|
|
button2 = CANCEL,
|
|
editBoxWidth = 260,
|
|
EditBoxOnEnterPressed = function(self)
|
|
if (self:GetParent().button1:IsEnabled()) then
|
|
StaticPopup_OnClick(self:GetParent(), 1)
|
|
end
|
|
end,
|
|
OnAccept = function(self)
|
|
--ImportSet(self.editBox:GetText())
|
|
BetterWardrobeOutfitFrameMixin:ShowPopup("BETTER_WARDROBE_SUBITEM_POPUP")
|
|
end,
|
|
EditBoxOnEscapePressed = function()BetterWardrobeOutfitFrameMixin:ShowPopup("BETTER_WARDROBE_SUBITEM_POPUP") end,
|
|
exclusive = true,
|
|
whileDead = true,
|
|
}
|
|
|
|
StaticPopupDialogs["BETTER_WARDROBE_SUBITEM_WRONG_LOCATION_POPUP"] = {
|
|
text = L["Item Locations Don't Match"],
|
|
preferredIndex = 3,
|
|
button1 = "OK",
|
|
button2 = CANCEL,
|
|
editBoxWidth = 260,
|
|
EditBoxOnEnterPressed = function(self)
|
|
if (self:GetParent().button1:IsEnabled()) then
|
|
StaticPopup_OnClick(self:GetParent(), 1)
|
|
end
|
|
end,
|
|
OnAccept = function(self)
|
|
--ImportSet(self.editBox:GetText())
|
|
BetterWardrobeOutfitFrameMixin:ShowPopup("BETTER_WARDROBE_SUBITEM_POPUP")
|
|
end,
|
|
EditBoxOnEscapePressed = function()BetterWardrobeOutfitFrameMixin:ShowPopup("BETTER_WARDROBE_SUBITEM_POPUP") end,
|
|
exclusive = true,
|
|
whileDead = true,
|
|
}
|
|
|
|
StaticPopupDialogs["BETTER_WARDROBE_SUBITEM_POPUP"] = {
|
|
text = L["Item ID"],
|
|
preferredIndex = 3,
|
|
button1 = L["Set Substitution"],
|
|
button2 = CANCEL,
|
|
hasEditBox = true,
|
|
maxLetters = 512,
|
|
editBoxWidth = 260,
|
|
OnShow = function(self)
|
|
if LISTWINDOW then LISTWINDOW:Hide() end
|
|
self.editBox:SetText("")
|
|
end,
|
|
EditBoxOnEnterPressed = function(self)
|
|
if (self:GetParent().button1:IsEnabled()) then
|
|
StaticPopup_OnClick(self:GetParent(), 1)
|
|
end
|
|
end,
|
|
OnAccept = function(self)
|
|
local value = self.editBox:GetText()
|
|
local id = tonumber(value)
|
|
|
|
if id == nil then BetterWardrobeOutfitFrameMixin:ShowPopup("BETTER_WARDROBE_SUBITEM_INVALID_POPUP") return false end
|
|
|
|
local itemEquipLoc1 = GetItemInfoInstant(tonumber(value))
|
|
if not itemEquipLoc1 == nil then BetterWardrobeOutfitFrameMixin:ShowPopup("BETTER_WARDROBE_SUBITEM_INVALID_POPUP") return false end
|
|
|
|
addon.SetItemSubstitute(clickedItemID, value)
|
|
--ImportSet(self.editBox:GetText())
|
|
clickedItemID = nil;
|
|
end,
|
|
EditBoxOnEscapePressed = HideParentPanel,
|
|
exclusive = true,
|
|
whileDead = true,
|
|
}
|
|
|
|
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)
|
|
--local sources = C_TransmogCollection.GetAppearanceSources(sourceInfo.visualID)
|
|
local _, visualID, _, _, _, itemLink = C_TransmogCollection.GetAppearanceSourceInfo(sourceInfo.visualID)
|
|
local sources = (sourceInfo and itemLink and C_TransmogCollection.GetAppearanceSources(sourceInfo.visualID, addon.GetItemCategory(sourceInfo.visualID, sourceInfo.visualID), addon.GetTransmogLocation(itemLink)) ) or {}
|
|
|
|
if ( #sources == 0 ) then
|
|
-- can happen if a slot only has HiddenUntilCollected sources
|
|
sources = sources or {}
|
|
tinsert(sources, sourceInfo)
|
|
end
|
|
----WardrobeCollectionFrame_SortSources(sources, sourceInfo.visualID, self.sourceID)
|
|
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)
|
|
|
|
elseif button == "RightButton" and BetterWardrobeCollectionFrame.selectedCollectionTab == 2 then ---TODO review;
|
|
clickedItemID = self.itemID;
|
|
BW_EasyMenu(BW_ItemSubDropDownMenu_Table, BW_ItemSubDropDownMenu, self, 0, 0, "MENU", 10)
|
|
|
|
elseif button == "RightButton" and BetterWardrobeCollectionFrame.selectedCollectionTab == 3 then ---TODO review;
|
|
clickedItemID = self.itemID;
|
|
BW_EasyMenu(BW_ExtraItemSubDropDownMenu_Table, BW_ItemSubDropDownMenu, self, 0, 0, "MENU", 10)
|
|
end
|
|
end
|
|
|
|
BetterWardrobeSetsTransmogMixin = { }
|
|
|
|
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;
|
|
|
|
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")
|
|
--clearFilters()
|
|
addon.SetsDataProvider:ClearSets()
|
|
|
|
self:RefreshCameras()
|
|
local RESET_SELECTION = true;
|
|
self:Refresh(RESET_SELECTION)
|
|
BetterWardrobeCollectionFrame.progressBar:Show()
|
|
self:UpdateProgressBar()
|
|
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()
|
|
----resetFilters()
|
|
self:GetParent():ClearSearch(Enum.TransmogSearchType.UsableSets)
|
|
self.sourceQualityTable = nil;
|
|
addon.ViewDelay = 3;
|
|
----self:SetTab(1)
|
|
|
|
|
|
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_SUCCESS")
|
|
--Changed the above to Success rather than Update so it only changes back to page 1 when you apply the look;
|
|
self:Refresh(resetSelection)
|
|
end
|
|
end)
|
|
end
|
|
elseif ( event == "TRANSMOG_COLLECTION_UPDATED" or event == "TRANSMOG_SETS_UPDATE_FAVORITE" ) then
|
|
SetsDataProvider:ClearSets()
|
|
self:Refresh()
|
|
self:UpdateProgressBar()
|
|
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()
|
|
----WardrobeCollectionFrame_UpdateProgressBar(addon.C_TransmogSets.GetBaseSetsCounts())
|
|
|
|
self:GetParent():UpdateProgressBar(C_TransmogSets.GetBaseSetsCounts())
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:Refresh(resetSelection)
|
|
|
|
----TODO:REVISIT --disable fixes sets jumping on selection;
|
|
|
|
-- if BetterWardrobeCollectionFrame:CheckTab(2) then
|
|
---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
|
|
--else
|
|
|
|
|
|
--self.appliedSetID = self.APPLIED_SOURCE_INDEX;
|
|
if ( resetSelection ) then
|
|
--self.selectedSetID = self.SELECTED_SOURCE_INDEX;
|
|
self:ResetPage()
|
|
else
|
|
self:UpdateSets()
|
|
end
|
|
--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()
|
|
if BetterWardrobeCollectionFrame:CheckTab(2) then
|
|
local usableSets = SetsDataProvider:GetUsableSets(true)
|
|
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()
|
|
|
|
--if (model.setID ~= set.setID) then
|
|
model:Undress()
|
|
local sourceData = SetsDataProvider:GetSetSourceData(set.setID)
|
|
|
|
for sourceID in pairs(sourceData.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
|
|
|
|
|
|
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
|
|
|
|
local topSourcesCollected, topSourcesTotal;
|
|
topSourcesCollected, topSourcesTotal = SetsDataProvider:GetSetSourceCounts(set.setID)
|
|
|
|
local setInfo = C_TransmogSets.GetSetInfo(set.setID)
|
|
if setInfo then
|
|
model.Favorite.Icon:SetShown(C_TransmogSets.GetIsFavorite(set.setID))
|
|
model.setID = set.setID;
|
|
|
|
local isHidden = addon.HiddenAppearanceDB.profile.set[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 = "\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
|
|
|
|
model.SetInfo.progress:SetText((addon.Profile.ShowSetCount and topSourcesCollected.."/".. topSourcesTotal) or "")
|
|
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())
|
|
|
|
else
|
|
|
|
local usableSets = SetsDataProvider:GetUsableSets()
|
|
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 hasAlternateForm = false
|
|
|
|
set = usableSets[index]
|
|
if ( set ) then
|
|
local setType = addon.GetSetType(set.setID)
|
|
SetModelUnit(model)
|
|
|
|
model:Show()
|
|
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 then
|
|
--if ( model.setID ~= set.setID ) then
|
|
model:Undress()
|
|
local primaryAppearances = {}
|
|
local sourceData = SetsDataProvider:GetSetSourceData(set.setID)
|
|
local tab = BetterWardrobeCollectionFrame.selectedTransmogTab;
|
|
for sourceID in pairs(sourceData.sources) 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
|
|
--print(sourceID)
|
|
model:TryOn(sourceID)
|
|
--else
|
|
end
|
|
|
|
if not hasAlternateForm and addon:CheckAltItem(sourceID) then
|
|
hasAlternateForm = true
|
|
end
|
|
end
|
|
else
|
|
model:Undress()
|
|
|
|
--print("extraset")
|
|
--local setData = addon.GetSetInfo(set.setID)
|
|
local sourceData = SetsDataProvider:GetSetSourceData(set.setID)
|
|
local tab = BetterWardrobeCollectionFrame.selectedTransmogTab;
|
|
for sourceID in pairs(sourceData.sources) do
|
|
--print(sourceID)
|
|
--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
|
|
-- print(sourceID)
|
|
if not hasAlternateForm and addon:CheckAltItem(sourceID) then
|
|
hasAlternateForm = true
|
|
end
|
|
model:TryOn(sourceID)
|
|
--else
|
|
-- end
|
|
end
|
|
end
|
|
|
|
if addon.GetSetType(set.setID) then
|
|
local baseSourceID = C_Transmog.GetSlotVisualInfo(TransmogUtil.GetTransmogLocation("SHOULDERSLOT", Enum.TransmogType.Appearance, Enum.TransmogModification.Secondary))
|
|
if set.mainShoulder and set.offShoulder ~= 0 and set.offShoulder ~= baseSourceID then
|
|
local itemTransmogInfo = ItemUtil.CreateItemTransmogInfo(set.mainShoulder, set.offShoulder, 0)
|
|
local result = model:SetItemTransmogInfo(itemTransmogInfo)
|
|
elseif set.mainShoulder then
|
|
local transmogLocation = TransmogUtil.GetTransmogLocation(3, Enum.TransmogType.Appearance, Enum.TransmogModification.Secondary)
|
|
if C_Transmog.CanHaveSecondaryAppearanceForSlotID(3) then
|
|
local itemTransmogInfo = ItemUtil.CreateItemTransmogInfo(set.mainShoulder, set.offShoulder, 0)
|
|
if transmogLocation:IsSecondary() then
|
|
itemTransmogInfo.secondaryAppearanceID = set.mainShoulder;
|
|
else
|
|
-- if the item on the actor doesn't already have a secondary, copy over one to the other (items previewed via other means do not have secondaries set)
|
|
if itemTransmogInfo.secondaryAppearanceID == Constants.Transmog.NoTransmogID then
|
|
itemTransmogInfo.secondaryAppearanceID = itemTransmogInfo.appearanceID;
|
|
end
|
|
itemTransmogInfo.appearanceID = set.mainShoulder;
|
|
end
|
|
local result = model:SetItemTransmogInfo(itemTransmogInfo)
|
|
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;
|
|
elseif not set.isClass then
|
|
transmogStateAtlas = "transmog-set-border-unusable"
|
|
model.TransmogStateTexture:SetPoint("CENTER",0,-2)
|
|
end
|
|
if ( transmogStateAtlas ) then
|
|
model.TransmogStateTexture:SetAtlas(transmogStateAtlas, true)
|
|
model.TransmogStateTexture:Show()
|
|
else
|
|
model.TransmogStateTexture:Hide()
|
|
end
|
|
|
|
if hasAlternateForm then
|
|
model.AltItemtems:Show()
|
|
else
|
|
model.AltItemtems:Hide()
|
|
end
|
|
|
|
local topSourcesCollected, topSourcesTotal;
|
|
--if addon.Profile.ShowIncomplete then
|
|
--topSourcesCollected, topSourcesTotal = addon.Sets:GetLocationBasedCount(set)
|
|
--else
|
|
topSourcesCollected, topSourcesTotal = SetsDataProvider:GetSetSourceCounts(set.setID)
|
|
--end
|
|
|
|
local setInfo = addon.GetSetInfo(set.setID)
|
|
local isFavorite = addon.favoritesDB.profile.extraset[set.setID]
|
|
local isHidden = addon.HiddenAppearanceDB.profile.extraset[set.setID]
|
|
model.setCollected = topSourcesCollected == topSourcesTotal;
|
|
model.Favorite.Icon:SetShown(isFavorite)
|
|
model.CollectionListVisual.Hidden.Icon:SetShown(isHidden)
|
|
|
|
local isInList = addon.CollectionList:IsInList(set.setID, "extraset")
|
|
model.CollectionListVisual.Collection.Collection_Icon:SetShown(isInList)
|
|
model.CollectionListVisual.Collection.Collected_Icon:SetShown(isInList and model.setCollected)
|
|
--model.CollectionListVisual.Collection.Collected_Icon:SetShown(false)
|
|
model.setID = set.setID;
|
|
local name = setInfo["name"]
|
|
--local description = "\n"..set and set.label or ""
|
|
local description = ""
|
|
|
|
--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%s"):format(name, description, classname or ""))
|
|
else
|
|
model.SetInfo.setName:Hide()
|
|
end
|
|
|
|
if BetterWardrobeCollectionFrame:CheckTab(4) then
|
|
model.SetInfo.progress:Hide()
|
|
else
|
|
model.SetInfo.progress:Show()
|
|
model.SetInfo.progress:SetText(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
|
|
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:OnPageChanged(userAction)
|
|
PlaySound(SOUNDKIT.UI_TRANSMOG_PAGE_TURN)
|
|
CloseDropDownMenus()
|
|
if ( userAction ) then
|
|
self:UpdateSets()
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:LoadSet(setID)
|
|
local waitingOnData = false;
|
|
local transmogSources = { }
|
|
local setType = addon.GetSetType(setID)
|
|
local offShoulder;
|
|
local mainHandEnchant;
|
|
local offHandEnchant;
|
|
local setData;
|
|
--Default Saved sets;
|
|
if setType == "SavedBlizzard" then
|
|
local setSources = addon.C_TransmogSets.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
|
|
if (not setType) or setType == "BlizzardSet" then
|
|
local setID = setID;
|
|
local primaryAppearances = C_TransmogSets.GetSetPrimaryAppearances(setID)
|
|
for i, primaryAppearance in ipairs(primaryAppearances) do
|
|
local sourceID = primaryAppearance.appearanceID;
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(sourceID)
|
|
local slot = sourceInfo and C_Transmog.GetSlotForInventoryType(sourceInfo.invType)
|
|
if slot then
|
|
local slotSources = C_TransmogSets.GetSourcesForSlot(setID, slot)
|
|
if slotSources and #slotSources > 0 then
|
|
|
|
CollectionWardrobeUtil.SortSources(slotSources, sourceInfo.visualID)
|
|
local index = CollectionWardrobeUtil.GetDefaultSourceIndex(slotSources, sourceID)
|
|
|
|
|
|
|
|
|
|
if slot then
|
|
transmogSources[slot] = slotSources[index].sourceID;
|
|
|
|
for i, slotSourceInfo in ipairs(slotSources) do
|
|
if ( not slotSourceInfo.name ) then
|
|
waitingOnData = true;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
else
|
|
|
|
setData = addon.GetSetInfo(setID)
|
|
offShoulder = setData.offShoulder or 0;
|
|
mainHandEnchant = setData.mainHandEnchant or 0;
|
|
offHandEnchant = setData.offHandEnchant or 0;
|
|
|
|
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 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(BetterWardrobeCollectionFrame:CheckTab(2) and addon.Profile.ShowIncomplete)
|
|
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
|
|
|
|
function BetterWardrobeSetsTransmogMixin:OpenRightClickDropDown()
|
|
--Default;
|
|
--[[ local setID = self.RightClickDropDown.activeFrame.setID;
|
|
local info = BW_UIDropDownMenu_CreateInfo()
|
|
if ( C_TransmogSets.GetIsFavorite(setID) ) then
|
|
info.text = BATTLE_PET_UNFAVORITE;
|
|
info.func = function() self:SetFavorite(setID, false); end
|
|
else
|
|
info.text = BATTLE_PET_FAVORITE;
|
|
info.func = function() self:SetFavorite(setID, true); end
|
|
end
|
|
info.notCheckable = true;
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
-- Cancel
|
|
info = BW_UIDropDownMenu_CreateInfo()
|
|
info.notCheckable = true;
|
|
info.text = CANCEL;
|
|
BW_UIDropDownMenu_AddButton(info);]]
|
|
if (not self.RightClickDropDown.activeFrame) then
|
|
return;
|
|
end
|
|
local tab = addon.GetTab()
|
|
local type = tabType[addon.GetTab()]
|
|
local setID = self.RightClickDropDown.activeFrame.setID;
|
|
local info = BW_UIDropDownMenu_CreateInfo()
|
|
|
|
if tab == 2 then
|
|
if ( C_TransmogSets.GetIsFavorite(setID) ) then
|
|
info.text = BATTLE_PET_UNFAVORITE;
|
|
info.func = function() self:SetFavorite(setID, false); end
|
|
else
|
|
info.text = BATTLE_PET_FAVORITE;
|
|
info.func = function() self:SetFavorite(setID, true); end
|
|
end
|
|
info.notCheckable = true;
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
-- Cancel
|
|
info = BW_UIDropDownMenu_CreateInfo()
|
|
info.notCheckable = true;
|
|
info.text = CANCEL;
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
else
|
|
|
|
local isFavorite = addon.favoritesDB.profile.extraset[setID]
|
|
if (isFavorite) then
|
|
info.text = BATTLE_PET_UNFAVORITE;
|
|
info.func = function()
|
|
addon.favoritesDB.profile.extraset[setID] = nil;
|
|
RefreshLists()
|
|
end
|
|
else
|
|
info.text = BATTLE_PET_FAVORITE;
|
|
info.func = function()
|
|
addon.favoritesDB.profile.extraset[setID] = true;
|
|
RefreshLists()
|
|
end
|
|
end
|
|
info.notCheckable = true;
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
-- Cancel
|
|
info = BW_UIDropDownMenu_CreateInfo()
|
|
info.notCheckable = true;
|
|
info.text = CANCEL;
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
end
|
|
|
|
|
|
if tab ~= 4 then
|
|
local variantTarget, match, matchType;
|
|
local variantType = ""
|
|
if type == "set" or type =="extraset" then
|
|
BW_UIDropDownMenu_AddSeparator()
|
|
BW_UIDropDownMenu_AddButton({
|
|
notCheckable = true,
|
|
text = L["Queue Transmog"],
|
|
func = function()
|
|
|
|
local setInfo = addon.GetSetInfo(setID) or C_TransmogSets.GetSetInfo(setID)
|
|
local name = setInfo["name"]
|
|
--addon.QueueForTransmog(type, setID, name)
|
|
addon.QueueList = {type, setID, name}
|
|
end,
|
|
})
|
|
if type == "set" then
|
|
variantTarget, variantType, match, matchType = addon.Sets:SelectedVariant(setID)
|
|
end
|
|
end
|
|
|
|
BW_UIDropDownMenu_AddSeparator()
|
|
local isHidden = addon.HiddenAppearanceDB.profile[type][setID]
|
|
BW_UIDropDownMenu_AddButton({
|
|
notCheckable = true,
|
|
text = isHidden and SHOW or HIDE,
|
|
func = function()self.setID = setID; ToggleHidden(self, isHidden) end,
|
|
})
|
|
|
|
local collected = (self.visualInfo and self.visualInfo.isCollected)
|
|
--Collection List Right Click options;
|
|
local collectionList = addon.CollectionList:CurrentList()
|
|
local isInList = match or addon.CollectionList:IsInList(setID, 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 setID;
|
|
local targetText = match and " - "..matchType or variantTarget and " - "..variantType or ""
|
|
BW_UIDropDownMenu_AddSeparator()
|
|
local isInList = collectionList[type][targetSet]
|
|
BW_UIDropDownMenu_AddButton({
|
|
notCheckable = true,
|
|
text = isInList and L["Remove from Collection List"]..targetText or L["Add to Collection List"]..targetText,
|
|
func = function()
|
|
addon.CollectionList:UpdateList(type, targetSet, not isInList)
|
|
end,
|
|
})
|
|
--end
|
|
end
|
|
end
|
|
|
|
function BetterWardrobeSetsTransmogMixin:SetFavorite(setID, favorite)
|
|
if favorite then
|
|
-- remove any existing favorite in this group
|
|
local isFavorite, isGroupFavorite = C_TransmogSets.GetIsFavorite(setID)
|
|
if isGroupFavorite then
|
|
local baseSetID = C_TransmogSets.GetBaseSetID(setID)
|
|
C_TransmogSets.SetIsFavorite(baseSetID, false)
|
|
local variantSets = C_TransmogSets.GetVariantSets(baseSetID)
|
|
for i, variantSet in ipairs(variantSets) do
|
|
C_TransmogSets.SetIsFavorite(variantSet.setID, false)
|
|
end
|
|
end
|
|
C_TransmogSets.SetIsFavorite(setID, true)
|
|
else
|
|
C_TransmogSets.SetIsFavorite(setID, false)
|
|
end
|
|
RefreshLists()
|
|
end
|
|
|
|
do
|
|
local function OpenRightClickDropDown(self)
|
|
self:GetParent():OpenRightClickDropDown()
|
|
end
|
|
function BetterWardrobeSetsTransmogModelRightClickDropDown_OnLoad(self)
|
|
BW_UIDropDownMenu_Initialize(self, OpenRightClickDropDown, "MENU")
|
|
end
|
|
end
|
|
|
|
|
|
--Visual View TOggle;
|
|
BetterWardrobeVisualToggleMixin = {}
|
|
|
|
function BetterWardrobeVisualToggleMixin:OnClick()
|
|
local baseFrame;
|
|
self.viewAll = false;
|
|
local aCtrlKeyIsDown = IsControlKeyDown()
|
|
|
|
if aCtrlKeyIsDown then
|
|
addon.Profile.ShowHidden = not addon.Profile.ShowHidden;
|
|
------BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate()
|
|
--BW_SetsTransmogFrame:OnSearchUpdate()
|
|
-----BetterWardrobeCollectionFrame.SetsCollectionFrame:OnSearchUpdate()
|
|
-----BW_SetsCollectionFrame:OnSearchUpdate()
|
|
return;
|
|
end
|
|
|
|
local atTransmogrifier = C_Transmog.IsAtTransmogNPC()
|
|
if (atTransmogrifier) then
|
|
local tab = BetterWardrobeCollectionFrame.selectedTransmogTab;
|
|
if tab == 2 or tab == 3 or tab == 4 then
|
|
self.VisualMode = not self.VisualMode;
|
|
------BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate()
|
|
--BW_SetsTransmogFrame:OnSearchUpdate()
|
|
end
|
|
else
|
|
local tab = BetterWardrobeCollectionFrame.selectedCollectionTab;
|
|
if tab == 2 then
|
|
if BetterWardrobeCollectionFrame.SetsCollectionFrame:IsShown() then
|
|
self.VisualMode = true;
|
|
self.viewAll = true;
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:Show()
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:Hide()
|
|
BetterWardrobeCollectionFrame.activeFrame = BetterWardrobeCollectionFrame.SetsTransmogFrame;
|
|
------BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate()
|
|
BetterWardrobeCollectionFrame.FilterButton:Hide()
|
|
else
|
|
self.VisualMode = false;
|
|
self.viewAll = false;
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:Hide()
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:Show()
|
|
BetterWardrobeCollectionFrame.FilterButton:Show()
|
|
BetterWardrobeCollectionFrame.activeFrame = BetterWardrobeCollectionFrame.SetsCollectionFrame;
|
|
end
|
|
|
|
elseif tab == 3 or tab == 4 then
|
|
if BetterWardrobeCollectionFrame.SetsCollectionFrame:IsShown() then
|
|
self.VisualMode = true;
|
|
self.viewAll = true;
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:Show()
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:Hide()
|
|
BetterWardrobeCollectionFrame.activeFrame = BetterWardrobeCollectionFrame.SetsTransmogFrame;
|
|
--------BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate()
|
|
else
|
|
self.VisualMode = false;
|
|
self.viewAll = false;
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:Hide()
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:Show()
|
|
BetterWardrobeCollectionFrame.activeFrame = BetterWardrobeCollectionFrame.SetsCollectionFrame;
|
|
----BetterWardrobeCollectionFrame.activeFrame = BetterWardrobeCollectionFrame.BW_SetsCollectionFrame;
|
|
end
|
|
|
|
if tab == 4 then
|
|
local savedCount = #addon.GetSavedList() or 0
|
|
--WardrobeCollectionFrame_UpdateProgressBar(savedCount, savedCount)
|
|
end
|
|
end
|
|
end
|
|
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;
|
|
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)
|
|
|
|
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
|
|
|
|
|
|
function BW_JournalHideSlotMenu_OnClick(parent)
|
|
local Profile = addon.Profile;
|
|
local armor = addon.Globals.EmptyArmor
|
|
local name = addon.QueueList[3]
|
|
local profile = addon.setdb.profile.autoHideSlot;
|
|
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 contextMenuData = {
|
|
{
|
|
text = L["Toggle Hidden View"],
|
|
func = function (self, arg1, arg2, value)
|
|
addon.setdb.profile.autoHideSlot.toggle = not addon.setdb.profile.autoHideSlot.toggle;
|
|
resetModel()
|
|
end,
|
|
isNotRadio = true,
|
|
notCheckable = false,
|
|
checked = function() return addon.setdb.profile.autoHideSlot.toggle end,
|
|
keepShownOnClick = true,
|
|
},
|
|
{ text = L["Select Slot to Hide"], isTitle = true, notCheckable = true},
|
|
}
|
|
|
|
for i = 1, 19 do
|
|
if armor[i] then
|
|
local menu = {
|
|
text = _G[addon.Globals.INVENTORY_SLOT_NAMES[i]],
|
|
func = function (self, arg1, arg2, value)
|
|
profile[i] = not profile[i]
|
|
resetModel()
|
|
end,
|
|
isNotRadio = true,
|
|
notCheckable = false,
|
|
checked = function() return profile[i] end,
|
|
keepShownOnClick = true,
|
|
}
|
|
tinsert (contextMenuData, menu)
|
|
|
|
end
|
|
end
|
|
BW_UIDropDownMenu_SetAnchor(addon.ContextMenu, 0, 0, "BOTTOMLEFT", parent, "BOTTOMLEFT")
|
|
BW_EasyMenu(contextMenuData, addon.ContextMenu, addon.ContextMenu, 0, 0, "MENU")
|
|
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}
|
|
|
|
local locationDrowpDown = addon.Globals.locationDrowpDown;
|
|
|
|
--= {INVTYPE_HEAD, INVTYPE_SHOULDER, INVTYPE_CLOAK, INVTYPE_CHEST, INVTYPE_WAIST, INVTYPE_LEGS, INVTYPE_FEET, INVTYPE_WRIST, INVTYPE_HAND}
|
|
local defaults = {
|
|
sortDropdown = DEFAULT,
|
|
reverse = false,
|
|
}
|
|
|
|
function addon.Init.SortDropDown_Initialize()
|
|
if not addon.sortDB then
|
|
addon.sortDB = CopyTable(defaults)
|
|
end
|
|
local Wardrobe = BetterWardrobeCollectionFrame.ItemsCollectionFrame;
|
|
db = addon.sortDB;
|
|
|
|
BW_SortDropDown = CreateFrame("Frame", "BW_SortDropDown", BetterWardrobeCollectionFrame, "BW_UIDropDownMenuTemplate")
|
|
|
|
--BW_SortDropDown = BW_UIDropDownMenu_Create("BW_SortDropDown", BW_WardrobeCollectionFrame)
|
|
BW_UIDropDownMenu_SetWidth(BW_SortDropDown, 140)
|
|
BW_UIDropDownMenu_Initialize(BW_SortDropDown, function(self)
|
|
local info = BW_UIDropDownMenu_CreateInfo()
|
|
local selectedValue = BW_UIDropDownMenu_GetSelectedValue(self)
|
|
|
|
info.func = function(self)
|
|
local tabID = addon.GetTab()
|
|
--print(tabID)
|
|
local sortValue
|
|
if tabID ==4 then
|
|
addon.setdb.profile.sorting = self.value
|
|
sortValue = addon.setdb.profile.sorting
|
|
|
|
else
|
|
db.sortDropdown = self.value;
|
|
sortValue = db.sortDropdown
|
|
end
|
|
|
|
--print (self.value)
|
|
--print(sortValue)
|
|
BW_UIDropDownMenu_SetSelectedValue(BW_SortDropDown, sortValue)
|
|
BW_UIDropDownMenu_SetText(BW_SortDropDown, COMPACT_UNIT_FRAME_PROFILE_SORTBY.." "..L[sortValue])
|
|
--db.reverse = IsModifierKeyDown()
|
|
|
|
if tabID == 1 then
|
|
--Wardrobe:OnShow()
|
|
Wardrobe:RefreshVisualsList()
|
|
Wardrobe:UpdateItems()
|
|
Wardrobe:UpdateWeaponDropDown()
|
|
elseif tabID == 2 then
|
|
RefreshLists()
|
|
elseif tabID == 3 then
|
|
RefreshLists()
|
|
elseif tabID == 4 then
|
|
--RefreshLists()
|
|
|
|
|
|
BetterWardrobeCollectionFrame:SetTab(3)
|
|
BetterWardrobeCollectionFrame:SetTab(4)
|
|
|
|
end
|
|
end
|
|
|
|
local tabID = addon.GetTab()
|
|
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)
|
|
end
|
|
end
|
|
|
|
|
|
if tabID == 1 then
|
|
info.value = ILEVEL;
|
|
info.text = L[ILEVEL]
|
|
info.checked = (8 == selectedValue)
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
|
|
info.value = ITEMID;
|
|
info.text = L[ITEMID]
|
|
info.checked = (9 == selectedValue)
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
end
|
|
|
|
if tabID == 1 and( Wardrobe.activeCategory and Wardrobe.activeCategory >= 13) then
|
|
info.value = ARTIFACT;
|
|
info.text = L[ARTIFACT]
|
|
info.checked = (7 == selectedValue)
|
|
BW_UIDropDownMenu_AddButton(info)
|
|
end
|
|
|
|
end)
|
|
local tabID = addon.GetTab()
|
|
local sortValue
|
|
----print(tabID)
|
|
if tabID ==4 then
|
|
sortValue = addon.setdb.profile.sorting
|
|
else
|
|
sortValue = db.sortDropdown
|
|
end
|
|
|
|
BW_UIDropDownMenu_SetSelectedValue(BW_SortDropDown, sortValue)
|
|
-----BW_UIDropDownMenu_SetText(BW_SortDropDown, COMPACT_UNIT_FRAME_PROFILE_SORTBY.." "..L[db.sortDropdown])
|
|
|
|
--[[--Repositions sort dropown if Legion Wardrobe is loaded;
|
|
local LegionWardrobeY = IsAddOnLoaded("LegionWardrobe") and 55 or 5;
|
|
if WardrobeFrame_IsAtTransmogrifier() then
|
|
local _, isWeapon = C_TransmogCollection.GetCategoryInfo(Wardrobe:GetActiveCategory() or -1)
|
|
BW_SortDropDown:SetPoint("TOPLEFT", Wardrobe.WeaponDropDown, "BOTTOMLEFT", 0, isWeapon and 55 or 32)
|
|
else
|
|
BW_SortDropDown:SetPoint("TOPLEFT", Wardrobe.WeaponDropDown, "BOTTOMLEFT", 0, LegionWardrobeY)
|
|
end]]
|
|
end
|
|
|
|
|
|
--addon:SecureHook(WardrobeCollectionFrame, "OpenTransmogLink", function() print("test") end)
|
|
|
|
addon:SecureHook("SetItemRef", function(link, ...)
|
|
if InCombatLockdown() then return end
|
|
|
|
local linkType, id = strsplit(":", link)
|
|
|
|
if (linkType == "transmogappearance" or linkType == "transmogset" or linkType == "BW_transmogset" or linkType == "BW_transmogset-extra") then
|
|
if not IsAddOnLoaded("Blizzard_Collections") then
|
|
--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)
|
|
|
|
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."]
|
|
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
|