summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPixel <pixel@nobis-crew.org>2009-12-28 14:05:16 +0100
committerPixel <pixel@nobis-crew.org>2009-12-28 14:05:16 +0100
commitdd4d0d5131f3cd079ec052a058c7f2ad19130348 (patch)
tree89655a7c8e156dadf58681c710cb8fb13a8fa783
parent28bddffd5991251e2c69b60b3c7d9c551043784e (diff)
Adding textviewer, and doing a few minor tweaks.
-rw-r--r--dalos-luafilter.lua2
-rw-r--r--dalos-struct.lua1077
-rw-r--r--dalos-textview.lua52
-rw-r--r--dalos.lua21
4 files changed, 615 insertions, 537 deletions
diff --git a/dalos-luafilter.lua b/dalos-luafilter.lua
index 9c87f93..297441e 100644
--- a/dalos-luafilter.lua
+++ b/dalos-luafilter.lua
@@ -120,7 +120,7 @@ end
local bok = iup.button { title = "Ok", action = function () okay = true return iup.CLOSE end }
local bimport = iup.button { title = "Import", action = function() self:load_template() return iup.CLOSE end }
local bexport = iup.button { title = "Export", action = function() self:save_template(self:gen_template()) end }
- local busetpl = iup.button { title = "Use Template", action = function() self:use_template() end }
+ local busetpl = iup.button { title = "Use Template", action = function() self:use_template(dalosp.luafilter.templates) end }
local bcancel = iup.button { title = "Cancel", action = function () okay = false return iup.CLOSE end }
local dlg = iup.dialog { iup.vbox { text, iup.hbox { bok, bimport, bexport, busetpl, iup.fill{}, bcancel, normalizesize = "Horizontal" } }, title = "Code for " .. self.name, size = "600x300" }
local r = dlg:popup()
diff --git a/dalos-struct.lua b/dalos-struct.lua
index 3e72871..84e9699 100644
--- a/dalos-struct.lua
+++ b/dalos-struct.lua
@@ -1,530 +1,547 @@
-local function imLoadImage(fname)
- local f = im.FileOpen(fname)
- local r = f:LoadImage()
- f:Close()
- return r
-end
-
-dalosp.struct = {
- templates = {},
-
- images = {
- up = imLoadImage "12-em-up.tga",
- down = imLoadImage "12-em-down.tga",
- cross = imLoadImage "12-em-cross.tga",
- plus = imLoadImage "12-em-plus.tga",
- },
-
- types = {
- "int8",
- "uint8",
- "int16",
- "uint16",
- "int32",
- "uint32",
- "int64",
- "uint64",
- "float",
- "double",
- "nascii",
- "asciiz",
- },
-
- rtypes = {
- int8 = 1,
- uint8 = 2,
- int16 = 3,
- uint16 = 4,
- int32 = 5,
- uint32 = 6,
- int64 = 7,
- uint64 = 8,
- float = 9,
- double = 10,
- nascii = 11,
- asciiz = 12,
- },
-
- typessizes = {
- 1, 1, 2, 2, 4, 4, 8, 8, 4, 8, 1, -1,
- },
-
- get_settings = function (self)
- return { entries = self.extra.entries }
- end,
-
- configure = function (self)
- self.cfg_dlg:show()
- end,
-
- activate = function (self)
- self.act_dlg:show()
- end,
-
- input_change = function (self, ind)
- if ind == 1 then self:update_values() end
- end,
-
- offset = function (self, lin)
- local cache = self.extra.cache
- return cache[lin]
- end,
-
- read_value = function (self, h, t, flags, size)
- local v
-
- if t == "int8" then
- return h:read8()
- elseif t == "uint8" then
- return h:readU8()
- elseif t == "int16" then
- return h:read16()
- elseif t == "uint16" then
- return h:readU16()
- elseif t == "int32" then
- return h:read32()
- elseif t == "uint32" then
- return h:readU32()
- elseif t == "int64" then
- return h:read64()
- elseif t == "uint64" then
- return h:readU64()
- elseif t == "float" then
- return h:readFloat()
- elseif t == "double" then
- return h:readDouble()
- elseif t == "asciiz" then
- v = ""
- local b
- repeat
- b = h:readU8()
- if b ~= 0 then v = v .. string.char(b) end
- until b == 0
- return v
- elseif t == "nascii" then
- return h:readstring(size)
- end
-
- return 0
- end,
-
- update_values = function (self)
- local h = self:get_linked_input(1)
- self.extra.values = {}
- self.extra.values_by_name = {}
- if h and h:getsize() >= self.extra.size then
- h:seek(0)
- local v, s, t
- for e, f in ipairs(self.extra.entries) do
- s = f.size
- if not tonumber(s) then
- s = self.extra.values_by_name[s]
- end
- t = dalosp.struct.types[f.type]
- if t == "asciiz" or t == "nascii" or s == 1 then
- v = self:read_value(h, t, f.flags, s)
- else
- v = {}
- for i = 1, f.size do
- v[i] = self:read_value(h, t, f.flags, s)
- end
- end
- self.extra.values[e] = v
- self.extra.values_by_name[f.name] = v
- end
- end
- end,
-
- cacheoffset = function (self)
- local entries = self.extra.entries
- self.extra.cache = {}
- local cache = self.extra.cache
- local offset = 0
- local got_var = false
- local ssize
- local vsize
-
- for i, v in ipairs(entries) do
- ssize = dalosp.struct.typessizes[v.type]
- vsize = ssize == -1 or type(v.size) ~= "number"
- if vsize then got_var = true end
- if got_var then
- cache[i] = -1
- else
- cache[i] = offset
- end
- if not vsize then offset = offset + ssize * v.size end
- end
- self.extra.size = offset
- if self.cfg_dlg then
- self.cfg_dlg.mx.redraw = "C10"
- self.cfg_dlg.lsize.title = offset
- self:update_values()
- self.act_dlg.mx.numlin = #entries
- self.act_dlg.mx.numlin_visible = #entries
- self.act_dlg.mx.redraw = "All"
- end
- end,
-
- isunique = function (self, name)
- for _, v in ipairs(self.extra.entries) do
- if name == v.name then return false end
- end
- return true
- end,
-
- getunique = function (self, lin)
- local newname = "Field" .. lin
- local base_newname = newname
- local i = 1
- while not self:isunique(newname) do
- newname = base_newname .. "." .. i
- i = i + 1
- end
- return newname
- end,
-
- insert_line = function (self, lin)
- if not lin then lin = (#self.extra.entries + 1) end
- local name = self:getunique(lin)
- table.insert(self.extra.entries, lin, { name = name, type = 1, size = 1 })
- self:cacheoffset()
- local mx = self.cfg_dlg.mx
- mx.numlin = mx.numlin + 1
- mx.numlin_visible = mx.numlin_visible + 1
- end,
-
- remove_line = function (self, lin)
- table.remove(self.extra.entries, lin)
- self:cacheoffset()
- local mx = self.cfg_dlg.mx
- mx.numlin = mx.numlin - 1
- mx.numlin_visible = mx.numlin_visible - 1
- end,
-
- line_up = function (self, lin)
- if lin == 1 then return iup.DEFAULT end
- local entries = self.extra.entries
- local old_lin = entries[lin]
- table.remove(entries, lin)
- table.insert(entries, lin - 1, old_lin)
- self:cacheoffset()
- local mx = self.cfg_dlg.mx
- mx.redraw = "L" .. (lin - 1)
- mx.redraw = "L" .. lin
- end,
-
- line_down = function (self, lin)
- local entries = self.extra.entries
- if lin == #entries then return iup.DEFAULT end
- local old_lin = entries[lin]
- table.remove(entries, lin)
- table.insert(entries, lin + 1, old_lin)
- self:cacheoffset()
- local mx = self.cfg_dlg.mx
- mx.redraw = "L" .. lin
- mx.redraw = "L" .. (lin + 1)
- end,
-
- gen_template = function (self)
- return self:get_settings()
- end,
-
- apply_template = function (self, data)
- self.extra.entries = data.entries
- self:cacheoffset()
- end,
-
- get_field_value = function (self, lin)
- local v = self.extra.values[lin]
- if type(v) == "table" then
- local r = nil
- for k, sv in ipairs(v) do
- if not r then
- r = sv
- else
- r = r .. ", " .. sv
- end
- end
-
- return "[" .. (r or " ") .."]"
- else
- return v or ""
- end
- end,
-
- cfg_draw_cb = function (self, lin, col, x1, x2, y1, y2, cv)
- if col == 1 then
- dalosp.struct.images.plus:cdCanvasPutImageRect(cv, x1 + 3, y2 + 5, 12, 12, 0, 12, 0, 12)
- return iup.DEFAULT
- elseif col == 2 and lin ~= 0 then
- dalosp.struct.images.cross:cdCanvasPutImageRect(cv, x1 + 3, y2 + 5, 12, 12, 0, 12, 0, 12)
- return iup.DEFAULT
- elseif col == 3 and lin ~= 0 and lin ~= 1 then
- dalosp.struct.images.up:cdCanvasPutImageRect(cv, x1 + 3, y2 + 5, 12, 12, 0, 12, 0, 12)
- return iup.DEFAULT
- elseif col == 4 and lin ~= 0 and lin ~= #self.struct.extra.entries then
- dalosp.struct.images.down:cdCanvasPutImageRect(cv, x1 + 3, y2 + 5, 12, 12, 0, 12, 0, 12)
- return iup.DEFAULT
- end
-
- return iup.IGNORE
- end,
-
- cfg_click_cb = function (self, lin, col, status)
- if col == 1 and lin == 0 then return self.struct:insert_line() end
- if lin == 0 then return iup.DEFAULT end
-
- if col == 1 then
- self.struct:insert_line(lin)
- elseif col == 2 then
- self.struct:remove_line(lin)
- elseif col == 3 then
- self.struct:line_up(lin)
- elseif col == 4 then
- self.struct:line_down(lin)
- elseif col == 11 then
- -- edit flags
- end
- end,
-
- cfg_value_cb = function (self, lin, col)
- if lin == 0 then
- if col == 5 then
- return "Name"
- elseif col == 6 then
- return "Type"
- elseif col == 7 then
- return "Size"
- elseif col == 8 then
- return "Enum"
- elseif col == 9 then
- return "Value Check"
- elseif col == 10 then
- return "Offset"
- elseif col == 11 then
- return "Flags"
- end
- return ""
- end
-
- local entries = self.struct.extra.entries
-
- if col == 5 then
- return entries[lin].name
- elseif col == 6 then
- return dalosp.struct.types[entries[lin].type]
- elseif col == 7 then
- return entries[lin].size
- elseif col == 10 then
- local off = self.struct:offset(lin)
- if off == -1 then return "" end
- return off
- elseif col == 11 then
- -- flags
- end
-
- return ""
- end,
-
- cfg_value_edit_cb = function (self, lin, col, newval)
- local entries = self.struct.extra.entries
-
- if col == 5 then
- entries[lin].name = newval
- elseif col == 6 then
- entries[lin].type = dalosp.struct.rtypes[newval]
- self.struct:cacheoffset()
- elseif col == 7 then
- local nnewval = tonumber(newval)
- if nnewval then newval = nnewval end
- entries[lin].size = newval
- self.struct:cacheoffset()
- elseif col == 8 then
- -- enum
- elseif col == 9 then
- -- value check
- end
- self.struct.act_dlg.mx.redraw = "All"
- end,
-
- cfg_dropcheck_cb = function (self, lin, col)
- return col == 6 and iup.DEFAULT or iup.IGNORE
- end,
-
- cfg_edition_cb = function (self, lin, col, mode, update)
- if mode == 1 then
- return (col >= 5 and col <= 7) and iup.DEFAULT or iup.IGNORE
- else
- local newval = self.value
- if update == 0 then return iup.DEFAULT end
- if col == 5 then
- if not self.struct:isunique(newval) then return iup.IGNORE end
- elseif col == 6 then
- -- do a check on the dropdown ? I don't think so
- elseif col == 7 then
- if not tonumber(newval) and self.struct:isunique(newval) then return iup.IGNORE end
- elseif col == 8 then
- -- enum
- elseif col == 9 then
- -- value check
- end
- return iup.DEFAULT
- end
- end,
-
- cfg_drop_cb = function (self, drop, lin, col)
- if col ~= 6 then return iup.IGNORE end
-
- for i, v in ipairs(dalosp.struct.types) do
- drop[i] = v
- end
- drop.value = self.previousvalue
- drop.visible_items = 15
-
- return iup.DEFAULT
- end,
-
- act_value_cb = function (self, lin, col)
- if lin == 0 then if col == 1 then return "Field" elseif col == 2 then return "Value" end end
- if col == 0 then return nil end
-
- local entry = self.struct.extra.entries[lin]
-
- if col == 1 then
- return entry.name
- else
- return self.struct:get_field_value(lin)
- end
- end,
-
- act_click_cb = function (self, lin, col, status)
-
- end,
-
- create = function (d, tab, settings)
- tab.ninputs = 2
- tab.noutputs = 2
- tab.otype = dalos.objtype.LUA_VIEWER
- tab.configure = dalosp.struct.configure
- tab.activate = dalosp.struct.activate
- tab.input_change = dalosp.struct.input_change
- tab.get_settings = dalosp.struct.get_settings
- tab.draw = function (self, cv, x, y, w, h)
- dalosp.object.default_draw(self, cv, x, y, w, h)
- end
- tab.default_name = "Struct"
- tab.ntype = "Struct"
-
- local extra = { }
- if not settings then settings = {} end
- extra.entries = settings.entries or {}
-
- local obj = dalos.object(d, tab, extra)
-
- obj.insert_line = dalosp.struct.insert_line
- obj.remove_line = dalosp.struct.remove_line
- obj.line_up = dalosp.struct.line_up
- obj.line_down = dalosp.struct.line_down
- obj.offset = dalosp.struct.offset
- obj.cacheoffset = dalosp.struct.cacheoffset
- obj.isunique = dalosp.struct.isunique
- obj.getunique = dalosp.struct.getunique
- obj.gen_template = dalosp.struct.gen_template
- obj.apply_template = dalosp.struct.apply_template
- obj.get_field_value = dalosp.struct.get_field_value
- obj.update_values = dalosp.struct.update_values
- obj.read_value = dalosp.struct.read_value
-
- obj:cacheoffset()
-
- local cmx = iup.matrix {
- numcol = 11,
- numcol_visible = 11,
- usetitlesize = "Yes",
- rasterwidth1 = 12,
- rasterwidth2 = 12,
- rasterwidth3 = 12,
- rasterwidth4 = 12,
- rasterwidth5 = 120,
- rasterwidth6 = 80,
- rasterwidth7 = 80,
- rasterwidth8 = 80,
- rasterwidth9 = 120,
- rasterwidth10 = 40,
- rasterwidth11 = 60,
- resizematrix = "Yes",
- readonly = "No",
- struct = obj,
- draw_cb = dalosp.struct.cfg_draw_cb,
- value_cb = dalosp.struct.cfg_value_cb,
- value_edit_cb = dalosp.struct.cfg_value_edit_cb,
- dropcheck_cb = dalosp.struct.cfg_dropcheck_cb,
- drop_cb = dalosp.struct.cfg_drop_cb,
- edition_cb = dalosp.struct.cfg_edition_cb,
- click_cb = dalosp.struct.cfg_click_cb,
- }
- local amx = iup.matrix {
- numcol = 2,
- numcol_visible = 2,
- usetitlesize = "Yes",
- rasterwidth1 = 120,
- rasterwidth2 = 120,
- readonly = "Yes",
- resizematrix = "Yes",
- struct = obj,
- value_cb = dalosp.struct.act_value_cb,
- click_cb = dalosp.struct.act_click_cb,
- }
- local lsize = iup.label { title = "0", expand = "Horizontal", }
-
- obj.cfg_dlg = iup.dialog {
- iup.vbox {
- iup.hbox {
- iup.label { title = "Struct size: " },
- lsize,
- },
- cmx,
- iup.hbox {
- iup.fill {},
- iup.button {
- title = "Ok",
- action = function (self) return iup.CLOSE end,
- },
- iup.button {
- title = "Import",
- action = function() obj:load_template() return iup.CLOSE end,
- },
- iup.button {
- title = "Export",
- action = function() obj:save_template(self:gen_template()) end,
- },
- iup.button {
- title = "Use Template",
- action = function() obj:use_template() end,
- },
- iup.fill {},
- },
- },
-
- size = "500x220",
- mx = cmx,
- lsize = lsize
- }
-
- obj.act_dlg = iup.dialog {
- amx,
- size = "250x120",
- mx = amx,
- }
-
- return obj
- end,
-
- register_template = function (data, tname)
- dalosp.struct.templates[tname] = data
- end,
-}
-
-dalos.struct = dalosp.struct.create
-dalos:register_obj("Struct", dalos.struct, "Programmable", dalosp.struct.register_template)
+local function imLoadImage(fname)
+ local f = im.FileOpen(fname)
+ local r = f:LoadImage()
+ f:Close()
+ return r
+end
+
+dalosp.struct = {
+ templates = {},
+
+ images = {
+ up = imLoadImage "12-em-up.tga",
+ down = imLoadImage "12-em-down.tga",
+ cross = imLoadImage "12-em-cross.tga",
+ plus = imLoadImage "12-em-plus.tga",
+ },
+
+ types = {
+ "int8",
+ "uint8",
+ "int16",
+ "uint16",
+ "int32",
+ "uint32",
+ "int64",
+ "uint64",
+ "float",
+ "double",
+ "nascii",
+ "asciiz",
+ },
+
+ rtypes = {
+ int8 = 1,
+ uint8 = 2,
+ int16 = 3,
+ uint16 = 4,
+ int32 = 5,
+ uint32 = 6,
+ int64 = 7,
+ uint64 = 8,
+ float = 9,
+ double = 10,
+ nascii = 11,
+ asciiz = 12,
+ },
+
+ typessizes = {
+ 1, 1, 2, 2, 4, 4, 8, 8, 4, 8, 1, -1,
+ },
+
+ get_settings = function (self)
+ return { entries = self.extra.entries }
+ end,
+
+ configure = function (self)
+ self.cfg_dlg:show()
+ end,
+
+ activate = function (self)
+ self.act_dlg:show()
+ end,
+
+ input_change = function (self, ind)
+ if ind == 1 then self:update_values() end
+ if ind == 2 then
+
+ end
+ end,
+
+ offset = function (self, lin)
+ local cache = self.extra.cache
+ return cache[lin]
+ end,
+
+ read_value = function (self, h, t, flags, size)
+ local v
+
+ if t == "int8" then
+ return h:read8()
+ elseif t == "uint8" then
+ return h:readU8()
+ elseif t == "int16" then
+ return h:read16()
+ elseif t == "uint16" then
+ return h:readU16()
+ elseif t == "int32" then
+ return h:read32()
+ elseif t == "uint32" then
+ return h:readU32()
+ elseif t == "int64" then
+ return h:read64()
+ elseif t == "uint64" then
+ return h:readU64()
+ elseif t == "float" then
+ return h:readFloat()
+ elseif t == "double" then
+ return h:readDouble()
+ elseif t == "asciiz" then
+ v = ""
+ local b
+ repeat
+ b = h:readU8()
+ if b ~= 0 then v = v .. string.char(b) end
+ until b == 0
+ return v
+ elseif t == "nascii" then
+ return h:readstring(size)
+ end
+
+ return 0
+ end,
+
+ update_values = function (self)
+ local h = self:get_linked_input(1)
+ self.extra.values = {}
+ self.extra.values_by_name = {}
+ if h and h:getsize() >= self.extra.size then
+ h:seek(0)
+ local v, s, t
+ for e, f in ipairs(self.extra.entries) do
+ s = f.size
+ if not tonumber(s) then
+ s = self.extra.values_by_name[s]
+ end
+ t = dalosp.struct.types[f.type]
+ if t == "asciiz" or t == "nascii" or s == 1 then
+ v = self:read_value(h, t, f.flags, s)
+ else
+ v = {}
+ for i = 1, f.size do
+ v[i] = self:read_value(h, t, f.flags, s)
+ end
+ end
+ self.extra.values[e] = v
+ self.extra.values_by_name[f.name] = v
+ end
+ self:output_selected()
+ local b = Buffer(true)
+
+ ---- filling in the output structure in b
+ self:set_houtput(b, 2)
+ else
+ self:set_houtput(nil, 1)
+ self:set_houtput(nil, 2)
+ end
+ end,
+
+ output_selected = function (self)
+ end,
+
+ cacheoffset = function (self)
+ local entries = self.extra.entries
+ self.extra.cache = {}
+ local cache = self.extra.cache
+ local offset = 0
+ local got_var = false
+ local ssize
+ local vsize
+
+ for i, v in ipairs(entries) do
+ ssize = dalosp.struct.typessizes[v.type]
+ vsize = ssize == -1 or type(v.size) ~= "number"
+ if vsize then got_var = true end
+ if got_var then
+ cache[i] = -1
+ else
+ cache[i] = offset
+ end
+ if not vsize then offset = offset + ssize * v.size end
+ end
+ self.extra.size = offset
+ if self.cfg_dlg then
+ self.cfg_dlg.mx.redraw = "C10"
+ self.cfg_dlg.lsize.title = offset
+ self:update_values()
+ self.act_dlg.mx.numlin = #entries
+ self.act_dlg.mx.numlin_visible = #entries
+ self.act_dlg.mx.redraw = "All"
+ end
+ end,
+
+ isunique = function (self, name)
+ for _, v in ipairs(self.extra.entries) do
+ if name == v.name then return false end
+ end
+ return true
+ end,
+
+ getunique = function (self, lin)
+ local newname = "Field" .. lin
+ local base_newname = newname
+ local i = 1
+ while not self:isunique(newname) do
+ newname = base_newname .. "." .. i
+ i = i + 1
+ end
+ return newname
+ end,
+
+ insert_line = function (self, lin)
+ if not lin then lin = (#self.extra.entries + 1) end
+ local name = self:getunique(lin)
+ table.insert(self.extra.entries, lin, { name = name, type = 1, size = 1 })
+ self:cacheoffset()
+ local mx = self.cfg_dlg.mx
+ mx.numlin = mx.numlin + 1
+ mx.numlin_visible = mx.numlin_visible + 1
+ end,
+
+ remove_line = function (self, lin)
+ table.remove(self.extra.entries, lin)
+ self:cacheoffset()
+ local mx = self.cfg_dlg.mx
+ mx.numlin = mx.numlin - 1
+ mx.numlin_visible = mx.numlin_visible - 1
+ end,
+
+ line_up = function (self, lin)
+ if lin == 1 then return iup.DEFAULT end
+ local entries = self.extra.entries
+ local old_lin = entries[lin]
+ table.remove(entries, lin)
+ table.insert(entries, lin - 1, old_lin)
+ self:cacheoffset()
+ local mx = self.cfg_dlg.mx
+ mx.redraw = "L" .. (lin - 1)
+ mx.redraw = "L" .. lin
+ end,
+
+ line_down = function (self, lin)
+ local entries = self.extra.entries
+ if lin == #entries then return iup.DEFAULT end
+ local old_lin = entries[lin]
+ table.remove(entries, lin)
+ table.insert(entries, lin + 1, old_lin)
+ self:cacheoffset()
+ local mx = self.cfg_dlg.mx
+ mx.redraw = "L" .. lin
+ mx.redraw = "L" .. (lin + 1)
+ end,
+
+ gen_template = function (self)
+ return self:get_settings()
+ end,
+
+ apply_template = function (self, data)
+ self.extra.entries = data.entries
+ self:cacheoffset()
+ end,
+
+ get_field_value = function (self, lin)
+ local v = self.extra.values[lin]
+ if type(v) == "table" then
+ local r = nil
+ for k, sv in ipairs(v) do
+ if not r then
+ r = sv
+ else
+ r = r .. ", " .. sv
+ end
+ end
+
+ return "[" .. (r or " ") .."]"
+ else
+ return v or ""
+ end
+ end,
+
+ cfg_draw_cb = function (self, lin, col, x1, x2, y1, y2, cv)
+ if col == 1 then
+ dalosp.struct.images.plus:cdCanvasPutImageRect(cv, x1 + 3, y2 + 5, 12, 12, 0, 12, 0, 12)
+ return iup.DEFAULT
+ elseif col == 2 and lin ~= 0 then
+ dalosp.struct.images.cross:cdCanvasPutImageRect(cv, x1 + 3, y2 + 5, 12, 12, 0, 12, 0, 12)
+ return iup.DEFAULT
+ elseif col == 3 and lin ~= 0 and lin ~= 1 then
+ dalosp.struct.images.up:cdCanvasPutImageRect(cv, x1 + 3, y2 + 5, 12, 12, 0, 12, 0, 12)
+ return iup.DEFAULT
+ elseif col == 4 and lin ~= 0 and lin ~= #self.struct.extra.entries then
+ dalosp.struct.images.down:cdCanvasPutImageRect(cv, x1 + 3, y2 + 5, 12, 12, 0, 12, 0, 12)
+ return iup.DEFAULT
+ end
+
+ return iup.IGNORE
+ end,
+
+ cfg_click_cb = function (self, lin, col, status)
+ if col == 1 and lin == 0 then return self.struct:insert_line() end
+ if lin == 0 then return iup.DEFAULT end
+
+ if col == 1 then
+ self.struct:insert_line(lin)
+ elseif col == 2 then
+ self.struct:remove_line(lin)
+ elseif col == 3 then
+ self.struct:line_up(lin)
+ elseif col == 4 then
+ self.struct:line_down(lin)
+ elseif col == 11 then
+ -- edit flags
+ end
+ end,
+
+ cfg_value_cb = function (self, lin, col)
+ if lin == 0 then
+ if col == 5 then
+ return "Name"
+ elseif col == 6 then
+ return "Type"
+ elseif col == 7 then
+ return "Size"
+ elseif col == 8 then
+ return "Enum"
+ elseif col == 9 then
+ return "Value Check"
+ elseif col == 10 then
+ return "Offset"
+ elseif col == 11 then
+ return "Flags"
+ end
+ return ""
+ end
+
+ local entries = self.struct.extra.entries
+
+ if col == 5 then
+ return entries[lin].name
+ elseif col == 6 then
+ return dalosp.struct.types[entries[lin].type]
+ elseif col == 7 then
+ return entries[lin].size
+ elseif col == 10 then
+ local off = self.struct:offset(lin)
+ if off == -1 then return "" end
+ return off
+ elseif col == 11 then
+ -- flags
+ end
+
+ return ""
+ end,
+
+ cfg_value_edit_cb = function (self, lin, col, newval)
+ local entries = self.struct.extra.entries
+
+ if col == 5 then
+ entries[lin].name = newval
+ elseif col == 6 then
+ entries[lin].type = dalosp.struct.rtypes[newval]
+ self.struct:cacheoffset()
+ elseif col == 7 then
+ local nnewval = tonumber(newval)
+ if nnewval then newval = nnewval end
+ entries[lin].size = newval
+ self.struct:cacheoffset()
+ elseif col == 8 then
+ -- enum
+ elseif col == 9 then
+ -- value check
+ end
+ self.struct.act_dlg.mx.redraw = "All"
+ end,
+
+ cfg_dropcheck_cb = function (self, lin, col)
+ return col == 6 and iup.DEFAULT or iup.IGNORE
+ end,
+
+ cfg_edition_cb = function (self, lin, col, mode, update)
+ if mode == 1 then
+ return (col >= 5 and col <= 7) and iup.DEFAULT or iup.IGNORE
+ else
+ local newval = self.value
+ if update == 0 then return iup.DEFAULT end
+ if col == 5 then
+ if not self.struct:isunique(newval) then return iup.IGNORE end
+ elseif col == 6 then
+ -- do a check on the dropdown ? I don't think so
+ elseif col == 7 then
+ if not tonumber(newval) and self.struct:isunique(newval) then return iup.IGNORE end
+ elseif col == 8 then
+ -- enum
+ elseif col == 9 then
+ -- value check
+ end
+ return iup.DEFAULT
+ end
+ end,
+
+ cfg_drop_cb = function (self, drop, lin, col)
+ if col ~= 6 then return iup.IGNORE end
+
+ for i, v in ipairs(dalosp.struct.types) do
+ drop[i] = v
+ end
+ drop.value = self.previousvalue
+ drop.visible_items = 15
+
+ return iup.DEFAULT
+ end,
+
+ act_value_cb = function (self, lin, col)
+ if lin == 0 then if col == 1 then return "Field" elseif col == 2 then return "Value" end end
+ if col == 0 then return nil end
+
+ local entry = self.struct.extra.entries[lin]
+
+ if col == 1 then
+ return entry.name
+ else
+ return self.struct:get_field_value(lin)
+ end
+ end,
+
+ act_click_cb = function (self, lin, col, status)
+
+ end,
+
+ create = function (d, tab, settings)
+ tab.ninputs = 2
+ tab.noutputs = 3
+ tab.otype = dalos.objtype.LUA_VIEWER
+ tab.configure = dalosp.struct.configure
+ tab.activate = dalosp.struct.activate
+ tab.input_change = dalosp.struct.input_change
+ tab.get_settings = dalosp.struct.get_settings
+ tab.draw = function (self, cv, x, y, w, h)
+ dalosp.object.default_draw(self, cv, x, y, w, h)
+ end
+ tab.default_name = "Struct"
+ tab.ntype = "Struct"
+
+ local extra = { }
+ if not settings then settings = {} end
+ extra.entries = settings.entries or {}
+
+ local obj = dalos.object(d, tab, extra)
+
+ obj.insert_line = dalosp.struct.insert_line
+ obj.remove_line = dalosp.struct.remove_line
+ obj.line_up = dalosp.struct.line_up
+ obj.line_down = dalosp.struct.line_down
+ obj.offset = dalosp.struct.offset
+ obj.cacheoffset = dalosp.struct.cacheoffset
+ obj.isunique = dalosp.struct.isunique
+ obj.getunique = dalosp.struct.getunique
+ obj.gen_template = dalosp.struct.gen_template
+ obj.apply_template = dalosp.struct.apply_template
+ obj.get_field_value = dalosp.struct.get_field_value
+ obj.update_values = dalosp.struct.update_values
+ obj.read_value = dalosp.struct.read_value
+ obj.output_selected = dalosp.struct.output_selected
+
+ obj:cacheoffset()
+
+ local cmx = iup.matrix {
+ numcol = 11,
+ numcol_visible = 11,
+ usetitlesize = "Yes",
+ rasterwidth1 = 12,
+ rasterwidth2 = 12,
+ rasterwidth3 = 12,
+ rasterwidth4 = 12,
+ rasterwidth5 = 120,
+ rasterwidth6 = 80,
+ rasterwidth7 = 80,
+ rasterwidth8 = 80,
+ rasterwidth9 = 120,
+ rasterwidth10 = 40,
+ rasterwidth11 = 60,
+ resizematrix = "Yes",
+ readonly = "No",
+ struct = obj,
+ draw_cb = dalosp.struct.cfg_draw_cb,
+ value_cb = dalosp.struct.cfg_value_cb,
+ value_edit_cb = dalosp.struct.cfg_value_edit_cb,
+ dropcheck_cb = dalosp.struct.cfg_dropcheck_cb,
+ drop_cb = dalosp.struct.cfg_drop_cb,
+ edition_cb = dalosp.struct.cfg_edition_cb,
+ click_cb = dalosp.struct.cfg_click_cb,
+ }
+ local amx = iup.matrix {
+ numcol = 2,
+ numcol_visible = 2,
+ usetitlesize = "Yes",
+ rasterwidth1 = 120,
+ rasterwidth2 = 120,
+ readonly = "Yes",
+ resizematrix = "Yes",
+ struct = obj,
+ value_cb = dalosp.struct.act_value_cb,
+ click_cb = dalosp.struct.act_click_cb,
+ }
+ local lsize = iup.label { title = "0", expand = "Horizontal", }
+
+ obj.cfg_dlg = iup.dialog {
+ iup.vbox {
+ iup.hbox {
+ iup.label { title = "Struct size: " },
+ lsize,
+ },
+ cmx,
+ iup.hbox {
+ iup.fill {},
+ iup.button {
+ title = "Ok",
+ action = function (self) return iup.CLOSE end,
+ },
+ iup.button {
+ title = "Import",
+ action = function() obj:load_template() return iup.CLOSE end,
+ },
+ iup.button {
+ title = "Export",
+ action = function() obj:save_template(self:gen_template()) end,
+ },
+ iup.button {
+ title = "Use Template",
+ action = function() obj:use_template(dalsop.struct.templates) end,
+ },
+ iup.fill {},
+ },
+ },
+
+ size = "500x220",
+ mx = cmx,
+ lsize = lsize,
+ title = obj.name .. " configuration",
+ }
+
+ obj.act_dlg = iup.dialog {
+ amx,
+ size = "250x120",
+ mx = amx,
+ title = obj.name,
+ }
+
+ return obj
+ end,
+
+ register_template = function (data, tname)
+ dalosp.struct.templates[tname] = data
+ end,
+}
+
+dalos.struct = dalosp.struct.create
+dalos:register_obj("Struct", dalos.struct, "Programmable", dalosp.struct.register_template)
diff --git a/dalos-textview.lua b/dalos-textview.lua
new file mode 100644
index 0000000..496fd26
--- /dev/null
+++ b/dalos-textview.lua
@@ -0,0 +1,52 @@
+dalosp.textview = {
+ get_settings = function (self)
+ return { }
+ end,
+
+ input_change = function (self)
+ local h = self:get_linked_input(1)
+
+ if h then
+ self.extra.txt.value = h:readfile()
+ else
+ self.extra.txt.value = ""
+ end
+ end,
+
+ activate = function (self)
+ self.extra.dlg:show()
+ end,
+
+ create = function (d, tab, settings)
+ tab.ninputs = 1
+ tab.noutputs = 0
+ tab.otype = dalos.objtype.LUA_VIEWER
+ tab.activate = dalosp.textview.activate
+ tab.input_change = dalosp.textview.input_change
+ tab.default_name = "Text View"
+ tab.ntype = "Text View"
+ tab.get_settings = dalosp.textview.get_settings
+ local extra = { }
+
+ local obj = dalos.object(d, tab, extra)
+
+ local txt = iup.text {
+ multiline = "Yes",
+ readonly = "Yes",
+ expand = "Yes",
+ font = "Courier, 8"
+ }
+ local dlg = iup.dialog {
+ txt,
+ size = "320x200",
+ title = obj.name
+ }
+ extra.dlg = dlg
+ extra.txt = txt
+
+ return obj
+ end,
+}
+
+dalos.textview = dalosp.textview.create
+dalos:register_obj("Text View", dalos.textview, "Basic Viewers")
diff --git a/dalos.lua b/dalos.lua
index a6517d3..e7c02bd 100644
--- a/dalos.lua
+++ b/dalos.lua
@@ -724,11 +724,11 @@ dalosp.menu = {
create = function (canvas, tab)
local item_new = iup.item { title = "New" }
item_new.action = dalosp.menu.action_new
- local item_load = iup.item { title = "Load" }
+ local item_load = iup.item { title = "Load workspace" }
item_load.action = dalosp.menu.action_load
- local item_save = iup.item { title = "Save" }
+ local item_save = iup.item { title = "Save workspace" }
item_save.action = dalosp.menu.action_save
- local item_import = iup.item { title = "Import" }
+ local item_import = iup.item { title = "Import Lua file" }
item_import.action = dalosp.menu.action_import
local item_reload = iup.item { title = "Reload all" }
item_reload.action = dalosp.menu.action_reload
@@ -818,8 +818,7 @@ dalosp.menu = {
}
dalosp.object = {
- use_template = function (self)
- local templates = dalosp.luafilter.templates
+ use_template = function (self, templates)
local ttpllst = {}
for n, v in pairs(templates) do
table.insert(ttpllst, n)
@@ -840,7 +839,15 @@ dalosp.object = {
end
local s, tind = iup.GetParam("Use Template", nil, "Template: %i" .. tpllst .. "\n", 0)
if not s then return iup.DEFAULT end
- self:apply_template(dalosp.luafilter.templates[ttpllst[tind]])
+ self:apply_template(templates[ttpllst[tind]])
+ end,
+
+ auto_template = function (self, templates, name)
+ for n, v in pairs(templates) do
+ if n == name then
+ self:apply_template(v)
+ end
+ end
end,
load_template = function (self)
@@ -1004,6 +1011,7 @@ dalosp.object = {
save_template = dalosp.object.save_template,
load_template = dalosp.object.load_template,
use_template = dalosp.object.use_template,
+ auto_template = dalosp.object.auto_template,
dcanvas = dcanvas,
}
@@ -1078,6 +1086,7 @@ load "dalos-tee.lua"
load "dalos-buffer.lua"
load "dalos-luafilter.lua"
load "dalos-struct.lua"
+load "dalos-textview.lua"
----------------