soulbag footer
This commit is contained in:
@@ -212,6 +212,7 @@ function Theme:ApplyToAllFrames()
|
|||||||
"Guda_BagFrame_Toolbar_BagSlot3",
|
"Guda_BagFrame_Toolbar_BagSlot3",
|
||||||
"Guda_BagFrame_Toolbar_BagSlot4",
|
"Guda_BagFrame_Toolbar_BagSlot4",
|
||||||
"Guda_BagFrame_Toolbar_KeyringButton",
|
"Guda_BagFrame_Toolbar_KeyringButton",
|
||||||
|
"Guda_BagFrame_Toolbar_SoulBagButton",
|
||||||
}
|
}
|
||||||
for _, name in ipairs(footerButtons) do
|
for _, name in ipairs(footerButtons) do
|
||||||
local btn = getglobal(name)
|
local btn = getglobal(name)
|
||||||
|
|||||||
+145
-12
@@ -23,6 +23,7 @@ local searchText = ""
|
|||||||
local itemButtons = {}
|
local itemButtons = {}
|
||||||
local slotToButton = {} -- Fast O(1) lookup: slotToButton[bagID][slotID] = button
|
local slotToButton = {} -- Fast O(1) lookup: slotToButton[bagID][slotID] = button
|
||||||
local showKeyring = false -- Toggle for keyring display
|
local showKeyring = false -- Toggle for keyring display
|
||||||
|
local showSoulBag = false -- Toggle for soul bag display
|
||||||
local hiddenBags = {} -- Track which bags are hidden (bagID -> true/false)
|
local hiddenBags = {} -- Track which bags are hidden (bagID -> true/false)
|
||||||
local bagParents = {} -- Per-bag parent frames to carry bagID for Blizzard item button templates
|
local bagParents = {} -- Per-bag parent frames to carry bagID for Blizzard item button templates
|
||||||
local isMerchantOpen = false -- Track whether a vendor window is currently open to prevent auto-closing bags
|
local isMerchantOpen = false -- Track whether a vendor window is currently open to prevent auto-closing bags
|
||||||
@@ -200,6 +201,9 @@ function Guda_BagFrame_OnHide(self)
|
|||||||
-- Hide bag flyout
|
-- Hide bag flyout
|
||||||
BagFrame:HideBagFlyout()
|
BagFrame:HideBagFlyout()
|
||||||
|
|
||||||
|
-- Hide tooltip (it may be showing for soul bag or other footer buttons)
|
||||||
|
GameTooltip:Hide()
|
||||||
|
|
||||||
-- Clear any pending update and work queue items
|
-- Clear any pending update and work queue items
|
||||||
pendingUpdate = false
|
pendingUpdate = false
|
||||||
if addon.Modules.Utils and addon.Modules.Utils.ClearWorkQueue then
|
if addon.Modules.Utils and addon.Modules.Utils.ClearWorkQueue then
|
||||||
@@ -588,10 +592,17 @@ function BagFrame:UpdateBaglineLayout()
|
|||||||
local bag3 = getglobal("Guda_BagFrame_Toolbar_BagSlot3")
|
local bag3 = getglobal("Guda_BagFrame_Toolbar_BagSlot3")
|
||||||
local bag4 = getglobal("Guda_BagFrame_Toolbar_BagSlot4")
|
local bag4 = getglobal("Guda_BagFrame_Toolbar_BagSlot4")
|
||||||
local keyring = getglobal("Guda_BagFrame_Toolbar_KeyringButton")
|
local keyring = getglobal("Guda_BagFrame_Toolbar_KeyringButton")
|
||||||
|
local soulbag = getglobal("Guda_BagFrame_Toolbar_SoulBagButton")
|
||||||
local info = getglobal("Guda_BagFrame_Toolbar_BagSlotsInfo")
|
local info = getglobal("Guda_BagFrame_Toolbar_BagSlotsInfo")
|
||||||
|
|
||||||
|
-- Determine last visible special button for info anchor
|
||||||
|
local lastButton = keyring
|
||||||
|
if soulbag and soulbag:IsShown() then
|
||||||
|
lastButton = soulbag
|
||||||
|
end
|
||||||
|
|
||||||
if hideBagline then
|
if hideBagline then
|
||||||
-- Hide bags 1-4, show only bag0 + keyring
|
-- Hide bags 1-4, show only bag0 + keyring + soulbag
|
||||||
if bag1 then bag1:Hide() end
|
if bag1 then bag1:Hide() end
|
||||||
if bag2 then bag2:Hide() end
|
if bag2 then bag2:Hide() end
|
||||||
if bag3 then bag3:Hide() end
|
if bag3 then bag3:Hide() end
|
||||||
@@ -603,11 +614,17 @@ function BagFrame:UpdateBaglineLayout()
|
|||||||
keyring:SetPoint("LEFT", bag0, "RIGHT", 2, 0)
|
keyring:SetPoint("LEFT", bag0, "RIGHT", 2, 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Anchor info next to keyring
|
-- Anchor soul bag next to keyring
|
||||||
|
if soulbag and soulbag:IsShown() then
|
||||||
|
soulbag:ClearAllPoints()
|
||||||
|
soulbag:SetPoint("LEFT", keyring, "RIGHT", 2, 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Anchor info next to last button
|
||||||
if info then
|
if info then
|
||||||
info:Show()
|
info:Show()
|
||||||
info:ClearAllPoints()
|
info:ClearAllPoints()
|
||||||
info:SetPoint("LEFT", keyring, "RIGHT", 8, 0)
|
info:SetPoint("LEFT", lastButton, "RIGHT", 8, 0)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- Standard horizontal layout - all bags visible
|
-- Standard horizontal layout - all bags visible
|
||||||
@@ -636,15 +653,23 @@ function BagFrame:UpdateBaglineLayout()
|
|||||||
keyring:ClearAllPoints()
|
keyring:ClearAllPoints()
|
||||||
keyring:SetPoint("LEFT", bag4, "RIGHT", 2, 0)
|
keyring:SetPoint("LEFT", bag4, "RIGHT", 2, 0)
|
||||||
end
|
end
|
||||||
|
-- Anchor soul bag next to keyring
|
||||||
|
if soulbag and soulbag:IsShown() then
|
||||||
|
soulbag:ClearAllPoints()
|
||||||
|
soulbag:SetPoint("LEFT", keyring, "RIGHT", 2, 0)
|
||||||
|
end
|
||||||
if info then
|
if info then
|
||||||
info:Show()
|
info:Show()
|
||||||
info:ClearAllPoints()
|
info:ClearAllPoints()
|
||||||
info:SetPoint("LEFT", keyring, "RIGHT", 8, 0)
|
info:SetPoint("LEFT", lastButton, "RIGHT", 8, 0)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Hide flyout when switching to full bagline
|
-- Hide flyout when switching to full bagline
|
||||||
self:HideBagFlyout()
|
self:HideBagFlyout()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Update soul shard count
|
||||||
|
Guda_BagFrame_UpdateSoulBagCount()
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Deferred update state for frame budgeting
|
-- Deferred update state for frame budgeting
|
||||||
@@ -861,15 +886,26 @@ function BagFrame:DisplayItemsByCategory(bagData, isOtherChar, charName)
|
|||||||
local categoryList = Guda_CategoryList
|
local categoryList = Guda_CategoryList
|
||||||
|
|
||||||
-- Categorize all items using centralized function
|
-- Categorize all items using centralized function
|
||||||
|
-- Skip soul bags here; they are handled separately below (like keyring)
|
||||||
local totalItemsCategorized = 0
|
local totalItemsCategorized = 0
|
||||||
for _, bagID in ipairs(addon.Constants.BAGS) do
|
for _, bagID in ipairs(addon.Constants.BAGS) do
|
||||||
if not hiddenBags[bagID] then
|
if not hiddenBags[bagID] then
|
||||||
local bag = bagData[bagID]
|
local isSoulBag = false
|
||||||
if bag and bag.slots then
|
if isOtherChar then
|
||||||
for slotID, itemData in pairs(bag.slots) do
|
local bag = bagData[bagID]
|
||||||
if itemData then
|
isSoulBag = bag and bag.bagType == "soul"
|
||||||
Guda_CategorizeItem(itemData, bagID, slotID, categories, specialItems, isOtherChar)
|
else
|
||||||
totalItemsCategorized = totalItemsCategorized + 1
|
isSoulBag = addon.Modules.Utils:GetSpecializedBagType(bagID) == "soul"
|
||||||
|
end
|
||||||
|
|
||||||
|
if not isSoulBag then
|
||||||
|
local bag = bagData[bagID]
|
||||||
|
if bag and bag.slots then
|
||||||
|
for slotID, itemData in pairs(bag.slots) do
|
||||||
|
if itemData then
|
||||||
|
Guda_CategorizeItem(itemData, bagID, slotID, categories, specialItems, isOtherChar)
|
||||||
|
totalItemsCategorized = totalItemsCategorized + 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -910,6 +946,45 @@ function BagFrame:DisplayItemsByCategory(bagData, isOtherChar, charName)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Handle Soul Bags if visible
|
||||||
|
if showSoulBag then
|
||||||
|
for _, bagID in ipairs(addon.Constants.BAGS) do
|
||||||
|
if not hiddenBags[bagID] then
|
||||||
|
local isSoulBag = false
|
||||||
|
if isOtherChar then
|
||||||
|
local bag = bagData[bagID]
|
||||||
|
isSoulBag = bag and bag.bagType == "soul"
|
||||||
|
else
|
||||||
|
isSoulBag = addon.Modules.Utils:GetSpecializedBagType(bagID) == "soul"
|
||||||
|
end
|
||||||
|
if isSoulBag then
|
||||||
|
local bag = bagData[bagID]
|
||||||
|
if bag and bag.slots then
|
||||||
|
for slotID, itemData in pairs(bag.slots) do
|
||||||
|
if itemData then
|
||||||
|
table.insert(categories["Soul Bag"], {bagID = bagID, slotID = slotID, itemData = itemData})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Ensure Keyring and Soul Bag are in the display list when they have items
|
||||||
|
-- (they may be missing from categoryList if user customized category order)
|
||||||
|
local hasKeyringInList, hasSoulBagInList = false, false
|
||||||
|
for _, catName in ipairs(categoryList) do
|
||||||
|
if catName == "Keyring" then hasKeyringInList = true end
|
||||||
|
if catName == "Soul Bag" then hasSoulBagInList = true end
|
||||||
|
end
|
||||||
|
if not hasKeyringInList and categories["Keyring"] and table.getn(categories["Keyring"]) > 0 then
|
||||||
|
table.insert(categoryList, "Keyring")
|
||||||
|
end
|
||||||
|
if not hasSoulBagInList and categories["Soul Bag"] and table.getn(categories["Soul Bag"]) > 0 then
|
||||||
|
table.insert(categoryList, "Soul Bag")
|
||||||
|
end
|
||||||
|
|
||||||
-- Layout
|
-- Layout
|
||||||
local startX, startY = 10, -10
|
local startX, startY = 10, -10
|
||||||
local currentX, currentY = 0, 0
|
local currentX, currentY = 0, 0
|
||||||
@@ -1222,8 +1297,8 @@ function BagFrame:DisplayItems(bagData, isOtherChar, charName)
|
|||||||
table.insert(bagsToShow, {bagID = bagID, needsSpacing = (i == 1)})
|
table.insert(bagsToShow, {bagID = bagID, needsSpacing = (i == 1)})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- Soul
|
-- Soul (only when soul bag toggle is active)
|
||||||
if table.getn(soulBags) > 0 then
|
if showSoulBag and table.getn(soulBags) > 0 then
|
||||||
for i, bagID in ipairs(soulBags) do
|
for i, bagID in ipairs(soulBags) do
|
||||||
table.insert(bagsToShow, {bagID = bagID, needsSpacing = (i == 1)})
|
table.insert(bagsToShow, {bagID = bagID, needsSpacing = (i == 1)})
|
||||||
end
|
end
|
||||||
@@ -1961,6 +2036,58 @@ function Guda_BagFrame_ToggleKeyring()
|
|||||||
BagFrame:Update()
|
BagFrame:Update()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Soul Bag toggle handler
|
||||||
|
function Guda_BagFrame_ToggleSoulBag()
|
||||||
|
showSoulBag = not showSoulBag
|
||||||
|
|
||||||
|
-- Update button appearance to show toggle state
|
||||||
|
local button = getglobal("Guda_BagFrame_Toolbar_SoulBagButton")
|
||||||
|
if button then
|
||||||
|
if showSoulBag then
|
||||||
|
-- Gold border when active
|
||||||
|
button:SetBackdropBorderColor(1, 0.82, 0, 1)
|
||||||
|
else
|
||||||
|
-- Restore theme border when inactive
|
||||||
|
local fb = addon.Modules.Theme:GetValue("footerButtonBorder") or { 0.30, 0.30, 0.30, 1 }
|
||||||
|
button:SetBackdropBorderColor(fb[1], fb[2], fb[3], fb[4])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Refresh display
|
||||||
|
BagFrame:Update()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Update soul shard count on the soul bag button
|
||||||
|
function Guda_BagFrame_UpdateSoulBagCount()
|
||||||
|
local button = getglobal("Guda_BagFrame_Toolbar_SoulBagButton")
|
||||||
|
if not button or not button:IsShown() then return end
|
||||||
|
|
||||||
|
local count = 0
|
||||||
|
for _, bagID in ipairs(addon.Constants.BAGS) do
|
||||||
|
local bagType = addon.Modules.Utils:GetSpecializedBagType(bagID)
|
||||||
|
if bagType == "soul" then
|
||||||
|
local numSlots = addon.Modules.Utils:GetBagSlotCount(bagID)
|
||||||
|
for slotID = 1, numSlots do
|
||||||
|
local texture, itemCount = GetContainerItemInfo(bagID, slotID)
|
||||||
|
if texture then
|
||||||
|
count = count + (itemCount or 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
button.soulShardCount = count
|
||||||
|
if button.countText then
|
||||||
|
if count > 0 then
|
||||||
|
button.countText:SetText(tostring(count))
|
||||||
|
button.countText:Show()
|
||||||
|
else
|
||||||
|
button.countText:SetText("")
|
||||||
|
button.countText:Hide()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function Guda_BagFrame_Sort()
|
function Guda_BagFrame_Sort()
|
||||||
if currentViewChar then
|
if currentViewChar then
|
||||||
addon:Print("Cannot sort another character's bags!")
|
addon:Print("Cannot sort another character's bags!")
|
||||||
@@ -2900,6 +3027,12 @@ function Guda_BagFrame_ClearBagButtonHighlight()
|
|||||||
if keyringButton then
|
if keyringButton then
|
||||||
keyringButton:UnlockHighlight()
|
keyringButton:UnlockHighlight()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Clear soul bag button highlight
|
||||||
|
local soulBagButton = getglobal("Guda_BagFrame_Toolbar_SoulBagButton")
|
||||||
|
if soulBagButton then
|
||||||
|
soulBagButton:UnlockHighlight()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Initialize
|
-- Initialize
|
||||||
|
|||||||
@@ -550,6 +550,75 @@
|
|||||||
</Scripts>
|
</Scripts>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
|
<!-- Soul Bag Button (Warlock only) -->
|
||||||
|
<Button name="$parent_SoulBagButton" inherits="ItemButtonTemplate">
|
||||||
|
<Size>
|
||||||
|
<AbsDimension x="24" y="24"/>
|
||||||
|
</Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="LEFT" relativePoint="RIGHT" relativeTo="$parent_KeyringButton">
|
||||||
|
<Offset>
|
||||||
|
<AbsDimension x="2" y="0"/>
|
||||||
|
</Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Scripts>
|
||||||
|
<OnLoad>
|
||||||
|
-- Hide borders (same as keyring/bag slots)
|
||||||
|
local normalTexture = getglobal(this:GetName().."NormalTexture")
|
||||||
|
if normalTexture then
|
||||||
|
normalTexture:SetTexture(nil)
|
||||||
|
normalTexture:Hide()
|
||||||
|
end
|
||||||
|
local iconBorder = getglobal(this:GetName().."IconBorder")
|
||||||
|
if iconBorder then
|
||||||
|
iconBorder:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Hide the stock/count text from ItemButtonTemplate
|
||||||
|
local countText = getglobal(this:GetName().."Count")
|
||||||
|
if countText then
|
||||||
|
countText:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Apply footer button backdrop
|
||||||
|
Guda_BagSlot_ApplyBackdrop(this)
|
||||||
|
|
||||||
|
-- Set soul bag icon
|
||||||
|
SetItemButtonTexture(this, "Interface\\AddOns\\Guda\\Assets\\soul")
|
||||||
|
|
||||||
|
this:RegisterForClicks("LeftButtonUp")
|
||||||
|
|
||||||
|
-- Create custom count FontString overlay
|
||||||
|
local shardCount = this:CreateFontString(nil, "OVERLAY", "NumberFontNormal")
|
||||||
|
shardCount:SetPoint("BOTTOMRIGHT", this, "BOTTOMRIGHT", -2, 2)
|
||||||
|
shardCount:SetText("")
|
||||||
|
shardCount:Hide()
|
||||||
|
this.countText = shardCount
|
||||||
|
this.soulShardCount = 0
|
||||||
|
|
||||||
|
-- Check player class — hide button if not Warlock
|
||||||
|
local _, playerClass = UnitClass("player")
|
||||||
|
if playerClass ~= "WARLOCK" then
|
||||||
|
this:Hide()
|
||||||
|
end
|
||||||
|
</OnLoad>
|
||||||
|
<OnClick>
|
||||||
|
Guda_BagFrame_ToggleSoulBag()
|
||||||
|
</OnClick>
|
||||||
|
<OnEnter>
|
||||||
|
GameTooltip:SetOwner(this, "ANCHOR_TOP")
|
||||||
|
GameTooltip:SetText("Soul Bag", 1.0, 1.0, 1.0)
|
||||||
|
local count = this.soulShardCount or 0
|
||||||
|
GameTooltip:AddLine(string.format("%d Soul Shards", count), 0.8, 0.8, 0.8)
|
||||||
|
GameTooltip:Show()
|
||||||
|
</OnEnter>
|
||||||
|
<OnLeave>
|
||||||
|
GameTooltip:Hide()
|
||||||
|
</OnLeave>
|
||||||
|
</Scripts>
|
||||||
|
</Button>
|
||||||
|
|
||||||
<!-- Bag Slots Info Text -->
|
<!-- Bag Slots Info Text -->
|
||||||
<Frame name="$parent_BagSlotsInfo">
|
<Frame name="$parent_BagSlotsInfo">
|
||||||
<Size>
|
<Size>
|
||||||
|
|||||||
@@ -212,6 +212,11 @@ function Guda_InitCategories()
|
|||||||
categoriesCache["Keyring"] = {}
|
categoriesCache["Keyring"] = {}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Always ensure Soul Bag exists (handled specially in BagFrame)
|
||||||
|
if not categoriesCache["Soul Bag"] then
|
||||||
|
categoriesCache["Soul Bag"] = {}
|
||||||
|
end
|
||||||
|
|
||||||
-- Reuse or create specialItems table
|
-- Reuse or create specialItems table
|
||||||
if not specialItemsCache then
|
if not specialItemsCache then
|
||||||
specialItemsCache = {
|
specialItemsCache = {
|
||||||
|
|||||||
Reference in New Issue
Block a user