From bf4ea760b218897c44f519d22a339ec91d7e17d0 Mon Sep 17 00:00:00 2001 From: Salikh Gurgenidze Date: Sat, 27 Dec 2025 23:29:44 +0400 Subject: [PATCH] fix: dropdown --- UI/BagFrame.lua | 257 +++++++++++--------------------------------- UI/BankFrame.lua | 12 +++ UI/BankFrame.xml | 6 +- UI/MailboxFrame.lua | 10 ++ UI/MailboxFrame.xml | 3 + 5 files changed, 87 insertions(+), 201 deletions(-) diff --git a/UI/BagFrame.lua b/UI/BagFrame.lua index 3900577..3d5e70a 100644 --- a/UI/BagFrame.lua +++ b/UI/BagFrame.lua @@ -112,6 +112,9 @@ end -- OnHide function Guda_BagFrame_OnHide(self) + -- Close any open dropdown menus when the bag frame is hidden + CloseDropDownMenus() + -- Clean up all buttons when frame is hidden (safe since we're not displaying) for _, bagParent in pairs(bagParents) do if bagParent then @@ -1452,71 +1455,58 @@ function Guda_BagFrame_ToggleCharacterDropdown(button) ToggleDropDownMenu(1, nil, menuFrame, "cursor", 0, 0) end --- Hide dropdown when clicking elsewhere -local function HideCharacterDropdown() - -- Handled by UIDropDownMenu system +-- Mailbox character dropdown +local function Guda_BagMailboxMenu_Initialize() + local characters = addon.Modules.DB:GetAllCharacters(false, true) + local info + + for i, char in ipairs(characters) do + local charFullName = char.fullName + local charClassToken = char.classToken + + -- Get class color + local classColor = charClassToken and RAID_CLASS_COLORS[charClassToken] + local r, g, b = 1, 1, 1 + if classColor then + r, g, b = classColor.r, classColor.g, classColor.b + end + + -- Create colored name + local coloredName = addon.Modules.Utils:ColorText(char.name, r, g, b) + + info = {} + info.text = coloredName + info.func = function() + addon.Modules.MailboxFrame:ShowCharacter(charFullName) + if not Guda_MailboxFrame:IsShown() then + Guda_MailboxFrame:Show() + end + end + local mailboxViewChar = addon.Modules.MailboxFrame:GetCurrentViewChar() + info.checked = (mailboxViewChar == charFullName or (not mailboxViewChar and charFullName == addon.Modules.DB:GetPlayerFullName())) + UIDropDownMenu_AddButton(info) + end end -- Toggle mail dropdown function Guda_BagFrame_ToggleMailDropdown(button) - if mailDropdown and mailDropdown:IsShown() then - mailDropdown:Hide() - return + local menuFrame = getglobal("Guda_BagMailboxMenu") + if not menuFrame then + menuFrame = CreateFrame("Frame", "Guda_BagMailboxMenu", UIParent, "UIDropDownMenuTemplate") end + UIDropDownMenu_Initialize(menuFrame, Guda_BagMailboxMenu_Initialize, "MENU") + ToggleDropDownMenu(1, nil, menuFrame, "cursor", 0, 0) +end - if not mailDropdown then - -- Create dropdown frame - mailDropdown = CreateFrame("Frame", "Guda_MailDropdown", UIParent) - mailDropdown:SetFrameStrata("DIALOG") - mailDropdown:SetWidth(200) - mailDropdown:SetBackdrop({ - bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", - edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", - tile = true, - tileSize = 16, - edgeSize = 16, - insets = { left = 4, right = 4, top = 4, bottom = 4 } - }) - mailDropdown:SetBackdropColor(0, 0, 0, 0.95) - mailDropdown:EnableMouse(true) - mailDropdown:Hide() +-- Bank character dropdown +local function Guda_BagBankMenu_Initialize() + local characters = addon.Modules.DB:GetAllCharacters(false, true) + local info - mailDropdown.buttons = {} - end - - -- Position dropdown below the button - mailDropdown:ClearAllPoints() - mailDropdown:SetPoint("TOPLEFT", button, "BOTTOMLEFT", 0, -2) - -- Clear existing buttons - for _, btn in ipairs(mailDropdown.buttons) do - btn:Hide() - end - mailDropdown.buttons = {} - - -- Get all characters on current realm - local chars = addon.Modules.DB:GetAllCharacters(false, true) - - local yOffset = -8 - - -- Add character buttons - for _, char in ipairs(chars) do - -- Capture variables in local scope for closure + for i, char in ipairs(characters) do local charFullName = char.fullName - local charName = char.name local charClassToken = char.classToken - local charButton = CreateFrame("Button", nil, mailDropdown) - charButton:SetWidth(188) - charButton:SetHeight(20) - charButton:SetPoint("TOP", mailDropdown, "TOP", 0, yOffset) - - -- Button background on hover - local charBg = charButton:CreateTexture(nil, "BACKGROUND") - charBg:SetAllPoints() - charBg:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight") - charBg:SetBlendMode("ADD") - charBg:SetAlpha(0) - -- Get class color local classColor = charClassToken and RAID_CLASS_COLORS[charClassToken] local r, g, b = 1, 1, 1 @@ -1524,154 +1514,29 @@ function Guda_BagFrame_ToggleMailDropdown(button) r, g, b = classColor.r, classColor.g, classColor.b end - -- Button text - local charText = charButton:CreateFontString(nil, "ARTWORK", "GameFontHighlight") - charText:SetPoint("LEFT", charButton, "LEFT", 8, 0) - charText:SetText(charName) - charText:SetTextColor(r, g, b) + -- Create colored name + local charName = char.name + local coloredName = addon.Modules.Utils:ColorText(charName, r, g, b) - -- Button scripts - charButton:SetScript("OnEnter", function() - charBg:SetAlpha(0.3) - end) - charButton:SetScript("OnLeave", function() - charBg:SetAlpha(0) - end) - charButton:SetScript("OnClick", function() - if charFullName then - -- Show mailbox for this character - addon.Modules.MailboxFrame:ShowCharacter(charFullName) - if not Guda_MailboxFrame:IsShown() then - Guda_MailboxFrame:Show() - end - mailDropdown:Hide() - else - addon:Print("Error: Character fullName is nil") - end - end) - - table.insert(mailDropdown.buttons, charButton) - yOffset = yOffset - 20 + info = {} + info.text = coloredName + info.func = function() + Guda_BagFrame_ShowCharacterBank(charFullName, charName) + end + local bankViewChar = addon.Modules.BankFrame:GetCurrentViewChar() + info.checked = (bankViewChar == charFullName or (not bankViewChar and charFullName == addon.Modules.DB:GetPlayerFullName())) + UIDropDownMenu_AddButton(info) end - - -- Set dropdown height based on content - mailDropdown:SetHeight(math.abs(yOffset) + 8) - - -- Show dropdown - mailDropdown:Show() end -- Toggle bank dropdown function Guda_BagFrame_ToggleBankDropdown(button) --- Hide character dropdown if it's shown - if characterDropdown and characterDropdown:IsShown() then - characterDropdown:Hide() + local menuFrame = getglobal("Guda_BagBankMenu") + if not menuFrame then + menuFrame = CreateFrame("Frame", "Guda_BagBankMenu", UIParent, "UIDropDownMenuTemplate") end - - if bankDropdown and bankDropdown:IsShown() then - bankDropdown:Hide() - return - end - - if not bankDropdown then - -- Create dropdown frame - bankDropdown = CreateFrame("Frame", "Guda_BankDropdown", UIParent) - bankDropdown:SetFrameStrata("DIALOG") - bankDropdown:SetWidth(200) - bankDropdown:SetBackdrop({ - bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", - edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", - tile = true, - tileSize = 16, - edgeSize = 16, - insets = { left = 4, right = 4, top = 4, bottom = 4 } - }) - bankDropdown:SetBackdropColor(0, 0, 0, 0.95) - bankDropdown:EnableMouse(true) - bankDropdown:Hide() - - bankDropdown.buttons = {} - end - - -- Position dropdown below the button - bankDropdown:ClearAllPoints() - bankDropdown:SetPoint("TOPLEFT", button, "BOTTOMLEFT", 0, -2) - -- Clear existing buttons - for _, btn in ipairs(bankDropdown.buttons) do - btn:Hide() - end - bankDropdown.buttons = {} - - -- Get all characters on current realm - local chars = addon.Modules.DB:GetAllCharacters(false, true) - - local yOffset = -8 - - -- Add character buttons - for _, char in ipairs(chars) do - -- Capture variables in local scope for closure - local charFullName = char.fullName - local charName = char.name - local charMoney = char.money or 0 - local charClassToken = char.classToken - - local charButton = CreateFrame("Button", nil, bankDropdown) - charButton:SetWidth(188) - charButton:SetHeight(20) - charButton:SetPoint("TOP", bankDropdown, "TOP", 0, yOffset) - - -- Button background on hover - local charBg = charButton:CreateTexture(nil, "BACKGROUND") - charBg:SetAllPoints() - charBg:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight") - charBg:SetBlendMode("ADD") - charBg:SetAlpha(0) - - -- Get class color - local classColor = charClassToken and RAID_CLASS_COLORS[charClassToken] - local r, g, b = 1, 1, 1 - if classColor then - r, g, b = classColor.r, classColor.g, classColor.b - end - - -- Button text - local charText = charButton:CreateFontString(nil, "ARTWORK", "GameFontHighlight") - charText:SetPoint("LEFT", charButton, "LEFT", 8, 0) - charText:SetText(charName) - charText:SetTextColor(r, g, b) - - -- Money text - local moneyText = charButton:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall") - moneyText:SetPoint("RIGHT", charButton, "RIGHT", -8, 0) - moneyText:SetText(addon.Modules.Utils:FormatMoney(charMoney)) - moneyText:SetTextColor(0.7, 0.7, 0.7) - - -- Button scripts - charButton:SetScript("OnEnter", function() - charBg:SetAlpha(0.3) - end) - charButton:SetScript("OnLeave", function() - charBg:SetAlpha(0) - end) - charButton:SetScript("OnClick", function() - if charFullName then - -- Show bank for this character - Guda_BagFrame_ShowCharacterBank(charFullName, charName) - bankDropdown:Hide() - else - addon:Print("Error: Character fullName is nil") - end - end) - - table.insert(bankDropdown.buttons, charButton) - yOffset = yOffset - 20 - end - - -- Set dropdown height based on content - bankDropdown:SetHeight(math.abs(yOffset) + 8) - - -- Show dropdown - bankDropdown:Show() + UIDropDownMenu_Initialize(menuFrame, Guda_BagBankMenu_Initialize, "MENU") + ToggleDropDownMenu(1, nil, menuFrame, "cursor", 0, 0) end -- Show character's bank diff --git a/UI/BankFrame.lua b/UI/BankFrame.lua index 2e5c0c8..5aede91 100644 --- a/UI/BankFrame.lua +++ b/UI/BankFrame.lua @@ -81,6 +81,18 @@ function Guda_BankFrame_OnShow(self) BankFrame:Update() end +-- OnHide +function Guda_BankFrame_OnHide(self) + -- Close any open dropdown menus when the bank frame is hidden + CloseDropDownMenus() + + -- Close the actual Blizzard bank too + local blizzardBankFrame = getglobal("BankFrame") + if blizzardBankFrame and blizzardBankFrame:IsShown() then + CloseBankFrame() + end +end + -- Toggle visibility function BankFrame:Toggle() if Guda_BankFrame:IsShown() then diff --git a/UI/BankFrame.xml b/UI/BankFrame.xml index 5db740e..e4e1af4 100644 --- a/UI/BankFrame.xml +++ b/UI/BankFrame.xml @@ -648,11 +648,7 @@ Guda_BankFrame_OnShow(this) - Guda_BankFrame:Hide() - -- Close the actual Blizzard bank too - if BankFrame and BankFrame:IsShown() then - CloseBankFrame() - end + Guda_BankFrame_OnHide(this) -- Clear search box focus when clicking on bank frame diff --git a/UI/MailboxFrame.lua b/UI/MailboxFrame.lua index b18fc0e..ec3206d 100644 --- a/UI/MailboxFrame.lua +++ b/UI/MailboxFrame.lua @@ -61,6 +61,12 @@ function Guda_MailboxFrame_OnShow(self) MailboxFrame:Update() end +-- OnHide +function Guda_MailboxFrame_OnHide(self) + -- Close any open dropdown menus when the mailbox frame is hidden + CloseDropDownMenus() +end + -- Toggle visibility function MailboxFrame:Toggle() if Guda_MailboxFrame:IsShown() then @@ -71,6 +77,10 @@ function MailboxFrame:Toggle() end -- Show specific character's mailbox +function MailboxFrame:GetCurrentViewChar() + return currentViewChar +end + function MailboxFrame:ShowCharacter(fullName) currentViewChar = fullName currentPage = 1 diff --git a/UI/MailboxFrame.xml b/UI/MailboxFrame.xml index 3ae8c80..4b54022 100644 --- a/UI/MailboxFrame.xml +++ b/UI/MailboxFrame.xml @@ -325,6 +325,9 @@ Guda_MailboxFrame_OnShow(this) + + Guda_MailboxFrame_OnHide(this) + this:StartMoving()