-- ///////////////////////////////////////////////////////////////////////////////////////////
--
-- 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 " ) 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 )
local waitingOnData = false ;
local transmogSources = { } ;
local setType = addon.GetSetType ( setID ) ;
local offShoulder ;
local mainHandEnchant ;
local offHandEnchant ;
setData = " "
--Default 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
setData = addon.GetSetInfo ( setID ) ;
offShoulder = setData.offShoulder or 0 ;
mainHandEnchant = setData.mainHandEnchant or 0 ;
offHandEnchant = setData.offHandEnchant or 0 ;
local sources = setData.sources --GetSetSources(setID);
if setData.setType == " Blizzard " then
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
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)
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