From c36c9d0a335f9dffd1baddced837557b4a669a79 Mon Sep 17 00:00:00 2001 From: Pixel Date: Wed, 23 Dec 2009 17:17:07 +0100 Subject: A few bugfixes, and adding the template system. --- dalos.lua | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 7 deletions(-) (limited to 'dalos.lua') diff --git a/dalos.lua b/dalos.lua index c966436..cfe96c0 100644 --- a/dalos.lua +++ b/dalos.lua @@ -41,8 +41,8 @@ function dalos:register_obj(name, constructor, category) end table.insert(self.objectstypes, { name = name, constructor = constructor, counter = 1, category = category }) self.objectstypes_by_name[name] = #self.objectstypes - if self.activemenu then - self.activemenu:update_objects() + if self.active_menu then + self.active_menu:update_objects() end end @@ -523,6 +523,7 @@ dalosp.menu = { action_load = function (self) local dlg = iup.filedlg { dialogtype = "Open", + filter = "*.dalos" } iup.Popup(dlg) if dlg.status == -1 then return end @@ -598,6 +599,7 @@ dalosp.menu = { local save = { objects = s_obj, links = s_links, cross = s_cross, imports = dalosp.imports } local dlg = iup.filedlg { dialogtype = "Save", + dalos = "*.dalos", } iup.Popup(dlg) if dlg.status ~= -1 then @@ -608,6 +610,8 @@ dalosp.menu = { v:write "if dalos.version.MAJOR < version.MAJOR or dalos.version.MAJOR == version.MAJOR and dalos.version.MINOR < version.MINOR then error 'Dalos version too old for this save.' end\n\nlocal " dumpvars(v, save, "save") v:write "return save" + else + error("Failed opening " .. dlg.value .. " for writing") end end @@ -627,10 +631,12 @@ dalosp.menu = { action_import = function (self) local dlg = iup.filedlg { dialogtype = "Open", + filter = "*.lua", } iup.Popup(dlg) if dlg.status == -1 then return end + local d = dalos.active_canvas dalosp.menu.load_file(dlg.value) d:setstatus(dalos.stypes.INFO, "Properly imported") end, @@ -644,6 +650,30 @@ dalosp.menu = { d:setstatus(dalos.stypes.INFO, "Properly reloaded all imported files") end, + action_load_template = function (self) + local dlg = iup.filedlg { + dialogtype = "Open", + filter = "*.dtpl", + } + 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, otype, tname = f() + + local tobj = dalos.objectstypes_by_name[otype] + if not tobj then error("Unknown template object type: " .. otype) end + tobj = dalos.objectstypes[tobj] + + dalos:register_obj(otype .. "::" .. tname, function(d, tab) tobj.constructor(d, tab, data) end, "Template") + local d = dalos.active_canvas + + d:setstatus(dalos.stypes.INFO, "Template properly loaded") + end, + action_exit = function (self) return iup.CLOSE end, @@ -661,10 +691,11 @@ dalosp.menu = { end, update_objects = function (self) - if dalos.dlg then - local newmenu = dalos.menu {} + local d = dalos.active_canvas + if d and d.dialog then + local newmenu = dalos.menu(dalos.active_canvas) -- copy anything from self to newmenu ? *shrug* - dalos.dlg.menu = newmenu + d.dialog.menu = newmenu end end, @@ -696,6 +727,8 @@ dalosp.menu = { item_import.action = dalosp.menu.action_import local item_reload = iup.item { title = "Reload all" } item_reload.action = dalosp.menu.action_reload + local item_load_template = iup.item { title = "Load Template" } + item_load_template.action = dalosp.menu.action_load_template local item_exit = iup.item { title = "Exit" } item_exit.action = dalosp.menu.action_exit local item_about = iup.item { title = "About" } @@ -760,7 +793,7 @@ dalosp.menu = { table.insert(east_menu, 1, iup.submenu { iup.menu(east_submenus[v]), title = v }) table.insert(west_menu, 1, iup.submenu { iup.menu(west_submenus[v]), title = v }) end - local menu_file = iup.submenu { iup.menu { item_new, item_load, item_save, iup.separator {}, item_import, item_reload, iup.separator {}, item_exit }, title = "File" } + local menu_file = iup.submenu { iup.menu { item_new, item_load, item_save, iup.separator {}, item_import, item_reload, iup.separator {}, item_load_template, iup.separator {}, item_exit }, title = "File" } local menu_add = iup.submenu { iup.menu(add_menu), title = "Add" } local menu_cross = iup.submenu { iup.menu { iup.submenu { iup.menu(north_menu), title = "North" }, @@ -861,6 +894,28 @@ dalosp.object = { return {} end, + save_template = function (self, template) + local dlg = iup.filedlg { + dialogtype = "Save", + filter = "*.dtpl", + } + iup.Popup(dlg) + if dlg.status == -1 then return end + local s, name, v + s, name = iup.GetParam("Export template", nil, "Template name: %s\n", "") + if not s then return end + s, v = pcall(Output, dlg.value) + if s then + v:write "---- Dalos template\nlocal " + dumpvars(v, dalos.version, "version") + v:write "if dalos.version.MAJOR < version.MAJOR or dalos.version.MAJOR == version.MAJOR and dalos.version.MINOR < version.MINOR then error 'Dalos version too old for this save.' end\n\nlocal " + dumpvars(v, template, "template") + v:write("return template, '" .. self.ntype .. "', '" .. name .. "'") + else + error("Failed opening " .. dlg.value .. " for writing") + end + end, + create = function (dcanvas, tab, extra) if not tab then tab = {} end if not tab.name then @@ -895,6 +950,7 @@ dalosp.object = { get_settings = tab.get_settings or dalosp.object.default_get_settings, houtputs = {}, get_linked_input = dalosp.object.get_linked_input, + save_template = dalosp.object.save_template, dcanvas = dcanvas, } @@ -980,7 +1036,7 @@ function dalos:main() dlg = iup.dialog { iup.vbox { d, s }, title = "Dalos", menu = m, size = "400x250" } - self.dialog = dlg + d.dialog = dlg d:setstatus(dalos.stypes.INFO, "Dalos version " .. dalos.version.string .. " started") -- cgit v1.2.3