From 8e73db855d3dee785668d88e2f4e7c4fcc380b55 Mon Sep 17 00:00:00 2001 From: Vati Date: Fri, 27 Feb 2026 04:11:46 +0400 Subject: [PATCH] blizzard theme ui --- .gitignore | 3 +- Assets/Bank-Background.blp | Bin 0 -> 88596 bytes Core/Init.lua | 21 +- Core/Theme.lua | 416 +++++++++++++++++++++++++++++++++++++ Guda.toc | 1 + UI/BagFrame.lua | 6 + UI/BagFrame.xml | 12 -- UI/BankFrame.lua | 6 + UI/BankFrame.xml | 12 -- UI/ItemButton.lua | 39 +++- UI/MailboxFrame.lua | 6 + UI/MailboxFrame.xml | 12 -- UI/SettingsPopup.lua | 86 +++++--- UI/SettingsPopup.xml | 41 ++-- 14 files changed, 548 insertions(+), 113 deletions(-) create mode 100644 Assets/Bank-Background.blp create mode 100644 Core/Theme.lua diff --git a/.gitignore b/.gitignore index 5360bd9..06727ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .claude .vscode .idea -NUL \ No newline at end of file +NUL +temp \ No newline at end of file diff --git a/Assets/Bank-Background.blp b/Assets/Bank-Background.blp new file mode 100644 index 0000000000000000000000000000000000000000..abc78c541060242b26177f5262957e7ad4020a41 GIT binary patch literal 88596 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

