Bri Prebilic Cole
Committed by Gerrit Code Review

GUI -- TopoToolbarService created, working first set of toggles added.

- WIP on svg exercise (tabled to be worked on on another date)

Change-Id: I8d4ed84f0de44516419910dc5ee4c8eca7dc46ff
...@@ -33,10 +33,11 @@ ...@@ -33,10 +33,11 @@
33 33
34 <style> 34 <style>
35 html, 35 html,
36 - body { 36 + body, div {
37 background-color: #eee; 37 background-color: #eee;
38 font-family: Arial, Helvetica, sans-serif; 38 font-family: Arial, Helvetica, sans-serif;
39 font-size: 9pt; 39 font-size: 9pt;
40 + margin: 0;
40 } 41 }
41 .button { 42 .button {
42 fill: #369; 43 fill: #369;
......
...@@ -28,13 +28,16 @@ ...@@ -28,13 +28,16 @@
28 var btnWidth = 175, 28 var btnWidth = 175,
29 btnHeight = 50, 29 btnHeight = 50,
30 hoverZone = 60, 30 hoverZone = 60,
31 + sectorDivisions = 3,
31 pageMargin = 20; 32 pageMargin = 20;
32 33
33 // svg elements 34 // svg elements
34 - var g; 35 + var svg, g;
35 36
36 // other variables 37 // other variables
37 var winWidth, winHeight, 38 var winWidth, winHeight,
39 + sectorWidth, sectorHeight,
40 + currSector = 4,
38 mouse; 41 mouse;
39 42
40 // ==================================================== 43 // ====================================================
...@@ -44,27 +47,112 @@ ...@@ -44,27 +47,112 @@
44 return (axis / 2) - (dim / 2); 47 return (axis / 2) - (dim / 2);
45 } 48 }
46 49
47 - function randomPos() { 50 + // ====================================================
51 +
52 + function center(elem) {
53 + $log.debug(winWidth / 2);
54 + $log.debug(winHeight / 2);
55 + $log.debug((winWidth / 2) - ((elem.node().getBBox().width) / 2));
56 + $log.debug((winHeight / 2) - ((elem.node().getBBox().height) / 2));
48 return { 57 return {
49 - x: Math.random() * winWidth, 58 + x: (winWidth / 2) - ((elem.node().getBBox().width) / 2),
50 - y: Math.random() * winHeight 59 + y: (winHeight / 2) - ((elem.node().getBBox().height) / 2)
51 } 60 }
52 } 61 }
53 62
54 - function getPosition() { 63 + function showSectors() {
55 - var x = randomPos().x + pageMargin, 64 + svg.append('line')
56 - y = randomPos().y + pageMargin, 65 + .attr({
57 - x1 = x + btnWidth, 66 + x1: winWidth / 2,
58 - y1 = y + btnHeight, 67 + x2: winWidth / 2,
59 - wwMargin = winWidth - pageMargin, 68 + y1: 0,
60 - whMargin = winHeight - pageMargin; 69 + y2: winHeight,
70 + stroke: 'purple',
71 + 'stroke-width': '3px'
72 + });
73 + svg.append('line')
74 + .attr({
75 + x1: 0,
76 + x2: winWidth,
77 + y1: winHeight / 2,
78 + y2: winHeight / 2,
79 + stroke: 'purple',
80 + 'stroke-width': '3px'
81 + });
82 + for (var i = 1; i < 5; i++) {
83 + var j;
84 + if (i < 3) {
85 + j = i;
86 + svg.append('line')
87 + .attr({
88 + x1: sectorWidth * j,
89 + x2: sectorWidth * j,
90 + y1: 0,
91 + y2: winHeight,
92 + stroke: 'red',
93 + 'stroke-width': '3px'
94 + });
95 + }
96 + else {
97 + j = i - 2;
98 + svg.append('line')
99 + .attr({
100 + x1: 0,
101 + x2: winWidth,
102 + y1: sectorHeight * j,
103 + y2: sectorHeight * j,
104 + stroke: 'red',
105 + 'stroke-width': '3px'
106 + });
107 + }
108 + }
109 + }
61 110
62 - while (x1 >= wwMargin || y1 >= whMargin) { 111 + function onMouseMove() {
63 - x = randomPos().x + pageMargin; 112 + mouse = d3.mouse(this);
64 - y = randomPos().y + pageMargin; 113 + moveButton();
114 + }
115 +
116 + function removeMouseListener() {
117 + g.on('mousemove', null);
118 + }
119 +
120 + function addMouseListener() {
121 + g.on('mousemove', onMouseMove);
122 + }
123 +
124 + function selectSector() {
125 + var sector, row, col;
126 +
127 + do {
128 + sector = Math.floor((Math.random() * 9));
129 + } while (sector === currSector);
130 + $log.debug('sector after loop: ' + sector);
131 + $log.debug('currSector after loop: ' + currSector);
132 + currSector = sector;
133 + $log.debug('currSector after assignment: ' + currSector);
134 + row = Math.floor(sector / sectorDivisions);
135 + col = sector % sectorDivisions;
136 +
137 + $log.debug('row: ' + row);
138 + $log.debug('col: ' + col);
139 +
140 + return {
141 + xmin: sectorWidth * col,
142 + xmax: (sectorWidth * col) + sectorWidth,
143 + ymin: sectorHeight * row,
144 + ymax: (sectorHeight * row) + sectorHeight
145 + }
146 + }
147 +
148 + function selectXY(sectorCoords) {
149 + var x, y, x1, y1;
150 + do {
151 + x = (Math.random() * sectorCoords.xmax) + sectorCoords.xmin;
152 + y = (Math.random() * sectorCoords.ymax) + sectorCoords.ymin;
65 x1 = x + btnWidth; 153 x1 = x + btnWidth;
66 y1 = y + btnHeight; 154 y1 = y + btnHeight;
67 - } 155 + } while (x1 >= winWidth - pageMargin || y1 >= winHeight - pageMargin);
68 156
69 return { 157 return {
70 x: x, 158 x: x,
...@@ -77,13 +165,15 @@ ...@@ -77,13 +165,15 @@
77 } 165 }
78 166
79 function moveButton() { 167 function moveButton() {
80 - var pos = getPosition(), 168 + var sec = selectSector(),
81 - x = pos.x, 169 + pos = selectXY(sec);
82 - y = pos.y; 170 + $log.debug(pos.x, pos.y);
83 g.transition() 171 g.transition()
84 .duration(400) 172 .duration(400)
85 .ease('cubic-out') 173 .ease('cubic-out')
86 - .attr('transform', gTranslate(x, y)); 174 + .each('start', removeMouseListener)
175 + .attr('transform', gTranslate(pos.x, pos.y))
176 + .each('end', addMouseListener);
87 } 177 }
88 178
89 angular.module('svgExercise', ['onosUtil']) 179 angular.module('svgExercise', ['onosUtil'])
...@@ -99,16 +189,22 @@ ...@@ -99,16 +189,22 @@
99 link: function (scope, elem, attrs) { 189 link: function (scope, elem, attrs) {
100 winWidth = fs.windowSize().width; 190 winWidth = fs.windowSize().width;
101 winHeight = fs.windowSize().height; 191 winHeight = fs.windowSize().height;
102 - var svg = d3.select(elem[0]) 192 + // getting rid of pageMargin to see if the math is easier
193 + // could put the padding somewhere else as in where it's ok to move the button
194 + //sectorWidth = (winWidth / sectorDivisions) - pageMargin;
195 + //sectorHeight = (winHeight / sectorDivisions) - pageMargin;
196 + sectorWidth = winWidth / sectorDivisions;
197 + sectorHeight = winHeight / sectorDivisions;
198 +
199 + svg = d3.select(elem[0])
103 .append('svg') 200 .append('svg')
104 .attr({ 201 .attr({
105 width: winWidth + 'px', 202 width: winWidth + 'px',
106 height: winHeight + 'px' 203 height: winHeight + 'px'
107 }); 204 });
108 - g = svg.append('g') 205 +
109 - .attr('transform', 206 + showSectors();
110 - gTranslate(centeredOnWindow(winWidth, btnWidth), 207 + g = svg.append('g');
111 - centeredOnWindow(winHeight, btnHeight)));
112 208
113 var button = g.append('rect') 209 var button = g.append('rect')
114 .attr({ 210 .attr({
...@@ -132,13 +228,14 @@ ...@@ -132,13 +228,14 @@
132 height: btnHeight + hoverZone + 'px', 228 height: btnHeight + hoverZone + 'px',
133 x: -(hoverZone / 2), 229 x: -(hoverZone / 2),
134 y: -(hoverZone / 2) 230 y: -(hoverZone / 2)
135 - }); 231 + }),
136 - 232 + centeredG = center(g);
137 - g.on('mousemove', function () { 233 + g.attr('transform',
138 - mouse = d3.mouse(this); 234 + gTranslate(centeredG.x, centeredG.y));
139 - moveButton(); 235 + //gTranslate(centeredOnWindow(winWidth, btnWidth),
140 - }); 236 + // centeredOnWindow(winHeight, btnHeight)));
141 237
238 + addMouseListener();
142 } 239 }
143 }; 240 };
144 }]); 241 }]);
......
...@@ -29,20 +29,20 @@ ...@@ -29,20 +29,20 @@
29 29
30 // references to injected services etc. 30 // references to injected services etc.
31 var $log, fs, ks, zs, gs, ms, sus, flash, wss, 31 var $log, fs, ks, zs, gs, ms, sus, flash, wss,
32 - tes, tfs, tps, tis, tss, tts, tos; 32 + tes, tfs, tps, tis, tss, tts, tos, ttbs;
33 33
34 // DOM elements 34 // DOM elements
35 var ovtopo, svg, defs, zoomLayer, mapG, forceG, noDevsLayer; 35 var ovtopo, svg, defs, zoomLayer, mapG, forceG, noDevsLayer;
36 36
37 // Internal state 37 // Internal state
38 - var zoomer; 38 + var zoomer, actionMap;
39 39
40 // --- Short Cut Keys ------------------------------------------------ 40 // --- Short Cut Keys ------------------------------------------------
41 41
42 function setUpKeys() { 42 function setUpKeys() {
43 // key bindings need to be made after the services have been injected 43 // key bindings need to be made after the services have been injected
44 // thus, deferred to here... 44 // thus, deferred to here...
45 - ks.keyBindings({ 45 + actionMap = {
46 O: [tps.toggleSummary, 'Toggle ONOS summary pane'], 46 O: [tps.toggleSummary, 'Toggle ONOS summary pane'],
47 I: [toggleInstances, 'Toggle ONOS instances pane'], 47 I: [toggleInstances, 'Toggle ONOS instances pane'],
48 D: [tss.toggleDetails, 'Disable / enable details pane'], 48 D: [tss.toggleDetails, 'Disable / enable details pane'],
...@@ -74,7 +74,9 @@ ...@@ -74,7 +74,9 @@
74 ['X', 'Z', 'L', 'U', 'R' ], 74 ['X', 'Z', 'L', 'U', 'R' ],
75 ['V', 'rightArrow', 'leftArrow', 'W', 'A', 'F', '-', 'E' ] 75 ['V', 'rightArrow', 'leftArrow', 'W', 'A', 'F', '-', 'E' ]
76 ] 76 ]
77 - }); 77 + };
78 +
79 + ks.keyBindings(actionMap);
78 80
79 ks.gestureNotes([ 81 ks.gestureNotes([
80 ['click', 'Select the item and show details'], 82 ['click', 'Select the item and show details'],
...@@ -132,6 +134,20 @@ ...@@ -132,6 +134,20 @@
132 } 134 }
133 } 135 }
134 136
137 + // --- Toolbar Functions ---------------------------------------------
138 +
139 + function getActionEntry(key) {
140 + var entry = actionMap[key];
141 + return fs.isA(entry) || [entry, ''];
142 + }
143 +
144 + function setUpToolbar() {
145 + ttbs.init({
146 + getActionEntry: getActionEntry
147 + });
148 + ttbs.createToolbar();
149 + }
150 +
135 // --- Glyphs, Icons, and the like ----------------------------------- 151 // --- Glyphs, Icons, and the like -----------------------------------
136 152
137 function setUpDefs() { 153 function setUpDefs() {
...@@ -220,11 +236,11 @@ ...@@ -220,11 +236,11 @@
220 'WebSocketService', 236 'WebSocketService',
221 'TopoEventService', 'TopoForceService', 'TopoPanelService', 237 'TopoEventService', 'TopoForceService', 'TopoPanelService',
222 'TopoInstService', 'TopoSelectService', 'TopoTrafficService', 238 'TopoInstService', 'TopoSelectService', 'TopoTrafficService',
223 - 'TopoObliqueService', 239 + 'TopoObliqueService', 'TopoToolbarService',
224 240
225 function ($scope, _$log_, $loc, $timeout, _fs_, mast, 241 function ($scope, _$log_, $loc, $timeout, _fs_, mast,
226 _ks_, _zs_, _gs_, _ms_, _sus_, _flash_, _wss_, 242 _ks_, _zs_, _gs_, _ms_, _sus_, _flash_, _wss_,
227 - _tes_, _tfs_, _tps_, _tis_, _tss_, _tts_, _tos_) { 243 + _tes_, _tfs_, _tps_, _tis_, _tss_, _tts_, _tos_, _ttbs_) {
228 var self = this, 244 var self = this,
229 projection, 245 projection,
230 dim, 246 dim,
...@@ -256,6 +272,7 @@ ...@@ -256,6 +272,7 @@
256 tss = _tss_; 272 tss = _tss_;
257 tts = _tts_; 273 tts = _tts_;
258 tos = _tos_; 274 tos = _tos_;
275 + ttbs = _ttbs_;
259 276
260 self.notifyResize = function () { 277 self.notifyResize = function () {
261 svgResized(fs.windowSize(mast.mastHeight())); 278 svgResized(fs.windowSize(mast.mastHeight()));
...@@ -278,6 +295,7 @@ ...@@ -278,6 +295,7 @@
278 dim = [svg.attr('width'), svg.attr('height')]; 295 dim = [svg.attr('width'), svg.attr('height')];
279 296
280 setUpKeys(); 297 setUpKeys();
298 + setUpToolbar();
281 setUpDefs(); 299 setUpDefs();
282 setUpZoom(); 300 setUpZoom();
283 setUpNoDevs(); 301 setUpNoDevs();
......
1 +/*
2 + * Copyright 2015 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +/*
18 + ONOS GUI -- Topology Toolbar Module.
19 + Defines functions for manipulating the toolbar.
20 + */
21 +
22 +(function () {
23 +
24 + // injected references
25 + var $log, tbs;
26 +
27 + var api, toolbar;
28 +
29 + // buttons (named for keystroke)
30 + var O, I, D, H, M, P, B;
31 + var togSummary, togInstances, togDetails,
32 + togHosts, togOffline, togPorts, togBackground;
33 +
34 + function init(_api_) {
35 + api = _api_;
36 + }
37 +
38 + function getActions() {
39 + togSummary = api.getActionEntry('O');
40 + togInstances = api.getActionEntry('I');
41 + togDetails = api.getActionEntry('D');
42 +
43 + togHosts = api.getActionEntry('H');
44 + togOffline = api.getActionEntry('M');
45 + togPorts = api.getActionEntry('P');
46 + togBackground = api.getActionEntry('B');
47 + }
48 +
49 + function entryCallback(entry) {
50 + return entry[0];
51 + }
52 +
53 + function entryToolTip(entry) {
54 + return entry[1];
55 + }
56 +
57 + function createToolbar() {
58 + getActions();
59 + // in actions, function reference is entry[0], tooltip is entry[1]
60 + toolbar = tbs.createToolbar('topo-tbar');
61 + toolbar.addToggle('summary-tog', 'unknown', true,
62 + entryCallback(togSummary), entryToolTip(togSummary));
63 + toolbar.addToggle('instance-tog', 'unknown', true,
64 + entryCallback(togInstances), entryToolTip(togInstances));
65 + toolbar.addToggle('details-tog', 'unknown', true,
66 + entryCallback(togDetails), entryToolTip(togDetails));
67 + toolbar.addSeparator();
68 +
69 + toolbar.addToggle('hosts-tog', 'endstation', false,
70 + entryCallback(togHosts), entryToolTip(togHosts));
71 + toolbar.addToggle('offline-tog', 'unknown', true,
72 + entryCallback(togOffline), entryToolTip(togOffline));
73 + toolbar.addToggle('ports-tog', 'unknown', true,
74 + entryCallback(togPorts), entryToolTip(togPorts));
75 + toolbar.addToggle('bkgrnd-tog', 'unknown', true,
76 + entryCallback(togBackground), entryToolTip(togBackground));
77 +
78 + toolbar.hide();
79 + }
80 +
81 + angular.module('ovTopo')
82 + .factory('TopoToolbarService', ['$log', 'ToolbarService',
83 +
84 + function (_$log_, _tbs_) {
85 + $log = _$log_;
86 + tbs = _tbs_;
87 +
88 + return {
89 + init: init,
90 + createToolbar: createToolbar
91 + };
92 + }]);
93 +}());
...\ No newline at end of file ...\ No newline at end of file
...@@ -97,6 +97,7 @@ ...@@ -97,6 +97,7 @@
97 <script src="app/view/topo/topoPanel.js"></script> 97 <script src="app/view/topo/topoPanel.js"></script>
98 <script src="app/view/topo/topoSelect.js"></script> 98 <script src="app/view/topo/topoSelect.js"></script>
99 <script src="app/view/topo/topoTraffic.js"></script> 99 <script src="app/view/topo/topoTraffic.js"></script>
100 + <script src="app/view/topo/topoToolbar.js"></script>
100 <script src="app/view/device/device.js"></script> 101 <script src="app/view/device/device.js"></script>
101 <!-- {INJECTED-JAVASCRIPT-END} --> 102 <!-- {INJECTED-JAVASCRIPT-END} -->
102 103
......