You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

8006 lines
291 KiB

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