Index: tools/turbolizer/graph-view.js |
diff --git a/tools/turbolizer/graph-view.js b/tools/turbolizer/graph-view.js |
index aa1b638f57ba248de205754882c872ff48231405..83d541acf0725017f73a14f21e43234a56879238 100644 |
--- a/tools/turbolizer/graph-view.js |
+++ b/tools/turbolizer/graph-view.js |
@@ -169,6 +169,14 @@ class GraphView extends View { |
graph.toggleTypes(); |
}); |
+ d3.select("#show-effects").on("click", function() { |
+ graph.showEffects(); |
+ }); |
+ |
+ d3.select("#hide-control").on("click", function() { |
+ graph.hideControl(); |
+ }); |
+ |
d3.select("#search-input").on("keydown", function() { |
if (d3.event.keyCode == 13) { |
graph.state.selection.clear(); |
@@ -612,10 +620,34 @@ class GraphView extends View { |
.on("mousedown", function(d){ |
var components = this.id.split(','); |
var node = graph.nodeMap[components[3]]; |
- var edge = node.inputs[components[2]]; |
- var visible = !edge.isVisible(); |
- node.setInputVisibility(components[2], visible); |
- d3.event.stopPropagation(); |
+ var edgeIndex = components[2]; |
+ var edge = node.inputs[edgeIndex]; |
+ if (d3.event.button == 0) { |
+ // Left mouse button click: show the edge and the node it leads |
+ // to. |
+ var visible = !edge.isVisible(); |
+ node.setInputVisibility(components[2], visible); |
+ d3.event.stopPropagation(); |
+ } else { |
+ // Alternate mouse button click: as above, but more: if we |
+ // clicked the nth input bubble, expand all nth input bubbles of |
+ // nodes that have the same opcode. If in this process we make |
+ // more nodes visible that have the same opcode, also expand |
+ // their nth input bubbles, until we stabilize. |
+ filterActionUntilStabilize(graph.nodes, |
+ // filter |
+ function(otherNode) { |
+ return (node.opcode === otherNode.opcode) && |
+ (otherNode.visible) && |
+ (otherNode.inputs.length >= edgeIndex) && |
+ (!otherNode.inputs[edgeIndex].visible); |
+ }, |
+ // action |
+ function(otherNode) { |
+ otherNode.setInputVisibility(edgeIndex, true); |
+ }); |
+ } |
+ |
graph.updateGraphVisibility(); |
}); |
} |
@@ -815,6 +847,47 @@ class GraphView extends View { |
graph.updateGraphVisibility(); |
} |
+ showEffects() { |
+ var graph = this; |
+ |
+ // Loop over all the nodes to find nodes which are visible. All effect |
+ // edges to a visible node should become visible, as well as the source |
+ // node of such edges. As long as more nodes become visible, repeat the |
+ // process. |
+ |
+ filterActionUntilStabilize(graph.nodes, |
+ // filter |
+ function(node) { |
+ return node.visible; |
+ }, |
+ // action |
+ function(node) { |
+ node.inputs.forEach(function(inputEdge) { |
+ if (node !== inputEdge.target) { |
+ window.alert("Error: target of an input edge should be the node itself"); |
+ } |
+ if (!inputEdge.visible && inputEdge.type == "effect") { |
+ node.setInputVisibility(inputEdge.index, true); |
+ } |
+ }); |
+ } |
+ ); |
+ |
+ graph.updateGraphVisibility(); |
+ } |
+ |
+ hideControl() { |
+ var graph = this; |
+ |
+ graph.edges.forEach(function(edge) { |
+ if (edge.type == "control") { |
+ edge.visible = false; |
+ } |
+ }); |
+ |
+ graph.updateGraphVisibility(); |
+ } |
+ |
viewSelection() { |
var graph = this; |
var minX, maxX, minY, maxY; |