diff --git a/Core/Database.lua b/Core/Database.lua
index 230a9f0..7809f42 100644
--- a/Core/Database.lua
+++ b/Core/Database.lua
@@ -43,11 +43,15 @@ function DB:Initialize()
showQualityBorderOther = true,
showSearchBar = true,
showQuestBar = true,
+ hoverBagline = false,
},
}
end
-- Ensure new settings exist for existing installations
+ if Guda_CharDB.settings.hoverBagline == nil then
+ Guda_CharDB.settings.hoverBagline = false
+ end
if Guda_CharDB.settings.showQuestBar == nil then
Guda_CharDB.settings.showQuestBar = true
end
diff --git a/Guda.toc b/Guda.toc
index 290d278..c10ecb0 100644
--- a/Guda.toc
+++ b/Guda.toc
@@ -2,7 +2,7 @@
## Title: Guda
## Notes: All-in-one bag and bank addon for Turtle WoW
## Author: Vati
-## Version: 1.1.9
+## Version: 1.2.0
## SavedVariables: Guda_DB
## SavedVariablesPerCharacter: Guda_CharDB
diff --git a/UI/BagFrame.lua b/UI/BagFrame.lua
index 8c9943f..00826ec 100644
--- a/UI/BagFrame.lua
+++ b/UI/BagFrame.lua
@@ -150,6 +150,104 @@ function BagFrame:UpdateLockStates()
end
end
+-- Update bagline layout (hover option)
+function BagFrame:UpdateBaglineLayout()
+ local hoverBagline = addon.Modules.DB:GetSetting("hoverBagline")
+ local toolbar = getglobal("Guda_BagFrame_Toolbar")
+ if not toolbar then return end
+
+ local bag0 = getglobal("Guda_BagFrame_Toolbar_BagSlot0")
+ local bag1 = getglobal("Guda_BagFrame_Toolbar_BagSlot1")
+ local bag2 = getglobal("Guda_BagFrame_Toolbar_BagSlot2")
+ local bag3 = getglobal("Guda_BagFrame_Toolbar_BagSlot3")
+ local bag4 = getglobal("Guda_BagFrame_Toolbar_BagSlot4")
+ local keyring = getglobal("Guda_BagFrame_Toolbar_KeyringButton")
+ local info = getglobal("Guda_BagFrame_Toolbar_BagSlotsInfo")
+
+ if hoverBagline then
+ -- Hide extra bags by default if not hovering
+ if not toolbar.isHovered then
+ if bag1 then bag1:Hide() end
+ if bag2 then bag2:Hide() end
+ if bag3 then bag3:Hide() end
+ if bag4 then bag4:Hide() end
+ end
+
+ -- Re-anchor Keyring to BagSlot0
+ if keyring and bag0 then
+ keyring:ClearAllPoints()
+ keyring:SetPoint("LEFT", bag0, "RIGHT", 2, 0)
+ end
+
+ -- Keep info visible and anchor it to Keyring
+ if info then
+ info:Show()
+ info:ClearAllPoints()
+ info:SetPoint("LEFT", keyring, "RIGHT", 8, 0)
+ end
+
+ -- If hovered, show and position vertically above Bag0
+ if toolbar.isHovered then
+ if bag1 then
+ bag1:Show()
+ bag1:SetFrameLevel(bag0:GetFrameLevel() + 10)
+ bag1:ClearAllPoints()
+ bag1:SetPoint("BOTTOM", bag0, "TOP", 0, 2)
+ end
+ if bag2 then
+ bag2:Show()
+ bag2:SetFrameLevel(bag0:GetFrameLevel() + 10)
+ bag2:ClearAllPoints()
+ bag2:SetPoint("BOTTOM", bag1, "TOP", 0, 2)
+ end
+ if bag3 then
+ bag3:Show()
+ bag3:SetFrameLevel(bag0:GetFrameLevel() + 10)
+ bag3:ClearAllPoints()
+ bag3:SetPoint("BOTTOM", bag2, "TOP", 0, 2)
+ end
+ if bag4 then
+ bag4:Show()
+ bag4:SetFrameLevel(bag0:GetFrameLevel() + 10)
+ bag4:ClearAllPoints()
+ bag4:SetPoint("BOTTOM", bag3, "TOP", 0, 2)
+ end
+ end
+ else
+ -- Restore standard horizontal layout
+ if bag1 then
+ bag1:Show()
+ bag1:ClearAllPoints()
+ bag1:SetPoint("LEFT", bag0, "RIGHT", 2, 0)
+ end
+ if bag2 then
+ bag2:Show()
+ bag2:ClearAllPoints()
+ bag2:SetPoint("LEFT", bag1, "RIGHT", 2, 0)
+ end
+ if bag3 then
+ bag3:Show()
+ bag3:ClearAllPoints()
+ bag3:SetPoint("LEFT", bag2, "RIGHT", 2, 0)
+ end
+ if bag4 then
+ bag4:Show()
+ bag4:ClearAllPoints()
+ bag4:SetPoint("LEFT", bag3, "RIGHT", 2, 0)
+ end
+ if keyring then
+ keyring:Show()
+ keyring:ClearAllPoints()
+ keyring:SetPoint("LEFT", bag4, "RIGHT", 2, 0)
+ end
+ if info then
+ info:Show()
+ info:ClearAllPoints()
+ info:SetPoint("LEFT", keyring, "RIGHT", 8, 0)
+ end
+ end
+end
+
-- Update display
function BagFrame:Update()
if not Guda_BagFrame:IsShown() then
@@ -212,6 +310,9 @@ function BagFrame:Update()
-- Update bag slots info
self:UpdateBagSlotsInfo(bagData, isOtherChar)
+ -- Update bagline layout (hover option)
+ self:UpdateBaglineLayout()
+
-- Clean up unused buttons AFTER display is complete (prevents drag/drop issues)
for _, bagParent in pairs(bagParents) do
if bagParent then
@@ -1719,6 +1820,17 @@ end
-- OnEnter handler for tooltip
function Guda_BagSlot_OnEnter(button, bagID)
+ -- Handle hover bagline
+ local hoverBagline = addon.Modules.DB:GetSetting("hoverBagline")
+ if hoverBagline then
+ local toolbar = getglobal("Guda_BagFrame_Toolbar")
+ if toolbar then
+ toolbar.isHovered = true
+ toolbar.hoverTimer = nil -- Cancel any pending hide
+ BagFrame:UpdateBaglineLayout()
+ end
+ end
+
GameTooltip:SetOwner(button, "ANCHOR_TOP")
if bagID == 0 then
@@ -1759,6 +1871,32 @@ function Guda_BagSlot_OnEnter(button, bagID)
GameTooltip:Show()
end
+-- OnLeave handler for tooltip
+function Guda_BagSlot_OnLeave(button, bagID)
+ -- Handle hover bagline
+ local hoverBagline = addon.Modules.DB:GetSetting("hoverBagline")
+ if hoverBagline then
+ local toolbar = getglobal("Guda_BagFrame_Toolbar")
+ if toolbar then
+ -- Start a small timer to hide, so we can move mouse between bags
+ toolbar.hoverTimer = 0.1
+ if not toolbar.hasOnUpdate then
+ toolbar:SetScript("OnUpdate", function()
+ if this.hoverTimer then
+ this.hoverTimer = this.hoverTimer - arg1
+ if this.hoverTimer <= 0 then
+ this.hoverTimer = nil
+ this.isHovered = false
+ BagFrame:UpdateBaglineLayout()
+ end
+ end
+ end)
+ toolbar.hasOnUpdate = true
+ end
+ end
+ end
+end
+
-- Highlight all item slots belonging to a specific bag by dimming others
function Guda_BagFrame_HighlightBagSlots(bagID)
-- Use the tracked itemButtons list because actual buttons are parented under per-bag parents
diff --git a/UI/BagFrame.xml b/UI/BagFrame.xml
index 1059ac6..6399a22 100644
--- a/UI/BagFrame.xml
+++ b/UI/BagFrame.xml
@@ -298,6 +298,7 @@
GameTooltip:Hide()
Guda_BagFrame_ClearHighlightedSlots()
+ Guda_BagSlot_OnLeave(this, 0)
Guda_BagSlot_OnEvent(this, event, arg1)
@@ -338,6 +339,7 @@
GameTooltip:Hide()
Guda_BagFrame_ClearHighlightedSlots()
+ Guda_BagSlot_OnLeave(this, 1)
Guda_BagSlot_OnEvent(this, event, arg1)
@@ -378,6 +380,7 @@
GameTooltip:Hide()
Guda_BagFrame_ClearHighlightedSlots()
+ Guda_BagSlot_OnLeave(this, 2)
Guda_BagSlot_OnEvent(this, event, arg1)
@@ -418,6 +421,7 @@
GameTooltip:Hide()
Guda_BagFrame_ClearHighlightedSlots()
+ Guda_BagSlot_OnLeave(this, 3)
Guda_BagSlot_OnEvent(this, event, arg1)
@@ -458,6 +462,7 @@
GameTooltip:Hide()
Guda_BagFrame_ClearHighlightedSlots()
+ Guda_BagSlot_OnLeave(this, 4)
Guda_BagSlot_OnEvent(this, event, arg1)
@@ -507,10 +512,12 @@
GameTooltip:AddLine("(Click to toggle)", 0.5, 0.8, 0.5)
GameTooltip:Show()
Guda_BagFrame_HighlightBagSlots(-2)
+ Guda_BagSlot_OnEnter(this, -2)
GameTooltip:Hide()
Guda_BagFrame_ClearHighlightedSlots()
+ Guda_BagSlot_OnLeave(this, -2)
diff --git a/UI/QuestItemBar.lua b/UI/QuestItemBar.lua
index 0fe8353..d2d6740 100644
--- a/UI/QuestItemBar.lua
+++ b/UI/QuestItemBar.lua
@@ -153,6 +153,36 @@ function QuestItemBar:Update()
button.bagID = item.bagID
button.slotID = item.slotID
button.itemData = { link = GetContainerItemLink(item.bagID, item.slotID) }
+
+ button.hasItem = true
+ button.isBank = false
+ button.otherChar = nil
+
+ -- Custom click handler for Quest Item Bar
+ button:SetScript("OnClick", function()
+ if arg1 == "LeftButton" then
+ if IsShiftKeyDown() then
+ local link = GetContainerItemLink(this.bagID, this.slotID)
+ if link then
+ HandleModifiedItemClick(link)
+ end
+ else
+ UseContainerItem(this.bagID, this.slotID)
+ end
+ elseif arg1 == "RightButton" then
+ -- Right click also uses it or maybe open socketing?
+ -- UseContainerItem handles both depending on context usually.
+ UseContainerItem(this.bagID, this.slotID)
+ end
+ end)
+
+ button:SetScript("OnEnter", function()
+ Guda_ItemButton_OnEnter(this)
+ end)
+
+ button:SetScript("OnLeave", function()
+ Guda_ItemButton_OnLeave(this)
+ end)
local icon = getglobal(button:GetName() .. "IconTexture")
icon:SetTexture(item.texture)
@@ -168,9 +198,11 @@ function QuestItemBar:Update()
button:ClearAllPoints()
button:SetPoint("LEFT", frame, "LEFT", xOffset + (i-1) * (buttonSize + spacing), 0)
button:Show()
-
- -- Set custom data for tooltip handling
- button.hasItem = true
+
+ -- Update visual overlays (cooldown, etc)
+ if Guda_ItemButton_UpdateCooldown then
+ Guda_ItemButton_UpdateCooldown(button)
+ end
-- Allow dragging the bar via buttons
button:RegisterForDrag("LeftButton")
@@ -196,6 +228,14 @@ function QuestItemBar:Update()
frame:SetWidth(math.max(newWidth, 40))
end
+function QuestItemBar:UpdateCooldowns()
+ for _, button in ipairs(buttons) do
+ if button:IsShown() and Guda_ItemButton_UpdateCooldown then
+ Guda_ItemButton_UpdateCooldown(button)
+ end
+ end
+end
+
function QuestItemBar:Initialize()
local frame = CreateFrame("Frame", "Guda_QuestItemBar", UIParent)
frame:SetWidth(40)
@@ -229,6 +269,10 @@ function QuestItemBar:Initialize()
addon.Modules.Events:Register("BAG_UPDATE", function()
QuestItemBar:Update()
end, "QuestItemBar")
+
+ addon.Modules.Events:Register("BAG_UPDATE_COOLDOWN", function()
+ QuestItemBar:UpdateCooldowns()
+ end, "QuestItemBar")
addon.Modules.Events:Register("PLAYER_ENTERING_WORLD", function()
QuestItemBar:Update()
diff --git a/UI/SettingsPopup.lua b/UI/SettingsPopup.lua
index 4cd2e19..497e8de 100644
--- a/UI/SettingsPopup.lua
+++ b/UI/SettingsPopup.lua
@@ -58,6 +58,10 @@ function Guda_SettingsPopup_OnShow(self)
if showQuestBar == nil then
showQuestBar = true
end
+ local hoverBagline = Guda.Modules.DB:GetSetting("hoverBagline")
+ if hoverBagline == nil then
+ hoverBagline = false
+ end
-- Update sliders and checkboxes
local bagSlider = getglobal("Guda_SettingsPopup_BagColumnsSlider")
@@ -71,6 +75,7 @@ function Guda_SettingsPopup_OnShow(self)
local qualityBorderOtherCheckbox = getglobal("Guda_SettingsPopup_QualityBorderOtherCheckbox")
local showSearchBarCheckbox = getglobal("Guda_SettingsPopup_ShowSearchBarCheckbox")
local showQuestBarCheckbox = getglobal("Guda_SettingsPopup_ShowQuestBarCheckbox")
+ local hoverBaglineCheckbox = getglobal("Guda_SettingsPopup_HoverBaglineCheckbox")
if bagSlider then
bagSlider:SetValue(bagColumns)
@@ -115,6 +120,16 @@ function Guda_SettingsPopup_OnShow(self)
if showQuestBarCheckbox then
showQuestBarCheckbox:SetChecked(showQuestBar and 1 or 0)
end
+
+ if hoverBaglineCheckbox then
+ hoverBaglineCheckbox:SetChecked(hoverBagline and 1 or 0)
+ end
+
+ -- Update display (might be too tall for current frame size)
+ local frame = getglobal("Guda_SettingsPopup")
+ if frame then
+ frame:SetHeight(560)
+ end
end
-- Toggle visibility
@@ -603,6 +618,46 @@ function Guda_SettingsPopup_ShowQuestBarCheckbox_OnClick(self)
end
end
+-- Hover Bagline Checkbox OnLoad
+function Guda_SettingsPopup_HoverBaglineCheckbox_OnLoad(self)
+ local text = getglobal(self:GetName().."Text")
+ if text then
+ text:SetText("Hover Bagline")
+
+ -- Increase font size
+ local font, _, flags = text:GetFont()
+ if font then
+ text:SetFont(font, 13, flags)
+ end
+ end
+
+ local hoverBagline = false
+ if Guda and Guda.Modules and Guda.Modules.DB then
+ hoverBagline = Guda.Modules.DB:GetSetting("hoverBagline")
+ if hoverBagline == nil then
+ hoverBagline = false
+ end
+ end
+
+ self:SetChecked(hoverBagline and 1 or 0)
+end
+
+-- Hover Bagline Checkbox OnClick
+function Guda_SettingsPopup_HoverBaglineCheckbox_OnClick(self)
+ local isChecked = self:GetChecked() == 1
+
+ -- Save setting
+ if Guda and Guda.Modules and Guda.Modules.DB then
+ Guda.Modules.DB:SetSetting("hoverBagline", isChecked)
+ end
+
+ -- Update bag frame
+ local bagFrame = getglobal("Guda_BagFrame")
+ if bagFrame and bagFrame:IsShown() then
+ Guda.Modules.BagFrame:Update()
+ end
+end
+
-- Initialize
function SettingsPopup:Initialize()
Guda:Debug("Settings popup initialized")
diff --git a/UI/SettingsPopup.xml b/UI/SettingsPopup.xml
index 259d560..405462b 100644
--- a/UI/SettingsPopup.xml
+++ b/UI/SettingsPopup.xml
@@ -283,6 +283,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Guda_SettingsPopup_HoverBaglineCheckbox_OnLoad(this)
+
+
+ Guda_SettingsPopup_HoverBaglineCheckbox_OnClick(this)
+
+
+