New Api version, new LibAddonMenu version, enabled new categories by default in the settings

这个提交包含在:
Florian Brinker 2019-02-10 15:12:44 +01:00
父节点 dadd1bf70c
当前提交 2f38fb14e3
共有 22 个文件被更改,包括 2715 次插入1909 次删除

查看文件

@ -1,10 +1,11 @@
## Title: AchievementInfo
## Description: Displays progress updates for achievements in the chat. You can display update-details like 'Slay 25/100 Monsters' if interested. |cFF0000Important:|r The messages appear only when an achievement is updated. This is no permanent tracking tool.
## Version: 2.16
## AddOnVersion 220
## Version: 2.20
## Author: |c87B7CCAsto|r, @Astarax
## Contact: mail@coded-with-heart.com
## APIVersion: 100022
## APIVersion: 100025
## SavedVariables: ACHIEVEMENT_INFO_DB
## OptionalDependsOn: LibAddonMenu-2.0, LibStub

查看文件

@ -8,7 +8,7 @@
AchievementInfo = {}
AchievementInfo.name = "AchievementInfo"
AchievementInfo.author = "Asto, @Astarax"
AchievementInfo.version = 2.16
AchievementInfo.version = 2.20
AchievementInfo.savedVars = nil
AchievementInfo.LangStore = {}

查看文件

@ -24,6 +24,18 @@ function AchievementInfo.loadSavedVars()
cat8 = true,
cat9 = true,
cat10 = true,
cat11 = true,
cat12 = true,
cat13 = true,
cat14 = true,
cat15 = true,
cat16 = true,
cat17 = true,
cat18 = true,
cat19 = true,
cat20 = true,
cat21 = true,
cat22 = true,
devDebug = false
}

查看文件

@ -1,10 +1,16 @@
## APIVersion: 100011
## APIVersion: 100022 100023
## Title: LibAddonMenu-2.0
## Version: 2.0 r18
## Version: 2.0 r26
## AddOnVersion: 26
## Author: Seerah, sirinsidiator, et al.
## Contributors: votan, merlight, Garkin
## Contributors: votan, merlight, Garkin, Randactyl, KuroiLight, silvereyes333, Baertram, kyoma
## Description: A library to aid in the creation of option panels.
##
## This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
## The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
## All rights reserved
##
## You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
LibStub\LibStub.lua
@ -23,3 +29,4 @@ LibAddonMenu-2.0\controls\header.lua
LibAddonMenu-2.0\controls\slider.lua
LibAddonMenu-2.0\controls\texture.lua
LibAddonMenu-2.0\controls\iconpicker.lua
LibAddonMenu-2.0\controls\divider.lua

查看文件

@ -1,6 +1,6 @@
The Artistic License 2.0
Copyright (c) 2015 Ryan Lakanen (Seerah)
Copyright (c) 2016 Ryan Lakanen (Seerah)
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

查看文件

