local function imLoadImage(fname) local f = im.FileOpen(fname) local r = f:LoadImage() f:Close() return r end dalosp.struct = { 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", "asciiz", "nascii", }, get_settings = function (self) end, configure = function (self) self.cfg_dlg:popup() end, activate = function (self) self.actv_dlg:show() end, input_change = function (self) 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 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 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 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 "CumSize" end end return "" end, cfg_value_edit_cb = function (self, lin, col, newval) end, insert_line = function (self) local mx = self.cfg_dlg.mx mx.numlin = mx.numlin + 1 mx.numlin_visible = mx.numlin_visible + 1 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 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 return iup.DEFAULT end, create = function (d, tab, settings) tab.ninputs = 1 tab.noutputs = 0 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 local obj = dalos.object(d, tab, extra) obj.insert_line = dalosp.struct.insert_line local cmx = iup.matrix { numcol = 8, numcol_visible = 8, usetitlesize = "Yes", rasterwidth1 = 12, rasterwidth2 = 12, rasterwidth3 = 12, rasterwidth4 = 12, rasterwidth5 = 150, rasterwidth6 = 80, rasterwidth7 = 80, rasterwidth8 = 80, resizematrix = "Yes", readonly = "No", 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, struct = obj, } local amx = iup.matrix {} obj.cfg_dlg = iup.dialog { iup.vbox { cmx, iup.hbox { iup.fill {}, iup.button { title = "Ok", action = function (self) return iup.CLOSE end }, iup.fill {}, }, }, size = "350x120", } obj.cfg_dlg.mx = cmx obj.actv_dlg = iup.dialog { amx, } return obj end, } dalos.struct = dalosp.struct.create dalos:register_obj("Struct", dalos.struct, "Programmable")