From bea4a6ab2346b8940bcad05808c1920a2106aaa3 Mon Sep 17 00:00:00 2001 From: Xan-Asc <119889093+Xan-Asc@users.noreply.github.com> Date: Tue, 9 Apr 2024 16:41:58 -0700 Subject: [PATCH] Added Bag icons for Vanity and Wardrobe unlocks (#52) * Added Bag icons for Vanity and Wardrobe unlocks * Show if item is both Vanity and Wardrobe unlock added related textures * Adjusted icon so edges match up --- ElvUI/Media/SharedMedia.lua | 7 +- ElvUI/Media/Textures/VanityAndWardrobe.blp | Bin 0 -> 2580 bytes ElvUI/Media/Textures/VanityUnlock.blp | Bin 0 -> 2580 bytes ElvUI/Modules/Bags/Bags.lua | 80 ++++++++++++++++++--- ElvUI/Settings/Profile.lua | 2 + ElvUI_OptionsUI/Bags.lua | 20 +++++- ElvUI_OptionsUI/Locales/enUS.lua | 4 ++ 7 files changed, 100 insertions(+), 13 deletions(-) create mode 100644 ElvUI/Media/Textures/VanityAndWardrobe.blp create mode 100644 ElvUI/Media/Textures/VanityUnlock.blp diff --git a/ElvUI/Media/SharedMedia.lua b/ElvUI/Media/SharedMedia.lua index 7e36112..375051e 100644 --- a/ElvUI/Media/SharedMedia.lua +++ b/ElvUI/Media/SharedMedia.lua @@ -7,6 +7,9 @@ function E:TextureString(texString, dataString) end E.Media = { + Atlases = { + BagWardrobeIcon = [[poi-transmogrifier]], -- not elvui + }, Fonts = { ActionMan = M..[[Fonts\ActionMan.ttf]], ContinuumMedium = M..[[Fonts\ContinuumMedium.ttf]], @@ -89,6 +92,8 @@ E.Media = { ArrowUp = M..[[Textures\ArrowUp.tga]], BagJunkIcon = M..[[Textures\BagJunkIcon.blp]], BagQuestIcon = M..[[Textures\BagQuestIcon.tga]], + BagVanityIcon = M..[[Textures\VanityUnlock.blp]], + BagVanityAndWardrobe = M..[[Textures\VanityAndWardrobe.blp]], Black8x8 = M..[[Textures\Black8x8.tga]], White8x8 = [[Interface\BUTTONS\WHITE8X8]], -- not elvui Broom = M..[[Textures\Broom.blp]], @@ -156,4 +161,4 @@ LSM:Register("statusbar", "ElvUI Gloss", E.Media.Textures.NormTex) LSM:Register("statusbar", "ElvUI Norm", E.Media.Textures.NormTex2) LSM:Register("statusbar", "Minimalist", E.Media.Textures.Minimalist) LSM:Register("statusbar", "ElvUI Blank", E.Media.Textures.White8x8) -LSM:Register("background", "ElvUI Blank", E.Media.Textures.White8x8) \ No newline at end of file +LSM:Register("background", "ElvUI Blank", E.Media.Textures.White8x8) diff --git a/ElvUI/Media/Textures/VanityAndWardrobe.blp b/ElvUI/Media/Textures/VanityAndWardrobe.blp new file mode 100644 index 0000000000000000000000000000000000000000..9bd3f989c805431097b8e15feded71b285c520ce GIT binary patch literal 2580 zcmeH|ZA_C_6vxlg*9R!lgx4&AHd=UeNaz+~_7YYCerYzd*7Rx1?06GnH(_>5mTU@A z%UHmE5UUQRY_uaNlo<=G%`zm&C`*CvgHD23V`L7EPMOrLgrM!+ZOQGDCd;<(oIEG@ z{&Md*|9j89H&6K+suw8$;Lt)!irc84;bEt-Cjs2RzJ&cx?7U=vjQ`+(;{hiv!;Lt> zF>cys1vV?NS%H7906$^qe{w|7@p<;kr_vSe0PNY!v*C0*cg37sBl!-qL9copluu;M z944;vFZol0p2mQuaVKTN@hnS0Z2k&bngTKALeXcQ+I^ls5Z4bhX7f{#GI+E>X#8>@ zHeUmLv|*Dpm@1}{BGB~JYpS%bCGyy~mX_fBuH2hsJ^Z_#+MRQckHwe4?@t2H7z#!cDjxB` zU@9-~p_;ccCJuuT03RFh*G?k*6@3HZj=^A%#5Y{2P#2;QOPIOUZ;|deZY7-dJNF2D zi*$q);T$6)WV#4TP;R$LuV0Vs2dDwjcF8OkR#XO!8B8P0o+mQ0f1*D)3iL2G694IF zn|h(R_%dPNa_hOlnS(yU7i}Enn0~@e`1aGx?b_7~TL|}tbM1wLhfL45Ufoh+=Ds8` zQ=qA0SwV^`dcJ`~eZeSz!|_WJiNCOPpt88=@jPMSYW)eX|6#ly`BMcStT$=mtcX1K zkxkp(c_J z$v#MXMdF}9Z(wz_WVkedOYryp&^gvhG_)>eDi;uXrSqcR5?F2s*hXovo#k<=r`1d0L&hZR7s`FjlV)kC%><_yhg| z%U->yim)PF+2LNEoIzmZFh)!186yQ+omPV&ud^HH_u8a%3a$?oM7^kPf6YA`hzIOx zA@pi==eu60p5@UT%TbnEDDIhTO}+V(5kQ0MgFtBuWXd7wij-zUg((PbRg{=T_kSMQ zCVsopX+pr2M1R-N%6acObUxgv3)0xPB0mPP6VE_OC literal 0 HcmV?d00001 diff --git a/ElvUI/Media/Textures/VanityUnlock.blp b/ElvUI/Media/Textures/VanityUnlock.blp new file mode 100644 index 0000000000000000000000000000000000000000..731bc96910ececbb39216599c86abf7ec5f50361 GIT binary patch literal 2580 zcmeH}?N3`}6u?h!3*1tXMnM}*ToVffN~Q2=i6NBY3!VD_>K#aiv^W`{jEzKN>J-*F zGUx{g>Ri?s=-8%hW0tM7(Tt^afOgU)i>}#+jmVM~$4h~t7Ybq@PfH#$Ykc_wIJqbH z{&Jps&Uwyx&dt^Cttt@!0K=vUG>whTV`+!b0c#|e6 z;*RW8V5b5*75L{0r2N&C5plQOakmu;1^_sY6F|bgOoC$|MOIQ4`hi96S_R#JLTBO| zopR)T-YxqBK9l?>+fzbrL*e8S(T#&Na8+nMH0vXAG2c>{Tw~k@q$H5o{i4=s-cw5X z20zj3;4_&GqC2I)6slt1JAUS1n!vnJgW=mkdi94xQ9A*hHm{3?v>@i&%GiYqxIfb$ zHw!}X{Z;LOlxQEpOEm)09$O?r{l7h0QLQ9AM>%imyh)ya%uG3RQD}s(Ne$(`sppN; z8+M*@;mCKrG4dHueso4R%<+A4A{=fj~ud=@Z$vDVHq%U};nfSmZ?f#c;W_a!+L? zji2fSuv+hl>G})7H(x7KEd?m2tsdwd_s?(FBWEnPW8>(n+uUuOXlZ6t zWS%HJ3n3%u%|5~4H{}qZ) z$LGOt9N<0&IyW8HVb#A6wFdi>qIzMu&%5h6`cjZ!!6r^Xy+@;^@ z*2oPW=euEUC~GM`KcByR&=H^a25;Ait@%l_oU6{Szq&o2Y#?}qS*fd|_4vvkGTgVj z0w0)2WRR>6maP8L(caqJNI;~4r}|HKUjbI>aJXg{{lk9CpNlXmW%zeVZH@Q zo?C(DYw`Ll1m*1h8jd4^Z|Vg?HL#;rIj5AE9}eT@$nTzvfL_K$d(8xd(}Et0B81;V z#_Zy-pQ%Hye4H1)tC5)}-{**=sYow6wRX~CmA}O(-#Pnk?LaR2Z)&Y5KWnqw543Dm MI)4OMhyCyTCjd)*!~g&Q literal 0 HcmV?d00001 diff --git a/ElvUI/Modules/Bags/Bags.lua b/ElvUI/Modules/Bags/Bags.lua index 8312b98..0454e0d 100644 --- a/ElvUI/Modules/Bags/Bags.lua +++ b/ElvUI/Modules/Bags/Bags.lua @@ -70,6 +70,13 @@ local SEARCH = SEARCH local SEARCH_STRING = "" +-- item types that will show they have a wardrobe unlock but cannot be unlocked +local BAD_WARDROBE_SUBTYPES = { + ["Thrown"] = true, + ["Fishing Poles"] = true, + ["Miscellaneous"] = true, +} + function B:GetContainerFrame(arg) if type(arg) == "boolean" and arg == true then return B.BankFrame @@ -321,6 +328,9 @@ function B:UpdateSlot(frame, bagID, slotID) slot:Show() slot.questIcon:Hide() slot.JunkIcon:Hide() + slot.unlearnedVanityIcon:Hide() + slot.unlearnedWardrobeIcon:Hide() + slot.unlearnedVanityAndWardrobeIcon:Hide() slot.itemLevel:SetText("") slot.bindType:SetText("") @@ -338,8 +348,9 @@ function B:UpdateSlot(frame, bagID, slotID) slot:SetBackdropBorderColor(unpack(B.ProfessionColors[bagType])) slot.ignoreBorderColors = true elseif clink then - local iLvl, iType, itemEquipLoc, itemPrice - slot.name, _, slot.rarity, iLvl, _, iType, _, _, itemEquipLoc, _, itemPrice = GetItemInfo(clink) + slot.id = GetItemInfoFromHyperlink(clink) + local iLvl, iType, iSubtype, itemEquipLoc, itemPrice + slot.name, _, slot.rarity, iLvl, _, iType, iSubtype, _, itemEquipLoc, _, itemPrice = GetItemInfo(clink) local isQuestItem, questId, isActiveQuest = GetContainerItemQuestInfo(bagID, slotID) local r, g, b @@ -376,14 +387,27 @@ function B:UpdateSlot(frame, bagID, slotID) end end + slot.isUnlearnedVanity = VANITY_ITEMS[slot.id] and not C_VanityCollection.IsCollectionItemOwned(slot.id) + slot.isUnlearnedWardrobe = not (BAD_WARDROBE_SUBTYPES[iSubtype] and iType == "Weapon") and APPEARANCE_ITEM_INFO[slot.id] and not APPEARANCE_ITEM_INFO[slot.id]:GetCollectedID() slot.isJunk = (slot.rarity and slot.rarity == 0) and (itemPrice and itemPrice > 0) and (iType and iType ~= "Quest") slot.junkDesaturate = slot.isJunk and E.db.bags.junkDesaturate + local showVanity = slot.unlearnedVanityIcon and E.db.bags.unlearnedVanityIcon and slot.isUnlearnedVanity + local showWardrobe = slot.unlearnedWardrobeIcon and E.db.bags.unlearnedWardrobeIcon and slot.isUnlearnedWardrobe + + + -- Both Vanity and Wardrobe Unlock + if showVanity and showWardrobe then + slot.unlearnedVanityAndWardrobeIcon:Show() + -- Vanity Unlock Icon + elseif showVanity then + slot.unlearnedVanityIcon:Show() + -- Wardrobe Unlock Icon + elseif showWardrobe then + slot.unlearnedWardrobeIcon:Show() -- Junk Icon - if slot.JunkIcon then - if E.db.bags.junkIcon and slot.isJunk then - slot.JunkIcon:Show() - end + elseif slot.JunkIcon and E.db.bags.junkIcon and slot.isJunk then + slot.JunkIcon:Show() end if B.db.questIcon and (questId and not isActiveQuest) then @@ -663,10 +687,34 @@ function B:Layout(isBank) f.Bags[bagID][slotID].questIcon:Hide() end + if not f.Bags[bagID][slotID].unlearnedVanityAndWardrobeIcon then + local unlearnedVanityAndWardrobeIcon = f.Bags[bagID][slotID]:CreateTexture(nil, "OVERLAY") + unlearnedVanityAndWardrobeIcon:SetTexture(E.Media.Textures.BagVanityAndWardrobe) + unlearnedVanityAndWardrobeIcon:Point("BOTTOMLEFT", 1, 1) + unlearnedVanityAndWardrobeIcon:Hide() + f.Bags[bagID][slotID].unlearnedVanityAndWardrobeIcon = unlearnedVanityAndWardrobeIcon + end + + if not f.Bags[bagID][slotID].unlearnedVanityIcon then + local unlearnedVanityIcon = f.Bags[bagID][slotID]:CreateTexture(nil, "OVERLAY") + unlearnedVanityIcon:SetTexture(E.Media.Textures.BagVanityIcon) + unlearnedVanityIcon:Point("BOTTOMLEFT", 1, 1) + unlearnedVanityIcon:Hide() + f.Bags[bagID][slotID].unlearnedVanityIcon = unlearnedVanityIcon + end + + if not f.Bags[bagID][slotID].unlearnedWardrobeIcon then + local unlearnedWardrobeIcon = f.Bags[bagID][slotID]:CreateTexture(nil, "OVERLAY") + unlearnedWardrobeIcon:SetAtlas(E.Media.Atlases.BagWardrobeIcon) + unlearnedWardrobeIcon:Point("BOTTOMLEFT", 1, 1) + unlearnedWardrobeIcon:Hide() + f.Bags[bagID][slotID].unlearnedWardrobeIcon = unlearnedWardrobeIcon + end + if not f.Bags[bagID][slotID].JunkIcon then local JunkIcon = f.Bags[bagID][slotID]:CreateTexture(nil, "OVERLAY") JunkIcon:SetTexture(E.Media.Textures.BagJunkIcon) - JunkIcon:Point("TOPLEFT", 1, 0) + JunkIcon:Point("BOTTOMLEFT", 1, 1) JunkIcon:Hide() f.Bags[bagID][slotID].JunkIcon = JunkIcon end @@ -702,6 +750,18 @@ function B:Layout(isBank) f.Bags[bagID][slotID]:SetID(slotID) f.Bags[bagID][slotID]:Size(buttonSize) + if f.Bags[bagID][slotID].unlearnedVanityAndWardrobeIcon then + f.Bags[bagID][slotID].unlearnedVanityAndWardrobeIcon:Size(buttonSize/2) + end + + if f.Bags[bagID][slotID].unlearnedVanityIcon then + f.Bags[bagID][slotID].unlearnedVanityIcon:Size(buttonSize/2) + end + + if f.Bags[bagID][slotID].unlearnedWardrobeIcon then + f.Bags[bagID][slotID].unlearnedWardrobeIcon:Size(buttonSize/2) + end + if f.Bags[bagID][slotID].JunkIcon then f.Bags[bagID][slotID].JunkIcon:Size(buttonSize/2) end @@ -1106,7 +1166,7 @@ end local function BagUpdate(self, bagIDs) for bagID in pairs(bagIDs) do - B.OnEvent(self, "BAG_UPDATE", bagID) + B.OnEvent(self, "BAG_UPDATE", bagID) end end @@ -1459,6 +1519,7 @@ function B:ToggleBags(id) if id and (GetContainerNumSlots(id) == 0) then return end --Closes a bag when inserting a new container.. if not B.BagFrame:IsShown() then + B:UpdateAllBagSlots() B:OpenBags() -- else -- B:CloseBags() @@ -1469,6 +1530,7 @@ function B:ToggleBackpack() if IsOptionFrameOpen() then return end if IsBagOpen(0) then + B:UpdateAllBagSlots() B:OpenBags() PlaySound("igBackPackOpen") else @@ -1863,4 +1925,4 @@ local function InitializeCallback() B:Initialize() end -E:RegisterModule(B:GetName(), InitializeCallback) \ No newline at end of file +E:RegisterModule(B:GetName(), InitializeCallback) diff --git a/ElvUI/Settings/Profile.lua b/ElvUI/Settings/Profile.lua index b80c749..589f101 100644 --- a/ElvUI/Settings/Profile.lua +++ b/ElvUI/Settings/Profile.lua @@ -165,6 +165,8 @@ P.bags = { moneyCoins = true, junkIcon = false, junkDesaturate = true, + unlearnedVanityIcon = false, + unlearnedWardrobeIcon = false, ignoredItems = {}, itemLevel = true, itemLevelThreshold = 1, diff --git a/ElvUI_OptionsUI/Bags.lua b/ElvUI_OptionsUI/Bags.lua index 48b0276..5b2a5bf 100644 --- a/ElvUI_OptionsUI/Bags.lua +++ b/ElvUI_OptionsUI/Bags.lua @@ -149,8 +149,22 @@ E.Options.args.bags = { name = L["Disable Bank Sort"], set = function(info, value) E.db.bags[info[#info]] = value B:ToggleSortButtonState(true) end }, - countGroup = { + unlearnedVanityIcon = { order = 16, + type = "toggle", + name = L["Unlearned Vanity"], + desc = L["Unlearned Vanity Desc"], + set = function(info, value) E.db.bags[info[#info]] = value B:UpdateAllBagSlots() end + }, + unlearnedWardrobeIcon = { + order = 17, + type = "toggle", + name = L["Unlearned Wardrobe"], + desc = L["Unlearned Wardrobe Desc"], + set = function(info, value) E.db.bags[info[#info]] = value B:UpdateAllBagSlots() end + }, + countGroup = { + order = 18, type = "group", name = L["Item Count Font"], guiInline = true, @@ -195,7 +209,7 @@ E.Options.args.bags = { } }, itemLevelGroup = { - order = 17, + order = 19, type = "group", name = L["Item Level"], guiInline = true, @@ -794,4 +808,4 @@ E.Options.args.bags = { } } } -} \ No newline at end of file +} diff --git a/ElvUI_OptionsUI/Locales/enUS.lua b/ElvUI_OptionsUI/Locales/enUS.lua index bde98d4..5989b66 100644 --- a/ElvUI_OptionsUI/Locales/enUS.lua +++ b/ElvUI_OptionsUI/Locales/enUS.lua @@ -1185,6 +1185,10 @@ L["You need to hold this modifier down in order to blacklist an aura by right-cl L["Your Auras First"] = true L["xOffset"] = true L["yOffset"] = true +L["Unlearned Vanity"] = true +L["Unlearned Vanity Desc"] = "Adds an Icon to Unlearned Vanity Items. This has a higher priority than Wardrobe or Junk Icons" +L["Unlearned Wardrobe"] = true +L["Unlearned Wardrobe Desc"] = "Adds an Icon to Unlearned Wardrobe Items. This has a higher priority than Junk Icons and a lower priority than Vanity." L["ACTIONBARS_DESC"] = "Modify the actionbar settings." L["AURAS_DESC"] = "Configure the aura icons that appear near the minimap."