GUI - Fixed auto positioning of existing nodes (ONOS-299)
- Added GEO lng/lat data to updateMeta event (ONOS-314) Change-Id: I5f205a45efa94bef5b8df18f4f0739f84806311f
Showing
1 changed file
with
58 additions
and
77 deletions
| ... | @@ -680,10 +680,13 @@ | ... | @@ -680,10 +680,13 @@ |
| 680 | evTrace(data); | 680 | evTrace(data); |
| 681 | var device = data.payload, | 681 | var device = data.payload, |
| 682 | id = device.id, | 682 | id = device.id, |
| 683 | - nodeData = network.lookup[id]; | 683 | + d = network.lookup[id]; |
| 684 | - if (nodeData) { | 684 | + if (d) { |
| 685 | - $.extend(nodeData, device); | 685 | + $.extend(d, device); |
| 686 | - updateDeviceState(nodeData); | 686 | + if (positionNode(d, true)) { |
| 687 | + sendUpdateMeta(d); | ||
| 688 | + } | ||
| 689 | + updateNodes(); | ||
| 687 | } else { | 690 | } else { |
| 688 | logicError('updateDevice lookup fail. ID = "' + id + '"'); | 691 | logicError('updateDevice lookup fail. ID = "' + id + '"'); |
| 689 | } | 692 | } |
| ... | @@ -1460,7 +1463,7 @@ | ... | @@ -1460,7 +1463,7 @@ |
| 1460 | return node; | 1463 | return node; |
| 1461 | } | 1464 | } |
| 1462 | 1465 | ||
| 1463 | - function positionNode(node) { | 1466 | + function positionNode(node, forUpdate) { |
| 1464 | var meta = node.metaUi, | 1467 | var meta = node.metaUi, |
| 1465 | x = meta && meta.x, | 1468 | x = meta && meta.x, |
| 1466 | y = meta && meta.y, | 1469 | y = meta && meta.y, |
| ... | @@ -1469,8 +1472,10 @@ | ... | @@ -1469,8 +1472,10 @@ |
| 1469 | // If we have [x,y] already, use that... | 1472 | // If we have [x,y] already, use that... |
| 1470 | if (x && y) { | 1473 | if (x && y) { |
| 1471 | node.fixed = true; | 1474 | node.fixed = true; |
| 1472 | - node.x = x; | 1475 | + node.px = node.x = x; |
| 1473 | - node.y = y; | 1476 | + node.py = node.y = y; |
| 1477 | + //node.px = x; | ||
| 1478 | + //node.py = y; | ||
| 1474 | return; | 1479 | return; |
| 1475 | } | 1480 | } |
| 1476 | 1481 | ||
| ... | @@ -1478,8 +1483,15 @@ | ... | @@ -1478,8 +1483,15 @@ |
| 1478 | if (location && location.type === 'latlng') { | 1483 | if (location && location.type === 'latlng') { |
| 1479 | var coord = geoMapProjection([location.lng, location.lat]); | 1484 | var coord = geoMapProjection([location.lng, location.lat]); |
| 1480 | node.fixed = true; | 1485 | node.fixed = true; |
| 1481 | - node.x = coord[0]; | 1486 | + node.px = node.x = coord[0]; |
| 1482 | - node.y = coord[1]; | 1487 | + node.py = node.y = coord[1]; |
| 1488 | + //node.x = coord[0]; | ||
| 1489 | + //node.y = coord[1]; | ||
| 1490 | + return true; | ||
| 1491 | + } | ||
| 1492 | + | ||
| 1493 | + // if this is a node update (not a node add).. skip randomizer | ||
| 1494 | + if (forUpdate) { | ||
| 1483 | return; | 1495 | return; |
| 1484 | } | 1496 | } |
| 1485 | 1497 | ||
| ... | @@ -1524,9 +1536,6 @@ | ... | @@ -1524,9 +1536,6 @@ |
| 1524 | $.extend(node, xy); | 1536 | $.extend(node, xy); |
| 1525 | } | 1537 | } |
| 1526 | 1538 | ||
| 1527 | - function iconUrl(d) { | ||
| 1528 | - return 'img/' + d.type + '.png'; | ||
| 1529 | - } | ||
| 1530 | 1539 | ||
| 1531 | function iconGlyphUrl(d) { | 1540 | function iconGlyphUrl(d) { |
| 1532 | var which = d.type || 'unknown'; | 1541 | var which = d.type || 'unknown'; |
| ... | @@ -1621,16 +1630,9 @@ | ... | @@ -1621,16 +1630,9 @@ |
| 1621 | host.select('text').text(label); | 1630 | host.select('text').text(label); |
| 1622 | } | 1631 | } |
| 1623 | 1632 | ||
| 1624 | - // TODO: should be using updateNodes() to do the upates! | 1633 | + // FIXME : fold this into updateNodes. |
| 1625 | - function updateDeviceState(nodeData) { | ||
| 1626 | - nodeData.el.classed('online', nodeData.online); | ||
| 1627 | - updateDeviceLabel(nodeData); | ||
| 1628 | - // TODO: review what else might need to be updated | ||
| 1629 | - } | ||
| 1630 | - | ||
| 1631 | function updateHostState(hostData) { | 1634 | function updateHostState(hostData) { |
| 1632 | updateHostLabel(hostData); | 1635 | updateHostLabel(hostData); |
| 1633 | - // TODO: review what else might need to be updated | ||
| 1634 | } | 1636 | } |
| 1635 | 1637 | ||
| 1636 | function nodeMouseOver(d) { | 1638 | function nodeMouseOver(d) { |
| ... | @@ -1660,9 +1662,20 @@ | ... | @@ -1660,9 +1662,20 @@ |
| 1660 | node = nodeG.selectAll('.node') | 1662 | node = nodeG.selectAll('.node') |
| 1661 | .data(network.nodes, function (d) { return d.id; }); | 1663 | .data(network.nodes, function (d) { return d.id; }); |
| 1662 | 1664 | ||
| 1663 | - // TODO: operate on existing nodes | 1665 | + // operate on existing nodes... |
| 1664 | - // update host labels | 1666 | + node.filter('.device').each(function (d) { |
| 1665 | - //node .foo() .bar() ... | 1667 | + //var node = d3.select(this); |
| 1668 | + var node = d.el; | ||
| 1669 | + node.classed('online', d.online); | ||
| 1670 | + updateDeviceLabel(d); | ||
| 1671 | + positionNode(d, true); | ||
| 1672 | + }); | ||
| 1673 | + | ||
| 1674 | + node.filter('.host').each(function (d) { | ||
| 1675 | + //var node = d3.select(this); | ||
| 1676 | + var node = d.el; | ||
| 1677 | + // TODO: appropriate update of host visuals | ||
| 1678 | + }); | ||
| 1666 | 1679 | ||
| 1667 | // operate on entering nodes: | 1680 | // operate on entering nodes: |
| 1668 | var entering = node.enter() | 1681 | var entering = node.enter() |
| ... | @@ -1689,16 +1702,8 @@ | ... | @@ -1689,16 +1702,8 @@ |
| 1689 | // provide ref to element from backing data.... | 1702 | // provide ref to element from backing data.... |
| 1690 | d.el = node; | 1703 | d.el = node; |
| 1691 | 1704 | ||
| 1692 | - node.append('rect') | 1705 | + node.append('rect').attr({ rx: 5, ry: 5 }); |
| 1693 | - .attr({ | 1706 | + node.append('text').text(label).attr('dy', '1.1em'); |
| 1694 | - rx: 5, | ||
| 1695 | - ry: 5 | ||
| 1696 | - }); | ||
| 1697 | - | ||
| 1698 | - node.append('text') | ||
| 1699 | - .text(label) | ||
| 1700 | - .attr('dy', '1.1em'); | ||
| 1701 | - | ||
| 1702 | box = adjustRectToFitText(node); | 1707 | box = adjustRectToFitText(node); |
| 1703 | node.select('rect').attr(box); | 1708 | node.select('rect').attr(box); |
| 1704 | addDeviceIcon(node, box, noLabel, iconGlyphUrl(d)); | 1709 | addDeviceIcon(node, box, noLabel, iconGlyphUrl(d)); |
| ... | @@ -1710,14 +1715,8 @@ | ... | @@ -1710,14 +1715,8 @@ |
| 1710 | bgpSpeaker: 14, | 1715 | bgpSpeaker: 14, |
| 1711 | router: 14, | 1716 | router: 14, |
| 1712 | endstation: 14 | 1717 | endstation: 14 |
| 1713 | - }, | ||
| 1714 | - hostGlyphId = { | ||
| 1715 | - bgpSpeaker: 'bgpSpeaker', | ||
| 1716 | - router: 'router', | ||
| 1717 | - endstation: 'endstation' | ||
| 1718 | }; | 1718 | }; |
| 1719 | 1719 | ||
| 1720 | - | ||
| 1721 | // augment host nodes... | 1720 | // augment host nodes... |
| 1722 | entering.filter('.host').each(function (d) { | 1721 | entering.filter('.host').each(function (d) { |
| 1723 | var node = d3.select(this), | 1722 | var node = d3.select(this), |
| ... | @@ -1728,8 +1727,7 @@ | ... | @@ -1728,8 +1727,7 @@ |
| 1728 | // provide ref to element from backing data.... | 1727 | // provide ref to element from backing data.... |
| 1729 | d.el = node; | 1728 | d.el = node; |
| 1730 | 1729 | ||
| 1731 | - node.append('circle') | 1730 | + node.append('circle').attr('r', r); |
| 1732 | - .attr('r', r); | ||
| 1733 | 1731 | ||
| 1734 | if (iid) { | 1732 | if (iid) { |
| 1735 | addHostIcon(node, r, iid); | 1733 | addHostIcon(node, r, iid); |
| ... | @@ -1739,18 +1737,6 @@ | ... | @@ -1739,18 +1737,6 @@ |
| 1739 | .text(hostLabel) | 1737 | .text(hostLabel) |
| 1740 | .attr('dy', textDy) | 1738 | .attr('dy', textDy) |
| 1741 | .attr('text-anchor', 'middle'); | 1739 | .attr('text-anchor', 'middle'); |
| 1742 | - | ||
| 1743 | - // debug function to show the modelled x,y coordinates of nodes... | ||
| 1744 | - if (debug('showNodeXY')) { | ||
| 1745 | - node.select('circle').attr('fill-opacity', 0.5); | ||
| 1746 | - node.append('circle') | ||
| 1747 | - .attr({ | ||
| 1748 | - class: 'debug', | ||
| 1749 | - cx: 0, | ||
| 1750 | - cy: 0, | ||
| 1751 | - r: '3px' | ||
| 1752 | - }); | ||
| 1753 | - } | ||
| 1754 | }); | 1740 | }); |
| 1755 | 1741 | ||
| 1756 | // operate on both existing and new nodes, if necessary | 1742 | // operate on both existing and new nodes, if necessary |
| ... | @@ -1787,7 +1773,9 @@ | ... | @@ -1787,7 +1773,9 @@ |
| 1787 | 1773 | ||
| 1788 | }); | 1774 | }); |
| 1789 | 1775 | ||
| 1790 | - // TODO: device node exits | 1776 | + // TODO: device node exit animation |
| 1777 | + | ||
| 1778 | + network.force.resume(); | ||
| 1791 | } | 1779 | } |
| 1792 | 1780 | ||
| 1793 | function addDeviceIcon(node, box, noLabel, iid) { | 1781 | function addDeviceIcon(node, box, noLabel, iid) { |
| ... | @@ -2315,18 +2303,6 @@ | ... | @@ -2315,18 +2303,6 @@ |
| 2315 | //showInstances = mkTogBtn('Show Instances', toggleInst); | 2303 | //showInstances = mkTogBtn('Show Instances', toggleInst); |
| 2316 | } | 2304 | } |
| 2317 | 2305 | ||
| 2318 | - //function instShown() { | ||
| 2319 | - // return showInstances.classed('active'); | ||
| 2320 | - //} | ||
| 2321 | - //function toggleInst() { | ||
| 2322 | - // showInstances.classed('active', !instShown()); | ||
| 2323 | - // if (instShown()) { | ||
| 2324 | - // oiBox.show(); | ||
| 2325 | - // } else { | ||
| 2326 | - // oiBox.hide(); | ||
| 2327 | - // } | ||
| 2328 | - //} | ||
| 2329 | - | ||
| 2330 | function panZoom() { | 2306 | function panZoom() { |
| 2331 | return false; | 2307 | return false; |
| 2332 | } | 2308 | } |
| ... | @@ -2338,6 +2314,22 @@ | ... | @@ -2338,6 +2314,22 @@ |
| 2338 | gly.defBadges(defs); | 2314 | gly.defBadges(defs); |
| 2339 | } | 2315 | } |
| 2340 | 2316 | ||
| 2317 | + function sendUpdateMeta(d) { | ||
| 2318 | + var ll = geoMapProjection.invert([d.x, d.y]), | ||
| 2319 | + metaUi = { | ||
| 2320 | + x: d.x, | ||
| 2321 | + y: d.y, | ||
| 2322 | + lng: ll[0], | ||
| 2323 | + lat: ll[1] | ||
| 2324 | + }; | ||
| 2325 | + d.metaUi = metaUi; | ||
| 2326 | + sendMessage('updateMeta', { | ||
| 2327 | + id: d.id, | ||
| 2328 | + 'class': d.class, | ||
| 2329 | + 'memento': metaUi | ||
| 2330 | + }); | ||
| 2331 | + } | ||
| 2332 | + | ||
| 2341 | // ============================== | 2333 | // ============================== |
| 2342 | // View life-cycle callbacks | 2334 | // View life-cycle callbacks |
| 2343 | 2335 | ||
| ... | @@ -2402,17 +2394,6 @@ | ... | @@ -2402,17 +2394,6 @@ |
| 2402 | } | 2394 | } |
| 2403 | } | 2395 | } |
| 2404 | 2396 | ||
| 2405 | - function sendUpdateMeta(d) { | ||
| 2406 | - sendMessage('updateMeta', { | ||
| 2407 | - id: d.id, | ||
| 2408 | - 'class': d.class, | ||
| 2409 | - 'memento': { | ||
| 2410 | - x: d.x, | ||
| 2411 | - y: d.y | ||
| 2412 | - } | ||
| 2413 | - }); | ||
| 2414 | - } | ||
| 2415 | - | ||
| 2416 | // set up the force layout | 2397 | // set up the force layout |
| 2417 | network.force = d3.layout.force() | 2398 | network.force = d3.layout.force() |
| 2418 | .size(forceDim) | 2399 | .size(forceDim) | ... | ... |
-
Please register or login to post a comment