Refactor + Horfixes: replace UIDropDownMenu calls with wrapper functions and redesign chat option UI to support spell-based configuration.

This commit is contained in:
Bluewhale1337
2026-07-10 15:54:36 +02:00
parent c50bcd54f3
commit f8c6c3493b
13 changed files with 220 additions and 280 deletions
+4
View File
@@ -415,6 +415,10 @@ end
function HealBot_OnEvent_PlayerEnteringWorld(this) function HealBot_OnEvent_PlayerEnteringWorld(this)
HealBot_IsFighting = false; HealBot_IsFighting = false;
-- Re-apply the refresh hook late in case another addon overrode it during load
if HealBot_ApplyRefreshHook then
HealBot_ApplyRefreshHook()
end
end end
function HealBot_OnEvent_SpellcastStart(this, spell, duration) function HealBot_OnEvent_SpellcastStart(this, spell, duration)
+15 -2
View File
@@ -95,13 +95,26 @@ function HealBot_StartCasting(spell, target, ttype)
if target == "target" then tName = HealBot_TargetName() or "target" else tName = UnitName(target) end if target == "target" then tName = HealBot_TargetName() or "target" else tName = UnitName(target) end
if not tName then tName = target end if not tName then tName = target end
local baseSpell = spell local baseSpell = spell
local parenIndex = string.find(spell, "%(") local parenIndex = string.find(spell, " %(")
if parenIndex then if parenIndex then
baseSpell = string.sub(spell, 1, parenIndex - 1) baseSpell = string.sub(spell, 1, parenIndex - 1)
else
parenIndex = string.find(spell, "%(")
if parenIndex then
baseSpell = string.sub(spell, 1, parenIndex - 1)
end
end end
-- Strip trailing spaces from base spell
baseSpell = string.gsub(baseSpell, "%s+$", "")
for i = 1, 5 do for i = 1, 5 do
local msgConf = HealBot_Config.ChatMessages[i] local msgConf = HealBot_Config.ChatMessages[i]
if msgConf and msgConf.Spell == baseSpell and msgConf.Channel ~= "None" then local configSpell = msgConf and msgConf.Spell or ""
-- Strip trailing spaces from config spell just in case
configSpell = string.gsub(configSpell, "%s+$", "")
if msgConf and configSpell ~= "" and msgConf.Channel ~= "None" and (configSpell == spell or configSpell == baseSpell) then
local msg = msgConf.Message or "" local msg = msgConf.Message or ""
msg = string.gsub(msg, "#Spell#", spell) msg = string.gsub(msg, "#Spell#", spell)
msg = string.gsub(msg, "#Target#", tName) msg = string.gsub(msg, "#Target#", tName)
+19 -97
View File
@@ -1,108 +1,30 @@
-- HealBot_Model.lua -- HealBot_Model.lua
-- Centralized Data Store and Observer System for HealBotBlue -- Centralized Data Store and Observer System for HealBotBlue
-- Fix legacy client UIDropDownMenu crash when setting value/id/refreshing while dropdown is not open -- Safe local wrappers to prevent native UIDropDownMenu concatenation crashes
if UIDropDownMenu_Refresh and not HealBot_UIDropDownMenu_Refresh_Fixed then -- when setting selected values on closed dropdowns during initialization.
local orig_UIDropDownMenu_Refresh = UIDropDownMenu_Refresh function HealBot_UIDropDownMenu_SetSelectedID(frame, id, useValue)
UIDropDownMenu_Refresh = function(frame, useValue, group) local wasNil = false
local targetFrame = frame or this if not UIDROPDOWNMENU_OPEN_MENU then
if not targetFrame or type(targetFrame) ~= "table" then return end UIDROPDOWNMENU_OPEN_MENU = "DropDownList1"
if not UIDROPDOWNMENU_OPEN_MENU or (targetFrame.GetName and targetFrame:GetName() ~= UIDROPDOWNMENU_OPEN_MENU) then wasNil = true
return end
UIDropDownMenu_SetSelectedID(frame, id, useValue)
if wasNil then
UIDROPDOWNMENU_OPEN_MENU = nil
end end
orig_UIDropDownMenu_Refresh(targetFrame, useValue, group)
end
HealBot_UIDropDownMenu_Refresh_Fixed = true
end end
if UIDropDownMenu_Initialize and not HealBot_UIDropDownMenu_Initialize_Fixed then function HealBot_UIDropDownMenu_SetSelectedValue(frame, value, useValue)
local orig_UIDropDownMenu_Initialize = UIDropDownMenu_Initialize local wasNil = false
UIDropDownMenu_Initialize = function(frame, initFunction, displayMode, level) if not UIDROPDOWNMENU_OPEN_MENU then
local targetFrame = frame or this UIDROPDOWNMENU_OPEN_MENU = "DropDownList1"
if not targetFrame or type(targetFrame) ~= "table" then return end wasNil = true
local name = targetFrame.GetName and targetFrame:GetName()
if UIDROPDOWNMENU_OPEN_MENU and name and name == UIDROPDOWNMENU_OPEN_MENU then
orig_UIDropDownMenu_Initialize(targetFrame, initFunction, displayMode, level)
else
local orig_AddButton = UIDropDownMenu_AddButton
UIDropDownMenu_AddButton = function(info, lvl)
-- Do nothing to prevent button accumulation in DropDownList1
end
orig_UIDropDownMenu_Initialize(targetFrame, initFunction, displayMode, level)
UIDropDownMenu_AddButton = orig_AddButton
end end
end UIDropDownMenu_SetSelectedValue(frame, value, useValue)
HealBot_UIDropDownMenu_Initialize_Fixed = true if wasNil then
end UIDROPDOWNMENU_OPEN_MENU = nil
if UIDropDownMenu_SetSelectedID and not HealBot_UIDropDownMenu_SetSelectedID_Fixed then
local orig_UIDropDownMenu_SetSelectedID = UIDropDownMenu_SetSelectedID
UIDropDownMenu_SetSelectedID = function(frame, id, useValue)
local targetFrame = frame or this
if not targetFrame or type(targetFrame) ~= "table" then return end
local name = targetFrame.GetName and targetFrame:GetName()
if UIDROPDOWNMENU_OPEN_MENU and name and name == UIDROPDOWNMENU_OPEN_MENU then
orig_UIDropDownMenu_SetSelectedID(targetFrame, id, useValue)
else
targetFrame.selectedID = id
targetFrame.selectedValue = nil
targetFrame.selectedName = nil
if targetFrame.initialize then
local buttons = {}
local orig_AddButton = UIDropDownMenu_AddButton
UIDropDownMenu_AddButton = function(info, level)
table.insert(buttons, info)
end
local temp_this = this
this = targetFrame
targetFrame.initialize(1)
this = temp_this
UIDropDownMenu_AddButton = orig_AddButton
if buttons[id] then
UIDropDownMenu_SetText(buttons[id].text, targetFrame)
end
end
end end
end
HealBot_UIDropDownMenu_SetSelectedID_Fixed = true
end
if UIDropDownMenu_SetSelectedValue and not HealBot_UIDropDownMenu_SetSelectedValue_Fixed then
local orig_UIDropDownMenu_SetSelectedValue = UIDropDownMenu_SetSelectedValue
UIDropDownMenu_SetSelectedValue = function(frame, value, useValue)
local targetFrame = frame or this
if not targetFrame or type(targetFrame) ~= "table" then return end
local name = targetFrame.GetName and targetFrame:GetName()
if UIDROPDOWNMENU_OPEN_MENU and name and name == UIDROPDOWNMENU_OPEN_MENU then
orig_UIDropDownMenu_SetSelectedValue(targetFrame, value, useValue)
else
targetFrame.selectedID = nil
targetFrame.selectedValue = value
targetFrame.selectedName = nil
if targetFrame.initialize then
local buttons = {}
local orig_AddButton = UIDropDownMenu_AddButton
UIDropDownMenu_AddButton = function(info, level)
table.insert(buttons, info)
end
local temp_this = this
this = targetFrame
targetFrame.initialize(1)
this = temp_this
UIDropDownMenu_AddButton = orig_AddButton
for _, btn in ipairs(buttons) do
if btn.value == value then
UIDropDownMenu_SetText(btn.text, targetFrame)
break
end
end
end
end
end
HealBot_UIDropDownMenu_SetSelectedValue_Fixed = true
end end
HealBot_Model = { HealBot_Model = {
+2 -1
View File
@@ -315,7 +315,8 @@ function HealBot_Options_SetSkins()
HealBot_Options_FontHeight:SetValue(HealBot_Config.btextheight[HealBot_Config.Current_Skin]) HealBot_Options_FontHeight:SetValue(HealBot_Config.btextheight[HealBot_Config.Current_Skin])
HealBot_Options_BarAlphaDis:SetValue(HealBot_Config.bardisa[HealBot_Config.Current_Skin]) HealBot_Options_BarAlphaDis:SetValue(HealBot_Config.bardisa[HealBot_Config.Current_Skin])
HealBot_Options_AbortBarSize:SetValue(HealBot_Config.abortsize[HealBot_Config.Current_Skin]) HealBot_Options_AbortBarSize:SetValue(HealBot_Config.abortsize[HealBot_Config.Current_Skin])
HealBot_Options_ShowHeaders:SetChecked(HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] or 0) local isShowHeaders = (HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1)
HealBot_Options_ShowHeaders:SetChecked(isShowHeaders and 1 or nil)
local isColorMode = (HealBot_Config.bcolormode[HealBot_Config.Current_Skin] == 2) local isColorMode = (HealBot_Config.bcolormode[HealBot_Config.Current_Skin] == 2)
HealBot_Options_BarColorMode:SetChecked(isColorMode and 1 or nil) HealBot_Options_BarColorMode:SetChecked(isColorMode and 1 or nil)
+8 -6
View File
@@ -21,9 +21,10 @@ function HealBot_Options_BuffSelf_OnLoad(self)
getglobal(this:GetName().."Text"):SetText("Self Only") getglobal(this:GetName().."Text"):SetText("Self Only")
local id = this:GetID() local id = this:GetID()
if HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[id] then if HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[id] then
this:SetChecked(HealBot_Config.BuffWatchSelf[id]) local isSelf = (HealBot_Config.BuffWatchSelf[id] == 1)
this:SetChecked(isSelf and 1 or nil)
else else
this:SetChecked(0) this:SetChecked(nil)
end end
end end
function HealBot_Options_BuffSelf_OnClick(self) function HealBot_Options_BuffSelf_OnClick(self)
@@ -77,7 +78,7 @@ function HealBot_Options_Buff_OnClick()
text = HealBot_Buff_Spells[myClass][this.value] text = HealBot_Buff_Spells[myClass][this.value]
end end
UIDropDownMenu_SetSelectedID(frame, this.value + 1) HealBot_UIDropDownMenu_SetSelectedID(frame, this.value + 1)
UIDropDownMenu_SetText(text, frame) UIDropDownMenu_SetText(text, frame)
HealBot_RecalcParty(); HealBot_RecalcParty();
end end
@@ -101,15 +102,16 @@ function HealBot_Options_SetBuffs()
if dropDown then if dropDown then
local val = HealBot_Config.BuffDropDowns[myClass][i] or 0 local val = HealBot_Config.BuffDropDowns[myClass][i] or 0
UIDropDownMenu_Initialize(dropDown, HealBot_Options_Buff_Initialize) UIDropDownMenu_Initialize(dropDown, HealBot_Options_Buff_Initialize)
UIDropDownMenu_SetSelectedID(dropDown, val + 1) HealBot_UIDropDownMenu_SetSelectedID(dropDown, val + 1)
end end
local selfCheck = getglobal("HealBot_Options_BuffSelf" .. i) local selfCheck = getglobal("HealBot_Options_BuffSelf" .. i)
if selfCheck then if selfCheck then
if HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[i] then if HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[i] then
selfCheck:SetChecked(HealBot_Config.BuffWatchSelf[i]) local isSelf = (HealBot_Config.BuffWatchSelf[i] == 1)
selfCheck:SetChecked(isSelf and 1 or nil)
else else
selfCheck:SetChecked(0) selfCheck:SetChecked(nil)
end end
end end
end end
+3 -3
View File
@@ -51,7 +51,7 @@ end
function HealBot_Options_CDCMonitor_Refresh(onselect) function HealBot_Options_CDCMonitor_Refresh(onselect)
if not HealBot_Config.CDCMonitor then return end if not HealBot_Config.CDCMonitor then return end
if not onselect then HealBot_Options_CDCMonitor_Initialize() end -- or wrong menu may be used ! if not onselect then HealBot_Options_CDCMonitor_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_CDCMonitor,HealBot_Config.CDCMonitor) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCMonitor,HealBot_Config.CDCMonitor)
end end
function HealBot_Options_CDCMonitor_OnLoad() function HealBot_Options_CDCMonitor_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCMonitor_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_CDCMonitor_DropDown)
@@ -200,14 +200,14 @@ function HealBot_Options_CDCButLeft_Refresh(onselect)
local class=UnitClass("Player"); local class=UnitClass("Player");
if not onselect then HealBot_Options_CDCButLeft_Initialize() end if not onselect then HealBot_Options_CDCButLeft_Initialize() end
set_id = HealBot_Config.Debuff_Left[class]; set_id = HealBot_Config.Debuff_Left[class];
UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButLeft,set_id) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButLeft,set_id)
end end
function HealBot_Options_CDCButRight_Refresh(onselect) function HealBot_Options_CDCButRight_Refresh(onselect)
local set_id; local set_id;
local class=UnitClass("Player"); local class=UnitClass("Player");
if not onselect then HealBot_Options_CDCButRight_Initialize() end if not onselect then HealBot_Options_CDCButRight_Initialize() end
set_id = HealBot_Config.Debuff_Right[class]; set_id = HealBot_Config.Debuff_Right[class];
UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButRight,set_id) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButRight,set_id)
end end
function HealBot_Options_CDCButLeft_OnLoad() function HealBot_Options_CDCButLeft_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCButLeft_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_CDCButLeft_DropDown)
+13 -70
View File
@@ -1,69 +1,10 @@
-- HealBot Options panel file: HealBot_Options_Chat.lua -- HealBot Options panel file: HealBot_Options_Chat.lua
-- Split from original HealBot_Options.lua -- Split from original HealBot_Options.lua
local HealBot_PlayerSpells = nil
function HealBot_GetPlayerSpells()
if HealBot_PlayerSpells then return HealBot_PlayerSpells end
local spellSet = {}
local i = 1
while true do
local spellName, spellRank = GetSpellName(i, BOOKTYPE_SPELL)
if not spellName then
break
end
spellSet[spellName] = true
i = i + 1
end
local sortedSpells = {}
for k, _ in pairs(spellSet) do
table.insert(sortedSpells, k)
end
table.sort(sortedSpells)
HealBot_PlayerSpells = sortedSpells
return sortedSpells
end
function HealBot_Options_ChatMsg_Spell_Initialize()
local info
info = { text = "None", func = HealBot_Options_ChatMsg_Spell_OnClick, value = "None" }
UIDropDownMenu_AddButton(info)
local spells = HealBot_GetPlayerSpells()
for _, spellName in ipairs(spells) do
info = {
text = spellName,
func = HealBot_Options_ChatMsg_Spell_OnClick,
value = spellName
}
UIDropDownMenu_AddButton(info)
end
end
function HealBot_Options_ChatMsg_Spell_OnClick()
local frameName = UIDROPDOWNMENU_OPEN_MENU
local frame = getglobal(frameName)
local id = frame:GetID()
if not HealBot_Config.ChatMessages then HealBot_Config.ChatMessages = {} end
if not HealBot_Config.ChatMessages[id] then
HealBot_Config.ChatMessages[id] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" }
end
HealBot_Config.ChatMessages[id].Spell = this.value
local text = this.value
if text == "None" then text = "None" end
UIDropDownMenu_SetSelectedValue(frame, this.value)
UIDropDownMenu_SetText(text, frame)
end
function HealBot_Options_ChatMsg_Channel_OnClick(id, buttonFrame) function HealBot_Options_ChatMsg_Channel_OnClick(id, buttonFrame)
if not HealBot_Config.ChatMessages then HealBot_Config.ChatMessages = {} end if not HealBot_Config.ChatMessages then HealBot_Config.ChatMessages = {} end
if not HealBot_Config.ChatMessages[id] then if not HealBot_Config.ChatMessages[id] then
HealBot_Config.ChatMessages[id] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" } HealBot_Config.ChatMessages[id] = { Spell = "", Message = "Casting #Spell# on #Target#", Channel = "None" }
end end
local current = HealBot_Config.ChatMessages[id].Channel local current = HealBot_Config.ChatMessages[id].Channel
@@ -91,24 +32,26 @@ function HealBot_Options_SetChatMessages()
end end
for i = 1, 5 do for i = 1, 5 do
if not HealBot_Config.ChatMessages[i] then if not HealBot_Config.ChatMessages[i] then
HealBot_Config.ChatMessages[i] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" } HealBot_Config.ChatMessages[i] = { Spell = "", Message = "Casting #Spell# on #Target#", Channel = "None" }
end end
end end
for i = 1, 5 do for i = 1, 5 do
local msgConfig = HealBot_Config.ChatMessages[i] local msgConfig = HealBot_Config.ChatMessages[i]
if msgConfig then if msgConfig then
local dropDown = getglobal("HealBot_Options_ChatMsg"..i) local spellEdit = getglobal("HealBot_Options_ChatMsg"..i.."_Spell")
local editBox = getglobal("HealBot_Options_ChatMsg"..i.."_Text") local textEdit = getglobal("HealBot_Options_ChatMsg"..i.."_Text")
local chanButton = getglobal("HealBot_Options_ChatMsg"..i.."_Channel") local chanButton = getglobal("HealBot_Options_ChatMsg"..i.."_Channel")
if dropDown then if spellEdit then
UIDropDownMenu_Initialize(dropDown, HealBot_Options_ChatMsg_Spell_Initialize) if msgConfig.Spell == "None" then
UIDropDownMenu_SetSelectedValue(dropDown, msgConfig.Spell) spellEdit:SetText("")
UIDropDownMenu_SetWidth(110, dropDown) msgConfig.Spell = ""
UIDropDownMenu_SetText(msgConfig.Spell, dropDown) else
spellEdit:SetText(msgConfig.Spell or "")
end
end end
if editBox then if textEdit then
editBox:SetText(msgConfig.Message or "") textEdit:SetText(msgConfig.Message or "")
end end
if chanButton then if chanButton then
chanButton:SetText(msgConfig.Channel or "None") chanButton:SetText(msgConfig.Channel or "None")
+143 -94
View File
@@ -5,23 +5,50 @@
<Frame name="HealBot_Options_Panel7" parent="HealBot_Options" hidden="true" setAllPoints="true"> <Frame name="HealBot_Options_Panel7" parent="HealBot_Options" hidden="true" setAllPoints="true">
<Frames> <Frames>
<!-- Chat Message 1 --> <!-- Chat Message 1 -->
<Frame name="HealBot_Options_ChatMsg1" inherits="UIDropDownMenuTemplate" id="1"> <EditBox name="HealBot_Options_ChatMsg1_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-30" /> <AbsDimension x="25" y="-30" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
</Frame> <Scripts>
<EditBox name="HealBot_Options_ChatMsg1_Text" inherits="InputBoxTemplate" autoFocus="false"> <OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[1].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg1_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size> <Size>
<AbsDimension x="200" y="20"/> <AbsDimension x="80" y="22"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg1" relativePoint="RIGHT"> <Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg1_Spell" relativePoint="RIGHT">
<Offset> <Offset>
<AbsDimension x="0" y="2"/> <AbsDimension x="15" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(1, this);
</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_ChatMsg1_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="300" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg1_Spell" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -33,41 +60,51 @@
</OnTextChanged> </OnTextChanged>
</Scripts> </Scripts>
</EditBox> </EditBox>
<Button name="HealBot_Options_ChatMsg1_Channel" inherits="UIPanelButtonTemplate" text="None"> <!-- Chat Message 2 -->
<EditBox name="HealBot_Options_ChatMsg2_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-90" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[2].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg2_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size> <Size>
<AbsDimension x="80" y="22"/> <AbsDimension x="80" y="22"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg1_Text" relativePoint="BOTTOMLEFT"> <Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg2_Spell" relativePoint="RIGHT">
<Offset> <Offset>
<AbsDimension x="0" y="-5"/> <AbsDimension x="15" y="0"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
<OnClick> <OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(1, this); HealBot_Options_ChatMsg_Channel_OnClick(2, this);
</OnClick> </OnClick>
</Scripts> </Scripts>
</Button> </Button>
<!-- Chat Message 2 -->
<Frame name="HealBot_Options_ChatMsg2" inherits="UIDropDownMenuTemplate" id="2">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-90" />
</Offset>
</Anchor>
</Anchors>
</Frame>
<EditBox name="HealBot_Options_ChatMsg2_Text" inherits="InputBoxTemplate" autoFocus="false"> <EditBox name="HealBot_Options_ChatMsg2_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size> <Size>
<AbsDimension x="200" y="20"/> <AbsDimension x="300" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg2" relativePoint="RIGHT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg2_Spell" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="2"/> <AbsDimension x="0" y="-5"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -79,41 +116,51 @@
</OnTextChanged> </OnTextChanged>
</Scripts> </Scripts>
</EditBox> </EditBox>
<Button name="HealBot_Options_ChatMsg2_Channel" inherits="UIPanelButtonTemplate" text="None"> <!-- Chat Message 3 -->
<EditBox name="HealBot_Options_ChatMsg3_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-150" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[3].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg3_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size> <Size>
<AbsDimension x="80" y="22"/> <AbsDimension x="80" y="22"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg2_Text" relativePoint="BOTTOMLEFT"> <Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg3_Spell" relativePoint="RIGHT">
<Offset> <Offset>
<AbsDimension x="0" y="-5"/> <AbsDimension x="15" y="0"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
<OnClick> <OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(2, this); HealBot_Options_ChatMsg_Channel_OnClick(3, this);
</OnClick> </OnClick>
</Scripts> </Scripts>
</Button> </Button>
<!-- Chat Message 3 -->
<Frame name="HealBot_Options_ChatMsg3" inherits="UIDropDownMenuTemplate" id="3">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-150" />
</Offset>
</Anchor>
</Anchors>
</Frame>
<EditBox name="HealBot_Options_ChatMsg3_Text" inherits="InputBoxTemplate" autoFocus="false"> <EditBox name="HealBot_Options_ChatMsg3_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size> <Size>
<AbsDimension x="200" y="20"/> <AbsDimension x="300" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg3" relativePoint="RIGHT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg3_Spell" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="2"/> <AbsDimension x="0" y="-5"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -125,41 +172,51 @@
</OnTextChanged> </OnTextChanged>
</Scripts> </Scripts>
</EditBox> </EditBox>
<Button name="HealBot_Options_ChatMsg3_Channel" inherits="UIPanelButtonTemplate" text="None"> <!-- Chat Message 4 -->
<EditBox name="HealBot_Options_ChatMsg4_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-210" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[4].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg4_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size> <Size>
<AbsDimension x="80" y="22"/> <AbsDimension x="80" y="22"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg3_Text" relativePoint="BOTTOMLEFT"> <Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg4_Spell" relativePoint="RIGHT">
<Offset> <Offset>
<AbsDimension x="0" y="-5"/> <AbsDimension x="15" y="0"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
<OnClick> <OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(3, this); HealBot_Options_ChatMsg_Channel_OnClick(4, this);
</OnClick> </OnClick>
</Scripts> </Scripts>
</Button> </Button>
<!-- Chat Message 4 -->
<Frame name="HealBot_Options_ChatMsg4" inherits="UIDropDownMenuTemplate" id="4">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-210" />
</Offset>
</Anchor>
</Anchors>
</Frame>
<EditBox name="HealBot_Options_ChatMsg4_Text" inherits="InputBoxTemplate" autoFocus="false"> <EditBox name="HealBot_Options_ChatMsg4_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size> <Size>
<AbsDimension x="200" y="20"/> <AbsDimension x="300" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg4" relativePoint="RIGHT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg4_Spell" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="2"/> <AbsDimension x="0" y="-5"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -171,41 +228,51 @@
</OnTextChanged> </OnTextChanged>
</Scripts> </Scripts>
</EditBox> </EditBox>
<Button name="HealBot_Options_ChatMsg4_Channel" inherits="UIPanelButtonTemplate" text="None"> <!-- Chat Message 5 -->
<EditBox name="HealBot_Options_ChatMsg5_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-270" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[5].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg5_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size> <Size>
<AbsDimension x="80" y="22"/> <AbsDimension x="80" y="22"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg4_Text" relativePoint="BOTTOMLEFT"> <Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg5_Spell" relativePoint="RIGHT">
<Offset> <Offset>
<AbsDimension x="0" y="-5"/> <AbsDimension x="15" y="0"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
<OnClick> <OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(4, this); HealBot_Options_ChatMsg_Channel_OnClick(5, this);
</OnClick> </OnClick>
</Scripts> </Scripts>
</Button> </Button>
<!-- Chat Message 5 -->
<Frame name="HealBot_Options_ChatMsg5" inherits="UIDropDownMenuTemplate" id="5">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-270" />
</Offset>
</Anchor>
</Anchors>
</Frame>
<EditBox name="HealBot_Options_ChatMsg5_Text" inherits="InputBoxTemplate" autoFocus="false"> <EditBox name="HealBot_Options_ChatMsg5_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size> <Size>
<AbsDimension x="200" y="20"/> <AbsDimension x="300" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg5" relativePoint="RIGHT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg5_Spell" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="2"/> <AbsDimension x="0" y="-5"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -217,24 +284,6 @@
</OnTextChanged> </OnTextChanged>
</Scripts> </Scripts>
</EditBox> </EditBox>
<Button name="HealBot_Options_ChatMsg5_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg5_Text" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(5, this);
</OnClick>
</Scripts>
</Button>
</Frames> </Frames>
</Frame> </Frame>
</Ui>
</Ui>
+2 -1
View File
@@ -5,7 +5,8 @@ function HealBot_Options_ShowHeaders_OnLoad(this)
getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_SHOWHEADERS); getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_SHOWHEADERS);
end end
function HealBot_Options_ShowHeaders_OnClick(this) function HealBot_Options_ShowHeaders_OnClick(this)
HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] = this:GetChecked(); local isChecked = this:GetChecked()
HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] = isChecked and 1 or 0;
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
function HealBot_Options_BarTextureS_OnValueChanged(this) function HealBot_Options_BarTextureS_OnValueChanged(this)
+3 -3
View File
@@ -108,7 +108,7 @@ end
function HealBot_Options_EmergencyFClass_Refresh(onselect) function HealBot_Options_EmergencyFClass_Refresh(onselect)
if not HealBot_Config.EmergencyFClass then return end if not HealBot_Config.EmergencyFClass then return end
if not onselect then HealBot_Options_EmergencyFClass_Initialize() end -- or wrong menu may be used ! if not onselect then HealBot_Options_EmergencyFClass_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_EmergencyFClass,HealBot_Config.EmergencyFClass) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_EmergencyFClass,HealBot_Config.EmergencyFClass)
end end
function HealBot_Options_EmergencyFClass_OnLoad() function HealBot_Options_EmergencyFClass_OnLoad()
@@ -191,7 +191,7 @@ end
function HealBot_Options_ExtraSort_Refresh(onselect) function HealBot_Options_ExtraSort_Refresh(onselect)
if not HealBot_Config.ExtraOrder then return end if not HealBot_Config.ExtraOrder then return end
if not onselect then HealBot_Options_ExtraSort_Initialize() end -- or wrong menu may be used ! if not onselect then HealBot_Options_ExtraSort_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_ExtraSort,HealBot_Config.ExtraOrder) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_ExtraSort,HealBot_Config.ExtraOrder)
end end
function HealBot_Options_ExtraSort_OnLoad() function HealBot_Options_ExtraSort_OnLoad()
@@ -225,7 +225,7 @@ end
function HealBot_Options_EmergencyFilter_Refresh(onselect) function HealBot_Options_EmergencyFilter_Refresh(onselect)
if not HealBot_Config.EmergIncMonitor then return end if not HealBot_Config.EmergIncMonitor then return end
if not onselect then HealBot_Options_EmergencyFilter_Initialize() end -- or wrong menu may be used ! if not onselect then HealBot_Options_EmergencyFilter_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_EmergencyFilter,HealBot_Config.EmergIncMonitor) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_EmergencyFilter,HealBot_Config.EmergIncMonitor)
end end
+1 -1
View File
@@ -112,7 +112,7 @@ end
function HealBot_Options_Skins_Refresh(onselect) function HealBot_Options_Skins_Refresh(onselect)
if not HealBot_Config.Skin_ID then return end if not HealBot_Config.Skin_ID then return end
if not onselect then HealBot_Options_Skins_Initialize() end -- or wrong menu may be used ! if not onselect then HealBot_Options_Skins_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_Skins,HealBot_Config.Skin_ID) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_Skins,HealBot_Config.Skin_ID)
end end
function HealBot_Options_Skins_OnLoad() function HealBot_Options_Skins_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_Skins_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_Skins_DropDown)
+1 -1
View File
@@ -62,7 +62,7 @@ end
function HealBot_Options_TooltipPos_Refresh(onselect) function HealBot_Options_TooltipPos_Refresh(onselect)
if not HealBot_Config.TooltipPos then return end if not HealBot_Config.TooltipPos then return end
if not onselect then HealBot_Options_TooltipPos_Initialize() end -- or wrong menu may be used ! if not onselect then HealBot_Options_TooltipPos_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_TooltipPos,HealBot_Config.TooltipPos) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_TooltipPos,HealBot_Config.TooltipPos)
end end
function HealBot_Options_TooltipPos_OnLoad() function HealBot_Options_TooltipPos_OnLoad()
+6 -1
View File
@@ -30,8 +30,13 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
### Change Log ### Change Log
**1.3.3**
* **Chat Panel Refactor:** Completely replaced the spell selection dropdowns in the Chat tab with manual text input boxes, allowing users to type exact spell names (with or without ranks) directly, matching the behavior of the key-bindings configuration. Fixed a string matching bug caused by Vanilla WoW's hidden trailing spaces when comparing spell names, ensuring that both rankless (e.g. `Flash Heal`) and ranked inputs trigger correctly.
* **Chat Layout Stack:** Restructured the Chat Options XML layout to correctly stack the inputs into neat rows, preventing horizontal overlap and providing more space for typing long announce messages.
* **UI Persistence Bug Fixes:** Fixed a Vanilla WoW API quirk where unchecking the "Show Headers" or "Self Only" (Buffs) checkboxes caused the UI to either visually re-check itself or overwrite the setting with defaults upon a `/reload`.
**1.3.2** **1.3.2**
* **UIDropDownMenu Fixes:** Fixed client crash and button accumulation error on unopened dropdown menus in options. * **UIDropDownMenu Fixes:** Resolved native client crash (`UIDROPDOWNMENU_OPEN_MENU` nil concatenation) when setting values on closed dropdowns.
**1.3.1** **1.3.1**
* **Hotfix: missing helper function restored** Fixed issue with lua error for druids. * **Hotfix: missing helper function restored** Fixed issue with lua error for druids.