169 рядки
7.6 KiB
Lua
169 рядки
7.6 KiB
Lua
--[[panelData = {
|
|
type = "panel",
|
|
name = "Window Title", -- or string id or function returning a string
|
|
displayName = "My Longer Window Title", -- or string id or function returning a string (optional) (can be useful for long addon names or if you want to colorize it)
|
|
author = "Seerah", -- or string id or function returning a string (optional)
|
|
version = "2.0", -- or string id or function returning a string (optional)
|
|
website = "http://www.esoui.com/downloads/info7-LibAddonMenu.html", -- URL of website where the addon can be updated or function (optional)
|
|
feedback = "https://www.esoui.com/portal.php?uid=5815", -- URL of website where feedback/feature requests/bugs can be reported for the addon or function (optional)
|
|
translation = "https://www.esoui.com/portal.php?uid=5815", -- URL of website where translation texts of the addon can be helped with or function (optional)
|
|
donation = "http://www.esoui.com/downloads/info7-LibAddonMenu.html", -- URL of website where a donation for the addon author can be raised or function (optional)
|
|
keywords = "settings", -- additional keywords for search filter (it looks for matches in name..keywords..author) (optional)
|
|
slashCommand = "/myaddon", -- will register a keybind to open to this panel (don't forget to include the slash!) (optional)
|
|
registerForRefresh = true, -- boolean will refresh all options controls when a setting is changed and when the panel is shown (optional)
|
|
registerForDefaults = true, -- boolean will set all options controls back to default values (optional)
|
|
resetFunc = function() print("defaults reset") end, -- custom function to run after settings are reset to defaults (optional)
|
|
} ]]
|
|
|
|
|
|
local widgetVersion = 15
|
|
local LAM = LibStub("LibAddonMenu-2.0")
|
|
if not LAM:RegisterWidget("panel", widgetVersion) then return end
|
|
|
|
local wm = WINDOW_MANAGER
|
|
local cm = CALLBACK_MANAGER
|
|
|
|
local function RefreshPanel(control)
|
|
local panel = LAM.util.GetTopPanel(control) --callback can be fired by a single control, by the panel showing or by a nested submenu
|
|
if LAM.currentAddonPanel ~= panel or not LAM.currentPanelOpened then return end -- we refresh it later when the panel is opened
|
|
|
|
local panelControls = panel.controlsToRefresh
|
|
|
|
for i = 1, #panelControls do
|
|
local updateControl = panelControls[i]
|
|
if updateControl ~= control and updateControl.UpdateValue then
|
|
updateControl:UpdateValue()
|
|
end
|
|
if updateControl.UpdateDisabled then
|
|
updateControl:UpdateDisabled()
|
|
end
|
|
if updateControl.UpdateWarning then
|
|
updateControl:UpdateWarning()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function ForceDefaults(panel)
|
|
local panelControls = panel.controlsToRefresh
|
|
|
|
for i = 1, #panelControls do
|
|
local updateControl = panelControls[i]
|
|
if updateControl.UpdateValue and updateControl.data.default ~= nil then
|
|
updateControl:UpdateValue(true)
|
|
end
|
|
end
|
|
|
|
if panel.data.resetFunc then
|
|
panel.data.resetFunc()
|
|
end
|
|
|
|
cm:FireCallbacks("LAM-RefreshPanel", panel)
|
|
end
|
|
|
|
local callbackRegistered = false
|
|
LAMCreateControl.scrollCount = LAMCreateControl.scrollCount or 1
|
|
local SEPARATOR = " - "
|
|
local COLORED_SEPARATOR = ZO_WHITE:Colorize(SEPARATOR)
|
|
local LINK_COLOR = ZO_ColorDef:New("5959D5")
|
|
local LINK_MOUSE_OVER_COLOR = ZO_ColorDef:New("B8B8D3")
|
|
local LINK_COLOR_DONATE = ZO_ColorDef:New("FFD700") -- golden
|
|
local LINK_MOUSE_OVER_COLOR_DONATE = ZO_ColorDef:New("FFF6CC")
|
|
|
|
local function CreateButtonControl(control, label, clickAction, relativeTo)
|
|
local button = wm:CreateControl(nil, control, CT_BUTTON)
|
|
button:SetClickSound("Click")
|
|
button:SetFont(LAM.util.L["PANEL_INFO_FONT"])
|
|
button:SetNormalFontColor(LINK_COLOR:UnpackRGBA())
|
|
button:SetMouseOverFontColor(LINK_MOUSE_OVER_COLOR:UnpackRGBA())
|
|
|
|
local OnClicked
|
|
local actionType = type(clickAction)
|
|
if actionType == "string" then
|
|
OnClicked = function() RequestOpenUnsafeURL(clickAction) end
|
|
elseif actionType == "function" then
|
|
OnClicked = clickAction
|
|
end
|
|
button:SetHandler("OnClicked", OnClicked)
|
|
|
|
if relativeTo then
|
|
button:SetAnchor(TOPLEFT, relativeTo, TOPRIGHT, 0, 0)
|
|
button:SetText(COLORED_SEPARATOR .. label)
|
|
else
|
|
button:SetAnchor(TOPLEFT, control.label, BOTTOMLEFT, 0, -2)
|
|
button:SetText(label)
|
|
end
|
|
button:SetDimensions(button:GetLabelControl():GetTextDimensions())
|
|
|
|
return button
|
|
end
|
|
|
|
function LAMCreateControl.panel(parent, panelData, controlName)
|
|
local control = wm:CreateControl(controlName, parent, CT_CONTROL)
|
|
|
|
control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
|
|
local label = control.label
|
|
label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 4)
|
|
label:SetText(LAM.util.GetStringFromValue(panelData.displayName or panelData.name))
|
|
|
|
local previousInfoControl
|
|
if panelData.author or panelData.version then
|
|
control.info = wm:CreateControl(nil, control, CT_LABEL)
|
|
local info = control.info
|
|
info:SetFont(LAM.util.L["PANEL_INFO_FONT"])
|
|
info:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, -2)
|
|
|
|
local output = {}
|
|
if panelData.author then
|
|
output[#output + 1] = zo_strformat(LAM.util.L["AUTHOR"], LAM.util.GetStringFromValue(panelData.author))
|
|
end
|
|
if panelData.version then
|
|
output[#output + 1] = zo_strformat(LAM.util.L["VERSION"], LAM.util.GetStringFromValue(panelData.version))
|
|
end
|
|
info:SetText(table.concat(output, SEPARATOR))
|
|
previousInfoControl = info
|
|
end
|
|
|
|
if panelData.website then
|
|
control.website = CreateButtonControl(control, LAM.util.L["WEBSITE"], panelData.website, previousInfoControl)
|
|
previousInfoControl = control.website
|
|
end
|
|
|
|
if panelData.feedback then
|
|
control.feedback = CreateButtonControl(control, LAM.util.L["FEEDBACK"], panelData.feedback, previousInfoControl)
|
|
previousInfoControl = control.feedback
|
|
end
|
|
|
|
if panelData.translation then
|
|
control.translation = CreateButtonControl(control, LAM.util.L["TRANSLATION"], panelData.translation, previousInfoControl)
|
|
previousInfoControl = control.translation
|
|
end
|
|
|
|
if panelData.donation then
|
|
control.donation = CreateButtonControl(control, LAM.util.L["DONATION"], panelData.donation, previousInfoControl)
|
|
local donation = control.donation
|
|
previousInfoControl = donation
|
|
donation:SetNormalFontColor(LINK_COLOR_DONATE:UnpackRGBA())
|
|
donation:SetMouseOverFontColor(LINK_MOUSE_OVER_COLOR_DONATE:UnpackRGBA())
|
|
end
|
|
|
|
control.container = wm:CreateControlFromVirtual("LAMAddonPanelContainer"..LAMCreateControl.scrollCount, control, "ZO_ScrollContainer")
|
|
LAMCreateControl.scrollCount = LAMCreateControl.scrollCount + 1
|
|
local container = control.container
|
|
container:SetAnchor(TOPLEFT, control.info or label, BOTTOMLEFT, 0, 20)
|
|
container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, -3, -3)
|
|
control.scroll = GetControl(control.container, "ScrollChild")
|
|
control.scroll:SetResizeToFitPadding(0, 20)
|
|
|
|
if panelData.registerForRefresh and not callbackRegistered then --don't want to register our callback more than once
|
|
cm:RegisterCallback("LAM-RefreshPanel", RefreshPanel)
|
|
callbackRegistered = true
|
|
end
|
|
|
|
control.ForceDefaults = ForceDefaults
|
|
control.RefreshPanel = LAM.util.RequestRefreshIfNeeded
|
|
control.data = panelData
|
|
control.controlsToRefresh = {}
|
|
|
|
return control
|
|
end
|