You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

227 lines
7.6 KiB

local ADDON, ns = ...
local Addon = ns.Addon
local L = ns.L
local AceConfigRegistry = LibStub('AceConfigRegistry-3.0')
local AceConfigDialog = LibStub('AceConfigDialog-3.0')
local AceGUISharedMediaWidgets = LibStub('AceGUISharedMediaWidgets-1.0')
local LibSharedMedia = LibStub("LibSharedMedia-3.0")
local Options = Addon:NewModule('Options')
local PluginManager = ns.PluginManager
local function orderGen()
local order = 0
return function()
order = order + 1
return order
end
end
function Options:OnEnable()
self:InitOptions()
end
function Options:InitOptions()
self.optionsArgs = {}
local options = {
type = 'group',
args = self.optionsArgs
}
AceConfigRegistry:RegisterOptionsTable(L.ADDON_NAME, options)
AceConfigDialog:AddToBlizOptions(L.ADDON_NAME, L.ADDON_NAME)
self:UpdateOptions()
end
function Options:UpdateOptions()
local order = orderGen()
local function defaultGet(item)
return Addon:GetSetting(item[#item])
end
local function defaultSet(item, value)
return Addon:SetSetting(item[#item], value)
end
local function makeBase(name, type, extra)
local tab = extra or {}
tab.order = order()
tab.width = tab.width or 'full'
tab.name = name
tab.type = type
local set = (extra and extra.set) or defaultSet
local get = (extra and extra.get) or defaultGet
if extra and extra.needsReload then
extra.needsReload = nil
set = function(item, value)
set(item, value)
C_UI.Reload()
end
end
tab.set = set
tab.get = get
return tab
end
local function makeHeader(name, extra)
local tab = makeBase(name, 'header', extra)
return tab
end
local function makeToggle(name, extra)
local tab = makeBase(name, 'toggle', extra)
return tab
end
local function makeExecute(name, func, extra)
local tab = makeBase(name, 'execute', extra)
tab.func = func
return tab
end
local function makeKeybinding(name, extra)
local tab = makeBase(name, 'keybinding', extra)
return tab
end
local function makeSelect(name, values, extra)
local tab = makeBase(name, 'select', extra)
tab.values = LibSharedMedia:HashTable(values)
tab.dialogControl = 'LSM30_' .. ((values:gsub("^%l", string.upper)))
return tab
end
local function makeDescription(name, extra)
local tab = makeBase(name, 'description', extra)
tab.fontSize = 'medium'
tab.image = [[Interface\Common\help-i]]
tab.imageWidth = 16
tab.imageHeight = 16
tab.imageCoords = {.2, .8, .2, .8}
return tab
end
local function makeRange(name, min, max, step, extra)
local tab = makeBase(name, 'range', extra)
tab.min = min
tab.max = max
tab.step = step
return tab
end
local function makePadding(width)
local tab = makeBase('', 'description', {})
tab.width = width
return tab
end
local optionsArgs = wipe(self.optionsArgs)
--- General
optionsArgs.autoButtonHotKey = makeKeybinding(L.OPTION_AUTOBUTTON_HOTKEY)
optionsArgs.notifyButtonActive = makeToggle(L.OPTION_NOTIFY_BUTTON_ACTIVE, {width = 'double'})
optionsArgs.notifyButtonActivePadding = makePadding(0.2)
optionsArgs.notifyButtonActiveSound = makeSelect(L.OPTION_NOTIFY_BUTTON_ACTIVE_SOUND, LibSharedMedia.MediaType.SOUND, {width = 'normal',})
optionsArgs.testBreak = makeToggle(L.OPTION_TEST_BREAK)
optionsArgs.noWaitDeleteScript = makeToggle(L.OPTION_NO_WAIT_DELETE_SCRIPT)
optionsArgs.hideMinimap = makeToggle(L.OPTION_HIDE_MINIMAP)
optionsArgs.scriptSelectorResetPos = makeExecute(L.OPTION_RESET_FRAMES, function() Addon:ResetFrames() end)
--- Script Selector
optionsArgs.headerPlugins = makeHeader(L.SCRIPT_SELECTOR_TITLE)
optionsArgs.autoSelect = makeToggle(L.OPTION_AUTO_SELECT_SCRIPT_BY_ORDER)
optionsArgs.hideNoScript = makeToggle(L.OPTION_HIDE_SELECTOR_NO_SCRIPT)
optionsArgs.lockScriptSelector = makeToggle(L.OPTION_LOCK_SCRIPT_SELECTOR)
optionsArgs.descriptionPlugins = makeDescription(L.OPTION_SCRIPTSELECTOR_NOTES)
self:FillInstalledPlugins(optionsArgs, order)
--- Script Editor
optionsArgs.headerScriptEditor = makeHeader(L.SCRIPT_EDITOR_TITLE)
optionsArgs.editorFontFace = makeSelect(L.OPTION_EDITOR_FONT_FACE, LibSharedMedia.MediaType.FONT, {width = 'double',
set = function(item, value)
return defaultSet(item, LibSharedMedia:Fetch(LibSharedMedia.MediaType.FONT, value))
end,
get = function(item, value)
local val = defaultGet(item)
for k, v in pairs(LibSharedMedia:HashTable(LibSharedMedia.MediaType.FONT)) do
if v == val then
return k
end
end
return nil
end,
})
optionsArgs.editorFontPadding = makePadding(0.2)
optionsArgs.editorFontSize = makeRange(L.OPTION_EDITOR_FONT_SIZE, 9, 32, 1, {width = 'normal'})
AceConfigRegistry:NotifyChange(ADDON)
end
function Options:FillInstalledPlugins(args, order)
local pluginCount = #PluginManager:GetPluginList()
for i, plugin in PluginManager:IteratePlugins() do
local name = plugin:GetPluginName()
local isFirst = i == 1
local isLast = i == pluginCount
args[name] = {
type = 'toggle',
name = function()
return PluginManager:IsPluginAllowed(name) and plugin:GetPluginTitle() or
format('|cff808080%s (%s)|r', plugin:GetPluginTitle(), DISABLE)
end,
desc = plugin:GetPluginNotes(),
width = 'double',
order = order(),
get = function(item)
return PluginManager:IsPluginAllowed(name)
end,
set = function(item, value)
return PluginManager:SetPluginAllowed(name, value)
end,
}
args[name .. 'Up'] = {
type = 'execute',
name = '',
width = 0.3,
disabled = isFirst,
image = function()
return isFirst and [[Interface\MINIMAP\MiniMap-VignetteArrow]] or
[[Interface\MINIMAP\MiniMap-QuestArrow]]
end,
imageCoords = {0.1875, 0.8125, 0.1875, 0.8125},
imageWidth = 16,
imageHeight = 16,
order = order(),
func = function()
PluginManager:MoveUpPlugin(name)
self:UpdateOptions()
end
}
args[name .. 'Down'] = {
type = 'execute',
name = '',
width = 0.3,
disabled = isLast,
image = function()
return isLast and [[Interface\MINIMAP\MiniMap-VignetteArrow]] or
[[Interface\MINIMAP\MiniMap-QuestArrow]]
end,
imageCoords = {0.1875, 0.8125, 0.8125, 0.1875},
imageWidth = 16,
imageHeight = 16,
order = order(),
func = function()
PluginManager:MoveDownPlugin(name)
self:UpdateOptions()
end
}
end
end
function Addon:OpenOptionsFrame()
InterfaceOptionsFrame_OpenToCategory(L.ADDON_NAME)
end