You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1224 lines
40 KiB
1224 lines
40 KiB
|
1 year ago
|
local addonName, addon = ...
|
||
|
|
addon = LibStub("AceAddon-3.0"):GetAddon(addonName)
|
||
|
|
|
||
|
|
local L = LibStub("AceLocale-3.0"):GetLocale(addonName)
|
||
|
|
|
||
|
|
|
||
|
|
local MAX_DEFAULT_OUTFITS = C_TransmogCollection.GetNumMaxOutfits()
|
||
|
|
|
||
|
|
--Coresponds to wardrobeOutfits
|
||
|
|
|
||
|
|
--Function to update character to reflect DB changes
|
||
|
|
function addon.Init.SavedOutfitDBUpdate(force)
|
||
|
|
--V9.0.1 Moves over saved set data from fixed DB vs a profile
|
||
|
|
local character = addon.setdb:GetCurrentProfile()
|
||
|
|
if addon.setdb.global.updates[character]["9.0.1"] and not force then return end
|
||
|
|
|
||
|
|
local table = addon.setdb.global.outfits[character] or {}
|
||
|
|
for i, data in ipairs(addon.OutfitDB.char.outfits) do
|
||
|
|
tinsert(table, data)
|
||
|
|
end
|
||
|
|
|
||
|
|
addon.setdb.global.updates[character]["9.0.1"] = true
|
||
|
|
|
||
|
|
--clean out the old DB if no other profiles ues it
|
||
|
|
local shared = false
|
||
|
|
local currentProfile = BetterWardrobe_CharacterData.profileKeys[character]
|
||
|
|
for profile_character, profile in pairs(BetterWardrobe_CharacterData.profileKeys) do
|
||
|
|
--compare characters and see if any profiles are shared
|
||
|
|
if character ~= profile_character and currentProfile == profile then
|
||
|
|
--See if profile character has already been upgraded
|
||
|
|
if addon.setdb.global.updates[profile_character]["9.0.1"] then
|
||
|
|
else
|
||
|
|
shared = true
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
--No other characters share this profile so safe to clear
|
||
|
|
if not shared then
|
||
|
|
addon.OutfitDB.char.outfits = {}
|
||
|
|
end
|
||
|
|
end
|
||
|
|
BW_SavedOutfitDBUpdate = addon.Init.SavedOutfitDBUpdate
|
||
|
|
|
||
|
|
|
||
|
|
local function GetTableIndex(index)
|
||
|
|
local numOutfits = #C_TransmogCollection.GetOutfits()
|
||
|
|
return index - numOutfits + 1
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
local function IsDefaultSet(outfitID)
|
||
|
|
return addon.IsDefaultSet(outfitID)
|
||
|
|
--return outfitID < MAX_DEFAULT_OUTFITS -- #C_TransmogCollection.GetOutfits()--MAX_DEFAULT_OUTFITS
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function LookupOutfitIDFromName(name)
|
||
|
|
local outfits = addon.GetOutfits(true)
|
||
|
|
for i, data in ipairs(outfits) do
|
||
|
|
if data.name == name then
|
||
|
|
return data.outfitID
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return nil
|
||
|
|
end
|
||
|
|
|
||
|
|
function LookupIndexFromID(outfitID)
|
||
|
|
local outfits = addon.GetOutfits(true)
|
||
|
|
for i, data in ipairs(outfits) do
|
||
|
|
if data.outfitID == outfitID then
|
||
|
|
return data.index
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return nil
|
||
|
|
end
|
||
|
|
|
||
|
|
local function GetOutfitName(outfitID)
|
||
|
|
local savedSets = addon.GetSavedList()
|
||
|
|
for i, data in ipairs(savedSets) do
|
||
|
|
if data.setID == outfitID then
|
||
|
|
return data.name
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
addon.GetOutfitName = GetOutfitName
|
||
|
|
|
||
|
|
StaticPopupDialogs["BW_NAME_TRANSMOG_OUTFIT"] = {
|
||
|
|
preferredIndex = 3,
|
||
|
|
text = TRANSMOG_OUTFIT_NAME,
|
||
|
|
button1 = SAVE,
|
||
|
|
button2 = CANCEL,
|
||
|
|
OnAccept = function(self)
|
||
|
|
BetterWardrobeOutfitFrame:NameOutfit(self.editBox:GetText(), self.data)
|
||
|
|
end,
|
||
|
|
timeout = 0,
|
||
|
|
whileDead = 1,
|
||
|
|
hideOnEscape = 1,
|
||
|
|
hasEditBox = 1,
|
||
|
|
maxLetters = 31,
|
||
|
|
OnShow = function(self)
|
||
|
|
self.button1:Disable()
|
||
|
|
self.button2:Enable()
|
||
|
|
self.editBox:SetFocus()
|
||
|
|
end,
|
||
|
|
OnHide = function(self)
|
||
|
|
self.editBox:SetText("")
|
||
|
|
end,
|
||
|
|
EditBoxOnEnterPressed = function(self)
|
||
|
|
if (self:GetParent().button1:IsEnabled()) then
|
||
|
|
StaticPopup_OnClick(self:GetParent(), 1)
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
EditBoxOnTextChanged = function (self)
|
||
|
|
local parent = self:GetParent()
|
||
|
|
if (parent.editBox:GetText() ~= "") then
|
||
|
|
parent.button1:Enable()
|
||
|
|
else
|
||
|
|
parent.button1:Disable()
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
EditBoxOnEscapePressed = function(self)
|
||
|
|
self:GetParent():Hide()
|
||
|
|
end
|
||
|
|
}
|
||
|
|
|
||
|
|
StaticPopupDialogs["BW_CONFIRM_DELETE_TRANSMOG_OUTFIT"] = {
|
||
|
|
preferredIndex = 3,
|
||
|
|
text = TRANSMOG_OUTFIT_CONFIRM_DELETE,
|
||
|
|
button1 = YES,
|
||
|
|
button2 = NO,
|
||
|
|
OnAccept = function (self) BetterWardrobeOutfitFrame:DeleteOutfit(self.data) end,
|
||
|
|
OnCancel = function (self) end,
|
||
|
|
hideOnEscape = 1,
|
||
|
|
timeout = 0,
|
||
|
|
whileDead = 1,
|
||
|
|
}
|
||
|
|
|
||
|
|
StaticPopupDialogs["BW_TRANSMOG_OUTFIT_SOME_INVALID_APPEARANCES"] = {
|
||
|
|
preferredIndex = 3,
|
||
|
|
text = TRANSMOG_OUTFIT_SOME_INVALID_APPEARANCES,
|
||
|
|
button1 = OKAY,
|
||
|
|
button2 = CANCEL,
|
||
|
|
OnShow = function(self)
|
||
|
|
if (BetterWardrobeOutfitFrame.name) then
|
||
|
|
self.button1:SetText(SAVE)
|
||
|
|
else
|
||
|
|
self.button1:SetText(CONTINUE)
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
OnAccept = function(self)
|
||
|
|
BetterWardrobeOutfitFrame:ContinueWithSave()
|
||
|
|
end,
|
||
|
|
hideOnEscape = 1,
|
||
|
|
timeout = 0,
|
||
|
|
whileDead = 1,
|
||
|
|
}
|
||
|
|
|
||
|
|
local overwriteID
|
||
|
|
StaticPopupDialogs["BW_CONFIRM_OVERWRITE_TRANSMOG_OUTFIT"] = {
|
||
|
|
preferredIndex = 3,
|
||
|
|
text = TRANSMOG_OUTFIT_CONFIRM_OVERWRITE,
|
||
|
|
button1 = YES,
|
||
|
|
button2 = NO,
|
||
|
|
OnAccept = function (self)
|
||
|
|
local name = self.data
|
||
|
|
BetterWardrobeOutfitFrame:DeleteOutfit(overwriteID)
|
||
|
|
overwriteID = nil
|
||
|
|
BetterWardrobeOutfitFrame:NewOutfit(self.data)
|
||
|
|
--BetterWardrobeOutfitFrame:SaveOutfit(self.data)
|
||
|
|
--if DressUpFrame:IsShown() then --todo fix
|
||
|
|
--BW_DressingRoomOutfitFrameMixin:SaveOutfit(self.data)
|
||
|
|
--else
|
||
|
|
--BetterWardrobeOutfitFrame:NewOutfit(self.data)
|
||
|
|
--end
|
||
|
|
end,
|
||
|
|
OnCancel = function (self)
|
||
|
|
local name = self.data
|
||
|
|
self:Hide()
|
||
|
|
local dialog = StaticPopup_Show("BW_NAME_TRANSMOG_OUTFIT")
|
||
|
|
if (dialog) then
|
||
|
|
self.editBox:SetText(name)
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
hideOnEscape = 1,
|
||
|
|
timeout = 0,
|
||
|
|
whileDead = 1,
|
||
|
|
noCancelOnEscape = 1,
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
--===================================================================================================================================
|
||
|
|
|
||
|
|
BetterWardrobeOutfitDropDownMixin = { }
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:OnLoad()
|
||
|
|
local button = _G[self:GetName().."Button"]
|
||
|
|
button:SetScript("OnMouseDown", function(self)
|
||
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
|
||
|
|
BetterWardrobeOutfitFrame:Toggle(self:GetParent())
|
||
|
|
end
|
||
|
|
)
|
||
|
|
BW_UIDropDownMenu_JustifyText(self, "LEFT")
|
||
|
|
if ( self.width ) then
|
||
|
|
BW_UIDropDownMenu_SetWidth(self, self.width)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:OnShow()
|
||
|
|
self:RegisterEvent("TRANSMOG_OUTFITS_CHANGED")
|
||
|
|
self:RegisterEvent("TRANSMOGRIFY_UPDATE")
|
||
|
|
self:SelectOutfit(self:GetLastOutfitID(), true)
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:BetterWardrobeOutfitDropDown_OnHide()
|
||
|
|
self:UnregisterEvent("TRANSMOG_OUTFITS_CHANGED")
|
||
|
|
self:UnregisterEvent("TRANSMOGRIFY_UPDATE")
|
||
|
|
BetterWardrobeOutfitFrame:ClosePopups(self)
|
||
|
|
if BetterWardrobeOutfitFrame.dropDown == self then
|
||
|
|
BetterWardrobeOutfitFrame:Hide()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:OnEvent(event)
|
||
|
|
|
||
|
|
if event == "TRANSMOG_OUTFITS_CHANGED" then
|
||
|
|
-- try to reselect the same outfit to update the name
|
||
|
|
-- if it changed or clear the name if it got deleted
|
||
|
|
self:SelectOutfit(self.selectedOutfitID)
|
||
|
|
if ( BetterWardrobeOutfitFrame:IsShown() ) then
|
||
|
|
BetterWardrobeOutfitFrame:Update()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
-- don't need to do anything for "TRANSMOGRIFY_UPDATE" beyond updating the save button
|
||
|
|
self:UpdateSaveButton()
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:UpdateSaveButton()
|
||
|
|
if ( self.selectedOutfitID ) then
|
||
|
|
self.SaveButton:SetEnabled(DressUpFrame:IsShown() or not self:IsOutfitDressed());
|
||
|
|
else
|
||
|
|
self.SaveButton:SetEnabled(false);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:OnOutfitSaved(outfitID)
|
||
|
|
if self:ShouldReplaceInvalidSources() then
|
||
|
|
self:LoadOutfit(outfitID);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:OnOutfitModified(outfitID)
|
||
|
|
if self:ShouldReplaceInvalidSources() then
|
||
|
|
self:LoadOutfit(outfitID);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:SelectOutfit(outfitID, loadOutfit)
|
||
|
|
local name
|
||
|
|
if ( outfitID ) then
|
||
|
|
name = GetOutfitName(outfitID)
|
||
|
|
end
|
||
|
|
if ( name ) then
|
||
|
|
BW_UIDropDownMenu_SetText(self, name)
|
||
|
|
else
|
||
|
|
outfitID = nil
|
||
|
|
BW_UIDropDownMenu_SetText(self, GRAY_FONT_COLOR_CODE..TRANSMOG_OUTFIT_NONE..FONT_COLOR_CODE_CLOSE)
|
||
|
|
end
|
||
|
|
|
||
|
|
self.selectedOutfitID = outfitID
|
||
|
|
if BetterWardrobeCollectionFrame then
|
||
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame.selectedSetID = outfitID
|
||
|
|
end
|
||
|
|
|
||
|
|
if ( loadOutfit ) then
|
||
|
|
self:LoadOutfit(outfitID)
|
||
|
|
end
|
||
|
|
self:UpdateSaveButton()
|
||
|
|
self:OnSelectOutfit(outfitID)
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:OnSelectOutfit(outfitID)
|
||
|
|
-- nothing to see here
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:GetLastOutfitID()
|
||
|
|
|
||
|
|
return nil;
|
||
|
|
end
|
||
|
|
|
||
|
|
local function IsSourceArtifact(sourceID)
|
||
|
|
local link = select(6, C_TransmogCollection.GetAppearanceSourceInfo(sourceID))
|
||
|
|
if not link then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
local _, _, quality = GetItemInfo(link)
|
||
|
|
return quality == Enum.ItemQuality.Artifact
|
||
|
|
end
|
||
|
|
|
||
|
|
local function isHiddenAppearance(appearanceID, set_appearanceID, slotID)
|
||
|
|
if set_appearanceID == 0 then return true end
|
||
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(set_appearanceID)
|
||
|
|
|
||
|
|
if sourceInfo then
|
||
|
|
local isCollected = sourceInfo.isCollected
|
||
|
|
|
||
|
|
local isemptyslot = (appearanceID == 0)
|
||
|
|
if not isCollected and isemptyslot then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:IsOutfitDressed()
|
||
|
|
if not self.selectedOutfitID then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
if addon.GetSetType(self.selectedOutfitID) == "SavedBlizzard" then
|
||
|
|
local selectedOutfitID = addon:GetBlizzID(self.selectedOutfitID)
|
||
|
|
local outfitItemTransmogInfoList = C_TransmogCollection.GetOutfitItemTransmogInfoList(selectedOutfitID)
|
||
|
|
if not outfitItemTransmogInfoList then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
local currentItemTransmogInfoList = self:GetItemTransmogInfoList()
|
||
|
|
if not currentItemTransmogInfoList then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
for slotID, itemTransmogInfo in ipairs(currentItemTransmogInfoList) do
|
||
|
|
if not itemTransmogInfo:IsEqual(outfitItemTransmogInfoList[slotID]) then
|
||
|
|
if itemTransmogInfo.appearanceID ~= Constants.Transmog.NoTransmogID then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return true
|
||
|
|
|
||
|
|
else
|
||
|
|
local outfit = addon.GetSetInfo(self.selectedOutfitID) --addon.OutfitDB.char.outfits[LookupIndexFromID(self.selectedOutfitID)]
|
||
|
|
if not outfit then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
local outfitItemTransmogInfoList = addon.C_TransmogCollection.GetOutfitItemTransmogInfoList(self.selectedOutfitID)
|
||
|
|
local currentItemTransmogInfoList = self:GetItemTransmogInfoList()
|
||
|
|
if not currentItemTransmogInfoList then
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
for slotID, itemTransmogInfo in ipairs(currentItemTransmogInfoList) do
|
||
|
|
if not itemTransmogInfo:IsEqual(outfitItemTransmogInfoList[slotID]) then
|
||
|
|
if itemTransmogInfo.appearanceID ~= Constants.Transmog.NoTransmogID or outfitItemTransmogInfoList[slotID].appearanceID ~= Constants.Transmog.NoTransmogID then
|
||
|
|
if not isHiddenAppearance(itemTransmogInfo.appearanceID, outfitItemTransmogInfoList[slotID].appearanceID, slotID) then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:CheckOutfitForSave(outfitID)
|
||
|
|
local hasAnyPendingAppearances = { }
|
||
|
|
local hasAnyInvalidAppearances = false
|
||
|
|
local hasAnyValidAppearances = false
|
||
|
|
local itemTransmogInfoList = self:GetItemTransmogInfoList()
|
||
|
|
|
||
|
|
for slotID, itemTransmogInfo in ipairs(itemTransmogInfoList) do
|
||
|
|
local isValidAppearance = false
|
||
|
|
if TransmogUtil.IsValidTransmogSlotID(slotID) then
|
||
|
|
local appearanceID = itemTransmogInfo.appearanceID
|
||
|
|
if appearanceID ~= Constants.Transmog.NoTransmogID then
|
||
|
|
isValidAppearance = C_TransmogCollection.PlayerKnowsSource(appearanceID)
|
||
|
|
if not isValidAppearance then
|
||
|
|
local isInfoReady, canCollect = C_TransmogCollection.PlayerCanCollectSource(itemTransmogInfo.appearanceID)
|
||
|
|
if isInfoReady then
|
||
|
|
isValidAppearance = canCollect
|
||
|
|
else
|
||
|
|
hasAnyPendingAppearances[appearanceID] = slotID
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if isValidAppearance then
|
||
|
|
hasAnyValidAppearances = true
|
||
|
|
else
|
||
|
|
hasAnyInvalidAppearances = true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if not isValidAppearance then
|
||
|
|
itemTransmogInfo:Clear()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- store the state for this save
|
||
|
|
BetterWardrobeOutfitFrame.hasAnyPendingAppearances = hasAnyPendingAppearances
|
||
|
|
BetterWardrobeOutfitFrame.itemTransmogInfoList = itemTransmogInfoList
|
||
|
|
BetterWardrobeOutfitFrame.hasAnyValidAppearances = hasAnyValidAppearances
|
||
|
|
BetterWardrobeOutfitFrame.hasAnyInvalidAppearances = hasAnyInvalidAppearances
|
||
|
|
BetterWardrobeOutfitFrame.outfitID = outfitID
|
||
|
|
-- save the dropdown
|
||
|
|
BetterWardrobeOutfitFrame.popupDropDown = self
|
||
|
|
|
||
|
|
BetterWardrobeOutfitFrame:EvaluateSaveState()
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:IsDefaultSet(outfitID)
|
||
|
|
return addon.IsDefaultSet(outfitID)
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitDropDownMixin:ShouldReplaceInvalidSources()
|
||
|
|
return self.replaceInvalidSources;
|
||
|
|
end
|
||
|
|
|
||
|
|
--===================================================================================================================================
|
||
|
|
BetterWardrobeOutfitFrameMixin = { }
|
||
|
|
|
||
|
|
BetterWardrobeOutfitFrameMixin.popups = {
|
||
|
|
"BW_NAME_TRANSMOG_OUTFIT",
|
||
|
|
"BW_CONFIRM_DELETE_TRANSMOG_OUTFIT",
|
||
|
|
"CONFIRM_SAVE_TRANSMOG_OUTFIT",
|
||
|
|
"BW_CONFIRM_OVERWRITE_TRANSMOG_OUTFIT",
|
||
|
|
"TRANSMOG_OUTFIT_CHECKING_APPEARANCES",
|
||
|
|
"BW_TRANSMOG_OUTFIT_SOME_INVALID_APPEARANCES",
|
||
|
|
"TRANSMOG_OUTFIT_ALL_INVALID_APPEARANCES",
|
||
|
|
"BETTER_WARDROBE_IMPORT_ITEM_POPUP",
|
||
|
|
"BETTER_WARDROBE_IMPORT_SET_POPUP"
|
||
|
|
}
|
||
|
|
|
||
|
|
local OUTFIT_FRAME_MIN_STRING_WIDTH = 152
|
||
|
|
local OUTFIT_FRAME_MAX_STRING_WIDTH = 216
|
||
|
|
local OUTFIT_FRAME_ADDED_PIXELS = 90 -- pixels added to string width
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:OnHide()
|
||
|
|
self.timer = nil
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:Toggle(dropDown)
|
||
|
|
if ( self.dropDown == dropDown and self:IsShown() ) then
|
||
|
|
BetterWardrobeOutfitFrame:Hide()
|
||
|
|
else
|
||
|
|
CloseDropDownMenus()
|
||
|
|
self.dropDown = dropDown
|
||
|
|
self:Show()
|
||
|
|
self:SetPoint("TOPLEFT", self.dropDown, "BOTTOMLEFT", 8, -3)
|
||
|
|
--if((self:GetTop() - self:GetBottom() + 5) >= UIParent:GetHeight() - self:GetTop() ) then
|
||
|
|
-- self:SetPoint("BOTTOM", UIParent, "BOTTOM", 0, 5)
|
||
|
|
--end
|
||
|
|
self:Update()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:OnUpdate(elapsed)
|
||
|
|
local mouseFocus = GetMouseFocus()
|
||
|
|
for i = 1, #self.Buttons do
|
||
|
|
local button = self.Buttons[i]
|
||
|
|
if ( button == mouseFocus or button:IsMouseOver() ) then
|
||
|
|
if ( button.outfitID ) then
|
||
|
|
button.EditButton:Show()
|
||
|
|
else
|
||
|
|
button.EditButton:Hide()
|
||
|
|
end
|
||
|
|
button.Highlight:Show()
|
||
|
|
else
|
||
|
|
button.EditButton:Hide()
|
||
|
|
button.Highlight:Hide()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if ( BW_UIDROPDOWNMENU_OPEN_MENU ) then
|
||
|
|
self:Hide()
|
||
|
|
end
|
||
|
|
if ( self.timer ) then
|
||
|
|
self.timer = self.timer - elapsed
|
||
|
|
if ( self.timer < 0 ) then
|
||
|
|
self:Hide()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:StartHideCountDown()
|
||
|
|
self.timer = BW_UIDROPDOWNMENU_SHOW_TIME
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:StopHideCountDown()
|
||
|
|
self.timer = nil
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
local function GetButton(self, index)
|
||
|
|
local buttons = self.Buttons
|
||
|
|
local button = buttons[index]
|
||
|
|
if (not button) then
|
||
|
|
button = CreateFrame("BUTTON", nil, self.Content, "BetterWardrobeOutfitButtonTemplate")
|
||
|
|
button.EditButton:SetScript("OnClick", function(self)
|
||
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
|
||
|
|
BetterWardrobeOutfitEditFrame:ShowForOutfit(self:GetParent().outfitID)
|
||
|
|
end)
|
||
|
|
|
||
|
|
button:SetPoint("TOPLEFT", buttons[index-1], "BOTTOMLEFT", 0, 0)
|
||
|
|
button:SetPoint("TOPRIGHT", buttons[index-1], "BOTTOMRIGHT", 0, 0)
|
||
|
|
end
|
||
|
|
return button
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:Update()
|
||
|
|
local outfits = addon.GetOutfits(true)
|
||
|
|
--local sets = addon.GetSavedList()--addon.setdb.global.sets
|
||
|
|
addon.SortDropdown(outfits)
|
||
|
|
----local mogit_Outfits = addon.GetMogitOutfits()
|
||
|
|
local buttons = self.Buttons
|
||
|
|
local numButtons = 1
|
||
|
|
local stringWidth = 0
|
||
|
|
local minStringWidth = self.dropDown.minMenuStringWidth or OUTFIT_FRAME_MIN_STRING_WIDTH
|
||
|
|
local maxStringWidth = self.dropDown.maxMenuStringWidth or OUTFIT_FRAME_MAX_STRING_WIDTH
|
||
|
|
self:SetWidth(maxStringWidth + OUTFIT_FRAME_ADDED_PIXELS)
|
||
|
|
for i = 1, #outfits do
|
||
|
|
local newOutfitButton = false --(i == 1);
|
||
|
|
local outfit = outfits[i]
|
||
|
|
if ( outfit or newOutfitButton ) then
|
||
|
|
local button = GetButton(self, i + 1)
|
||
|
|
--if ( not button ) then
|
||
|
|
--button = GetButton(self, i + 1) --CreateFrame("BUTTON", nil, self, "WardrobeOutfitButtonTemplate");
|
||
|
|
--button:SetPoint("TOPLEFT", buttons[i-1], "BOTTOMLEFT", 0, 0);
|
||
|
|
--button:SetPoint("TOPRIGHT", buttons[i-1], "BOTTOMRIGHT", 0, 0);
|
||
|
|
--end
|
||
|
|
button:Show();
|
||
|
|
|
||
|
|
if ( newOutfitButton ) then
|
||
|
|
--button:SetText(GREEN_FONT_COLOR_CODE..TRANSMOG_OUTFIT_NEW..FONT_COLOR_CODE_CLOSE);
|
||
|
|
--button.Icon:SetTexture("Interface\\PaperDollInfoFrame\\Character-Plus");
|
||
|
|
---button.outfitID = nil;
|
||
|
|
--button.Check:Hide();
|
||
|
|
--button.Selection:Hide();
|
||
|
|
|
||
|
|
else
|
||
|
|
if ( outfit.outfitID == self.dropDown.selectedOutfitID ) then
|
||
|
|
button.Check:Show();
|
||
|
|
button.Selection:Show();
|
||
|
|
else
|
||
|
|
button.Selection:Hide();
|
||
|
|
button.Check:Hide();
|
||
|
|
end
|
||
|
|
--local name, icon = C_TransmogCollection.GetOutfitInfo(outfitID);
|
||
|
|
button.Text:SetWidth(0);
|
||
|
|
button:SetText(NORMAL_FONT_COLOR_CODE..outfits[i].name..FONT_COLOR_CODE_CLOSE);
|
||
|
|
button.Icon:SetTexture(outfit.icon);
|
||
|
|
button.outfitID = outfit.outfitID;
|
||
|
|
end
|
||
|
|
|
||
|
|
if outfit.set == "mogit" or outfit.set == "transmog_outfits" then
|
||
|
|
button.EditButton:Disable()
|
||
|
|
button.EditButton.texture:Hide()
|
||
|
|
else
|
||
|
|
button.EditButton:Enable()
|
||
|
|
button.EditButton.texture:Show()
|
||
|
|
end
|
||
|
|
|
||
|
|
stringWidth = max(stringWidth, button.Text:GetStringWidth())
|
||
|
|
if (button.Text:GetStringWidth() > maxStringWidth) then
|
||
|
|
button.Text:SetWidth(maxStringWidth)
|
||
|
|
end
|
||
|
|
numButtons = numButtons + 1
|
||
|
|
else
|
||
|
|
if (buttons[i + 1]) then
|
||
|
|
buttons[i + 1]:Hide()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
for i = #outfits + 2 , #buttons do
|
||
|
|
buttons[i]:Hide()
|
||
|
|
end
|
||
|
|
|
||
|
|
stringWidth = max(stringWidth, minStringWidth)
|
||
|
|
stringWidth = min(stringWidth, maxStringWidth)
|
||
|
|
self:SetWidth(stringWidth + OUTFIT_FRAME_ADDED_PIXELS)
|
||
|
|
|
||
|
|
if numButtons > 12 then
|
||
|
|
self:SetHeight(30 + 12 * 20)
|
||
|
|
|
||
|
|
else
|
||
|
|
self:SetHeight(30 + numButtons * 20)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:NewOutfit(name)
|
||
|
|
local outfitID = LookupOutfitIDFromName(name) --or ((#C_TransmogCollection.GetOutfits() <= MAX_DEFAULT_OUTFITS) and #C_TransmogCollection.GetOutfits() -1 ) -- or #GetOutfits()-1
|
||
|
|
local icon = QUESTION_MARK_ICON
|
||
|
|
local outfit
|
||
|
|
|
||
|
|
for slotID, itemTransmogInfo in ipairs(self.itemTransmogInfoList) do
|
||
|
|
local appearanceID = itemTransmogInfo.appearanceID
|
||
|
|
if appearanceID ~= Constants.Transmog.NoTransmogID then
|
||
|
|
icon = select(4, C_TransmogCollection.GetAppearanceSourceInfo(appearanceID))
|
||
|
|
if icon then
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
--[[local sources = {}
|
||
|
|
for i, data in pairs(self.itemTransmogInfoList) do
|
||
|
|
sources[i] = data.appearanceID
|
||
|
|
end]]
|
||
|
|
|
||
|
|
if (outfitID and IsDefaultSet(outfitID)) or (#C_TransmogCollection.GetOutfits() < MAX_DEFAULT_OUTFITS) then
|
||
|
|
outfitID = C_TransmogCollection.NewOutfit(name, icon, self.itemTransmogInfoList)
|
||
|
|
else
|
||
|
|
if outfitID then
|
||
|
|
addon.OutfitDB.char.outfits[LookupIndexFromID(outfitID)] = addon.OutfitDB.char.outfits[LookupIndexFromID(outfitID)] or {}
|
||
|
|
outfit = addon.OutfitDB.char.outfits[LookupIndexFromID(outfitID)]
|
||
|
|
else
|
||
|
|
tinsert(addon.OutfitDB.char.outfits, {})
|
||
|
|
outfit = addon.OutfitDB.char.outfits[#addon.OutfitDB.char.outfits]
|
||
|
|
end
|
||
|
|
outfit["name"] = name
|
||
|
|
----local icon = select(4, C_TransmogCollection.GetAppearanceSourceInfo(outfit[1]))
|
||
|
|
outfit["icon"] = icon
|
||
|
|
--outfit.itemData = itemData
|
||
|
|
|
||
|
|
local itemData = {}
|
||
|
|
for i, data in pairs(self.itemTransmogInfoList) do
|
||
|
|
outfit[i] = data.appearanceID
|
||
|
|
if i == 3 then
|
||
|
|
outfit["offShoulder"] = data.secondaryAppearanceID or 0
|
||
|
|
elseif i == 16 then
|
||
|
|
outfit["mainHandEnchant"] = data.illusionID or 0
|
||
|
|
elseif i == 17 then
|
||
|
|
outfit["offHandEnchant"] = data.illusionID or 0
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
--outfit.sources = sources
|
||
|
|
--outfit.itemTransmogInfoList = self.itemTransmogInfoList or {}
|
||
|
|
--outfitID = index
|
||
|
|
end
|
||
|
|
if outfitID then
|
||
|
|
self:SaveLastOutfit(outfitID);
|
||
|
|
end
|
||
|
|
if ( self.popupDropDown ) then
|
||
|
|
self.popupDropDown:SelectOutfit(outfitID)
|
||
|
|
self.popupDropDown:OnOutfitSaved(outfitID)
|
||
|
|
end
|
||
|
|
|
||
|
|
--addon.setdb.global.sets[addon.setdb:GetCurrentProfile()] = addon.GetSavedList()
|
||
|
|
addon.setdb.global.sets[addon.setdb:GetCurrentProfile()] = addon.StoreBlizzardSets()
|
||
|
|
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:DeleteOutfit(outfitID)
|
||
|
|
if IsDefaultSet(outfitID) then
|
||
|
|
C_TransmogCollection.DeleteOutfit(addon:GetBlizzID(outfitID))
|
||
|
|
else
|
||
|
|
tremove(addon.OutfitDB.char.outfits, LookupIndexFromID(outfitID))
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
--[[---TODO:CHeck
|
||
|
|
if GetCVarBool("transmogCurrentSpecOnly") then
|
||
|
|
local specIndex = GetSpecialization()
|
||
|
|
|
||
|
|
if addon.IsDefaultSet(outfitID) then
|
||
|
|
SetCVar("lastTransmogOutfitIDSpec"..specIndex, value)
|
||
|
|
|
||
|
|
|
||
|
|
local value = addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex]
|
||
|
|
if type(value) == number and value > 0 then addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex] = value - 1 end
|
||
|
|
|
||
|
|
--SetCVar("lastTransmogOutfitIDSpec"..specIndex, value)
|
||
|
|
else
|
||
|
|
for specIndex = 1, GetNumSpecializations() do
|
||
|
|
--SetCVar("lastTransmogOutfitIDSpec"..specIndex, value)
|
||
|
|
local value = addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex]
|
||
|
|
if type(value) == number and value > 0 then addon.OutfitDB.char.lastTransmogOutfitIDSpec[specIndex] = value - 1 end
|
||
|
|
end
|
||
|
|
end]]
|
||
|
|
|
||
|
|
--addon.setdb.global.sets[addon.setdb:GetCurrentProfile()] = addon.GetSavedList()
|
||
|
|
addon.setdb.global.sets[addon.setdb:GetCurrentProfile()] = addon.StoreBlizzardSets()
|
||
|
|
|
||
|
|
addon:SendMessage("BW_TRANSMOG_COLLECTION_UPDATED")
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:NameOutfit(newName, outfitID)
|
||
|
|
local outfits = addon.GetOutfits(true)
|
||
|
|
for i = 1, #outfits do
|
||
|
|
if (outfits[i].name == newName) then
|
||
|
|
if (outfitID) then
|
||
|
|
UIErrorsFrame:AddMessage(TRANSMOG_OUTFIT_ALREADY_EXISTS, 1.0, 0.1, 0.1, 1.0)
|
||
|
|
else
|
||
|
|
overwriteID = outfits[i].outfitID
|
||
|
|
BetterWardrobeOutfitFrame:ShowPopup("BW_CONFIRM_OVERWRITE_TRANSMOG_OUTFIT", newName, nil, newName)
|
||
|
|
end
|
||
|
|
return
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if outfitID and IsDefaultSet(outfitID) then
|
||
|
|
local blizzardID = addon:GetBlizzID(outfitID)
|
||
|
|
-- this is a rename
|
||
|
|
C_TransmogCollection.RenameOutfit(blizzardID, newName)
|
||
|
|
elseif outfitID then
|
||
|
|
local index = LookupIndexFromID(outfitID)
|
||
|
|
addon.OutfitDB.char.outfits[index].name = newName
|
||
|
|
else
|
||
|
|
-- this is a new outfit
|
||
|
|
self:NewOutfit(newName)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:ShowPopup(popup, ...)
|
||
|
|
-- close all other popups
|
||
|
|
for _, listPopup in pairs(self.popups) do
|
||
|
|
if ( listPopup ~= popup ) then
|
||
|
|
StaticPopup_Hide(listPopup)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if ( popup ~= BetterWardrobeOutfitEditFrame ) then
|
||
|
|
StaticPopupSpecial_Hide(BetterWardrobeOutfitEditFrame)
|
||
|
|
end
|
||
|
|
|
||
|
|
self.popupDropDown = self.dropDown
|
||
|
|
if ( popup == BetterWardrobeOutfitEditFrame ) then
|
||
|
|
StaticPopupSpecial_Show(BetterWardrobeOutfitEditFrame)
|
||
|
|
else
|
||
|
|
StaticPopup_Show(popup, ...)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:ClosePopups(requestingDropDown)
|
||
|
|
if ( requestingDropDown and requestingDropDown ~= self.popupDropDown ) then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
for _, popup in pairs(self.popups) do
|
||
|
|
StaticPopup_Hide(popup)
|
||
|
|
end
|
||
|
|
StaticPopupSpecial_Hide(BetterWardrobeOutfitEditFrame)
|
||
|
|
|
||
|
|
-- clean up
|
||
|
|
self.itemTransmogInfoList = nil
|
||
|
|
self.hasAnyPendingAppearances = nil
|
||
|
|
self.hasAnyValidAppearances = nil
|
||
|
|
self.hasAnyInvalidAppearances = nil
|
||
|
|
self.outfitID = nil
|
||
|
|
self.popupDropDown = nil
|
||
|
|
self.name = nil
|
||
|
|
self.sources = nil
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:StartOutfitSave(popupDropDown, outfitID)
|
||
|
|
self.popupDropDown = popupDropDown;
|
||
|
|
self.outfitID = outfitID;
|
||
|
|
self:EvaluateAppearances();
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:EvaluateAppearance(appearanceID, category, transmogLocation)
|
||
|
|
local preferredAppearanceID, hasAllData, canCollect;
|
||
|
|
if self.popupDropDown:ShouldReplaceInvalidSources() then
|
||
|
|
preferredAppearanceID, hasAllData, canCollect = CollectionWardrobeUtil.GetPreferredSourceID(appearanceID, nil, category, transmogLocation);
|
||
|
|
else
|
||
|
|
preferredAppearanceID = appearanceID;
|
||
|
|
hasAllData, canCollect = CollectionWardrobeUtil.PlayerCanCollectSource(appearanceID);
|
||
|
|
end
|
||
|
|
|
||
|
|
if canCollect then
|
||
|
|
self.hasAnyValidAppearances = true;
|
||
|
|
else
|
||
|
|
if hasAllData then
|
||
|
|
self.hasAnyInvalidAppearances = true;
|
||
|
|
else
|
||
|
|
self.hasAnyPendingAppearances = true;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
local isInvalidAppearance = hasAllData and not canCollect;
|
||
|
|
return preferredAppearanceID, isInvalidAppearance;
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:EvaluateAppearances()
|
||
|
|
self.hasAnyInvalidAppearances = false;
|
||
|
|
self.hasAnyValidAppearances = false;
|
||
|
|
self.hasAnyPendingAppearances = false;
|
||
|
|
self.itemTransmogInfoList = self.popupDropDown:GetItemTransmogInfoList();
|
||
|
|
-- all illusions are collectible
|
||
|
|
for slotID, itemTransmogInfo in ipairs(self.itemTransmogInfoList) do
|
||
|
|
local isValidAppearance = false;
|
||
|
|
if TransmogUtil.IsValidTransmogSlotID(slotID) then
|
||
|
|
local appearanceID = itemTransmogInfo.appearanceID;
|
||
|
|
isValidAppearance = appearanceID ~= Constants.Transmog.NoTransmogID;
|
||
|
|
-- skip offhand if mainhand is an appeance from Legion Artifacts category and the offhand matches the paired appearance
|
||
|
|
if isValidAppearance and slotID == INVSLOT_OFFHAND then
|
||
|
|
local mhInfo = self.itemTransmogInfoList[INVSLOT_MAINHAND];
|
||
|
|
if mhInfo:IsMainHandPairedWeapon() then
|
||
|
|
isValidAppearance = appearanceID ~= C_TransmogCollection.GetPairedArtifactAppearance(mhInfo.appearanceID);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if isValidAppearance then
|
||
|
|
local transmogLocation = TransmogUtil.CreateTransmogLocation(slotID, Enum.TransmogType.Appearance, Enum.TransmogModification.Main);
|
||
|
|
local category = C_TransmogCollection.GetCategoryForItem(appearanceID);
|
||
|
|
local preferredAppearanceID, isInvalidAppearance = self:EvaluateAppearance(appearanceID, category, transmogLocation);
|
||
|
|
if isInvalidAppearance then
|
||
|
|
isValidAppearance = false;
|
||
|
|
else
|
||
|
|
itemTransmogInfo.appearanceID = preferredAppearanceID;
|
||
|
|
end
|
||
|
|
-- secondary check
|
||
|
|
if itemTransmogInfo.secondaryAppearanceID ~= Constants.Transmog.NoTransmogID and C_Transmog.CanHaveSecondaryAppearanceForSlotID(slotID) then
|
||
|
|
local secondaryTransmogLocation = TransmogUtil.CreateTransmogLocation(slotID, Enum.TransmogType.Appearance, Enum.TransmogModification.Secondary);
|
||
|
|
local secondaryCategory = C_TransmogCollection.GetCategoryForItem(itemTransmogInfo.secondaryAppearanceID);
|
||
|
|
local secondaryPreferredAppearanceID, secondaryIsInvalidAppearance = self:EvaluateAppearance(itemTransmogInfo.secondaryAppearanceID, secondaryCategory, secondaryTransmogLocation);
|
||
|
|
if secondaryIsInvalidAppearance then
|
||
|
|
-- secondary is invalid, clear it
|
||
|
|
itemTransmogInfo.secondaryAppearanceID = Constants.Transmog.NoTransmogID;
|
||
|
|
else
|
||
|
|
if isInvalidAppearance then
|
||
|
|
-- secondary is valid but primary is invalid, make the secondary the primary
|
||
|
|
isValidAppearance = true;
|
||
|
|
itemTransmogInfo.appearanceID = secondaryPreferredAppearanceID;
|
||
|
|
itemTransmogInfo.secondaryAppearanceID = Constants.Transmog.NoTransmogID;
|
||
|
|
else
|
||
|
|
-- both primary and secondary are valid
|
||
|
|
itemTransmogInfo.secondaryAppearanceID = secondaryPreferredAppearanceID;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
if not isValidAppearance then
|
||
|
|
itemTransmogInfo:Clear();
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
self:EvaluateSaveState();
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:EvaluateSaveState()
|
||
|
|
--if self.hasAnyPendingAppearances then
|
||
|
|
-- wait
|
||
|
|
--if ( not StaticPopup_Visible("TRANSMOG_OUTFIT_CHECKING_APPEARANCES") ) then
|
||
|
|
--BetterWardrobeOutfitFrame:ShowPopup("TRANSMOG_OUTFIT_CHECKING_APPEARANCES", nil, nil, nil, WardrobeOutfitCheckAppearancesFrame);
|
||
|
|
--print(1)
|
||
|
|
--end
|
||
|
|
--else
|
||
|
|
StaticPopup_Hide("TRANSMOG_OUTFIT_CHECKING_APPEARANCES");
|
||
|
|
if not self.hasAnyValidAppearances then
|
||
|
|
-- stop
|
||
|
|
BetterWardrobeOutfitFrame:ShowPopup("TRANSMOG_OUTFIT_ALL_INVALID_APPEARANCES");
|
||
|
|
elseif self.hasAnyInvalidAppearances then
|
||
|
|
-- warn
|
||
|
|
BetterWardrobeOutfitFrame:ShowPopup("TRANSMOG_OUTFIT_SOME_INVALID_APPEARANCES");
|
||
|
|
else
|
||
|
|
BetterWardrobeOutfitFrame:ContinueWithSave();
|
||
|
|
end
|
||
|
|
--end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:ContinueWithSave()
|
||
|
|
if self.outfitID and IsDefaultSet(self.outfitID) then
|
||
|
|
-- this is a rename
|
||
|
|
C_TransmogCollection.ModifyOutfit(addon:GetBlizzID(self.outfitID), self.itemTransmogInfoList)
|
||
|
|
self:SaveLastOutfit(self.outfitID);
|
||
|
|
self.popupDropDown:OnOutfitModified(self.outfitID);
|
||
|
|
BetterWardrobeOutfitFrame:ClosePopups()
|
||
|
|
elseif self.outfitID then
|
||
|
|
addon.OutfitDB.char.outfits[LookupIndexFromID(self.outfitID)] = addon.OutfitDB.char.outfits[LookupIndexFromID(self.outfitID)] or {}
|
||
|
|
outfit = addon.OutfitDB.char.outfits[LookupIndexFromID(self.outfitID)]
|
||
|
|
--outfit.itemTransmogInfoList = self.itemTransmogInfoList or {}
|
||
|
|
|
||
|
|
local itemData = {}
|
||
|
|
for i, data in pairs(self.itemTransmogInfoList) do
|
||
|
|
local sourceInfo = C_TransmogCollection.GetSourceInfo(data.appearanceID)
|
||
|
|
if sourceInfo then
|
||
|
|
local appearanceID = sourceInfo.visualID
|
||
|
|
local itemID = sourceInfo.itemID
|
||
|
|
local itemMod = sourceInfo.itemModID
|
||
|
|
local sourceID = sourceInfo.sourceID
|
||
|
|
itemData[i] = {"'"..itemID..":"..itemMod.."'", sourceID, appearanceID}
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
outfit.itemData = itemData
|
||
|
|
BetterWardrobeOutfitFrame:ClosePopups()
|
||
|
|
else
|
||
|
|
-- this is a new outfit
|
||
|
|
WardrobeOutfitFrame:ShowPopup("BW_NAME_TRANSMOG_OUTFIT")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:SaveLastOutfit(outfitID)
|
||
|
|
local value = outfitID or "";
|
||
|
|
local currentSpecIndex = GetCVarBool("transmogCurrentSpecOnly") and GetSpecialization() or nil;
|
||
|
|
for specIndex = 1, GetNumSpecializations() do
|
||
|
|
if not currentSpecIndex or specIndex == currentSpecIndex then
|
||
|
|
SetCVar("lastTransmogOutfitIDSpec"..specIndex, value);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:OverwriteOutfit(outfitID)
|
||
|
|
self.outfitID = outfitID;
|
||
|
|
self:ContinueWithSave();
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitFrameMixin:CreateScrollFrame()
|
||
|
|
self:SetFrameLevel(5000)
|
||
|
|
self.scrollframe = self.scrollframe or CreateFrame("ScrollFrame", self:GetName().."ScrollFrame", self, "UIPanelScrollFrameTemplate")
|
||
|
|
self.scrollchild = self.scrollchild or CreateFrame("Frame") -- not sure what happens if you do, but to be safe, don't parent this yet (or do anything with it)
|
||
|
|
|
||
|
|
local scrollbarName = self.scrollframe:GetName()
|
||
|
|
self.scrollbar = _G[scrollbarName.."ScrollBar"]
|
||
|
|
self.scrollupbutton = _G[scrollbarName.."ScrollBarScrollUpButton"]
|
||
|
|
self.scrolldownbutton = _G[scrollbarName.."ScrollBarScrollDownButton"]
|
||
|
|
|
||
|
|
self.scrollupbutton:ClearAllPoints()
|
||
|
|
self.scrollupbutton:SetPoint("TOPRIGHT", self.scrollframe, "TOPRIGHT", -2, -2)
|
||
|
|
|
||
|
|
self.scrolldownbutton:ClearAllPoints()
|
||
|
|
self.scrolldownbutton:SetPoint("BOTTOMRIGHT", self.scrollframe, "BOTTOMRIGHT", -2, 2)
|
||
|
|
|
||
|
|
self.scrollbar:ClearAllPoints()
|
||
|
|
self.scrollbar:SetPoint("TOP", self.scrollupbutton, "BOTTOM", 0, -2)
|
||
|
|
self.scrollbar:SetPoint("BOTTOM", self.scrolldownbutton, "TOP", 0, 2)
|
||
|
|
|
||
|
|
self.scrollframe:SetScrollChild(self.scrollchild)
|
||
|
|
self.scrollframe:SetAllPoints(self)
|
||
|
|
self.scrollframe:ClearAllPoints()
|
||
|
|
self.scrollframe:SetPoint("TOPLEFT", self, "TOPLEFT", 11, -15)
|
||
|
|
self.scrollframe:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -11, 15)
|
||
|
|
self.scrollchild:SetSize(self.scrollframe:GetWidth(), ( self.scrollframe:GetHeight() * 2 ))
|
||
|
|
|
||
|
|
self.moduleoptions = self.moduleoptions or CreateFrame("Frame", nil, self.scrollchild)
|
||
|
|
self.moduleoptions:SetAllPoints(self.scrollchild)
|
||
|
|
|
||
|
|
self.Content = self.moduleoptions
|
||
|
|
|
||
|
|
local button = CreateFrame("BUTTON", nil, self.Content, "BetterWardrobeOutfitButtonTemplate")
|
||
|
|
button.EditButton:SetScript("OnClick", function(self)
|
||
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
|
||
|
|
BetterWardrobeOutfitEditFrame:ShowForOutfit(self:GetParent().outfitID)
|
||
|
|
end)
|
||
|
|
button.EditButton:Hide()
|
||
|
|
|
||
|
|
button:SetPoint("TOPLEFT", self.Content, "TOPLEFT")
|
||
|
|
button:SetPoint("TOPRIGHT", self.Content, "TOPRIGHT", -20, 0)
|
||
|
|
|
||
|
|
button:SetText(GREEN_FONT_COLOR_CODE..TRANSMOG_OUTFIT_NEW..FONT_COLOR_CODE_CLOSE)
|
||
|
|
button.Icon:SetTexture("Interface\\PaperDollInfoFrame\\Character-Plus")
|
||
|
|
button.outfitID = nil
|
||
|
|
button.Check:Hide()
|
||
|
|
button.Selection:Hide()
|
||
|
|
|
||
|
|
function self.moduleoptions:StartHideCountDown()
|
||
|
|
return BetterWardrobeOutfitFrame:StartHideCountDown()
|
||
|
|
end
|
||
|
|
|
||
|
|
function self.moduleoptions:StopHideCountDown()
|
||
|
|
return BetterWardrobeOutfitFrame:StopHideCountDown()
|
||
|
|
end
|
||
|
|
|
||
|
|
self.Buttons = self.moduleoptions.Buttons
|
||
|
|
end
|
||
|
|
|
||
|
|
--===================================================================================================================================
|
||
|
|
BetterWardrobeOutfitButtonMixin = { }
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitButtonMixin:OnClick()
|
||
|
|
PlaySound(SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON)
|
||
|
|
BetterWardrobeOutfitFrame:Hide()
|
||
|
|
|
||
|
|
--Reset saved list to player
|
||
|
|
local name = UnitName("player")
|
||
|
|
local realm = GetRealmName()
|
||
|
|
addon.SelecteSavedList = false
|
||
|
|
|
||
|
|
if ( self.outfitID ) then
|
||
|
|
|
||
|
|
BetterWardrobeOutfitFrame.dropDown:SelectOutfit(self.outfitID, true)
|
||
|
|
else
|
||
|
|
--if ( WardrobeTransmogFrame and HelpTip:IsShowing(WardrobeTransmogFrame, TRANSMOG_OUTFIT_DROPDOWN_TUTORIAL) ) then
|
||
|
|
--HelpTip:Hide(WardrobeTransmogFrame, TRANSMOG_OUTFIT_DROPDOWN_TUTORIAL)
|
||
|
|
--SetCVarBitfield("closedInfoFrames", LE_FRAME_TUTORIAL_TRANSMOG_OUTFIT_DROPDOWN, true)
|
||
|
|
--end
|
||
|
|
--BetterWardrobeOutfitFrame.dropDown:CheckOutfitForSave()
|
||
|
|
BetterWardrobeOutfitFrame:StartOutfitSave(BetterWardrobeOutfitFrame.dropDown);
|
||
|
|
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
--===================================================================================================================================
|
||
|
|
BetterWardrobeOutfitEditFrameMixin = { }
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitEditFrameMixin:ShowForOutfit(outfitID)
|
||
|
|
BetterWardrobeOutfitFrame:Hide()
|
||
|
|
BetterWardrobeOutfitFrame:ShowPopup(self)
|
||
|
|
self.outfitID = outfitID
|
||
|
|
local name = GetOutfitName(outfitID)
|
||
|
|
self.EditBox:SetText(name)
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitEditFrameMixin:OnDelete()
|
||
|
|
BetterWardrobeOutfitFrame:Hide()
|
||
|
|
local name = C_TransmogCollection.GetOutfitInfo(addon:GetBlizzID(self.outfitID)) or self.name or ""
|
||
|
|
BetterWardrobeOutfitFrame:ShowPopup("BW_CONFIRM_DELETE_TRANSMOG_OUTFIT", name, nil, self.outfitID)
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitEditFrameMixin:OnAccept()
|
||
|
|
if ( not self.AcceptButton:IsEnabled() ) then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
StaticPopupSpecial_Hide(self)
|
||
|
|
BetterWardrobeOutfitFrame:NameOutfit(self.EditBox:GetText(), self.outfitID)
|
||
|
|
addon:SendMessage("BW_TRANSMOG_COLLECTION_UPDATED")
|
||
|
|
end
|
||
|
|
|
||
|
|
--===================================================================================================================================
|
||
|
|
BetterWardrobeOutfitCheckAppearancesMixin = { }
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitCheckAppearancesMixin:OnLoad()
|
||
|
|
self.Anim:Play()
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitCheckAppearancesMixin:OnShow()
|
||
|
|
LoadingSpinnerMixin.OnShow(self);
|
||
|
|
self:RegisterEvent("TRANSMOG_COLLECTION_ITEM_UPDATE");
|
||
|
|
self:RegisterEvent("TRANSMOG_SOURCE_COLLECTABILITY_UPDATE")
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitCheckAppearancesMixin:OnHide()
|
||
|
|
LoadingSpinnerMixin.OnHide(self);
|
||
|
|
self:UnregisterEvent("TRANSMOG_COLLECTION_ITEM_UPDATE");
|
||
|
|
self:UnregisterEvent("TRANSMOG_SOURCE_COLLECTABILITY_UPDATE")
|
||
|
|
self.reevaluate = nil;
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitCheckAppearancesMixin:OnEvent(event, appearanceID, canCollect)
|
||
|
|
--local slotID = BetterWardrobeOutfitFrame.hasAnyPendingAppearances[appearanceID]
|
||
|
|
--if slotID then
|
||
|
|
--if not canCollect then
|
||
|
|
--BetterWardrobeOutfitFrame.hasAnyInvalidAppearances = true
|
||
|
|
--for i, itemTransmogInfo in ipairs(BetterWardrobeOutfitFrame.itemTransmogInfoList) do
|
||
|
|
--if itemTransmogInfo.appearanceID == appearanceID then
|
||
|
|
-- itemTransmogInfo:Clear()
|
||
|
|
--end
|
||
|
|
--end
|
||
|
|
--end
|
||
|
|
--BetterWardrobeOutfitFrame.hasAnyPendingAppearances[appearanceID] = nil
|
||
|
|
--BetterWardrobeOutfitFrame:EvaluateSaveState()
|
||
|
|
--end
|
||
|
|
self.reevaluate = true;
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitCheckAppearancesMixin:OnUpdate()
|
||
|
|
if self.reevaluate then
|
||
|
|
self.reevaluate = nil;
|
||
|
|
BetterWardrobeOutfitFrame:EvaluateAppearances();
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local outfitDropdown
|
||
|
|
function addon.RefreshSaveOutfitDropdown()
|
||
|
|
local list = {}
|
||
|
|
|
||
|
|
for name in pairs(addon.setdb.global.sets)do
|
||
|
|
tinsert(list, name)
|
||
|
|
end
|
||
|
|
outfitDropdown:SetList(list)
|
||
|
|
|
||
|
|
for i, name in ipairs(list) do
|
||
|
|
if name == addon.setdb:GetCurrentProfile() then
|
||
|
|
outfitDropdown:SetValue(i)
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
local function SavedOutfitDB_Dropdown_OnClick(self, arg1, arg2, checked)
|
||
|
|
local value = arg1
|
||
|
|
local name = UnitName("player")
|
||
|
|
local realm = GetRealmName()
|
||
|
|
|
||
|
|
if arg1 ~= addon.setdb:GetCurrentProfile() then
|
||
|
|
addon.SelecteSavedList = arg1
|
||
|
|
else
|
||
|
|
addon.SelecteSavedList = false
|
||
|
|
end
|
||
|
|
BetterWardrobeCollectionFrame.SetsCollectionFrame:OnSearchUpdate()
|
||
|
|
BetterWardrobeCollectionFrame.SetsTransmogFrame:OnSearchUpdate()
|
||
|
|
|
||
|
|
BW_UIDropDownMenu_SetSelectedValue(BW_DBSavedSetDropdown, arg1)
|
||
|
|
--BW_UIDropDownMenu_SetText(BW_DBSavedSetDropdown, arg1)
|
||
|
|
|
||
|
|
addon.savedSetCache = nil
|
||
|
|
end
|
||
|
|
|
||
|
|
function SavedOutfitDB_Dropdown_Menu(frame, level, menuList)
|
||
|
|
local count = 1
|
||
|
|
for name in pairs(addon.setdb.global.sets)do
|
||
|
|
local info = BW_UIDropDownMenu_CreateInfo()
|
||
|
|
info.func = SavedOutfitDB_Dropdown_OnClick
|
||
|
|
info.text, info.arg1 = name, name
|
||
|
|
BW_UIDropDownMenu_AddButton(info)
|
||
|
|
if name == addon.setdb:GetCurrentProfile() then
|
||
|
|
BW_UIDropDownMenu_SetSelectedValue(BW_DBSavedSetDropdown, name)
|
||
|
|
end
|
||
|
|
count = count +1
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
--Dropdownmenu for the selection of other character's saved sets
|
||
|
|
function addon.Init.SavedSetsDropDown_Initialize(self)
|
||
|
|
--local f = BW_UIDropDownMenu_Create("BW_DBSavedSetDropdown", BW_WardrobeCollectionFrame)
|
||
|
|
--BW_DBSavedSetDropdown = CreateFrame("Frame", "BW_DBSavedSetDropdown", BetterWardrobeCollectionFrame, "BW_UIDropDownMenuTemplate")
|
||
|
|
--BW_DBSavedSetDropdown:SetPoint("TOPRIGHT", "BW_SortDropDown", "TOPRIGHT")
|
||
|
|
--BW_DBSavedSetDropdown:SetPoint("TOPLEFT", BetterWardrobeVisualToggle, "TOPRIGHT", -15, 0)
|
||
|
|
|
||
|
|
--BW_UIDropDownMenu_SetWidth(BW_DBSavedSetDropdown, 165) -- Use in place of dropDown:SetWidth
|
||
|
|
|
||
|
|
--BW_UIDropDownMenu_Initialize(BW_DBSavedSetDropdown, SavedOutfitDB_Dropdown_Menu)
|
||
|
|
--BW_UIDropDownMenu_SetSelectedValue(BW_DBSavedSetDropdown, addon.setdb:GetCurrentProfile())
|
||
|
|
--BW_DBSavedSetDropdown:Hide()
|
||
|
|
|
||
|
|
SavedOutfitDropDownMenu:Hide()
|
||
|
|
SavedOutfitDropDownMenu:SetParent(BetterWardrobeCollectionFrame)
|
||
|
|
SavedOutfitDropDownMenu:ClearAllPoints()
|
||
|
|
--SavedOutfitDropDownMenu:SetPoint("TOPRIGHT", "BW_SortDropDown", "TOPRIGHT")
|
||
|
|
|
||
|
|
SavedOutfitDropDownMenu:SetPoint("TOPLEFT", BetterWardrobeVisualToggle, "TOPRIGHT", -15, 0)
|
||
|
|
BW_UIDropDownMenu_SetText(SavedOutfitDropDownMenu, addon.setdb:GetCurrentProfile())
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
local MogItSetName
|
||
|
|
local MogItSetID
|
||
|
|
local plugin
|
||
|
|
local plugin_index
|
||
|
|
local function BW_DressingRoomImportButton_OnClicks(outfitID, name, parent)
|
||
|
|
MogItSetName = name
|
||
|
|
MogItSetID = outfitID
|
||
|
|
if outfitID >= 70000 then
|
||
|
|
plugin = addon.TransmogOutfits
|
||
|
|
plugin_index = outfitID
|
||
|
|
elseif IsAddOnLoaded("MogIt") then
|
||
|
|
plugin = addon.MogIt
|
||
|
|
plugin_index = MogItSetName
|
||
|
|
else
|
||
|
|
plugin = nil
|
||
|
|
end
|
||
|
|
|
||
|
|
if not plugin then return end
|
||
|
|
|
||
|
|
local contextMenuData = {
|
||
|
|
{
|
||
|
|
text = L["Create Copy"],
|
||
|
|
func = function()
|
||
|
|
plugin:CopySet(MogItSetID, MogItSetName)
|
||
|
|
MogItSetName = nil
|
||
|
|
MogItSetID = nil
|
||
|
|
plugin = nil
|
||
|
|
|
||
|
|
end,
|
||
|
|
isNotRadio = true,
|
||
|
|
notCheckable = true,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
text = L["Rename"],
|
||
|
|
func = function()
|
||
|
|
plugin:RenameSet(plugin_index)
|
||
|
|
MogItSetName = nil
|
||
|
|
MogItSetID = nil
|
||
|
|
plugin = nil
|
||
|
|
plugin_index = nil
|
||
|
|
|
||
|
|
end,
|
||
|
|
|
||
|
|
isNotRadio = true,
|
||
|
|
notCheckable = true,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
text = L["Delete"],
|
||
|
|
func = function()
|
||
|
|
plugin:DeleteSet(plugin_index)
|
||
|
|
MogItSetName = nil
|
||
|
|
MogItSetID = nil
|
||
|
|
plugin = nil
|
||
|
|
plugin_index = nil
|
||
|
|
|
||
|
|
|
||
|
|
end,
|
||
|
|
isNotRadio = true,
|
||
|
|
notCheckable = true,
|
||
|
|
},
|
||
|
|
|
||
|
|
}
|
||
|
|
BW_UIDropDownMenu_SetAnchor(addon.ContextMenu, 0, 0, "BOTTOMLEFT", parent, "BOTTOMLEFT")
|
||
|
|
BW_EasyMenu(contextMenuData, addon.ContextMenu, parent, 0, 0, "MENU")
|
||
|
|
end
|
||
|
|
|
||
|
|
function BetterWardrobeOutfitEditFrameMixin:ShowForOutfit_CollectionJournal(outfitID, name, parent)
|
||
|
|
BetterWardrobeOutfitFrame:Hide()
|
||
|
|
--Other Addon Sets
|
||
|
|
if outfitID >=6000 then
|
||
|
|
BW_DressingRoomImportButton_OnClicks(outfitID, name, parent)
|
||
|
|
|
||
|
|
--Saved Sets
|
||
|
|
else
|
||
|
|
BetterWardrobeOutfitFrame:ShowPopup(self)
|
||
|
|
self.outfitID = outfitID
|
||
|
|
self.name = name
|
||
|
|
self.EditBox:SetText(name)
|
||
|
|
end
|
||
|
|
end
|