feat: info free slots/total slots
This commit is contained in:
+9
-1
@@ -128,6 +128,14 @@ function Utils:GetBagSlotCount(bagID)
|
|||||||
if bagID == -1 then
|
if bagID == -1 then
|
||||||
-- Bank has 24 slots in vanilla
|
-- Bank has 24 slots in vanilla
|
||||||
return 24
|
return 24
|
||||||
|
elseif bagID == -2 then
|
||||||
|
-- Keyring - vanilla WoW has 12-32 slots depending on version
|
||||||
|
local slots = GetContainerNumSlots(bagID)
|
||||||
|
if not slots or slots == 0 then
|
||||||
|
-- Fallback: keyring typically has 12 slots in vanilla
|
||||||
|
return 12
|
||||||
|
end
|
||||||
|
return slots
|
||||||
else
|
else
|
||||||
return GetContainerNumSlots(bagID) or 0
|
return GetContainerNumSlots(bagID) or 0
|
||||||
end
|
end
|
||||||
@@ -135,7 +143,7 @@ end
|
|||||||
|
|
||||||
-- Check if bag is valid
|
-- Check if bag is valid
|
||||||
function Utils:IsBagValid(bagID)
|
function Utils:IsBagValid(bagID)
|
||||||
if bagID == 0 or bagID == -1 then
|
if bagID == 0 or bagID == -1 or bagID == -2 then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
return GetContainerNumSlots(bagID) and GetContainerNumSlots(bagID) > 0
|
return GetContainerNumSlots(bagID) and GetContainerNumSlots(bagID) > 0
|
||||||
|
|||||||
@@ -10,10 +10,14 @@ addon.Modules.BagScanner = BagScanner
|
|||||||
function BagScanner:ScanBags()
|
function BagScanner:ScanBags()
|
||||||
local bagData = {}
|
local bagData = {}
|
||||||
|
|
||||||
|
-- Scan regular bags
|
||||||
for _, bagID in ipairs(addon.Constants.BAGS) do
|
for _, bagID in ipairs(addon.Constants.BAGS) do
|
||||||
bagData[bagID] = self:ScanBag(bagID)
|
bagData[bagID] = self:ScanBag(bagID)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Also scan keyring (bagID -2)
|
||||||
|
bagData[-2] = self:ScanBag(-2)
|
||||||
|
|
||||||
return bagData
|
return bagData
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ addon.Modules.BagFrame = BagFrame
|
|||||||
local currentViewChar = nil -- nil = current character
|
local currentViewChar = nil -- nil = current character
|
||||||
local searchText = ""
|
local searchText = ""
|
||||||
local itemButtons = {}
|
local itemButtons = {}
|
||||||
|
local showKeyring = false -- Toggle for keyring display
|
||||||
|
|
||||||
-- Global click catcher for clearing search focus
|
-- Global click catcher for clearing search focus
|
||||||
local clickCatcher = nil
|
local clickCatcher = nil
|
||||||
@@ -153,6 +154,9 @@ function BagFrame:Update()
|
|||||||
|
|
||||||
-- Update money
|
-- Update money
|
||||||
self:UpdateMoney()
|
self:UpdateMoney()
|
||||||
|
|
||||||
|
-- Update bag slots info
|
||||||
|
self:UpdateBagSlotsInfo(bagData, isOtherChar)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Display items
|
-- Display items
|
||||||
@@ -165,9 +169,32 @@ function BagFrame:DisplayItems(bagData, isOtherChar, charName)
|
|||||||
local perRow = addon.Modules.DB:GetSetting("bagColumns") or 10
|
local perRow = addon.Modules.DB:GetSetting("bagColumns") or 10
|
||||||
local itemContainer = getglobal("Guda_BagFrame_ItemContainer")
|
local itemContainer = getglobal("Guda_BagFrame_ItemContainer")
|
||||||
|
|
||||||
|
-- Build bag list - include keyring if toggled on
|
||||||
|
local bagsToShow = {}
|
||||||
for _, bagID in ipairs(addon.Constants.BAGS) do
|
for _, bagID in ipairs(addon.Constants.BAGS) do
|
||||||
|
table.insert(bagsToShow, bagID)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Add keyring (-2) at the end if toggled on
|
||||||
|
if showKeyring then
|
||||||
|
table.insert(bagsToShow, -2) -- Insert at end
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, bagID in ipairs(bagsToShow) do
|
||||||
local bag = bagData[bagID]
|
local bag = bagData[bagID]
|
||||||
|
|
||||||
|
-- Add spacing before keyring section
|
||||||
|
if bagID == -2 then
|
||||||
|
-- Add spacing before keyring
|
||||||
|
if col > 0 then
|
||||||
|
-- Move to next row if not at start of row
|
||||||
|
col = 0
|
||||||
|
row = row + 1
|
||||||
|
end
|
||||||
|
-- Add extra spacing (1 row)
|
||||||
|
row = row + 1
|
||||||
|
end
|
||||||
|
|
||||||
-- Get slot count for this bag
|
-- Get slot count for this bag
|
||||||
local numSlots
|
local numSlots
|
||||||
if isOtherChar and bag and bag.numSlots then
|
if isOtherChar and bag and bag.numSlots then
|
||||||
@@ -380,6 +407,47 @@ function BagFrame:UpdateMoney()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Update bag slots info text (excluding keyring)
|
||||||
|
function BagFrame:UpdateBagSlotsInfo(bagData, isOtherChar)
|
||||||
|
local infoText = getglobal("Guda_BagFrame_Toolbar_BagSlotsInfo_Text")
|
||||||
|
if not infoText then return end
|
||||||
|
|
||||||
|
local totalSlots = 0
|
||||||
|
local usedSlots = 0
|
||||||
|
|
||||||
|
-- Count slots in regular bags only (0-4), exclude keyring (-2)
|
||||||
|
for _, bagID in ipairs(addon.Constants.BAGS) do
|
||||||
|
local bag = bagData[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
|
||||||
|
|
||||||
|
local freeSlots = totalSlots - usedSlots
|
||||||
|
|
||||||
|
-- Format: "56 / 80" (free / total)
|
||||||
|
infoText:SetText(string.format("%d / %d", freeSlots, totalSlots))
|
||||||
|
infoText:SetTextColor(0.7, 0.7, 0.7)
|
||||||
|
end
|
||||||
|
|
||||||
function BagFrame:CreateMoneyFrame()
|
function BagFrame:CreateMoneyFrame()
|
||||||
local moneyFrame = CreateFrame("Frame", "Guda_BagFrame_MoneyFrame", Guda_BagFrame, "SmallMoneyFrameTemplate")
|
local moneyFrame = CreateFrame("Frame", "Guda_BagFrame_MoneyFrame", Guda_BagFrame, "SmallMoneyFrameTemplate")
|
||||||
moneyFrame:SetPoint("BOTTOMRIGHT", Guda_BagFrame, "BOTTOMRIGHT", -15, 10)
|
moneyFrame:SetPoint("BOTTOMRIGHT", Guda_BagFrame, "BOTTOMRIGHT", -15, 10)
|
||||||
@@ -738,6 +806,29 @@ function Guda_BagFrame_OnSearchChanged(self)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Keyring toggle handler
|
||||||
|
function Guda_BagFrame_ToggleKeyring()
|
||||||
|
showKeyring = not showKeyring
|
||||||
|
|
||||||
|
-- Update button appearance to show toggle state
|
||||||
|
local button = getglobal("Guda_BagFrame_Toolbar_KeyringButton")
|
||||||
|
if button then
|
||||||
|
local icon = getglobal(button:GetName().."_Icon")
|
||||||
|
if icon then
|
||||||
|
if showKeyring then
|
||||||
|
-- Highlighted when active
|
||||||
|
icon:SetVertexColor(1.0, 1.0, 0.5)
|
||||||
|
else
|
||||||
|
-- Normal color when inactive
|
||||||
|
icon:SetVertexColor(0.8, 0.8, 0.8)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Refresh display
|
||||||
|
BagFrame:Update()
|
||||||
|
end
|
||||||
|
|
||||||
-- Sort button handler
|
-- Sort button handler
|
||||||
function Guda_BagFrame_Sort()
|
function Guda_BagFrame_Sort()
|
||||||
if currentViewChar then
|
if currentViewChar then
|
||||||
|
|||||||
+82
-1
@@ -273,7 +273,88 @@
|
|||||||
</Scripts>
|
</Scripts>
|
||||||
|
|
||||||
<Frames>
|
<Frames>
|
||||||
<!-- All buttons moved to header -->
|
<!-- Keyring Button (footer left) -->
|
||||||
|
<Button name="$parent_KeyringButton">
|
||||||
|
<Size>
|
||||||
|
<AbsDimension x="24" y="24"/>
|
||||||
|
</Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="LEFT">
|
||||||
|
<Offset>
|
||||||
|
<AbsDimension x="13" y="3"/>
|
||||||
|
</Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Layers>
|
||||||
|
<Layer level="ARTWORK">
|
||||||
|
<Texture name="$parent_Icon">
|
||||||
|
<Size>
|
||||||
|
<AbsDimension x="20" y="20"/>
|
||||||
|
</Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="CENTER"/>
|
||||||
|
</Anchors>
|
||||||
|
<Color r="0.8" g="0.8" b="0.8"/>
|
||||||
|
</Texture>
|
||||||
|
</Layer>
|
||||||
|
</Layers>
|
||||||
|
<Scripts>
|
||||||
|
<OnLoad>
|
||||||
|
local icon = getglobal(this:GetName().."_Icon")
|
||||||
|
if icon then
|
||||||
|
icon:SetTexture("Interface\\Icons\\INV_Misc_Key_03")
|
||||||
|
icon:SetTexCoord(0.08, 0.92, 0.08, 0.92)
|
||||||
|
end
|
||||||
|
</OnLoad>
|
||||||
|
<OnClick>
|
||||||
|
Guda_BagFrame_ToggleKeyring()
|
||||||
|
</OnClick>
|
||||||
|
<OnEnter>
|
||||||
|
GameTooltip:SetOwner(this, "ANCHOR_TOP")
|
||||||
|
GameTooltip:SetText("Toggle Keyring")
|
||||||
|
GameTooltip:Show()
|
||||||
|
</OnEnter>
|
||||||
|
<OnLeave>
|
||||||
|
GameTooltip:Hide()
|
||||||
|
</OnLeave>
|
||||||
|
</Scripts>
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<!-- Bag Slots Info Text -->
|
||||||
|
<Frame name="$parent_BagSlotsInfo">
|
||||||
|
<Size>
|
||||||
|
<AbsDimension x="100" y="24"/>
|
||||||
|
</Size>
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="LEFT" relativePoint="RIGHT" relativeTo="$parent_KeyringButton">
|
||||||
|
<Offset>
|
||||||
|
<AbsDimension x="8" y="0"/>
|
||||||
|
</Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
<Layers>
|
||||||
|
<Layer level="OVERLAY">
|
||||||
|
<FontString name="$parent_Text" inherits="GameFontNormal">
|
||||||
|
<Anchors>
|
||||||
|
<Anchor point="LEFT">
|
||||||
|
<Offset>
|
||||||
|
<AbsDimension x="0" y="0"/>
|
||||||
|
</Offset>
|
||||||
|
</Anchor>
|
||||||
|
</Anchors>
|
||||||
|
</FontString>
|
||||||
|
</Layer>
|
||||||
|
</Layers>
|
||||||
|
<Scripts>
|
||||||
|
<OnLoad>
|
||||||
|
local text = getglobal(this:GetName().."_Text")
|
||||||
|
if text then
|
||||||
|
text:SetText("0 / 0")
|
||||||
|
text:SetTextColor(0.8, 0.8, 0.8)
|
||||||
|
end
|
||||||
|
</OnLoad>
|
||||||
|
</Scripts>
|
||||||
|
</Frame>
|
||||||
</Frames>
|
</Frames>
|
||||||
</Frame>
|
</Frame>
|
||||||
|
|
||||||
|
|||||||
+15
-3
@@ -164,8 +164,12 @@ function Guda_ItemButton_SetItem(self, bagID, slotID, itemData, isBank, otherCha
|
|||||||
countText:Hide()
|
countText:Hide()
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Set quality border
|
-- Set quality border (or keyring border)
|
||||||
if itemData.quality and itemData.quality > 1 then
|
if bagID == -2 then
|
||||||
|
-- Special border for keyring items (cyan/blue)
|
||||||
|
qualityBorder:SetVertexColor(0.2, 0.8, 1.0, 1)
|
||||||
|
qualityBorder:Show()
|
||||||
|
elseif itemData.quality and itemData.quality > 1 then
|
||||||
local r, g, b = addon.Modules.Utils:GetQualityColor(itemData.quality)
|
local r, g, b = addon.Modules.Utils:GetQualityColor(itemData.quality)
|
||||||
qualityBorder:SetVertexColor(r, g, b, 1)
|
qualityBorder:SetVertexColor(r, g, b, 1)
|
||||||
qualityBorder:Show()
|
qualityBorder:Show()
|
||||||
@@ -202,7 +206,15 @@ function Guda_ItemButton_SetItem(self, bagID, slotID, itemData, isBank, otherCha
|
|||||||
end
|
end
|
||||||
|
|
||||||
countText:Hide()
|
countText:Hide()
|
||||||
qualityBorder:Hide()
|
|
||||||
|
-- Show border for empty keyring slots
|
||||||
|
if bagID == -2 then
|
||||||
|
qualityBorder:SetVertexColor(0.2, 0.8, 1.0, 0.5) -- Dimmer cyan for empty slots
|
||||||
|
qualityBorder:Show()
|
||||||
|
else
|
||||||
|
qualityBorder:Hide()
|
||||||
|
end
|
||||||
|
|
||||||
self:Show()
|
self:Show()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user