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

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