------------------------------------------------------------------------------- -- 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 = LAddMinCompatability -- local missedPanelIDs = {} -- local lastID = 1000 ------------------------------------------------------------------------------- -- 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 _,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 --Catch any other saved references addons might be using --TODO: Verify this in a mockup setmetatable(missedCalls, { __index = _G[controlTable.controlName] }) end end end local function OnAddonLoaded(code, addon) if addon ~= "LAddMin" then return end sv = ZO_SavedVars:NewAccountWide("LAddMin_ConversionList", 1, "Addons", { enabled = {} }) -- LibStub.libs["LibAddonMenu-1.0"] = FAKE_LAM1 -- MissedLamCalls(FAKE_LAM1) LAddMin_createSettingsMenu(sv) CALLBACK_MANAGER:RegisterCallback("LAM-PanelControlsCreated", DelayedCalls) EVENT_MANAGER:UnregisterForEvent(addon, code) end EVENT_MANAGER:RegisterForEvent("LAddMin", EVENT_ADD_ON_LOADED, OnAddonLoaded)