This commit is contained in:
Salikh Gurgenidze
2025-12-27 23:12:32 +04:00
parent da02c24e1a
commit e6953aafc5
3 changed files with 87 additions and 265 deletions
+29 -160
View File
@@ -7,6 +7,9 @@ local BagFrame = {}
addon.Modules.BagFrame = BagFrame addon.Modules.BagFrame = BagFrame
local currentViewChar = nil -- nil = current character local currentViewChar = nil -- nil = current character
function BagFrame:GetCurrentViewChar()
return currentViewChar
end
local searchText = "" local searchText = ""
local itemButtons = {} local itemButtons = {}
local showKeyring = false -- Toggle for keyring display local showKeyring = false -- Toggle for keyring display
@@ -1405,119 +1408,15 @@ function Guda_BagFrame_MoneyOnEnter(self)
end end
-- Dropdown management -- Dropdown management
local characterDropdown = nil local function Guda_BagCharacterMenu_Initialize()
local bankDropdown = nil local characters = addon.Modules.DB:GetAllCharacters(false, true)
local info
-- Toggle character dropdown
function Guda_BagFrame_ToggleCharacterDropdown(button)
-- Hide bank dropdown if it's shown
if bankDropdown and bankDropdown:IsShown() then
bankDropdown:Hide()
end
if characterDropdown and characterDropdown:IsShown() then
characterDropdown:Hide()
return
end
if not characterDropdown then
-- Create dropdown frame
characterDropdown = CreateFrame("Frame", "Guda_CharacterDropdown", UIParent)
characterDropdown:SetFrameStrata("DIALOG")
characterDropdown:SetWidth(200)
characterDropdown: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 }
})
characterDropdown:SetBackdropColor(0, 0, 0, 0.95)
characterDropdown:EnableMouse(true)
characterDropdown:Hide()
characterDropdown.buttons = {}
end
-- Position dropdown below the button
characterDropdown:ClearAllPoints()
characterDropdown:SetPoint("TOPLEFT", button, "BOTTOMLEFT", 0, -2)
-- Clear existing buttons
for _, btn in ipairs(characterDropdown.buttons) do
btn:Hide()
end
characterDropdown.buttons = {}
-- Get all characters on current realm
local chars = addon.Modules.DB:GetAllCharacters(false, true)
-- Add "Current Character" option at the top
local yOffset = -8
local currentCharButton = CreateFrame("Button", nil, characterDropdown)
currentCharButton:SetWidth(188)
currentCharButton:SetHeight(20)
currentCharButton:SetPoint("TOP", characterDropdown, "TOP", 0, yOffset)
-- Button background on hover
local currentCharBg = currentCharButton:CreateTexture(nil, "BACKGROUND")
currentCharBg:SetAllPoints()
currentCharBg:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
currentCharBg:SetBlendMode("ADD")
currentCharBg:SetAlpha(0)
-- Button text
local currentCharText = currentCharButton:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
currentCharText:SetPoint("LEFT", currentCharButton, "LEFT", 8, 0)
currentCharText:SetText("Characters")
-- Button scripts
currentCharButton:SetScript("OnEnter", function()
currentCharBg:SetAlpha(0.3)
end)
currentCharButton:SetScript("OnLeave", function()
currentCharBg:SetAlpha(0)
end)
currentCharButton:SetScript("OnClick", function()
addon.Modules.BagFrame:ShowCurrentCharacter()
characterDropdown:Hide()
end)
table.insert(characterDropdown.buttons, currentCharButton)
yOffset = yOffset - 20
-- Add separator
local separator = characterDropdown:CreateTexture(nil, "ARTWORK")
separator:SetHeight(1)
separator:SetWidth(180)
separator:SetPoint("TOP", characterDropdown, "TOP", 0, yOffset)
separator:SetTexture(1, 1, 1, 0.2)
yOffset = yOffset - 4
-- Get current player's full name for comparison
local currentPlayerFullName = addon.Modules.DB:GetPlayerFullName() local currentPlayerFullName = addon.Modules.DB:GetPlayerFullName()
local currentViewChar = addon.Modules.BagFrame:GetCurrentViewChar()
-- Add character buttons for i, char in ipairs(characters) do
for _, char in ipairs(chars) do
-- Capture variables in local scope for closure
local charFullName = char.fullName local charFullName = char.fullName
local charName = char.name
local charMoney = char.money or 0
local charClassToken = char.classToken local charClassToken = char.classToken
local isCurrentChar = (charFullName == currentPlayerFullName)
local charButton = CreateFrame("Button", nil, characterDropdown)
charButton:SetWidth(188)
charButton:SetHeight(20)
charButton:SetPoint("TOP", characterDropdown, "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 -- Get class color
local classColor = charClassToken and RAID_CLASS_COLORS[charClassToken] local classColor = charClassToken and RAID_CLASS_COLORS[charClassToken]
@@ -1526,69 +1425,40 @@ function Guda_BagFrame_ToggleCharacterDropdown(button)
r, g, b = classColor.r, classColor.g, classColor.b r, g, b = classColor.r, classColor.g, classColor.b
end end
-- Button text -- Create colored name
local charText = charButton:CreateFontString(nil, "ARTWORK", "GameFontHighlight") local coloredName = addon.Modules.Utils:ColorText(char.name, r, g, b)
charText:SetPoint("LEFT", charButton, "LEFT", 8, 0)
charText:SetText(charName)
charText:SetTextColor(r, g, b)
-- Money text info = {}
local moneyText = charButton:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall") info.text = coloredName
moneyText:SetPoint("RIGHT", charButton, "RIGHT", -8, 0) info.func = function()
moneyText:SetText(addon.Modules.Utils:FormatMoney(charMoney)) if charFullName == currentPlayerFullName then
moneyText:SetTextColor(0.7, 0.7, 0.7) addon.Modules.BagFrame:ShowCurrentCharacter()
-- 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
if isCurrentChar then
-- Clicking current character - show current live view
addon.Modules.BagFrame:ShowCurrentCharacter()
else
-- Clicking different character - show their stored bags
addon.Modules.BagFrame:ShowCharacter(charFullName)
end
characterDropdown:Hide()
else else
addon:Print("Error: Character fullName is nil") addon.Modules.BagFrame:ShowCharacter(charFullName)
end end
end) end
info.checked = (currentViewChar == charFullName or (not currentViewChar and charFullName == currentPlayerFullName))
table.insert(characterDropdown.buttons, charButton) UIDropDownMenu_AddButton(info)
yOffset = yOffset - 20
end end
end
-- Set dropdown height based on content -- Toggle character dropdown
characterDropdown:SetHeight(math.abs(yOffset) + 8) function Guda_BagFrame_ToggleCharacterDropdown(button)
local menuFrame = getglobal("Guda_BagCharacterMenu")
-- Show dropdown if not menuFrame then
characterDropdown:Show() menuFrame = CreateFrame("Frame", "Guda_BagCharacterMenu", UIParent, "UIDropDownMenuTemplate")
end
UIDropDownMenu_Initialize(menuFrame, Guda_BagCharacterMenu_Initialize, "MENU")
ToggleDropDownMenu(1, nil, menuFrame, "cursor", 0, 0)
end end
-- Hide dropdown when clicking elsewhere -- Hide dropdown when clicking elsewhere
local function HideCharacterDropdown() local function HideCharacterDropdown()
if characterDropdown then -- Handled by UIDropDownMenu system
characterDropdown:Hide()
end
end end
-- Toggle mail dropdown -- Toggle mail dropdown
function Guda_BagFrame_ToggleMailDropdown(button) function Guda_BagFrame_ToggleMailDropdown(button)
-- Hide character dropdown if it's shown
if characterDropdown and characterDropdown:IsShown() then
characterDropdown:Hide()
end
if bankDropdown and bankDropdown:IsShown() then
bankDropdown:Hide()
end
if mailDropdown and mailDropdown:IsShown() then if mailDropdown and mailDropdown:IsShown() then
mailDropdown:Hide() mailDropdown:Hide()
return return
@@ -2680,7 +2550,6 @@ function BagFrame:Initialize()
if bagFrame then if bagFrame then
local originalOnMouseDown = bagFrame:GetScript("OnMouseDown") local originalOnMouseDown = bagFrame:GetScript("OnMouseDown")
bagFrame:SetScript("OnMouseDown", function() bagFrame:SetScript("OnMouseDown", function()
HideCharacterDropdown()
if originalOnMouseDown then if originalOnMouseDown then
originalOnMouseDown() originalOnMouseDown()
end end
+29 -93
View File
@@ -7,6 +7,9 @@ local BankFrame = {}
addon.Modules.BankFrame = BankFrame addon.Modules.BankFrame = BankFrame
local currentViewChar = nil local currentViewChar = nil
function BankFrame:GetCurrentViewChar()
return currentViewChar
end
local searchText = "" local searchText = ""
local isReadOnlyMode = false -- Track if viewing saved bank (read-only) or live bank (interactive) local isReadOnlyMode = false -- Track if viewing saved bank (read-only) or live bank (interactive)
local hiddenBankBags = {} -- Track which bank bags are hidden (bagID -> true/false) local hiddenBankBags = {} -- Track which bank bags are hidden (bagID -> true/false)
@@ -1829,69 +1832,16 @@ function Guda_BankFrame_ClearBagButtonHighlight()
end end
-- Bank character dropdown (similar to BagFrame's bank dropdown) -- Bank character dropdown (similar to BagFrame's bank dropdown)
local bankCharDropdown local function Guda_BankCharacterMenu_Initialize()
local characters = addon.Modules.DB:GetAllCharacters(false, true)
local info
local currentPlayerFullName = addon.Modules.DB:GetPlayerFullName()
local currentViewChar = addon.Modules.BankFrame:GetCurrentViewChar()
function Guda_BankFrame_ToggleBankDropdown(button) for i, char in ipairs(characters) do
if bankCharDropdown and bankCharDropdown:IsShown() then
bankCharDropdown:Hide()
return
end
if not bankCharDropdown then
-- Create dropdown frame
bankCharDropdown = CreateFrame("Frame", "Guda_BankCharDropdown", UIParent)
bankCharDropdown:SetFrameStrata("DIALOG")
bankCharDropdown:SetWidth(200)
bankCharDropdown: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 }
})
bankCharDropdown:SetBackdropColor(0, 0, 0, 0.95)
bankCharDropdown:EnableMouse(true)
bankCharDropdown:Hide()
bankCharDropdown.buttons = {}
end
-- Position dropdown below the button
bankCharDropdown:ClearAllPoints()
bankCharDropdown:SetPoint("TOPLEFT", button, "BOTTOMLEFT", 0, -2)
-- Clear existing buttons
for _, btn in ipairs(bankCharDropdown.buttons) do
btn:Hide()
end
bankCharDropdown.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 charFullName = char.fullName
local charName = char.name
local charMoney = char.money or 0
local charClassToken = char.classToken local charClassToken = char.classToken
local charButton = CreateFrame("Button", nil, bankCharDropdown)
charButton:SetWidth(188)
charButton:SetHeight(20)
charButton:SetPoint("TOP", bankCharDropdown, "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 -- Get class color
local classColor = charClassToken and RAID_CLASS_COLORS[charClassToken] local classColor = charClassToken and RAID_CLASS_COLORS[charClassToken]
local r, g, b = 1, 1, 1 local r, g, b = 1, 1, 1
@@ -1899,44 +1849,30 @@ function Guda_BankFrame_ToggleBankDropdown(button)
r, g, b = classColor.r, classColor.g, classColor.b r, g, b = classColor.r, classColor.g, classColor.b
end end
-- Button text -- Create colored name
local charText = charButton:CreateFontString(nil, "ARTWORK", "GameFontHighlight") local coloredName = addon.Modules.Utils:ColorText(char.name, r, g, b)
charText:SetPoint("LEFT", charButton, "LEFT", 8, 0)
charText:SetText(charName)
charText:SetTextColor(r, g, b)
-- Money text info = {}
local moneyText = charButton:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall") info.text = coloredName
moneyText:SetPoint("RIGHT", charButton, "RIGHT", -8, 0) info.func = function()
moneyText:SetText(addon.Modules.Utils:FormatMoney(charMoney)) if charFullName == currentPlayerFullName then
moneyText:SetTextColor(0.7, 0.7, 0.7) addon.Modules.BankFrame:ShowCurrentCharacter()
-- 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 using the BankFrame module
addon.Modules.BankFrame:ShowCharacter(charFullName)
bankCharDropdown:Hide()
else else
addon:Print("Error: Character fullName is nil") addon.Modules.BankFrame:ShowCharacter(charFullName)
end end
end) end
info.checked = (currentViewChar == charFullName or (not currentViewChar and charFullName == currentPlayerFullName))
table.insert(bankCharDropdown.buttons, charButton) UIDropDownMenu_AddButton(info)
yOffset = yOffset - 20
end end
end
-- Set dropdown height based on content function Guda_BankFrame_ToggleBankDropdown(button)
bankCharDropdown:SetHeight(math.abs(yOffset) + 8) local menuFrame = getglobal("Guda_BankCharacterMenu")
if not menuFrame then
-- Show dropdown menuFrame = CreateFrame("Frame", "Guda_BankCharacterMenu", UIParent, "UIDropDownMenuTemplate")
bankCharDropdown:Show() end
UIDropDownMenu_Initialize(menuFrame, Guda_BankCharacterMenu_Initialize, "MENU")
ToggleDropDownMenu(1, nil, menuFrame, "cursor", 0, 0)
end end
-- Drag handlers for bank bag slots -- Drag handlers for bank bag slots
+29 -12
View File
@@ -282,20 +282,37 @@ function Guda_MailboxFrame_OnSearchTextChanged()
end end
-- Show character selection menu -- Show character selection menu
function Guda_MailboxFrame_ShowCharacterMenu() local function Guda_MailboxCharacterMenu_Initialize()
local characters = addon.Modules.DB:GetAllCharacters(true, true) local characters = addon.Modules.DB:GetAllCharacters(true, true)
local menu = {} local info
for i, char in ipairs(characters) do for i, char in ipairs(characters) do
local charFullName = char.fullName local charFullName = char.fullName
table.insert(menu, { local charClassToken = char.classToken
text = char.name,
func = function() MailboxFrame:ShowCharacter(charFullName) end, -- Get class color
checked = (currentViewChar == char.fullName or (not currentViewChar and char.fullName == addon.Modules.DB:GetPlayerFullName())) 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() MailboxFrame:ShowCharacter(charFullName) end
info.checked = (currentViewChar == char.fullName or (not currentViewChar and char.fullName == addon.Modules.DB:GetPlayerFullName()))
UIDropDownMenu_AddButton(info)
end end
end
-- EasyMenu is available in 1.12.1
local menuFrame = CreateFrame("Frame", "Guda_MailboxCharacterMenu", UIParent, "UIDropDownMenuTemplate") function Guda_MailboxFrame_ShowCharacterMenu()
EasyMenu(menu, menuFrame, "cursor", 0, 0, "MENU") local menuFrame = getglobal("Guda_MailboxCharacterMenu")
if not menuFrame then
menuFrame = CreateFrame("Frame", "Guda_MailboxCharacterMenu", UIParent, "UIDropDownMenuTemplate")
end
UIDropDownMenu_Initialize(menuFrame, Guda_MailboxCharacterMenu_Initialize, "MENU")
ToggleDropDownMenu(1, nil, menuFrame, "cursor", 0, 0)
end end