--[[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) 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 (optional) (will refresh all options controls when a setting is changed and when the panel is shown) registerForDefaults = true, --boolean (optional) (will set all options controls back to default values) resetFunc = function() print("defaults reset") end, --(optional) custom function to run after settings are reset to defaults } ]] local widgetVersion = 10 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 = control.panel or control --callback can be fired by a single control or by the panel showing 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 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 ESO_Dialogs["LAM_DEFAULTS"] = { title = { text = SI_INTERFACE_OPTIONS_RESET_TO_DEFAULT_TOOLTIP, }, mainText = { text = SI_OPTIONS_RESET_PROMPT, align = TEXT_ALIGN_CENTER, }, buttons = { [1] = { text = SI_OPTIONS_RESET, callback = function(dialog) ForceDefaults(dialog.data[1]) end, }, [2] = { text = SI_DIALOG_CANCEL, }, }, } local callbackRegistered = false LAMCreateControl.scrollCount = LAMCreateControl.scrollCount or 1 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)) if panelData.author or panelData.version then control.info = wm:CreateControl(nil, control, CT_LABEL) local info = control.info info:SetFont("$(CHAT_FONT)|14|soft-shadow-thin") info:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, -2) if panelData.author and panelData.version then info:SetText(string.format("Version: %s - %s: %s", LAM.util.GetStringFromValue(panelData.version), GetString(SI_ADDON_MANAGER_AUTHOR), LAM.util.GetStringFromValue(panelData.author))) elseif panelData.author then info:SetText(string.format("%s: %s", GetString(SI_ADDON_MANAGER_AUTHOR), LAM.util.GetStringFromValue(panelData.author))) else info:SetText("Version: " .. LAM.util.GetStringFromValue(panelData.version)) end 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.registerForDefaults then control.defaultButton = wm:CreateControlFromVirtual(nil, control, "ZO_DefaultTextButton") local defaultButton = control.defaultButton defaultButton:SetFont("ZoFontDialogKeybindDescription") defaultButton:SetHorizontalAlignment(TEXT_ALIGN_LEFT) --defaultButton:SetText("Reset To Defaults") defaultButton:SetText(GetString(SI_OPTIONS_DEFAULTS)) defaultButton:SetDimensions(200, 30) defaultButton:SetAnchor(TOPLEFT, control, BOTTOMLEFT, 0, 2) defaultButton:SetHandler("OnClicked", function() ZO_Dialogs_ShowDialog("LAM_DEFAULTS", {control}) end) end 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.data = panelData control.controlsToRefresh = {} return control end