From dddbbb7407ff32bb417f08d7a12de7b112e88caf Mon Sep 17 00:00:00 2001 From: Salikh Gurgenidze Date: Tue, 23 Dec 2025 21:32:49 +0400 Subject: [PATCH] fix: category spacing --- Core/Utils.lua | 51 +++++++++++++++++++++++++++++++++++++----------- UI/BagFrame.lua | 16 ++++++++++----- UI/BankFrame.lua | 15 +++++++++----- 3 files changed, 61 insertions(+), 21 deletions(-) diff --git a/Core/Utils.lua b/Core/Utils.lua index b862dbc..ca78ade 100644 --- a/Core/Utils.lua +++ b/Core/Utils.lua @@ -155,6 +155,46 @@ function Utils:FormatTimeAgo(timestamp) end end +-- Create hidden tooltip for scanning (only once) +local scanTooltip = nil +local function GetScanTooltip() + if not scanTooltip then + scanTooltip = CreateFrame("GameTooltip", "GudaBagScanTooltip", nil, "GameTooltipTemplate") + scanTooltip:SetOwner(WorldFrame, "ANCHOR_NONE") + end + return scanTooltip +end + +-- Check if an item is a quest item by scanning its tooltip +function Utils:IsQuestItemTooltip(bagID, slotID) + if not bagID or not slotID then return false end + + local tooltip = GetScanTooltip() + tooltip:ClearLines() + tooltip:SetBagItem(bagID, slotID) + + -- Check all tooltip lines for quest-related text + for i = 1, tooltip:NumLines() do + local line = getglobal("GudaBagScanTooltipTextLeft" .. i) + if line then + local text = line:GetText() + if text then + -- Check for quest starter patterns + if string.find(text, "Quest Starter") or + string.find(text, "This Item Begins a Quest") or + string.find(text, "Use: Starts a Quest") then + return true + -- Check for regular quest item patterns + elseif string.find(text, "Quest Item") or + string.find(text, "Manual") then + return true + end + end + end + end + return false +end + -- Get bag slot count function Utils:GetBagSlotCount(bagID) if bagID == -1 then @@ -190,17 +230,6 @@ function Utils:TruncateText(text, maxLen) return string.sub(text, 1, maxLen - 3) .. "..." end --- Create hidden tooltip for scanning (only once) -local scanTooltip = nil -local function GetScanTooltip() - if not scanTooltip then - scanTooltip = CreateFrame("GameTooltip", "GudaBagScanTooltip", nil, "GameTooltipTemplate") - scanTooltip:SetOwner(WorldFrame, "ANCHOR_NONE") - end - return scanTooltip -end - --- Check if a bag is Quiver or Ammo Pouch function Utils:IsAmmoQuiverBag(bagID) -- Skip backpack, bank, and keyring if bagID == 0 or bagID == -1 or bagID == -2 then diff --git a/UI/BagFrame.lua b/UI/BagFrame.lua index be199ce..d3ef1d5 100644 --- a/UI/BagFrame.lua +++ b/UI/BagFrame.lua @@ -422,6 +422,12 @@ function BagFrame:DisplayItemsByCategory(bagData, isOtherChar, charName) local cat = itemData.class or "Miscellaneous" local itemName = itemData.name or "" + -- Force Quest category if it's a quest item (tooltip scan) + -- For other characters, we rely on the saved class, but for current we can be more accurate + if not isOtherChar and addon.Modules.Utils:IsQuestItemTooltip(bagID, slotID) then + cat = "Quest" + end + -- Detect Hearthstone if string.find(itemName, "Hearthstone") then table.insert(specialItems.Hearthstone, {bagID = bagID, slotID = slotID, itemData = itemData}) @@ -509,7 +515,7 @@ function BagFrame:DisplayItemsByCategory(bagData, isOtherChar, charName) local blockHeight = 20 + (blockRows * (buttonSize + spacing)) + 5 -- 20 header, 5 padding -- Check if it fits in current row - if currentX > 0 and currentX + blockWidth > totalWidth + 5 then + if currentX > 0 and currentX + blockWidth + 20 > totalWidth + 5 then currentX = 0 currentY = currentY + rowMaxHeight rowMaxHeight = 0 @@ -553,7 +559,7 @@ function BagFrame:DisplayItemsByCategory(bagData, isOtherChar, charName) end if blockHeight > rowMaxHeight then rowMaxHeight = blockHeight end - currentX = currentX + blockWidth + currentX = currentX + blockWidth + 20 end end @@ -605,7 +611,7 @@ function BagFrame:DisplayItemsByCategory(bagData, isOtherChar, charName) local blockHeight = 20 + (blockRows * (buttonSize + spacing)) -- Check if it fits in current row (Inline block for bottom sections too) - if col > 0 and (col * (buttonSize + spacing)) + blockWidth > totalWidth + 5 then + if col > 0 and (col * (buttonSize + spacing)) + blockWidth + 20 > totalWidth + 5 then col = 0 y = y - sectionMaxHeight - 5 sectionMaxHeight = 0 @@ -642,10 +648,10 @@ function BagFrame:DisplayItemsByCategory(bagData, isOtherChar, charName) end if blockHeight > sectionMaxHeight then sectionMaxHeight = blockHeight end - col = col + blockCols + col = col + blockCols + math.ceil(20 / (buttonSize + spacing)) -- If we wrapped exactly at the end of a block - if col >= perRow then + if (col * (buttonSize + spacing)) >= totalWidth then col = 0 y = y - sectionMaxHeight - 5 sectionMaxHeight = 0 diff --git a/UI/BankFrame.lua b/UI/BankFrame.lua index 2754141..d638293 100644 --- a/UI/BankFrame.lua +++ b/UI/BankFrame.lua @@ -297,6 +297,11 @@ function BankFrame:DisplayItemsByCategory(bankData, isOtherChar, charName) local cat = itemData.class or "Miscellaneous" + -- Force Quest category if it's a quest item (tooltip scan) + if not isOtherChar and addon.Modules.Utils:IsQuestItemTooltip(bagID, slotID) then + cat = "Quest" + end + -- Split Equipment into Weapon and Armor if itemData.equipSlot and itemData.equipSlot ~= "" then if itemData.class == "Weapon" or itemData.class == "Armor" then @@ -375,7 +380,7 @@ function BankFrame:DisplayItemsByCategory(bankData, isOtherChar, charName) local blockHeight = 20 + (blockRows * (buttonSize + spacing)) + 5 -- Check if it fits in current row - if currentX > 0 and currentX + blockWidth > totalWidth + 5 then + if currentX > 0 and currentX + blockWidth + 20 > totalWidth + 5 then currentX = 0 currentY = currentY + rowMaxHeight rowMaxHeight = 0 @@ -419,7 +424,7 @@ function BankFrame:DisplayItemsByCategory(bankData, isOtherChar, charName) end if blockHeight > rowMaxHeight then rowMaxHeight = blockHeight end - currentX = currentX + blockWidth + currentX = currentX + blockWidth + 20 end end @@ -471,7 +476,7 @@ function BankFrame:DisplayItemsByCategory(bankData, isOtherChar, charName) local blockHeight = 20 + (blockRows * (buttonSize + spacing)) -- Check if it fits in current row (Inline block for bottom sections too) - if col > 0 and (col * (buttonSize + spacing)) + blockWidth > totalWidth + 5 then + if col > 0 and (col * (buttonSize + spacing)) + blockWidth + 20 > totalWidth + 5 then col = 0 y = y - sectionMaxHeight - 5 sectionMaxHeight = 0 @@ -508,10 +513,10 @@ function BankFrame:DisplayItemsByCategory(bankData, isOtherChar, charName) end if blockHeight > sectionMaxHeight then sectionMaxHeight = blockHeight end - col = col + blockCols + col = col + blockCols + math.ceil(20 / (buttonSize + spacing)) -- If we wrapped exactly at the end of a block - if col >= perRow then + if (col * (buttonSize + spacing)) >= totalWidth then col = 0 y = y - sectionMaxHeight - 5 sectionMaxHeight = 0