Details | Compare with Previous | View Log
Line No. | Rev | Author | Line |
---|---|---|---|
1 | 13 | Seerah-7 | -- LibAddonMenu-2.0 & its files © Ryan Lakanen (Seerah) -- |
2 | Seerah-7 | -- All Rights Reserved -- |
|
3 | Seerah-7 | -- Permission is granted to use Seerah's LibAddonMenu-2.0 -- |
|
4 | Seerah-7 | -- in your project. Any modifications to LibAddonMenu-2.0 -- |
|
5 | Seerah-7 | -- may not be redistributed. -- |
|
6 | Seerah-7 | -------------------------------------------------------------- |
|
7 | Seerah-7 | ||
8 | Seerah-7 | ||
9 | Seerah-7 | --Register LAM with LibStub |
|
10 | 15 | Seerah-7 | local MAJOR, MINOR = "LibAddonMenu-2.0", 16 |
11 | 13 | Seerah-7 | local lam, oldminor = LibStub:NewLibrary(MAJOR, MINOR) |
12 | Seerah-7 | if not lam then return end --the same or newer version of this lib is already loaded into memory |
|
13 | Seerah-7 | ||
14 | Seerah-7 | ||
15 | Seerah-7 | --UPVALUES-- |
|
16 | Seerah-7 | local wm = WINDOW_MANAGER |
|
17 | Seerah-7 | local cm = CALLBACK_MANAGER |
|
18 | Seerah-7 | local tinsert = table.insert |
|
19 | Seerah-7 | local optionsWindow = ZO_OptionsWindowSettingsScrollChild |
|
20 | Seerah-7 | local _ |
|
21 | Seerah-7 | ||
22 | Seerah-7 | local addonsForList = {} |
|
23 | Seerah-7 | local addonToOptionsMap = {} |
|
24 | Seerah-7 | local optionsCreated = {} |
|
25 | Seerah-7 | lam.widgets = lam.widgets or {} |
|
26 | Seerah-7 | local widgets = lam.widgets |
|
27 | Seerah-7 | ||
28 | Seerah-7 | ||
29 | Seerah-7 | --METHOD: REGISTER WIDGET-- |
|
30 | Seerah-7 | --each widget has its version checked before loading, |
|
31 | Seerah-7 | --so we only have the most recent one in memory |
|
32 | Seerah-7 | --Usage: |
|
33 | Seerah-7 | -- widgetType = "string"; the type of widget being registered |
|
34 | Seerah-7 | -- widgetVersion = integer; the widget's version number |
|
35 | Seerah-7 | LAMCreateControl = LAMCreateControl or {} |
|
36 | Seerah-7 | local lamcc = LAMCreateControl |
|
37 | Seerah-7 | ||
38 | Seerah-7 | function lam:RegisterWidget(widgetType, widgetVersion) |
|
39 | Seerah-7 | if widgets[widgetType] and widgets[widgetType] >= widgetVersion then |
|
40 | Seerah-7 | return false |
|
41 | Seerah-7 | else |
|
42 | Seerah-7 | widgets[widgetType] = widgetVersion |
|
43 | Seerah-7 | return true |
|
44 | Seerah-7 | end |
|
45 | Seerah-7 | end |
|
46 | Seerah-7 | ||
47 | Seerah-7 | ||
48 | Seerah-7 | --METHOD: OPEN TO ADDON PANEL-- |
|
49 | Seerah-7 | --opens to a specific addon's option panel |
|
50 | Seerah-7 | --Usage: |
|
51 | Seerah-7 | -- panel = userdata; the panel returned by the :RegisterOptionsPanel method |
|
52 | Seerah-7 | --local settings = {en = "Settings", de = "Einstellungen", fr = "Réglages"} |
|
53 | Seerah-7 | --local locSettings = settings[GetCVar("Language.2")] |
|
54 | Seerah-7 | local locSettings = GetString(SI_GAME_MENU_SETTINGS) |
|
55 | Seerah-7 | function lam:OpenToPanel(panel) |
|
56 | Seerah-7 | SCENE_MANAGER:Show("gameMenuInGame") |
|
57 | Seerah-7 | zo_callLater(function() |
|
58 | Seerah-7 | ZO_GameMenu_InGame.gameMenu.headerControls[locSettings]:SetOpen(true) |
|
59 | Seerah-7 | SCENE_MANAGER:AddFragment(OPTIONS_WINDOW_FRAGMENT) |
|
60 | 15 | Seerah-7 | --ZO_OptionsWindow_ChangePanels(lam.panelID) |
61 | Seerah-7 | KEYBOARD_OPTIONS:ChangePanels(lam.panelID) |
|
62 | Seerah-7 | --if not lam.panelSubCategoryControl then |
|
63 | Seerah-7 | -- lam.panelSubCategoryControl = _G["ZO_GameMenu_InGameNavigationContainerScrollChildZO_GameMenu_SubCategory"..(lam.panelID + 1)] |
|
64 | Seerah-7 | --end |
|
65 | Seerah-7 | --ZO_TreeEntry_OnMouseUp(lam.panelSubCategoryControl, true) |
|
66 | 13 | Seerah-7 | panel:SetHidden(false) |
67 | Seerah-7 | end, 200) |
|
68 | Seerah-7 | end |
|
69 | Seerah-7 | ||
70 | Seerah-7 | ||
71 | Seerah-7 | --INTERNAL FUNCTION |
|
72 | Seerah-7 | --creates controls when options panel is first shown |
|
73 | Seerah-7 | --controls anchoring of these controls in the panel |
|
74 | Seerah-7 | local function CreateOptionsControls(panel) |
|
75 | Seerah-7 | local addonID = panel:GetName() |
|
76 | Seerah-7 | local optionsTable = addonToOptionsMap[addonID] |
|
77 | Seerah-7 | ||
78 | Seerah-7 | if optionsTable then |
|
79 | Seerah-7 | local lastAddedControl, lacAtHalfRow |
|
80 | Seerah-7 | for _, widgetData in ipairs(optionsTable) do |
|
81 | Seerah-7 | local widgetType = widgetData.type |
|
82 | Seerah-7 | if widgetType == "submenu" then |
|
83 | Seerah-7 | local submenu = LAMCreateControl[widgetType](panel, widgetData) |
|
84 | Seerah-7 | if lastAddedControl then |
|
85 | Seerah-7 | submenu:SetAnchor(TOPLEFT, lastAddedControl, BOTTOMLEFT, 0, 15) |
|
86 | Seerah-7 | else |
|
87 | Seerah-7 | submenu:SetAnchor(TOPLEFT) |
|
88 | Seerah-7 | end |
|
89 | Seerah-7 | lastAddedControl = submenu |
|
90 | Seerah-7 | lacAtHalfRow = false |
|
91 | Seerah-7 | ||
92 | Seerah-7 | local lastAddedControlSub, lacAtHalfRowSub |
|
93 | Seerah-7 | for _, subWidgetData in ipairs(widgetData.controls) do |
|
94 | Seerah-7 | local subWidgetType = subWidgetData.type |
|
95 | Seerah-7 | local subWidget = LAMCreateControl[subWidgetType](submenu, subWidgetData) |
|
96 | Seerah-7 | local isHalf = subWidgetData.width == "half" |
|
97 | Seerah-7 | if lastAddedControlSub then |
|
98 | Seerah-7 | if lacAtHalfRowSub and isHalf then |
|
99 | Seerah-7 | subWidget:SetAnchor(TOPLEFT, lastAddedControlSub, TOPRIGHT, 5, 0) |
|
100 | Seerah-7 | lacAtHalfRowSub = false |
|
101 | Seerah-7 | else |
|
102 | Seerah-7 | subWidget:SetAnchor(TOPLEFT, lastAddedControlSub, BOTTOMLEFT, 0, 15) |
|
103 | Seerah-7 | lacAtHalfRowSub = isHalf and true or false |
|
104 | Seerah-7 | lastAddedControlSub = subWidget |
|
105 | Seerah-7 | end |
|
106 | Seerah-7 | else |
|
107 | Seerah-7 | subWidget:SetAnchor(TOPLEFT) |
|
108 | Seerah-7 | lacAtHalfRowSub = isHalf and true or false |
|
109 | Seerah-7 | lastAddedControlSub = subWidget |
|
110 | Seerah-7 | end |
|
111 | Seerah-7 | end |
|
112 | Seerah-7 | else |
|
113 | Seerah-7 | local widget = LAMCreateControl[widgetType](panel, widgetData) |
|
114 | Seerah-7 | local isHalf = widgetData.width == "half" |
|
115 | Seerah-7 | if lastAddedControl then |
|
116 | Seerah-7 | if lacAtHalfRow and isHalf then |
|
117 | Seerah-7 | widget:SetAnchor(TOPLEFT, lastAddedControl, TOPRIGHT, 10, 0) |
|
118 | Seerah-7 | lacAtHalfRow = false |
|
119 | Seerah-7 | else |
|
120 | Seerah-7 | widget:SetAnchor(TOPLEFT, lastAddedControl, BOTTOMLEFT, 0, 15) |
|
121 | Seerah-7 | lacAtHalfRow = isHalf and true or false |
|
122 | Seerah-7 | lastAddedControl = widget |
|
123 | Seerah-7 | end |
|
124 | Seerah-7 | else |
|
125 | Seerah-7 | widget:SetAnchor(TOPLEFT) |
|
126 | Seerah-7 | lacAtHalfRow = isHalf and true or false |
|
127 | Seerah-7 | lastAddedControl = widget |
|
128 | Seerah-7 | end |
|
129 | Seerah-7 | end |
|
130 | Seerah-7 | end |
|
131 | Seerah-7 | end |
|
132 | Seerah-7 | ||
133 | Seerah-7 | optionsCreated[addonID] = true |
|
134 | Seerah-7 | cm:FireCallbacks("LAM-PanelControlsCreated", panel) |
|
135 | Seerah-7 | end |
|
136 | Seerah-7 | ||
137 | Seerah-7 | ||
138 | Seerah-7 | --INTERNAL FUNCTION |
|
139 | Seerah-7 | --handles switching between panels |
|
140 | Seerah-7 | local function ToggleAddonPanels(panel) --called in OnShow of newly shown panel |
|
141 | Seerah-7 | local currentlySelected = LAMAddonPanelsMenu.currentlySelected |
|
142 | Seerah-7 | if currentlySelected and currentlySelected ~= panel then |
|
143 | Seerah-7 | currentlySelected:SetHidden(true) |
|
144 | Seerah-7 | end |
|
145 | Seerah-7 | LAMAddonPanelsMenu.currentlySelected = panel |
|
146 | Seerah-7 | ||
147 | Seerah-7 | if not optionsCreated[panel:GetName()] then --if this is the first time opening this panel, create these options |
|
148 | Seerah-7 | CreateOptionsControls(panel) |
|
149 | Seerah-7 | end |
|
150 | Seerah-7 | ||
151 | Seerah-7 | cm:FireCallbacks("LAM-RefreshPanel", panel) |
|
152 | Seerah-7 | end |
|
153 | Seerah-7 | ||
154 | Seerah-7 | ||
155 | Seerah-7 | --METHOD: REGISTER ADDON PANEL |
|
156 | Seerah-7 | --registers your addon with LibAddonMenu and creates a panel |
|
157 | Seerah-7 | --Usage: |
|
158 | Seerah-7 | -- addonID = "string"; unique ID which will be the global name of your panel |
|
159 | Seerah-7 | -- panelData = table; data object for your panel - see controls\panel.lua |
|
160 | Seerah-7 | function lam:RegisterAddonPanel(addonID, panelData) |
|
161 | Seerah-7 | local panel = lamcc.panel(nil, panelData, addonID) --addonID==global name of panel |
|
162 | Seerah-7 | panel:SetHidden(true) |
|
163 | Seerah-7 | panel:SetAnchor(TOPLEFT, LAMAddonPanelsMenu, TOPRIGHT, 10, 0) |
|
164 | Seerah-7 | panel:SetAnchor(BOTTOMLEFT, LAMAddonPanelsMenu, BOTTOMRIGHT, 10, 0) |
|
165 | Seerah-7 | panel:SetWidth(549) |
|
166 | Seerah-7 | panel:SetDrawLayer(DL_OVERLAY) |
|
167 | Seerah-7 | tinsert(addonsForList, {panel = addonID, name = panelData.name}) |
|
168 | Seerah-7 | panel:SetHandler("OnShow", ToggleAddonPanels) |
|
169 | Seerah-7 | if panelData.slashCommand then |
|
170 | Seerah-7 | SLASH_COMMANDS[panelData.slashCommand] = function() |
|
171 | Seerah-7 | lam:OpenToPanel(panel) |
|
172 | Seerah-7 | end |
|
173 | Seerah-7 | end |
|
174 | Seerah-7 | ||
175 | Seerah-7 | return panel --return for authors creating options manually |
|
176 | Seerah-7 | end |
|
177 | Seerah-7 | ||
178 | Seerah-7 | ||
179 | Seerah-7 | --METHOD: REGISTER OPTION CONTROLS |
|
180 | Seerah-7 | --registers the options you want shown for your addon |
|
181 | Seerah-7 | --these are stored in a table where each key-value pair is the order |
|
182 | Seerah-7 | --of the options in the panel and the data for that control, respectively |
|
183 | Seerah-7 | --see exampleoptions.lua for an example |
|
184 | Seerah-7 | --see controls\<widget>.lua for each widget type |
|
185 | Seerah-7 | --Usage: |
|
186 | Seerah-7 | -- addonID = "string"; the same string passed to :RegisterAddonPanel |
|
187 | Seerah-7 | -- optionsTable = table; the table containing all of the options controls and their data |
|
188 | Seerah-7 | function lam:RegisterOptionControls(addonID, optionsTable) --optionsTable = {sliderData, buttonData, etc} |
|
189 | Seerah-7 | addonToOptionsMap[addonID] = optionsTable |
|
190 | Seerah-7 | end |
|
191 | Seerah-7 | ||
192 | Seerah-7 | ||
193 | Seerah-7 | --INTERNAL FUNCTION |
|
194 | Seerah-7 | --handles switching between LAM's Addon Settings panel and other panels in the Settings menu |
|
195 | Seerah-7 | local oldDefaultButton = ZO_OptionsWindowResetToDefaultButton |
|
196 | Seerah-7 | local oldCallback = oldDefaultButton.callback |
|
197 | Seerah-7 | local dummyFunc = function() end |
|
198 | Seerah-7 | local panelWindow = ZO_OptionsWindow |
|
199 | Seerah-7 | local bgL = ZO_OptionsWindowBGLeft |
|
200 | Seerah-7 | local bgR = ZO_OptionsWindowBGLeftBGRight |
|
201 | 15 | Seerah-7 | local function HandlePanelSwitching(self, panel) |
202 | 13 | Seerah-7 | if panel == lam.panelID then --our addon settings panel |
203 | Seerah-7 | oldDefaultButton:SetCallback(dummyFunc) |
|
204 | Seerah-7 | oldDefaultButton:SetHidden(true) |
|
205 | Seerah-7 | oldDefaultButton:SetAlpha(0) --just because it still bugs out |
|
206 | Seerah-7 | panelWindow:SetDimensions(999, 960) |
|
207 | Seerah-7 | bgL:SetWidth(666) |
|
208 | Seerah-7 | bgR:SetWidth(333) |
|
209 | Seerah-7 | else |
|
210 | Seerah-7 | local shown = LAMAddonPanelsMenu.currentlySelected |
|
211 | Seerah-7 | if shown then shown:SetHidden(true) end |
|
212 | Seerah-7 | oldDefaultButton:SetCallback(oldCallback) |
|
213 | Seerah-7 | oldDefaultButton:SetHidden(false) |
|
214 | Seerah-7 | oldDefaultButton:SetAlpha(1) |
|
215 | Seerah-7 | panelWindow:SetDimensions(768, 914) |
|
216 | Seerah-7 | bgL:SetWidth(512) |
|
217 | Seerah-7 | bgR:SetWidth(256) |
|
218 | Seerah-7 | end |
|
219 | Seerah-7 | end |
|
220 | Seerah-7 | ||
221 | Seerah-7 | ||
222 | Seerah-7 | --INTERNAL FUNCTION |
|
223 | Seerah-7 | --creates LAM's Addon Settings panel |
|
224 | Seerah-7 | local function CreateAddonSettingsPanel() |
|
225 | Seerah-7 | if not LAMSettingsPanelCreated then |
|
226 | Seerah-7 | local controlPanelID = "LAM_ADDON_SETTINGS_PANEL" |
|
227 | Seerah-7 | --Russian for TERAB1T's RuESO addon, which creates an "ru" locale |
|
228 | Seerah-7 | --game font does not support Cyrillic, so they are using custom fonts + extended latin charset |
|
229 | 15 | Seerah-7 | --Spanish provided by Luisen75 for their translation project |
230 | Seerah-7 | local controlPanelNames = { |
|
231 | Seerah-7 | en = "Addon Settings", |
|
232 | Seerah-7 | fr = "Extensions", |
|
233 | Seerah-7 | de = "Erweiterungen", |
|
234 | Seerah-7 | ru = "Ãacòpoéêè äoïoìîeîèé", |
|
235 | Seerah-7 | es = "Configura Addons", |
|
236 | Seerah-7 | } |
|
237 | 13 | Seerah-7 | |
238 | Seerah-7 | ZO_OptionsWindow_AddUserPanel(controlPanelID, controlPanelNames[GetCVar("Language.2")] or controlPanelName["en"]) |
|
239 | Seerah-7 | ||
240 | Seerah-7 | lam.panelID = _G[controlPanelID] |
|
241 | Seerah-7 | ||
242 | 15 | Seerah-7 | --ZO_PreHook("ZO_OptionsWindow_ChangePanels", HandlePanelSwitching) |
243 | Seerah-7 | ZO_PreHook(ZO_SharedOptions, "ChangePanels", HandlePanelSwitching) |
|
244 | 13 | Seerah-7 | |
245 | Seerah-7 | LAMSettingsPanelCreated = true |
|
246 | Seerah-7 | end |
|
247 | Seerah-7 | end |
|
248 | Seerah-7 | ||
249 | Seerah-7 | ||
250 | Seerah-7 | --INTERNAL FUNCTION |
|
251 | Seerah-7 | --adds each registered addon to the menu in LAM's panel |
|
252 | Seerah-7 | local function CreateAddonButtons(list, addons) |
|
253 | Seerah-7 | for i = 1, #addons do |
|
254 | Seerah-7 | local button = wm:CreateControlFromVirtual("LAMAddonMenuButton"..i, list.scrollChild, "ZO_DefaultTextButton") |
|
255 | Seerah-7 | button.name = addons[i].name |
|
256 | Seerah-7 | button.panel = _G[addons[i].panel] |
|
257 | Seerah-7 | button:SetText(button.name) |
|
258 | Seerah-7 | button:SetHorizontalAlignment(TEXT_ALIGN_LEFT) |
|
259 | Seerah-7 | button:SetWidth(190) |
|
260 | Seerah-7 | if i == 1 then |
|
261 | Seerah-7 | button:SetAnchor(TOPLEFT, list.scrollChild, TOPLEFT, 5, 5) |
|
262 | Seerah-7 | else |
|
263 | Seerah-7 | button:SetAnchor(TOPLEFT, _G["LAMAddonMenuButton"..i-1], BOTTOMLEFT) |
|
264 | Seerah-7 | end |
|
265 | Seerah-7 | button:SetHandler("OnClicked", function(self) self.panel:SetHidden(false) end) |
|
266 | Seerah-7 | end |
|
267 | Seerah-7 | end |
|
268 | Seerah-7 | ||
269 | Seerah-7 | ||
270 | Seerah-7 | --INTERNAL FUNCTION |
|
271 | Seerah-7 | --creates the left-hand menu in LAM's panel |
|
272 | Seerah-7 | local function CreateAddonList() |
|
273 | Seerah-7 | local list |
|
274 | Seerah-7 | --check if an earlier loaded copy of LAM created it already |
|
275 | Seerah-7 | list = LAMAddonPanelsMenu or wm:CreateControlFromVirtual("LAMAddonPanelsMenu", optionsWindow, "ZO_ScrollContainer") |
|
276 | Seerah-7 | list:ClearAnchors() |
|
277 | Seerah-7 | list:SetAnchor(TOPLEFT) |
|
278 | Seerah-7 | list:SetHeight(675) |
|
279 | Seerah-7 | list:SetWidth(200) |
|
280 | Seerah-7 | ||
281 | Seerah-7 | list.bg = list.bg or wm:CreateControl(nil, list, CT_BACKDROP) |
|
282 | Seerah-7 | local bg = list.bg |
|
283 | Seerah-7 | bg:SetAnchorFill() --offsets of 8? |
|
284 | Seerah-7 | bg:SetEdgeTexture("EsoUI\\Art\\miscellaneous\\borderedinsettransparent_edgefile.dds", 128, 16) |
|
285 | Seerah-7 | bg:SetCenterColor(0, 0, 0, 0) |
|
286 | Seerah-7 | ||
287 | Seerah-7 | list.scrollChild = LAMAddonPanelsMenuScrollChild |
|
288 | Seerah-7 | list.scrollChild:SetResizeToFitPadding(0, 15) |
|
289 | Seerah-7 | ||
290 | Seerah-7 | local generatedButtons |
|
291 | Seerah-7 | list:SetHandler("OnShow", function(self) |
|
292 | Seerah-7 | if not generatedButtons and #addonsForList > 0 then |
|
293 | Seerah-7 | --we're about to show our list for the first time - let's sort the buttons before creating them |
|
294 | Seerah-7 | table.sort(addonsForList, function(a, b) |
|
295 | Seerah-7 | return a.name < b.name |
|
296 | Seerah-7 | end) |
|
297 | Seerah-7 | CreateAddonButtons(list, addonsForList) |
|
298 | Seerah-7 | self.currentlySelected = LAMAddonMenuButton1 and LAMAddonMenuButton1.panel |
|
299 | Seerah-7 | --since our addon panels don't have a parent, let's make sure they hide when we're done with them |
|
300 | Seerah-7 | ZO_PreHookHandler(ZO_OptionsWindow, "OnHide", function() self.currentlySelected:SetHidden(true) end) |
|
301 | Seerah-7 | generatedButtons = true |
|
302 | Seerah-7 | end |
|
303 | Seerah-7 | if self.currentlySelected then self.currentlySelected:SetHidden(false) end |
|
304 | Seerah-7 | end) |
|
305 | Seerah-7 | ||
306 | 15 | Seerah-7 | --list.controlType = OPTIONS_CUSTOM |
307 | Seerah-7 | --list.panel = lam.panelID |
|
308 | Seerah-7 | list.data = { |
|
309 | Seerah-7 | controlType = OPTIONS_CUSTOM, |
|
310 | Seerah-7 | panel = lam.panelID, |
|
311 | Seerah-7 | } |
|
312 | 13 | Seerah-7 | |
313 | Seerah-7 | ZO_OptionsWindow_InitializeControl(list) |
|
314 | Seerah-7 | ||
315 | Seerah-7 | return list |
|
316 | Seerah-7 | end |
|
317 | Seerah-7 | ||
318 | Seerah-7 | ||
319 | Seerah-7 | --INITIALIZING |
|
320 | Seerah-7 | CreateAddonSettingsPanel() |
|
321 | Seerah-7 | CreateAddonList() |
|
322 | Seerah-7 |