147 lines
3.5 KiB
Lua
147 lines
3.5 KiB
Lua
local class = {}
|
|
|
|
local tAPI = {} -- local class API for objects
|
|
|
|
local shapescape
|
|
|
|
class.init = function(api)
|
|
shapescape = api
|
|
setmetatable(tAPI, {__index=api.group})
|
|
api.generic.convertToClass = class.convertToClass
|
|
end
|
|
|
|
tAPI.initialize = function(obj)
|
|
|
|
local scape = obj:getScape()
|
|
local publicProperties = obj.publicProperties or {}
|
|
setmetatable(obj, {__index=tAPI})
|
|
obj.isClass = true
|
|
local str = ""
|
|
|
|
for k,v in pairs(publicProperties) do
|
|
if v == "" then
|
|
table.remove(publicProperties,k)
|
|
end
|
|
end
|
|
|
|
if not shapescape.utils.locateEntry(publicProperties, "properties") then
|
|
table.insert(publicProperties,"properties")
|
|
end
|
|
|
|
for i,p in ipairs(publicProperties) do
|
|
if p == "width" then
|
|
str = str.."instance:resize(width or instance.width)\n"
|
|
elseif p == "height" then
|
|
str = str.."instance:resize(nil, height or instance.height)\n"
|
|
elseif p == "x" then
|
|
str = str.."instance:move(x or instance.x)\n" -- "or instance.x1" is already done by API when provided with nil value
|
|
elseif p == "y" then
|
|
str = str.."instance:move(nil, y or instance.y)\n"
|
|
else
|
|
str = str.."instance."..p.." = "..p.." or instance."..p.."\n"
|
|
end
|
|
end
|
|
|
|
table.insert(publicProperties,1,"self")
|
|
|
|
local fStr = [[
|
|
return function(]]..table.concat(publicProperties,",")..[[)
|
|
local instance = shapescape.utils.instantiate(self)
|
|
if instance.name then
|
|
instance.class = instance.name
|
|
instance.name = nil
|
|
end
|
|
]]..str..[[
|
|
for k,v in pairs(properties or {}) do
|
|
instance[k] = v
|
|
end
|
|
instance.isClass = nil
|
|
return instance
|
|
end]]
|
|
|
|
local func,err = load(fStr,"@instantiate",nil,{shapescape=shapescape,pairs=pairs})
|
|
if func then
|
|
obj.instantiate = func()
|
|
else
|
|
_G.debugstr = fStr
|
|
error(err,0)
|
|
end
|
|
if obj.name then
|
|
scape.variables[obj.name] = obj
|
|
end
|
|
end
|
|
|
|
tAPI.instantiateTo = function(self, target, ...)
|
|
if not self.instantiate then
|
|
self:initialize()
|
|
end
|
|
return target:addObject(self:instantiate(...))
|
|
end
|
|
|
|
class.convertToClass = function(self, publicProperties, posProperties)
|
|
publicProperties = publicProperties or {}
|
|
if self.active then
|
|
error("Cannot convert active objects",2)
|
|
end
|
|
local sl = self:getSlide()
|
|
if sl then
|
|
-- remove obj from slide
|
|
self:destroy(false)
|
|
end
|
|
setmetatable(self, {__index=tAPI})
|
|
self.isClass = true
|
|
self.publicProperties = publicProperties
|
|
local coords = {}
|
|
if posProperties == 1 or posProperties == nil then -- if posProperties is false then no position
|
|
coords = {"x1","y1","x2","y2"}
|
|
elseif posProperties == 2 then
|
|
coords = {"x","y","width","height"}
|
|
elseif posProperties == 3 then
|
|
coords = {"x","y"}
|
|
elseif posProperties == 4 then
|
|
coords = {"width","height"}
|
|
end
|
|
for i,c in ipairs(coords) do
|
|
if not shapescape.utils.locateEntry(publicProperties, c) then
|
|
table.insert(publicProperties, i, c)
|
|
end
|
|
end
|
|
table.insert(self:getScape().classes,self)
|
|
if self:getScape().active then
|
|
self:initialize()
|
|
end
|
|
end
|
|
|
|
tAPI.convertToObject = function(self,slide)
|
|
self.publicProperties = nil
|
|
self.isClass = nil
|
|
for k,v in ipairs(self:getScape().classes) do
|
|
if v == self then
|
|
table.remove(self:getScape().classes,k)
|
|
end
|
|
end
|
|
slide:addObject(self)
|
|
end
|
|
|
|
tAPI.destroy = function(self)
|
|
-- remove from classes
|
|
for k,v in ipairs(scape.classes) do
|
|
if v == self then
|
|
table.remove(scape.classes,k)
|
|
end
|
|
end
|
|
shapescape.generic.destroy(self)
|
|
end
|
|
|
|
class.load = function(classObj)
|
|
setmetatable(classObj, {__index=tAPI})
|
|
if classObj.children then
|
|
for i,child in ipairs(classObj.children) do
|
|
shapescape.loadObject(child)
|
|
child.parent = classObj
|
|
child.id = i
|
|
end
|
|
end
|
|
end
|
|
|
|
return class |