Committed by
Brian O'Connor
ONOS-1419 - Fix to allow nodes to be selected in the Oblique View.
(NOTE: still experimental feature, but it works sufficiently) Change-Id: I4437180a9c34656effa0735288818ea0a05779ac
Showing
2 changed files
with
51 additions
and
11 deletions
... | @@ -48,16 +48,47 @@ | ... | @@ -48,16 +48,47 @@ |
48 | return {x: mx, y: my}; | 48 | return {x: mx, y: my}; |
49 | } | 49 | } |
50 | 50 | ||
51 | - function computeNearestLink(mouse) { | 51 | + |
52 | - var proximity = 30 / api.zoomer.scale(), | 52 | + function sq(x) { return x * x; } |
53 | + | ||
54 | + function mdist(p, m) { | ||
55 | + return Math.sqrt(sq(p.x - m.x) + sq(p.y - m.y)); | ||
56 | + } | ||
57 | + | ||
58 | + function prox(dist) { | ||
59 | + return dist / api.zoomer.scale(); | ||
60 | + } | ||
61 | + | ||
62 | + function computeNearestNode(mouse) { | ||
63 | + var proximity = prox(30), | ||
53 | nearest = null, | 64 | nearest = null, |
54 | minDist; | 65 | minDist; |
55 | 66 | ||
56 | - function sq(x) { return x * x; } | 67 | + if (network.nodes.length) { |
68 | + minDist = proximity * 2; | ||
69 | + | ||
70 | + network.nodes.forEach(function (d) { | ||
71 | + var dist; | ||
72 | + | ||
73 | + if (!api.showHosts() && d.class === 'host') { | ||
74 | + return; // skip hidden hosts | ||
75 | + } | ||
57 | 76 | ||
58 | - function mdist(p, m) { | 77 | + dist = mdist({x: d.x, y: d.y}, mouse); |
59 | - return Math.sqrt(sq(p.x - m.x) + sq(p.y - m.y)); | 78 | + if (dist < minDist && dist < proximity) { |
79 | + minDist = dist; | ||
80 | + nearest = d; | ||
81 | + } | ||
82 | + }); | ||
60 | } | 83 | } |
84 | + return nearest; | ||
85 | + } | ||
86 | + | ||
87 | + | ||
88 | + function computeNearestLink(mouse) { | ||
89 | + var proximity = prox(30), | ||
90 | + nearest = null, | ||
91 | + minDist; | ||
61 | 92 | ||
62 | function pdrop(line, mouse) { | 93 | function pdrop(line, mouse) { |
63 | var x1 = line.x1, | 94 | var x1 = line.x1, |
... | @@ -229,12 +260,18 @@ | ... | @@ -229,12 +260,18 @@ |
229 | } | 260 | } |
230 | 261 | ||
231 | function mouseClickHandler() { | 262 | function mouseClickHandler() { |
232 | - var mp, link; | 263 | + var mp, link, node; |
233 | 264 | ||
234 | if (!tss.clickConsumed()) { | 265 | if (!tss.clickConsumed()) { |
235 | mp = getLogicalMousePosition(this); | 266 | mp = getLogicalMousePosition(this); |
236 | - link = computeNearestLink(mp); | 267 | + node = computeNearestNode(mp); |
237 | - selectLink(link); | 268 | + if (node) { |
269 | + $log.debug('found nearest node:', node.labels[1]); | ||
270 | + tss.selectObject(node); | ||
271 | + } else { | ||
272 | + link = computeNearestLink(mp); | ||
273 | + selectLink(link); | ||
274 | + } | ||
238 | } | 275 | } |
239 | } | 276 | } |
240 | 277 | ... | ... |
... | @@ -88,14 +88,15 @@ | ... | @@ -88,14 +88,15 @@ |
88 | 88 | ||
89 | function selectObject(obj) { | 89 | function selectObject(obj) { |
90 | var el = this, | 90 | var el = this, |
91 | - ev = d3.event.sourceEvent, | 91 | + nodeEv = el && el.tagName === 'g', |
92 | + ev = d3.event.sourceEvent || {}, | ||
92 | n; | 93 | n; |
93 | 94 | ||
94 | if (api.zoomingOrPanning(ev)) { | 95 | if (api.zoomingOrPanning(ev)) { |
95 | return; | 96 | return; |
96 | } | 97 | } |
97 | 98 | ||
98 | - if (el) { | 99 | + if (nodeEv) { |
99 | n = d3.select(el); | 100 | n = d3.select(el); |
100 | } else { | 101 | } else { |
101 | api.node().each(function (d) { | 102 | api.node().each(function (d) { |
... | @@ -106,7 +107,9 @@ | ... | @@ -106,7 +107,9 @@ |
106 | } | 107 | } |
107 | if (!n) return; | 108 | if (!n) return; |
108 | 109 | ||
109 | - consumeClick = true; | 110 | + if (nodeEv) { |
111 | + consumeClick = true; | ||
112 | + } | ||
110 | api.deselectLink(); | 113 | api.deselectLink(); |
111 | 114 | ||
112 | if (ev.shiftKey && n.classed('selected')) { | 115 | if (ev.shiftKey && n.classed('selected')) { | ... | ... |
-
Please register or login to post a comment