@ -4,7 +4,7 @@
--Register LAM with LibStub
local MAJOR, MINOR = "LibAddonMenu-2.0", 18
local MAJOR, MINOR = "LibAddonMenu-2.0", 26
local lam, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
if not lam then return end --the same or newer version of this lib is already loaded into memory
@ -38,21 +38,38 @@ local cm = CALLBACK_MANAGER
local tconcat = table.concat
local tinsert = table.insert
local MIN_HEIGHT = 26
local HALF_WIDTH_LINE_SPACING = 2
local OPTIONS_CREATION_RUNNING = 1
local OPTIONS_CREATED = 2
local LAM_CONFIRM_DIALOG = "LAM_CONFIRM_DIALOG"
local LAM_DEFAULTS_DIALOG = "LAM_DEFAULTS"
local LAM_RELOAD_DIALOG = "LAM_RELOAD_DIALOG"
local addonsForList = {}
local addonToOptionsMap = {}
local optionsCreated = {}
local optionsState = {}
lam.widgets = lam.widgets or {}
local widgets = lam.widgets
lam.util = {}
lam.util = lam.util or {}
local util = lam.util
lam.controlsForReload = lam.controlsForReload or {}
local controlsForReload = lam.controlsForReload
local function GetTooltipText(tooltip)
if type(tooltip) == "string" then
return tooltip
elseif type(tooltip) == "function" then
return tostring(tooltip())
local function GetDefaultValue(default)
if type(default) == "function" then
return default()
end
return nil
return default
end
local function GetStringFromValue(value)
if type(value) == "function" then
return value()
elseif type(value) == "number" then
return GetString(value)
end
return value
end
local function CreateBaseControl(parent, controlData, controlName)
@ -61,12 +78,12 @@ local function CreateBaseControl(parent, controlData, controlName)
control.data = controlData
control.isHalfWidth = controlData.width == "half"
control:SetWidth(control.panel:GetWidth() - 60)
local width = 510 -- set default width in case a custom parent object is passed
if control.panel.GetWidth ~= nil then width = control.panel:GetWidth() - 60 end
control:SetWidth(width)
return control
end
local MIN_HEIGHT = 26
local HALF_WIDTH_LINE_SPACING = 2
local function CreateLabelAndContainerControl(parent, controlData, controlName)
local control = CreateBaseControl(parent, controlData, controlName)
local width = control:GetWidth()
@ -79,7 +96,7 @@ local function CreateLabelAndContainerControl(parent, controlData, controlName)
label:SetFont("ZoFontWinH4")
label:SetHeight(MIN_HEIGHT)
label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
label:SetText(controlData.name)
label:SetText(GetStringFromValue(controlData.name))
control.label = label
if control.isHalfWidth then
@ -94,16 +111,340 @@ local function CreateLabelAndContainerControl(parent, controlData, controlName)
label:SetAnchor(TOPRIGHT, container, TOPLEFT, 5, 0)
end
control.data.tooltipText = GetTooltipText(control.data.tooltip)
control.data.tooltipText = GetStringFromValue(control.data.tooltip)
control:SetMouseEnabled(true)
control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
return control
end
util.GetTooltipText = GetTooltipText
local function GetTopPanel(panel)
while panel.panel and panel.panel ~= panel do
panel = panel.panel
end
return panel
end
local function IsSame(objA, objB)
if #objA ~= #objB then return false end
for i = 1, #objA do
if objA[i] ~= objB[i] then return false end
end
return true
end
local function RefreshReloadUIButton()
lam.requiresReload = false
for i = 1, #controlsForReload do
local reloadControl = controlsForReload[i]
if not IsSame(reloadControl.startValue, {reloadControl.data.getFunc()}) then
lam.requiresReload = true
break
end
end
lam.applyButton:SetHidden(not lam.requiresReload)
end
local function RequestRefreshIfNeeded(control)
-- if our parent window wants to refresh controls, then fire the callback
local panel = GetTopPanel(control.panel)
local panelData = panel.data
if panelData.registerForRefresh then
cm:FireCallbacks("LAM-RefreshPanel", control)
end
RefreshReloadUIButton()
end
local function RegisterForRefreshIfNeeded(control)
-- if our parent window wants to refresh controls, then add this to the list
local panel = GetTopPanel(control.panel)
local panelData = panel.data
if panelData.registerForRefresh or panelData.registerForDefaults then
tinsert(panel.controlsToRefresh or {}, control) -- prevent errors on custom panels
end
end
local function RegisterForReloadIfNeeded(control)
if control.data.requiresReload then
tinsert(controlsForReload, control)
control.startValue = {control.data.getFunc()}
end
end
local function GetConfirmDialog()
if(not ESO_Dialogs[LAM_CONFIRM_DIALOG]) then
ESO_Dialogs[LAM_CONFIRM_DIALOG] = {
canQueue = true,
title = {
text = "",
},
mainText = {
text = "",
},
buttons = {
[1] = {
text = SI_DIALOG_CONFIRM,
callback = function(dialog) end,
},
[2] = {
text = SI_DIALOG_CANCEL,
}
}
}
end
return ESO_Dialogs[LAM_CONFIRM_DIALOG]
end
local function ShowConfirmationDialog(title, body, callback)
local dialog = GetConfirmDialog()
dialog.title.text = title
dialog.mainText.text = body
dialog.buttons[1].callback = callback
ZO_Dialogs_ShowDialog(LAM_CONFIRM_DIALOG)
end
local function GetDefaultsDialog()
if(not ESO_Dialogs[LAM_DEFAULTS_DIALOG]) then
ESO_Dialogs[LAM_DEFAULTS_DIALOG] = {
canQueue = true,
title = {
text = SI_INTERFACE_OPTIONS_RESET_TO_DEFAULT_TOOLTIP,
},
mainText = {
text = SI_OPTIONS_RESET_PROMPT,
},
buttons = {
[1] = {
text = SI_OPTIONS_RESET,
callback = function(dialog) end,
},
[2] = {
text = SI_DIALOG_CANCEL,
}
}
}
end
return ESO_Dialogs[LAM_DEFAULTS_DIALOG]
end
local function ShowDefaultsDialog(panel)
local dialog = GetDefaultsDialog()
dialog.buttons[1].callback = function()
panel:ForceDefaults()
RefreshReloadUIButton()
end
ZO_Dialogs_ShowDialog(LAM_DEFAULTS_DIALOG)
end
local function DiscardChangesOnReloadControls()
for i = 1, #controlsForReload do
local reloadControl = controlsForReload[i]
if not IsSame(reloadControl.startValue, {reloadControl.data.getFunc()}) then
reloadControl:UpdateValue(false, unpack(reloadControl.startValue))
end
end
lam.requiresReload = false
lam.applyButton:SetHidden(true)
end
local function StorePanelForReopening()
local saveData = ZO_Ingame_SavedVariables["LAM"] or {}
saveData.reopenPanel = lam.currentAddonPanel:GetName()
ZO_Ingame_SavedVariables["LAM"] = saveData
end
local function RetrievePanelForReopening()
local saveData = ZO_Ingame_SavedVariables["LAM"]
if(saveData) then
ZO_Ingame_SavedVariables["LAM"] = nil
return _G[saveData.reopenPanel]
end
end
local function HandleReloadUIPressed()
StorePanelForReopening()
ReloadUI()
end
local function HandleLoadDefaultsPressed()
ShowDefaultsDialog(lam.currentAddonPanel)
end
local function GetReloadDialog()
if(not ESO_Dialogs[LAM_RELOAD_DIALOG]) then
ESO_Dialogs[LAM_RELOAD_DIALOG] = {
canQueue = true,
title = {
text = util.L["RELOAD_DIALOG_TITLE"],
},
mainText = {
text = util.L["RELOAD_DIALOG_TEXT"],
},
buttons = {
[1] = {
text = util.L["RELOAD_DIALOG_RELOAD_BUTTON"],
callback = function() ReloadUI() end,
},
[2] = {
text = util.L["RELOAD_DIALOG_DISCARD_BUTTON"],
callback = DiscardChangesOnReloadControls,
}
},
noChoiceCallback = DiscardChangesOnReloadControls,
}
end
return ESO_Dialogs[LAM_CONFIRM_DIALOG]
end
local function ShowReloadDialogIfNeeded()
if lam.requiresReload then
local dialog = GetReloadDialog()
ZO_Dialogs_ShowDialog(LAM_RELOAD_DIALOG)
end
end
local function UpdateWarning(control)
local warning
if control.data.warning ~= nil then
warning = util.GetStringFromValue(control.data.warning)
end
if control.data.requiresReload then
if not warning then
warning = string.format("|cff0000%s", util.L["RELOAD_UI_WARNING"])
else
warning = string.format("%s\n\n|cff0000%s", warning, util.L["RELOAD_UI_WARNING"])
end
end
if not warning then
control.warning:SetHidden(true)
else
control.warning.data = {tooltipText = warning}
control.warning:SetHidden(false)
end
end
local localization = {
en = {
PANEL_NAME = "Addons",
AUTHOR = string.format("%s: <<X:1>>", GetString(SI_ADDON_MANAGER_AUTHOR)), -- "Author: <<X:1>>"
VERSION = "Version: <<X:1>>",
WEBSITE = "Visit Website",
PANEL_INFO_FONT = "$(CHAT_FONT)|14|soft-shadow-thin",
RELOAD_UI_WARNING = "Changes to this setting require an UI reload in order to take effect.",
RELOAD_DIALOG_TITLE = "UI Reload required",
RELOAD_DIALOG_TEXT = "Some changes require an UI reload in order to take effect. Do you want to reload now or discard the changes?",
RELOAD_DIALOG_RELOAD_BUTTON = "Reload",
RELOAD_DIALOG_DISCARD_BUTTON = "Discard",
},
it = { -- provided by JohnnyKing
PANEL_NAME = "Addon",
VERSION = "Versione: <<X:1>>",
WEBSITE = "Visita il Sitoweb",
RELOAD_UI_WARNING = "Cambiare questa impostazione richiede un Ricarica UI al fine che faccia effetto.",
RELOAD_DIALOG_TITLE = "Ricarica UI richiesto",
RELOAD_DIALOG_TEXT = "Alcune modifiche richiedono un Ricarica UI al fine che facciano effetto. Sei sicuro di voler ricaricare ora o di voler annullare le modifiche?",
RELOAD_DIALOG_RELOAD_BUTTON = "Ricarica",
RELOAD_DIALOG_DISCARD_BUTTON = "Annulla",
},
fr = { -- provided by Ayantir
PANEL_NAME = "Extensions",
WEBSITE = "Visiter le site Web",
RELOAD_UI_WARNING = "La modification de ce paramètre requiert un rechargement de l'UI pour qu'il soit pris en compte.",
RELOAD_DIALOG_TITLE = "Reload UI requis",
RELOAD_DIALOG_TEXT = "Certaines modifications requièrent un rechargement de l'UI pour qu'ils soient pris en compte. Souhaitez-vous recharger l'interface maintenant ou annuler les modifications ?",
RELOAD_DIALOG_RELOAD_BUTTON = "Recharger",
RELOAD_DIALOG_DISCARD_BUTTON = "Annuler",
},
de = { -- provided by sirinsidiator
PANEL_NAME = "Erweiterungen",
WEBSITE = "Webseite besuchen",
RELOAD_UI_WARNING = "Änderungen an dieser Option werden erst übernommen nachdem die Benutzeroberfläche neu geladen wird.",
RELOAD_DIALOG_TITLE = "Neuladen benötigt",
RELOAD_DIALOG_TEXT = "Einige Änderungen werden erst übernommen nachdem die Benutzeroberfläche neu geladen wird. Wollt Ihr sie jetzt neu laden oder die Änderungen verwerfen?",
RELOAD_DIALOG_RELOAD_BUTTON = "Neu laden",
RELOAD_DIALOG_DISCARD_BUTTON = "Verwerfen",
},
ru = { -- provided by TERAB1T
PANEL_NAME = "Дополнения",
VERSION = "Версия: <<X:1>>",
WEBSITE = "Посетить сайт",
PANEL_INFO_FONT = "RuESO/fonts/Univers57.otf|14|soft-shadow-thin",
RELOAD_UI_WARNING = "Для применения этой настройки необходима перезагрузка интерфейса.",
RELOAD_DIALOG_TITLE = "Необходима перезагрузка интерфейса",
RELOAD_DIALOG_TEXT = "Для применения некоторых изменений необходима перезагрузка интерфейса. Перезагрузить интерфейс сейчас или отменить изменения?",
RELOAD_DIALOG_RELOAD_BUTTON = "Перезагрузить",
RELOAD_DIALOG_DISCARD_BUTTON = "Отменить изменения",
},
es = { -- provided by Morganlefai, checked by Kwisatz
PANEL_NAME = "Configuración",
VERSION = "Versión: <<X:1>>",
WEBSITE = "Visita la página web",
RELOAD_UI_WARNING = "Cambiar este ajuste recargará la interfaz del usuario.",
RELOAD_DIALOG_TITLE = "Requiere recargar la interfaz",
RELOAD_DIALOG_TEXT = "Algunos cambios requieren recargar la interfaz para poder aplicarse. Quieres aplicar los cambios y recargar la interfaz?",
RELOAD_DIALOG_RELOAD_BUTTON = "Recargar",
RELOAD_DIALOG_DISCARD_BUTTON = "Cancelar",
},
jp = { -- provided by k0ta0uchi
PANEL_NAME = "アドオン設定",
WEBSITE = "ウェブサイトを見る",
},
zh = { -- provided by bssthu
PANEL_NAME = "插件",
VERSION = "版本: <<X:1>>",
WEBSITE = "访问网站",
PANEL_INFO_FONT = "EsoZh/fonts/univers57.otf|14|soft-shadow-thin",
},
pl = { -- provided by EmiruTegryfon
PANEL_NAME = "Dodatki",
VERSION = "Wersja: <<X:1>>",
WEBSITE = "Odwiedź stronę",
RELOAD_UI_WARNING = "Zmiany będą widoczne po ponownym załadowaniu UI.",
RELOAD_DIALOG_TITLE = "Wymagane przeładowanie UI",
RELOAD_DIALOG_TEXT = "Niektóre zmiany wymagają ponownego załadowania UI. Czy chcesz teraz ponownie załadować, czy porzucić zmiany?",
RELOAD_DIALOG_RELOAD_BUTTON = "Przeładuj",
RELOAD_DIALOG_DISCARD_BUTTON = "Porzuć",
},
kr = { -- provided by p.walker
PANEL_NAME = "蝠盜蠨",
VERSION = "纄訄: <<X:1>>",
WEBSITE = "裹芬襴钸 縩紸",
PANEL_INFO_FONT = "EsoKR/fonts/Univers57.otf|14|soft-shadow-thin",
RELOAD_UI_WARNING = "襴 茤訕襄 绀溽靘籴 風滼筼 訁袩靘瀰褄靴 UI 苈穜滠遨襴 靄袔革瓈瓤.",
RELOAD_DIALOG_TITLE = "UI 苈穜滠遨 靄袔",
RELOAD_DIALOG_TEXT = "绀溽瘜 茤訕 謑 UI 苈穜滠遨襄 靄袔穜靘璔 芬靭襴 覈蒵瓈瓤. 诀瀈 苈穜滠遨靘蓜溠蒵瓈灌? 蝄瓈籴 绀溽襄 迨莌靘蓜溠蒵瓈灌?",
RELOAD_DIALOG_RELOAD_BUTTON = "苈穜滠遨",
RELOAD_DIALOG_DISCARD_BUTTON = "绀溽迨莌",
},
br = { -- provided by mlsevero
PANEL_NAME = "Addons",
AUTHOR = string.format("%s: <<X:1>>", GetString(SI_ADDON_MANAGER_AUTHOR)), -- "Autor: <<X:1>>"
VERSION = "Versão: <<X:1>>",
WEBSITE = "Visite o Website",
RELOAD_UI_WARNING = "Mudanças nessa configuração requer a releitura da UI para ter efeito.",
RELOAD_DIALOG_TITLE = "Releitura da UI requerida",
RELOAD_DIALOG_TEXT = "Algumas mudanças requerem a releitura da UI para ter efeito. Você deseja reler agora ou descartar as mudanças?",
RELOAD_DIALOG_RELOAD_BUTTON = "Relê",
RELOAD_DIALOG_DISCARD_BUTTON = "Descarta",
},
}
util.L = ZO_ShallowTableCopy(localization[GetCVar("Language.2")] or {}, localization["en"])
util.GetTooltipText = GetStringFromValue -- deprecated, use util.GetStringFromValue instead
util.GetStringFromValue = GetStringFromValue
util.GetDefaultValue = GetDefaultValue
util.CreateBaseControl = CreateBaseControl
util.CreateLabelAndContainerControl = CreateLabelAndContainerControl
util.RequestRefreshIfNeeded = RequestRefreshIfNeeded
util.RegisterForRefreshIfNeeded = RegisterForRefreshIfNeeded
util.RegisterForReloadIfNeeded = RegisterForReloadIfNeeded
util.GetTopPanel = GetTopPanel
util.ShowConfirmationDialog = ShowConfirmationDialog
util.UpdateWarning = UpdateWarning
local ADDON_DATA_TYPE = 1
local RESELECTING_DURING_REBUILD = true
@ -122,7 +463,7 @@ local function ScrollDataIntoView(list, data)
local scrollMin, scrollMax = list.scrollbar:GetMinMax()
local scrollTop = list.scrollbar:GetValue()
local controlHeight = list.controlHeight
local controlHeight = list.uniformControlHeight or list.controlHeight
local targetMin = controlHeight * (targetIndex - 1) - 64
-- subtracting 64 ain't arbitrary, it's the maximum fading height
-- (libraries/zo_templates/scrolltemplates.lua/UpdateScrollFade)
@ -175,6 +516,7 @@ local function PopulateAddonList(addonList, filter)
local entryList = ZO_ScrollList_GetDataList(addonList)
local numEntries = 0
local selectedData = nil
local selectionIsFinal = false
ZO_ScrollList_Clear(addonList)
@ -186,9 +528,15 @@ local function PopulateAddonList(addonList, filter)
entryList[numEntries] = dataEntry
-- select the first panel passing the filter, or the currently
-- shown panel, but only if it passes the filter as well
if selectedData == nil or data.panel == lam.currentAddonPanel then
if selectedData == nil or data.panel == lam.pendingAddonPanel or data.panel == lam.currentAddonPanel then
if not selectionIsFinal then
selectedData = data
end
if data.panel == lam.pendingAddonPanel then
lam.pendingAddonPanel = nil
selectionIsFinal = true
end
end
else
data.sortIndex = nil
end
@ -225,6 +573,45 @@ function lam:RegisterWidget(widgetType, widgetVersion)
end
end
-- INTERNAL METHOD: hijacks the handlers for the actions in the OptionsWindow layer if not already done
local function InitKeybindActions()
if not lam.keybindsInitialized then
lam.keybindsInitialized = true
ZO_PreHook(KEYBOARD_OPTIONS, "ApplySettings", function()
if lam.currentPanelOpened then
if not lam.applyButton:IsHidden() then
HandleReloadUIPressed()
end
return true
end
end)
ZO_PreHook("ZO_Dialogs_ShowDialog", function(dialogName)
if lam.currentPanelOpened and dialogName == "OPTIONS_RESET_TO_DEFAULTS" then
if not lam.defaultButton:IsHidden() then
HandleLoadDefaultsPressed()
end
return true
end
end)
end
end
-- INTERNAL METHOD: fires the LAM-PanelOpened callback if not already done
local function OpenCurrentPanel()
if lam.currentAddonPanel and not lam.currentPanelOpened then
lam.currentPanelOpened = true
lam.defaultButton:SetHidden(not lam.currentAddonPanel.data.registerForDefaults)
cm:FireCallbacks("LAM-PanelOpened", lam.currentAddonPanel)
end
end
-- INTERNAL METHOD: fires the LAM-PanelClosed callback if not already done
local function CloseCurrentPanel()
if lam.currentAddonPanel and lam.currentPanelOpened then
lam.currentPanelOpened = false
cm:FireCallbacks("LAM-PanelClosed", lam.currentAddonPanel)
end
end
--METHOD: OPEN TO ADDON PANEL--
--opens to a specific addon's option panel
@ -242,6 +629,7 @@ function lam:OpenToPanel(panel)
if addonData.panel == panel then
selectedData = addonData
ScrollDataIntoView(addonList, selectedData)
lam.pendingAddonPanel = addonData.panel
break
end
end
@ -282,14 +670,50 @@ function lam:OpenToPanel(panel)
end
end
local TwinOptionsContainer_Index = 0
local function TwinOptionsContainer(parent, leftWidget, rightWidget)
TwinOptionsContainer_Index = TwinOptionsContainer_Index + 1
local cParent = parent.scroll or parent
local panel = parent.panel or cParent
local container = wm:CreateControl("$(parent)TwinContainer" .. tostring(TwinOptionsContainer_Index),
cParent, CT_CONTROL)
container:SetResizeToFitDescendents(true)
container:SetAnchor(select(2, leftWidget:GetAnchor(0) ))
leftWidget:ClearAnchors()
leftWidget:SetAnchor(TOPLEFT, container, TOPLEFT)
rightWidget:SetAnchor(TOPLEFT, leftWidget, TOPRIGHT, 5, 0)
leftWidget:SetWidth( leftWidget:GetWidth() - 2.5 ) -- fixes bad alignment with 'full' controls
rightWidget:SetWidth( rightWidget:GetWidth() - 2.5 )
leftWidget:SetParent(container)
rightWidget:SetParent(container)
container.data = {type = "container"}
container.panel = panel
return container
end
--INTERNAL FUNCTION
--creates controls when options panel is first shown
--controls anchoring of these controls in the panel
local function CreateOptionsControls(panel)
local addonID = panel:GetName()
local optionsTable = addonToOptionsMap[addonID]
if(optionsState[addonID] == OPTIONS_CREATED) then
return false
elseif(optionsState[addonID] == OPTIONS_CREATION_RUNNING) then
return true
end
optionsState[addonID] = OPTIONS_CREATION_RUNNING
local function CreationFinished()
optionsState[addonID] = OPTIONS_CREATED
cm:FireCallbacks("LAM-PanelControlsCreated", panel)
OpenCurrentPanel()
end
local optionsTable = addonToOptionsMap[addonID]
if optionsTable then
local function CreateAndAnchorWidget(parent, widgetData, offsetX, offsetY, anchorTarget, wasHalf)
local widget
@ -302,12 +726,12 @@ local function CreateOptionsControls(panel)
widget:SetAnchor(TOPLEFT)
anchorTarget = widget
elseif wasHalf and isHalf then -- when the previous widget was only half width and this one is too, we place it on the right side
widget:SetAnchor(TOPLEFT, anchorTarget, TOPRIGHT, 5 + (offsetX or 0), 0)
widget.lineControl = anchorTarget
offsetY = zo_max(0, widget:GetHeight() - anchorTarget:GetHeight()) -- we need to get the common height of both widgets to know where the next row starts
isHalf = false
offsetY = 0
anchorTarget = TwinOptionsContainer(parent, anchorTarget, widget)
else -- otherwise we just put it below the previous one normally
widget:SetAnchor(TOPLEFT, anchorTarget, BOTTOMLEFT, 0, 15 + offsetY)
widget:SetAnchor(TOPLEFT, anchorTarget, BOTTOMLEFT, 0, 15)
offsetY = 0
anchorTarget = widget
end
@ -351,12 +775,12 @@ local function CreateOptionsControls(panel)
err, anchorOffset, lastAddedControl, wasHalf = CreateAndAnchorWidget(parent, widgetData, offsetX, anchorOffset, lastAddedControl, wasHalf)
if err then
PrintLater(("Could not create %s '%s' of %s."):format(widgetData.type, widgetData.name or "unnamed", addonID))
PrintLater(("Could not create %s '%s' of %s."):format(widgetData.type, GetStringFromValue(widgetData.name or "unnamed"), addonID))
end
if isSubmenu then
if SetupCreationCalls(lastAddedControl, widgetData.controls) then
PrintLater(("The sub menu '%s' of %s is missing some entries."):format(widgetData.name or "unnamed", addonID))
PrintLater(("The sub menu '%s' of %s is missing some entries."):format(GetStringFromValue(widgetData.name or "unnamed"), addonID))
end
end
end
@ -373,8 +797,7 @@ local function CreateOptionsControls(panel)
zo_callLater(DoCreateSettings, THROTTLE_TIMEOUT)
end
else
optionsCreated[addonID] = true
cm:FireCallbacks("LAM-PanelControlsCreated", panel)
CreationFinished()
end
end
@ -382,9 +805,12 @@ local function CreateOptionsControls(panel)
PrintLater(("The settings menu of %s is missing some entries."):format(addonID))
end
DoCreateSettings()
else
CreationFinished()
end
end
return true
end
--INTERNAL FUNCTION
--handles switching between panels
@ -392,14 +818,15 @@ local function ToggleAddonPanels(panel) --called in OnShow of newly shown panel
local currentlySelected = lam.currentAddonPanel
if currentlySelected and currentlySelected ~= panel then
currentlySelected:SetHidden(true)
CloseCurrentPanel()
end
lam.currentAddonPanel = panel
-- refresh visible rows to reflect panel IsHidden status
ZO_ScrollList_RefreshVisible(lam.addonList)
if not optionsCreated[panel:GetName()] then --if this is the first time opening this panel, create these options
CreateOptionsControls(panel)
if not CreateOptionsControls(panel) then
OpenCurrentPanel()
end
cm:FireCallbacks("LAM-RefreshPanel", panel)
@ -460,24 +887,12 @@ function lam:RegisterOptionControls(addonID, optionsTable) --optionsTable = {sli
addonToOptionsMap[addonID] = optionsTable
end
--INTERNAL FUNCTION
--creates LAM's Addon Settings entry in ZO_GameMenu
local function CreateAddonSettingsMenuEntry()
--Russian for TERAB1T's RuESO addon, which creates an "ru" locale
--game font does not support Cyrillic, so they are using custom fonts + extended latin charset
--Spanish provided by Luisen75 for their translation project
local controlPanelNames = {
en = "Addon Settings",
fr = "Extensions",
de = "Erweiterungen",
ru = "Îacòpoéêè äoïoìîeîèé",
es = "Configura Addons",
}
local panelData = {
id = KEYBOARD_OPTIONS.currentPanelId,
name = controlPanelNames[GetCVar("Language.2")] or controlPanelNames["en"],
name = util.L["PANEL_NAME"],
}
KEYBOARD_OPTIONS.currentPanelId = panelData.id + 1
@ -753,6 +1168,17 @@ local function CreateAddonSettingsWindow()
panelContainer:SetAnchor(TOPLEFT, nil, TOPLEFT, 365, 120)
panelContainer:SetDimensions(645, 675)
local defaultButton = wm:CreateControlFromVirtual("$(parent)ResetToDefaultButton", tlw, "ZO_DialogButton")
ZO_KeybindButtonTemplate_Setup(defaultButton, "OPTIONS_LOAD_DEFAULTS", HandleLoadDefaultsPressed, GetString(SI_OPTIONS_DEFAULTS))
defaultButton:SetAnchor(TOPLEFT, panelContainer, BOTTOMLEFT, 0, 2)
lam.defaultButton = defaultButton
local applyButton = wm:CreateControlFromVirtual("$(parent)ApplyButton", tlw, "ZO_DialogButton")
ZO_KeybindButtonTemplate_Setup(applyButton, "OPTIONS_APPLY_CHANGES", HandleReloadUIPressed, GetString(SI_ADDON_MANAGER_RELOAD))
applyButton:SetAnchor(TOPRIGHT, panelContainer, BOTTOMRIGHT, 0, 2)
applyButton:SetHidden(true)
lam.applyButton = applyButton
return tlw
end
@ -769,9 +1195,14 @@ local function OnLoad(_, addonName)
end
em:RegisterForEvent(eventHandle, EVENT_ADD_ON_LOADED, OnLoad)
local function OnActivated(_, addonName)
local function OnActivated(_, initial)
em:UnregisterForEvent(eventHandle, EVENT_PLAYER_ACTIVATED)
FlushMessages()
local reopenPanel = RetrievePanelForReopening()
if not initial and reopenPanel then
lam:OpenToPanel(reopenPanel)
end
end
em:RegisterForEvent(eventHandle, EVENT_PLAYER_ACTIVATED, OnActivated)
@ -800,10 +1231,18 @@ function lam:GetAddonSettingsFragment()
if not LAMAddonSettingsFragment then
local window = CreateAddonSettingsWindow()
LAMAddonSettingsFragment = ZO_FadeSceneFragment:New(window, true, 100)
LAMAddonSettingsFragment:RegisterCallback("StateChange", function(oldState, newState)
if(newState == SCENE_FRAGMENT_SHOWN) then
InitKeybindActions()
PushActionLayerByName("OptionsWindow")
OpenCurrentPanel()
elseif(newState == SCENE_FRAGMENT_HIDDEN) then
CloseCurrentPanel()
RemoveActionLayerByName("OptionsWindow")
ShowReloadDialogIfNeeded()
end
end)
CreateAddonSettingsMenuEntry()
end
return LAMAddonSettingsFragment
end
-- vi: noexpandtab

查看文件

@ -1,36 +1,30 @@
--[[buttonData = {
type = "button",
name = "My Button",
tooltip = "Button's tooltip text.",
name = "My Button", -- string id or function returning a string
func = function() end,
tooltip = "Button's tooltip text.", -- string id or function returning a string (optional)
width = "full", --or "half" (optional)
disabled = function() return db.someBooleanSetting end, --or boolean (optional)
icon = "icon\\path.dds", --(optional)
isDangerous = false, -- boolean, if set to true, the button text will be red and a confirmation dialog with the button label and warning text will show on click before the callback is executed (optional)
warning = "Will need to reload the UI.", --(optional)
reference = "MyAddonButton" --(optional) unique global reference to control
reference = "MyAddonButton", -- unique global reference to control (optional)
} ]]
local widgetVersion = 7
local widgetVersion = 11
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("button", widgetVersion) then return end
local wm = WINDOW_MANAGER
local cm = CALLBACK_MANAGER
local tinsert = table.insert
local function UpdateDisabled(control)
local disable
if type(control.data.disabled) == "function" then
disable = control.data.disabled()
else
disable = control.data.disabled
local disable = control.data.disabled
if type(disable) == "function" then
disable = disable()
end
control.button:SetEnabled(not disable)
end
--controlName is optional
local MIN_HEIGHT = 28 -- default_button height
local HALF_WIDTH_LINE_SPACING = 2
@ -54,36 +48,44 @@ function LAMCreateControl.button(parent, buttonData, controlName)
--control.button = wm:CreateControlFromVirtual(controlName.."Button", control, "ZO_DefaultButton")
control.button = wm:CreateControlFromVirtual(nil, control, "ZO_DefaultButton")
control.button:SetWidth(width / 3)
control.button:SetText(buttonData.name)
control.button:SetText(LAM.util.GetStringFromValue(buttonData.name))
if buttonData.isDangerous then control.button:SetNormalFontColor(ZO_ERROR_COLOR:UnpackRGBA()) end
end
local button = control.button
button:SetAnchor(control.isHalfWidth and CENTER or RIGHT)
button:SetClickSound("Click")
button.data = {tooltipText = LAM.util.GetTooltipText(buttonData.tooltip)}
button.data = {tooltipText = LAM.util.GetStringFromValue(buttonData.tooltip)}
button:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
button:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
button:SetHandler("OnClicked", function(self, ...)
buttonData.func(self, ...)
if control.panel.data.registerForRefresh then
cm:FireCallbacks("LAM-RefreshPanel", control)
button:SetHandler("OnClicked", function(...)
local args = {...}
local function callback()
buttonData.func(unpack(args))
LAM.util.RequestRefreshIfNeeded(control)
end
if(buttonData.isDangerous) then
local title = LAM.util.GetStringFromValue(buttonData.name)
local body = LAM.util.GetStringFromValue(buttonData.warning)
LAM.util.ShowConfirmationDialog(title, body, callback)
else
callback()
end
end)
if buttonData.warning then
if buttonData.warning ~= nil then
control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
control.warning:SetAnchor(RIGHT, button, LEFT, -5, 0)
control.warning.data = {tooltipText = buttonData.warning}
control.UpdateWarning = LAM.util.UpdateWarning
control:UpdateWarning()
end
if buttonData.disabled then
if buttonData.disabled ~= nil then
control.UpdateDisabled = UpdateDisabled
control:UpdateDisabled()
end
--this is here because buttons don't have an UpdateValue method
if control.panel.data.registerForRefresh then --if our parent window wants to refresh controls, then add this to the list
tinsert(control.panel.controlsToRefresh, control)
end
end
LAM.util.RegisterForRefreshIfNeeded(control)
return control
end

查看文件

@ -1,24 +1,24 @@
--[[checkboxData = {
type = "checkbox",
name = "My Checkbox",
tooltip = "Checkbox's tooltip text.",
name = "My Checkbox", -- or string id or function returning a string
getFunc = function() return db.var end,
setFunc = function(value) db.var = value doStuff() end,
width = "full", --or "half" (optional)
tooltip = "Checkbox's tooltip text.", -- or string id or function returning a string (optional)
width = "full", -- or "half" (optional)
disabled = function() return db.someBooleanSetting end, --or boolean (optional)
warning = "Will need to reload the UI.", --(optional)
default = defaults.var, --(optional)
reference = "MyAddonCheckbox" --(optional) unique global reference to control
warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
default = defaults.var, -- a boolean or function that returns a boolean (optional)
reference = "MyAddonCheckbox", -- unique global reference to control (optional)
} ]]
local widgetVersion = 9
local widgetVersion = 14
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("checkbox", widgetVersion) then return end
local wm = WINDOW_MANAGER
local cm = CALLBACK_MANAGER
local tinsert = table.insert
--label
local enabledColor = ZO_DEFAULT_ENABLED_COLOR
local enabledHLcolor = ZO_HIGHLIGHT_TEXT
@ -57,14 +57,12 @@ end
local function UpdateValue(control, forceDefault, value)
if forceDefault then --if we are forcing defaults
value = control.data.default
value = LAM.util.GetDefaultValue(control.data.default)
control.data.setFunc(value)
elseif value ~= nil then --our value could be false
control.data.setFunc(value)
--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
if control.panel.data.registerForRefresh then
cm:FireCallbacks("LAM-RefreshPanel", control)
end
LAM.util.RequestRefreshIfNeeded(control)
else
value = control.data.getFunc()
end
@ -121,24 +119,24 @@ function LAMCreateControl.checkbox(parent, checkboxData, controlName)
control.checkedText = GetString(SI_CHECK_BUTTON_ON):upper()
control.uncheckedText = GetString(SI_CHECK_BUTTON_OFF):upper()
if checkboxData.warning then
if checkboxData.warning ~= nil or checkboxData.requiresReload then
control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
control.warning:SetAnchor(RIGHT, checkbox, LEFT, -5, 0)
control.warning.data = {tooltipText = checkboxData.warning}
control.UpdateWarning = LAM.util.UpdateWarning
control:UpdateWarning()
end
control.data.tooltipText = LAM.util.GetTooltipText(checkboxData.tooltip)
control.data.tooltipText = LAM.util.GetStringFromValue(checkboxData.tooltip)
if checkboxData.disabled then
control.UpdateValue = UpdateValue
control:UpdateValue()
if checkboxData.disabled ~= nil then
control.UpdateDisabled = UpdateDisabled
control:UpdateDisabled()
end
control.UpdateValue = UpdateValue
control:UpdateValue()
if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then --if our parent window wants to refresh controls, then add this to the list
tinsert(control.panel.controlsToRefresh, control)
end
LAM.util.RegisterForRefreshIfNeeded(control)
LAM.util.RegisterForReloadIfNeeded(control)
return control
end

查看文件

@ -1,25 +1,23 @@
--[[colorpickerData = {
type = "colorpicker",
name = "My Color Picker",
tooltip = "Color Picker's tooltip text.",
name = "My Color Picker", -- or string id or function returning a string
getFunc = function() return db.r, db.g, db.b, db.a end, --(alpha is optional)
setFunc = function(r,g,b,a) db.r=r, db.g=g, db.b=b, db.a=a end, --(alpha is optional)
tooltip = "Color Picker's tooltip text.", -- or string id or function returning a string (optional)
width = "full", --or "half" (optional)
disabled = function() return db.someBooleanSetting end, --or boolean (optional)
warning = "Will need to reload the UI.", --(optional)
default = {r = defaults.r, g = defaults.g, b = defaults.b, a = defaults.a}, --(optional) table of default color values (or default = defaultColor, where defaultColor is a table with keys of r, g, b[, a])
reference = "MyAddonColorpicker" --(optional) unique global reference to control
warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
default = {r = defaults.r, g = defaults.g, b = defaults.b, a = defaults.a}, --(optional) table of default color values (or default = defaultColor, where defaultColor is a table with keys of r, g, b[, a]) or a function that returns the color
reference = "MyAddonColorpicker" -- unique global reference to control (optional)
} ]]
local widgetVersion = 7
local widgetVersion = 13
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("colorpicker", widgetVersion) then return end
local wm = WINDOW_MANAGER
local cm = CALLBACK_MANAGER
local tinsert = table.insert
local function UpdateDisabled(control)
local disable
@ -40,15 +38,13 @@ end
local function UpdateValue(control, forceDefault, valueR, valueG, valueB, valueA)
if forceDefault then --if we are forcing defaults
local color = control.data.default
local color = LAM.util.GetDefaultValue(control.data.default)
valueR, valueG, valueB, valueA = color.r, color.g, color.b, color.a
control.data.setFunc(valueR, valueG, valueB, valueA)
elseif valueR and valueG and valueB then
control.data.setFunc(valueR, valueG, valueB, valueA or 1)
--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
if control.panel.data.registerForRefresh then
cm:FireCallbacks("LAM-RefreshPanel", control)
end
LAM.util.RequestRefreshIfNeeded(control)
else
valueR, valueG, valueB, valueA = control.data.getFunc()
end
@ -83,28 +79,28 @@ function LAMCreateControl.colorpicker(parent, colorpickerData, controlName)
if upInside then
local r, g, b, a = colorpickerData.getFunc()
COLOR_PICKER:Show(ColorPickerCallback, r, g, b, a, colorpickerData.name)
COLOR_PICKER:Show(ColorPickerCallback, r, g, b, a, LAM.util.GetStringFromValue(colorpickerData.name))
end
end)
if colorpickerData.warning then
if colorpickerData.warning ~= nil or colorpickerData.requiresReload then
control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
control.warning:SetAnchor(RIGHT, control.color, LEFT, -5, 0)
control.warning.data = {tooltipText = colorpickerData.warning}
control.UpdateWarning = LAM.util.UpdateWarning
control:UpdateWarning()
end
control.data.tooltipText = LAM.util.GetTooltipText(colorpickerData.tooltip)
control.data.tooltipText = LAM.util.GetStringFromValue(colorpickerData.tooltip)
if colorpickerData.disabled then
control.UpdateValue = UpdateValue
control:UpdateValue()
if colorpickerData.disabled ~= nil then
control.UpdateDisabled = UpdateDisabled
control:UpdateDisabled()
end
control.UpdateValue = UpdateValue
control:UpdateValue()
if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then --if our parent window wants to refresh controls, then add this to the list
tinsert(control.panel.controlsToRefresh, control)
end
LAM.util.RegisterForRefreshIfNeeded(control)
LAM.util.RegisterForReloadIfNeeded(control)
return control
end

查看文件

@ -5,13 +5,10 @@
width = "full", --or "half" (optional)
} ]]
local widgetVersion = 6
local widgetVersion = 7
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("custom", widgetVersion) then return end
local wm = WINDOW_MANAGER
local tinsert = table.insert
local function UpdateValue(control)
if control.data.refreshFunc then
control.data.refreshFunc(control)
@ -32,9 +29,7 @@ function LAMCreateControl.custom(parent, customData, controlName)
control.UpdateValue = UpdateValue
if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then --if our parent window wants to refresh controls, then add this to the list
tinsert(control.panel.controlsToRefresh, control)
end
LAM.util.RegisterForRefreshIfNeeded(control)
return control
end

