------------------------------------------------------------------------------- -- LAddMin v0.2 ------------------------------------------------------------------------------- -- -- Copyright (c) 2014 Ales Machat (Garkin) -- -- Permission is hereby granted, free of charge, to any person -- obtaining a copy of this software and associated documentation -- files (the "Software"), to deal in the Software without -- restriction, including without limitation the rights to use, -- copy, modify, merge, publish, distribute, sublicense, and/or sell -- copies of the Software, and to permit persons to whom the -- Software is furnished to do so, subject to the following -- conditions: -- -- The above copyright notice and this permission notice shall be -- included in all copies or substantial portions of the Software. -- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -- OTHER DEALINGS IN THE SOFTWARE. -- ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- -- Libraries ------------------------------------------------------------------ ------------------------------------------------------------------------------- local LAM1 = LibStub("LibAddonMenu-1.0") local LAM2 = LibStub("LibAddonMenu-2.0") ------------------------------------------------------------------------------- -- Local variables ------------------------------------------------------------ ------------------------------------------------------------------------------- local sv local panelIDs = {} local settingsTable = {} local invalidAddons = { ["Rainbow Config"] = true, } -- local missedPanelIDs = {} -- local lastID = 1000 ------------------------------------------------------------------------------- -- Delayed calls object, author Sasky (http://www.esoui.com/forums/member.php?u=2586) ------------------------------------------------------------------------------- local Promise = {} setmetatable(Promise, { __index = function(self, key) self:__preSave(key) return (self.__save) end, __call = function (cls, ...) return cls.__new(...) end }) function Promise:__new() local o = setmetatable({}, { __index = Promise, __call = function (cls, ...) return cls:__execute(...) end }) o.callList = {} o.nextKey = nil return o end function Promise:__preSave(key) self.nextKey = key end function Promise:__save(...) if self.nextKey == nil then return end table.insert(self.callList, { func = self.nextKey, narg = select('#', ...), varargs = {...} }) self.nextKey = nil end MISSED_CALLS = {} function Promise:__execute(obj) for k,v in ipairs(self.callList) do table.insert(MISSED_CALLS, k .. ":" .. v.func .. "(" .. table.concat(v.varargs,",") .. ")") obj[v.func](v.func, unpack(v.varargs)) end end ------------------------------------------------------------------------------- -- Library replacement -------------------------------------------------------- ------------------------------------------------------------------------------- --catch calls from addons which creates menu before saved variables are available (Rainbow Reticle) -- local MissedLamCalls = Promise() -- LibStub.libs["LibAddonMenu-1.0"] = setmetatable({}, { __index = MissedLamCalls }) -- local LAM = LibStub:NewLibrary("LibAddonMenu-1.0", 999) -- function LAM:CreateControlPanel(controlPanelID, controlPanelName) -- local name = controlPanelName:gsub("|[cC]%w%w%w%w%w%w",""):gsub("|[rR]","") -- -- if missedPanelIDs[name] ~= nil then -- return missedPanelIDs[name] -- end -- -- lastID = lastID + 1 -- missedPanelIDs[name] = lastID -- -- MissedLamCalls:CreateControlPanel(controlPanelID, controlPanelName) -- -- return lastID -- end --LAM 1.0 to 2.0 interface FAKE_LAM1 = setmetatable ({}, { __index = LAM1 }) LibStub.libs["LibAddonMenu-1.0"] = FAKE_LAM1 LibStub.minors["LibAddonMenu-1.0"] = 999 -- LAM1:CreateControlPanel(controlPanelID, controlPanelName) function FAKE_LAM1:CreateControlPanel(controlPanelID, controlPanelName) local name = controlPanelName:gsub("|[cC]%w%w%w%w%w%w",""):gsub("|[rR]","") if sv == nil then if not invalidAddons[name] then invalidAddons[name] = false return LAM1:CreateControlPanel(controlPanelID, name) end else if not sv.enabled[name] then if sv.enabled[name] == nil then sv.enabled[name] = false end return LAM1:CreateControlPanel(controlPanelID, name) end end if panelIDs[name] ~= nil then return panelIDs[name] end local panelID = #settingsTable + 1001 panelIDs[name] = panelID local panelTable = { name = name, displayName = controlPanelName, controls = {}, } settingsTable[panelID - 1000] = panelTable LAM2:RegisterAddonPanel(controlPanelID, panelTable) LAM2:RegisterOptionControls(controlPanelID, panelTable.controls) return panelID end -- LAM1:AddHeader(panelID, controlName, text) function FAKE_LAM1:AddHeader(panelID, controlName, text) if type(panelID) == "userdata" or (type(panelID) == "number" and panelID < 1000) then return LAM1:AddHeader(panelID, controlName, text) end local controlTable = { type = "header", name = text, reference = controlName .. "_LAddMin", controlName = controlName, } local tab = type(panelID) == "table" and panelID or settingsTable[panelID - 1000].controls table.insert(tab, controlTable) _G[controlName] = Promise() return _G[controlName] end -- LAM1:AddSlider(panelID, controlName, text, tooltip, minValue, maxValue, step, getFunc, setFunc, warning, warningText) function FAKE_LAM1:AddSlider(panelID, controlName, text, tooltip, minValue, maxValue, step, getFunc, setFunc, warning, warningText) if type(panelID) == "userdata" or (type(panelID) == "number" and panelID < 1000) then return LAM1:AddSlider(panelID, controlName, text, tooltip, minValue, maxValue, step, getFunc, setFunc, warning, warningText) end local controlTable = { type = "slider", name = text, tooltip = tooltip, min = minValue, max = maxValue, step = step, getFunc = getFunc, setFunc = setFunc, warning = warningText, reference = controlName .. "_LAddMin", controlName = controlName, } local tab = type(panelID) == "table" and panelID or settingsTable[panelID - 1000].controls table.insert(tab, controlTable) _G[controlName] = Promise() return _G[controlName] end -- LAM1:AddDropdown(panelID, controlName, text, tooltip, validChoices, getFunc, setFunc, warning, warningText) function FAKE_LAM1:AddDropdown(panelID, controlName, text, tooltip, validChoices, getFunc, setFunc, warning, warningText) if type(panelID) == "userdata" or (type(panelID) == "number" and panelID < 1000) then return LAM1:AddDropdown(panelID, controlName, text, tooltip, validChoices, getFunc, setFunc, warning, warningText) end local controlTable = { type = "dropdown", name = text, tooltip = tooltip, choices = validChoices, getFunc = getFunc, setFunc = setFunc, warning = warningText, reference = controlName .. "_LAddMin", controlName = controlName, } local tab = type(panelID) == "table" and panelID or settingsTable[panelID - 1000].controls table.insert(tab, controlTable) _G[controlName] = Promise() return _G[controlName] end -- LAM1:AddCheckbox(panelID, controlName, text, tooltip, getFunc, setFunc, warning, warningText) function FAKE_LAM1:AddCheckbox(panelID, controlName, text, tooltip, getFunc, setFunc, warning, warningText) if type(panelID) == "userdata" or (type(panelID) == "number" and panelID < 1000) then return LAM1:AddCheckbox(panelID, controlName, text, tooltip, getFunc, setFunc, warning, warningText) end local controlTable = { type = "checkbox", name = text, tooltip = tooltip, getFunc = getFunc, setFunc = setFunc, warning = warningText, reference = controlName .. "_LAddMin", controlName = controlName, } local tab = type(panelID) == "table" and panelID or settingsTable[panelID - 1000].controls table.insert(tab, controlTable) _G[controlName] = Promise() return _G[controlName] end -- LAM1:AddColorPicker(panelID, controlName, text, tooltip, getFunc, setFunc, warning, warningText) function FAKE_LAM1:AddColorPicker(panelID, controlName, text, tooltip, getFunc, setFunc, warning, warningText) if type(panelID) == "userdata" or (type(panelID) == "number" and panelID < 1000) then return LAM1:AddColorPicker(panelID, controlName, text, tooltip, getFunc, setFunc, warning, warningText) end local controlTable = { type = "colorpicker", name = text, tooltip = tooltip, getFunc = getFunc, setFunc = setFunc, warning = warningText, reference = controlName .. "_LAddMin", controlName = controlName, } local tab = type(panelID) == "table" and panelID or settingsTable[panelID - 1000].controls table.insert(tab, controlTable) _G[controlName] = Promise() return _G[controlName] end -- LAM1:AddEditBox(panelID, controlName, text, tooltip, isMultiLine, getFunc, setFunc, warning, warningText) function FAKE_LAM1:AddEditBox(panelID, controlName, text, tooltip, isMultiLine, getFunc, setFunc, warning, warningText) if type(panelID) == "userdata" or (type(panelID) == "number" and panelID < 1000) then return LAM1:AddEditBox(panelID, controlName, text, tooltip, isMultiLine, getFunc, setFunc, warning, warningText) end local controlTable = { type = "editbox", name = text, tooltip = tooltip, getFunc = getFunc, setFunc = setFunc, isMultiline = isMultiLine, warning = warningText, reference = controlName .. "_LAddMin", controlName = controlName, } local tab = type(panelID) == "table" and panelID or settingsTable[panelID - 1000].controls table.insert(tab, controlTable) local missedCalls = Promise() _G[controlName] = missedCalls missedCalls.additionalObjects = {} _G[controlName].edit = Promise() table.insert(missedCalls.additionalObjects, { edit = _G[controlName].edit }) return _G[controlName] end -- LAM1:AddButton(panelID, controlName, text, tooltip, onClick, warning, warningText) function FAKE_LAM1:AddButton(panelID, controlName, text, tooltip, onClick, warning, warningText) if type(panelID) == "userdata" or (type(panelID) == "number" and panelID < 1000) then return LAM1:AddButton(panelID, controlName, text, tooltip, onClick, warning, warningText) end local controlTable = { type = "button", name = text, tooltip = tooltip, func = onClick, warning = warningText, reference = controlName .. "_LAddMin", controlName = controlName, } local tab = type(panelID) == "table" and panelID or settingsTable[panelID - 1000].controls table.insert(tab, controlTable) _G[controlName] = Promise() return _G[controlName] end -- LAM1:AddDescription(panelID, controlName, text, titleText) function FAKE_LAM1:AddDescription(panelID, controlName, text, titleText) if type(panelID) == "userdata" or (type(panelID) == "number" and panelID < 1000) then return LAM1:AddDescription(panelID, controlName, text, titleText) end local controlTable = { type = "description", title = titleText, text = text, reference = controlName .. "_LAddMin", controlName = controlName, } local tab = type(panelID) == "table" and panelID or settingsTable[panelID - 1000].controls table.insert(tab, controlTable) _G[controlName] = Promise() return _G[controlName] end -- LAM1:AddSubMenu(panelID, controlName, text, tooltip) function FAKE_LAM1:AddSubMenu(panelID, controlName, text, tooltip) if type(panelID) == "userdata" or (type(panelID) == "number" and panelID < 1000) then return LAM1:AddSubMenu(panelID, controlName, text, tooltip) end local controlTable = { type = "submenu", name = text, tooltip = tooltip, reference = controlName .. "_LAddMin", controlName = controlName, controls = {}, } _G[controlName] = controlTable.controls local tab = type(panelID) == "table" and panelID or settingsTable[panelID - 1000].controls table.insert(tab, controlTable) return _G[controlName] end ------------------------------------------------------------------------------- -- Local functions ------------------------------------------------------------ ------------------------------------------------------------------------------- local function DelayedCalls(panel) local panelID = panelIDs[panel:GetName()] if panelID then for i,controlTable in ipairs(settingsTable[panelID - 1000].controls) do local missedCalls = _G[controlTable.controlName] _G[controlTable.controlName] = _G[controlTable.reference] missedCalls(_G[controlTable.controlName]) for key, missedCall in pairs(missedCalls.additionalObjects) do if key == "edit" then _G[controlTable.controlName][key] = _G[controlTable.controlName].editbox missedCall(_G[controlTable.controlName][key]) else missedCall(_G[controlTable.controlName][key]) end end _G[controlTable.reference] = nil missedCalls = nil end end end local function CreateSettingsMenu() local panel = { name = "L'AddonMinder", displayName = "|cFFFFB0L'AddonMinder|r", author = "Garkin", version = "0.2", registerForRefresh = true, registerForDefaults = true } LAM2:RegisterAddonPanel("LAddMin_Panel", panel) local addonNames = {} for name in pairs(sv.enabled) do table.insert(addonNames, name) end table.sort(addonNames) local controlTable = {} for _,name in ipairs(addonNames) do local checkbox = { type = "checkbox", name = name, getFunc = function() return sv.enabled[name] end, setFunc = function(value) sv.enabled[name] = value end, default = false } table.insert(controlTable, checkbox) end local text = {} for name in pairs(invalidAddons) do table.insert(text, name) end if #text > 0 then table.insert(controlTable, { type = "description", title = "Invalid addons:", text = table.concat(text, "\n- ") }) end table.insert(controlTable, { type = "button", name = GetString(SI_ADDON_MANAGER_RELOAD), func = function() ReloadUI("ingame") end } ) LAM2:RegisterOptionControls("LAddMin_Panel", controlTable) end local function OnAddonLoaded(code, addon) if addon ~= "LAddMin" then return end sv = ZO_SavedVars:NewAccountWide("LAddMin_SavedVariables", 1, "Addons", { enabled = {} }) -- LibStub.libs["LibAddonMenu-1.0"] = FAKE_LAM1 -- MissedLamCalls(FAKE_LAM1) CreateSettingsMenu() CALLBACK_MANAGER:RegisterCallback("LAM-PanelControlsCreated", DelayedCalls) EVENT_MANAGER:UnregisterForEvent(addon, code) end EVENT_MANAGER:RegisterForEvent("LAddMin", EVENT_ADD_ON_LOADED, OnAddonLoaded)