Simon Hunt

GUI -- [ONOS-282] - clean up drag behavior API.

Change-Id: I562eedd6f075afdd8d35e109fda9c6cd1d594d82
...@@ -23,24 +23,41 @@ ...@@ -23,24 +23,41 @@
23 (function (onos) { 23 (function (onos) {
24 'use strict'; 24 'use strict';
25 25
26 - function createDragBehavior(force, selectCb, atDragEnd, requireMeta) { 26 + function isF(f) {
27 + return $.isFunction(f) ? f : null;
28 + }
29 +
30 + function createDragBehavior(force, selectCb, atDragEnd, enabled) {
27 var draggedThreshold = d3.scale.linear() 31 var draggedThreshold = d3.scale.linear()
28 .domain([0, 0.1]) 32 .domain([0, 0.1])
29 .range([5, 20]) 33 .range([5, 20])
30 .clamp(true), 34 .clamp(true),
31 - drag; 35 + drag,
36 + fSel = isF(selectCb),
37 + fEnd = isF(atDragEnd),
38 + fEnb = isF(enabled),
39 + bad = [];
40 +
41 + function naf(what) {
42 + return 'd3util.createDragBehavior(): '+ what + ' is not a function';
43 + }
32 44
33 - // TODO: better validation of parameters 45 + if (!fSel) {
34 - if (!$.isFunction(selectCb)) { 46 + bad.push(naf('selectCb'));
35 - alert('d3util.createDragBehavior(): selectCb is not a function')
36 } 47 }
37 - if (!$.isFunction(atDragEnd)) { 48 + if (!fEnd) {
38 - alert('d3util.createDragBehavior(): atDragEnd is not a function') 49 + bad.push(naf('atDragEnd'));
39 } 50 }
40 - if (!$.isFunction(requireMeta)) { 51 + if (!fEnb) {
41 - alert('d3util.createDragBehavior(): requireMeta is not a function') 52 + bad.push(naf('enabled'));
42 } 53 }
43 54
55 + if (bad.length) {
56 + alert(bad.join('\n'));
57 + return null;
58 + }
59 +
60 +
44 function dragged(d) { 61 function dragged(d) {
45 var threshold = draggedThreshold(force.alpha()), 62 var threshold = draggedThreshold(force.alpha()),
46 dx = d.oldX - d.px, 63 dx = d.oldX - d.px,
...@@ -54,7 +71,7 @@ ...@@ -54,7 +71,7 @@
54 drag = d3.behavior.drag() 71 drag = d3.behavior.drag()
55 .origin(function(d) { return d; }) 72 .origin(function(d) { return d; })
56 .on('dragstart', function(d) { 73 .on('dragstart', function(d) {
57 - if (requireMeta() ^ !d3.event.sourceEvent.metaKey) { 74 + if (enabled()) {
58 d3.event.sourceEvent.stopPropagation(); 75 d3.event.sourceEvent.stopPropagation();
59 76
60 d.oldX = d.x; 77 d.oldX = d.x;
...@@ -65,7 +82,7 @@ ...@@ -65,7 +82,7 @@
65 } 82 }
66 }) 83 })
67 .on('drag', function(d) { 84 .on('drag', function(d) {
68 - if (requireMeta() ^ !d3.event.sourceEvent.metaKey) { 85 + if (enabled()) {
69 d.px = d3.event.x; 86 d.px = d3.event.x;
70 d.py = d3.event.y; 87 d.py = d3.event.y;
71 if (dragged(d)) { 88 if (dragged(d)) {
......
...@@ -206,7 +206,8 @@ ...@@ -206,7 +206,8 @@
206 showHosts = false, 206 showHosts = false,
207 showOffline = true, 207 showOffline = true,
208 useDetails = true, 208 useDetails = true,
209 - haveDetails = false; 209 + haveDetails = false,
210 + dragAllowed = true;
210 211
211 // constants 212 // constants
212 var hoverModeAll = 1, 213 var hoverModeAll = 1,
...@@ -2642,14 +2643,13 @@ ...@@ -2642,14 +2643,13 @@
2642 svg = view.$div.append('svg').attr('viewBox', viewBox); 2643 svg = view.$div.append('svg').attr('viewBox', viewBox);
2643 setSize(svg, view); 2644 setSize(svg, view);
2644 2645
2646 + // load glyphs and filters...
2645 loadGlyphs(svg); 2647 loadGlyphs(svg);
2648 + d3u.appendGlow(svg);
2646 2649
2647 zoomPanContainer = svg.append('g').attr('id', 'zoomPanContainer'); 2650 zoomPanContainer = svg.append('g').attr('id', 'zoomPanContainer');
2648 setupZoomPan(); 2651 setupZoomPan();
2649 2652
2650 - // add blue glow filter to svg layer
2651 - d3u.appendGlow(zoomPanContainer);
2652 -
2653 // group for the topology 2653 // group for the topology
2654 topoG = zoomPanContainer.append('g') 2654 topoG = zoomPanContainer.append('g')
2655 .attr('id', 'topo-G') 2655 .attr('id', 'topo-G')
...@@ -2691,6 +2691,14 @@ ...@@ -2691,6 +2691,14 @@
2691 } 2691 }
2692 } 2692 }
2693 2693
2694 + // predicate that indicates when dragging is active
2695 + function dragEnabled() {
2696 + // meta key pressed means we are zooming/panning (so disable drag)
2697 + return dragAllowed && !d3.event.sourceEvent.metaKey;
2698 + // dragAllowed will be set false when we are in oblique view
2699 + // or when we 'lock' node positions
2700 + }
2701 +
2694 // set up the force layout 2702 // set up the force layout
2695 network.force = d3.layout.force() 2703 network.force = d3.layout.force()
2696 .size(forceDim) 2704 .size(forceDim)
...@@ -2704,10 +2712,16 @@ ...@@ -2704,10 +2712,16 @@
2704 .on('tick', tick); 2712 .on('tick', tick);
2705 2713
2706 network.drag = d3u.createDragBehavior(network.force, 2714 network.drag = d3u.createDragBehavior(network.force,
2707 - selectCb, atDragEnd, panZoom); 2715 + selectCb, atDragEnd, dragEnabled);
2716 +
2708 2717
2709 // create mask layer for when we lose connection to server. 2718 // create mask layer for when we lose connection to server.
2710 // TODO: this should be part of the framework 2719 // TODO: this should be part of the framework
2720 +
2721 + function para(sel, text) {
2722 + sel.append('p').text(text);
2723 + }
2724 +
2711 mask = view.$div.append('div').attr('id','topo-mask'); 2725 mask = view.$div.append('div').attr('id','topo-mask');
2712 para(mask, 'Oops!'); 2726 para(mask, 'Oops!');
2713 para(mask, 'Web-socket connection to server closed...'); 2727 para(mask, 'Web-socket connection to server closed...');
...@@ -2731,10 +2745,6 @@ ...@@ -2731,10 +2745,6 @@
2731 }) 2745 })
2732 } 2746 }
2733 2747
2734 - function para(sel, text) {
2735 - sel.append('p').text(text);
2736 - }
2737 -
2738 2748
2739 function load(view, ctx, flags) { 2749 function load(view, ctx, flags) {
2740 // resize, in case the window was resized while we were not loaded 2750 // resize, in case the window was resized while we were not loaded
......