summaryrefslogtreecommitdiff
path: root/dalos.lua
blob: 5381411bbcecf167b6e52c249dc9ca258f4ba1b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
loadmodule "luaiup"
loadmodule "luahandle"
loadmodule "lualibs"

load "iupe-dbuffer.lua"
load "iupe-hexview.lua"
load "iupe-hexview-toolbox.lua"
load "iupe-tview.lua"

if not dalosp then dalosp = {} end
if not dalos then dalos = {} end

dalosp.canvas = {
    draw = function (self)
        local cvdb = self.cvdb
        if not cvdb then return iup.DEFAULT end
        cvdb:Clear()
        
        for k, v in ipairs(self.objects) do
            v.obj:draw(cvdb, v.x, v.y, v.w, v.h)
        end
        
        cvdb:Flush()
        
        return iup.DEFAULT
    end,
    
    addobj = function (self, obj, x, y, w, h)
        table.insert(self.objects, { obj = obj, x = x, y = y, w = w, h = h })
        self:draw()
    end,
    
    findobj = function (self, x, y)
        local obj, ind
        
        x = x + 0
        y = y + 0
        
        for k, v in ipairs(self.objects) do
            if v.x <= x and (v.x + v.w) >= x and v.y <= y and (v.y + v.h) >= y then
                obj, ind = v, k
            end
        end
        
        return obj, ind
    end,
    
    moveobj = function (self, obj, x, y)
        obj.x, obj.y = x, y
        self:draw()
    end,
    
    focus_cb = function (self, focus)
    end,
    
    motion_cb = function (self, x, y, status)
        if iup.isbutton1(status) then
        elseif iup.isbutton3(status) then
        elseif iup.isbutton2(status) then
            local moving = self.moving
            if moving then
                local ox, oy = self.ox, self.oy
                local dx, dy = x - ox, y - oy
                self:moveobj(moving, moving.x + dx, moving.y + dy)
                self.ox, self.oy = x, y
            end
        end
    end,
    
    button_cb = function (self, button, pressed, x, y, status)
        if button == iup.BUTTON1 then
            if pressed == 1 then
            else
            end
        elseif button == iup.BUTTON3 then
            if pressed == 1 then
            else
            end
        elseif button == iup.BUTTON2 then
            if pressed == 1 then
                self.moving = self:findobj(x, y)
                self.ox, self.oy = x, y
            else
                self.moving = nil
            end
        end
    end,
    
    create = function (tab)
        tab.border = "No"
        tab.expand = "Yes"
        tab.shrink = "Yes"
        tab.minsize = "1x1"
        tab.size = "1x1"
        local r = iup.canvas(tab)
        r.action = iupep.dbuffer.action
        r.draw = dalosp.canvas.draw
        r.resize_cb = iupep.dbuffer.resize_cb
        r.map_cb = iupep.dbuffer.map_cb
        r.unmap_cb = iupep.dbuffer.unmap_cb
        r.focus_cb = dalosp.canvas.focus_cb
        r.motion_cb = dalosp.canvas.motion_cb
        r.button_cb = dalosp.canvas.button_cb
        r.addobj = dalosp.canvas.addobj
        r.findobj = dalosp.canvas.findobj
        r.moveobj = dalosp.canvas.moveobj
        
        r.objects = {}
        
        return r
    end,
}

dalosp.menu = {
    action_exit = function (self)
        return iup.CLOSE
    end,
    
    create = function (tab)
        local item_exit = iup.item { title = "Exit" }
        item_exit.action = dalosp.menu.action_exit
        local item_about = iup.item { title = "About" }
        local menu_file = iup.submenu { iup.menu { item_exit }, title = "File" }
        local menu_help = iup.submenu { iup.menu { item_about }, title = "Help" }
        return iup.menu { menu_file, menu_help }
    end,
}

dalosp.object = {
    default_draw = function (self, cv, x, y, w, h )
        cv:Foreground(self.color)
        local x1, x2, y1, y2 = x, x + w, y, y + h
        cv:Box(x1, x2, cv:InvertYAxis(y2), cv:InvertYAxis(y1))
    end,
    
    create = function (dcanvas, x, y, w, h, c)
        local obj = {
            draw = dalosp.object.default_draw,
            color = c or cd.BLACK
        }
        
        dcanvas:addobj(obj, x or 0, y or 0, w or 50, h or 50)
    end,
}

dalos.canvas = dalosp.canvas.create
dalos.menu = dalosp.menu.create
dalos.object = dalosp.object.create

----------------

d = dalos.canvas {}
m = dalos.menu {}
o = dalos.object(d)

dlg = iup.dialog { d, title = "Dalos", menu = m }

dlg:show()
iup.MainLoop()
dlg:hide()