diff toolboxes/graph_visualisation/lib/lefty/dotty_ui.lefty @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/graph_visualisation/lib/lefty/dotty_ui.lefty	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,468 @@
+#
+# dotty_ui: user interface functions and data structures
+#
+dotty.protogt.doaction = function (data, s) {
+    local vt, gt;
+
+    vt = dotty.views[data.widget];
+    gt = dotty.graphs[vt.gtid];
+    data.menuitem = s;
+    if (data.obj.nid >= 0) {
+        if (gt.actions.node[s]) {
+            gt.actions.node[s] (gt, vt, data.obj, data);
+            return;
+        }
+    } else if (data.obj.eid >= 0) {
+        if (gt.actions.edge[s]) {
+            gt.actions.edge[s] (gt, vt, data.obj, data);
+            return;
+        }
+    }
+    if (gt.actions.general[s])
+        gt.actions.general[s] (gt, vt, data);
+};
+dotty.protogt.actions.general = [
+    "undo" = function (gt, vt, data) {
+        gt.undo (gt, 1);
+    };
+    "paste" = function (gt, vt, data) {
+        gt.paste (gt, data.pos, 1);
+    };
+    "do layout" = function (gt, vt, data) {
+        gt.layoutgraph (gt);
+    };
+    "cancel layout" = function (gt, vt, data) {
+        gt.cancellayout (gt);
+    };
+    "redraw" = function (gt, vt, data) {
+        gt.redrawgraph (gt, [vt.vtid = vt;]);
+    };
+    "new graph" = function (gt, vt, data) {
+        gt.erasegraph (gt, null, null);
+    };
+    "load graph" = function (gt, vt, data) {
+        gt.loadgraph (gt, null, 'file', dotty.protogt.graph, 1);
+    };
+    "reload graph" = function (gt, vt, data) {
+        gt.loadgraph (gt, gt.name, gt.type, gt.graph, 1);
+    };
+    "save graph" = function (gt, vt, data) {
+        gt.savegraph (gt, gt.name, gt.type);
+    };
+    "save graph as" = function (gt, vt, data) {
+        gt.savegraph (gt, null, 'file');
+    };
+    "open view" = function (gt, vt, data) {
+        gt = dotty.protogt.creategraph (null);
+        gt.createview (gt, null);
+    };
+    "copy view" = function (gt, vt, data) {
+        gt = gt.copygraph (gt);
+        gt.createview (gt, vt);
+    };
+    "birdseye view" = function (gt, vt, data) {
+        gt.createview (gt, dotty.protovt.birdseye);
+    };
+    "clone view" = function (gt, vt, data) {
+        gt.createview (gt, vt);
+    };
+    "close view" = function (gt, vt, data) {
+        gt.destroyview (gt, vt);
+        if (tablesize (gt.views) == 0)
+            gt.destroygraph (gt);
+    };
+    "set graph attr" = function (gt, vt, data) {
+        gt.setattr (gt, ['attr' = gt.graph.graphattr;]);
+    };
+    "set node attr" = function (gt, vt, data) {
+        gt.setattr (gt, ['attr' = gt.graph.nodeattr;]);
+    };
+    "set edge attr" = function (gt, vt, data) {
+        gt.setattr (gt, ['attr' = gt.graph.edgeattr;]);
+    };
+    "zoom in" = function (gt, vt, data) {
+        gt.zoom (gt, vt, 0.5, data.pos);
+    };
+    "zoom out" = function (gt, vt, data) {
+        gt.zoom (gt, vt, 2, data.pos);
+    };
+    "zoom in slowly" = function (gt, vt, data) {
+        gt.zoom (gt, vt, 0.9, data.pos);
+    };
+    "zoom out slowly" = function (gt, vt, data) {
+        gt.zoom (gt, vt, 1.1, data.pos);
+    };
+    "scroll horizontally" = function (gt, vt, data) {
+        vt.scrollmode = 'h';
+    };
+    "scroll vertically" = function (gt, vt, data) {
+        vt.scrollmode = 'v';
+    };
+    "find node" = function (gt, vt, data) {
+        gt.findnode (gt, vt);
+    };
+    "print graph" = function (gt, vt, data) {
+        gt.printorsave (gt, vt, null, null, null, null);
+    };
+    "text view" = function (gt, vt, data) {
+        if (dotty.txtview == 'on')
+            dotty.txtview = 'off';
+        else
+            dotty.txtview = 'on';
+        txtview (dotty.txtview);
+    };
+    "quit" = function (gt, vt, data) {
+        exit ();
+    };
+];
+dotty.protogt.actions.node = [
+    "cut" = function (gt, vt, obj, data) {
+        gt.cut (gt, obj, 'one', 'support', 'cut');
+        dotty.clipgt.layoutgraph (dotty.clipgt);
+    };
+    "Cut" = function (gt, vt, obj, data) {
+        gt.cut (gt, obj, 'reachable', 'support', 'cut');
+        dotty.clipgt.layoutgraph (dotty.clipgt);
+    };
+    "copy" = function (gt, vt, obj, data) {
+        gt.cut (gt, obj, 'one', 'support', 'copy');
+        dotty.clipgt.layoutgraph (dotty.clipgt);
+    };
+    "Copy" = function (gt, vt, obj, data) {
+        gt.cut (gt, obj, 'reachable', 'support', 'copy');
+        dotty.clipgt.layoutgraph (dotty.clipgt);
+    };
+    "group" = function (gt, vt, obj, data) {
+        local kv;
+
+        if ((kv = gt.getattr (gt, obj)))
+            gt.groupnodesbyattr (gt, kv.key, kv.val, [
+                'label' = kv.val; kv.key = kv.val;
+            ], 1, 1);
+    };
+    "Group" = function (gt, vt, obj, data) {
+        local kv;
+
+        if ((kv = gt.getattr (gt, obj)))
+            gt.groupnodesbyattr (gt, kv.key, kv.val, [
+                'label' = kv.val; kv.key = kv.val;
+            ], 0, 1);
+    };
+    "delete" = function (gt, vt, obj, data) {
+        if (obj.eid >= 0)
+            gt.removeedge (gt, obj);
+        else
+            gt.removenode (gt, obj);
+    };
+    "Delete" = function (gt, vt, obj, data) {
+        gt.removesubtree (gt, obj);
+    };
+    "remove" = function (gt, vt, obj, data) {
+        if (obj.nid >= 0)
+            if ((kv = gt.getattr (gt, obj)))
+                gt.removenodesbyattr (gt, kv.key, kv.val);
+    };
+    "Remove" = function (gt, vt, obj, data) {
+        if (obj.nid >= 0)
+            if ((kv = gt.getattr (gt, obj)))
+                gt.removesubtreesbyattr (gt, kv.key, kv.val);
+    };
+    "set attr" = function (gt, vt, obj, data) {
+        gt.setattr (gt, obj);
+    };
+    "print attr" = function (gt, vt, obj, data) {
+        if (obj.nid >= 0)
+            echo ('node: ', obj.name);
+        dump (obj.attr);
+    };
+];
+dotty.protogt.actions.edge = dotty.protogt.actions.node;
+dotty.protovt.normal.menus = [
+    'general' = [
+        0 = "undo";
+        1 = "paste";
+        2 = "do layout";
+        3 = "cancel layout";
+        4 = "redraw";
+        5 = "new graph";
+        6 = "load graph";
+        7 = "reload graph";
+        8 = "save graph";
+        9 = "save graph as";
+        10 = "open view";
+        11 = "copy view";
+        12 = "clone view";
+        13 = "birdseye view";
+        14 = "close view";
+        15 = "set graph attr";
+        16 = "set node attr";
+        17 = "set edge attr";
+        18 = "zoom in";
+        19 = "zoom out";
+        20 = "find node";
+        21 = "print graph";
+        22 = "text view";
+        23 = "quit";
+    ];
+    'node' = [
+        0 = "cut";
+        1 = "Cut";
+        2 = "copy";
+        3 = "Copy";
+        4 = "group";
+        5 = "Group";
+        6 = "delete";
+        7 = "Delete";
+        8 = "remove";
+        9 = "Remove";
+        10 = "set attr";
+        11 = "print attr";
+    ];
+    'edge' = [
+        0 = "cut";
+        1 = "Cut";
+        2 = "copy";
+        3 = "Copy";
+        4 = "delete";
+        5 = "Delete";
+        6 = "set attr";
+        7 = "print attr";
+    ];
+];
+dotty.protovt.normal.keys = [
+    'general' = [
+        'u' = "undo";
+        'p' = "paste";
+        'l' = "do layout";
+        'k' = "cancel layout";
+        ' ' = "redraw";
+        'L' = "reload graph";
+        's' = "save graph";
+        'Z' = "zoom in slowly";
+        'z' = "zoom out slowly";
+        'h' = "scroll horizontally";
+        'v' = "scroll vertically";
+    ];
+    'node' = [
+        'c' = "copy";
+        'C' = "Copy";
+        'g' = "group";
+        'G' = "Group";
+        'd' = "delete";
+        'D' = "Delete";
+        'r' = "remove";
+        'R' = "Remove";
+        'a' = "set attr";
+    ];
+    'edge' = [
+        'c' = "copy";
+        'C' = "Copy";
+        'd' = "delete";
+        'D' = "Delete";
+        'a' = "set attr";
+    ];
+];
+dotty.protovt.birdseye.menus = dotty.protovt.normal.menus;
+dotty.protovt.birdseye.keys = dotty.protovt.normal.keys;
+dotty.protovt.normal.uifuncs = [
+    'leftdown' = function (data) {
+        local gt;
+
+        gt = dotty.graphs[dotty.views[data.widget].gtid];
+        if (data.obj.nid >= 0) {
+            dotty.node2move = data.obj;
+            dotty.movewidget = data.widget;
+            dotty.rp2 = data.pos;
+        }
+    };
+    'leftmove' = function (data) {
+        local gt;
+
+        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);
+            dotty.rp2 = data.pos;
+        }
+    };
+    'leftup' = function (data) {
+        local gt;
+
+        gt = dotty.graphs[dotty.views[data.widget].gtid];
+        if (dotty.node2move) {
+            if (dotty.movewidget == data.widget)
+                gt.movenode (gt, dotty.node2move, data.pos);
+            dotty.node2move = 0;
+        } else if (~data.obj)
+            gt.insertnode (gt, data.pos, null, null, null, 1);
+    };
+    'middledown' = function (data) {
+        if (~(data.obj.nid >= 0))
+            return;
+        dotty.rubberband = 1;
+        dotty.movewidget = data.widget;
+        setgfxattr (data.widget, ['mode' = 'xor';]);
+        dotty.rp1 = data.pos;
+        dotty.rp2 = data.pos;
+        line (data.widget, null, dotty.rp1, dotty.rp2, ['color' = 1;]);
+    };
+    'middlemove' = function (data) {
+        if (dotty.rubberband ~= 1 | (
+            dotty.rp2.x == data.pos.x & dotty.rp2.y == data.pos.y
+        ))
+            return;
+        line (data.widget, null, dotty.rp1, dotty.rp2, ['color' = 1;]);
+        dotty.rp2 = data.pos;
+        line (data.widget, null, dotty.rp1, dotty.rp2, ['color' = 1;]);
+    };
+    'middleup' = function (data) {
+        local gt;
+
+        gt = dotty.graphs[dotty.views[data.widget].gtid];
+        if (dotty.rubberband ~= 1)
+            return;
+        dotty.rubberband = 0;
+        line (dotty.movewidget, null, dotty.rp1, dotty.rp2, ['color' = 1;]);
+        setgfxattr (dotty.movewidget, ['mode' = 'src';]);
+        if (dotty.movewidget ~= data.widget | ~(
+            data.pobj.nid >= 0) | ~(data.obj.nid >= 0
+        ))
+            return;
+        if (data.pobj.attr.support)
+            gt.groupnodes (gt, [
+                data.obj.nid = data.obj;
+                data.pobj.nid = data.pobj;
+            ], data.obj, null, null, null, 1, 1);
+        else if (data.obj.attr.support)
+            gt.groupnodes (gt, [
+                data.obj.nid = data.obj;
+                data.pobj.nid = data.pobj;
+            ], data.pobj, null, null, null, 1, 1);
+        else
+            gt.insertedge (gt, data.pobj, null, data.obj, null, null, 1);
+    };
+    'rightdown' = function (data) {
+        local vt, gt, menu, i;
+
+        vt = dotty.views[data.widget];
+        gt = dotty.graphs[vt.gtid];
+        if (~data.obj)
+            menu = vt.menus.general;
+        else if (data.obj.nid >= 0)
+            menu = vt.menus.node;
+        else if (data.obj.eid >= 0)
+            menu = vt.menus.edge;
+        if ((i = displaymenu (data.widget, menu)) >= 0)
+            gt.doaction (data, menu[i]);
+    };
+    'button3up' = function (data) {
+        local vt, attr;
+
+        vt = dotty.views[data.widget];
+        attr = getwidgetattr (vt.scroll, [0 = 'childcenter';]);
+        if (vt.scrollmode == 'h')
+            attr.childcenter.x = attr.childcenter.x - 40;
+        else
+            attr.childcenter.y = attr.childcenter.y - 40;
+        setwidgetattr (vt.scroll, ['childcenter' = attr.childcenter;]);
+    };
+    'button4up' = function (data) {
+        local vt, attr;
+
+        vt = dotty.views[data.widget];
+        attr = getwidgetattr (vt.scroll, [0 = 'childcenter';]);
+        if (vt.scrollmode == 'h')
+            attr.childcenter.x = attr.childcenter.x + 40;
+        else
+            attr.childcenter.y = attr.childcenter.y + 40;
+        setwidgetattr (vt.scroll, ['childcenter' = attr.childcenter;]);
+    };
+    'keyup' = function (data) {
+        local vt, gt, action;
+
+        vt = dotty.views[data.widget];
+        gt = dotty.graphs[vt.gtid];
+        if (data.obj.nid >= 0) {
+            if (vt.keys.node[data.key])
+                action = vt.keys.node[data.key];
+        } else if (data.obj.eid >= 0) {
+            if (vt.keys.edge[data.key])
+                action = vt.keys.edge[data.key];
+        }
+        if (~action)
+            if (vt.keys.general[data.key])
+                action = vt.keys.general[data.key];
+        if (action)
+            gt.doaction (data, action);
+    };
+    'redraw' = function (data) {
+        local vt, gt;
+
+        vt = dotty.views[data.widget];
+        gt = dotty.graphs[vt.gtid];
+        gt.drawgraph (gt, [vt.vtid = vt;]);
+    };
+    'closeview' = function (data) {
+        local vt, gt;
+
+        vt = dotty.views[data.widget];
+        gt = dotty.graphs[vt.gtid];
+        gt.destroyview (gt, vt);
+        if (tablesize (gt.views) == 0)
+            gt.destroygraph (gt);
+    };
+];
+dotty.protovt.birdseye.uifuncs = [
+    'leftdown' = function (data) {
+        local gt, vid;
+
+        gt = dotty.graphs[dotty.views[data.widget].gtid];
+        for (vid in gt.views) {
+            vt = gt.views[vid];
+            if (vt.type ~= 'birdseye')
+                gt.setviewcenter ([vid = vt;], data.pos);
+        }
+    };
+    'leftmove' = function (data) {
+        local gt, vid;
+
+        gt = dotty.graphs[dotty.views[data.widget].gtid];
+        for (vid in gt.views) {
+            vt = gt.views[vid];
+            if (vt.type ~= 'birdseye')
+                gt.setviewcenter ([vid = vt;], data.pos);
+        }
+    };
+    'leftup' = function (data) {
+        local gt, vid;
+
+        gt = dotty.graphs[dotty.views[data.widget].gtid];
+        for (vid in gt.views) {
+            vt = gt.views[vid];
+            if (vt.type ~= 'birdseye')
+                gt.setviewcenter ([vid = vt;], data.pos);
+        }
+    };
+    'middledown' = dotty.protovt.normal.uifuncs.middledown;
+    'middlemove' = dotty.protovt.normal.uifuncs.middlemove;
+    'middleup' = dotty.protovt.normal.uifuncs.middleup;
+    'rightdown' = dotty.protovt.normal.uifuncs.rightdown;
+    'keyup' = dotty.protovt.normal.uifuncs.keyup;
+    'redraw' = dotty.protovt.normal.uifuncs.redraw;
+    'closeview' = dotty.protovt.normal.uifuncs.closeview;
+];
+dotty.monitorfile = function (data) {
+    local gtid, gt, lpt;
+
+    for (gtid in dotty.layoutpending) {
+        lpt = dotty.layoutpending[gtid];
+        if (lpt.fd == data.fd) {
+            gt = dotty.graphs[lpt.gtid];
+            gt.haveinput = 1;
+            gt.layoutgraph (gt);
+            return 1;
+        }
+    }
+    return 0;
+};