GUI -- WebSocket close now invokes the Veil Service.
- enableKeys(b) added to KeyService. - minor cleanup of Veil Service. Change-Id: I640720727a3f1249d81855a61f088a7f2e9525cc
Showing
4 changed files
with
69 additions
and
19 deletions
... | @@ -24,51 +24,55 @@ | ... | @@ -24,51 +24,55 @@ |
24 | 'use strict'; | 24 | 'use strict'; |
25 | 25 | ||
26 | // injected references | 26 | // injected references |
27 | - var $log, fs; | 27 | + var $log, fs, ks; |
28 | 28 | ||
29 | var veil, pdiv, svg; | 29 | var veil, pdiv, svg; |
30 | 30 | ||
31 | + // msg should be an array of strings | ||
31 | function show(msg) { | 32 | function show(msg) { |
33 | + var msgs = fs.isA(msg) || [msg]; | ||
32 | pdiv.selectAll('p').remove(); | 34 | pdiv.selectAll('p').remove(); |
33 | 35 | ||
34 | - msg.forEach(function (line) { | 36 | + msgs.forEach(function (line) { |
35 | pdiv.append('p').text(line); | 37 | pdiv.append('p').text(line); |
36 | }); | 38 | }); |
37 | 39 | ||
38 | veil.style('display', 'block'); | 40 | veil.style('display', 'block'); |
39 | - | 41 | + ks.enableKeys(false); |
40 | - // TODO: disable key bindings | ||
41 | } | 42 | } |
42 | 43 | ||
43 | function hide() { | 44 | function hide() { |
44 | veil.style('display', 'none'); | 45 | veil.style('display', 'none'); |
45 | - // TODO: re-enable key bindings | 46 | + ks.enableKeys(true); |
46 | } | 47 | } |
47 | 48 | ||
48 | angular.module('onosLayer') | 49 | angular.module('onosLayer') |
49 | - .factory('VeilService', ['$log', 'FnService', 'GlyphService', | 50 | + .factory('VeilService', |
50 | - function (_$log_, _fs_, gs) { | 51 | + ['$log', 'FnService', 'KeyService', 'GlyphService', |
52 | + | ||
53 | + function (_$log_, _fs_, _ks_, gs) { | ||
51 | $log = _$log_; | 54 | $log = _$log_; |
52 | fs = _fs_; | 55 | fs = _fs_; |
56 | + ks = _ks_; | ||
53 | 57 | ||
54 | var wSize = fs.windowSize(), | 58 | var wSize = fs.windowSize(), |
55 | ww = wSize.width, | 59 | ww = wSize.width, |
56 | wh = wSize.height, | 60 | wh = wSize.height, |
57 | - shrinkConst = wh-(wh * 0.7), | 61 | + vbox = '0 0 ' + ww + ' ' + wh, |
58 | - birdDim = wh-shrinkConst, | 62 | + shrink = wh * 0.3, |
59 | - birdCenter = (ww / 2) - (birdDim / 2); | 63 | + birdDim = wh - shrink, |
64 | + birdCenter = (ww - birdDim) / 2; | ||
60 | 65 | ||
61 | veil = d3.select('#veil'); | 66 | veil = d3.select('#veil'); |
62 | pdiv = veil.append('div').classed('msg', true); | 67 | pdiv = veil.append('div').classed('msg', true); |
63 | 68 | ||
64 | svg = veil.append('svg').attr({ | 69 | svg = veil.append('svg').attr({ |
65 | - width: (ww + 'px'), | 70 | + width: ww, |
66 | - height: (wh + 'px'), | 71 | + height: wh, |
67 | - viewBox: '0 0 ' + ww + ' ' + wh | 72 | + viewBox: vbox |
68 | }).style('opacity', 0.2); | 73 | }).style('opacity', 0.2); |
69 | 74 | ||
70 | - gs.addGlyph(svg, 'bird', (birdDim + 'px'), | 75 | + gs.addGlyph(svg, 'bird', birdDim, false, [birdCenter, shrink/2]); |
71 | - false, [birdCenter, shrinkConst/2]); | ||
72 | 76 | ||
73 | return { | 77 | return { |
74 | show: show, | 78 | show: show, | ... | ... |
... | @@ -24,7 +24,8 @@ | ... | @@ -24,7 +24,8 @@ |
24 | var $log, fs, ts; | 24 | var $log, fs, ts; |
25 | 25 | ||
26 | // internal state | 26 | // internal state |
27 | - var keyHandler = { | 27 | + var enabled = true, |
28 | + keyHandler = { | ||
28 | globalKeys: {}, | 29 | globalKeys: {}, |
29 | maskedKeys: {}, | 30 | maskedKeys: {}, |
30 | viewKeys: {}, | 31 | viewKeys: {}, |
... | @@ -80,6 +81,7 @@ | ... | @@ -80,6 +81,7 @@ |
80 | 81 | ||
81 | d3.event.stopPropagation(); | 82 | d3.event.stopPropagation(); |
82 | 83 | ||
84 | + if (enabled) { | ||
83 | // global callback? | 85 | // global callback? |
84 | if (gcb && gcb(token, key, keyCode, event)) { | 86 | if (gcb && gcb(token, key, keyCode, event)) { |
85 | // if the event was 'handled', we are done | 87 | // if the event was 'handled', we are done |
... | @@ -90,6 +92,7 @@ | ... | @@ -90,6 +92,7 @@ |
90 | vcb(token, key, keyCode, event); | 92 | vcb(token, key, keyCode, event); |
91 | } | 93 | } |
92 | } | 94 | } |
95 | + } | ||
93 | 96 | ||
94 | function setupGlobalKeys() { | 97 | function setupGlobalKeys() { |
95 | angular.extend(keyHandler, { | 98 | angular.extend(keyHandler, { |
... | @@ -197,6 +200,9 @@ | ... | @@ -197,6 +200,9 @@ |
197 | } else { | 200 | } else { |
198 | keyHandler.viewGestures = fs.isA(g) || []; | 201 | keyHandler.viewGestures = fs.isA(g) || []; |
199 | } | 202 | } |
203 | + }, | ||
204 | + enableKeys: function (b) { | ||
205 | + enabled = b; | ||
200 | } | 206 | } |
201 | }; | 207 | }; |
202 | }]); | 208 | }]); | ... | ... |
... | @@ -27,7 +27,7 @@ | ... | @@ -27,7 +27,7 @@ |
27 | 'use strict'; | 27 | 'use strict'; |
28 | 28 | ||
29 | // injected refs | 29 | // injected refs |
30 | - var $log, wss, wes, tps, tis, tfs, tss, tts; | 30 | + var $log, wss, wes, vs, tps, tis, tfs, tss, tts; |
31 | 31 | ||
32 | // internal state | 32 | // internal state |
33 | var wsock, evApis; | 33 | var wsock, evApis; |
... | @@ -89,6 +89,7 @@ | ... | @@ -89,6 +89,7 @@ |
89 | $log.debug('web socket opened...'); | 89 | $log.debug('web socket opened...'); |
90 | // start by requesting periodic summary data... | 90 | // start by requesting periodic summary data... |
91 | dispatcher.sendEvent('requestSummary'); | 91 | dispatcher.sendEvent('requestSummary'); |
92 | + vs.hide(); | ||
92 | } | 93 | } |
93 | 94 | ||
94 | function onWsMessage(ev) { | 95 | function onWsMessage(ev) { |
... | @@ -98,21 +99,27 @@ | ... | @@ -98,21 +99,27 @@ |
98 | function onWsClose(reason) { | 99 | function onWsClose(reason) { |
99 | $log.log('web socket closed; reason=', reason); | 100 | $log.log('web socket closed; reason=', reason); |
100 | wsock = null; | 101 | wsock = null; |
102 | + vs.show([ | ||
103 | + 'Oops!', | ||
104 | + 'Web-socket connection to server closed...', | ||
105 | + 'Try refreshing the page.' | ||
106 | + ]); | ||
101 | } | 107 | } |
102 | 108 | ||
103 | // ========================== | 109 | // ========================== |
104 | 110 | ||
105 | angular.module('ovTopo') | 111 | angular.module('ovTopo') |
106 | .factory('TopoEventService', | 112 | .factory('TopoEventService', |
107 | - ['$log', '$location', 'WebSocketService', 'WsEventService', | 113 | + ['$log', '$location', 'WebSocketService', 'WsEventService', 'VeilService', |
108 | 'TopoPanelService', 'TopoInstService', 'TopoForceService', | 114 | 'TopoPanelService', 'TopoInstService', 'TopoForceService', |
109 | 'TopoSelectService', 'TopoTrafficService', | 115 | 'TopoSelectService', 'TopoTrafficService', |
110 | 116 | ||
111 | - function (_$log_, $loc, _wss_, _wes_, | 117 | + function (_$log_, $loc, _wss_, _wes_, _vs_, |
112 | _tps_, _tis_, _tfs_, _tss_, _tts_) { | 118 | _tps_, _tis_, _tfs_, _tss_, _tts_) { |
113 | $log = _$log_; | 119 | $log = _$log_; |
114 | wss = _wss_; | 120 | wss = _wss_; |
115 | wes = _wes_; | 121 | wes = _wes_; |
122 | + vs = _vs_; | ||
116 | tps = _tps_; | 123 | tps = _tps_; |
117 | tis = _tis_; | 124 | tis = _tis_; |
118 | tfs = _tfs_; | 125 | tfs = _tfs_; | ... | ... |
... | @@ -43,6 +43,16 @@ describe('factory: fw/util/keys.js', function() { | ... | @@ -43,6 +43,16 @@ describe('factory: fw/util/keys.js', function() { |
43 | d3.select('#ptest').remove(); | 43 | d3.select('#ptest').remove(); |
44 | }); | 44 | }); |
45 | 45 | ||
46 | + it('should define the key service', function () { | ||
47 | + expect(ks).toBeDefined(); | ||
48 | + }); | ||
49 | + | ||
50 | + it('should define api functions', function () { | ||
51 | + expect(fs.areFunctions(ks, [ | ||
52 | + 'installOn', 'keyBindings', 'gestureNotes', 'enableKeys' | ||
53 | + ])).toBeTruthy(); | ||
54 | + }); | ||
55 | + | ||
46 | // Code to emulate key presses.... | 56 | // Code to emulate key presses.... |
47 | // NOTE: kinda messy, but it seems to get the job done. | 57 | // NOTE: kinda messy, but it seems to get the job done. |
48 | function jsKeyDown(element, code) { | 58 | function jsKeyDown(element, code) { |
... | @@ -207,6 +217,29 @@ describe('factory: fw/util/keys.js', function() { | ... | @@ -207,6 +217,29 @@ describe('factory: fw/util/keys.js', function() { |
207 | expect(count).toEqual(1); | 217 | expect(count).toEqual(1); |
208 | }); | 218 | }); |
209 | 219 | ||
220 | + it('should block keys when disabled', function () { | ||
221 | + var cbCount = 0; | ||
222 | + | ||
223 | + function cb() { cbCount++; } | ||
224 | + | ||
225 | + function pressA() { jsKeyDown(elem, 65); } // 65 == 'A' keycode | ||
226 | + | ||
227 | + ks.keyBindings({ A: cb }); | ||
228 | + | ||
229 | + expect(cbCount).toBe(0); | ||
230 | + | ||
231 | + pressA(); | ||
232 | + expect(cbCount).toBe(1); | ||
233 | + | ||
234 | + ks.enableKeys(false); | ||
235 | + pressA(); | ||
236 | + expect(cbCount).toBe(1); | ||
237 | + | ||
238 | + ks.enableKeys(true); | ||
239 | + pressA(); | ||
240 | + expect(cbCount).toBe(2); | ||
241 | + }); | ||
242 | + | ||
210 | // === Gesture notes related tests | 243 | // === Gesture notes related tests |
211 | it('should start with no notes', function () { | 244 | it('should start with no notes', function () { |
212 | expect(ks.gestureNotes()).toEqual([]); | 245 | expect(ks.gestureNotes()).toEqual([]); | ... | ... |
-
Please register or login to post a comment