GUI -- Added "No Devices Connected" layer; (themed too).
Change-Id: I80e3cc20c426c9c9781ad73a891e0f2fe93594b9
Showing
4 changed files
with
86 additions
and
14 deletions
... | @@ -236,12 +236,17 @@ | ... | @@ -236,12 +236,17 @@ |
236 | return s.replace(/px$/,''); | 236 | return s.replace(/px$/,''); |
237 | } | 237 | } |
238 | 238 | ||
239 | + function makeVisible(el, b) { | ||
240 | + el.style('visibility', (b ? 'visible' : 'hidden')); | ||
241 | + } | ||
242 | + | ||
239 | return { | 243 | return { |
240 | createDragBehavior: createDragBehavior, | 244 | createDragBehavior: createDragBehavior, |
241 | loadGlow: loadGlow, | 245 | loadGlow: loadGlow, |
242 | cat7: cat7, | 246 | cat7: cat7, |
243 | translate: translate, | 247 | translate: translate, |
244 | - stripPx: stripPx | 248 | + stripPx: stripPx, |
249 | + makeVisible: makeVisible | ||
245 | }; | 250 | }; |
246 | }]); | 251 | }]); |
247 | }()); | 252 | }()); | ... | ... |
... | @@ -18,25 +18,51 @@ | ... | @@ -18,25 +18,51 @@ |
18 | ONOS GUI -- Topology View -- CSS file | 18 | ONOS GUI -- Topology View -- CSS file |
19 | */ | 19 | */ |
20 | 20 | ||
21 | -/* --- Topo Map --- */ | 21 | +/* --- Base SVG Layer --- */ |
22 | 22 | ||
23 | .light #ov-topo svg { | 23 | .light #ov-topo svg { |
24 | background-color: #fff; | 24 | background-color: #fff; |
25 | - /* For Debugging the placement of the SVG layer... */ | ||
26 | - /*border: 1px solid red;*/ | ||
27 | } | 25 | } |
28 | .dark #ov-topo svg { | 26 | .dark #ov-topo svg { |
29 | background-color: #2b2b2b; | 27 | background-color: #2b2b2b; |
30 | } | 28 | } |
31 | 29 | ||
30 | + | ||
31 | +/* --- "No Devices" Layer --- */ | ||
32 | + | ||
33 | +#ov-topo svg #topo-noDevsLayer { | ||
34 | + visibility: hidden; | ||
35 | +} | ||
36 | + | ||
37 | +.light #ov-topo svg .noDevsBird { | ||
38 | + fill: #ecd; | ||
39 | +} | ||
40 | +.dark #ov-topo svg .noDevsBird { | ||
41 | + fill: #683434; | ||
42 | +} | ||
43 | + | ||
44 | +#ov-topo svg #topo-noDevsLayer text { | ||
45 | + font-size: 60pt; | ||
46 | + font-style: italic; | ||
47 | +} | ||
48 | +.light #ov-topo svg #topo-noDevsLayer text { | ||
49 | + fill: #dde; | ||
50 | +} | ||
51 | +.dark #ov-topo svg #topo-noDevsLayer text { | ||
52 | + fill: #3b3b4f; | ||
53 | +} | ||
54 | + | ||
55 | + | ||
56 | +/* --- Topo Map --- */ | ||
57 | + | ||
32 | #ov-topo svg #topo-map { | 58 | #ov-topo svg #topo-map { |
33 | stroke-width: 2px; | 59 | stroke-width: 2px; |
34 | fill: transparent; | 60 | fill: transparent; |
35 | } | 61 | } |
36 | 62 | ||
37 | .light #ov-topo svg #topo-map { | 63 | .light #ov-topo svg #topo-map { |
38 | - /*stroke: #eee;*/ | 64 | + stroke: #ddd; |
39 | - stroke: #88b; | 65 | + /*stroke: #88b;*/ |
40 | } | 66 | } |
41 | .dark #ov-topo svg #topo-map { | 67 | .dark #ov-topo svg #topo-map { |
42 | stroke: #444; | 68 | stroke: #444; | ... | ... |
... | @@ -28,10 +28,10 @@ | ... | @@ -28,10 +28,10 @@ |
28 | ]; | 28 | ]; |
29 | 29 | ||
30 | // references to injected services etc. | 30 | // references to injected services etc. |
31 | - var $log, fs, ks, zs, gs, ms, tfs; | 31 | + var $log, fs, ks, zs, gs, ms, sus, tfs; |
32 | 32 | ||
33 | // DOM elements | 33 | // DOM elements |
34 | - var ovtopo, svg, defs, zoomLayer, mapG, forceG; | 34 | + var ovtopo, svg, defs, zoomLayer, mapG, forceG, noDevsLayer; |
35 | 35 | ||
36 | // Internal state | 36 | // Internal state |
37 | var zoomer; | 37 | var zoomer; |
... | @@ -102,12 +102,37 @@ | ... | @@ -102,12 +102,37 @@ |
102 | 102 | ||
103 | // callback invoked when the SVG view has been resized.. | 103 | // callback invoked when the SVG view has been resized.. |
104 | function svgResized(dim) { | 104 | function svgResized(dim) { |
105 | - //$log.debug('TopoView just resized... ', dim); | ||
106 | tfs.resize(dim); | 105 | tfs.resize(dim); |
107 | } | 106 | } |
108 | 107 | ||
109 | // --- Background Map ------------------------------------------------ | 108 | // --- Background Map ------------------------------------------------ |
110 | 109 | ||
110 | + function setUpNoDevs() { | ||
111 | + var g, box; | ||
112 | + noDevsLayer = svg.append('g').attr({ | ||
113 | + id: 'topo-noDevsLayer', | ||
114 | + transform: sus.translate(500,500) | ||
115 | + }); | ||
116 | + // Note, SVG viewbox is '0 0 1000 1000', defined in topo.html. | ||
117 | + // We are translating this layer to have its origin at the center | ||
118 | + | ||
119 | + g = noDevsLayer.append('g'); | ||
120 | + gs.addGlyph(g, 'bird', 100).attr('class', 'noDevsBird'); | ||
121 | + g.append('text').text('No devices are connected') | ||
122 | + .attr({ x: 120, y: 80}); | ||
123 | + | ||
124 | + box = g.node().getBBox(); | ||
125 | + box.x -= box.width/2; | ||
126 | + box.y -= box.height/2; | ||
127 | + g.attr('transform', sus.translate(box.x, box.y)); | ||
128 | + | ||
129 | + showNoDevs(true); | ||
130 | + } | ||
131 | + | ||
132 | + function showNoDevs(b) { | ||
133 | + sus.makeVisible(noDevsLayer, b); | ||
134 | + } | ||
135 | + | ||
111 | function showCallibrationPoints() { | 136 | function showCallibrationPoints() { |
112 | // temp code for calibration | 137 | // temp code for calibration |
113 | var points = [ | 138 | var points = [ |
... | @@ -144,12 +169,12 @@ | ... | @@ -144,12 +169,12 @@ |
144 | .controller('OvTopoCtrl', [ | 169 | .controller('OvTopoCtrl', [ |
145 | '$scope', '$log', '$location', '$timeout', | 170 | '$scope', '$log', '$location', '$timeout', |
146 | 'FnService', 'MastService', 'KeyService', 'ZoomService', | 171 | 'FnService', 'MastService', 'KeyService', 'ZoomService', |
147 | - 'GlyphService', 'MapService', | 172 | + 'GlyphService', 'MapService', 'SvgUtilService', |
148 | 'TopoEventService', 'TopoForceService', 'TopoPanelService', | 173 | 'TopoEventService', 'TopoForceService', 'TopoPanelService', |
149 | 'TopoInstService', | 174 | 'TopoInstService', |
150 | 175 | ||
151 | function ($scope, _$log_, $loc, $timeout, _fs_, mast, | 176 | function ($scope, _$log_, $loc, $timeout, _fs_, mast, |
152 | - _ks_, _zs_, _gs_, _ms_, tes, _tfs_, tps, tis) { | 177 | + _ks_, _zs_, _gs_, _ms_, _sus_, tes, _tfs_, tps, tis) { |
153 | var self = this; | 178 | var self = this; |
154 | $log = _$log_; | 179 | $log = _$log_; |
155 | fs = _fs_; | 180 | fs = _fs_; |
... | @@ -157,6 +182,7 @@ | ... | @@ -157,6 +182,7 @@ |
157 | zs = _zs_; | 182 | zs = _zs_; |
158 | gs = _gs_; | 183 | gs = _gs_; |
159 | ms = _ms_; | 184 | ms = _ms_; |
185 | + sus = _sus_; | ||
160 | tfs = _tfs_; | 186 | tfs = _tfs_; |
161 | 187 | ||
162 | self.notifyResize = function () { | 188 | self.notifyResize = function () { |
... | @@ -180,6 +206,7 @@ | ... | @@ -180,6 +206,7 @@ |
180 | setUpKeys(); | 206 | setUpKeys(); |
181 | setUpDefs(); | 207 | setUpDefs(); |
182 | setUpZoom(); | 208 | setUpZoom(); |
209 | + setUpNoDevs(); | ||
183 | setUpMap(); | 210 | setUpMap(); |
184 | setUpForce(); | 211 | setUpForce(); |
185 | 212 | ... | ... |
... | @@ -18,7 +18,7 @@ | ... | @@ -18,7 +18,7 @@ |
18 | ONOS GUI -- SVG -- SVG Util Service - Unit Tests | 18 | ONOS GUI -- SVG -- SVG Util Service - Unit Tests |
19 | */ | 19 | */ |
20 | describe('factory: fw/svg/svgUtil.js', function() { | 20 | describe('factory: fw/svg/svgUtil.js', function() { |
21 | - var $log, fs, sus, d3Elem; | 21 | + var $log, fs, sus, svg, d3Elem; |
22 | 22 | ||
23 | beforeEach(module('onosUtil', 'onosSvg')); | 23 | beforeEach(module('onosUtil', 'onosSvg')); |
24 | 24 | ||
... | @@ -26,7 +26,8 @@ describe('factory: fw/svg/svgUtil.js', function() { | ... | @@ -26,7 +26,8 @@ describe('factory: fw/svg/svgUtil.js', function() { |
26 | $log = _$log_; | 26 | $log = _$log_; |
27 | fs = FnService; | 27 | fs = FnService; |
28 | sus = SvgUtilService; | 28 | sus = SvgUtilService; |
29 | - d3Elem = d3.select('body').append('svg').append('defs').attr('id', 'myDefs'); | 29 | + svg = d3.select('body').append('svg').attr('id', 'mySvg'); |
30 | + d3Elem = svg.append('defs'); | ||
30 | })); | 31 | })); |
31 | 32 | ||
32 | afterEach(function () { | 33 | afterEach(function () { |
... | @@ -39,7 +40,8 @@ describe('factory: fw/svg/svgUtil.js', function() { | ... | @@ -39,7 +40,8 @@ describe('factory: fw/svg/svgUtil.js', function() { |
39 | 40 | ||
40 | it('should define api functions', function () { | 41 | it('should define api functions', function () { |
41 | expect(fs.areFunctions(sus, [ | 42 | expect(fs.areFunctions(sus, [ |
42 | - 'createDragBehavior', 'loadGlow', 'cat7', 'translate', 'stripPx' | 43 | + 'createDragBehavior', 'loadGlow', 'cat7', 'translate', 'stripPx', |
44 | + 'makeVisible' | ||
43 | ])).toBeTruthy(); | 45 | ])).toBeTruthy(); |
44 | }); | 46 | }); |
45 | 47 | ||
... | @@ -111,4 +113,16 @@ describe('factory: fw/svg/svgUtil.js', function() { | ... | @@ -111,4 +113,16 @@ describe('factory: fw/svg/svgUtil.js', function() { |
111 | it('should remove trailing px', function () { | 113 | it('should remove trailing px', function () { |
112 | expect(sus.stripPx('4px')).toEqual('4'); | 114 | expect(sus.stripPx('4px')).toEqual('4'); |
113 | }); | 115 | }); |
116 | + | ||
117 | + // === makeVisible() | ||
118 | + | ||
119 | + it('should hide and show an element', function () { | ||
120 | + var r = svg.append('rect'); | ||
121 | + | ||
122 | + sus.makeVisible(r, false); | ||
123 | + expect(r.style('visibility')).toEqual('hidden'); | ||
124 | + | ||
125 | + sus.makeVisible(r, true); | ||
126 | + expect(r.style('visibility')).toEqual('visible'); | ||
127 | + }); | ||
114 | }); | 128 | }); | ... | ... |
-
Please register or login to post a comment