查看文件

@ -1,27 +1,25 @@
--[[descriptionData = {
type = "description",
title = "My Title", --(optional)
text = "My description text to display.",
text = "My description text to display.", -- or string id or function returning a string
title = "My Title", -- or string id or function returning a string (optional)
width = "full", --or "half" (optional)
reference = "MyAddonDescription" --(optional) unique global reference to control
reference = "MyAddonDescription" -- unique global reference to control (optional)
} ]]
local widgetVersion = 6
local widgetVersion = 8
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("description", widgetVersion) then return end
local wm = WINDOW_MANAGER
local tinsert = table.insert
local function UpdateValue(control)
if control.title then
control.title:SetText(control.data.title)
control.title:SetText(LAM.util.GetStringFromValue(control.data.title))
end
control.desc:SetText(control.data.text)
control.desc:SetText(LAM.util.GetStringFromValue(control.data.text))
end
local MIN_HEIGHT = 26
function LAMCreateControl.description(parent, descriptionData, controlName)
local control = LAM.util.CreateBaseControl(parent, descriptionData, controlName)
local isHalfWidth = control.isHalfWidth
@ -29,16 +27,16 @@ function LAMCreateControl.description(parent, descriptionData, controlName)
control:SetResizeToFitDescendents(true)
if isHalfWidth then
control:SetDimensionConstraints(width / 2, MIN_HEIGHT, width / 2, MIN_HEIGHT * 4)
control:SetDimensionConstraints(width / 2, 0, width / 2, 0)
else
control:SetDimensionConstraints(width, MIN_HEIGHT, width, MIN_HEIGHT * 4)
control:SetDimensionConstraints(width, 0, width, 0)
end
control.desc = wm:CreateControl(nil, control, CT_LABEL)
local desc = control.desc
desc:SetVerticalAlignment(TEXT_ALIGN_TOP)
desc:SetFont("ZoFontGame")
desc:SetText(descriptionData.text)
desc:SetText(LAM.util.GetStringFromValue(descriptionData.text))
desc:SetWidth(isHalfWidth and width / 2 or width)
if descriptionData.title then
@ -47,7 +45,7 @@ function LAMCreateControl.description(parent, descriptionData, controlName)
title:SetWidth(isHalfWidth and width / 2 or width)
title:SetAnchor(TOPLEFT, control, TOPLEFT)
title:SetFont("ZoFontWinH4")
title:SetText(descriptionData.title)
title:SetText(LAM.util.GetStringFromValue(descriptionData.title))
desc:SetAnchor(TOPLEFT, title, BOTTOMLEFT)
else
desc:SetAnchor(TOPLEFT)
@ -55,9 +53,7 @@ function LAMCreateControl.description(parent, descriptionData, controlName)
control.UpdateValue = UpdateValue
if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then --if our parent window wants to refresh controls, then add this to the list
tinsert(control.panel.controlsToRefresh, control)
end
LAM.util.RegisterForRefreshIfNeeded(control)
return control

