Committed by
Gerrit Code Review
GUI -- Topo force layout bug fixes. ONOS-2398 investigated and partially fixed, …
…but also discovered there is a problem in the d3 library. Change-Id: I4afbc1cc296eec3ad7bf8e47a59b1747ccce1481
Showing
1 changed file
with
13 additions
and
29 deletions
... | @@ -58,7 +58,6 @@ | ... | @@ -58,7 +58,6 @@ |
58 | showHosts = false, // whether hosts are displayed | 58 | showHosts = false, // whether hosts are displayed |
59 | showOffline = true, // whether offline devices are displayed | 59 | showOffline = true, // whether offline devices are displayed |
60 | nodeLock = false, // whether nodes can be dragged or not (locked) | 60 | nodeLock = false, // whether nodes can be dragged or not (locked) |
61 | - fTimer, // timer for delayed force layout | ||
62 | fNodesTimer, // timer for delayed nodes update | 61 | fNodesTimer, // timer for delayed nodes update |
63 | fLinksTimer, // timer for delayed links update | 62 | fLinksTimer, // timer for delayed links update |
64 | dim, // the dimensions of the force layout [w,h] | 63 | dim, // the dimensions of the force layout [w,h] |
... | @@ -118,7 +117,6 @@ | ... | @@ -118,7 +117,6 @@ |
118 | network.nodes.push(d); | 117 | network.nodes.push(d); |
119 | lu[id] = d; | 118 | lu[id] = d; |
120 | updateNodes(); | 119 | updateNodes(); |
121 | - fStart(); | ||
122 | } | 120 | } |
123 | 121 | ||
124 | function updateDevice(data) { | 122 | function updateDevice(data) { |
... | @@ -172,8 +170,6 @@ | ... | @@ -172,8 +170,6 @@ |
172 | lu[d.egress] = lnk; | 170 | lu[d.egress] = lnk; |
173 | updateLinks(); | 171 | updateLinks(); |
174 | } | 172 | } |
175 | - | ||
176 | - fStart(); | ||
177 | } | 173 | } |
178 | 174 | ||
179 | function updateHost(data) { | 175 | function updateHost(data) { |
... | @@ -219,7 +215,6 @@ | ... | @@ -219,7 +215,6 @@ |
219 | aggregateLink(d, data); | 215 | aggregateLink(d, data); |
220 | lu[d.key] = d; | 216 | lu[d.key] = d; |
221 | updateLinks(); | 217 | updateLinks(); |
222 | - fStart(); | ||
223 | } | 218 | } |
224 | } | 219 | } |
225 | 220 | ||
... | @@ -327,7 +322,6 @@ | ... | @@ -327,7 +322,6 @@ |
327 | // remove from lookup cache | 322 | // remove from lookup cache |
328 | delete lu[removed[0].key]; | 323 | delete lu[removed[0].key]; |
329 | updateLinks(); | 324 | updateLinks(); |
330 | - fResume(); | ||
331 | } | 325 | } |
332 | } | 326 | } |
333 | 327 | ||
... | @@ -349,12 +343,12 @@ | ... | @@ -349,12 +343,12 @@ |
349 | // NOTE: upd is false if we were called from removeDeviceElement() | 343 | // NOTE: upd is false if we were called from removeDeviceElement() |
350 | if (upd) { | 344 | if (upd) { |
351 | updateNodes(); | 345 | updateNodes(); |
352 | - fResume(); | ||
353 | } | 346 | } |
354 | } | 347 | } |
355 | 348 | ||
356 | function removeDeviceElement(d) { | 349 | function removeDeviceElement(d) { |
357 | - var id = d.id; | 350 | + var id = d.id, |
351 | + idx; | ||
358 | // first, remove associated hosts and links.. | 352 | // first, remove associated hosts and links.. |
359 | tms.findAttachedHosts(id).forEach(removeHostElement); | 353 | tms.findAttachedHosts(id).forEach(removeHostElement); |
360 | tms.findAttachedLinks(id).forEach(removeLinkElement); | 354 | tms.findAttachedLinks(id).forEach(removeLinkElement); |
... | @@ -362,8 +356,10 @@ | ... | @@ -362,8 +356,10 @@ |
362 | // remove from lookup cache | 356 | // remove from lookup cache |
363 | delete lu[id]; | 357 | delete lu[id]; |
364 | // remove from nodes array | 358 | // remove from nodes array |
365 | - var idx = fs.find(id, network.nodes); | 359 | + idx = fs.find(id, network.nodes); |
360 | + if (idx > -1) { | ||
366 | network.nodes.splice(idx, 1); | 361 | network.nodes.splice(idx, 1); |
362 | + } | ||
367 | 363 | ||
368 | if (!network.nodes.length) { | 364 | if (!network.nodes.length) { |
369 | uplink.showNoDevs(true); | 365 | uplink.showNoDevs(true); |
... | @@ -371,7 +367,6 @@ | ... | @@ -371,7 +367,6 @@ |
371 | 367 | ||
372 | // remove from SVG | 368 | // remove from SVG |
373 | updateNodes(); | 369 | updateNodes(); |
374 | - fResume(); | ||
375 | } | 370 | } |
376 | 371 | ||
377 | function updateHostVisibility() { | 372 | function updateHostVisibility() { |
... | @@ -526,6 +521,7 @@ | ... | @@ -526,6 +521,7 @@ |
526 | } | 521 | } |
527 | 522 | ||
528 | function _updateNodes() { | 523 | function _updateNodes() { |
524 | + force.stop(); | ||
529 | // select all the nodes in the layout: | 525 | // select all the nodes in the layout: |
530 | node = nodeG.selectAll('.node') | 526 | node = nodeG.selectAll('.node') |
531 | .data(network.nodes, function (d) { return d.id; }); | 527 | .data(network.nodes, function (d) { return d.id; }); |
... | @@ -540,11 +536,7 @@ | ... | @@ -540,11 +536,7 @@ |
540 | .attr({ | 536 | .attr({ |
541 | id: function (d) { return sus.safeId(d.id); }, | 537 | id: function (d) { return sus.safeId(d.id); }, |
542 | class: mkSvgClass, | 538 | class: mkSvgClass, |
543 | - transform: function (d) { | 539 | + transform: function (d) { return sus.translate(d.x, d.y); }, |
544 | - // sometimes says d.x and d.y are NaN? | ||
545 | - // I have a feeling it's a timing issue | ||
546 | - return sus.translate(d.x, d.y); | ||
547 | - }, | ||
548 | opacity: 0 | 540 | opacity: 0 |
549 | }) | 541 | }) |
550 | .call(drag) | 542 | .call(drag) |
... | @@ -572,6 +564,7 @@ | ... | @@ -572,6 +564,7 @@ |
572 | // exiting node specifics: | 564 | // exiting node specifics: |
573 | exiting.filter('.host').each(td3.hostExit); | 565 | exiting.filter('.host').each(td3.hostExit); |
574 | exiting.filter('.device').each(td3.deviceExit); | 566 | exiting.filter('.device').each(td3.deviceExit); |
567 | + fStart(); | ||
575 | } | 568 | } |
576 | 569 | ||
577 | // ========================== | 570 | // ========================== |
... | @@ -668,13 +661,11 @@ | ... | @@ -668,13 +661,11 @@ |
668 | 661 | ||
669 | function _updateLinks() { | 662 | function _updateLinks() { |
670 | var th = ts.theme(); | 663 | var th = ts.theme(); |
664 | + force.stop(); | ||
671 | 665 | ||
672 | link = linkG.selectAll('.link') | 666 | link = linkG.selectAll('.link') |
673 | .data(network.links, function (d) { return d.key; }); | 667 | .data(network.links, function (d) { return d.key; }); |
674 | 668 | ||
675 | - // This seems to do nothing? I've only triggered it on timeout errors | ||
676 | - // when adding links, link var is empty because there aren't any links | ||
677 | - // when removing links, link var is empty already | ||
678 | // operate on existing links: | 669 | // operate on existing links: |
679 | link.each(function (d) { | 670 | link.each(function (d) { |
680 | // this is supposed to be an existing link, but we have observed | 671 | // this is supposed to be an existing link, but we have observed |
... | @@ -723,6 +714,7 @@ | ... | @@ -723,6 +714,7 @@ |
723 | }) | 714 | }) |
724 | .style('opacity', 0.0) | 715 | .style('opacity', 0.0) |
725 | .remove(); | 716 | .remove(); |
717 | + fStart(); | ||
726 | } | 718 | } |
727 | 719 | ||
728 | 720 | ||
... | @@ -737,13 +729,8 @@ | ... | @@ -737,13 +729,8 @@ |
737 | 729 | ||
738 | function fStart() { | 730 | function fStart() { |
739 | if (!tos.isOblique()) { | 731 | if (!tos.isOblique()) { |
740 | - if (fTimer) { | ||
741 | - $timeout.cancel(fTimer); | ||
742 | - } | ||
743 | - fTimer = $timeout(function () { | ||
744 | $log.debug("Starting force-layout"); | 732 | $log.debug("Starting force-layout"); |
745 | force.start(); | 733 | force.start(); |
746 | - }, 200); | ||
747 | } | 734 | } |
748 | } | 735 | } |
749 | 736 | ||
... | @@ -769,15 +756,15 @@ | ... | @@ -769,15 +756,15 @@ |
769 | 756 | ||
770 | function tick() { | 757 | function tick() { |
771 | // guard against null (which can happen when our view pages out)... | 758 | // guard against null (which can happen when our view pages out)... |
772 | - if (node) { | 759 | + if (node && node.size()) { |
773 | node.attr(tickStuff.nodeAttr); | 760 | node.attr(tickStuff.nodeAttr); |
774 | } | 761 | } |
775 | - if (link) { | 762 | + if (link && link.size()) { |
776 | link.call(calcPosition) | 763 | link.call(calcPosition) |
777 | .attr(tickStuff.linkAttr); | 764 | .attr(tickStuff.linkAttr); |
778 | td3.applyNumLinkLabels(linkNums, numLinkLblsG); | 765 | td3.applyNumLinkLabels(linkNums, numLinkLblsG); |
779 | } | 766 | } |
780 | - if (linkLabel) { | 767 | + if (linkLabel && linkLabel.size()) { |
781 | linkLabel.attr(tickStuff.linkLabelAttr); | 768 | linkLabel.attr(tickStuff.linkLabelAttr); |
782 | } | 769 | } |
783 | } | 770 | } |
... | @@ -1050,9 +1037,6 @@ | ... | @@ -1050,9 +1037,6 @@ |
1050 | force = drag = null; | 1037 | force = drag = null; |
1051 | 1038 | ||
1052 | // clean up $timeout promises | 1039 | // clean up $timeout promises |
1053 | - if (fTimer) { | ||
1054 | - $timeout.cancel(fTimer); | ||
1055 | - } | ||
1056 | if (fNodesTimer) { | 1040 | if (fNodesTimer) { |
1057 | $timeout.cancel(fNodesTimer); | 1041 | $timeout.cancel(fNodesTimer); |
1058 | } | 1042 | } | ... | ... |
-
Please register or login to post a comment