diff --git a/cmd/dotty/dotty_draw.lefty b/cmd/dotty/dotty_draw.lefty index cd67f3ef2bef01d407e68483322689d8fa22326c..2c10f85109e0a84b6987be0be175d38314b92017 100644 --- a/cmd/dotty/dotty_draw.lefty +++ b/cmd/dotty/dotty_draw.lefty @@ -158,6 +158,13 @@ dotty.protogt.movenode = function (gt, node, pos) { gt.undrawnode (gt, gt.views, node); node.pos.x = pos.x; node.pos.y = pos.y; + + # correct the bounding box when moving + node.rect[0].x = node.pos.x - node.size.x/2; + node.rect[1].x = node.pos.x + node.size.x/2; + node.rect[0].y = node.pos.y - node.size.y/2; + node.rect[1].y = node.pos.y + node.size.y/2; + gt.movenodedraw (node.draws, dp); for (eid in node.edges) { edge = node.edges[eid]; diff --git a/cmd/dotty/dotty_ui.lefty b/cmd/dotty/dotty_ui.lefty index a8c91165dc9406acddd5591d4044ff9a3d37fa52..6fdec8f8b123548a3992340e54b5a9dc3aa5a11f 100644 --- a/cmd/dotty/dotty_ui.lefty +++ b/cmd/dotty/dotty_ui.lefty @@ -273,29 +273,38 @@ dotty.protovt.normal.uifuncs = [ dotty.node2move = data.obj; dotty.movewidget = data.widget; dotty.rp2 = data.pos; + # save the previous object pos + dotty.node_ppos = data.obj.pos; } }; 'leftmove' = function (data) { - local gt; + local gt, offset_pos; gt = dotty.graphs[dotty.views[data.widget].gtid]; if (dotty.node2move & ( dotty.rp2.x ~= data.pos.x | dotty.rp2.y ~= data.pos.y )) { - gt.movenode (gt, dotty.node2move, data.pos); + # use an offset from the cursor to the node's pre-move position + offset_pos.x = data.pos.x - (dotty.rp2.x - dotty.node_ppos.x); + offset_pos.y = data.pos.y - (dotty.rp2.y - dotty.node_ppos.y); + gt.movenode (gt, dotty.node2move, offset_pos); dotty.rp2 = data.pos; } }; 'leftup' = function (data) { - local gt; + local gt, offset_pos; gt = dotty.graphs[dotty.views[data.widget].gtid]; if (dotty.node2move) { - if (dotty.movewidget == data.widget) - gt.movenode (gt, dotty.node2move, data.pos); + if (dotty.movewidget == data.widget) { + offset_pos.x = data.pos.x - (dotty.rp2.x - dotty.node_ppos.x); + offset_pos.y = data.pos.y - (dotty.rp2.y - dotty.node_ppos.y); + gt.movenode (gt, dotty.node2move, offset_pos); + } dotty.node2move = 0; } else if (~data.obj) gt.insertnode (gt, data.pos, null, null, null, 1); + gt.redrawgraph(gt, gt.views); }; 'middledown' = function (data) { if (~(data.obj.nid >= 0))