summaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorAlon Levy <alon@pobox.com>2015-04-12 14:13:57 +0200
committerAlon Levy <alon@pobox.com>2015-04-12 14:13:59 +0200
commit7c5c6a917c8bce9d538c51becaf9a06fb1741bf5 (patch)
treef60cb36ddca2e612e44756defcaafda9c39a8a50 /src/client
parent8d16cbce9ec8aa139404f1823c4b68e0b4c1c02a (diff)
client/selection: rename: selected & related
selected nodes - nodes the user selected directly, via search or click. related - nodes that we choose to show the user as a result of the selection made.
Diffstat (limited to 'src/client')
-rw-r--r--src/client/buttons.js2
-rw-r--r--src/client/keyshortcuts.js2
-rw-r--r--src/client/model/graph.js36
-rw-r--r--src/client/rz_core.js1
-rw-r--r--src/client/view/graph_view.js8
-rw-r--r--src/client/view/selection.js152
6 files changed, 72 insertions, 129 deletions
diff --git a/src/client/buttons.js b/src/client/buttons.js
index 59601762..a7b12ffc 100644
--- a/src/client/buttons.js
+++ b/src/client/buttons.js
@@ -250,7 +250,7 @@ $('#btn_zoom_in').asEventStream('click')
});
$('#btn_zoom_to_selection').asEventStream('click')
- .map(selection.selected_nodes)
+ .map(selection.related)
.onValue(function (selected) {
rz_core.main_graph_view.nodes__user_visible(selected, true);
});
diff --git a/src/client/keyshortcuts.js b/src/client/keyshortcuts.js
index 2f5b66a8..13477d7a 100644
--- a/src/client/keyshortcuts.js
+++ b/src/client/keyshortcuts.js
@@ -23,7 +23,7 @@ function install() {
$('#textanalyser').focus();
}
if (e.keyIdentifier === 'F6') {
- rz_core.main_graph_view.nodes__user_visible(selection.selected_nodes(), true);
+ rz_core.main_graph_view.nodes__user_visible(selection.related(), true);
handled = true;
}
if (e.altKey && e.ctrlKey && 'o' === key) {
diff --git a/src/client/model/graph.js b/src/client/model/graph.js
index 895f8633..24d305a7 100644
--- a/src/client/model/graph.js
+++ b/src/client/model/graph.js
@@ -236,7 +236,7 @@ function Graph(spec) {
*
* neighbourhood
*
- * @chosen_nodes - list of starting nodes
+ * @start - list of starting nodes
* @d - radius of neighbours
*
* NOTE: Doesn't handle inter graph links
@@ -250,11 +250,11 @@ function Graph(spec) {
* TODO: implement for d !== 1
*
*/
- this.neighbourhood = function(chosen_nodes, d) {
+ this.neighbourhood = function(start, d) {
var ret = {'nodes':[], 'links':[]};
function addNode(node) {
- if (chosen_nodes.filter(function (n) { return n.id == node.id; }).length == 1) {
+ if (start.filter(function (n) { return n.id == node.id; }).length == 1) {
return;
}
ret.nodes.push(node);
@@ -264,7 +264,7 @@ function Graph(spec) {
return node.name.toLowerCase();
}
- if (chosen_nodes === undefined) {
+ if (start === undefined) {
console.log('neighbourhood: bug: called with undefined node');
return;
}
@@ -277,7 +277,7 @@ function Graph(spec) {
}
d = d || 1;
- if (chosen_nodes.length === undefined) {
+ if (start.length === undefined) {
console.log('neighbourhood: expected array');
return ret;
}
@@ -300,8 +300,8 @@ function Graph(spec) {
exit = 1,
enter = 2,
selected = 4,
- visited = _.object(_.map(chosen_nodes, get_name),
- _.map(chosen_nodes, _.partial(make_status, selected)));
+ visited = _.object(_.map(start, get_name),
+ _.map(start, _.partial(make_status, selected)));
function visit(link, getter, kind, depth) {
var node = getter(link),
@@ -328,7 +328,7 @@ function Graph(spec) {
}
}
- _.each(chosen_nodes, function (node) {
+ _.each(start, function (node) {
var N = neighbours[node.id];
_.each(N.src, function (link) {
@@ -1156,26 +1156,6 @@ function Graph(spec) {
};
this.links = get_links;
- function setRegularState() {
- var x, node, link, s;
-
- for (x in id_to_node_map) {
- node = id_to_node_map[x];
- s = node.state;
- if (s === 'chosen' || s === 'enter' || s === 'exit') {
- node.state = 'perm';
- }
- }
- for (x in id_to_link_map) {
- link = id_to_link_map[x];
- s = link.state;
- if (s === 'chosen' || s === 'enter' || s === 'exit') {
- link.state = 'perm';
- }
- }
- }
- this.setRegularState = setRegularState;
-
this.find__by_visitors = function(node_visitor, link_visitor) {
var nodes = get_nodes(),
links = get_links(),
diff --git a/src/client/rz_core.js b/src/client/rz_core.js
index b4c191dd..fd947744 100644
--- a/src/client/rz_core.js
+++ b/src/client/rz_core.js
@@ -72,7 +72,6 @@ var initDrawingArea = function () {
// but there is no coordination, resulting in double updates.
selection.selectionChangedBus.onValue(
function() {
- main_graph.setRegularState();
update_view__graph(false);
}
);
diff --git a/src/client/view/graph_view.js b/src/client/view/graph_view.js
index 5195312f..4041f177 100644
--- a/src/client/view/graph_view.js
+++ b/src/client/view/graph_view.js
@@ -543,12 +543,12 @@ function GraphView(spec) {
link.attr("class", function(d, i){
var temp_and = (d.name && d.name.replace(/ /g,"")=="and" && temporary) ? "temp_and" : "";
- return ["graph link", temp_and, selection.selected_class__link(d, temporary)].join(' ');
+ return ["graph link", temp_and, selection.class__link(d, temporary)].join(' ');
});
link.selectAll('path.link')
.attr('class', function(d) {
- return [d.state || "perm", selection.selected_class__link(d, temporary), "link graph"].join(' ');
+ return [d.state || "perm", selection.class__link(d, temporary), "link graph"].join(' ');
});
link.exit().remove();
@@ -585,7 +585,7 @@ function GraphView(spec) {
return link_text__short(d);
})
.attr("class", function(d) {
- return ["linklabel graph", selection.selected_class__link(d, temporary)].join(' ');
+ return ["linklabel graph", selection.class__link(d, temporary)].join(' ');
});
link_text.exit().remove();
@@ -604,7 +604,7 @@ function GraphView(spec) {
.call(drag);
node.attr('class', function(d) {
- return ['node', selection.selected_class__node(d, temporary)].join(' ');
+ return ['node', selection.class__node(d, temporary)].join(' ');
})
.each(function (d) {
d.zoom_obj = zoom_obj; // FIXME new object NodeView pointing to Node and Zoom
diff --git a/src/client/view/selection.js b/src/client/view/selection.js
index 32d3230c..252b8dea 100644
--- a/src/client/view/selection.js
+++ b/src/client/view/selection.js
@@ -4,30 +4,19 @@ function(Bacon, $, _, messages) {
var rz_core, // circular dependency, see get_rz_core
selection_count_element = $('#selection-count');
-function list_from_list_like(list_like)
-{
- var list = [],
- i;
-
- for (i = 0 ; i < list_like.length ; ++i) {
- list.push(list_like[i]);
- }
- return list;
-}
-
-function root_nodes_ids() {
- return _.pluck(root_nodes, 'id');
+function selected_ids() {
+ return _.pluck(selected, 'id');
}
function Selection() {
}
-function new_selection(nodes, root_nodes)
+function new_selection(selected, related)
{
var ret = new Selection();
- ret.nodes = nodes;
- ret.root_nodes = root_nodes;
+ ret.related = related;
+ ret.selected = selected;
return ret;
}
@@ -51,10 +40,10 @@ function get_main_graph_view()
return get_rz_core().main_graph_view;
}
-var root_nodes, // these are the nodes that are requested via update
- selected_nodes, // these are the nodes that are highlighted, generally the neighbours of selection_request
- selected_nodes__by_id,
- root_nodes__by_id,
+var selected, // these are the nodes that are requested via update
+ related, // these are not directly selected but we want to show them to users
+ selected__by_id,
+ related__by_id,
selectionChangedBus = new Bacon.Bus();
function listen_on_diff_bus(diffBus)
@@ -62,42 +51,17 @@ function listen_on_diff_bus(diffBus)
diffBus
.onValue(function (diff) {
// update due to potentially removed nodes first
- new_root_nodes = root_nodes.filter(function (n) {
+ new_selected = selected.filter(function (n) {
return get_main_graph().find_node__by_id(n.id) !== null;
});
- new_selected_nodes = selected_nodes.filter(function (n) {
+ new_related = related.filter(function (n) {
return get_main_graph().find_node__by_id(n.id) !== null;
});
// reselect based on current graph
- inner_select(new_root_nodes, new_selected_nodes);
+ inner_select(new_selected, new_related);
});
}
-function sortedArrayDiff(a, b, a_cmp_b)
-{
- var a_i = 0,
- b_i = 0,
- ret = [];
-
- while (a_i < a.length && b_i < b.length) {
- while (a_i < a.length && a_cmp_b(a[a_i], b[b_i]) == -1) {
- ret.push(a[a_i]);
- a_i += 1;
- }
- while (b_i < b.length && a_i < a.length && a_cmp_b(a[a_i], b[b_i]) == 0) {
- b_i += 1;
- a_i += 1;
- }
- while (b_i < b.length && a_i < a.length && a_cmp_b(a[a_i], b[b_i]) == 1) {
- b_i += 1;
- }
- }
- for (; a_i < a.length ; ++a_i) {
- ret.push(a[a_i]);
- }
- return ret;
-}
-
function nodes_to_id_dict(nodes)
{
return nodes.reduce(
@@ -107,17 +71,17 @@ function nodes_to_id_dict(nodes)
}, {});
}
-function updateSelectedNodesBus(nodes, new_selected_nodes)
+function updateSelectedNodesBus(new_selected, new_related)
{
- if (_.isEqual(root_nodes, nodes) && _.isEqual(selected_nodes, new_selected_nodes)) {
+ if (_.isEqual(selected, new_selected) && _.isEqual(related, new_related)) {
return;
}
- root_nodes = nodes;
- root_nodes__by_id = nodes_to_id_dict(nodes);
- selected_nodes = new_selected_nodes;
- selected_nodes__by_id = nodes_to_id_dict(selected_nodes);
- selection_count_element.text(selected_nodes.length > 0 ? '' + nodes.length + ', ' + selected_nodes.length : '');
- selectionChangedBus.push(new_selection(selected_nodes, root_nodes));
+ selected = new_selected;
+ selected__by_id = nodes_to_id_dict(selected);
+ related = new_related;
+ related__by_id = nodes_to_id_dict(related);
+ selection_count_element.text(related.length > 0 ? '' + selected.length + ', ' + related.length : '');
+ selectionChangedBus.push(new_selection(selected, related));
}
/* add nodes in nodes_b to a copy of nodes_a in order, skipping duplicates */
@@ -177,35 +141,35 @@ function connectedComponent(nodes) {
};
}
// XXX side effect, should not be here
- nodes.forEach(function (n) { n.state = 'chosen'; });
+ nodes.forEach(function (n) { n.state = 'selected'; });
return connected.nodes.map(function (d) { return d.node; }).concat(nodes.slice());
}
-var node_selected = function(node) {
- return selected_nodes__by_id[node.id] !== undefined;
+var node_related = function(node) {
+ return related__by_id[node.id] !== undefined;
}
-var node_root_selected = function(node) {
- return root_nodes__by_id[node.id] !== undefined;
+var node_selected = function(node) {
+ return selected__by_id[node.id] !== undefined;
}
var node_first_selected = function(node) {
- return root_nodes && root_nodes.length > 0 && node.id === root_nodes[0].id;
+ return selected && selected.length > 0 && node.id === selected[0].id;
}
var link_selected = function(link) {
- return node_selected(link.__src) && node_selected(link.__dst);
+ return node_related(link.__src) && node_related(link.__dst);
}
-var selected_class__node = function(node, temporary) {
- return !temporary && selected_nodes.length > 0 ?
+var class__node = function(node, temporary) {
+ return !temporary && related.length > 0 || selected.length > 0 ?
(node_first_selected(node) ? 'first-selected' :
- (node_root_selected(node) ? 'root-selected' :
- (node_selected(node) ? "selected" : "notselected"))) : "";
+ (node_selected(node) ? 'selected' :
+ (node_related(node) ? "related" : "notselected"))) : "";
}
-var selected_class__link = function(link, temporary) {
- return !temporary && selected_nodes.length > 0 ? (link_selected(link) ? "selected" : "notselected") : "";
+var class__link = function(link, temporary) {
+ return !temporary && related.length > 0 ? (link_selected(link) ? "selected" : "notselected") : "";
}
var clear = function()
@@ -234,20 +198,20 @@ var inner_select_nodes = function(nodes)
var select_nodes = function(nodes)
{
var new_nodes = nodes;
- var not_same = !arr_compare(new_nodes, root_nodes);
+ var not_same = !arr_compare(new_nodes, selected);
if (not_same) {
inner_select_nodes(new_nodes);
}
}
-var inner_select = function(new_root_nodes, new_selected_nodes)
+var inner_select = function(new_selected, new_related)
{
- if (arr_compare(new_root_nodes, root_nodes) && arr_compare(new_selected_nodes, selected_nodes)) {
+ if (arr_compare(new_selected, selected) && arr_compare(new_related, related)) {
// no change
return;
}
- updateSelectedNodesBus(new_root_nodes, new_selected_nodes);
+ updateSelectedNodesBus(new_selected, new_related);
}
function nodes_from_link(link)
@@ -257,9 +221,9 @@ function nodes_from_link(link)
var select_link = function(link)
{
- var new_root_nodes = nodes_from_link(link);
+ var new_selected = nodes_from_link(link);
- inner_select(new_root_nodes, new_root_nodes);
+ inner_select(new_selected, new_selected);
}
function invert(initial, inverted)
@@ -270,42 +234,42 @@ function invert(initial, inverted)
var invert_link = function(link)
{
var link_nodes = nodes_from_link(link),
- new_root_nodes = invert(root_nodes, link_nodes),
- new_selected_nodes = invert(selected_nodes, link_nodes);
+ new_selected = invert(selected, link_nodes),
+ new_related = invert(related, link_nodes);
- inner_select(new_root_nodes, new_selected_nodes);
+ inner_select(new_selected, new_related);
}
var invert_nodes = function(nodes)
{
- select_nodes(invert(root_nodes, nodes));
+ select_nodes(invert(selected, nodes));
}
var setup_toolbar = function(main_graph)
{
- var merge_root_selection = function() {
- main_graph.nodes__merge(root_nodes_ids());
+ var merge_selection = function() {
+ main_graph.nodes__merge(selected_ids());
},
- delete_root_selection = function() {
- var ids = root_nodes_ids();
+ delete_selection = function() {
+ var ids = selected_ids();
if (confirm(messages.delete_nodes_message(ids.length))) {
main_graph.nodes__delete(ids);
}
},
- link_fan_root_selection = function() {
- main_graph.nodes__link_fan(root_nodes_ids());
+ link_fan_selection = function() {
+ main_graph.nodes__link_fan(selected_ids());
},
merge_btn = $('#btn_merge'),
delete_btn = $('#btn_delete'),
link_fan_btn = $('#btn_link_fan'),
multiple_node_operations = $('#tool-bar-multiple-node-operations');
- merge_btn.asEventStream('click').onValue(merge_root_selection);
- delete_btn.asEventStream('click').onValue(delete_root_selection);
- link_fan_btn.asEventStream('click').onValue(link_fan_root_selection);
+ merge_btn.asEventStream('click').onValue(merge_selection);
+ delete_btn.asEventStream('click').onValue(delete_selection);
+ link_fan_btn.asEventStream('click').onValue(link_fan_selection);
- selectionChangedBus.map(function (selection) { return selection.root_nodes.length > 1; })
+ selectionChangedBus.map(function (selection) { return selection.selected.length > 1; })
.skipDuplicates()
.onValue(function (visible) {
if (visible) {
@@ -317,7 +281,7 @@ var setup_toolbar = function(main_graph)
}
var is_empty = function() {
- return root_nodes.length == 0;
+ return selected && selected.length == 0;
}
// initialize
@@ -332,15 +296,15 @@ return {
invert_nodes: invert_nodes,
select_link: select_link,
invert_link: invert_link,
- selected_class__node: selected_class__node,
- selected_class__link: selected_class__link,
+ class__node: class__node,
+ class__link: class__link,
node_selected: node_selected,
link_selected: link_selected,
selectionChangedBus: selectionChangedBus,
setup_toolbar: setup_toolbar,
- root_nodes: function() { return root_nodes; },
- selected_nodes: function() { return selected_nodes; },
+ selected: function() { return selected; },
+ related: function() { return related; },
};
});