diff options
| author | Alon Levy <alon@pobox.com> | 2015-04-12 14:13:57 +0200 |
|---|---|---|
| committer | Alon Levy <alon@pobox.com> | 2015-04-12 14:13:59 +0200 |
| commit | 7c5c6a917c8bce9d538c51becaf9a06fb1741bf5 (patch) | |
| tree | f60cb36ddca2e612e44756defcaafda9c39a8a50 /src | |
| parent | 8d16cbce9ec8aa139404f1823c4b68e0b4c1c02a (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')
| -rw-r--r-- | src/client/buttons.js | 2 | ||||
| -rw-r--r-- | src/client/keyshortcuts.js | 2 | ||||
| -rw-r--r-- | src/client/model/graph.js | 36 | ||||
| -rw-r--r-- | src/client/rz_core.js | 1 | ||||
| -rw-r--r-- | src/client/view/graph_view.js | 8 | ||||
| -rw-r--r-- | src/client/view/selection.js | 152 |
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; }, }; }); |
