OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 "use strict"; | 5 "use strict"; |
6 | 6 |
7 class GraphView extends View { | 7 class GraphView extends View { |
8 constructor (d3, id, nodes, edges, broker) { | 8 constructor (d3, id, nodes, edges, broker) { |
9 super(id, broker); | 9 super(id, broker); |
10 var graph = this; | 10 var graph = this; |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 }); | 162 }); |
163 | 163 |
164 d3.select("#zoom-selection").on("click", function() { | 164 d3.select("#zoom-selection").on("click", function() { |
165 graph.viewSelection(); | 165 graph.viewSelection(); |
166 }); | 166 }); |
167 | 167 |
168 d3.select("#toggle-types").on("click", function() { | 168 d3.select("#toggle-types").on("click", function() { |
169 graph.toggleTypes(); | 169 graph.toggleTypes(); |
170 }); | 170 }); |
171 | 171 |
| 172 d3.select("#show-effects").on("click", function() { |
| 173 graph.showEffects(); |
| 174 }); |
| 175 |
| 176 d3.select("#hide-control").on("click", function() { |
| 177 graph.hideControl(); |
| 178 }); |
| 179 |
172 d3.select("#search-input").on("keydown", function() { | 180 d3.select("#search-input").on("keydown", function() { |
173 if (d3.event.keyCode == 13) { | 181 if (d3.event.keyCode == 13) { |
174 graph.state.selection.clear(); | 182 graph.state.selection.clear(); |
175 var reg = new RegExp(this.value); | 183 var reg = new RegExp(this.value); |
176 var selected = graph.visibleNodes.each(function(n) { | 184 var selected = graph.visibleNodes.each(function(n) { |
177 if (reg.exec(n.getDisplayLabel()) != null || | 185 if (reg.exec(n.getDisplayLabel()) != null || |
178 (graph.state.showTypes && reg.exec(n.getDisplayType())) || | 186 (graph.state.showTypes && reg.exec(n.getDisplayType())) || |
179 reg.exec(n.opcode) != null) { | 187 reg.exec(n.opcode) != null) { |
180 graph.state.selection.select(this, true); | 188 graph.state.selection.select(this, true); |
181 } | 189 } |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 return !d.inputs[i].isVisible(); | 613 return !d.inputs[i].isVisible(); |
606 } ) | 614 } ) |
607 .attr("id", "ib," + d.inputs[i].stringID()) | 615 .attr("id", "ib," + d.inputs[i].stringID()) |
608 .attr("r", DEFAULT_NODE_BUBBLE_RADIUS) | 616 .attr("r", DEFAULT_NODE_BUBBLE_RADIUS) |
609 .attr("transform", function(d) { | 617 .attr("transform", function(d) { |
610 return "translate(" + x + "," + y + ")"; | 618 return "translate(" + x + "," + y + ")"; |
611 }) | 619 }) |
612 .on("mousedown", function(d){ | 620 .on("mousedown", function(d){ |
613 var components = this.id.split(','); | 621 var components = this.id.split(','); |
614 var node = graph.nodeMap[components[3]]; | 622 var node = graph.nodeMap[components[3]]; |
615 var edge = node.inputs[components[2]]; | 623 var edgeIndex = components[2]; |
616 var visible = !edge.isVisible(); | 624 var edge = node.inputs[edgeIndex]; |
617 node.setInputVisibility(components[2], visible); | 625 if (d3.event.button == 0) { |
618 d3.event.stopPropagation(); | 626 // Left mouse button click: show the edge and the node it leads |
| 627 // to. |
| 628 var visible = !edge.isVisible(); |
| 629 node.setInputVisibility(components[2], visible); |
| 630 d3.event.stopPropagation(); |
| 631 } else { |
| 632 // Alternate mouse button click: as above, but more: if we |
| 633 // clicked the nth input bubble, expand all nth input bubbles of |
| 634 // nodes that have the same opcode. If in this process we make |
| 635 // more nodes visible that have the same opcode, also expand |
| 636 // their nth input bubbles, until we stabilize. |
| 637 filterActionUntilStabilize(graph.nodes, |
| 638 // filter |
| 639 function(otherNode) { |
| 640 return (node.opcode === otherNode.opcode) && |
| 641 (otherNode.visible) && |
| 642 (otherNode.inputs.length >= edgeIndex) && |
| 643 (!otherNode.inputs[edgeIndex].visible); |
| 644 }, |
| 645 // action |
| 646 function(otherNode) { |
| 647 otherNode.setInputVisibility(edgeIndex, true); |
| 648 }); |
| 649 } |
| 650 |
619 graph.updateGraphVisibility(); | 651 graph.updateGraphVisibility(); |
620 }); | 652 }); |
621 } | 653 } |
622 if (d.outputs.length != 0) { | 654 if (d.outputs.length != 0) { |
623 var x = d.getOutputX(); | 655 var x = d.getOutputX(); |
624 var y = graph.getNodeHeight() + DEFAULT_NODE_BUBBLE_RADIUS / 2 + 4; | 656 var y = graph.getNodeHeight() + DEFAULT_NODE_BUBBLE_RADIUS / 2 + 4; |
625 var s = g.append('circle') | 657 var s = g.append('circle') |
626 .classed("filledBubbleStyle", function(c) { | 658 .classed("filledBubbleStyle", function(c) { |
627 return d.areAnyOutputsVisible() == 2; | 659 return d.areAnyOutputsVisible() == 2; |
628 } ) | 660 } ) |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 graph.state.showTypes = !graph.state.showTypes; | 840 graph.state.showTypes = !graph.state.showTypes; |
809 var element = document.getElementById('toggle-types'); | 841 var element = document.getElementById('toggle-types'); |
810 if (graph.state.showTypes) { | 842 if (graph.state.showTypes) { |
811 element.classList.add('button-input-toggled'); | 843 element.classList.add('button-input-toggled'); |
812 } else { | 844 } else { |
813 element.classList.remove('button-input-toggled'); | 845 element.classList.remove('button-input-toggled'); |
814 } | 846 } |
815 graph.updateGraphVisibility(); | 847 graph.updateGraphVisibility(); |
816 } | 848 } |
817 | 849 |
| 850 showEffects() { |
| 851 var graph = this; |
| 852 |
| 853 // Loop over all the nodes to find nodes which are visible. All effect |
| 854 // edges to a visible node should become visible, as well as the source |
| 855 // node of such edges. As long as more nodes become visible, repeat the |
| 856 // process. |
| 857 |
| 858 filterActionUntilStabilize(graph.nodes, |
| 859 // filter |
| 860 function(node) { |
| 861 return node.visible; |
| 862 }, |
| 863 // action |
| 864 function(node) { |
| 865 node.inputs.forEach(function(inputEdge) { |
| 866 if (node !== inputEdge.target) { |
| 867 window.alert("Error: target of an input edge should be the node itse
lf"); |
| 868 } |
| 869 if (!inputEdge.visible && inputEdge.type == "effect") { |
| 870 node.setInputVisibility(inputEdge.index, true); |
| 871 } |
| 872 }); |
| 873 } |
| 874 ); |
| 875 |
| 876 graph.updateGraphVisibility(); |
| 877 } |
| 878 |
| 879 hideControl() { |
| 880 var graph = this; |
| 881 |
| 882 graph.edges.forEach(function(edge) { |
| 883 if (edge.type == "control") { |
| 884 edge.visible = false; |
| 885 } |
| 886 }); |
| 887 |
| 888 graph.updateGraphVisibility(); |
| 889 } |
| 890 |
818 viewSelection() { | 891 viewSelection() { |
819 var graph = this; | 892 var graph = this; |
820 var minX, maxX, minY, maxY; | 893 var minX, maxX, minY, maxY; |
821 var hasSelection = false; | 894 var hasSelection = false; |
822 graph.visibleNodes.each(function(n) { | 895 graph.visibleNodes.each(function(n) { |
823 if (this.classList.contains("selected")) { | 896 if (this.classList.contains("selected")) { |
824 hasSelection = true; | 897 hasSelection = true; |
825 minX = minX ? Math.min(minX, n.x) : n.x; | 898 minX = minX ? Math.min(minX, n.x) : n.x; |
826 maxX = maxX ? Math.max(maxX, n.x + n.getTotalNodeWidth()) : | 899 maxX = maxX ? Math.max(maxX, n.x + n.getTotalNodeWidth()) : |
827 n.x + n.getTotalNodeWidth(); | 900 n.x + n.getTotalNodeWidth(); |
(...skipping 23 matching lines...) Expand all Loading... |
851 } | 924 } |
852 | 925 |
853 viewWholeGraph() { | 926 viewWholeGraph() { |
854 var graph = this; | 927 var graph = this; |
855 var minScale = graph.minScale(); | 928 var minScale = graph.minScale(); |
856 var translation = [0, 0]; | 929 var translation = [0, 0]; |
857 translation = graph.getVisibleTranslation(translation, minScale); | 930 translation = graph.getVisibleTranslation(translation, minScale); |
858 graph.translateClipped(translation, minScale); | 931 graph.translateClipped(translation, minScale); |
859 } | 932 } |
860 } | 933 } |
OLD | NEW |