Committed by
Gerrit Code Review
Topo2: Scale links when zooming in and out
Topo2: Limit icon scaling Change-Id: I9b203183ebfe25ae9993a9ee8813608969867849
Showing
7 changed files
with
150 additions
and
23 deletions
... | @@ -93,7 +93,7 @@ | ... | @@ -93,7 +93,7 @@ |
93 | function adjustZoomLayer(translate, scale) { | 93 | function adjustZoomLayer(translate, scale) { |
94 | settings.zoomLayer.attr('transform', | 94 | settings.zoomLayer.attr('transform', |
95 | 'translate(' + translate + ')scale(' + scale + ')'); | 95 | 'translate(' + translate + ')scale(' + scale + ')'); |
96 | - settings.zoomCallback(); | 96 | + settings.zoomCallback(translate, scale); |
97 | } | 97 | } |
98 | 98 | ||
99 | zoomer = { | 99 | zoomer = { | ... | ... |
... | @@ -25,7 +25,7 @@ | ... | @@ -25,7 +25,7 @@ |
25 | 25 | ||
26 | // references to injected services | 26 | // references to injected services |
27 | var $scope, $log, fs, mast, ks, zs, | 27 | var $scope, $log, fs, mast, ks, zs, |
28 | - gs, sus, ps, t2es, t2fs, t2is, t2bcs, t2kcs, t2ms, t2mcs; | 28 | + gs, sus, ps, t2es, t2fs, t2is, t2bcs, t2kcs, t2ms, t2mcs, t2zs; |
29 | 29 | ||
30 | // DOM elements | 30 | // DOM elements |
31 | var ovtopo2, svg, defs, zoomLayer, forceG; | 31 | var ovtopo2, svg, defs, zoomLayer, forceG; |
... | @@ -63,14 +63,12 @@ | ... | @@ -63,14 +63,12 @@ |
63 | tr = zoomer.translate(); | 63 | tr = zoomer.translate(); |
64 | 64 | ||
65 | ps.setPrefs('topo_zoom', { tx: tr[0], ty: tr[1], sc: sc }); | 65 | ps.setPrefs('topo_zoom', { tx: tr[0], ty: tr[1], sc: sc }); |
66 | - | ||
67 | - // keep the map lines constant width while zooming | ||
68 | - // mapG.style('stroke-width', (2.0 / sc) + 'px'); | ||
69 | } | 66 | } |
70 | 67 | ||
71 | function setUpZoom() { | 68 | function setUpZoom() { |
72 | zoomLayer = svg.append('g').attr('id', 'topo-zoomlayer'); | 69 | zoomLayer = svg.append('g').attr('id', 'topo-zoomlayer'); |
73 | - zoomer = zs.createZoomer({ | 70 | + |
71 | + zoomer = t2zs.createZoomer({ | ||
74 | svg: svg, | 72 | svg: svg, |
75 | zoomLayer: zoomLayer, | 73 | zoomLayer: zoomLayer, |
76 | zoomEnabled: zoomEnabled, | 74 | zoomEnabled: zoomEnabled, |
... | @@ -88,14 +86,14 @@ | ... | @@ -88,14 +86,14 @@ |
88 | 'WebSocketService', 'PrefsService', 'ThemeService', | 86 | 'WebSocketService', 'PrefsService', 'ThemeService', |
89 | 'Topo2EventService', 'Topo2ForceService', 'Topo2InstanceService', | 87 | 'Topo2EventService', 'Topo2ForceService', 'Topo2InstanceService', |
90 | 'Topo2BreadcrumbService', 'Topo2KeyCommandService', 'Topo2MapService', | 88 | 'Topo2BreadcrumbService', 'Topo2KeyCommandService', 'Topo2MapService', |
91 | - 'Topo2MapConfigService', 'Topo2SummaryPanelService', | 89 | + 'Topo2MapConfigService', 'Topo2SummaryPanelService', 'Topo2ZoomService', |
92 | 90 | ||
93 | function (_$scope_, _$log_, _$loc_, | 91 | function (_$scope_, _$log_, _$loc_, |
94 | _fs_, _mast_, _ks_, _zs_, | 92 | _fs_, _mast_, _ks_, _zs_, |
95 | _gs_, _ms_, _sus_, _flash_, | 93 | _gs_, _ms_, _sus_, _flash_, |
96 | _wss_, _ps_, _th_, | 94 | _wss_, _ps_, _th_, |
97 | _t2es_, _t2fs_, _t2is_, _t2bcs_, _t2kcs_, _t2ms_, _t2mcs_, | 95 | _t2es_, _t2fs_, _t2is_, _t2bcs_, _t2kcs_, _t2ms_, _t2mcs_, |
98 | - summaryPanel | 96 | + summaryPanel, _t2zs_ |
99 | ) { | 97 | ) { |
100 | 98 | ||
101 | var params = _$loc_.search(), | 99 | var params = _$loc_.search(), |
... | @@ -131,6 +129,7 @@ | ... | @@ -131,6 +129,7 @@ |
131 | t2kcs = _t2kcs_; | 129 | t2kcs = _t2kcs_; |
132 | t2ms = _t2ms_; | 130 | t2ms = _t2ms_; |
133 | t2mcs = _t2mcs_; | 131 | t2mcs = _t2mcs_; |
132 | + t2zs = _t2zs_; | ||
134 | 133 | ||
135 | // capture selected intent parameters (if they are set in the | 134 | // capture selected intent parameters (if they are set in the |
136 | // query string) so that the traffic overlay can highlight | 135 | // query string) so that the traffic overlay can highlight |
... | @@ -189,7 +188,6 @@ | ... | @@ -189,7 +188,6 @@ |
189 | // Now the map has load and we have a projection we can | 188 | // Now the map has load and we have a projection we can |
190 | // get the info from the server | 189 | // get the info from the server |
191 | t2es.start(); | 190 | t2es.start(); |
192 | - | ||
193 | } | 191 | } |
194 | ); | 192 | ); |
195 | 193 | ... | ... |
... | @@ -194,14 +194,14 @@ | ... | @@ -194,14 +194,14 @@ |
194 | var allNodes = t2rs.regionNodes(); | 194 | var allNodes = t2rs.regionNodes(); |
195 | angular.forEach(allNodes, function (node) { | 195 | angular.forEach(allNodes, function (node) { |
196 | node.update(); | 196 | node.update(); |
197 | - }) | 197 | + }); |
198 | } | 198 | } |
199 | 199 | ||
200 | angular.module('ovTopo2') | 200 | angular.module('ovTopo2') |
201 | .factory('Topo2ForceService', | 201 | .factory('Topo2ForceService', |
202 | ['$log', 'WebSocketService', 'Topo2InstanceService', 'Topo2RegionService', | 202 | ['$log', 'WebSocketService', 'Topo2InstanceService', 'Topo2RegionService', |
203 | - 'Topo2LayoutService', 'Topo2ViewService', 'Topo2BreadcrumbService', | 203 | + 'Topo2LayoutService', 'Topo2ViewService', 'Topo2BreadcrumbService', 'Topo2ZoomService', |
204 | - function (_$log_, _wss_, _t2is_, _t2rs_, _t2ls_, _t2vs_, _t2bcs_) { | 204 | + function (_$log_, _wss_, _t2is_, _t2rs_, _t2ls_, _t2vs_, _t2bcs_, zoomService) { |
205 | 205 | ||
206 | $log = _$log_; | 206 | $log = _$log_; |
207 | wss = _wss_; | 207 | wss = _wss_; |
... | @@ -211,6 +211,19 @@ | ... | @@ -211,6 +211,19 @@ |
211 | t2vs = _t2vs_; | 211 | t2vs = _t2vs_; |
212 | t2bcs = _t2bcs_; | 212 | t2bcs = _t2bcs_; |
213 | 213 | ||
214 | + var onZoom = function () { | ||
215 | + var nodes = [].concat( | ||
216 | + t2rs.regionNodes(), | ||
217 | + t2rs.regionLinks() | ||
218 | + ); | ||
219 | + | ||
220 | + angular.forEach(nodes, function (node) { | ||
221 | + node.setScale(); | ||
222 | + }); | ||
223 | + }; | ||
224 | + | ||
225 | + zoomService.addZoomEventListener(onZoom); | ||
226 | + | ||
214 | return { | 227 | return { |
215 | 228 | ||
216 | init: init, | 229 | init: init, | ... | ... |
... | @@ -23,7 +23,7 @@ | ... | @@ -23,7 +23,7 @@ |
23 | 'use strict'; | 23 | 'use strict'; |
24 | 24 | ||
25 | var $log; | 25 | var $log; |
26 | - var Collection, Model, ts, sus; | 26 | + var Collection, Model, ts, sus, t2zs; |
27 | 27 | ||
28 | var linkLabelOffset = '0.35em'; | 28 | var linkLabelOffset = '0.35em'; |
29 | 29 | ||
... | @@ -171,7 +171,9 @@ | ... | @@ -171,7 +171,9 @@ |
171 | rect = el.append('rect'), | 171 | rect = el.append('rect'), |
172 | text = el.append('text').text(d.num); | 172 | text = el.append('text').text(d.num); |
173 | 173 | ||
174 | - rect.attr(rectAroundText(el)) | 174 | + var rectSize = rectAroundText(el); |
175 | + | ||
176 | + rect.attr(rectSize) | ||
175 | .attr('rx', 2) | 177 | .attr('rx', 2) |
176 | .attr('ry', 2); | 178 | .attr('ry', 2); |
177 | 179 | ||
... | @@ -211,7 +213,6 @@ | ... | @@ -211,7 +213,6 @@ |
211 | type = this.get('type'), | 213 | type = this.get('type'), |
212 | online = this.online(), | 214 | online = this.online(), |
213 | modeCls = this.expected() ? 'inactive' : 'not-permitted', | 215 | modeCls = this.expected() ? 'inactive' : 'not-permitted', |
214 | - lw = 1.2, | ||
215 | delay = immediate ? 0 : 1000; | 216 | delay = immediate ? 0 : 1000; |
216 | 217 | ||
217 | // NOTE: understand why el is sometimes undefined on addLink events... | 218 | // NOTE: understand why el is sometimes undefined on addLink events... |
... | @@ -230,7 +231,7 @@ | ... | @@ -230,7 +231,7 @@ |
230 | } | 231 | } |
231 | el.transition() | 232 | el.transition() |
232 | .duration(delay) | 233 | .duration(delay) |
233 | - .attr('stroke-width', linkScale(lw)) | 234 | + .attr('stroke-width', linkScale(widthRatio)) |
234 | .attr('stroke', linkConfig[th].baseColor); | 235 | .attr('stroke', linkConfig[th].baseColor); |
235 | } | 236 | } |
236 | }, | 237 | }, |
... | @@ -243,6 +244,10 @@ | ... | @@ -243,6 +244,10 @@ |
243 | if (this.get('type') === 'hostLink') { | 244 | if (this.get('type') === 'hostLink') { |
244 | // sus.visible(link, api.showHosts()); | 245 | // sus.visible(link, api.showHosts()); |
245 | } | 246 | } |
247 | + }, | ||
248 | + setScale: function () { | ||
249 | + var width = linkScale(widthRatio / t2zs.scale()); | ||
250 | + this.el.style('stroke-width', width + 'px'); | ||
246 | } | 251 | } |
247 | }); | 252 | }); |
248 | 253 | ||
... | @@ -256,13 +261,14 @@ | ... | @@ -256,13 +261,14 @@ |
256 | angular.module('ovTopo2') | 261 | angular.module('ovTopo2') |
257 | .factory('Topo2LinkService', | 262 | .factory('Topo2LinkService', |
258 | ['$log', 'Topo2Collection', 'Topo2Model', | 263 | ['$log', 'Topo2Collection', 'Topo2Model', |
259 | - 'ThemeService', 'SvgUtilService', | 264 | + 'ThemeService', 'SvgUtilService', 'Topo2ZoomService', |
260 | 265 | ||
261 | - function (_$log_, _Collection_, _Model_, _ts_, _sus_) { | 266 | + function (_$log_, _Collection_, _Model_, _ts_, _sus_, _t2zs_) { |
262 | 267 | ||
263 | $log = _$log_; | 268 | $log = _$log_; |
264 | ts = _ts_; | 269 | ts = _ts_; |
265 | sus = _sus_; | 270 | sus = _sus_; |
271 | + t2zs = _t2zs_; | ||
266 | Collection = _Collection_; | 272 | Collection = _Collection_; |
267 | Model = _Model_; | 273 | Model = _Model_; |
268 | 274 | ... | ... |
... | @@ -29,6 +29,8 @@ | ... | @@ -29,6 +29,8 @@ |
29 | var nearDist = 15; | 29 | var nearDist = 15; |
30 | 30 | ||
31 | var devIconDim = 36, | 31 | var devIconDim = 36, |
32 | + devIconDimMin = 20, | ||
33 | + devIconDimMax = 40, | ||
32 | labelPad = 5, | 34 | labelPad = 5, |
33 | textPad = 5, | 35 | textPad = 5, |
34 | halfDevIcon = devIconDim / 2; | 36 | halfDevIcon = devIconDim / 2; |
... | @@ -143,9 +145,9 @@ | ... | @@ -143,9 +145,9 @@ |
143 | .factory('Topo2NodeModel', | 145 | .factory('Topo2NodeModel', |
144 | ['Topo2Model', 'FnService', 'RandomService', 'Topo2PrefsService', | 146 | ['Topo2Model', 'FnService', 'RandomService', 'Topo2PrefsService', |
145 | 'SvgUtilService', 'IconService', 'ThemeService', | 147 | 'SvgUtilService', 'IconService', 'ThemeService', |
146 | - 'Topo2MapConfigService', | 148 | + 'Topo2MapConfigService', 'Topo2ZoomService', |
147 | function (Model, _fn_, _RandomService_, _ps_, _sus_, _is_, _ts_, | 149 | function (Model, _fn_, _RandomService_, _ps_, _sus_, _is_, _ts_, |
148 | - _t2mcs_) { | 150 | + _t2mcs_, zoomService) { |
149 | 151 | ||
150 | randomService = _RandomService_; | 152 | randomService = _RandomService_; |
151 | ts = _ts_; | 153 | ts = _ts_; |
... | @@ -268,6 +270,20 @@ | ... | @@ -268,6 +270,20 @@ |
268 | this.el = d3.select(el); | 270 | this.el = d3.select(el); |
269 | this.render(); | 271 | this.render(); |
270 | }, | 272 | }, |
273 | + setScale: function () { | ||
274 | + | ||
275 | + var dim = devIconDim, | ||
276 | + multipler = 1; | ||
277 | + | ||
278 | + if (dim * zoomService.scale() < devIconDimMin) { | ||
279 | + multipler = devIconDimMin / (dim * zoomService.scale()); | ||
280 | + } else if (dim * zoomService.scale() > devIconDimMax) { | ||
281 | + multipler = devIconDimMax / (dim * zoomService.scale()); | ||
282 | + } | ||
283 | + | ||
284 | + | ||
285 | + this.el.selectAll('*').style('transform', 'scale(' + multipler + ')'); | ||
286 | + }, | ||
271 | render: function () { | 287 | render: function () { |
272 | var node = this.el, | 288 | var node = this.el, |
273 | glyphId = this.icon(this.get('type')), | 289 | glyphId = this.icon(this.get('type')), |
... | @@ -289,6 +305,8 @@ | ... | @@ -289,6 +305,8 @@ |
289 | if (this.events) { | 305 | if (this.events) { |
290 | this.setUpEvents(); | 306 | this.setUpEvents(); |
291 | } | 307 | } |
308 | + | ||
309 | + this.setScale(); | ||
292 | } | 310 | } |
293 | }); | 311 | }); |
294 | }] | 312 | }] | ... | ... |
1 | +/* | ||
2 | + * Copyright 2016-present 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 Breadcrumb Module. | ||
19 | + Module that renders the breadcrumbs for regions | ||
20 | + */ | ||
21 | + | ||
22 | +(function () { | ||
23 | + | ||
24 | + 'use strict'; | ||
25 | + | ||
26 | + var zs, ps; | ||
27 | + var zoomer; | ||
28 | + var zoomEventListeners = []; | ||
29 | + | ||
30 | + function createZoomer(options) { | ||
31 | + var settings = angular.extend({}, options, { | ||
32 | + zoomCallback: zoomCallback | ||
33 | + }); | ||
34 | + | ||
35 | + zoomer = zs.createZoomer(settings); | ||
36 | + return zoomer; | ||
37 | + } | ||
38 | + | ||
39 | + function zoomCallback() { | ||
40 | + var sc = zoomer.scale(), | ||
41 | + tr = zoomer.translate(); | ||
42 | + | ||
43 | + ps.setPrefs('topo_zoom', { tx: tr[0], ty: tr[1], sc: sc }); | ||
44 | + | ||
45 | + angular.forEach(zoomEventListeners, function (ev) { | ||
46 | + ev(zoomer); | ||
47 | + }); | ||
48 | + } | ||
49 | + | ||
50 | + function findZoomEventListener(ev) { | ||
51 | + for (var i = 0, l = zoomEventListeners.length; i < l; i++) { | ||
52 | + if (zoomEventListeners[i] === ev) return i; | ||
53 | + } | ||
54 | + | ||
55 | + return -1; | ||
56 | + } | ||
57 | + | ||
58 | + function addZoomEventListener(callback) { | ||
59 | + zoomEventListeners.push(callback); | ||
60 | + } | ||
61 | + | ||
62 | + function removeZoomEventListener(callback) { | ||
63 | + | ||
64 | + var evIndex = findZoomEventListener(callback); | ||
65 | + | ||
66 | + if (evIndex !== -1) { | ||
67 | + zoomEventListeners.splice(evIndex); | ||
68 | + } | ||
69 | + } | ||
70 | + | ||
71 | + function scale() { | ||
72 | + return zoomer.scale(); | ||
73 | + } | ||
74 | + | ||
75 | + angular.module('ovTopo2') | ||
76 | + .factory('Topo2ZoomService', | ||
77 | + ['ZoomService', 'PrefsService', | ||
78 | + function (_zs_, _ps_) { | ||
79 | + | ||
80 | + zs = _zs_; | ||
81 | + ps = _ps_; | ||
82 | + | ||
83 | + return { | ||
84 | + createZoomer: createZoomer, | ||
85 | + addZoomEventListener: addZoomEventListener, | ||
86 | + removeZoomEventListener: removeZoomEventListener, | ||
87 | + | ||
88 | + scale: scale | ||
89 | + }; | ||
90 | + }]); | ||
91 | +})(); |
... | @@ -126,7 +126,7 @@ | ... | @@ -126,7 +126,7 @@ |
126 | <link rel="stylesheet" href="app/fw/widget/table-theme.css"> | 126 | <link rel="stylesheet" href="app/fw/widget/table-theme.css"> |
127 | 127 | ||
128 | <!-- Under development for Region support. --> | 128 | <!-- Under development for Region support. --> |
129 | -<!-- <script src="app/view/topo2/topo2.js"></script> | 129 | + <!--<script src="app/view/topo2/topo2.js"></script> |
130 | <script src="app/view/topo2/topo2Breadcrumb.js"></script> | 130 | <script src="app/view/topo2/topo2Breadcrumb.js"></script> |
131 | <script src="app/view/topo2/topo2Collection.js"></script> | 131 | <script src="app/view/topo2/topo2Collection.js"></script> |
132 | <script src="app/view/topo2/topo2D3.js"></script> | 132 | <script src="app/view/topo2/topo2D3.js"></script> |
... | @@ -153,10 +153,11 @@ | ... | @@ -153,10 +153,11 @@ |
153 | <script src="app/view/topo2/topo2SubRegion.js"></script> | 153 | <script src="app/view/topo2/topo2SubRegion.js"></script> |
154 | <script src="app/view/topo2/topo2Theme.js"></script> | 154 | <script src="app/view/topo2/topo2Theme.js"></script> |
155 | <script src="app/view/topo2/topo2View.js"></script> | 155 | <script src="app/view/topo2/topo2View.js"></script> |
156 | + <script src="app/view/topo2/topo2Zoom.js"></script> | ||
156 | <link rel="stylesheet" href="app/view/topo2/topo2.css"> | 157 | <link rel="stylesheet" href="app/view/topo2/topo2.css"> |
157 | - <link rel="stylesheet" href="app/view/topo2/topo2-theme.css"> | 158 | + <link rel="stylesheet" href="app/view/topo2/topo2-theme.css">--> |
158 | 159 | ||
159 | - <script src="app/view/topoX/topoX.js"></script> | 160 | + <!-- <script src="app/view/topoX/topoX.js"></script> |
160 | <script src="app/view/topoX/topoXEvent.js"></script> | 161 | <script src="app/view/topoX/topoXEvent.js"></script> |
161 | <script src="app/view/topoX/topoXForce.js"></script> | 162 | <script src="app/view/topoX/topoXForce.js"></script> |
162 | <link rel="stylesheet" href="app/view/topoX/topoX.css"> | 163 | <link rel="stylesheet" href="app/view/topoX/topoX.css"> | ... | ... |
-
Please register or login to post a comment