summaryrefslogtreecommitdiff
path: root/dalos.lua
diff options
context:
space:
mode:
authorPixel <pixel@nobis-crew.org>2009-12-21 00:18:36 +0100
committerPixel <pixel@nobis-crew.org>2009-12-21 00:18:36 +0100
commit85d327879aafffcf0f3c811195cbdd07aa6eda7b (patch)
treea10956d57684c9f7d72b14de14129704f87d65ba /dalos.lua
parent3bf6f4ddfbcd61b28e918312090db8322d7ecc91 (diff)
Fixing and finishing up serialization.
Diffstat (limited to 'dalos.lua')
-rw-r--r--dalos.lua73
1 files changed, 60 insertions, 13 deletions
diff --git a/dalos.lua b/dalos.lua
index e226faf..7f554d1 100644
--- a/dalos.lua
+++ b/dalos.lua
@@ -18,7 +18,7 @@ dalosp.cross = { }
function dalos:register_obj(name, constructor)
if self.objectstypes_by_name[name] then
- error("An object of that name already exists: " .. name)
+ error("An object type of that name already exists: " .. name)
end
table.insert(self.objectstypes, { name = name, constructor = constructor, counter = 1 })
self.objectstypes_by_name[name] = #self.objectstypes
@@ -27,6 +27,18 @@ function dalos:register_obj(name, constructor)
end
end
+function dalos:clean()
+ local d = dalos.active_canvas
+ for k, v in ipairs(d.objects) do
+ for ind = 1, v.obj.noutputs do
+ d:destroylink(v, ind)
+ end
+ end
+
+ while #d.objects ~= 0 do table.remove(d.objects) end
+ d.objects = {}
+end
+
dalosp.canvas = {
DARK_WHITE = cd.EncodeColor(224, 224, 224),
BEZIER_CTRL_LEN = 40,
@@ -243,9 +255,11 @@ dalosp.canvas = {
end
end,
- createlink = function (self, src, dst)
- local oldsrc = src.obj.outputs[src.obj.curoutput]
- local olddst = dst.obj.inputs[dst.obj.curinput]
+ createlink = function (self, src, dst, srcind, dstind)
+ if not srcind then srcind = src.obj.curoutput end
+ if not dstind then dstind = dst.obj.curinput end
+ local oldsrc = src.obj.outputs[srcind]
+ local olddst = dst.obj.inputs[dstind]
if oldsrc then
oldsrc.obj.obj.inputs[oldsrc.ind] = nil
oldsrc.obj.obj:input_change(oldsrc.ind)
@@ -254,17 +268,18 @@ dalosp.canvas = {
olddst.obj.obj.outputs[olddst.ind] = nil
olddst.obj.obj:output_change(olddst.ind)
end
- src.obj.outputs[src.obj.curoutput] = { obj = dst, ind = dst.obj.curinput }
- dst.obj.inputs[dst.obj.curinput] = { obj = src, ind = src.obj.curoutput }
- src.obj:output_change(src.obj.curoutput)
- dst.obj:input_change(dst.obj.curinput)
+ src.obj.outputs[src.obj.curoutput] = { obj = dst, ind = dstind }
+ dst.obj.inputs[dst.obj.curinput] = { obj = src, ind = srcind }
+ src.obj:output_change(srcind)
+ dst.obj:input_change(dstind)
end,
- destroylink = function (self, src)
- local oldsrc = src.obj.outputs[src.obj.curoutput]
+ destroylink = function (self, src, ind)
+ if not ind then ind = src.obj.curoutput end
+ local oldsrc = src.obj.outputs[ind]
if oldsrc then
- src.obj.outputs[src.obj.curoutput] = nil
- src.obj:output_change(src.obj.curoutput)
+ src.obj.outputs[ind] = nil
+ src.obj:output_change(ind)
oldsrc.obj.obj.inputs[oldsrc.ind] = nil
oldsrc.obj.obj:input_change(oldsrc.ind)
@@ -424,6 +439,39 @@ dalosp.canvas = {
dalosp.menu = {
action_load = function (self)
+ local dlg = iup.filedlg {
+ dialogtype = "Open",
+ }
+ iup.Popup(dlg)
+ if dlg.status == -1 then return end
+
+ local s, v = pcall(Input, dlg.value)
+ if not s then error("Problem loading file " .. dlg.value) end
+ local f = preload(v)
+ if not f then error("Syntax error loading file " .. dlg.value) end
+ local data = f()
+ local tlup = dalos.objectstypes_by_name
+ local ot = dalos.objectstypes
+ local d = dalos.active_canvas
+ local lup = {}
+ for k, v in ipairs(data.objects) do
+ if not tlup[v.ntype] then error("Object " .. v.ntype .. " isn't declared") end
+ end
+ dalos:clean()
+ for k, v in ipairs(data.objects) do
+ local tab = { x = v.x, y = v.y, name = v.name }
+ local o = ot[tlup[v.ntype]].constructor(d, tab, v.settings)
+ for iobj, obj in ipairs(d.objects) do
+ if obj.obj == o then
+ lup[iobj] = obj
+ end
+ end
+ end
+ for k, v in ipairs(data.links) do
+ if not lup[v.src] then error("Can't find object for id src " .. v.src) end
+ if not lup[v.dst] then error("Can't find object for id dst " .. v.dst) end
+ d:createlink(lup[v.src], lup[v.dst], v.isrc, v.idst)
+ end
end,
action_save = function(self)
@@ -452,7 +500,6 @@ dalosp.menu = {
}
iup.Popup(dlg)
if dlg.status ~= -1 then
- print(dlg.value)
local s, v = pcall(Output, dlg.value)
if s then
v:write "local "