57a5cdabdf
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).
476 lines
13 KiB
Lua
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
|