Simon Hunt

GUI -- WebSocket close now invokes the Veil Service.

- enableKeys(b) added to KeyService.
- minor cleanup of Veil Service.

Change-Id: I640720727a3f1249d81855a61f088a7f2e9525cc
......@@ -24,56 +24,60 @@
'use strict';
// injected references
var $log, fs;
var $log, fs, ks;
var veil, pdiv, svg;
// msg should be an array of strings
function show(msg) {
var msgs = fs.isA(msg) || [msg];
pdiv.selectAll('p').remove();
msg.forEach(function (line) {
msgs.forEach(function (line) {
pdiv.append('p').text(line);
});
veil.style('display', 'block');
// TODO: disable key bindings
ks.enableKeys(false);
}
function hide() {
veil.style('display', 'none');
// TODO: re-enable key bindings
ks.enableKeys(true);
}
angular.module('onosLayer')
.factory('VeilService', ['$log', 'FnService', 'GlyphService',
function (_$log_, _fs_, gs) {
$log = _$log_;
fs = _fs_;
var wSize = fs.windowSize(),
ww = wSize.width,
wh = wSize.height,
shrinkConst = wh-(wh * 0.7),
birdDim = wh-shrinkConst,
birdCenter = (ww / 2) - (birdDim / 2);
veil = d3.select('#veil');
pdiv = veil.append('div').classed('msg', true);
svg = veil.append('svg').attr({
width: (ww + 'px'),
height: (wh + 'px'),
viewBox: '0 0 ' + ww + ' ' + wh
}).style('opacity', 0.2);
gs.addGlyph(svg, 'bird', (birdDim + 'px'),
false, [birdCenter, shrinkConst/2]);
return {
show: show,
hide: hide
};
}]);
.factory('VeilService',
['$log', 'FnService', 'KeyService', 'GlyphService',
function (_$log_, _fs_, _ks_, gs) {
$log = _$log_;
fs = _fs_;
ks = _ks_;
var wSize = fs.windowSize(),
ww = wSize.width,
wh = wSize.height,
vbox = '0 0 ' + ww + ' ' + wh,
shrink = wh * 0.3,
birdDim = wh - shrink,
birdCenter = (ww - birdDim) / 2;
veil = d3.select('#veil');
pdiv = veil.append('div').classed('msg', true);
svg = veil.append('svg').attr({
width: ww,
height: wh,
viewBox: vbox
}).style('opacity', 0.2);
gs.addGlyph(svg, 'bird', birdDim, false, [birdCenter, shrink/2]);
return {
show: show,
hide: hide
};
}]);
}());
......
......@@ -24,7 +24,8 @@
var $log, fs, ts;
// internal state
var keyHandler = {
var enabled = true,
keyHandler = {
globalKeys: {},
maskedKeys: {},
viewKeys: {},
......@@ -80,14 +81,16 @@
d3.event.stopPropagation();
// global callback?
if (gcb && gcb(token, key, keyCode, event)) {
// if the event was 'handled', we are done
return;
}
// otherwise, let the view callback have a shot
if (vcb) {
vcb(token, key, keyCode, event);
if (enabled) {
// global callback?
if (gcb && gcb(token, key, keyCode, event)) {
// if the event was 'handled', we are done
return;
}
// otherwise, let the view callback have a shot
if (vcb) {
vcb(token, key, keyCode, event);
}
}
}
......@@ -197,6 +200,9 @@
} else {
keyHandler.viewGestures = fs.isA(g) || [];
}
},
enableKeys: function (b) {
enabled = b;
}
};
}]);
......
......@@ -27,7 +27,7 @@
'use strict';
// injected refs
var $log, wss, wes, tps, tis, tfs, tss, tts;
var $log, wss, wes, vs, tps, tis, tfs, tss, tts;
// internal state
var wsock, evApis;
......@@ -89,6 +89,7 @@
$log.debug('web socket opened...');
// start by requesting periodic summary data...
dispatcher.sendEvent('requestSummary');
vs.hide();
}
function onWsMessage(ev) {
......@@ -98,21 +99,27 @@
function onWsClose(reason) {
$log.log('web socket closed; reason=', reason);
wsock = null;
vs.show([
'Oops!',
'Web-socket connection to server closed...',
'Try refreshing the page.'
]);
}
// ==========================
angular.module('ovTopo')
.factory('TopoEventService',
['$log', '$location', 'WebSocketService', 'WsEventService',
['$log', '$location', 'WebSocketService', 'WsEventService', 'VeilService',
'TopoPanelService', 'TopoInstService', 'TopoForceService',
'TopoSelectService', 'TopoTrafficService',
function (_$log_, $loc, _wss_, _wes_,
function (_$log_, $loc, _wss_, _wes_, _vs_,
_tps_, _tis_, _tfs_, _tss_, _tts_) {
$log = _$log_;
wss = _wss_;
wes = _wes_;
vs = _vs_;
tps = _tps_;
tis = _tis_;
tfs = _tfs_;
......
......@@ -43,6 +43,16 @@ describe('factory: fw/util/keys.js', function() {
d3.select('#ptest').remove();
});
it('should define the key service', function () {
expect(ks).toBeDefined();
});
it('should define api functions', function () {
expect(fs.areFunctions(ks, [
'installOn', 'keyBindings', 'gestureNotes', 'enableKeys'
])).toBeTruthy();
});
// Code to emulate key presses....
// NOTE: kinda messy, but it seems to get the job done.
function jsKeyDown(element, code) {
......@@ -207,6 +217,29 @@ describe('factory: fw/util/keys.js', function() {
expect(count).toEqual(1);
});
it('should block keys when disabled', function () {
var cbCount = 0;
function cb() { cbCount++; }
function pressA() { jsKeyDown(elem, 65); } // 65 == 'A' keycode
ks.keyBindings({ A: cb });
expect(cbCount).toBe(0);
pressA();
expect(cbCount).toBe(1);
ks.enableKeys(false);
pressA();
expect(cbCount).toBe(1);
ks.enableKeys(true);
pressA();
expect(cbCount).toBe(2);
});
// === Gesture notes related tests
it('should start with no notes', function () {
expect(ks.gestureNotes()).toEqual([]);
......