查看文件

@ -0,0 +1,45 @@
--[[dividerData = {
type = "divider",
width = "full", --or "half" (optional)
height = 10, (optional)
alpha = 0.25, (optional)
reference = "MyAddonDivider" -- unique global reference to control (optional)
} ]]
local widgetVersion = 2
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("divider", widgetVersion) then return end
local wm = WINDOW_MANAGER
local MIN_HEIGHT = 10
local MAX_HEIGHT = 50
local MIN_ALPHA = 0
local MAX_ALPHA = 1
local DEFAULT_ALPHA = 0.25
local function GetValueInRange(value, min, max, default)
if not value or type(value) ~= "number" then
return default
end
return math.min(math.max(min, value), max)
end
function LAMCreateControl.divider(parent, dividerData, controlName)
local control = LAM.util.CreateBaseControl(parent, dividerData, controlName)
local isHalfWidth = control.isHalfWidth
local width = control:GetWidth()
local height = GetValueInRange(dividerData.height, MIN_HEIGHT, MAX_HEIGHT, MIN_HEIGHT)
local alpha = GetValueInRange(dividerData.alpha, MIN_ALPHA, MAX_ALPHA, DEFAULT_ALPHA)
control:SetDimensions(isHalfWidth and width / 2 or width, height)
control.divider = wm:CreateControlFromVirtual(nil, control, "ZO_Options_Divider")
local divider = control.divider
divider:SetWidth(isHalfWidth and width / 2 or width)
divider:SetAnchor(TOPLEFT)
divider:SetAlpha(alpha)
return control
end

