New Api version, new LibAddonMenu version, enabled new categories by default in the settings
This commit is contained in:
parent
dadd1bf70c
commit
2f38fb14e3
@ -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()
|
||||
end
|
||||
else
|
||||
CreationFinished()
|
||||
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,
|
||||
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
|
||||
|
||||
|
45
Libs/LibAddonMenu-2.0/controls/divider.lua
Normal file
45
Libs/LibAddonMenu-2.0/controls/divider.lua
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user