diff options
Diffstat (limited to 'src/view/selection.js')
| -rw-r--r-- | src/view/selection.js | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/view/selection.js b/src/view/selection.js new file mode 100644 index 00000000..57f2443d --- /dev/null +++ b/src/view/selection.js @@ -0,0 +1,80 @@ +define(['rz_core'], +function(rz_core) { + +function get_rz_core() +{ + // circular dependency on rz_core, so require.js cannot solve it. + if (rz_core === undefined) { + rz_core = require('rz_core'); + } + return rz_core; +} + +var selection = false; + +function byVisitors(node_selector, link_selector) { + selection = true; + var selected_nodes = get_rz_core().graph.findByVisitors(node_selector, link_selector); + + clear(); + connectedComponent(selected_nodes); +} + +function connectedComponent(nodes) { + var nodes, + connected = get_rz_core().graph.getConnectedNodesAndLinks(nodes, 1), + i, + node, + link, + data; + + selection = true; + nodes.forEach(function (n) { n.state = 'chosen'; }); + + for (i = 0 ; i < connected.nodes.length ; ++i) { + data = connected.nodes[i]; + node = data.node; + switch (data.type) { + case 'exit': + node.state = 'exit'; + break; + case 'enter': + node.state = 'enter'; + break; + }; + } + for (i = 0 ; i < connected.links.length ; ++i) { + data = connected.links[i]; + link = data.link; + switch (data.type) { + case 'exit': + link.state = 'exit'; + break; + case 'enter': + link.state = 'enter'; + break; + }; + } +} + +var node_selected = function(node) { + return node.state == 'chosen' || node.state == 'enter' || node.state == 'exit' || node.state == 'selected'; +} + +var selected_class = function(node) { + return selection ? (node_selected(node) ? "selected" : "notselected") : ""; +} + +var clear = function() { + selection = false; + get_rz_core().graph.setRegularState(); +} + +return { + 'byVisitors': byVisitors, + 'connectedComponent': connectedComponent, + 'clear': clear, + 'selected_class': selected_class, +}; + +}); |
