From 8bdffff387eab602358adc39ae6fdf6be4d8dc4b Mon Sep 17 00:00:00 2001 From: Salikh Gurgenidze Date: Sun, 21 Dec 2025 19:55:02 +0400 Subject: [PATCH] feat: bagline shorten --- Core/Database.lua | 4 ++ Guda.toc | 2 +- UI/BagFrame.lua | 138 +++++++++++++++++++++++++++++++++++++++++++ UI/BagFrame.xml | 7 +++ UI/QuestItemBar.lua | 50 +++++++++++++++- UI/SettingsPopup.lua | 55 +++++++++++++++++ UI/SettingsPopup.xml | 19 ++++++ 7 files changed, 271 insertions(+), 4 deletions(-) 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) + + +