Index: tools/turbolizer/graph-view.js |
diff --git a/tools/turbolizer/graph-view.js b/tools/turbolizer/graph-view.js |
index 39eb775ba675aa5fc7515fa17dec14a1359fe0fa..41d35d84ba63bcdacabb5ac18b8000659d8d1aa6 100644 |
--- a/tools/turbolizer/graph-view.js |
+++ b/tools/turbolizer/graph-view.js |
@@ -249,6 +249,52 @@ class GraphView extends View { |
} |
} |
+ getEdgeFrontier(nodes, inEdges, edgeFilter) { |
+ let frontier = new Set(); |
+ nodes.forEach(function(element) { |
+ var edges = inEdges ? element.__data__.inputs : element.__data__.outputs; |
+ var edgeNumber = 0; |
+ edges.forEach(function(edge) { |
+ if (edgeFilter == undefined || edgeFilter(edge, edgeNumber)) { |
+ frontier.add(edge); |
+ } |
+ ++edgeNumber; |
+ }); |
+ }); |
+ return frontier; |
+ } |
+ |
+ getNodeFrontier(nodes, inEdges, edgeFilter) { |
+ let graph = this; |
+ var frontier = new Set(); |
+ var newState = true; |
+ var edgeFrontier = graph.getEdgeFrontier(nodes, inEdges, edgeFilter); |
+ // Control key toggles edges rather than just turning them on |
+ if (d3.event.ctrlKey) { |
+ edgeFrontier.forEach(function(edge) { |
+ if (edge.visible) { |
+ newState = false; |
+ } |
+ }); |
+ } |
+ edgeFrontier.forEach(function(edge) { |
+ edge.visible = newState; |
+ if (newState) { |
+ var node = inEdges ? edge.source : edge.target; |
+ node.visible = true; |
+ frontier.add(node); |
+ } |
+ }); |
+ graph.updateGraphVisibility(); |
+ if (newState) { |
+ return graph.visibleNodes.filter(function(n) { |
+ return frontier.has(n); |
+ }); |
+ } else { |
+ return undefined; |
+ } |
+ } |
+ |
dragmove(d) { |
var graph = this; |
d.x += d3.event.dx; |
@@ -478,9 +524,7 @@ class GraphView extends View { |
if (!d3.event.shiftKey) { |
graph.state.selection.clear(); |
} |
- graph.visibleNodes.each(function(n) { |
- graph.state.selection.select(this, true); |
- }); |
+ graph.state.selection.select(graph.visibleNodes[0], true); |
graph.updateGraphVisibility(); |
} |
@@ -511,59 +555,14 @@ class GraphView extends View { |
// Don't handle key press repetition |
if(state.lastKeyDown !== -1) return; |
- var getEdgeFrontier = function(inEdges, edgeFilter) { |
- var frontierSet = new Set(); |
- var newState = true; |
- if (d3.event.ctrlKey) { |
- state.selection.selection.forEach(function(element) { |
- var edges = inEdges ? element.__data__.inputs : element.__data__.outputs; |
- var edgeNumber = 0; |
- // Control key toggles edges rather than just turning them on |
- edges.forEach(function(i) { |
- if (edgeFilter == undefined || edgeFilter(i, edgeNumber)) { |
- if (i.visible) { |
- newState = false; |
- } |
- } |
- ++edgeNumber; |
- }); |
- }); |
- } |
- state.selection.selection.forEach(function(element) { |
- var edges = inEdges ? element.__data__.inputs : element.__data__.outputs; |
- var edgeNumber = 0; |
- edges.forEach(function(i) { |
- if (edgeFilter == undefined || edgeFilter(i, edgeNumber)) { |
- i.visible = newState; |
- if (newState) { |
- var candidate = inEdges ? i.source : i.target; |
- candidate.visible = true; |
- frontierSet.add(candidate); |
- } |
- } |
- ++edgeNumber; |
- }); |
- }); |
- graph.updateGraphVisibility(); |
- if (newState) { |
- return graph.visibleNodes.filter(function(n) { |
- return frontierSet.has(n); |
- }); |
- } else { |
- return undefined; |
- } |
- } |
- |
- var selectNodesThroughEdges = function(inEdges, filter, reselect) { |
- var frontier = getEdgeFrontier(inEdges, filter); |
+ var showSelectionFrontierNodes = function(inEdges, filter, select) { |
+ var frontier = graph.getNodeFrontier(state.selection.selection, inEdges, filter); |
if (frontier != undefined) { |
- if (reselect) { |
+ if (select) { |
if (!d3.event.shiftKey) { |
state.selection.clear(); |
} |
- frontier.each(function(n) { |
- state.selection.select(this, true); |
- }); |
+ state.selection.select(frontier[0], true); |
} |
graph.updateGraphVisibility(); |
} |
@@ -583,29 +582,29 @@ class GraphView extends View { |
case 56: |
case 57: |
// '1'-'9' |
- selectNodesThroughEdges(true, |
- (edge, index) => { return index == (d3.event.keyCode - 49); }, |
- false); |
+ showSelectionFrontierNodes(true, |
+ (edge, index) => { return index == (d3.event.keyCode - 49); }, |
+ false); |
break; |
case 67: |
// 'c' |
- selectNodesThroughEdges(true, |
- (edge, index) => { return edge.type == 'control'; }, |
- false); |
+ showSelectionFrontierNodes(true, |
+ (edge, index) => { return edge.type == 'control'; }, |
+ false); |
break; |
case 69: |
// 'e' |
- selectNodesThroughEdges(true, |
- (edge, index) => { return edge.type == 'effect'; }, |
- false); |
+ showSelectionFrontierNodes(true, |
+ (edge, index) => { return edge.type == 'effect'; }, |
+ false); |
break; |
case 79: |
// 'o' |
- selectNodesThroughEdges(false, undefined, false); |
+ showSelectionFrontierNodes(false, undefined, false); |
break; |
case 73: |
// 'i' |
- selectNodesThroughEdges(true, undefined, false); |
+ showSelectionFrontierNodes(true, undefined, false); |
break; |
case 65: |
// 'a' |
@@ -614,7 +613,7 @@ class GraphView extends View { |
break; |
case 38: |
case 40: { |
- selectNodesThroughEdges(d3.event.keyCode == 38, undefined, true); |
+ showSelectionFrontierNodes(d3.event.keyCode == 38, undefined, true); |
break; |
} |
default: |