Files
2026-05-19 21:47:15 +02:00

287 lines
7.3 KiB
Lua

--[[
Copyright (c) 2009, Hendrik "Nevcairiel" Leppkes < h.leppkes at gmail dot com >
All rights reserved.
]]
local L = LibStub("AceLocale-3.0"):GetLocale("Bartender4")
local Bar = Bartender4.Bar.prototype
local ButtonBar = Bartender4.ButtonBar.prototype
local StateBar = Bartender4.StateBar.prototype
local optGetter, optSetter, getBar
do
local optionMap, callFunc
local barregistry = Bartender4.Bar.barregistry
optionMap = {
stance = "StanceStateOption",
enabled = "StateOption",
def_state = "DefaultState",
states = "StateOption",
actionbar = "StateOption",
possess = "StateOption",
autoassist = "ConfigAutoAssist",
customEnabled = "StateOption",
custom = "StateOption",
customCopy = "CopyCustomConditionals",
}
-- retrieves a valid bar object from the barregistry table
function getBar(id)
local bar = barregistry[tostring(id)]
assert(bar, ("Invalid bar id in options table. (%s)"):format(id))
return bar
end
-- calls a function on the bar
function callFunc(bar, type, option, ...)
local func = type .. (optionMap[option] or option)
assert(bar[func], ("Invalid get/set function %s in bar %s."):format(func, bar.id))
return bar[func](bar, ...)
end
-- universal function to get a option
function optGetter(info)
local bar = getBar(info[2])
local option = info.arg or info[#info]
return callFunc(bar, "Get", option, info[#info])
end
-- universal function to set a option
function optSetter(info, ...)
local bar = getBar(info[2])
local option = info.arg or info[#info]
return callFunc(bar, "Set", option, info[#info], ...)
end
end
local hasStances
local validStanceTable = {
[0] = L["Don't Page"],
(L["Page %2d"]):format(1),
(L["Page %2d"]):format(2),
(L["Page %2d"]):format(3),
(L["Page %2d"]):format(4),
(L["Page %2d"]):format(5),
(L["Page %2d"]):format(6),
(L["Page %2d"]):format(7),
(L["Page %2d"]):format(8),
(L["Page %2d"]):format(9),
(L["Page %2d"]):format(10)
}
local _, playerclass = UnitClass("player")
local function createOptionGroup(k, id)
local tbl = {
order = 10 * k,
type = "select",
arg = "stance",
values = validStanceTable,
name = Bartender4.StanceMap[playerclass][k].name,
}
return tbl
end
local disabledFunc = function(info)
local bar = getBar(info[2])
return not bar:GetStateOption("enabled")
end
local stateOffOrCustomOn = function(info)
local bar = getBar(info[2])
return (not bar:GetStateOption("enabled")) or (bar:GetStateOption("customEnabled"))
end
local stateOffOrCustomOff = function(info)
local bar = getBar(info[2])
return (not bar:GetStateOption("enabled")) or (not bar:GetStateOption("customEnabled"))
end
function StateBar:GetOptionObject()
local obj = ButtonBar.GetOptionObject()
local options = {
enabled = {
order = 1,
type = "toggle",
name = L["Enabled"],
desc = L["Enable State-based Button Swaping"],
get = optGetter,
set = optSetter,
},
sep1 = {
order = 2,
type = "description",
name = "",
},
autoassist = {
order = 3,
type = "toggle",
name = L["Auto-Assist"],
desc = L["Enable Auto-Assist for this bar.\n Auto-Assist will automatically try to cast on your target's target if your target is no valid target for the selected spell."],
get = optGetter,
set = optSetter,
width = "full",
},
possess = {
order = 5,
type = "toggle",
name = L["Possess Bar"],
desc = L["Switch this bar to the Possess Bar when possessing a npc (eg. Mind Control)"],
get = optGetter,
set = optSetter,
disabled = stateOffOrCustomOn,
},
actionbar = {
order = 6,
type = "toggle",
name = L["ActionBar Paging"],
desc = L["Enable Bar Switching based on the actionbar controls provided by the game. \nSee Blizzard Key Bindings for assignments - Usually Shift-Mouse Wheel and Shift+1 - Shift+6."],
get = optGetter,
set = optSetter,
disabled = stateOffOrCustomOn,
},
def_desc = {
order = 10,
type = "description",
name = L["The default behaviour of this bar when no state-based paging option affects it."],
},
def_state = {
order = 11,
type = "select",
name = L["Default Bar State"],
values = validStanceTable,
get = optGetter,
set = optSetter,
disabled = stateOffOrCustomOn,
},
modifiers = {
order = 30,
type = "group",
inline = true,
name = "",
get = optGetter,
set = optSetter,
disabled = stateOffOrCustomOn,
args = {
header = {
order = 1,
type = "header",
name = L["Modifier Based Switching"],
},
ctrl = {
order = 10,
type = "select",
name = L["CTRL"],
arg = "states",
values = validStanceTable,
desc = (L["Configure actionbar paging when the %s key is down."]):format(L["CTRL"]),
--width = "half",
},
alt = {
order = 15,
type = "select",
name = L["ALT"],
arg = "states",
values = validStanceTable,
desc = (L["Configure actionbar paging when the %s key is down."]):format(L["ALT"]),
--width = "half",
},
shift = {
order = 20,
type = "select",
name = L["SHIFT"],
arg = "states",
values = validStanceTable,
desc = (L["Configure actionbar paging when the %s key is down."]):format(L["SHIFT"]),
--width = "half",
},
},
},
stances = {
order = 20,
type = "group",
inline = true,
name = "",
hidden = function() return not (Bartender4.StanceMap[playerclass]) end,
get = optGetter,
set = optSetter,
disabled = stateOffOrCustomOn,
args = {
stance_header = {
order = 1,
type = "header",
name = L["Stance Configuration"],
},
},
},
customNl = {
order = 48,
type = "description",
name = "\n",
},
customHeader = {
order = 49,
type = "header",
name = L["Custom Conditionals"],
},
customEnabled = {
order = 50,
type = "toggle",
name = L["Use Custom Condition"],
desc = L["Enable the use of a custom condition, disabling all of the above."],
get = optGetter,
set = optSetter,
disabled = disabledFunc,
--width = "double",
},
customCopy = {
order = 51,
type = "execute",
name = L["Copy Conditionals"],
desc = L["Create a copy of the auto-generated conditionals in the custom configuration as a base template."],
func = optSetter,
disabled = disabledFunc,
},
customDesc = {
order = 52,
type = "description",
name = L["Note: Enabling Custom Conditionals will disable all of the above settings!"],
},
custom = {
order = 55,
type = "input",
name = L["Custom Conditionals"],
desc = L["You can use any macro conditionals in the custom string, using the number of the bar as target value.\nExample: [form:1]9;0"],
width = "full",
get = optGetter,
set = optSetter,
disabled = stateOffOrCustomOff,
multiline = true,
},
}
do
local defstancemap = Bartender4.StanceMap[playerclass]
if defstancemap then
for k,v in pairs(defstancemap) do
if not options.stances.args[v.id] then
options.stances.args[v.id] = createOptionGroup(k, v.id)
end
end
end
end
local states = {
type = "group",
name = L["State Configuration"],
order = 5,
args = options,
}
obj:NewCategory("state", states)
return obj
end