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

317 lines
10 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 AceConfigDialog = LibStub("AceConfigDialog-3.0")
local getFunc, setFunc
do
function getFunc(info)
return (info.arg and Bartender4.db.profile[info.arg] or Bartender4.db.profile[info[#info]])
end
function setFunc(info, value)
local key = info.arg or info[#info]
Bartender4.db.profile[key] = value
end
end
local KB = LibStub("LibKeyBound-1.0")
local LDBIcon = LibStub("LibDBIcon-1.0", true)
local function getOptions()
if not Bartender4.options then
Bartender4.options = {
type = "group",
name = "Bartender4",
icon = "Interface\\Icons\\INV_Drink_05",
childGroups = "tree",
plugins = {},
args = {
lock = {
order = 1,
type = "toggle",
name = L["Lock"],
desc = L["Lock all bars."],
get = function() return Bartender4.Locked end,
set = function(info, value) Bartender4[value and "Lock" or "Unlock"](Bartender4) end,
width = "half",
},
buttonlock = {
order = 2,
type = "toggle",
name = L["Button Lock"],
desc = L["Lock the buttons."],
get = function() return Bartender4.db.profile.buttonlock end,
set = function(info, value)
Bartender4.db.profile.buttonlock = value
Bartender4.Bar:ForAll("ForAll", "SetAttribute", "buttonlock", value)
end,
},
minimapIcon = {
order = 3,
type = "toggle",
name = L["Minimap Icon"],
desc = L["Show a Icon to open the config at the Minimap"],
get = function() return not Bartender4.db.profile.minimapIcon.hide end,
set = function(info, value) Bartender4.db.profile.minimapIcon.hide = not value; LDBIcon[value and "Show" or "Hide"](LDBIcon, "Bartender4") end,
disabled = function() return not LDBIcon end,
},
kb = {
order = 4,
type = "execute",
name = L["Key Bindings"],
desc = L["Switch to key-binding mode"],
func = function()
KB:Toggle()
AceConfigDialog:Close("Bartender4")
end,
},
bars = {
order = 20,
type = "group",
name = L["Bars"],
args = {
options = {
type = "group",
order = 0,
name = function(info) if info.uiType == "dialog" then return "" else return L["Bar Options"] end end,
guiInline = true,
args = {
blizzardVehicle = {
order = 1,
type = "toggle",
name = L["Use Blizzard Vehicle UI"],
desc = L["Enable the use of the Blizzard Vehicle UI, hiding any Bartender4 bars in the meantime."],
width = "full",
get = getFunc,
set = function(info, value)
if UnitHasVehicleUI("player") then
Bartender4:Print(L["You have to exit the vehicle in order to be able to change the Vehicle UI settings."])
return
end
Bartender4.db.profile.blizzardVehicle = value
Bartender4:UpdateBlizzardVehicle()
end,
},
selfcastmodifier = {
order = 10,
type = "toggle",
name = L["Self-Cast by modifier"],
desc = L["Toggle the use of the modifier-based self-cast functionality."],
get = getFunc,
set = function(info, value)
Bartender4.db.profile.selfcastmodifier = value
Bartender4.Bar:ForAll("UpdateSelfCast")
end,
},
setselfcastmod = {
order = 20,
type = "select",
name = L["Self-Cast Modifier"],
desc = L["Select the Self-Cast Modifier"],
get = function(info) return GetModifiedClick("SELFCAST") end,
set = function(info, value) SetModifiedClick("SELFCAST", value); SaveBindings(GetCurrentBindingSet() or 1) end,
values = { NONE = L["None"], ALT = L["ALT"], SHIFT = L["SHIFT"], CTRL = L["CTRL"] },
},
selfcast_nl = {
order = 30,
type = "description",
name = "",
},
focuscastmodifier = {
order = 50,
type = "toggle",
name = L["Focus-Cast by modifier"],
desc = L["Toggle the use of the modifier-based focus-cast functionality."],
get = getFunc,
set = function(info, value)
Bartender4.db.profile.focuscastmodifier = value
Bartender4.Bar:ForAll("UpdateSelfCast")
end,
},
setfocuscastmod = {
order = 60,
type = "select",
name = L["Focus-Cast Modifier"],
desc = L["Select the Focus-Cast Modifier"],
get = function(info) return GetModifiedClick("FOCUSCAST") end,
set = function(info, value) SetModifiedClick("FOCUSCAST", value); SaveBindings(GetCurrentBindingSet() or 1) end,
values = { NONE = L["None"], ALT = L["ALT"], SHIFT = L["SHIFT"], CTRL = L["CTRL"] },
},
focuscast_nl = {
order = 70,
type = "description",
name = "",
},
selfcastrightclick = {
order = 80,
type = "toggle",
name = L["Right-click Self-Cast"],
desc = L["Toggle the use of the right-click self-cast functionality."],
get = getFunc,
set = function(info, value)
Bartender4.db.profile.selfcastrightclick = value
Bartender4.Bar:ForAll("UpdateSelfCast")
end,
},
rightclickselfcast_nl = {
order = 90,
type = "description",
name = "",
},
range = {
order = 100,
name = L["Out of Range Indicator"],
desc = L["Configure how the Out of Range Indicator should display on the buttons."],
type = "select",
style = "dropdown",
get = function()
return Bartender4.db.profile.outofrange
end,
set = function(info, value)
Bartender4.db.profile.outofrange = value
Bartender4.Bar:ForAll("ApplyConfig")
end,
values = { none = L["No Display"], button = L["Full Button Mode"], hotkey = L["Hotkey Mode"] },
},
colors = {
order = 130,
type = "group",
guiInline = true,
name = L["Colors"],
get = function(info)
local color = Bartender4.db.profile.colors[info[#info]]
return color.r, color.g, color.b
end,
set = function(info, r, g, b)
local color = Bartender4.db.profile.colors[info[#info]]
color.r, color.g, color.b = r, g, b
Bartender4.Bar:ForAll("ApplyConfig")
end,
args = {
range = {
order = 1,
type = "color",
name = L["Out of Range Indicator"],
desc = L["Specify the Color of the Out of Range Indicator"],
},
mana = {
order = 2,
type = "color",
name = L["Out of Mana Indicator"],
desc = L["Specify the Color of the Out of Mana Indicator"],
},
},
},
tooltip = {
order = 200,
name = L["Button Tooltip"],
type = "select",
desc = L["Configure the Button Tooltip."],
values = { ["disabled"] = L["Disabled"], ["nocombat"] = L["Disabled in Combat"], ["enabled"] = L["Enabled"] },
get = function() return Bartender4.db.profile.tooltip end,
set = function(info, value) Bartender4.db.profile.tooltip = value end,
},
},
},
},
},
faq = {
name = L["FAQ"],
desc = L["Frequently Asked Questions"],
type = "group",
order = 200,
args = {
faq = {
type = "description",
name = L["FAQ_TEXT"],
},
},
},
},
}
Bartender4.options.plugins.profiles = { profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(Bartender4.db) }
for k,v in Bartender4:IterateModules() do
if v.SetupOptions then
v:SetupOptions()
end
end
end
return Bartender4.options
end
function Bartender4:ChatCommand(input)
if InCombatLockdown() then
self:Print(L["Cannot access options during combat."])
return
end
if not input or input:trim() == "" then
LibStub("AceConfigDialog-3.0"):Open("Bartender4")
else
LibStub("AceConfigCmd-3.0").HandleCommand(Bartender4, "bt", "Bartender4", input)
end
end
function Bartender4:SetupOptions()
LibStub("AceConfig-3.0"):RegisterOptionsTable("Bartender4", getOptions)
AceConfigDialog:SetDefaultSize("Bartender4", 680,525)
self:RegisterChatCommand( "bar", "ChatCommand")
self:RegisterChatCommand( "bt", "ChatCommand")
self:RegisterChatCommand( "bt4", "ChatCommand")
self:RegisterChatCommand( "bartender", "ChatCommand")
self:RegisterChatCommand( "bartender4", "ChatCommand")
end
function Bartender4:RegisterModuleOptions(key, table)
if not self.options then
error("Options table has not been created yet, respond to the callback!", 2)
end
self.options.plugins[key] = { [key] = table }
end
function Bartender4:RegisterBarOptions(id, table)
if not self.options then
error("Options table has not been created yet, respond to the callback!", 2)
end
self.options.args.bars.args[id] = table
end
local optionParent = {}
function optionParent:NewCategory(category, data)
self.table[category] = data
end
local ov = nil
function optionParent:AddElement(category, element, data, ...)
local lvl = self.table[category]
for i = 1, select('#', ...) do
local key = select(i, ...)
if not (lvl.args[key] and lvl.args[key].args) then
error(("Sub-Level Key %s does not exist in options group or is no sub-group."):format(key), ov and 3 or 2)
end
lvl = lvl.args[key]
end
lvl.args[element] = data
end
function optionParent:AddElementGroup(category, data, ...)
ov = true
for k,v in pairs(data) do
self:AddElement(category, k, v, ...)
end
ov = nil
end
function Bartender4:NewOptionObject(otbl)
if not otbl then otbl = {} end
local tbl = { table = otbl }
for k, v in pairs(optionParent) do
tbl[k] = v
end
return tbl
end