查看文件

@ -1,27 +1,40 @@
--[[dropdownData = {
type = "dropdown",
name = "My Dropdown",
tooltip = "Dropdown's tooltip text.",
name = "My Dropdown", -- or string id or function returning a string
choices = {"table", "of", "choices"},
sort = "name-up", --or "name-down", "numeric-up", "numeric-down" (optional) - if not provided, list will not be sorted
choicesValues = {"foo", 2, "three"}, -- if specified, these values will get passed to setFunc instead (optional)
getFunc = function() return db.var end,
setFunc = function(var) db.var = var doStuff() end,
tooltip = "Dropdown's tooltip text.", -- or string id or function returning a string (optional)
choicesTooltips = {"tooltip 1", "tooltip 2", "tooltip 3"}, -- or array of string ids or array of functions returning a string (optional)
sort = "name-up", --or "name-down", "numeric-up", "numeric-down", "value-up", "value-down", "numericvalue-up", "numericvalue-down" (optional) - if not provided, list will not be sorted
width = "full", --or "half" (optional)
scrollable = true, -- boolean or number, if set the dropdown will feature a scroll bar if there are a large amount of choices and limit the visible lines to the specified number or 10 if true is used (optional)
disabled = function() return db.someBooleanSetting end, --or boolean (optional)
warning = "Will need to reload the UI.", --(optional)
default = defaults.var, --(optional)
reference = "MyAddonDropdown" --(optional) unique global reference to control
warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
default = defaults.var, -- default value or function that returns the default value (optional)
reference = "MyAddonDropdown" -- unique global reference to control (optional)
} ]]
local widgetVersion = 9
local widgetVersion = 18
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("dropdown", widgetVersion) then return end
local wm = WINDOW_MANAGER
local cm = CALLBACK_MANAGER
local tinsert = table.insert
local SORT_BY_VALUE = { ["value"] = {} }
local SORT_BY_VALUE_NUMERIC = { ["value"] = { isNumeric = true } }
local SORT_TYPES = {
name = ZO_SORT_BY_NAME,
numeric = ZO_SORT_BY_NAME_NUMERIC,
value = SORT_BY_VALUE,
numericvalue = SORT_BY_VALUE_NUMERIC,
}
local SORT_ORDERS = {
up = ZO_SORT_ORDER_UP,
down = ZO_SORT_ORDER_DOWN,
}
local function UpdateDisabled(control)
local disable
@ -41,33 +54,93 @@ end
local function UpdateValue(control, forceDefault, value)
if forceDefault then --if we are forcing defaults
value = control.data.default
value = LAM.util.GetDefaultValue(control.data.default)
control.data.setFunc(value)
control.dropdown:SetSelectedItem(value)
control.dropdown:SetSelectedItem(control.choices[value])
elseif value then
control.data.setFunc(value)
--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
if control.panel.data.registerForRefresh then
cm:FireCallbacks("LAM-RefreshPanel", control)
end
LAM.util.RequestRefreshIfNeeded(control)
else
value = control.data.getFunc()
control.dropdown:SetSelectedItem(value)
control.dropdown:SetSelectedItem(control.choices[value])
end
end
local function DropdownCallback(control, choiceText, choice)
choice.control:UpdateValue(false, choiceText)
choice.control:UpdateValue(false, choice.value or choiceText)
end
local function UpdateChoices(control, choices)
local function SetupTooltips(comboBox, choicesTooltips)
local function ShowTooltip(control)
InitializeTooltip(InformationTooltip, control, TOPLEFT, 0, 0, BOTTOMRIGHT)
SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(control.tooltip))
InformationTooltipTopLevel:BringWindowToTop()
end
local function HideTooltip(control)
ClearTooltip(InformationTooltip)
end
-- allow for tooltips on the drop down entries
local originalShow = comboBox.ShowDropdownInternal
comboBox.ShowDropdownInternal = function(comboBox)
originalShow(comboBox)
local entries = ZO_Menu.items
for i = 1, #entries do
local entry = entries[i]
local control = entries[i].item
control.tooltip = choicesTooltips[i]
entry.onMouseEnter = control:GetHandler("OnMouseEnter")
entry.onMouseExit = control:GetHandler("OnMouseExit")
ZO_PreHookHandler(control, "OnMouseEnter", ShowTooltip)
ZO_PreHookHandler(control, "OnMouseExit", HideTooltip)
end
end
local originalHide = comboBox.HideDropdownInternal
comboBox.HideDropdownInternal = function(self)
local entries = ZO_Menu.items
for i = 1, #entries do
local entry = entries[i]
local control = entries[i].item
control:SetHandler("OnMouseEnter", entry.onMouseEnter)
control:SetHandler("OnMouseExit", entry.onMouseExit)
control.tooltip = nil
end
originalHide(self)
end
end
local function UpdateChoices(control, choices, choicesValues, choicesTooltips)
control.dropdown:ClearItems() --remove previous choices --(need to call :SetSelectedItem()?)
ZO_ClearTable(control.choices)
--build new list of choices
local choices = choices or control.data.choices
local choicesValues = choicesValues or control.data.choicesValues
local choicesTooltips = choicesTooltips or control.data.choicesTooltips
if choicesValues then
assert(#choices == #choicesValues, "choices and choicesValues need to have the same size")
end
if choicesTooltips then
assert(#choices == #choicesTooltips, "choices and choicesTooltips need to have the same size")
if not control.scrollHelper then -- only do this for non-scrollable
SetupTooltips(control.dropdown, choicesTooltips)
end
end
for i = 1, #choices do
local entry = control.dropdown:CreateItemEntry(choices[i], DropdownCallback)
entry.control = control
if choicesValues then
entry.value = choicesValues[i]
end
if choicesTooltips and control.scrollHelper then
entry.tooltip = choicesTooltips[i]
end
control.choices[entry.value or entry.name] = entry.name
control.dropdown:AddItem(entry, not control.data.sort and ZO_COMBOBOX_SUPRESS_UPDATE) --if sort type/order isn't specified, then don't sort
end
end
@ -82,8 +155,174 @@ local function GrabSortingInfo(sortInfo)
return t
end
local DEFAULT_VISIBLE_ROWS = 10
local SCROLLABLE_ENTRY_TEMPLATE_HEIGHT = 25 -- same as in zo_combobox.lua
local CONTENT_PADDING = 24
local SCROLLBAR_PADDING = 16
local PADDING = GetMenuPadding() / 2 -- half the amount looks closer to the regular dropdown
local ROUNDING_MARGIN = 0.01 -- needed to avoid rare issue with too many anchors processed
local ScrollableDropdownHelper = ZO_Object:Subclass()
function ScrollableDropdownHelper:New(...)
local object = ZO_Object.New(self)
object:Initialize(...)
return object
end
function ScrollableDropdownHelper:Initialize(parent, control, visibleRows)
local combobox = control.combobox
local dropdown = control.dropdown
self.parent = parent
self.control = control
self.combobox = combobox
self.dropdown = dropdown
self.visibleRows = visibleRows
-- clear anchors so we can adjust the width dynamically
dropdown.m_dropdown:ClearAnchors()
dropdown.m_dropdown:SetAnchor(TOPLEFT, combobox, BOTTOMLEFT)
-- handle dropdown or settingsmenu opening/closing
local function onShow() self:OnShow() end
local function onHide() self:OnHide() end
local function doHide() self:DoHide() end
ZO_PreHook(dropdown, "ShowDropdownOnMouseUp", onShow)
ZO_PreHook(dropdown, "HideDropdownInternal", onHide)
combobox:SetHandler("OnEffectivelyHidden", onHide)
parent:SetHandler("OnEffectivelyHidden", doHide)
-- dont fade entries near the edges
local scrollList = dropdown.m_scroll
scrollList.selectionTemplate = nil
scrollList.highlightTemplate = nil
ZO_ScrollList_EnableSelection(scrollList, "ZO_SelectionHighlight")
ZO_ScrollList_EnableHighlight(scrollList, "ZO_SelectionHighlight")
ZO_Scroll_SetUseFadeGradient(scrollList, false)
-- adjust scroll content anchor to mimic menu padding
local scroll = dropdown.m_dropdown:GetNamedChild("Scroll")
local anchor1 = {scroll:GetAnchor(0)}
local anchor2 = {scroll:GetAnchor(1)}
scroll:ClearAnchors()
scroll:SetAnchor(anchor1[2], anchor1[3], anchor1[4], anchor1[5] + PADDING, anchor1[6] + PADDING)
scroll:SetAnchor(anchor2[2], anchor2[3], anchor2[4], anchor2[5] - PADDING, anchor2[6] - PADDING)
ZO_ScrollList_Commit(scrollList)
-- hook mouse enter/exit
local function onMouseEnter(control) self:OnMouseEnter(control) end
local function onMouseExit(control) self:OnMouseExit(control) end
-- adjust row setup to mimic the highlight padding
local dataType1 = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 1)
local dataType2 = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 2)
local oSetup = dataType1.setupCallback -- both types have the same setup function
local function SetupEntry(control, data, list)
oSetup(control, data, list)
control.m_label:SetAnchor(LEFT, nil, nil, 2)
-- no need to store old ones since we have full ownership of our dropdown controls
if not control.hookedMouseHandlers then --only do it once per control
control.hookedMouseHandlers = true
ZO_PreHookHandler(control, "OnMouseEnter", onMouseEnter)
ZO_PreHookHandler(control, "OnMouseExit", onMouseExit)
-- we could also just replace the handlers
--control:SetHandler("OnMouseEnter", onMouseEnter)
--control:SetHandler("OnMouseExit", onMouseExit)
end
end
dataType1.setupCallback = SetupEntry
dataType2.setupCallback = SetupEntry
-- adjust dimensions based on entries
local scrollContent = scroll:GetNamedChild("Contents")
ZO_PreHook(dropdown, "AddMenuItems", function()
local width = PADDING * 2 + zo_max(self:GetMaxWidth(), combobox:GetWidth())
local numItems = #dropdown.m_sortedItems
local anchorOffset = 0
if(numItems > self.visibleRows) then
width = width + CONTENT_PADDING + SCROLLBAR_PADDING
anchorOffset = -SCROLLBAR_PADDING
numItems = self.visibleRows
end
scrollContent:SetAnchor(BOTTOMRIGHT, nil, nil, anchorOffset)
local height = PADDING * 2 + numItems * (SCROLLABLE_ENTRY_TEMPLATE_HEIGHT + dropdown.m_spacing) - dropdown.m_spacing + ROUNDING_MARGIN
dropdown.m_dropdown:SetWidth(width)
dropdown.m_dropdown:SetHeight(height)
end)
end
function ScrollableDropdownHelper:OnShow()
local dropdown = self.dropdown
if dropdown.m_lastParent ~= ZO_Menus then
dropdown.m_lastParent = dropdown.m_dropdown:GetParent()
dropdown.m_dropdown:SetParent(ZO_Menus)
ZO_Menus:BringWindowToTop()
end
end
function ScrollableDropdownHelper:OnHide()
local dropdown = self.dropdown
if dropdown.m_lastParent then
dropdown.m_dropdown:SetParent(dropdown.m_lastParent)
dropdown.m_lastParent = nil
end
end
function ScrollableDropdownHelper:DoHide()
local dropdown = self.dropdown
if dropdown:IsDropdownVisible() then
dropdown:HideDropdown()
end
end
function ScrollableDropdownHelper:GetMaxWidth()
local dropdown = self.dropdown
local dataType = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 1)
local dummy = dataType.pool:AcquireObject()
dataType.setupCallback(dummy, {
m_owner = dropdown,
name = "Dummy"
}, dropdown)
local maxWidth = 0
local label = dummy.m_label
local entries = dropdown.m_sortedItems
local numItems = #entries
for index = 1, numItems do
label:SetText(entries[index].name)
local width = label:GetTextWidth()
if (width > maxWidth) then
maxWidth = width
end
end
dataType.pool:ReleaseObject(dummy.key)
return maxWidth
end
function ScrollableDropdownHelper:OnMouseEnter(control)
-- call original code if we replace instead of hook the handler
--ZO_ScrollableComboBox_Entry_OnMouseEnter(control)
-- show tooltip
if control.m_data.tooltip then
InitializeTooltip(InformationTooltip, control, TOPLEFT, 0, 0, BOTTOMRIGHT)
SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(control.m_data.tooltip))
InformationTooltipTopLevel:BringWindowToTop()
end
end
function ScrollableDropdownHelper:OnMouseExit(control)
-- call original code if we replace instead of hook the handler
--ZO_ScrollableComboBox_Entry_OnMouseExit(control)
-- hide tooltip
if control.m_data.tooltip then
ClearTooltip(InformationTooltip)
end
end
function LAMCreateControl.dropdown(parent, dropdownData, controlName)
local control = LAM.util.CreateLabelAndContainerControl(parent, dropdownData, controlName)
control.choices = {}
local countControl = parent
local name = parent:GetName()
@ -93,7 +332,7 @@ function LAMCreateControl.dropdown(parent, dropdownData, controlName)
end
local comboboxCount = (countControl.comboboxCount or 0) + 1
countControl.comboboxCount = comboboxCount
control.combobox = wm:CreateControlFromVirtual(zo_strjoin(nil, name, "Combobox", comboboxCount), control.container, "ZO_ComboBox")
control.combobox = wm:CreateControlFromVirtual(zo_strjoin(nil, name, "Combobox", comboboxCount), control.container, dropdownData.scrollable and "ZO_ScrollableComboBox" or "ZO_ComboBox")
local combobox = control.combobox
combobox:SetAnchor(TOPLEFT)
@ -102,30 +341,47 @@ function LAMCreateControl.dropdown(parent, dropdownData, controlName)
combobox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
control.dropdown = ZO_ComboBox_ObjectFromContainer(combobox)
local dropdown = control.dropdown
dropdown:SetSortsItems(false) -- need to sort ourselves in order to be able to sort by value
if dropdownData.scrollable then
local visibleRows = type(dropdownData.scrollable) == "number" and dropdownData.scrollable or DEFAULT_VISIBLE_ROWS
control.scrollHelper = ScrollableDropdownHelper:New(parent, control, visibleRows)
end
ZO_PreHook(dropdown, "UpdateItems", function(self)
assert(not self.m_sortsItems, "built-in dropdown sorting was reactivated, sorting is handled by LAM")
if control.m_sortOrder ~= nil and control.m_sortType then
local sortKey = next(control.m_sortType)
local sortFunc = function(item1, item2) return ZO_TableOrderingFunction(item1, item2, sortKey, control.m_sortType, control.m_sortOrder) end
table.sort(self.m_sortedItems, sortFunc)
end
end)
if dropdownData.sort then
local sortInfo = GrabSortingInfo(dropdownData.sort)
local sortType, sortOrder = sortInfo[1], sortInfo[2]
dropdown:SetSortOrder(sortOrder == "up" and ZO_SORT_ORDER_UP or ZO_SORT_ORDER_DOWN, sortType == "name" and ZO_SORT_BY_NAME or ZO_SORT_BY_NAME_NUMERIC)
control.m_sortType, control.m_sortOrder = SORT_TYPES[sortInfo[1]], SORT_ORDERS[sortInfo[2]]
elseif dropdownData.choicesValues then
control.m_sortType, control.m_sortOrder = ZO_SORT_ORDER_UP, SORT_BY_VALUE
end
if dropdownData.warning then
if dropdownData.warning ~= nil or dropdownData.requiresReload then
control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
control.warning:SetAnchor(RIGHT, combobox, LEFT, -5, 0)
control.warning.data = {tooltipText = dropdownData.warning}
control.UpdateWarning = LAM.util.UpdateWarning
control:UpdateWarning()
end
if dropdownData.disabled then
control.UpdateChoices = UpdateChoices
control:UpdateChoices(dropdownData.choices, dropdownData.choicesValues)
control.UpdateValue = UpdateValue
control:UpdateValue()
if dropdownData.disabled ~= nil then
control.UpdateDisabled = UpdateDisabled
control:UpdateDisabled()
end
control.UpdateChoices = UpdateChoices
control:UpdateChoices(dropdownData.choices)
control.UpdateValue = UpdateValue
control:UpdateValue()
if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then --if our parent window wants to refresh controls, then add this to the list
tinsert(control.panel.controlsToRefresh, control)
end
LAM.util.RegisterForRefreshIfNeeded(control)
LAM.util.RegisterForReloadIfNeeded(control)
return control
end