5uz!U7PWE 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 0 then + bg:SetAlpha(alpha) + bg:Show() + else + bg:Hide() + end + end + i = i + 1 + end +end + +-- Clear cache (call when theme setting changes) +function Theme:ClearCache() + cachedTheme = nil + cachedThemeName = nil +end + +-- Slash command to toggle theme debug +SLASH_GUDATHEME1 = "/gudatheme" +SlashCmdList["GUDATHEME"] = function(msg) + if msg == "on" then + addon.DEBUG_THEME = true + DEFAULT_CHAT_FRAME:AddMessage("|cFFFF8800[Theme]|r Debug ON — reapplying all frames...") + Theme:ApplyToAllFrames() + elseif msg == "off" then + addon.DEBUG_THEME = false + DEFAULT_CHAT_FRAME:AddMessage("|cFFFF8800[Theme]|r Debug OFF") + elseif msg == "apply" then + local prev = addon.DEBUG_THEME + addon.DEBUG_THEME = true + Theme:ApplyToAllFrames() + addon.DEBUG_THEME = prev + elseif msg == "inspect" then + -- Dump backdrop state for all frames without reapplying + local frameNames = { "Guda_BagFrame", "Guda_BankFrame", "Guda_MailboxFrame", "Guda_SettingsPopup", "Guda_CategoryEditor", "Guda_QuestItemBar" } + -- Show current transparency setting + local transp = "N/A" + if addon.Modules and addon.Modules.DB then + transp = tostring(addon.Modules.DB:GetSetting("bgTransparency")) + end + DEFAULT_CHAT_FRAME:AddMessage(string.format("|cFFFF8800[Theme]|r === Inspect Backdrop === (bgTransparency=%s, alpha=%s)", + transp, tostring(1.0 - (tonumber(transp) or 0.15)))) + for _, fn in ipairs(frameNames) do + local f = getglobal(fn) + if f then + local bd = f:GetBackdrop() + if bd then + DEFAULT_CHAT_FRAME:AddMessage(string.format(" |cFFFFFF00%s|r: bgFile=%s edgeFile=%s tile=%s tileSize=%s", + fn, tostring(bd.bgFile), tostring(bd.edgeFile), tostring(bd.tile), tostring(bd.tileSize))) + else + DEFAULT_CHAT_FRAME:AddMessage(string.format(" |cFFFFFF00%s|r: backdrop=nil", fn)) + end + DEFAULT_CHAT_FRAME:AddMessage(string.format(" visible=%s size=%dx%d level=%s strata=%s", + tostring(f:IsVisible()), f:GetWidth(), f:GetHeight(), + tostring(f:GetFrameLevel()), tostring(f:GetFrameStrata()))) + -- Check child bg frame + if f._gudaBgFrame then + local cbd = f._gudaBgFrame:GetBackdrop() + DEFAULT_CHAT_FRAME:AddMessage(string.format(" bgFrame: bgFile=%s shown=%s visible=%s level=%s", + cbd and tostring(cbd.bgFile) or "nil", + tostring(f._gudaBgFrame:IsShown()), + tostring(f._gudaBgFrame:IsVisible()), + tostring(f._gudaBgFrame:GetFrameLevel()))) + end + else + DEFAULT_CHAT_FRAME:AddMessage(string.format(" |cFFFF0000%s|r: frame not found", fn)) + end + end + elseif msg == "test" then + -- Create standalone test frames to isolate which textures render via Lua + local p = DEFAULT_CHAT_FRAME + p:AddMessage("|cFFFF8800[Theme]|r === Texture Test ===") + + -- Test 1: ChatFrameBackground (known working) + local f1 = CreateFrame("Frame", "GudaThemeTest1", UIParent) + f1:SetWidth(200); f1:SetHeight(200) + f1:SetPoint("CENTER", -220, 0) + f1:SetFrameStrata("TOOLTIP") + f1:SetBackdrop({ + bgFile = "Interface\\ChatFrame\\ChatFrameBackground", + edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", + tile = true, tileSize = 16, edgeSize = 32, + insets = { left = 11, right = 12, top = 12, bottom = 11 } + }) + f1:SetBackdropColor(0, 0, 0, 1) + f1:Show() + p:AddMessage(" Test 1 (LEFT): ChatFrameBackground — should be solid black") + + -- Test 2: UI-DialogBox-Background (the broken one) + local f2 = CreateFrame("Frame", "GudaThemeTest2", UIParent) + f2:SetWidth(200); f2:SetHeight(200) + f2:SetPoint("CENTER", 0, 0) + f2:SetFrameStrata("TOOLTIP") + f2:SetBackdrop({ + bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", + edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", + tile = true, tileSize = 32, edgeSize = 32, + insets = { left = 11, right = 12, top = 12, bottom = 11 } + }) + f2:SetBackdropColor(1, 1, 1, 1) + f2:Show() + p:AddMessage(" Test 2 (CENTER): UI-DialogBox-Background — should be parchment") + + -- Test 3: UI-Tooltip-Background (another common texture) + local f3 = CreateFrame("Frame", "GudaThemeTest3", UIParent) + f3:SetWidth(200); f3:SetHeight(200) + f3:SetPoint("CENTER", 220, 0) + f3:SetFrameStrata("TOOLTIP") + f3:SetBackdrop({ + bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", + edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", + tile = true, tileSize = 16, edgeSize = 32, + insets = { left = 11, right = 12, top = 12, bottom = 11 } + }) + f3:SetBackdropColor(1, 1, 1, 1) + f3:Show() + p:AddMessage(" Test 3 (RIGHT): UI-Tooltip-Background — should be purple/blue") + + p:AddMessage("|cFFFF8800[Theme]|r /gudatheme clear to remove test frames") + + elseif msg == "scan" then + -- Enable mouseover scanning: hover any frame to print its backdrop info + if addon._themeScanFrame then + addon._themeScanFrame:Hide() + addon._themeScanFrame = nil + DEFAULT_CHAT_FRAME:AddMessage("|cFFFF8800[Theme]|r Scan OFF") + else + local scanner = CreateFrame("Frame", nil, UIParent) + scanner:SetAllPoints(UIParent) + scanner:SetFrameStrata("TOOLTIP") + scanner:EnableMouse(false) + scanner._lastFrame = nil + scanner:SetScript("OnUpdate", function() + local f = GetMouseFocus() + if f and f ~= this._lastFrame then + this._lastFrame = f + local name = f:GetName() or "unnamed" + local p = DEFAULT_CHAT_FRAME + + -- Print backdrop if any + local bd = f.GetBackdrop and f:GetBackdrop() + if bd and (bd.bgFile or bd.edgeFile) then + p:AddMessage(string.format( + "|cFFFF8800[Scan]|r |cFFFFFF00%s|r bgFile=%s edgeFile=%s tile=%s tileSize=%s", + name, tostring(bd.bgFile), tostring(bd.edgeFile), + tostring(bd.tile), tostring(bd.tileSize))) + end + + -- Print textures via GetRegions() + if f.GetRegions then + local regions = { f:GetRegions() } + for i, region in ipairs(regions) do + if region and region.GetTexture then + local tex = region:GetTexture() + if tex and tex ~= "" then + local rname = region:GetName() or ("region" .. i) + local layer = region.GetDrawLayer and region:GetDrawLayer() or "?" + p:AddMessage(string.format( + "|cFFFF8800[Scan]|r |cFF88FF88%s|r tex=%s layer=%s", + rname, tostring(tex), tostring(layer))) + end + end + end + end + + -- If nothing printed, at least show the frame name + if not (bd and (bd.bgFile or bd.edgeFile)) then + local hasTextures = false + if f.GetRegions then + local regions = { f:GetRegions() } + for _, region in ipairs(regions) do + if region and region.GetTexture and region:GetTexture() and region:GetTexture() ~= "" then + hasTextures = true + break + end + end + end + if not hasTextures then + p:AddMessage(string.format("|cFFFF8800[Scan]|r |cFF888888%s|r (no backdrop, no textures)", name)) + end + end + end + end) + scanner:Show() + addon._themeScanFrame = scanner + DEFAULT_CHAT_FRAME:AddMessage("|cFFFF8800[Theme]|r Scan ON — hover any frame to see its backdrop. /gudatheme scan again to stop.") + end + + elseif msg == "clear" then + for _, name in ipairs({"GudaThemeTest1", "GudaThemeTest2", "GudaThemeTest3"}) do + local f = getglobal(name) + if f then f:Hide() end + end + DEFAULT_CHAT_FRAME:AddMessage("|cFFFF8800[Theme]|r Test frames hidden") + + else + DEFAULT_CHAT_FRAME:AddMessage("|cFFFF8800[Theme]|r Usage:") + DEFAULT_CHAT_FRAME:AddMessage(" /gudatheme on — Enable debug logging") + DEFAULT_CHAT_FRAME:AddMessage(" /gudatheme off — Disable debug logging") + DEFAULT_CHAT_FRAME:AddMessage(" /gudatheme apply — Reapply all frames (with debug)") + DEFAULT_CHAT_FRAME:AddMessage(" /gudatheme inspect — Dump backdrop state") + DEFAULT_CHAT_FRAME:AddMessage(" /gudatheme test — Show 3 test frames with different textures") + DEFAULT_CHAT_FRAME:AddMessage(" /gudatheme clear — Hide test frames") + end +end + +addon:Debug("Theme module loaded") diff --git a/Guda.toc b/Guda.toc index c817bb3..775eb44 100644 --- a/Guda.toc +++ b/Guda.toc @@ -9,6 +9,7 @@ Localization.lua Core\Init.lua +Core\Theme.lua Core\Constants.lua Core\Database.lua DB\QuestItems.lua diff --git a/UI/BagFrame.lua b/UI/BagFrame.lua index 0163886..5b4f364 100644 --- a/UI/BagFrame.lua +++ b/UI/BagFrame.lua @@ -2352,6 +2352,12 @@ function BagFrame:UpdateBorderVisibility() local frame = getglobal("Guda_BagFrame") if not frame then return end + -- Use Theme module if available + if addon.Modules.Theme then + addon.Modules.Theme:ApplyToFrame(frame) + return + end + local hideBorders = addon.Modules.DB:GetSetting("hideBorders") if hideBorders == nil then hideBorders = false diff --git a/UI/BagFrame.xml b/UI/BagFrame.xml index 82d179f..e82a124 100644 --- a/UI/BagFrame.xml +++ b/UI/BagFrame.xml @@ -15,18 +15,6 @@ - - - - - - - - - - - - diff --git a/UI/BankFrame.lua b/UI/BankFrame.lua index 7365caf..aeb80b8 100644 --- a/UI/BankFrame.lua +++ b/UI/BankFrame.lua @@ -1886,6 +1886,12 @@ function BankFrame:UpdateBorderVisibility() local frame = getglobal("Guda_BankFrame") if not frame then return end + -- Use Theme module if available + if addon.Modules.Theme then + addon.Modules.Theme:ApplyToFrame(frame) + return + end + local hideBorders = addon.Modules.DB:GetSetting("hideBorders") if hideBorders == nil then hideBorders = false diff --git a/UI/BankFrame.xml b/UI/BankFrame.xml index 959a02f..a37e451 100644 --- a/UI/BankFrame.xml +++ b/UI/BankFrame.xml @@ -15,18 +15,6 @@ - - - - - - - - - - - - diff --git a/UI/ItemButton.lua b/UI/ItemButton.lua index 55c5003..04a7662 100644 --- a/UI/ItemButton.lua +++ b/UI/ItemButton.lua @@ -918,8 +918,17 @@ local function ClearItemButton(self, emptySlotBg, countText, bagID) -- Show/hide empty slot background if emptySlotBg then - emptySlotBg:Show() - emptySlotBg:SetAlpha(0.5) + local slotAlpha = 0.5 + if addon.Modules and addon.Modules.Theme then + local sa = addon.Modules.Theme:GetValue("slotBgAlpha") + if sa then slotAlpha = sa.empty end + end + if slotAlpha > 0 then + emptySlotBg:Show() + emptySlotBg:SetAlpha(slotAlpha) + else + emptySlotBg:Hide() + end end if countText then countText:Hide() end @@ -1215,8 +1224,17 @@ function Guda_ItemButton_SetItem(self, bagID, slotID, itemData, isBank, otherCha -- Show bag pattern background behind items as well if emptySlotBg then - emptySlotBg:Show() - emptySlotBg:SetAlpha(0.3) -- More subtle for filled slots + local slotAlpha = 0.3 + if addon.Modules and addon.Modules.Theme then + local sa = addon.Modules.Theme:GetValue("slotBgAlpha") + if sa then slotAlpha = sa.filled end + end + if slotAlpha > 0 then + emptySlotBg:Show() + emptySlotBg:SetAlpha(slotAlpha) + else + emptySlotBg:Hide() + end end -- Check if item is junk using the CategoryManager @@ -1346,8 +1364,17 @@ function Guda_ItemButton_SetItem(self, bagID, slotID, itemData, isBank, otherCha -- Show classic bag pattern background for empty slots if emptySlotBg then - emptySlotBg:Show() - emptySlotBg:SetAlpha(0.5) -- Slightly more visible + local slotAlpha = 0.5 + if addon.Modules and addon.Modules.Theme then + local sa = addon.Modules.Theme:GetValue("slotBgAlpha") + if sa then slotAlpha = sa.empty end + end + if slotAlpha > 0 then + emptySlotBg:Show() + emptySlotBg:SetAlpha(slotAlpha) + else + emptySlotBg:Hide() + end end -- Dim empty slots when searching diff --git a/UI/MailboxFrame.lua b/UI/MailboxFrame.lua index 9738ed3..9987418 100644 --- a/UI/MailboxFrame.lua +++ b/UI/MailboxFrame.lua @@ -73,6 +73,12 @@ end -- Update border visibility function MailboxFrame:UpdateBorderVisibility() + -- Use Theme module if available + if addon.Modules and addon.Modules.Theme then + addon.Modules.Theme:ApplyToFrame(Guda_MailboxFrame) + return + end + local hideBorders = addon.Modules.DB:GetSetting("hideBorders") if hideBorders then Guda:ApplyBackdrop(Guda_MailboxFrame, "MINIMALIST_BORDER", "DEFAULT") diff --git a/UI/MailboxFrame.xml b/UI/MailboxFrame.xml index 94d1590..2a3a8f7 100644 --- a/UI/MailboxFrame.xml +++ b/UI/MailboxFrame.xml @@ -91,18 +91,6 @@ - - - - - - - - - - - - diff --git a/UI/SettingsPopup.lua b/UI/SettingsPopup.lua index 21125bc..312897a 100644 --- a/UI/SettingsPopup.lua +++ b/UI/SettingsPopup.lua @@ -151,6 +151,7 @@ function Guda_SettingsPopup_OnShow(self) local showTooltipCountsCheckbox = getglobal("Guda_SettingsPopup_ShowTooltipCountsCheckbox") local bagViewButton = getglobal("Guda_SettingsPopup_BagViewTypeButton") local bankViewButton = getglobal("Guda_SettingsPopup_BankViewTypeButton") + local themeButton = getglobal("Guda_SettingsPopup_ThemeButton") local showTooltipCounts = Guda.Modules.DB:GetSetting("showTooltipCounts") if showTooltipCounts == nil then @@ -241,7 +242,11 @@ function Guda_SettingsPopup_OnShow(self) end end - + -- Initialize theme button text + if themeButton then + local currentTheme = Guda.Modules.DB:GetSetting("theme") or "guda" + themeButton:SetText(currentTheme == "guda" and "Theme: Guda" or "Theme: Blizzard") + end -- Apply border visibility if SettingsPopup.UpdateBorderVisibility then @@ -395,16 +400,21 @@ end -- Apply background transparency to bag and bank frames function Guda_ApplyBackgroundTransparency() + -- If Theme module is available, delegate to it (handles both themes correctly) + if Guda.Modules and Guda.Modules.Theme then + Guda.Modules.Theme:ApplyToAllFrames() + return + end + + -- Fallback: original behavior local transparency = Guda.Modules.DB:GetSetting("bgTransparency") or 0.15 local alpha = 1.0 - transparency - + local frames = { "Guda_BagFrame", "Guda_BankFrame", "Guda_MailboxFrame", "Guda_SettingsPopup", "Guda_QuestItemBar" } for _, frameName in ipairs(frames) do local frame = getglobal(frameName) if frame then - -- Reset frame alpha to 1.0 (previous version might have set it) frame:SetAlpha(1.0) - -- Set backdrop color (background only) frame:SetBackdropColor(0, 0, 0, alpha) end end @@ -684,37 +694,26 @@ function Guda_SettingsPopup_HideBordersCheckbox_OnClick(self) Guda.Modules.DB:SetSetting("hideBorders", isChecked) end - -- Update border visibility on both bag and bank frames using helper function - local bagFrame = getglobal("Guda_BagFrame") - if bagFrame then - if isChecked then - Guda:ApplyBackdrop(bagFrame, "MINIMALIST_BORDER", "DEFAULT") - else - Guda:ApplyBackdrop(bagFrame, "DEFAULT_FRAME", "DEFAULT") + -- Apply theme to all frames (respects hideBorders setting) + if Guda.Modules and Guda.Modules.Theme then + Guda.Modules.Theme:ApplyToAllFrames() + else + -- Fallback if theme module not loaded + local bagFrame = getglobal("Guda_BagFrame") + if bagFrame then + Guda:ApplyBackdrop(bagFrame, isChecked and "MINIMALIST_BORDER" or "DEFAULT_FRAME", "DEFAULT") end - end - - local bankFrame = getglobal("Guda_BankFrame") - if bankFrame then - if isChecked then - Guda:ApplyBackdrop(bankFrame, "MINIMALIST_BORDER", "DEFAULT") - else - Guda:ApplyBackdrop(bankFrame, "DEFAULT_FRAME", "DEFAULT") + local bankFrame = getglobal("Guda_BankFrame") + if bankFrame then + Guda:ApplyBackdrop(bankFrame, isChecked and "MINIMALIST_BORDER" or "DEFAULT_FRAME", "DEFAULT") end - end - - local mailboxFrame = getglobal("Guda_MailboxFrame") - if mailboxFrame then - if isChecked then - Guda:ApplyBackdrop(mailboxFrame, "MINIMALIST_BORDER", "DEFAULT") - else - Guda:ApplyBackdrop(mailboxFrame, "DEFAULT_FRAME", "DEFAULT") + local mailboxFrame = getglobal("Guda_MailboxFrame") + if mailboxFrame then + Guda:ApplyBackdrop(mailboxFrame, isChecked and "MINIMALIST_BORDER" or "DEFAULT_FRAME", "DEFAULT") + end + if SettingsPopup.UpdateBorderVisibility then + SettingsPopup:UpdateBorderVisibility() end - end - - -- Update border visibility on settings frame - if SettingsPopup.UpdateBorderVisibility then - SettingsPopup:UpdateBorderVisibility() end end @@ -1142,6 +1141,29 @@ function Guda_SettingsPopup_MarkUnusableCheckbox_OnClick(self) end end +-- Theme Button OnClick +function Guda_SettingsPopup_ThemeButton_OnClick() + local current = Guda.Modules.DB:GetSetting("theme") or "guda" + local newValue = (current == "guda") and "blizzard" or "guda" + Guda.Modules.DB:SetSetting("theme", newValue) + + -- Clear theme cache + if Guda.Modules.Theme then + Guda.Modules.Theme:ClearCache() + end + + -- Update button text + local btn = getglobal("Guda_SettingsPopup_ThemeButton") + if btn then + btn:SetText(newValue == "guda" and "Theme: Guda" or "Theme: Blizzard") + end + + -- Apply theme to all frames (also updates slot background alphas) + if Guda.Modules.Theme then + Guda.Modules.Theme:ApplyToAllFrames() + end +end + -- Bag View Type Button OnClick function Guda_SettingsPopup_BagViewTypeButton_OnClick() local current = Guda.Modules.DB:GetSetting("bagViewType") or "single" diff --git a/UI/SettingsPopup.xml b/UI/SettingsPopup.xml index 4a26cd7..c5b0c11 100644 --- a/UI/SettingsPopup.xml +++ b/UI/SettingsPopup.xml @@ -14,18 +14,6 @@ - - - - - - - - - - - - @@ -203,15 +191,28 @@ + + + - + - + @@ -819,18 +820,6 @@ - - - - - - - - - - - -