summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client/model/graph.js21
-rw-r--r--src/client/view/search.js19
-rw-r--r--src/client/view/selection.js23
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) {