查看文件

@ -1,26 +1,25 @@
--[[editboxData = {
type = "editbox",
name = "My Editbox",
tooltip = "Editbox's tooltip text.",
name = "My Editbox", -- or string id or function returning a string
getFunc = function() return db.text end,
setFunc = function(text) db.text = text doStuff() end,
isMultiline = true, --boolean
tooltip = "Editbox's tooltip text.", -- or string id or function returning a string (optional)
isMultiline = true, --boolean (optional)
isExtraWide = true, --boolean (optional)
width = "full", --or "half" (optional)
disabled = function() return db.someBooleanSetting end, --or boolean (optional)
warning = "Will need to reload the UI.", --(optional)
default = defaults.text, --(optional)
reference = "MyAddonEditbox" --(optional) unique global reference to control
warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
default = defaults.text, -- default value or function that returns the default value (optional)
reference = "MyAddonEditbox" -- unique global reference to control (optional)
} ]]
local widgetVersion = 8
local widgetVersion = 14
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("editbox", widgetVersion) then return end
local wm = WINDOW_MANAGER
local cm = CALLBACK_MANAGER
local tinsert = table.insert
local function UpdateDisabled(control)
local disable
@ -43,22 +42,20 @@ end
local function UpdateValue(control, forceDefault, value)
if forceDefault then --if we are forcing defaults
value = control.data.default
value = LAM.util.GetDefaultValue(control.data.default)
control.data.setFunc(value)
control.editbox:SetText(value)
elseif value then
control.data.setFunc(value)
--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
if control.panel.data.registerForRefresh then
cm:FireCallbacks("LAM-RefreshPanel", control)
end
LAM.util.RequestRefreshIfNeeded(control)
else
value = control.data.getFunc()
control.editbox:SetText(value)
end
end
local MIN_HEIGHT = 26
local MIN_HEIGHT = 24
local HALF_WIDTH_LINE_SPACING = 2
function LAMCreateControl.editbox(parent, editboxData, controlName)
local control = LAM.util.CreateLabelAndContainerControl(parent, editboxData, controlName)
@ -100,37 +97,60 @@ function LAMCreateControl.editbox(parent, editboxData, controlName)
editbox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
editbox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
if not editboxData.isMultiline then
container:SetHeight(24)
else
local width = container:GetWidth()
local height = control.isHalfWidth and 74 or 100
container:SetHeight(height)
editbox:SetDimensionConstraints(width, height, width, 500)
local MIN_WIDTH = (parent.GetWidth and (parent:GetWidth() / 10)) or (parent.panel.GetWidth and (parent.panel:GetWidth() / 10)) or 0
if control.lineControl then
control.lineControl:SetHeight(MIN_HEIGHT + height + HALF_WIDTH_LINE_SPACING)
else
control:SetHeight(height)
end
control.label:ClearAnchors()
container:ClearAnchors()
control.label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, 0, 0)
if control.isHalfWidth then
container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, 0, 0)
end
if editboxData.warning then
if editboxData.isExtraWide then
container:SetAnchor(BOTTOMLEFT, control, BOTTOMLEFT, 0, 0)
else
container:SetWidth(MIN_WIDTH * 3.2)
end
if editboxData.isMultiline then
container:SetHeight(MIN_HEIGHT * 3)
else
container:SetHeight(MIN_HEIGHT)
end
if control.isHalfWidth ~= true and editboxData.isExtraWide ~= true then
control:SetHeight(container:GetHeight())
else
control:SetHeight(container:GetHeight() + control.label:GetHeight())
end
editbox:ClearAnchors()
editbox:SetAnchor(TOPLEFT, container, TOPLEFT, 2, 2)
editbox:SetAnchor(BOTTOMRIGHT, container, BOTTOMRIGHT, -2, -2)
if editboxData.warning ~= nil or editboxData.requiresReload then
control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
if editboxData.isExtraWide then
control.warning:SetAnchor(BOTTOMRIGHT, control.bg, TOPRIGHT, 2, 0)
else
control.warning:SetAnchor(TOPRIGHT, control.bg, TOPLEFT, -5, 0)
control.warning.data = {tooltipText = editboxData.warning}
end
control.UpdateWarning = LAM.util.UpdateWarning
control:UpdateWarning()
end
if editboxData.disabled then
control.UpdateValue = UpdateValue
control:UpdateValue()
if editboxData.disabled ~= nil then
control.UpdateDisabled = UpdateDisabled
control:UpdateDisabled()
end
control.UpdateValue = UpdateValue
control:UpdateValue()
if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then --if our parent window wants to refresh controls, then add this to the list
tinsert(control.panel.controlsToRefresh, control)
end
LAM.util.RegisterForRefreshIfNeeded(control)
LAM.util.RegisterForReloadIfNeeded(control)
return control
end

