Committed by
Gerrit Code Review
GUI -- [ONOS-267] -- Mouse gestures added to quick help.
- added ability for view to define 'gestures' to be added to quick help. - improved the layout of quick help by computing the widest 'key' and using that to space descriptions column. Change-Id: I5a5a38d3218857ba9bca33c8fc79be38f17f7316
Showing
3 changed files
with
63 additions
and
17 deletions
... | @@ -63,7 +63,8 @@ | ... | @@ -63,7 +63,8 @@ |
63 | globalKeys: {}, | 63 | globalKeys: {}, |
64 | maskedKeys: {}, | 64 | maskedKeys: {}, |
65 | viewKeys: {}, | 65 | viewKeys: {}, |
66 | - viewFn: null | 66 | + viewFn: null, |
67 | + viewGestures: [] | ||
67 | }, | 68 | }, |
68 | alerts = { | 69 | alerts = { |
69 | open: false, | 70 | open: false, |
... | @@ -452,6 +453,10 @@ | ... | @@ -452,6 +453,10 @@ |
452 | return true; | 453 | return true; |
453 | } | 454 | } |
454 | 455 | ||
456 | + function setGestureNotes(g) { | ||
457 | + keyHandler.viewGestures = isA(g) || []; | ||
458 | + } | ||
459 | + | ||
455 | function setKeyBindings(keyArg) { | 460 | function setKeyBindings(keyArg) { |
456 | var viewKeys, | 461 | var viewKeys, |
457 | masked = []; | 462 | masked = []; |
... | @@ -614,6 +619,7 @@ | ... | @@ -614,6 +619,7 @@ |
614 | uid: this.uid, | 619 | uid: this.uid, |
615 | setRadio: this.setRadio, | 620 | setRadio: this.setRadio, |
616 | setKeys: this.setKeys, | 621 | setKeys: this.setKeys, |
622 | + setGestures: this.setGestures, | ||
617 | dataLoadError: this.dataLoadError, | 623 | dataLoadError: this.dataLoadError, |
618 | alert: this.alert, | 624 | alert: this.alert, |
619 | flash: this.flash, | 625 | flash: this.flash, |
... | @@ -719,6 +725,10 @@ | ... | @@ -719,6 +725,10 @@ |
719 | setKeyBindings(keyArg); | 725 | setKeyBindings(keyArg); |
720 | }, | 726 | }, |
721 | 727 | ||
728 | + setGestures: function (g) { | ||
729 | + setGestureNotes(g); | ||
730 | + }, | ||
731 | + | ||
722 | getTheme: function () { | 732 | getTheme: function () { |
723 | return current.theme; | 733 | return current.theme; |
724 | }, | 734 | }, | ... | ... |
... | @@ -43,7 +43,8 @@ | ... | @@ -43,7 +43,8 @@ |
43 | svg = qhdiv.select('svg'), | 43 | svg = qhdiv.select('svg'), |
44 | pane, | 44 | pane, |
45 | rect, | 45 | rect, |
46 | - items; | 46 | + items, |
47 | + keyAgg; | ||
47 | 48 | ||
48 | // General functions | 49 | // General functions |
49 | function isA(a) { | 50 | function isA(a) { |
... | @@ -73,7 +74,7 @@ | ... | @@ -73,7 +74,7 @@ |
73 | var pad = 8, | 74 | var pad = 8, |
74 | offy = 45, | 75 | offy = 45, |
75 | dy = 14, | 76 | dy = 14, |
76 | - offDesc = 40; | 77 | + offDesc = 8; |
77 | 78 | ||
78 | // D3 magic | 79 | // D3 magic |
79 | function updateKeyItems() { | 80 | function updateKeyItems() { |
... | @@ -91,7 +92,7 @@ | ... | @@ -91,7 +92,7 @@ |
91 | var el = d3.select(this), | 92 | var el = d3.select(this), |
92 | y = offy + dy * i; | 93 | y = offy + dy * i; |
93 | 94 | ||
94 | - if (d.id === '_') { | 95 | + if (d.id[0] === '_') { |
95 | el.append('line') | 96 | el.append('line') |
96 | .attr({ x1: 0, y1: y, x2: 1, y2: y}); | 97 | .attr({ x1: 0, y1: y, x2: 1, y2: y}); |
97 | } else { | 98 | } else { |
... | @@ -102,6 +103,8 @@ | ... | @@ -102,6 +103,8 @@ |
102 | x: 0, | 103 | x: 0, |
103 | y: y | 104 | y: y |
104 | }); | 105 | }); |
106 | + // NOTE: used for sizing column width... | ||
107 | + keyAgg.append('text').text(d.key).attr('class', 'key'); | ||
105 | 108 | ||
106 | el.append('text') | 109 | el.append('text') |
107 | .text(d.desc) | 110 | .text(d.desc) |
... | @@ -113,11 +116,14 @@ | ... | @@ -113,11 +116,14 @@ |
113 | } | 116 | } |
114 | }); | 117 | }); |
115 | 118 | ||
119 | + var kbox = keyAgg.node().getBBox(); | ||
120 | + items.selectAll('.desc').attr('x', kbox.width + offDesc); | ||
121 | + | ||
116 | var box = items.node().getBBox(), | 122 | var box = items.node().getBBox(), |
117 | paneW = box.width + pad * 2, | 123 | paneW = box.width + pad * 2, |
118 | paneH = box.height + offy; | 124 | paneH = box.height + offy; |
119 | 125 | ||
120 | - items.select('line').attr('x2', box.width); | 126 | + items.selectAll('line').attr('x2', box.width); |
121 | items.attr('transform', translate(-paneW/2, -pad)); | 127 | items.attr('transform', translate(-paneW/2, -pad)); |
122 | rect.attr({ | 128 | rect.attr({ |
123 | width: paneW, | 129 | width: paneW, |
... | @@ -134,25 +140,47 @@ | ... | @@ -134,25 +140,47 @@ |
134 | var gmap = d3.map(bindings.globalKeys), | 140 | var gmap = d3.map(bindings.globalKeys), |
135 | vmap = d3.map(bindings.viewKeys), | 141 | vmap = d3.map(bindings.viewKeys), |
136 | gkeys = gmap.keys(), | 142 | gkeys = gmap.keys(), |
137 | - vkeys = vmap.keys(); | 143 | + vkeys = vmap.keys(), |
144 | + vgest = bindings.viewGestures, | ||
145 | + sep = 0; | ||
138 | 146 | ||
139 | gkeys.sort(); | 147 | gkeys.sort(); |
140 | vkeys.sort(); | 148 | vkeys.sort(); |
141 | 149 | ||
142 | data = []; | 150 | data = []; |
143 | gkeys.forEach(function (k) { | 151 | gkeys.forEach(function (k) { |
144 | - addItem('global', k, gmap.get(k)); | 152 | + addItem('glob', k, gmap.get(k)); |
145 | }); | 153 | }); |
146 | - addItem('separator'); | 154 | + addItem('sep'); |
147 | vkeys.forEach(function (k) { | 155 | vkeys.forEach(function (k) { |
148 | addItem('view', k, vmap.get(k)); | 156 | addItem('view', k, vmap.get(k)); |
149 | }); | 157 | }); |
158 | + addItem('sep'); | ||
159 | + vgest.forEach(function (g) { | ||
160 | + if (g.length === 2) { | ||
161 | + addItem('gest', g[0], g[1]); | ||
162 | + } | ||
163 | + }); | ||
164 | + | ||
150 | 165 | ||
151 | function addItem(type, k, d) { | 166 | function addItem(type, k, d) { |
152 | var id = type + '-' + k, | 167 | var id = type + '-' + k, |
153 | a = isA(d), | 168 | a = isA(d), |
154 | desc = a && a[1]; | 169 | desc = a && a[1]; |
155 | - if (desc) { | 170 | + |
171 | + if (type === 'sep') { | ||
172 | + data.push({ | ||
173 | + id: '_' + sep++, | ||
174 | + type: type | ||
175 | + }); | ||
176 | + } else if (type === 'gest') { | ||
177 | + data.push({ | ||
178 | + id: id, | ||
179 | + type: type, | ||
180 | + key: k, | ||
181 | + desc: d | ||
182 | + }); | ||
183 | + } else if (desc) { | ||
156 | data.push( | 184 | data.push( |
157 | { | 185 | { |
158 | id: id, | 186 | id: id, |
... | @@ -161,11 +189,6 @@ | ... | @@ -161,11 +189,6 @@ |
161 | desc: desc | 189 | desc: desc |
162 | } | 190 | } |
163 | ); | 191 | ); |
164 | - } else if (type === 'separator') { | ||
165 | - data.push({ | ||
166 | - id: '_', | ||
167 | - type: type | ||
168 | - }); | ||
169 | } | 192 | } |
170 | } | 193 | } |
171 | } | 194 | } |
... | @@ -189,6 +212,7 @@ | ... | @@ -189,6 +212,7 @@ |
189 | }); | 212 | }); |
190 | 213 | ||
191 | items = pane.append('g'); | 214 | items = pane.append('g'); |
215 | + keyAgg = pane.append('g').style('visibility', 'hidden'); | ||
192 | 216 | ||
193 | aggregateData(bindings); | 217 | aggregateData(bindings); |
194 | updateKeyItems(); | 218 | updateKeyItems(); | ... | ... |
... | @@ -146,14 +146,23 @@ | ... | @@ -146,14 +146,23 @@ |
146 | H: [toggleHosts, 'Toggle host visibility'], | 146 | H: [toggleHosts, 'Toggle host visibility'], |
147 | L: [cycleLabels, 'Cycle Device labels'], | 147 | L: [cycleLabels, 'Cycle Device labels'], |
148 | P: togglePorts, | 148 | P: togglePorts, |
149 | - U: [unpin, 'Unpin node'], | 149 | + U: [unpin, 'Unpin node (hover mouse over)'], |
150 | - R: [resetZoomPan, 'Reset zoom/pan'], | 150 | + R: [resetZoomPan, 'Reset zoom / pan'], |
151 | V: [showTrafficAction, 'Show related traffic'], | 151 | V: [showTrafficAction, 'Show related traffic'], |
152 | A: [showAllTrafficAction, 'Show all traffic'], | 152 | A: [showAllTrafficAction, 'Show all traffic'], |
153 | F: [showDeviceLinkFlowsAction, 'Show device link flows'], | 153 | F: [showDeviceLinkFlowsAction, 'Show device link flows'], |
154 | esc: handleEscape | 154 | esc: handleEscape |
155 | }; | 155 | }; |
156 | 156 | ||
157 | + // mouse gestures | ||
158 | + var gestures = [ | ||
159 | + ['click', 'Select the item and show details'], | ||
160 | + ['shift-click', 'Toggle selection state'], | ||
161 | + ['drag', 'Reposition (and pin) device / host'], | ||
162 | + ['cmd-scroll', 'Zoom in / out'], | ||
163 | + ['cmd-drag', 'Pan'] | ||
164 | + ]; | ||
165 | + | ||
157 | // state variables | 166 | // state variables |
158 | var network = { | 167 | var network = { |
159 | view: null, // view token reference | 168 | view: null, // view token reference |
... | @@ -2385,6 +2394,7 @@ | ... | @@ -2385,6 +2394,7 @@ |
2385 | 2394 | ||
2386 | //var showInstances; | 2395 | //var showInstances; |
2387 | 2396 | ||
2397 | +/* | ||
2388 | function addButtonBar(view) { | 2398 | function addButtonBar(view) { |
2389 | var bb = d3.select('#mast') | 2399 | var bb = d3.select('#mast') |
2390 | .append('span').classed('right', true).attr('id', 'bb'); | 2400 | .append('span').classed('right', true).attr('id', 'bb'); |
... | @@ -2398,6 +2408,7 @@ | ... | @@ -2398,6 +2408,7 @@ |
2398 | 2408 | ||
2399 | //showInstances = mkTogBtn('Show Instances', toggleInst); | 2409 | //showInstances = mkTogBtn('Show Instances', toggleInst); |
2400 | } | 2410 | } |
2411 | +*/ | ||
2401 | 2412 | ||
2402 | function panZoom() { | 2413 | function panZoom() { |
2403 | return false; | 2414 | return false; |
... | @@ -2555,10 +2566,11 @@ | ... | @@ -2555,10 +2566,11 @@ |
2555 | // set our radio buttons and key bindings | 2566 | // set our radio buttons and key bindings |
2556 | layerBtnSet = view.setRadio(layerButtons); | 2567 | layerBtnSet = view.setRadio(layerButtons); |
2557 | view.setKeys(keyDispatch); | 2568 | view.setKeys(keyDispatch); |
2569 | + view.setGestures(gestures); | ||
2558 | 2570 | ||
2559 | // patch in our "button bar" for now | 2571 | // patch in our "button bar" for now |
2560 | // TODO: implement a more official frameworky way of doing this.. | 2572 | // TODO: implement a more official frameworky way of doing this.. |
2561 | - addButtonBar(view); | 2573 | + //addButtonBar(view); |
2562 | 2574 | ||
2563 | // Load map data asynchronously; complete startup after that.. | 2575 | // Load map data asynchronously; complete startup after that.. |
2564 | loadGeoJsonData(); | 2576 | loadGeoJsonData(); | ... | ... |
-
Please register or login to post a comment