ESOUI SVN ZAMStats

[/] [trunk/] [ZAM_Stats/] [libs/] [LibAddonMenu-2.0/] [LibAddonMenu-2.0.lua] - Blame information for rev 16

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 10 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 16 Seerah-7
local MAJOR, MINOR = "LibAddonMenu-2.0", 16
11 10 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 14 Seerah-7
lam.widgets = lam.widgets or {}
26 Seerah-7
local widgets = lam.widgets
27 10 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 11 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 10 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 16 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 10 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 11 Seerah-7
        cm:FireCallbacks("LAM-PanelControlsCreated", panel)
135 10 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 16 Seerah-7
local function HandlePanelSwitching(self, panel)
202 10 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 11 Seerah-7
        if not LAMSettingsPanelCreated then
226 Seerah-7
                local controlPanelID = "LAM_ADDON_SETTINGS_PANEL"
227 13 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 16 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 10 Seerah-7
 
238 13 Seerah-7
                ZO_OptionsWindow_AddUserPanel(controlPanelID, controlPanelNames[GetCVar("Language.2")] or controlPanelName["en"])
239 10 Seerah-7
 
240 11 Seerah-7
                lam.panelID = _G[controlPanelID]
241 Seerah-7
 
242 16 Seerah-7
                --ZO_PreHook("ZO_OptionsWindow_ChangePanels", HandlePanelSwitching)
243 Seerah-7
                ZO_PreHook(ZO_SharedOptions, "ChangePanels", HandlePanelSwitching)
244 11 Seerah-7
 
245 Seerah-7
                LAMSettingsPanelCreated = true
246 Seerah-7
        end
247 10 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 13 Seerah-7
                local button = wm:CreateControlFromVirtual("LAMAddonMenuButton"..i, list.scrollChild, "ZO_DefaultTextButton")
255 10 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 13 Seerah-7
                        button:SetAnchor(TOPLEFT, list.scrollChild, TOPLEFT, 5, 5)
262 10 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 11 Seerah-7
--creates the left-hand menu in LAM's panel
272 10 Seerah-7
local function CreateAddonList()
273 11 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 10 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 11 Seerah-7
        list.bg = list.bg or wm:CreateControl(nil, list, CT_BACKDROP)
282 10 Seerah-7
        local bg = list.bg
283 Seerah-7
        bg:SetAnchorFill()      --offsets of 8?
284 13 Seerah-7
        bg:SetEdgeTexture("EsoUI\\Art\\miscellaneous\\borderedinsettransparent_edgefile.dds", 128, 16)
285 10 Seerah-7
        bg:SetCenterColor(0, 0, 0, 0)
286 Seerah-7
 
287 13 Seerah-7
        list.scrollChild = LAMAddonPanelsMenuScrollChild
288 Seerah-7
        list.scrollChild:SetResizeToFitPadding(0, 15)
289 Seerah-7
 
290 10 Seerah-7
        local generatedButtons
291 Seerah-7
        list:SetHandler("OnShow", function(self)
292 11 Seerah-7
                        if not generatedButtons and #addonsForList > 0 then
293 10 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 16 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 10 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