Files
coa-bartender/Options/Bar.lua
T
florian.berthold 57a5cdabdf ascension: 4.4.2 → vendored 4.4.2-2-g3b02ee4 (in-game AddOns dir)
Imported from /srv/add01/wow-ascension/Interface/AddOns/Bartender4 — the
build Ascension's WotLK 3.3.5 client ships.

Single vendored drop: Ascension's build process bundles their custom
patches with the standard CurseForge packager output (embedded libs),
and the individual patches aren't published separately.

Net delta vs Nevcairiel 4.4.2, excluding bundled libs and CRLF
normalization: 21 files, 2213+/52- — the Ascension-specific
adaptations for WotLK 3.3.5 hero classes / custom action systems.

License: All rights reserved (per .toc).
2026-05-08 03:45:58 +02:00

476 lines
13 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
--[[===================================================================================
Bar Options
===================================================================================]]--
local barregistry = Bartender4.Bar.barregistry
local function round(num, idp)
local mult = 10^(idp or 0)
return math.floor(num * mult + 0.5) / mult
end
-- option utilty functions
local optGetter, optSetter, visibilityGetter, visibilitySetter, customEnabled, customDisabled, customCopy, clickThroughVis, posGet, posSet, centerHorz, centerVert, resetPos
do
local getBar, optionMap, callFunc
-- maps option keys to function names
optionMap = {
alpha = "ConfigAlpha",
scale = "ConfigScale",
fadeout = "FadeOut",
fadeoutalpha = "FadeOutAlpha",
fadeoutdelay = "FadeOutDelay",
clickthrough = "ClickThrough",
}
-- 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[#info]
return callFunc(bar, "Get", option)
end
-- universal function to set a option
function optSetter(info, ...)
local bar = getBar(info[2])
local option = info[#info]
return callFunc(bar, "Set", option, ...)
end
function visibilityGetter(info, ...)
local bar = getBar(info[2])
local option = info[#info]
return bar:GetVisibilityOption(option, ...)
end
function visibilitySetter(info, ...)
local bar = getBar(info[2])
local option = info[#info]
bar:SetVisibilityOption(option, ...)
end
function customEnabled(info)
local bar = getBar(info[2])
return bar:GetVisibilityOption("custom")
end
function customDisabled(info)
local bar = getBar(info[2])
return not bar:GetVisibilityOption("custom")
end
function customCopy(info)
local bar = getBar(info[2])
bar:CopyCustomConditionals()
end
function clickThroughVis(info)
local bar = getBar(info[2])
return (not bar.ClickThroughSupport)
end
function posGet(info)
local bar = getBar(info[2])
local opt = info.arg or info[#info]
if opt == "x" or opt == "y" then
local v = bar.config.position[opt]
return tostring(round(v, 5))
end
return bar.config.position[opt]
end
function posSet(info, value)
local bar = getBar(info[2])
local opt = info.arg or info[#info]
if opt == "x" or opt == "y" then
value = tonumber(value)
end
bar.config.position[opt] = value
bar:LoadPosition()
end
function centerHorz(info)
local bar = getBar(info[2])
local pos = bar.config.position
local x_mod = (pos.growHorizontal == "RIGHT") and -1 or 1
pos.x = (bar.overlay:GetWidth() / 2) * pos.scale * x_mod
if pos.point == "CENTER" or pos.point == "LEFT" or pos.point == "RIGHT" then -- no special handling
pos.point = "CENTER"
else
pos.point = pos.point:gsub("LEFT", ""):gsub("RIGHT", "")
end
bar:LoadPosition()
end
function centerVert(info)
local bar = getBar(info[2])
local pos = bar.config.position
local y_mod = (pos.growVertical == "DOWN") and 1 or -1
pos.y = (bar.overlay:GetHeight() / 2) * pos.scale * y_mod
if pos.point == "CENTER" or pos.point == "TOP" or pos.point == "BOTTOM" then -- no special handling
pos.point = "CENTER"
else
pos.point = pos.point:gsub("TOP", ""):gsub("BOTTOM", "")
end
bar:LoadPosition()
end
function resetPos(info)
local bar = getBar(info[2])
local pos = bar.config.position
local x_mod = (pos.growHorizontal == "RIGHT") and -1 or 1
local y_mod = (pos.growVertical == "DOWN") and 1 or -1
pos.x = (bar.overlay:GetWidth() / 2) * pos.scale * x_mod
pos.y = (bar.overlay:GetHeight() / 2) * pos.scale * y_mod
pos.point = "CENTER"
bar:LoadPosition()
end
end
local _, class = UnitClass("player")
local stanceClasses = {
DRUID = true,
HERO = true,
WARRIOR = true,
WARLOCK = true,
PRIEST = true,
ROGUE = true,
}
local function getStanceTable()
local tbl = {}
if class ~= "WARRIOR" then
tbl[0] = L["No Stance/Form"]
end
local num = GetNumShapeshiftForms()
for i = 1, num do
tbl[i] = select(2, GetShapeshiftFormInfo(i))
end
-- HACK: Metamorphosis work around, it is on slot 1 in GetShapeshiftFormInfo() but stance:2 is active..
if class == "WARLOCK" and tbl[1] == GetSpellInfo(59672) then
tbl[2], tbl[1] = tbl[1], nil
end
if class == "ROGUE" and tbl[1] == GetSpellInfo(51713) then -- shadow dance hack
tbl[3], tbl[1] = tbl[1], nil
end
return tbl
end
local validAnchors = {
CENTER = "CENTER",
LEFT = "LEFT",
RIGHT = "RIGHT",
TOP = "TOP",
TOPLEFT = "TOPLEFT",
TOPRIGHT = "TOPRIGHT",
BOTTOM = "BOTTOM",
BOTTOMLEFT = "BOTTOMLEFT",
BOTTOMRIGHT = "BOTTOMRIGHT",
}
local options
function Bar:GetOptionObject()
local otbl = {
general = {
type = "group",
cmdInline = true,
name = L["General Settings"],
order = 1,
args = {
styleheader = {
order = 10,
type = "header",
name = L["Bar Style & Layout"],
},
alpha = {
order = 20,
name = L["Alpha"],
desc = L["Configure the alpha of the bar."],
type = "range",
min = 0, max = 1, bigStep = 0.05,
isPercent = true,
get = optGetter,
set = optSetter,
},
scale = {
order = 30,
name = L["Scale"],
desc = L["Configure the scale of the bar."],
type = "range",
min = 0, softMin = .1, softMax = 2, bigStep = 0.05,
get = optGetter,
set = optSetter,
},
clickthrough = {
order = 200,
name = L["Click-Through"],
desc = L["Disable any reaction to mouse events on this bar, making the bar click-through."],
type = "toggle",
get = optGetter,
set = optSetter,
hidden = clickThroughVis,
width = "full",
},
},
},
visibility = {
type = "group",
name = L["Visibility"],
order = 2,
get = visibilityGetter,
set = visibilitySetter,
args = {
info = {
order = 1,
type = "description",
name = L["The bar default is to be visible all the time, you can configure conditions here to control when the bar should be hidden."] .. "\n",
},
fadeout = {
order = 5,
name = L["Fade Out"],
desc = L["Enable the FadeOut mode"],
type = "toggle",
get = optGetter,
set = optSetter,
width = "full",
},
fadeoutalpha = {
order = 6,
name = L["Fade Out Alpha"],
desc = L["Configure the Fade Out Alpha"],
type = "range",
min = 0, max = 1, bigStep = 0.05,
isPercent = true,
get = optGetter,
set = optSetter,
},
fadeoutdelay = {
order = 7,
name = L["Fade Out Delay"],
desc = L["Configure the Fade Out Delay"],
type = "range",
min = 0, softMax = 1, bigStep = 0.01,
get = optGetter,
set = optSetter,
},
fadeNl = {
order = 8,
type = "description",
name = "",
},
always = {
order = 10,
type = "toggle",
name = L["Always Hide"],
desc = L["You can set the bar to be always hidden, if you only wish to access it using key-bindings."],
disabled = customEnabled,
},
possess = {
order = 15,
type = "toggle",
name = L["Hide when Possessing"],
desc = L["Hide this bar when you are possessing a NPC."],
disabled = customEnabled,
},
vehicle = {
order = 16,
type = "toggle",
name = L["Hide on Vehicle"],
desc = L["Hide this bar when you are riding on a vehicle."],
disabled = customEnabled,
},
vehicleui = {
order = 17,
type = "toggle",
name = L["Hide with Vehicle UI"],
desc = L["Hide this bar when the game wants to show a vehicle UI."],
disabled = customEnabled,
},
combat = {
order = 20,
type = "toggle",
name = L["Hide in Combat"],
desc = L["This bar will be hidden once you enter combat."],
disabled = customEnabled,
},
nocombat = {
order = 21,
type = "toggle",
name = L["Hide out of Combat"],
desc = L["This bar will be hidden whenever you are not in combat."],
disabled = customEnabled,
},
pet = {
order = 30,
type = "toggle",
name = L["Hide with pet"],
desc = L["Hide this bar when you have a pet."],
disabled = customEnabled,
},
nopet = {
order = 31,
type = "toggle",
name = L["Hide without pet"],
desc = L["Hide this bar when you have no pet."],
disabled = customEnabled,
},
stance = {
order = 50,
type = "multiselect",
name = L["Hide in Stance/Form"],
desc = L["Hide this bar in a specific Stance or Form."],
values = getStanceTable,
hidden = function() return (not stanceClasses[class]) end,
disabled = customEnabled,
},
customNl = {
order = 98,
type = "description",
name = "\n",
},
customHeader = {
order = 99,
type = "header",
name = L["Custom Conditionals"],
},
custom = {
order = 100,
type = "toggle",
name = L["Use Custom Condition"],
desc = L["Enable the use of a custom condition, disabling all of the above."],
},
customCopy = {
order = 101,
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 = customCopy,
},
customDesc = {
order = 102,
type = "description",
name = L["Note: Enabling Custom Conditionals will disable all of the above settings!"],
},
customdata = {
order = 103,
type = "input",
name = L["Custom Conditionals"],
desc = L["You can use any macro conditionals in the custom string, using \"show\" and \"hide\" as values.\n\nExample: [combat]hide;show"],
width = "full",
multiline = true,
disabled = customDisabled,
},
},
},
position = {
type = "group",
name = L["Positioning"],
order = 20,
args = {
info = {
order = 1,
type = "description",
name = L["The Positioning options here will allow you to position the bar to your liking and with an absolute precision."],
},
point = {
order = 10,
type = "select",
name = L["Anchor"],
desc = L["Change the current anchor point of the bar."],
values = validAnchors,
get = posGet,
set = posSet,
},
scale = {
order = 11,
name = L["Scale"],
desc = L["Configure the scale of the bar."],
type = "range",
min = 0, softMin = .1, softMax = 2, bigStep = 0.05,
get = optGetter,
set = optSetter,
},
nl1 = {
order = 12,
type = "description",
name = "",
},
x = {
order = 20,
type = "input",
name = L["X Offset"],
desc = L["Offset in X direction (horizontal) from the given anchor point."],
get = posGet,
set = posSet,
dialogControl = "NumberEditBox",
},
y = {
order = 21,
type = "input",
name = L["Y Offset"],
desc = L["Offset in Y direction (vertical) from the given anchor point."],
get = posGet,
set = posSet,
dialogControl = "NumberEditBox",
},
nl2 = {
order = 25,
type = "description",
name = "",
},
centerhorz = {
order = 31,
type = "execute",
name = L["Center Horizontally"],
desc = L["Centers the bar horizontally on screen."],
func = centerHorz,
},
centervert = {
order = 31,
type = "execute",
name = L["Center Vertically"],
desc = L["Centers the bar vertically on screen."],
func = centerVert,
},
nl2 = {
order = 35,
type = "description",
name = " ",
},
reset = {
order = 40,
type = "execute",
name = L["Reset Position"],
desc = L["Reset the position of this bar completly if it ended up off-screen and you cannot reach it anymore."],
func = resetPos,
},
},
}
}
return Bartender4:NewOptionObject(otbl)
end