fix: show bagframes for bank

This commit is contained in:
Salikh Gurgenidze
2025-11-17 23:17:30 +04:00
parent 7eec28f018
commit be24515c4b
10 changed files with 622 additions and 15 deletions
+363 -12
View File
@@ -9,6 +9,7 @@ addon.Modules.BankFrame = BankFrame
local currentViewChar = nil
local searchText = ""
local isReadOnlyMode = false -- Track if viewing saved bank (read-only) or live bank (interactive)
local hiddenBankBags = {} -- Track which bank bags are hidden (bagID -> true/false)
-- OnLoad
function Guda_BankFrame_OnLoad(self)
@@ -20,10 +21,23 @@ function Guda_BankFrame_OnLoad(self)
end
addon:Debug("Bank frame loaded")
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("Guda debug: Guda_BankFrame_OnLoad fired")
else
print("Guda debug: Guda_BankFrame_OnLoad fired")
end
end
-- OnShow
function Guda_BankFrame_OnShow(self)
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("Guda debug: Guda_BankFrame_OnShow fired (readOnly="..tostring(isReadOnlyMode)..", currentViewChar="..tostring(currentViewChar)..")")
else
print("Guda debug: Guda_BankFrame_OnShow fired")
end
if BankFrame.EnsureBagButtonsInitialized then
BankFrame:EnsureBagButtonsInitialized()
end
BankFrame:Update()
end
@@ -137,20 +151,22 @@ function BankFrame:DisplayItems(bankData, isOtherChar, charName)
local itemContainer = getglobal("Guda_BankFrame_ItemContainer")
for _, bagID in ipairs(addon.Constants.BANK_BAGS) do
local bag = bankData[bagID]
-- Skip bags that are hidden
if not hiddenBankBags[bagID] then
local bag = bankData[bagID]
-- Get slot count for this bag
local numSlots
if isOtherChar and bag and bag.numSlots then
-- Use stored slot count for other characters
numSlots = bag.numSlots
else
-- Use current character's bag slot count
numSlots = addon.Modules.Utils:GetBagSlotCount(bagID)
end
-- Get slot count for this bag
local numSlots
if isOtherChar and bag and bag.numSlots then
-- Use stored slot count for other characters
numSlots = bag.numSlots
else
-- Use current character's bag slot count
numSlots = addon.Modules.Utils:GetBagSlotCount(bagID)
end
-- Only show bags that have slots
if numSlots and numSlots > 0 then
-- Only show bags that have slots
if numSlots and numSlots > 0 then
-- Iterate through ALL slots (1 to numSlots) to show empty slots too
for slot = 1, numSlots do
local itemData = bag and bag.slots and bag.slots[slot] or nil
@@ -160,6 +176,12 @@ function BankFrame:DisplayItems(bankData, isOtherChar, charName)
local button = Guda_GetItemButton(itemContainer)
-- Ensure this is NOT a bag slot button
if button.isBagSlot then
addon:Debug("WARNING: Got a bag slot button from item pool, skipping!")
break
end
-- Position button
local xPos = x + (col * (buttonSize + spacing))
local yPos = y - (row * (buttonSize + spacing))
@@ -178,6 +200,7 @@ function BankFrame:DisplayItems(bankData, isOtherChar, charName)
row = row + 1
end
end
end
end
end
@@ -603,6 +626,65 @@ function BankFrame:ShowGudaButton()
end
end
-- Ensure bank bag buttons are present; create them if XML did not
function BankFrame:EnsureBagButtonsInitialized()
local toolbar = getglobal("Guda_BankFrame_Toolbar")
if not toolbar then return end
local function ensureButton(suffix, bagID)
local name = "Guda_BankFrame_Toolbar_" .. suffix
local btn = getglobal(name)
if not btn then
btn = CreateFrame("Button", name, toolbar, "ItemButtonTemplate")
-- Anchor sequenced to the left; position similar to XML
if suffix == "BankBagMain" then
btn:SetSize(24, 24)
btn:SetPoint("LEFT", toolbar, "LEFT", 13, 0)
else
-- Determine previous button
local prev
if bagID == 5 then prev = getglobal("Guda_BankFrame_Toolbar_BankBagMain")
else prev = getglobal("Guda_BankFrame_Toolbar_BankBag"..tostring(bagID-1)) end
btn:SetSize(24, 24)
if prev then
btn:SetPoint("LEFT", prev, "RIGHT", 2, 0)
else
btn:SetPoint("LEFT", toolbar, "LEFT", 13, 0)
end
end
-- Hook mouseover tooltip like XML
btn:SetScript("OnEnter", function()
Guda_BankBagSlot_OnEnter(this, bagID)
Guda_BankFrame_HighlightBagSlots(bagID)
end)
btn:SetScript("OnLeave", function()
GameTooltip:Hide()
Guda_BankFrame_ClearHighlightedSlots()
end)
end
-- Run our OnLoad logic (will also register events and initial update)
Guda_BankBagSlot_OnLoad(btn, bagID)
return btn
end
-- Main (-1) and 5..10
ensureButton("BankBagMain", -1)
for bagID=5,10 do
ensureButton("BankBag"..tostring(bagID), bagID)
end
end
-- Helper: map bank bagID (5..10) to bankButtonID (1..6) and inventory slot id (Vanilla requires second arg = 1)
function BankFrame:GetBankInvSlotForBagID(bagID)
if not bagID or bagID == -1 then return nil, nil end
local bankButtonID = bagID - 4
-- Some clients accept bagID, but Vanilla expects bankButtonID with isBag=1
local invSlot = BankButtonIDToInvSlotID(bankButtonID, 1)
return invSlot, bankButtonID
end
-- Initialize
function BankFrame:Initialize()
-- Hide Blizzard bank frame on load (pfUI style)
@@ -616,6 +698,11 @@ function BankFrame:Initialize()
-- Create Guda button on Blizzard BankFrame
self:CreateGudaButtonOnBlizzardUI()
-- Ensure our bank bag buttons exist even if XML failed to create them
if self.EnsureBagButtonsInitialized then
self:EnsureBagButtonsInitialized()
end
-- Update when bank is opened
addon.Modules.Events:OnBankOpen(function()
-- Delay showing custom bank to let TransmogUI finish processing
@@ -635,6 +722,7 @@ function BankFrame:Initialize()
customBankFrame:Show()
end
addon.Modules.BankFrame:EnsureBagButtonsInitialized()
addon.Modules.BankFrame:Update()
end
end)
@@ -667,4 +755,267 @@ function BankFrame:Initialize()
end)
addon:Debug("Bank frame initialized")
end
-- Bank Bag Slot Button Handlers
-- OnLoad handler for bank bag slot buttons
function Guda_BankBagSlot_OnLoad(button, bagID)
-- Debug: bag slot OnLoad
local btnName = (button and button.GetName) and button:GetName() or tostring(button)
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("Guda debug: Guda_BankBagSlot_OnLoad for "..tostring(btnName).." bagID="..tostring(bagID))
else
print("Guda debug: Guda_BankBagSlot_OnLoad")
end
-- Hide borders from ItemButtonTemplate
local buttonName = button:GetName()
-- Hide the normal texture border
local normalTexture = getglobal(buttonName .. "NormalTexture")
if normalTexture then
normalTexture:SetTexture(nil)
normalTexture:Hide()
end
-- Hide icon border
local iconBorder = getglobal(buttonName .. "IconBorder")
if iconBorder then
iconBorder:Hide()
end
-- Mark this as a bag slot button, NOT an item button
button.isBagSlot = true
button.hasItem = nil
-- Set up the button with proper ID
button.bagID = bagID
-- Set the inventory slot ID so the button knows which slot it represents
if bagID ~= -1 then
local bankButtonID = bagID - 4
-- In 1.12 need the second arg = 1 for bank bag inventory slots
local invSlot = BankButtonIDToInvSlotID(bagID, 1)
button:SetID(invSlot)
end
-- Register for updates
button:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED")
button:RegisterEvent("PLAYERBANKSLOTS_CHANGED")
button:RegisterEvent("ITEM_LOCK_CHANGED")
button:RegisterEvent("PLAYER_MONEY")
button:SetScript("OnEvent", function()
Guda_BankBagSlot_Update(this, this.bagID)
end)
-- Initial update
Guda_BankBagSlot_Update(button, bagID)
end
-- Update bank bag slot button texture
function Guda_BankBagSlot_Update(button, bagID)
-- Debug: function initialization
local btnName = (button and button.GetName) and button:GetName() or tostring(button)
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("Guda debug: Guda_BankBagSlot_Update init for "..tostring(btnName).." bagID="..tostring(bagID))
else
print("Guda debug: Guda_BankBagSlot_Update init")
end
local isHidden = hiddenBankBags[bagID]
if bagID == -1 then
-- Main bank bag - use bank icon
SetItemButtonTexture(button, "Interface\\Buttons\\Button-Backpack-Up")
-- Dim if hidden
if isHidden then
SetItemButtonTextureVertexColor(button, 0.4, 0.4, 0.4)
else
SetItemButtonTextureVertexColor(button, 1.0, 1.0, 1.0)
end
button:Show()
return
end
-- Bank bag slots 5-10 correspond to bank buttons 1-6
local bankButtonID = bagID - 4
-- In 1.12, BankButtonIDToInvSlotID needs second arg = 1 for bank bag slots
local invSlot = BankButtonIDToInvSlotID(bagID, 1)
-- Check if this slot is purchased
local numSlots = GetNumBankSlots()
local isPurchased = (bankButtonID <= numSlots)
-- Get bag texture directly from inventory (more reliable on 1.12)
local texture = GetInventoryItemTexture("player", invSlot)
-- Debug details for diagnosis
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("Guda debug: bag="..tostring(bagID).." bankBtn="..tostring(bankButtonID).." invSlot="..tostring(invSlot).." purchased="..tostring(isPurchased).." tex="..tostring(texture))
end
if texture then
-- Bag is equipped in this slot and we have the texture
SetItemButtonTexture(button, texture)
-- Dim if hidden
if isHidden then
SetItemButtonTextureVertexColor(button, 0.4, 0.4, 0.4)
else
SetItemButtonTextureVertexColor(button, 1.0, 1.0, 1.0)
end
-- Set texture coordinates to crop the icon (1.12 uses IconTexture)
local icon = getglobal(button:GetName() .. "IconTexture") or getglobal(button:GetName() .. "Icon")
if icon then
icon:SetTexCoord(0.08, 0.92, 0.08, 0.92)
end
button:Show()
elseif isPurchased then
-- Slot is purchased but no bag equipped
SetItemButtonTexture(button, "Interface\\PaperDoll\\UI-PaperDoll-Slot-Bag")
SetItemButtonTextureVertexColor(button, 1.0, 1.0, 1.0)
button:Show()
else
-- Slot not purchased - show locked/greyed placeholder
SetItemButtonTexture(button, "Interface\\PaperDoll\\UI-PaperDoll-Slot-Bag")
SetItemButtonTextureVertexColor(button, 0.5, 0.5, 0.5)
button:Show()
end
end
-- OnClick handler for bank bag slots
function Guda_BankBagSlot_OnClick(button, bagID)
-- Shift-click: Purchase slot or equip/remove bag (original behavior)
if IsShiftKeyDown() then
local bankButtonID = bagID - 4
local numSlots = GetNumBankSlots()
local isPurchased = (bankButtonID <= numSlots)
local invSlot = BankFrame:GetBankInvSlotForBagID(bagID)
if bagID == -1 then
return -- Can't interact with main bank bag
end
if not isPurchased then
-- Slot not purchased - try to purchase it
StaticPopup_Show("CONFIRM_BUY_BANK_SLOT")
else
-- Slot is purchased - handle bag equipping/removing
if CursorHasItem() then
PickupInventoryItem(invSlot)
else
local hasItem = GetInventoryItemTexture("player", invSlot)
if hasItem then
PickupInventoryItem(invSlot)
end
end
end
return
end
-- Regular click: Toggle bag visibility
hiddenBankBags[bagID] = not hiddenBankBags[bagID]
-- Update bag slot visual (dim/undim)
Guda_BankBagSlot_Update(button, bagID)
-- Refresh the bank display
BankFrame:Update()
addon:Debug(string.format("Bank bag %d visibility toggled: %s", bagID, hiddenBankBags[bagID] and "hidden" or "visible"))
end
-- OnEnter handler for tooltip
function Guda_BankBagSlot_OnEnter(button, bagID)
GameTooltip:SetOwner(button, "ANCHOR_TOP")
if bagID == -1 then
-- Main bank bag tooltip
GameTooltip:SetText("Bank", 1.0, 1.0, 1.0)
local numSlots = 24
GameTooltip:AddLine(string.format("%d Slots", numSlots), 0.8, 0.8, 0.8)
if hiddenBankBags[bagID] then
GameTooltip:AddLine("(Hidden - Click to show)", 0.8, 0.5, 0.5)
else
GameTooltip:AddLine("(Click to hide)", 0.5, 0.8, 0.5)
end
else
local invSlot, bankButtonID = BankFrame:GetBankInvSlotForBagID(bagID)
local numSlots = GetNumBankSlots()
local isPurchased = (bankButtonID and bankButtonID <= numSlots)
local hasItem = invSlot and GetInventoryItemTexture("player", invSlot)
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("Guda debug: OnEnter bag="..tostring(bagID).." bankBtn="..tostring(bankButtonID).." invSlot="..tostring(invSlot).." hasItem="..tostring(hasItem ~= nil))
end
if hasItem then
-- Show bag item tooltip
GameTooltip:SetInventoryItem("player", invSlot)
if hiddenBankBags[bagID] then
GameTooltip:AddLine("(Hidden - Click to show)", 0.8, 0.5, 0.5)
else
GameTooltip:AddLine("(Click to hide)", 0.5, 0.8, 0.5)
end
elseif isPurchased then
-- Empty purchased slot
GameTooltip:SetText(string.format("Bank Bag Slot %d", bankButtonID or -1), 1.0, 1.0, 1.0)
GameTooltip:AddLine("Empty", 0.8, 0.8, 0.8)
GameTooltip:AddLine("Shift+Click to equip bag", 0.5, 0.5, 0.5)
else
-- Unpurchased slot
GameTooltip:SetText(string.format("Bank Bag Slot %d", bankButtonID or -1), 1.0, 1.0, 1.0)
local cost = GetBankSlotCost(numSlots)
GameTooltip:AddLine("Shift+Click to purchase", 0.5, 1.0, 0.5)
GameTooltip:AddLine(addon.Modules.Utils:FormatMoney(cost, false, true), 1, 1, 1)
end
end
GameTooltip:Show()
end
-- Highlight all item slots belonging to a specific bank bag by dimming others
function Guda_BankFrame_HighlightBagSlots(bagID)
local itemContainer = getglobal("Guda_BankFrame_ItemContainer")
if not itemContainer then
addon:Debug("BankFrame HighlightBagSlots: itemContainer not found")
return
end
local highlightCount = 0
local dimCount = 0
-- Iterate through all children (item buttons)
local children = { itemContainer:GetChildren() }
for _, button in ipairs(children) do
-- Check if this is an item button
if button.hasItem ~= nil and button:IsShown() and not button.isBagSlot then
if button.bagID == bagID then
-- This button belongs to the hovered bag - keep it bright
button:SetAlpha(1.0)
highlightCount = highlightCount + 1
else
-- This button belongs to a different bag - dim it
button:SetAlpha(0.25)
dimCount = dimCount + 1
end
end
end
addon:Debug(string.format("BankFrame HighlightBagSlots: Highlighted %d slots, dimmed %d slots for bagID %d", highlightCount, dimCount, bagID))
end
-- Clear all highlighting by restoring full opacity to all slots
function Guda_BankFrame_ClearHighlightedSlots()
local itemContainer = getglobal("Guda_BankFrame_ItemContainer")
if not itemContainer then return end
-- Iterate through all children (item buttons)
local children = { itemContainer:GetChildren() }
for _, button in ipairs(children) do
-- Check if this is an item button
if button.hasItem ~= nil and button:IsShown() and not button.isBagSlot then
-- Restore full opacity
button:SetAlpha(1.0)
end
end
end