You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

393 lines
8.9 KiB

local _G = _G
local MovAny = _G.MovAny
local MOVANY = _G.MOVANY
local curModule
local curElement
local elemMetaTable
local catMetaTable
local m = {
customCat = nil,
Init = function(self)
self.compile = true
self.all = { }
self.allCount = 0
self.elems = { }
self.elemsN = { }
self.elemIDNext = 0
self.cats = { }
self.catsN = { }
self.catIDNext = 0
end,
Enable = function() end,
CompileList = function(self)
self.allCount = 0
table.wipe(self.all)
for ci, c in pairs(self.cats) do
if not c.hidden and not c.disabled then
self.allCount = self.allCount + 1
tinsert(self.all, self.allCount, c)
for ei, e in ipairs(c.elems) do
if not e.hidden and not e.disabled then
self.allCount = self.allCount + 1
tinsert(self.all, self.allCount, e)
end
end
end
end
self.compile = nil
end,
GetItem = function(self, idx)
return self.all[idx]
end,
ClearElementsUserData = function(self)
for i, v in ipairs(self.elems) do
v:SetUserData(nil)
end
end,
AddElement = function(self, e, ...)
if type(e) ~= "table" then
return
end
setmetatable(e, elemMetaTable)
self.elemIDNext = self.elemIDNext + 1
self.elems[self.elemIDNext] = e
self.elemsN[e.name] = e
e.default = self.default
if not e.displayName then
e.displayName = e.name
end
local gotCat = nil
if select("#",...) > 0 then
local c
for i = 1, select("#",...), 1 do
c = select(i, ...)
if c then
c:AddElement(e)
gotCat = true
end
end
end
if not gotCat then
e:AddCategory(MovAny.API.customCat)
end
return e
end,
GetElement = function(self, idx)
return type(idx) == "number" and self.elems[idx] or self.elemsN[idx]
end,
AddElementIfNew = function(self, name, displayName, cat)
local e = self:GetElement(name)
if not e then
displayName = displayName or name
e = self:AddElement({name = name, displayName = displayName}, cat)
if MovAny.inited then
if MovAny.userData[name] then
e:SetUserData(MovAny.userData[name])
end
self.compile = true
MovAny.guiLines = -1
MovAny:UpdateGUIIfShown()
end
end
return e
end,
SyncElement = function(self, name, forceSync)
local e = self:GetElement(name)
if e then
if forceSync and e.refuseSync then
e.refuseSync = nil
end
e:Sync()
end
end,
ElementIsDefault = function(self, f)
if not f.GetName then
return
end
local e = self:GetElement(f:GetName())
return e and e.default or nil
end,
RemoveCustomElement = function(self, fn)
local e = self:GetElement(fn)
if not e.default then
e:Delete()
end
end,
AddCategory = function(self, c)
if type(c) ~= "table" then
return
end
setmetatable(c, catMetaTable)
self.catIDNext = self.catIDNext + 1
self.cats[self.catIDNext] = c
self.catsN[c.name] = c
c.default = self.default
c.elems = { }
c.collapsed = MovAny.collapsed
return c
end,
GetCategory = function(self, idx)
return type(idx) == "number" and self.cats[idx] or self.catsN[idx]
end
}
elemMetaTable = {__index = {
--[[ToggleEnable = function(self)
if self.disabled then
self.disabled = nil
else
self.disabled = true
end
end,]]
AddCategory = function(self, c)
tinsert(c.elems, self)
end,
DeleteCategory = function(self, c)
for i, v in ipairs(c.elems) do
if v == self then
tremove(c.elems, i)
break
end
end
end,
Delete = function(self)
for ci, c in ipairs(m.cats) do
for i, v in ipairs(c.elems) do
if v == self then
tremove(c.elems, i)
break
end
end
end
m.elemsN[self.name] = nil
for i, v in ipairs(m.elems) do
if v == self then
tremove(m.elems, i)
end
end
end,
GetCategories = function(self)
local res = { }
for ci, c in ipairs(m.cats) do
for i, v in ipairs(c.elems) do
if v == self then
tinsert(res, c)
end
end
end
return res
end,
GetCategory = function(self, idx)
idx = idx or 1
local count = 0
for ci, c in ipairs(m.cats) do
for i, v in ipairs(c.elems) do
if v == self then
count = count + 1
if count == idx then
return c
end
end
end
end
end,
GetAllIndex = function(self)
for i, v in ipairs(m.all) do
if v == self then
return i
end
end
end,
IsModified = function(self, var)
self.userData = self.userData or self:SetUserData(MovAny:GetUserData(self.name))
if self.userData then
local opt = self.userData
if var then
if opt[var] then
return true
end
elseif opt.pos or opt.hidden or opt.scale ~= nil or opt.alpha ~= nil or opt.frameStrata ~= nil or opt.disableLayerArtwork ~= nil or opt.disableLayerBackground ~= nil or opt.disableLayerBorder ~= nil or opt.disableLayerHighlight ~= nil or opt.disableLayerOverlay ~= nil or opt.unregisterAllEvents ~= nil or opt.groups ~= nil or opt.forcedLock ~= nil then
return true
end
end
end,
Sync = function(e, f)
if not e:IsModified() then
return
end
if e.runOnce then
if not e:runOnce() then
e.runOnce = nil
else
return
end
end
if not e.userData.disabled and not e.refuseSync then
if not e.runBeforeInteract or not e:runBeforeInteract() then
if not f then
if e.f then
f = e.f
else
f = _G[e.name]
e.f = f
end
end
if f and MovAny:IsValidObject(f, true) then
if not MovAny:IsProtected(f) or not InCombatLockdown() then
if f.MAHooked then
e:Reset(f, true, e.userData, true)
end
if MovAny:HookFrame(e, f, nil, true) then
e:Apply(f, e.userData)
if e.runAfterInteract then
e:runAfterInteract()
end
return true
end
end
end
if not MovAny.syncingFrames then
MovAny.pendingFrames[e.name] = e
end
end
end
end,
Apply = function(e, f, opt)
e.anyFailure = nil
for i, v in ipairs(MovAny.modules) do
curModule = v
curElement = f
e.success = xpcall(function()
return v:Apply(e, f, opt)
end, e.ApplyErrorHandler, e)
e.anyFailure = e.anyFailure or (e.success == false)
end
curModule = nil
curElement = nil
return e.anyFailure
end,
ApplyErrorHandler = function(msg, frame, stack, ...)
if MADB.disableErrorMessages then
return
end
stack = stack or debugstack(2, 20, 20)
local funcs = ""
for m in string.gmatch(stack, "function (%b`')") do
if m ~= "xpcall" then
if funcs == "" then
funcs = m
else
funcs = funcs..", "..m
end
end
end
maPrint(string.format(MOVANY.ERROR_MODULE_FAILED, curModule.name, curElement:GetName(), curElement:GetName(), curModule.name, GetAddOnMetadata("MoveAnything", "Version"), msg, funcs))
local errorHandler = geterrorhandler()
if type(errorHandler) == "function" and errorHandler ~= _ERRORMESSAGE then
errorHandler(msg, frame, stack, ...)
end
end,
Reset = function(e, f, readOnly, opt, dontResetHide)
if f and f.MAHooked and f.SetUserPlaced and f:IsUserPlaced() and (f:IsMovable() or f:IsResizable()) then
if f:IsUserPlaced() then
if f.MAWasUserPlaced then
f.MAWasUserPlaced = nil
else
f:SetUserPlaced(false)
end
end
if f:IsMovable() then
if f.MAWasMovable then
f.MAWasMovable = nil
else
f:SetMovable(false)
end
end
if f:IsResizable() then
if f.MAWasResizable then
f.MAWasResizable = nil
else
f:SetResizable(false)
end
end
end
if f.OnMAPreReset then
f:OnMAPreReset(readOnly, opt, e)
end
for i, m in ipairs(MovAny.modules) do
--if not exclude or not exclude[v.name] then
if not dontResetHide or m.name ~= "Hide" then
m:Reset(e, f, readOnly, opt)
end
end
f.MAHooked = nil
if f.OnMAPostReset then
f:OnMAPostReset(readOnly, opt, e)
end
end,
SetUserData = function(e, ud)
e.userData = ud
local f = e.f or _G[e.name]
if f and f.MAEVM then
f.opt = ud
end
return ud
end
}}
catMetaTable = {__index = {
ToggleEnable = function(self)
if self.disabled then
self.disabled = nil
else
self.disabled = true
end
end,
ToggleHide = function(self)
--store in MADB
if self.hidden then
self.hidden = nil
else
self.hidden = true
end
end,
TogglePurge = function(self)
--store in MADB
if self.purge then
self.purge = nil
else
self.purged = true
--purge category
end
end,
AddElement = function(self, e)
if e then
tinsert(self.elems, e)
end
return e
end,
DeleteElement = function(self, e)
for i, v in ipairs(self.elems) do
if v == e then
tremove(self.elems, i)
break
end
end
end,
GetAllIndex = function(self)
for i, v in ipairs(m.all) do
if v == self then
return i
end
end
end,
}}
MovAny:AddCore("API", m)