查看文件

@ -1,20 +1,19 @@
--[[headerData = {
type = "header",
name = "My Header",
name = "My Header", -- or string id or function returning a string
width = "full", --or "half" (optional)
reference = "MyAddonHeader" --(optional) unique global reference to control
reference = "MyAddonHeader" -- unique global reference to control (optional)
} ]]
local widgetVersion = 6
local widgetVersion = 8
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("header", widgetVersion) then return end
local wm = WINDOW_MANAGER
local tinsert = table.insert
local function UpdateValue(control)
control.header:SetText(control.data.name)
control.header:SetText(LAM.util.GetStringFromValue(control.data.name))
end
local MIN_HEIGHT = 30
@ -33,13 +32,11 @@ function LAMCreateControl.header(parent, headerData, controlName)
local header = control.header
header:SetAnchor(TOPLEFT, divider, BOTTOMLEFT)
header:SetAnchor(BOTTOMRIGHT)
header:SetText(headerData.name)
header:SetText(LAM.util.GetStringFromValue(headerData.name))
control.UpdateValue = UpdateValue
if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then --if our parent window wants to refresh controls, then add this to the list
tinsert(control.panel.controlsToRefresh, control)
end
LAM.util.RegisterForRefreshIfNeeded(control)
return control
end

查看文件

@ -1,30 +1,29 @@
--[[iconpickerData = {
type = "iconpicker",
name = "My Icon Picker",
tooltip = "Color Picker's tooltip text.",
name = "My Icon Picker", -- or string id or function returning a string
choices = {"texture path 1", "texture path 2", "texture path 3"},
choicesTooltips = {"icon tooltip 1", "icon tooltip 2", "icon tooltip 3"}, --(optional)
getFunc = function() return db.var end,
setFunc = function(var) db.var = var doStuff() end,
maxColumns = 5, --(optional) number of icons in one row
visibleRows = 4.5, --(optional) number of visible rows
iconSize = 28, --(optional) size of the icons
defaultColor = ZO_ColorDef:New("FFFFFF"), --(optional) default color of the icons
tooltip = "Color Picker's tooltip text.", -- or string id or function returning a string (optional)
choicesTooltips = {"icon tooltip 1", "icon tooltip 2", "icon tooltip 3"}, -- or array of string ids or array of functions returning a string (optional)
maxColumns = 5, -- number of icons in one row (optional)
visibleRows = 4.5, -- number of visible rows (optional)
iconSize = 28, -- size of the icons (optional)
defaultColor = ZO_ColorDef:New("FFFFFF"), -- default color of the icons (optional)
width = "full", --or "half" (optional)
beforeShow = function(control, iconPicker) return preventShow end, --(optional)
disabled = function() return db.someBooleanSetting end, --or boolean (optional)
warning = "Will need to reload the UI.", --(optional)
default = defaults.var, --(optional)
reference = "MyAddonIconPicker" --(optional) unique global reference to control
warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
default = defaults.var, -- default value or function that returns the default value (optional)
reference = "MyAddonIconPicker" -- unique global reference to control (optional)
} ]]
local widgetVersion = 2
local widgetVersion = 8
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("iconpicker", widgetVersion) then return end
local wm = WINDOW_MANAGER
local cm = CALLBACK_MANAGER
local tinsert = table.insert
local IconPickerMenu = ZO_Object:Subclass()
local iconPicker
@ -136,7 +135,7 @@ end
function IconPickerMenu:OnMouseEnter(icon)
InitializeTooltip(InformationTooltip, icon, TOPLEFT, 0, 0, BOTTOMRIGHT)
SetTooltipText(InformationTooltip, LAM.util.GetTooltipText(icon.tooltip))
SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(icon.tooltip))
InformationTooltipTopLevel:BringWindowToTop()
end
@ -253,7 +252,7 @@ end
local function UpdateChoices(control, choices, choicesTooltips)
local data = control.data
if not choices then
choices, choicesTooltips = data.choices, data.choicesTooltips
choices, choicesTooltips = data.choices, data.choicesTooltips or {}
end
local addedChoices = {}
@ -265,10 +264,8 @@ local function UpdateChoices(control, choices, choicesTooltips)
iconPicker:AddIcon(choices[i], function(self, texture)
control.icon:SetTexture(texture)
data.setFunc(texture)
if control.panel.data.registerForRefresh then
cm:FireCallbacks("LAM-RefreshPanel", control)
end
end, choicesTooltips[i])
LAM.util.RequestRefreshIfNeeded(control)
end, LAM.util.GetStringFromValue(choicesTooltips[i]))
addedChoices[texture] = true
end
end
@ -308,7 +305,7 @@ local function UpdateDisabled(control)
iconPicker:Clear()
end
SetColor(control)
SetColor(control, control.icon.color)
if disable then
control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
else
@ -318,15 +315,13 @@ end
local function UpdateValue(control, forceDefault, value)
if forceDefault then --if we are forcing defaults
value = control.data.default
value = LAM.util.GetDefaultValue(control.data.default)
control.data.setFunc(value)
control.icon:SetTexture(value)
elseif value then
control.data.setFunc(value)
--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
if control.panel.data.registerForRefresh then
cm:FireCallbacks("LAM-RefreshPanel", control)
end
LAM.util.RequestRefreshIfNeeded(control)
else
value = control.data.getFunc()
control.icon:SetTexture(value)
@ -414,15 +409,11 @@ function LAMCreateControl.iconpicker(parent, iconpickerData, controlName)
mungeOverlay:SetAddressMode(TEX_MODE_WRAP)
mungeOverlay:SetAnchorFill()
if iconpickerData.warning then
if iconpickerData.warning ~= nil or iconpickerData.requiresReload then
control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
control.warning:SetAnchor(RIGHT, control.container, LEFT, -5, 0)
control.warning.data = {tooltipText = iconpickerData.warning}
end
if iconpickerData.disabled then
control.UpdateDisabled = UpdateDisabled
control:UpdateDisabled()
control.UpdateWarning = LAM.util.UpdateWarning
control:UpdateWarning()
end
control.UpdateChoices = UpdateChoices
@ -433,9 +424,13 @@ function LAMCreateControl.iconpicker(parent, iconpickerData, controlName)
control.SetIconSize = SetIconSize
control:SetIconSize(iconSize)
if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then --if our parent window wants to refresh controls, then add this to the list
tinsert(control.panel.controlsToRefresh, control)
if iconpickerData.disabled ~= nil then
control.UpdateDisabled = UpdateDisabled
control:UpdateDisabled()
end
LAM.util.RegisterForRefreshIfNeeded(control)
LAM.util.RegisterForReloadIfNeeded(control)
return control
end

查看文件

