diff --git a/Core/Tooltip.lua b/Core/Tooltip.lua index 43004ef..f81c73a 100644 --- a/Core/Tooltip.lua +++ b/Core/Tooltip.lua @@ -14,8 +14,9 @@ end -- Count items for a specific character local function CountItemsForCharacter(itemID, characterData) - local total = 0 - + local bagCount = 0 + local bankCount = 0 + -- Count bags if characterData.bags then for bagID, bagData in pairs(characterData.bags) do @@ -24,15 +25,31 @@ local function CountItemsForCharacter(itemID, characterData) if itemData and itemData.link then local slotItemID = GetItemIDFromLink(itemData.link) if slotItemID == itemID then - total = total + (itemData.count or 1) + bagCount = bagCount + (itemData.count or 1) end end end end end end - - return total + + -- Count bank + if characterData.bank then + for bagID, bagData in pairs(characterData.bank) do + if bagData and bagData.slots then + for slotID, itemData in pairs(bagData.slots) do + if itemData and itemData.link then + local slotItemID = GetItemIDFromLink(itemData.link) + if slotItemID == itemID then + bankCount = bankCount + (itemData.count or 1) + end + end + end + end + end + end + + return bagCount, bankCount end -- Get class color @@ -58,42 +75,55 @@ function Tooltip:AddInventoryInfo(tooltip, link) addon:Debug("Processing item ID: " .. itemID) - local totalCount = 0 + local totalBags = 0 + local totalBank = 0 local characterCounts = {} - + -- Count items across all characters for charName, charData in pairs(Guda_DB.characters) do - local count = CountItemsForCharacter(itemID, charData) - if count > 0 then - totalCount = totalCount + count + local bagCount, bankCount = CountItemsForCharacter(itemID, charData) + if bagCount > 0 or bankCount > 0 then + totalBags = totalBags + bagCount + totalBank = totalBank + bankCount table.insert(characterCounts, { name = charData.name or charName, classToken = charData.classToken, - count = count + bagCount = bagCount, + bankCount = bankCount }) - addon:Debug("Found " .. count .. " items on " .. charName) + addon:Debug("Found " .. (bagCount + bankCount) .. " items on " .. charName .. " (Bags: " .. bagCount .. ", Bank: " .. bankCount .. ")") end end - + + local totalCount = totalBags + totalBank + -- Only add to tooltip if we found items if totalCount > 0 then addon:Debug("Adding inventory info - Total: " .. totalCount) - + tooltip:AddLine(" ") tooltip:AddLine("Inventory", 0.7, 0.7, 0.7) - tooltip:AddDoubleLine("Total: " .. totalCount, "", 1, 1, 1) - + tooltip:AddDoubleLine("Total: " .. totalCount, "(Bags: " .. totalBags .. " | Bank: " .. totalBank .. ")", 1, 1, 1, 0.7, 0.7, 0.7) + -- Sort characters by name - table.sort(characterCounts, function(a, b) - return a.name < b.name + table.sort(characterCounts, function(a, b) + return a.name < b.name end) - - -- Add character lines + + -- Add character lines with bag and bank breakdown for _, charInfo in ipairs(characterCounts) do local r, g, b = GetClassColor(charInfo.classToken) - tooltip:AddDoubleLine(charInfo.name, "Bags: " .. charInfo.count, r, g, b, 0.7, 0.7, 0.7) + local countText = "" + if charInfo.bagCount > 0 and charInfo.bankCount > 0 then + countText = "Bags: " .. charInfo.bagCount .. " | Bank: " .. charInfo.bankCount + elseif charInfo.bagCount > 0 then + countText = "Bags: " .. charInfo.bagCount + else + countText = "Bank: " .. charInfo.bankCount + end + tooltip:AddDoubleLine(charInfo.name, countText, r, g, b, 0.7, 0.7, 0.7) end - + tooltip:Show() else addon:Debug("No items found for ID: " .. itemID) @@ -102,7 +132,7 @@ end function Tooltip:Initialize() addon:Print("Initializing tooltip module...") - + -- Hook SetBagItem local oldSetBagItem = GameTooltip.SetBagItem function GameTooltip:SetBagItem(bag, slot) @@ -112,7 +142,7 @@ function Tooltip:Initialize() Tooltip:AddInventoryInfo(self, link) end end - + -- Hook SetHyperlink for chat links local oldSetHyperlink = GameTooltip.SetHyperlink function GameTooltip:SetHyperlink(link) @@ -121,7 +151,7 @@ function Tooltip:Initialize() Tooltip:AddInventoryInfo(self, link) end end - + -- Hook SetInventoryItem for character paperdoll local oldSetInventoryItem = GameTooltip.SetInventoryItem function GameTooltip:SetInventoryItem(unit, slot) @@ -131,7 +161,7 @@ function Tooltip:Initialize() Tooltip:AddInventoryInfo(self, link) end end - + -- Also hook ItemRefTooltip for chat links if ItemRefTooltip then local oldItemRefSetHyperlink = ItemRefTooltip.SetHyperlink @@ -148,23 +178,14 @@ function Tooltip:Initialize() addon:Debug("Tooltip cache cleared") end - -- Register for bag updates in Initialize - function Tooltip:Initialize() - addon:Print("Initializing tooltip module...") - - -- Your existing hook code... - - -- Clear cache on bag updates - local frame = CreateFrame("Frame") - frame:RegisterEvent("BAG_UPDATE") - frame:SetScript("OnEvent", function() - if event == "BAG_UPDATE" then - Tooltip:ClearCache() - end - end) - - addon:Print("Tooltip item-count integration enabled") - end - + -- Clear cache on bag updates + local frame = CreateFrame("Frame") + frame:RegisterEvent("BAG_UPDATE") + frame:SetScript("OnEvent", function() + if event == "BAG_UPDATE" then + Tooltip:ClearCache() + end + end) + addon:Print("Tooltip item-count integration enabled") end \ No newline at end of file diff --git a/README.md b/README.md index 4dcacf3..0c25546 100644 --- a/README.md +++ b/README.md @@ -5,32 +5,31 @@ A comprehensive bag and bank management addon for Turtle WoW (1.12.1). ## Features ### 🎒 Bag Management + - **Unified Bag View**: All your bags in one window - **Smart Sorting**: Sort by quality, name, or item type - **Search Functionality**: Quickly find items with the search box - **Quality Borders**: Visual quality indicators on items ### 🏦 Bank Management + - **Bank Viewing**: View your bank from anywhere (cached data) - **Bank Sorting**: Organize your bank with one click - **Persistent Storage**: Bank contents saved and viewable offline ### 👥 Multi-Character Support + - **Cross-Character Viewing**: View any character's bags and bank - **Money Tracking**: See total gold across all characters - **Character Selector**: Easy switching between characters - **Faction Filtering**: Only shows characters of the same faction ### 💰 Money Display + - **Current Character**: Shows your current gold/silver/copper - **Total Money**: Displays combined wealth across all characters - **Per-Character**: View each character's money in the selector -### 💾 Auto-Save System -- **Auto-Save**: Automatically saves every 30 minutes -- **Logout Save**: Saves all data when you log out -- **Manual Save**: `/guda save` to save anytime - ## Slash Commands ``` @@ -50,18 +49,21 @@ A comprehensive bag and bank management addon for Turtle WoW (1.12.1). ## How to Use ### Basic Usage + 1. Press **B** or type `/guda` to open your bags 2. Click **Characters** button to view other characters 3. Click **Bank** button to view your bank (cached) 4. Click **Sort** to organize your bags ### Viewing Other Characters + 1. Type `/guda chars` or click the **Characters** button 2. Select a character from the list 3. View their bags and bank contents 4. Click **Current Character** to return to your bags ### Sorting + - **Sort Bags**: Click the **Sort** button or `/guda sort` - **Sort Bank**: Click **Sort Bank** button (must be at bank) or `/guda sortbank` - **Sort Methods**: Quality (default), Name, or Type @@ -72,22 +74,26 @@ A comprehensive bag and bank management addon for Turtle WoW (1.12.1). ## Features in Detail ### Bag Scanner + - Automatically scans bags on login and updates - Tracks all items with full details (name, quality, count, etc.) - Updates in real-time as you loot/move items ### Bank Scanner + - Scans bank when you open it - Saves bank contents for offline viewing - Updates automatically while bank is open ### Money Tracker + - Tracks money changes in real-time - Shows current character money - Calculates total across all characters - Per-character money in character selector ### Data Storage + - Saves to `Guda_DB` (global) - Character settings in `Guda_CharDB` - Persistent across sessions @@ -96,6 +102,7 @@ A comprehensive bag and bank management addon for Turtle WoW (1.12.1). ## Configuration Currently all configuration is automatic. Future versions may include: + - Customizable sort methods - Buttons per row - Filter options @@ -114,6 +121,7 @@ Currently all configuration is automatic. Future versions may include: ## Technical Details ### Saved Variables + - `Guda_DB`: Global database (all characters) - Character data (bags, bank, money) - Last update timestamps @@ -122,11 +130,13 @@ Currently all configuration is automatic. Future versions may include: - Sort method ### Auto-Save Schedule + - Every 30 minutes while playing - On player logout - Manual: `/guda save` ### Events Monitored + - `BAG_UPDATE`: Bag content changes - `BANKFRAME_OPENED`: Bank opened - `BANKFRAME_CLOSED`: Bank closed @@ -146,6 +156,7 @@ For bugs or feature requests, please report them in-game or on the forums. ## Changelog ### Version 1.0.0 + - Initial release - Bag viewing and sorting - Bank viewing and sorting diff --git a/UI/BagFrame.lua b/UI/BagFrame.lua index 42df21b..0a44d3e 100644 --- a/UI/BagFrame.lua +++ b/UI/BagFrame.lua @@ -86,8 +86,17 @@ end -- OnHide function Guda_BagFrame_OnHide(self) - -- Release buttons - Guda_ReleaseAllButtons() + -- Only release buttons that belong to this frame + local itemContainer = getglobal("Guda_BagFrame_ItemContainer") + if itemContainer then + local children = { itemContainer:GetChildren() } + for _, child in ipairs(children) do + if child.hasItem ~= nil then -- It's an item button + child:Hide() + child:ClearAllPoints() + end + end + end end -- Toggle visibility @@ -117,8 +126,17 @@ function BagFrame:Update() return end - -- Clear existing buttons - Guda_ReleaseAllButtons() + -- Only release buttons that belong to this frame + local itemContainer = getglobal("Guda_BagFrame_ItemContainer") + if itemContainer then + local children = { itemContainer:GetChildren() } + for _, child in ipairs(children) do + if child.hasItem ~= nil then -- It's an item button + child:Hide() + child:ClearAllPoints() + end + end + end local bagData local isOtherChar = false @@ -441,10 +459,8 @@ function BagFrame:UpdateBagSlotsInfo(bagData, isOtherChar) end end - local freeSlots = totalSlots - usedSlots - - -- Format: "56 / 80" (free / total) - infoText:SetText(string.format("%d / %d", freeSlots, totalSlots)) + -- Format: "24 / 80" (used / total) + infoText:SetText(string.format("%d / %d", usedSlots, totalSlots)) infoText:SetTextColor(0.7, 0.7, 0.7) end @@ -489,6 +505,28 @@ function BagFrame:SetupToolbarTooltip() addon:Debug("Toolbar tooltip handlers set up") end +-- Save bag frame position (always as BOTTOMRIGHT) +local function SaveBagFramePosition() + local frame = getglobal("Guda_BagFrame") + if not frame or not addon or not addon.Modules or not addon.Modules.DB then return end + + -- Always save as BOTTOMRIGHT coordinates + local right = frame:GetRight() + local bottom = frame:GetBottom() + local screenWidth = GetScreenWidth() + + if right and bottom and screenWidth then + local xOffset = right - screenWidth + local yOffset = bottom + + addon.Modules.DB:SetSetting("bagFramePosition", { + point = "BOTTOMRIGHT", + x = xOffset, + y = yOffset + }) + end +end + -- Create transparent overlay for money tooltip function BagFrame:EnsureMoneyTooltipOverlay() local overlayName = "Guda_BagFrame_MoneyTooltipOverlay" @@ -1006,28 +1044,6 @@ local function HookDefaultBags() end end --- Save bag frame position (always as BOTTOMRIGHT) -local function SaveBagFramePosition() - local frame = getglobal("Guda_BagFrame") - if not frame or not addon or not addon.Modules or not addon.Modules.DB then return end - - -- Always save as BOTTOMRIGHT coordinates - local right = frame:GetRight() - local bottom = frame:GetBottom() - local screenWidth = GetScreenWidth() - - if right and bottom and screenWidth then - local xOffset = right - screenWidth - local yOffset = bottom - - addon.Modules.DB:SetSetting("bagFramePosition", { - point = "BOTTOMRIGHT", - x = xOffset, - y = yOffset - }) - end -end - -- Update lock state (controls whether frame is draggable) function BagFrame:UpdateLockState() -- Safety check: ensure addon and modules exist diff --git a/UI/BankFrame.lua b/UI/BankFrame.lua index 5c13977..df83939 100644 --- a/UI/BankFrame.lua +++ b/UI/BankFrame.lua @@ -8,6 +8,7 @@ addon.Modules.BankFrame = BankFrame local currentViewChar = nil local searchText = "" +local isReadOnlyMode = false -- Track if viewing saved bank (read-only) or live bank (interactive) -- OnLoad function Guda_BankFrame_OnLoad(self) @@ -51,15 +52,17 @@ function BankFrame:Toggle() end end --- Show specific character's bank +-- Show specific character's bank (read-only mode) function BankFrame:ShowCharacter(fullName) currentViewChar = fullName + isReadOnlyMode = true -- Viewing saved bank data (read-only) self:Update() end --- Show current character's bank +-- Show current character's bank (interactive mode) function BankFrame:ShowCurrentCharacter() currentViewChar = nil + isReadOnlyMode = false -- Viewing live bank (interactive) self:Update() end @@ -81,27 +84,42 @@ function BankFrame:Update() end end + -- Determine if we're in read-only mode: + -- - If viewing another character → read-only + -- - If bank is actually open → interactive (live) + -- - Otherwise → read-only (viewing saved data) + local bankIsOpen = addon.Modules.BankScanner:IsBankOpen() + isReadOnlyMode = currentViewChar ~= nil or not bankIsOpen + local bankData local isOtherChar = false local charName = "" if currentViewChar then + -- Viewing another character's saved bank bankData = addon.Modules.DB:GetCharacterBank(currentViewChar) isOtherChar = true charName = currentViewChar getglobal("Guda_BankFrame_Title"):SetText("Bank - " .. currentViewChar) else - bankData = addon.Modules.DB:GetCharacterBank(addon.Modules.DB:GetPlayerFullName()) - if not bankData or not next(bankData) then - -- No saved bank data, use live scan if bank is open - if addon.Modules.BankScanner:IsBankOpen() then - bankData = addon.Modules.BankScanner:ScanBank() - end + -- Viewing current character's bank + if bankIsOpen then + -- Bank is actually open - use live data (interactive mode) + bankData = addon.Modules.BankScanner:ScanBank() + else + -- Bank is closed - use saved data (read-only mode) + bankData = addon.Modules.DB:GetCharacterBank(addon.Modules.DB:GetPlayerFullName()) end getglobal("Guda_BankFrame_Title"):SetText("Guda Bank") end self:DisplayItems(bankData, isOtherChar, charName) + + -- Update money + self:UpdateMoney() + + -- Update bank slots info + self:UpdateBankSlotsInfo(bankData, isOtherChar) end -- Display items @@ -146,7 +164,8 @@ function BankFrame:DisplayItems(bankData, isOtherChar, charName) button:SetPoint("TOPLEFT", itemContainer, "TOPLEFT", xPos, yPos) -- Set item data with filter match info - Guda_ItemButton_SetItem(button, bagID, slot, itemData, true, isOtherChar and charName or nil, matchesFilter) + -- Pass isReadOnlyMode to disable interaction for saved banks + Guda_ItemButton_SetItem(button, bagID, slot, itemData, true, isOtherChar and charName or nil, matchesFilter, isReadOnlyMode) -- Advance position col = col + 1 @@ -222,22 +241,226 @@ function BankFrame:ResizeFrame(currentRow, currentCol, columns) end end --- Check if item passes search filter +-- Update bank slots info text +function BankFrame:UpdateBankSlotsInfo(bankData, isOtherChar) + local infoText = getglobal("Guda_BankFrame_Toolbar_BankSlotsInfo_Text") + if not infoText then return end + + local totalSlots = 0 + local usedSlots = 0 + + -- Count slots in bank bags + for _, bagID in ipairs(addon.Constants.BANK_BAGS) do + local bag = bankData[bagID] + + -- Get slot count for this bag + local numSlots + if isOtherChar and bag and bag.numSlots then + numSlots = bag.numSlots + else + numSlots = addon.Modules.Utils:GetBagSlotCount(bagID) + end + + if numSlots and numSlots > 0 then + totalSlots = totalSlots + numSlots + + -- Count used slots + if bag and bag.slots then + for slot = 1, numSlots do + if bag.slots[slot] then + usedSlots = usedSlots + 1 + end + end + end + end + end + + -- Format: "24 / 80" (used / total) + infoText:SetText(string.format("%d / %d", usedSlots, totalSlots)) + infoText:SetTextColor(0.7, 0.7, 0.7) +end + +-- Update money display +function BankFrame:UpdateMoney() + local moneyFrame = getglobal("Guda_BankFrame_MoneyFrame") + + if not moneyFrame then + addon:Debug("Bank MoneyFrame not found! Checking parent...") + addon:Debug("Guda_BankFrame exists: " .. tostring(getglobal("Guda_BankFrame") ~= nil)) + + -- Try to create it manually + self:CreateMoneyFrame() + moneyFrame = getglobal("Guda_BankFrame_MoneyFrame") + end + + if moneyFrame then + MoneyFrame_Update("Guda_BankFrame_MoneyFrame", GetMoney()) + moneyFrame:Show() + + -- Ensure tooltip overlay exists + self:EnsureMoneyTooltipOverlay() + else + addon:Debug("Still couldn't find or create Bank MoneyFrame!") + end +end + +-- Create MoneyFrame if it doesn't exist +function BankFrame:CreateMoneyFrame() + local moneyFrame = CreateFrame("Frame", "Guda_BankFrame_MoneyFrame", Guda_BankFrame, "SmallMoneyFrameTemplate") + moneyFrame:SetPoint("BOTTOMRIGHT", Guda_BankFrame, "BOTTOMRIGHT", -15, 5) + moneyFrame:SetWidth(180) + moneyFrame:SetHeight(35) + + -- Set up OnLoad handler + Guda_BankFrame_MoneyFrame_OnLoad(moneyFrame) + + addon:Debug("Bank MoneyFrame created via CreateMoneyFrame") +end + +-- Money frame OnLoad handler +function Guda_BankFrame_MoneyFrame_OnLoad(self) + addon:Debug("Bank MoneyFrame OnLoad called for: " .. self:GetName()) + + -- Set tooltip handlers on money denomination buttons + local buttons = {"GoldButton", "SilverButton", "CopperButton"} + + for _, buttonName in ipairs(buttons) do + local fullName = self:GetName() .. buttonName + local button = getglobal(fullName) + if button then + button:SetScript("OnEnter", function() + Guda_BankFrame_MoneyOnEnter(this:GetParent()) + end) + button:SetScript("OnLeave", function() + GameTooltip:Hide() + end) + end + end + + -- Also set handlers on parent frame + self:EnableMouse(true) + self:SetScript("OnEnter", function() + Guda_BankFrame_MoneyOnEnter(this) + end) + self:SetScript("OnLeave", function() + GameTooltip:Hide() + end) +end + +-- Money tooltip handler +function Guda_BankFrame_MoneyOnEnter(self) + if not self then return end + + -- Anchor tooltip to TOPRIGHT + GameTooltip:SetOwner(self, "ANCHOR_TOPRIGHT", 0, 0) + GameTooltip:ClearLines() + + -- Get all characters and total + local chars = addon.Modules.DB:GetAllCharacters(true) + local totalMoney = addon.Modules.DB:GetTotalMoney(true) + + -- Header with faction/realm total - use colored money + GameTooltip:AddLine( + "Faction/realm-wide gold: " .. addon.Modules.Utils:FormatMoney(totalMoney, false, true), + 1, 0.82, 0 + ) + GameTooltip:AddLine(" ") + + -- List each character with class-colored names + for _, char in ipairs(chars) do + local classToken = char.classToken + local classColor = classToken and (CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS)[classToken] + local colorR, colorG, colorB = 0.7, 0.7, 0.7 + + if classColor then + colorR, colorG, colorB = classColor.r, classColor.g, classColor.b + end + + -- Create colored name + local coloredName = addon.Modules.Utils:ColorText(char.name, colorR, colorG, colorB) + + GameTooltip:AddLine( + coloredName .. ": " .. addon.Modules.Utils:FormatMoney(char.money or 0, false, true) + ) + end + + GameTooltip:Show() +end + +-- Create transparent overlay for money tooltip +function BankFrame:EnsureMoneyTooltipOverlay() + local overlayName = "Guda_BankFrame_MoneyTooltipOverlay" + local overlay = getglobal(overlayName) + + if not overlay then + local moneyFrame = getglobal("Guda_BankFrame_MoneyFrame") + if not moneyFrame then return end + + -- Create transparent overlay frame + overlay = CreateFrame("Frame", overlayName, moneyFrame) + overlay:SetAllPoints(moneyFrame) + overlay:SetFrameLevel(moneyFrame:GetFrameLevel() + 1) + overlay:EnableMouse(true) + + -- Set tooltip handlers on overlay + overlay:SetScript("OnEnter", function() + Guda_BankFrame_MoneyOnEnter(moneyFrame) + end) + + overlay:SetScript("OnLeave", function() + GameTooltip:Hide() + end) + + addon:Debug("Bank money tooltip overlay created") + end + + overlay:Show() +end + +-- Check if search is currently active +function BankFrame:IsSearchActive() + return searchText and searchText ~= "" and searchText ~= "Search bank..." +end + +-- Check if item passes search filter (pfUI style) function BankFrame:PassesSearchFilter(itemData) - if searchText == "" or searchText == "Search..." then + -- If no search text, everything matches + if not self:IsSearchActive() then return true end - if not itemData or not itemData.name then + -- Empty slots don't match when searching (pfUI style - they get dimmed) + if not itemData then return false end - return string.find(string.lower(itemData.name), string.lower(searchText)) ~= nil + -- Get item name from itemData.name or parse from link + local itemName = itemData.name + if not itemName and itemData.link then + -- Parse name from item link: |cffffffff|Hitem:...|h[Item Name]|h|r + local _, _, name = string.find(itemData.link, "%[(.+)%]") + itemName = name + end + + if not itemName then + return false + end + + -- Case-insensitive search in item name + itemName = string.lower(itemName) + local search = string.lower(searchText) + + -- Check if item name contains search text + return string.find(itemName, search, 1, true) ~= nil end -- Search changed handler function Guda_BankFrame_OnSearchChanged(self) local text = self:GetText() + -- Ignore placeholder text + if text == "Search bank..." then + text = "" + end if text ~= searchText then searchText = text BankFrame:Update() @@ -246,8 +469,8 @@ end -- Sort button handler function Guda_BankFrame_Sort() - if currentViewChar then - addon:Print("Cannot sort another character's bank!") + if isReadOnlyMode or currentViewChar then + addon:Print("Cannot sort in read-only mode!") return end @@ -264,19 +487,86 @@ function Guda_BankFrame_Sort() end) end +-- Switch to Blizzard bank UI +function Guda_BankFrame_SwitchToBlizzardUI() + -- Hide custom bank frame + local customBankFrame = getglobal("Guda_BankFrame") + if customBankFrame then + customBankFrame:Hide() + end + + -- Restore Blizzard bank frame + local blizzardBankFrame = getglobal("BankFrame") + if blizzardBankFrame then + blizzardBankFrame:SetScale(1.0) + blizzardBankFrame:SetAlpha(1.0) + blizzardBankFrame:ClearAllPoints() + blizzardBankFrame:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 0, -104) + blizzardBankFrame:Show() + end + + addon:Print("Switched to Blizzard bank UI. Close and reopen bank to use custom UI again.") +end + -- Initialize function BankFrame:Initialize() + -- Hide Blizzard bank frame on load (pfUI style) + local blizzardBankFrame = getglobal("BankFrame") + if blizzardBankFrame then + blizzardBankFrame:SetScale(0.001) + blizzardBankFrame:SetPoint("TOPLEFT", 0, 0) + blizzardBankFrame:SetAlpha(0) + end + -- Update when bank is opened addon.Modules.Events:OnBankOpen(function() - BankFrame:Update() + -- Delay showing custom bank to let TransmogUI finish processing + local frame = CreateFrame("Frame") + local elapsed = 0 + frame:SetScript("OnUpdate", function() + elapsed = elapsed + arg1 + if elapsed >= 0.2 then + frame:SetScript("OnUpdate", nil) + + -- Show current character's bank in interactive mode + currentViewChar = nil + + -- Show and update custom bank frame + local customBankFrame = getglobal("Guda_BankFrame") + if customBankFrame then + customBankFrame:Show() + end + + addon.Modules.BankFrame:Update() + end + end) + end, "BankFrameUI") + + -- Hide custom bank when bank is closed + addon.Modules.Events:OnBankClose(function() + local customBankFrame = getglobal("Guda_BankFrame") + if customBankFrame and customBankFrame:IsShown() and not currentViewChar then + -- Only auto-close if viewing current character's bank (not saved banks) + customBankFrame:Hide() + end end, "BankFrameUI") -- Update on bag changes while bank is open addon.Modules.Events:OnBagUpdate(function() if addon.Modules.BankScanner:IsBankOpen() and not currentViewChar then - BankFrame:Update() + addon.Modules.BankFrame:Update() end end, "BankFrameUI") + -- Register bank-specific update events (pfUI style) + local updateFrame = CreateFrame("Frame") + updateFrame:RegisterEvent("PLAYERBANKSLOTS_CHANGED") + updateFrame:RegisterEvent("PLAYERBANKBAGSLOTS_CHANGED") + updateFrame:SetScript("OnEvent", function() + if addon.Modules.BankScanner:IsBankOpen() and not currentViewChar then + addon.Modules.BankFrame:Update() + end + end) + addon:Debug("Bank frame initialized") end diff --git a/UI/BankFrame.xml b/UI/BankFrame.xml index be0c59a..d070a10 100644 --- a/UI/BankFrame.xml +++ b/UI/BankFrame.xml @@ -1,4 +1,5 @@ - + @@ -106,6 +107,53 @@ + + + @@ -165,6 +213,83 @@ + + + + + + + + + + + + + + + -- Clear search focus when clicking toolbar + local searchBox = getglobal("Guda_BankFrame_SearchBar_SearchBox") + if searchBox then + searchBox:ClearFocus() + end + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + local text = getglobal(this:GetName().."_Text") + if text then + text:SetText("0 / 0") + text:SetTextColor(0.8, 0.8, 0.8) + end + + + + + + + + + + + + + + + + + -- Set tooltip handlers on money button children + Guda_BankFrame_MoneyFrame_OnLoad(this) + + + + diff --git a/UI/ItemButton.lua b/UI/ItemButton.lua index 0c62310..63c6d35 100644 --- a/UI/ItemButton.lua +++ b/UI/ItemButton.lua @@ -35,12 +35,13 @@ function Guda_ItemButton_OnLoad(self) end -- Set item data -function Guda_ItemButton_SetItem(self, bagID, slotID, itemData, isBank, otherCharName, matchesFilter) +function Guda_ItemButton_SetItem(self, bagID, slotID, itemData, isBank, otherCharName, matchesFilter, isReadOnly) self.bagID = bagID self.slotID = slotID self.itemData = itemData self.isBank = isBank or false self.otherChar = otherCharName + self.isReadOnly = isReadOnly or false -- Track if this is read-only mode -- Default to true if not specified (for non-filtered displays) if matchesFilter == nil then @@ -261,42 +262,19 @@ function Guda_ItemButton_OnEnter(self) GameTooltip:SetOwner(self, "ANCHOR_RIGHT") - if self.otherChar then - -- Viewing another character's item - show full tooltip like the original - if self.itemData.link then - -- Extract the hyperlink from the full item link - -- Item links are in format: |cFFFFFFFF|Hitem:1234:0:0:0|h[Item Name]|h|r - -- SetHyperlink needs just: item:1234:0:0:0 - local _, _, hyperlink = strfind(self.itemData.link, "|H(.+)|h") - - if hyperlink then - GameTooltip:SetHyperlink(hyperlink) - -- Add "Owned by" line after the original tooltip - GameTooltip:AddLine(" ") - GameTooltip:AddLine("|cFFFFFFFFOwned by: |cFF00FF96" .. self.otherChar .. "|r", 1, 1, 1) - else - -- Fallback: try the full link - local success, err = pcall(function() - GameTooltip:SetHyperlink(self.itemData.link) - end) - - if success then - GameTooltip:AddLine(" ") - GameTooltip:AddLine("|cFFFFFFFFOwned by: |cFF00FF96" .. self.otherChar .. "|r", 1, 1, 1) - else - -- Last resort: show item name - GameTooltip:AddLine(self.itemData.name or "Unknown Item", 1, 1, 1) - GameTooltip:AddLine("|cFFFFFFFFOwned by: |cFF00FF96" .. self.otherChar .. "|r", 1, 1, 1) - end - end - end - else - -- Current character's item - if self.isBank then - GameTooltip:SetInventoryItem("player", BankButtonIDToInvSlotID(self.slotID, self.bagID)) + -- For bank items, use the item link directly since SetBagItem might not work for bank bags + if self.isBank and self.itemData.link then + -- Extract hyperlink from item link: |cFFFFFFFF|Hitem:1234:0:0:0|h[Name]|h|r -> item:1234:0:0:0 + local _, _, hyperlink = strfind(self.itemData.link, "|H(.+)|h") + if hyperlink then + GameTooltip:SetHyperlink(hyperlink) else + -- Fallback to SetBagItem GameTooltip:SetBagItem(self.bagID, self.slotID) end + else + -- For regular bags, use SetBagItem as normal + GameTooltip:SetBagItem(self.bagID, self.slotID) end GameTooltip:Show() @@ -309,8 +287,8 @@ end -- OnDragStart handler function Guda_ItemButton_OnDragStart(self, button) - -- Don't allow dragging other characters' items - if self.otherChar then + -- Don't allow dragging other characters' items or in read-only mode + if self.otherChar or self.isReadOnly then return end @@ -322,8 +300,8 @@ end -- OnReceiveDrag handler function Guda_ItemButton_OnReceiveDrag(self) - -- Don't allow dragging to other characters' items - if self.otherChar then + -- Don't allow dragging to other characters' items or in read-only mode + if self.otherChar or self.isReadOnly then return end @@ -333,8 +311,8 @@ end -- OnClick handler function Guda_ItemButton_OnClick(self, button) - -- Don't allow interaction with other characters' items - if self.otherChar then + -- Don't allow interaction with other characters' items or in read-only mode + if self.otherChar or self.isReadOnly then return end