From 45bdcde1d813671e50096e65de5fcc41837d2ccc Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 31 Jan 2026 08:23:17 +0000 Subject: [PATCH 1/6] Add druid mana bar option Co-authored-by: thibaut --- Bars/TertiaryResourceBar.lua | 62 ++++++++++++++++++++++++------------ Locales/enUS.lua | 2 ++ 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/Bars/TertiaryResourceBar.lua b/Bars/TertiaryResourceBar.lua index b52d069..082631a 100644 --- a/Bars/TertiaryResourceBar.lua +++ b/Bars/TertiaryResourceBar.lua @@ -7,22 +7,18 @@ local TertiaryResourceBarMixin = Mixin({}, addonTable.PowerBarMixin) function TertiaryResourceBarMixin:GetResource() local playerClass = select(2, UnitClass("player")) + if playerClass == "DRUID" then + local data = self:GetData() + if data and data.showDruidManaBar == true then + return Enum.PowerType.Mana + end + return nil + end + local tertiaryResources = { - ["DEATHKNIGHT"] = nil, - ["DEMONHUNTER"] = nil, - ["DRUID"] = nil, - ["EVOKER"] = { + ["EVOKER"] = { [1473] = "EBON_MIGHT", -- Augmentation }, - ["HUNTER"] = nil, - ["MAGE"] = nil, - ["MONK"] = nil, - ["PALADIN"] = nil, - ["PRIEST"] = nil, - ["ROGUE"] = nil, - ["SHAMAN"] = nil, - ["WARLOCK"] = nil, - ["WARRIOR"] = nil, } local spec = C_SpecializationInfo.GetSpecialization() @@ -30,12 +26,6 @@ function TertiaryResourceBarMixin:GetResource() local resource = tertiaryResources[playerClass] - -- Druid: form-based - if playerClass == "DRUID" then - local formID = GetShapeshiftFormID() - resource = resource and resource[formID or 0] - end - if type(resource) == "table" then return resource[specID] else @@ -87,20 +77,52 @@ addonTable.RegisteredBar.TertiaryResourceBar = { x = 0, y = -80, useResourceAtlas = false, + showDruidManaBar = false, }, allowEditPredicate = function() + local playerClass = select(2, UnitClass("player")) + if playerClass == "DRUID" then + return true + end + local spec = C_SpecializationInfo.GetSpecialization() local specID = C_SpecializationInfo.GetSpecializationInfo(spec) return specID == 1473 -- Augmentation end, loadPredicate = function() local playerClass = select(2, UnitClass("player")) - return playerClass == "EVOKER" + return playerClass == "EVOKER" or playerClass == "DRUID" end, lemSettings = function(bar, defaults) local dbName = bar:GetConfig().dbName return { + { + parentId = L["CATEGORY_BAR_VISIBILITY"], + order = 106, + name = L["DRUID_ALWAYS_SHOW_MANA"], + kind = LEM.SettingType.Checkbox, + default = defaults.showDruidManaBar, + get = function(layoutName) + local data = SenseiClassResourceBarDB[dbName][layoutName] + if data and data.showDruidManaBar ~= nil then + return data.showDruidManaBar + else + return defaults.showDruidManaBar + end + end, + set = function(layoutName, value) + SenseiClassResourceBarDB[dbName][layoutName] = SenseiClassResourceBarDB[dbName][layoutName] or CopyTable(defaults) + SenseiClassResourceBarDB[dbName][layoutName].showDruidManaBar = value + bar:ApplyVisibilitySettings(layoutName) + bar:ApplyLayout(layoutName, true) + bar:UpdateDisplay(layoutName, true) + end, + isEnabled = function() + return select(2, UnitClass("player")) == "DRUID" + end, + tooltip = L["DRUID_ALWAYS_SHOW_MANA_TOOLTIP"], + }, { parentId = L["CATEGORY_BAR_STYLE"], order = 401, diff --git a/Locales/enUS.lua b/Locales/enUS.lua index 5012174..b17ad93 100644 --- a/Locales/enUS.lua +++ b/Locales/enUS.lua @@ -78,6 +78,8 @@ local baseLocale = { ["HIDE_WHILE_MOUNTED_OR_VEHICULE"] = "Hide While Mounted Or In Vehicule", ["HIDE_WHILE_MOUNTED_OR_VEHICULE_TOOLTIP"] = "Includes Druid Travel Form", ["HIDE_MANA_ON_ROLE"] = "Hide Mana On Role", + ["DRUID_ALWAYS_SHOW_MANA"] = "Always Show Druid Mana", + ["DRUID_ALWAYS_SHOW_MANA_TOOLTIP"] = "Show a mana bar in all druid forms (including Cat Form)", ["HIDE_HEALTH_ON_ROLE"] = "Hide On Role", ["HIDE_MANA_ON_ROLE_PRIMARY_BAR_TOOLTIP"] = "Not effective on Arcane Mage", ["HIDE_BLIZZARD_UI"] = "Hide Blizzard UI", From 93a9c301b1a36d90a5fd42d878f2beee522050b3 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 31 Jan 2026 08:56:23 +0000 Subject: [PATCH 2/6] Show druid tertiary bar in edit mode Co-authored-by: thibaut --- Bars/TertiaryResourceBar.lua | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Bars/TertiaryResourceBar.lua b/Bars/TertiaryResourceBar.lua index 082631a..a208e32 100644 --- a/Bars/TertiaryResourceBar.lua +++ b/Bars/TertiaryResourceBar.lua @@ -9,7 +9,7 @@ function TertiaryResourceBarMixin:GetResource() local playerClass = select(2, UnitClass("player")) if playerClass == "DRUID" then local data = self:GetData() - if data and data.showDruidManaBar == true then + if (data and data.showDruidManaBar == true) or LEM:IsInEditMode() then return Enum.PowerType.Mana end return nil @@ -89,10 +89,6 @@ addonTable.RegisteredBar.TertiaryResourceBar = { local specID = C_SpecializationInfo.GetSpecializationInfo(spec) return specID == 1473 -- Augmentation end, - loadPredicate = function() - local playerClass = select(2, UnitClass("player")) - return playerClass == "EVOKER" or playerClass == "DRUID" - end, lemSettings = function(bar, defaults) local dbName = bar:GetConfig().dbName From c40ddacf4eebadc13f018edb2976403764c861d7 Mon Sep 17 00:00:00 2001 From: Thibaut Date: Sat, 31 Jan 2026 13:41:28 +0100 Subject: [PATCH 3/6] Add class options for Druid and Warrior resource bars - Introduced settings for showing Druid mana in Cat and Bear forms. - Added option for displaying the Whirlwind bar for Fury Warriors. - Updated localization strings for clarity. - Refactored resource retrieval logic to respect new class options. --- Bars/SecondaryResourceBar.lua | 10 ++++++- Bars/TertiaryResourceBar.lua | 37 +++++-------------------- Helpers/API.lua | 19 +++++++++++++ Locales/enUS.lua | 9 ++++-- Settings/ClassOptionsSettings.lua | 46 +++++++++++++++++++++++++++++++ Settings/embeds.xml | 1 + 6 files changed, 89 insertions(+), 33 deletions(-) create mode 100644 Settings/ClassOptionsSettings.lua diff --git a/Bars/SecondaryResourceBar.lua b/Bars/SecondaryResourceBar.lua index f05cf44..8378232 100644 --- a/Bars/SecondaryResourceBar.lua +++ b/Bars/SecondaryResourceBar.lua @@ -59,7 +59,7 @@ function SecondaryResourceBarMixin:GetResource() }, ["WARLOCK"] = Enum.PowerType.SoulShards, ["WARRIOR"] = { - [72] = "WHIRLWIND", + [72] = "WHIRLWIND", -- Fury: only shown when showWarriorWhirlwindBar is true (checked in GetResource) }, } @@ -68,6 +68,14 @@ function SecondaryResourceBarMixin:GetResource() local resource = secondaryResources[playerClass] + -- Warrior: Whirlwind bar (Fury) only when class option is enabled + if playerClass == "WARRIOR" and type(resource) == "table" then + resource = resource[specID] + if resource == "WHIRLWIND" and not addonTable.GetClassOption("showWarriorWhirlwindBar") then + resource = nil + end + end + -- Druid: form-based if playerClass == "DRUID" then local formID = GetShapeshiftFormID() diff --git a/Bars/TertiaryResourceBar.lua b/Bars/TertiaryResourceBar.lua index a208e32..9621254 100644 --- a/Bars/TertiaryResourceBar.lua +++ b/Bars/TertiaryResourceBar.lua @@ -8,9 +8,12 @@ local TertiaryResourceBarMixin = Mixin({}, addonTable.PowerBarMixin) function TertiaryResourceBarMixin:GetResource() local playerClass = select(2, UnitClass("player")) if playerClass == "DRUID" then - local data = self:GetData() - if (data and data.showDruidManaBar == true) or LEM:IsInEditMode() then - return Enum.PowerType.Mana + local showMana = addonTable.GetClassOption("showDruidManaInCatAndBearForm") or LEM:IsInEditMode() + if showMana then + local formID = GetShapeshiftFormID() + if formID == DRUID_CAT_FORM or formID == DRUID_BEAR_FORM then + return Enum.PowerType.Mana + end end return nil end @@ -77,7 +80,7 @@ addonTable.RegisteredBar.TertiaryResourceBar = { x = 0, y = -80, useResourceAtlas = false, - showDruidManaBar = false, + -- showDruidManaBar: intentionally not in defaults; nil until user enables it. Default false. }, allowEditPredicate = function() local playerClass = select(2, UnitClass("player")) @@ -93,32 +96,6 @@ addonTable.RegisteredBar.TertiaryResourceBar = { local dbName = bar:GetConfig().dbName return { - { - parentId = L["CATEGORY_BAR_VISIBILITY"], - order = 106, - name = L["DRUID_ALWAYS_SHOW_MANA"], - kind = LEM.SettingType.Checkbox, - default = defaults.showDruidManaBar, - get = function(layoutName) - local data = SenseiClassResourceBarDB[dbName][layoutName] - if data and data.showDruidManaBar ~= nil then - return data.showDruidManaBar - else - return defaults.showDruidManaBar - end - end, - set = function(layoutName, value) - SenseiClassResourceBarDB[dbName][layoutName] = SenseiClassResourceBarDB[dbName][layoutName] or CopyTable(defaults) - SenseiClassResourceBarDB[dbName][layoutName].showDruidManaBar = value - bar:ApplyVisibilitySettings(layoutName) - bar:ApplyLayout(layoutName, true) - bar:UpdateDisplay(layoutName, true) - end, - isEnabled = function() - return select(2, UnitClass("player")) == "DRUID" - end, - tooltip = L["DRUID_ALWAYS_SHOW_MANA_TOOLTIP"], - }, { parentId = L["CATEGORY_BAR_STYLE"], order = 401, diff --git a/Helpers/API.lua b/Helpers/API.lua index 77a694d..d9cd099 100644 --- a/Helpers/API.lua +++ b/Helpers/API.lua @@ -36,6 +36,25 @@ addonTable.fullUpdateBars = function() end end +-- Class options: stored in _Settings.ClassOptions, default false when nil +addonTable.GetClassOption = function(key) + local opts = SenseiClassResourceBarDB and SenseiClassResourceBarDB["_Settings"] and SenseiClassResourceBarDB["_Settings"].ClassOptions + if opts and opts[key] ~= nil then + return opts[key] + end + return false +end + +addonTable.SetClassOption = function(key, value) + if not SenseiClassResourceBarDB["_Settings"] then + SenseiClassResourceBarDB["_Settings"] = {} + end + if not SenseiClassResourceBarDB["_Settings"].ClassOptions then + SenseiClassResourceBarDB["_Settings"].ClassOptions = {} + end + SenseiClassResourceBarDB["_Settings"].ClassOptions[key] = value +end + addonTable.decodeImportString = function(importString) local prefix, version, encoded = importString:match("^([^:]+):(%d+):(.+)$") if prefix ~= addonName then diff --git a/Locales/enUS.lua b/Locales/enUS.lua index b17ad93..15b42c0 100644 --- a/Locales/enUS.lua +++ b/Locales/enUS.lua @@ -78,8 +78,13 @@ local baseLocale = { ["HIDE_WHILE_MOUNTED_OR_VEHICULE"] = "Hide While Mounted Or In Vehicule", ["HIDE_WHILE_MOUNTED_OR_VEHICULE_TOOLTIP"] = "Includes Druid Travel Form", ["HIDE_MANA_ON_ROLE"] = "Hide Mana On Role", - ["DRUID_ALWAYS_SHOW_MANA"] = "Always Show Druid Mana", - ["DRUID_ALWAYS_SHOW_MANA_TOOLTIP"] = "Show a mana bar in all druid forms (including Cat Form)", + ["SETTINGS_CATEGORY_CLASS_OPTIONS"] = "Class Options", + ["DRUID_ALWAYS_SHOW_MANA"] = "Druid: show mana in cat and bear form.", + ["DRUID_ALWAYS_SHOW_MANA_TOOLTIP"] = "Show a mana bar in Cat Form and Bear Form", + ["WARRIOR_SHOW_WHIRLWIND_BAR"] = "Warrior: show Whirlwind bar (Fury)", + ["WARRIOR_SHOW_WHIRLWIND_BAR_TOOLTIP"] = "Show the Improved Whirlwind stacks bar for Fury warriors", + ["SETTINGS_OPTION_ENABLED"] = "Enabled", + ["SETTINGS_OPTION_DISABLED"] = "Disabled", ["HIDE_HEALTH_ON_ROLE"] = "Hide On Role", ["HIDE_MANA_ON_ROLE_PRIMARY_BAR_TOOLTIP"] = "Not effective on Arcane Mage", ["HIDE_BLIZZARD_UI"] = "Hide Blizzard UI", diff --git a/Settings/ClassOptionsSettings.lua b/Settings/ClassOptionsSettings.lua new file mode 100644 index 0000000..64a7344 --- /dev/null +++ b/Settings/ClassOptionsSettings.lua @@ -0,0 +1,46 @@ +local _, addonTable = ... + +local SettingsLib = addonTable.SettingsLib or LibStub("LibEQOLSettingsMode-1.0") +local L = addonTable.L + +local featureId = "SCRB_CLASS_OPTIONS" + +addonTable.AvailableFeatures = addonTable.AvailableFeatures or {} +table.insert(addonTable.AvailableFeatures, featureId) + +addonTable.FeaturesMetadata = addonTable.FeaturesMetadata or {} +addonTable.FeaturesMetadata[featureId] = { + category = L["SETTINGS_CATEGORY_CLASS_OPTIONS"], +} + +addonTable.SettingsPanelInitializers = addonTable.SettingsPanelInitializers or {} +addonTable.SettingsPanelInitializers[featureId] = function(category) + if not SenseiClassResourceBarDB["_Settings"] then + SenseiClassResourceBarDB["_Settings"] = {} + end + if not SenseiClassResourceBarDB["_Settings"].ClassOptions then + SenseiClassResourceBarDB["_Settings"].ClassOptions = {} + end + + -- Druid: show mana in cat and bear form + SettingsLib:CreateText(category, L["DRUID_ALWAYS_SHOW_MANA"]) + SettingsLib:CreateText(category, L["DRUID_ALWAYS_SHOW_MANA_TOOLTIP"]) + SettingsLib:CreateButton(category, { + text = addonTable.GetClassOption("showDruidManaInCatAndBearForm") and L["SETTINGS_OPTION_ENABLED"] or L["SETTINGS_OPTION_DISABLED"], + func = function() + addonTable.SetClassOption("showDruidManaInCatAndBearForm", not addonTable.GetClassOption("showDruidManaInCatAndBearForm")) + addonTable.fullUpdateBars() + end, + }) + + -- Warrior: show Whirlwind bar (Fury) + SettingsLib:CreateText(category, L["WARRIOR_SHOW_WHIRLWIND_BAR"]) + SettingsLib:CreateText(category, L["WARRIOR_SHOW_WHIRLWIND_BAR_TOOLTIP"]) + SettingsLib:CreateButton(category, { + text = addonTable.GetClassOption("showWarriorWhirlwindBar") and L["SETTINGS_OPTION_ENABLED"] or L["SETTINGS_OPTION_DISABLED"], + func = function() + addonTable.SetClassOption("showWarriorWhirlwindBar", not addonTable.GetClassOption("showWarriorWhirlwindBar")) + addonTable.fullUpdateBars() + end, + }) +end diff --git a/Settings/embeds.xml b/Settings/embeds.xml index 9dd148e..b7d2934 100644 --- a/Settings/embeds.xml +++ b/Settings/embeds.xml @@ -2,4 +2,5 @@ ..\..\Blizzard_SharedXML\UI.xsd">