diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/client/model/graph.js | 21 | ||||
| -rw-r--r-- | src/client/view/search.js | 19 | ||||
| -rw-r--r-- | src/client/view/selection.js | 23 |
3 files changed, 44 insertions, 19 deletions
diff --git a/src/client/model/graph.js b/src/client/model/graph.js index 2fd453e7..f38686eb 100644 --- a/src/client/model/graph.js +++ b/src/client/model/graph.js @@ -1091,25 +1091,16 @@ function Graph(spec) { this.find__by_visitors = function(node_visitor, link_visitor) { var nodes = get_nodes(), links = get_links(), - n_length = nodes.length, - l_length = links.length, - selected = [], - i, - node, - link, - state; + selected_nodes, + selected_links; - if (!node_visitor) { + if (!node_visitor && !link_visitor) { return; } - for (i = 0 ; i < n_length; ++i) { - node = nodes[i]; - if (node_visitor(node)) { - selected.push(node); - } - } - return selected; + selected_nodes = node_visitor ? nodes.filter(node_visitor) : []; + selected_links = link_visitor ? links.filter(link_visitor) : []; + return {nodes: selected_nodes, links: selected_links}; } function markRelated(names) { diff --git a/src/client/view/search.js b/src/client/view/search.js index 29e702d1..09950687 100644 --- a/src/client/view/search.js +++ b/src/client/view/search.js @@ -28,9 +28,24 @@ function init() { return true; }); + function attribute_match(obj, regexp) { + var v, k; + + for (k in obj) { + if (obj.hasOwnProperty(k)) { + v = obj[k]; + if ("string" === typeof(v) && v.match(regexp)) { + return true; + } + } + } + return false; + } + function search_on_submit() { var text = search[0].value.trim(), - r; + r, + selector = function (obj) { return attribute_match(obj, r); }; try { r = new RegExp(text.replace(/ /, '|'), 'i'); @@ -38,7 +53,7 @@ function init() { return; // don't clear selection either } if (text.length > 0) { - selection.byVisitors(function (n) { return n.name.match(r); }); + selection.byVisitors(selector, selector); } else { selection.clear(); } diff --git a/src/client/view/selection.js b/src/client/view/selection.js index 6ac675aa..7a99dd03 100644 --- a/src/client/view/selection.js +++ b/src/client/view/selection.js @@ -117,10 +117,29 @@ function updateSelectedNodesBus(new_selected_nodes) selectionChangedBus.push(new_selection(selected_nodes, root_nodes)); } +/* add nodes in nodes_b to a copy of nodes_a in order, skipping duplicates */ +function sum_nodes(nodes_a, nodes_b) +{ + var set_a_id = _.object(nodes_a.map(function (n) { return [n.id, 1]; })), + ret = nodes_a.slice(0); + + for (var k in nodes_b) { + if (set_a_id[nodes_b[k].id] === undefined) { + ret.push(nodes_b[k]); + } + } + return ret; +} + +function links_to_nodes(links) +{ + return _.flatten(_.map(links, function (link) { return [link.__src, link.__dst]; })); +} + function byVisitors(node_selector, link_selector) { - var new_selected_nodes = get_main_graph().find__by_visitors(node_selector, link_selector); + var new_selection = get_main_graph().find__by_visitors(node_selector, link_selector); - inner_update(new_selected_nodes); + inner_update(sum_nodes(new_selection.nodes, links_to_nodes(new_selection.links))); } function connectedComponent(nodes) { |
