Daniel@0: load ('def.lefty'); Daniel@0: definit (); Daniel@0: # Daniel@0: # initialize window data Daniel@0: # Daniel@0: canvas = defcanvas; Daniel@0: wrect = [0 = ['x' = 0; 'y' = 0;]; 1 = ['x' = 400; 'y' = 500;];]; Daniel@0: setwidgetattr (canvas, ['window' = wrect;]); Daniel@0: # Daniel@0: # data structures Daniel@0: # Daniel@0: objarray = []; Daniel@0: objnum = 0; Daniel@0: # Daniel@0: # misc functions Daniel@0: # Daniel@0: min = function (a, b) { Daniel@0: if (a <= b) Daniel@0: return a; Daniel@0: return b; Daniel@0: }; Daniel@0: max = function (a, b) { Daniel@0: if (b <= a) Daniel@0: return a; Daniel@0: return b; Daniel@0: }; Daniel@0: rectof = function (p1, p2) { Daniel@0: return [ Daniel@0: 0 = ['x' = min (p1.x, p2.x); 'y' = min (p1.y, p2.y);]; Daniel@0: 1 = ['x' = max (p1.x, p2.x); 'y' = max (p1.y, p2.y);]; Daniel@0: ]; Daniel@0: }; Daniel@0: pointadd = function (p1, p2) { Daniel@0: return ['x' = p2.x + p1.x; 'y' = p2.y + p1.y;]; Daniel@0: }; Daniel@0: pointsub = function (p1, p2) { Daniel@0: return ['x' = p2.x - p1.x; 'y' = p2.y - p1.y;]; Daniel@0: }; Daniel@0: # Daniel@0: # rendering functions Daniel@0: # Daniel@0: drawbox = function (obj, color) { Daniel@0: box (canvas, obj, obj.rect, ['color' = color;]); Daniel@0: }; Daniel@0: redrawboxes = function () { Daniel@0: local i; Daniel@0: clear (canvas); Daniel@0: for (i = 0; i < objnum; i = i + 1) Daniel@0: drawbox (objarray[i], 1); Daniel@0: }; Daniel@0: redraw = function (canvas) { Daniel@0: redrawboxes (); Daniel@0: }; Daniel@0: # Daniel@0: # editing functions Daniel@0: # Daniel@0: new = function (rect) { Daniel@0: objarray[objnum] = [ Daniel@0: 'rect' = rect; Daniel@0: 'id' = objnum; Daniel@0: ]; Daniel@0: objnum = objnum + 1; Daniel@0: return objarray[objnum - 1]; Daniel@0: }; Daniel@0: reshape = function (obj, rect) { Daniel@0: obj.rect = rect; Daniel@0: return obj; Daniel@0: }; Daniel@0: move = function (obj, p) { Daniel@0: obj.rect[0] = pointadd (obj.rect[0], p); Daniel@0: obj.rect[1] = pointadd (obj.rect[1], p); Daniel@0: return obj; Daniel@0: }; Daniel@0: delete = function (obj) { Daniel@0: if (obj.id ~= objnum - 1) { Daniel@0: objarray[obj.id] = objarray[objnum - 1]; Daniel@0: objarray[obj.id].id = obj.id; Daniel@0: } Daniel@0: remove (objnum - 1, objarray); Daniel@0: objnum = objnum - 1; Daniel@0: }; Daniel@0: # Daniel@0: # user interface functions Daniel@0: # Daniel@0: # left mouse button creates new box Daniel@0: # middle button moves a box Daniel@0: # right button deletes a box Daniel@0: # Daniel@0: leftdown = function (data) { Daniel@0: if (data.obj ~= null) Daniel@0: return; Daniel@0: leftbox = new (rectof (data.pos, data.pos)); Daniel@0: drawbox (leftbox, 1); Daniel@0: setgfxattr (canvas, ['mode' = 'xor';]); Daniel@0: }; Daniel@0: leftmove = function (data) { Daniel@0: if (~leftbox) Daniel@0: return; Daniel@0: drawbox (leftbox, 1); Daniel@0: clearpick (canvas, leftbox); Daniel@0: reshape (leftbox, rectof (data.ppos, data.pos)); Daniel@0: drawbox (leftbox, 1); Daniel@0: }; Daniel@0: leftup = function (data) { Daniel@0: if (~leftbox) Daniel@0: return; Daniel@0: drawbox (leftbox, 1); Daniel@0: clearpick (canvas, leftbox); Daniel@0: reshape (leftbox, rectof (data.ppos, data.pos)); Daniel@0: setgfxattr (canvas, ['mode' = 'src';]); Daniel@0: drawbox (leftbox, 1); Daniel@0: remove ('leftbox'); Daniel@0: }; Daniel@0: middledown = function (data) { Daniel@0: if (data.obj == null) Daniel@0: return; Daniel@0: middlebox = data.obj; Daniel@0: middlepos = data.pos; Daniel@0: setgfxattr (canvas, ['mode' = 'xor';]); Daniel@0: }; Daniel@0: middlemove = function (data) { Daniel@0: if (~middlebox) Daniel@0: return; Daniel@0: drawbox (middlebox, 1); Daniel@0: clearpick (canvas, middlebox); Daniel@0: move (middlebox, pointsub (middlepos, data.pos)); Daniel@0: middlepos = data.pos; Daniel@0: drawbox (middlebox, 1); Daniel@0: }; Daniel@0: middleup = function (data) { Daniel@0: if (~middlebox) Daniel@0: return; Daniel@0: drawbox (middlebox, 1); Daniel@0: clearpick (canvas, middlebox); Daniel@0: move (middlebox, pointsub (middlepos, data.pos)); Daniel@0: setgfxattr (canvas, ['mode' = 'src';]); Daniel@0: drawbox (middlebox, 1); Daniel@0: remove ('middlepos'); Daniel@0: remove ('middlebox'); Daniel@0: }; Daniel@0: rightup = function (data) { Daniel@0: if (data.pobj == null) Daniel@0: return; Daniel@0: drawbox (data.obj, 0); Daniel@0: clearpick (canvas, data.obj); Daniel@0: delete (data.obj); Daniel@0: }; Daniel@0: dops = function () { Daniel@0: local s; Daniel@0: Daniel@0: s = ['x' = 8 * 300; 'y' = 10.5 * 300;]; Daniel@0: canvas = createwidget (-1, ['type' = 'ps'; 'size' = s;]); Daniel@0: setwidgetattr (canvas, ['window' = wrect;]); Daniel@0: redraw (canvas); Daniel@0: destroywidget (canvas); Daniel@0: canvas=defcanvas; Daniel@0: };