@ -1,18 +1,19 @@
--[[panelData = {
type = "panel",
name = "Window Title",
displayName = "My Longer Window Title", --(optional) (can be useful for long addon names or if you want to colorize it)
author = "Seerah", --(optional)
version = "2.0", --(optional)
keywords = "settings", --(optional) additional keywords for search filter (it looks for matches in name..keywords..author)
slashCommand = "/myaddon", --(optional) will register a keybind to open to this panel (don't forget to include the slash!)
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 (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 = 9
local widgetVersion = 13
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("panel", widgetVersion) then return end
@ -20,18 +21,19 @@ 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 panel = LAM.util.GetTopPanel(control) --callback can be fired by a single control, by the panel showing or by a nested submenu
local panelControls = panel.controlsToRefresh
for i = 1, #panelControls do
local updateControl = panelControls[i]
if updateControl ~= control then
if updateControl.UpdateValue then
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
@ -52,47 +54,55 @@ local function ForceDefaults(panel)
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
local SEPARATOR = " - "
local LINK_COLOR = ZO_ColorDef:New("5959D5")
local LINK_MOUSE_OVER_COLOR = ZO_ColorDef:New("B8B8D3")
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(panelData.displayName or panelData.name)
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:SetFont(LAM.util.L["PANEL_INFO_FONT"])
info:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, -2)
if panelData.author and panelData.version then
info:SetText(string.format("Version: %s - %s: %s", panelData.version, GetString(SI_ADDON_MANAGER_AUTHOR), panelData.author))
elseif panelData.author then
info:SetText(string.format("%s: %s", GetString(SI_ADDON_MANAGER_AUTHOR), panelData.author))
else
info:SetText("Version: "..panelData.version)
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))
end
if panelData.website then
control.website = wm:CreateControl(nil, control, CT_BUTTON)
local website = control.website
website:SetClickSound("Click")
website:SetFont(LAM.util.L["PANEL_INFO_FONT"])
website:SetNormalFontColor(LINK_COLOR:UnpackRGBA())
website:SetMouseOverFontColor(LINK_MOUSE_OVER_COLOR:UnpackRGBA())
if(control.info) then
website:SetAnchor(TOPLEFT, control.info, TOPRIGHT, 0, 0)
website:SetText(string.format("|cffffff%s|r%s", SEPARATOR, LAM.util.L["WEBSITE"]))
else
website:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, -2)
website:SetText(LAM.util.L["WEBSITE"])
end
website:SetDimensions(website:GetLabelControl():GetTextDimensions())
website:SetHandler("OnClicked", function()
RequestOpenUnsafeURL(panelData.website)
end)
end
control.container = wm:CreateControlFromVirtual("LAMAddonPanelContainer"..LAMCreateControl.scrollCount, control, "ZO_ScrollContainer")
@ -103,30 +113,14 @@ function LAMCreateControl.panel(parent, panelData, controlName)
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.ForceDefaults = ForceDefaults
control.data = panelData
control.controlsToRefresh = {}
return control
end
-- vi: noexpandtab

查看文件

@ -1,29 +1,34 @@
--[[sliderData = {
type = "slider",
name = "My Slider",
tooltip = "Slider's tooltip text.",
name = "My Slider", -- or string id or function returning a string
getFunc = function() return db.var end,
setFunc = function(value) db.var = value doStuff() end,
min = 0,
max = 20,
step = 1, --(optional)
getFunc = function() return db.var end,
setFunc = function(value) db.var = value doStuff() end,
clampInput = true, -- boolean, if set to false the input won't clamp to min and max and allow any number instead (optional)
decimals = 0, -- when specified the input value is rounded to the specified number of decimals (optional)
autoSelect = false, -- boolean, automatically select everything in the text input field when it gains focus (optional)
inputLocation = "below", -- or "right", determines where the input field is shown. This should not be used within the addon menu and is for custom sliders (optional)
tooltip = "Slider's tooltip text.", -- or string id or function returning a string (optional)
width = "full", --or "half" (optional)
disabled = function() return db.someBooleanSetting end, --or boolean (optional)
warning = "Will need to reload the UI.", --(optional)
default = defaults.var, --(optional)
reference = "MyAddonSlider" --(optional) unique global reference to control
warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
default = defaults.var, -- default value or function that returns the default value (optional)
reference = "MyAddonSlider" -- unique global reference to control (optional)
} ]]
local widgetVersion = 7
local widgetVersion = 12
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("slider", widgetVersion) then return end
local wm = WINDOW_MANAGER
local cm = CALLBACK_MANAGER
local round = zo_round
local strformat = string.format
local tinsert = table.insert
local function RoundDecimalToPlace(d, place)
return tonumber(strformat("%." .. tostring(place) .. "f", d))
end
local function UpdateDisabled(control)
local disable
@ -50,14 +55,18 @@ end
local function UpdateValue(control, forceDefault, value)
if forceDefault then --if we are forcing defaults
value = control.data.default
value = LAM.util.GetDefaultValue(control.data.default)
control.data.setFunc(value)
elseif value and value >= control.data.min and value <= control.data.max then
elseif value then
if control.data.decimals then
value = RoundDecimalToPlace(value, control.data.decimals)
end
if control.data.clampInput ~= false then
value = math.max(math.min(value, control.data.max), control.data.min)
end
control.data.setFunc(value)
--after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
if control.panel.data.registerForRefresh then
cm:FireCallbacks("LAM-RefreshPanel", control)
end
LAM.util.RequestRefreshIfNeeded(control)
else
value = control.data.getFunc()
end
@ -66,16 +75,20 @@ local function UpdateValue(control, forceDefault, value)
control.slidervalue:SetText(value)
end
function LAMCreateControl.slider(parent, sliderData, controlName)
local control = LAM.util.CreateLabelAndContainerControl(parent, sliderData, controlName)
local isInputOnRight = sliderData.inputLocation == "right"
--skipping creating the backdrop... Is this the actual slider texture?
control.slider = wm:CreateControl(nil, control.container, CT_SLIDER)
local slider = control.slider
slider:SetAnchor(TOPLEFT)
slider:SetAnchor(TOPRIGHT)
slider:SetHeight(14)
if(isInputOnRight) then
slider:SetAnchor(TOPRIGHT, nil, nil, -60)
else
slider:SetAnchor(TOPRIGHT)
end
slider:SetMouseEnabled(true)
slider:SetOrientation(ORIENTATION_HORIZONTAL)
--put nil for highlighted texture file path, and what look to be texture coords
@ -84,7 +97,7 @@ function LAMCreateControl.slider(parent, sliderData, controlName)
local maxValue = sliderData.max
slider:SetMinMax(minValue, maxValue)
slider:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
slider:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseExit(control) end)
slider:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
slider.bg = wm:CreateControl(nil, slider, CT_BACKDROP)
local bg = slider.bg
@ -106,52 +119,94 @@ function LAMCreateControl.slider(parent, sliderData, controlName)
maxText:SetText(sliderData.max)
control.slidervalueBG = wm:CreateControlFromVirtual(nil, slider, "ZO_EditBackdrop")
if(isInputOnRight) then
control.slidervalueBG:SetDimensions(60, 26)
control.slidervalueBG:SetAnchor(LEFT, slider, RIGHT, 5, 0)
else
control.slidervalueBG:SetDimensions(50, 16)
control.slidervalueBG:SetAnchor(TOP, slider, BOTTOM, 0, 0)
end
control.slidervalue = wm:CreateControlFromVirtual(nil, control.slidervalueBG, "ZO_DefaultEditForBackdrop")
local slidervalue = control.slidervalue
slidervalue:ClearAnchors()
slidervalue:SetAnchor(TOPLEFT, control.slidervalueBG, TOPLEFT, 3, 1)
slidervalue:SetAnchor(BOTTOMRIGHT, control.slidervalueBG, BOTTOMRIGHT, -3, -1)
slidervalue:SetTextType(TEXT_TYPE_NUMERIC)
if(isInputOnRight) then
slidervalue:SetFont("ZoFontGameLarge")
else
slidervalue:SetFont("ZoFontGameSmall")
end
local isHandlingChange = false
local function HandleValueChanged(value)
if isHandlingChange then return end
if sliderData.decimals then
value = RoundDecimalToPlace(value, sliderData.decimals)
end
isHandlingChange = true
slider:SetValue(value)
slidervalue:SetText(value)
isHandlingChange = false
end
slidervalue:SetHandler("OnEscape", function(self)
HandleValueChanged(sliderData.getFunc())
self:LoseFocus()
control:UpdateValue()
end)
slidervalue:SetHandler("OnEnter", function(self)
self:LoseFocus()
control:UpdateValue(false, tonumber(self:GetText()))
end)
slidervalue:SetHandler("OnFocusLost", function(self)
local value = tonumber(self:GetText())
control:UpdateValue(false, value)
end)
slidervalue:SetHandler("OnTextChanged", function(self)
local input = self:GetText()
if(#input > 1 and not input:sub(-1):match("[0-9]")) then return end
local value = tonumber(input)
if(value) then
HandleValueChanged(value)
end
end)
if(sliderData.autoSelect) then
ZO_PreHookHandler(slidervalue, "OnFocusGained", function(self)
self:SelectAll()
end)
end
local range = maxValue - minValue
slider:SetValueStep(sliderData.step or 1)
slider:SetHandler("OnValueChanged", function(self, value, eventReason)
if eventReason == EVENT_REASON_SOFTWARE then return end
self:SetValue(value) --do we actually need this line?
slidervalue:SetText(value)
HandleValueChanged(value)
end)
slider:SetHandler("OnSliderReleased", function(self, value)
--sliderData.setFunc(value)
control:UpdateValue(false, value) --does this work here instead?
control:UpdateValue(false, value)
end)
slider:SetHandler("OnMouseWheel", function(self, value)
if(not self:GetEnabled()) then return end
local new_value = (tonumber(slidervalue:GetText()) or sliderData.min or 0) + ((sliderData.step or 1) * value)
control:UpdateValue(false, new_value)
end)
if sliderData.warning then
if sliderData.warning ~= nil or sliderData.requiresReload then
control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
control.warning:SetAnchor(RIGHT, slider, LEFT, -5, 0)
control.warning.data = {tooltipText = sliderData.warning}
control.UpdateWarning = LAM.util.UpdateWarning
control:UpdateWarning()
end
if sliderData.disabled then
control.UpdateDisabled = UpdateDisabled
control:UpdateDisabled()
end
control.UpdateValue = UpdateValue
control:UpdateValue()
if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then --if our parent window wants to refresh controls, then add this to the list
tinsert(control.panel.controlsToRefresh, control)
if sliderData.disabled ~= nil then
control.UpdateDisabled = UpdateDisabled
control:UpdateDisabled()
end
LAM.util.RegisterForRefreshIfNeeded(control)
LAM.util.RegisterForReloadIfNeeded(control)
return control
end

查看文件

@ -1,24 +1,22 @@
--[[submenuData = {
type = "submenu",
name = "Submenu Title",
tooltip = "My submenu tooltip", --(optional)
name = "Submenu Title", -- or string id or function returning a string
tooltip = "My submenu tooltip", -- -- or string id or function returning a string (optional)
controls = {sliderData, buttonData} --(optional) used by LAM
reference = "MyAddonSubmenu" --(optional) unique global reference to control
} ]]
local widgetVersion = 9
local widgetVersion = 11
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("submenu", widgetVersion) then return end
local wm = WINDOW_MANAGER
local am = ANIMATION_MANAGER
local tinsert = table.insert
local function UpdateValue(control)
control.label:SetText(control.data.name)
control.label:SetText(LAM.util.GetStringFromValue(control.data.name))
if control.data.tooltip then
control.label.data.tooltipText = LAM.util.GetTooltipText(control.data.tooltip)
control.label.data.tooltipText = LAM.util.GetStringFromValue(control.data.tooltip)
end
end
@ -44,10 +42,10 @@ function LAMCreateControl.submenu(parent, submenuData, controlName)
label:SetAnchor(TOPLEFT, control, TOPLEFT, 5, 5)
label:SetDimensions(width, 30)
label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
label:SetText(submenuData.name)
label:SetText(LAM.util.GetStringFromValue(submenuData.name))
label:SetMouseEnabled(true)
if submenuData.tooltip then
label.data = {tooltipText = LAM.util.GetTooltipText(submenuData.tooltip)}
label.data = {tooltipText = LAM.util.GetStringFromValue(submenuData.tooltip)}
label:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
label:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
end
@ -56,7 +54,7 @@ function LAMCreateControl.submenu(parent, submenuData, controlName)
local scroll = control.scroll
scroll:SetParent(control)
scroll:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, 10)
scroll:SetDimensionConstraints(width + 5, 0, width + 5, 2500)
scroll:SetDimensionConstraints(width + 5, 0, width + 5, 0)
control.bg = wm:CreateControl(nil, label, CT_BACKDROP)
local bg = control.bg
@ -104,9 +102,7 @@ function LAMCreateControl.submenu(parent, submenuData, controlName)
control.UpdateValue = UpdateValue
if control.panel.data.registerForRefresh or control.panel.data.registerForDefaults then --if our parent window wants to refresh controls, then add this to the list
tinsert(control.panel.controlsToRefresh, control)
end
LAM.util.RegisterForRefreshIfNeeded(control)
return control
end

查看文件

@ -3,14 +3,14 @@
image = "file/path.dds",
imageWidth = 64, --max of 250 for half width, 510 for full
imageHeight = 32, --max of 100
tooltip = "Image's tooltip text.", --(optional)
tooltip = "Image's tooltip text.", -- or string id or function returning a string (optional)
width = "full", --or "half" (optional)
reference = "MyAddonTexture" --(optional) unique global reference to control
} ]]
--add texture coords support?
local widgetVersion = 7
local widgetVersion = 9
local LAM = LibStub("LibAddonMenu-2.0")
if not LAM:RegisterWidget("texture", widgetVersion) then return end
@ -36,9 +36,9 @@ function LAMCreateControl.texture(parent, textureData, controlName)
if textureData.tooltip then
texture:SetMouseEnabled(true)
texture.data = {tooltipText = LAM.util.GetTooltipText(textureData.tooltip)}
texture.data = {tooltipText = LAM.util.GetStringFromValue(textureData.tooltip)}
texture:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
texture:SetHandler("OnMouseEnter", ZO_Options_OnMouseExit)
texture:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
end
return control

查看文件

@ -3,7 +3,7 @@
-- LibStub developed for World of Warcraft by above members of the WowAce community.
-- Ported to Elder Scrolls Online by Seerah
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 3
local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 4
local LibStub = _G[LIBSTUB_MAJOR]
local strformat = string.format
@ -34,3 +34,5 @@ if not LibStub or LibStub.minor < LIBSTUB_MINOR then
function LibStub:IterateLibraries() return pairs(self.libs) end
setmetatable(LibStub, { __call = LibStub.GetLibrary })
end
LibStub.SILENT = true