2016-10-10 19:48:47 +00:00
--[[panelData = {
2019-02-10 14:12:44 +00:00
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)
2019-10-26 20:14:39 +00:00
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)
2019-02-10 14:12:44 +00:00
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)
2019-10-26 20:14:39 +00:00
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)
2019-02-10 14:12:44 +00:00
} ] ]
2019-10-26 20:14:39 +00:00
local widgetVersion = 15
2016-10-10 19:48:47 +00:00
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 )
2019-02-10 14:12:44 +00:00
local panel = LAM.util . GetTopPanel ( control ) --callback can be fired by a single control, by the panel showing or by a nested submenu
2019-10-26 20:14:39 +00:00
if LAM.currentAddonPanel ~= panel or not LAM.currentPanelOpened then return end -- we refresh it later when the panel is opened
2019-02-10 14:12:44 +00:00
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
2016-10-10 19:48:47 +00:00
end
local function ForceDefaults ( panel )
2019-02-10 14:12:44 +00:00
local panelControls = panel.controlsToRefresh
2016-10-10 19:48:47 +00:00
2019-02-10 14:12:44 +00:00
for i = 1 , # panelControls do
local updateControl = panelControls [ i ]
if updateControl.UpdateValue and updateControl.data . default ~= nil then
updateControl : UpdateValue ( true )
end
end
2016-10-10 19:48:47 +00:00
2019-02-10 14:12:44 +00:00
if panel.data . resetFunc then
panel.data . resetFunc ( )
end
2016-10-10 19:48:47 +00:00
2019-02-10 14:12:44 +00:00
cm : FireCallbacks ( " LAM-RefreshPanel " , panel )
2016-10-10 19:48:47 +00:00
end
local callbackRegistered = false
LAMCreateControl.scrollCount = LAMCreateControl.scrollCount or 1
2019-02-10 14:12:44 +00:00
local SEPARATOR = " - "
2019-10-26 20:14:39 +00:00
local COLORED_SEPARATOR = ZO_WHITE : Colorize ( SEPARATOR )
2019-02-10 14:12:44 +00:00
local LINK_COLOR = ZO_ColorDef : New ( " 5959D5 " )
local LINK_MOUSE_OVER_COLOR = ZO_ColorDef : New ( " B8B8D3 " )
2019-10-26 20:14:39 +00:00
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
2019-02-10 14:12:44 +00:00
2016-10-10 19:48:47 +00:00
function LAMCreateControl . panel ( parent , panelData , controlName )
2019-02-10 14:12:44 +00:00
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 ) )
2019-10-26 20:14:39 +00:00
local previousInfoControl
2019-02-10 14:12:44 +00:00
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 ) )
2019-10-26 20:14:39 +00:00
previousInfoControl = info
2019-02-10 14:12:44 +00:00
end
if panelData.website then
2019-10-26 20:14:39 +00:00
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 ( ) )
2019-02-10 14:12:44 +00:00
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
2019-10-26 20:14:39 +00:00
control.RefreshPanel = LAM.util . RequestRefreshIfNeeded
2019-02-10 14:12:44 +00:00
control.data = panelData
control.controlsToRefresh = { }
return control
2016-10-10 19:48:47 +00:00
end