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 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 } | 242 } |
243 | 243 |
244 getNodeHeight(graph) { | 244 getNodeHeight(graph) { |
245 if (this.state.showTypes) { | 245 if (this.state.showTypes) { |
246 return DEFAULT_NODE_HEIGHT + TYPE_HEIGHT; | 246 return DEFAULT_NODE_HEIGHT + TYPE_HEIGHT; |
247 } else { | 247 } else { |
248 return DEFAULT_NODE_HEIGHT; | 248 return DEFAULT_NODE_HEIGHT; |
249 } | 249 } |
250 } | 250 } |
251 | 251 |
| 252 getEdgeFrontier(nodes, inEdges, edgeFilter) { |
| 253 let frontier = new Set(); |
| 254 nodes.forEach(function(element) { |
| 255 var edges = inEdges ? element.__data__.inputs : element.__data__.outputs; |
| 256 var edgeNumber = 0; |
| 257 edges.forEach(function(edge) { |
| 258 if (edgeFilter == undefined || edgeFilter(edge, edgeNumber)) { |
| 259 frontier.add(edge); |
| 260 } |
| 261 ++edgeNumber; |
| 262 }); |
| 263 }); |
| 264 return frontier; |
| 265 } |
| 266 |
| 267 getNodeFrontier(nodes, inEdges, edgeFilter) { |
| 268 let graph = this; |
| 269 var frontier = new Set(); |
| 270 var newState = true; |
| 271 var edgeFrontier = graph.getEdgeFrontier(nodes, inEdges, edgeFilter); |
| 272 // Control key toggles edges rather than just turning them on |
| 273 if (d3.event.ctrlKey) { |
| 274 edgeFrontier.forEach(function(edge) { |
| 275 if (edge.visible) { |
| 276 newState = false; |
| 277 } |
| 278 }); |
| 279 } |
| 280 edgeFrontier.forEach(function(edge) { |
| 281 edge.visible = newState; |
| 282 if (newState) { |
| 283 var node = inEdges ? edge.source : edge.target; |
| 284 node.visible = true; |
| 285 frontier.add(node); |
| 286 } |
| 287 }); |
| 288 graph.updateGraphVisibility(); |
| 289 if (newState) { |
| 290 return graph.visibleNodes.filter(function(n) { |
| 291 return frontier.has(n); |
| 292 }); |
| 293 } else { |
| 294 return undefined; |
| 295 } |
| 296 } |
| 297 |
252 dragmove(d) { | 298 dragmove(d) { |
253 var graph = this; | 299 var graph = this; |
254 d.x += d3.event.dx; | 300 d.x += d3.event.dx; |
255 d.y += d3.event.dy; | 301 d.y += d3.event.dy; |
256 graph.updateGraphVisibility(); | 302 graph.updateGraphVisibility(); |
257 } | 303 } |
258 | 304 |
259 initializeContent(data, rememberedSelection) { | 305 initializeContent(data, rememberedSelection) { |
260 this.createGraph(data, rememberedSelection); | 306 this.createGraph(data, rememberedSelection); |
261 if (rememberedSelection != null) { | 307 if (rememberedSelection != null) { |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 var selection = graph.state.selection; | 517 var selection = graph.state.selection; |
472 selection.select(d3.select(this), selected); | 518 selection.select(d3.select(this), selected); |
473 }); | 519 }); |
474 } | 520 } |
475 | 521 |
476 selectAllNodes(inEdges, filter) { | 522 selectAllNodes(inEdges, filter) { |
477 var graph = this; | 523 var graph = this; |
478 if (!d3.event.shiftKey) { | 524 if (!d3.event.shiftKey) { |
479 graph.state.selection.clear(); | 525 graph.state.selection.clear(); |
480 } | 526 } |
481 graph.visibleNodes.each(function(n) { | 527 graph.state.selection.select(graph.visibleNodes[0], true); |
482 graph.state.selection.select(this, true); | |
483 }); | |
484 graph.updateGraphVisibility(); | 528 graph.updateGraphVisibility(); |
485 } | 529 } |
486 | 530 |
487 svgMouseDown() { | 531 svgMouseDown() { |
488 this.state.graphMouseDown = true; | 532 this.state.graphMouseDown = true; |
489 } | 533 } |
490 | 534 |
491 svgMouseUp() { | 535 svgMouseUp() { |
492 var graph = this, | 536 var graph = this, |
493 state = graph.state; | 537 state = graph.state; |
(...skipping 10 matching lines...) Expand all Loading... |
504 state.graphMouseDown = false; | 548 state.graphMouseDown = false; |
505 } | 549 } |
506 | 550 |
507 svgKeyDown() { | 551 svgKeyDown() { |
508 var state = this.state; | 552 var state = this.state; |
509 var graph = this; | 553 var graph = this; |
510 | 554 |
511 // Don't handle key press repetition | 555 // Don't handle key press repetition |
512 if(state.lastKeyDown !== -1) return; | 556 if(state.lastKeyDown !== -1) return; |
513 | 557 |
514 var getEdgeFrontier = function(inEdges, edgeFilter) { | 558 var showSelectionFrontierNodes = function(inEdges, filter, select) { |
515 var frontierSet = new Set(); | 559 var frontier = graph.getNodeFrontier(state.selection.selection, inEdges, f
ilter); |
516 var newState = true; | |
517 if (d3.event.ctrlKey) { | |
518 state.selection.selection.forEach(function(element) { | |
519 var edges = inEdges ? element.__data__.inputs : element.__data__.outpu
ts; | |
520 var edgeNumber = 0; | |
521 // Control key toggles edges rather than just turning them on | |
522 edges.forEach(function(i) { | |
523 if (edgeFilter == undefined || edgeFilter(i, edgeNumber)) { | |
524 if (i.visible) { | |
525 newState = false; | |
526 } | |
527 } | |
528 ++edgeNumber; | |
529 }); | |
530 }); | |
531 } | |
532 state.selection.selection.forEach(function(element) { | |
533 var edges = inEdges ? element.__data__.inputs : element.__data__.outputs
; | |
534 var edgeNumber = 0; | |
535 edges.forEach(function(i) { | |
536 if (edgeFilter == undefined || edgeFilter(i, edgeNumber)) { | |
537 i.visible = newState; | |
538 if (newState) { | |
539 var candidate = inEdges ? i.source : i.target; | |
540 candidate.visible = true; | |
541 frontierSet.add(candidate); | |
542 } | |
543 } | |
544 ++edgeNumber; | |
545 }); | |
546 }); | |
547 graph.updateGraphVisibility(); | |
548 if (newState) { | |
549 return graph.visibleNodes.filter(function(n) { | |
550 return frontierSet.has(n); | |
551 }); | |
552 } else { | |
553 return undefined; | |
554 } | |
555 } | |
556 | |
557 var selectNodesThroughEdges = function(inEdges, filter, reselect) { | |
558 var frontier = getEdgeFrontier(inEdges, filter); | |
559 if (frontier != undefined) { | 560 if (frontier != undefined) { |
560 if (reselect) { | 561 if (select) { |
561 if (!d3.event.shiftKey) { | 562 if (!d3.event.shiftKey) { |
562 state.selection.clear(); | 563 state.selection.clear(); |
563 } | 564 } |
564 frontier.each(function(n) { | 565 state.selection.select(frontier[0], true); |
565 state.selection.select(this, true); | |
566 }); | |
567 } | 566 } |
568 graph.updateGraphVisibility(); | 567 graph.updateGraphVisibility(); |
569 } | 568 } |
570 allowRepetition = false; | 569 allowRepetition = false; |
571 } | 570 } |
572 | 571 |
573 var allowRepetition = true; | 572 var allowRepetition = true; |
574 var eventHandled = true; // unless the below switch defaults | 573 var eventHandled = true; // unless the below switch defaults |
575 switch(d3.event.keyCode) { | 574 switch(d3.event.keyCode) { |
576 case 49: | 575 case 49: |
577 case 50: | 576 case 50: |
578 case 51: | 577 case 51: |
579 case 52: | 578 case 52: |
580 case 53: | 579 case 53: |
581 case 54: | 580 case 54: |
582 case 55: | 581 case 55: |
583 case 56: | 582 case 56: |
584 case 57: | 583 case 57: |
585 // '1'-'9' | 584 // '1'-'9' |
586 selectNodesThroughEdges(true, | 585 showSelectionFrontierNodes(true, |
587 (edge, index) => { return index == (d3.event.keyCo
de - 49); }, | 586 (edge, index) => { return index == (d3.event.keyCode - 49); }, |
588 false); | 587 false); |
589 break; | 588 break; |
590 case 67: | 589 case 67: |
591 // 'c' | 590 // 'c' |
592 selectNodesThroughEdges(true, | 591 showSelectionFrontierNodes(true, |
593 (edge, index) => { return edge.type == 'control';
}, | 592 (edge, index) => { return edge.type == 'control'; }, |
594 false); | 593 false); |
595 break; | 594 break; |
596 case 69: | 595 case 69: |
597 // 'e' | 596 // 'e' |
598 selectNodesThroughEdges(true, | 597 showSelectionFrontierNodes(true, |
599 (edge, index) => { return edge.type == 'effect'; }
, | 598 (edge, index) => { return edge.type == 'effect'; }, |
600 false); | 599 false); |
601 break; | 600 break; |
602 case 79: | 601 case 79: |
603 // 'o' | 602 // 'o' |
604 selectNodesThroughEdges(false, undefined, false); | 603 showSelectionFrontierNodes(false, undefined, false); |
605 break; | 604 break; |
606 case 73: | 605 case 73: |
607 // 'i' | 606 // 'i' |
608 selectNodesThroughEdges(true, undefined, false); | 607 showSelectionFrontierNodes(true, undefined, false); |
609 break; | 608 break; |
610 case 65: | 609 case 65: |
611 // 'a' | 610 // 'a' |
612 graph.selectAllNodes(); | 611 graph.selectAllNodes(); |
613 allowRepetition = false; | 612 allowRepetition = false; |
614 break; | 613 break; |
615 case 38: | 614 case 38: |
616 case 40: { | 615 case 40: { |
617 selectNodesThroughEdges(d3.event.keyCode == 38, undefined, true); | 616 showSelectionFrontierNodes(d3.event.keyCode == 38, undefined, true); |
618 break; | 617 break; |
619 } | 618 } |
620 default: | 619 default: |
621 eventHandled = false; | 620 eventHandled = false; |
622 break; | 621 break; |
623 } | 622 } |
624 if (eventHandled) { | 623 if (eventHandled) { |
625 d3.event.preventDefault(); | 624 d3.event.preventDefault(); |
626 } | 625 } |
627 if (!allowRepetition) { | 626 if (!allowRepetition) { |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
979 } | 978 } |
980 | 979 |
981 viewWholeGraph() { | 980 viewWholeGraph() { |
982 var graph = this; | 981 var graph = this; |
983 var minScale = graph.minScale(); | 982 var minScale = graph.minScale(); |
984 var translation = [0, 0]; | 983 var translation = [0, 0]; |
985 translation = graph.getVisibleTranslation(translation, minScale); | 984 translation = graph.getVisibleTranslation(translation, minScale); |
986 graph.translateClipped(translation, minScale); | 985 graph.translateClipped(translation, minScale); |
987 } | 986 } |
988 } | 987 } |
OLD | NEW |