-
- List<IElement> snap = new ArrayList<>(diagram.getSnapshot());
-
- snap.removeAll(pickables);
-
- boolean changed = false;
- for (IElement sn : snap) {
- G2DNode node = sn.getHint(DistrictNetworkVertexElement.KEY_DN_VERTEX_NODE);
- if (node instanceof DistrictNetworkVertexNode) {
- if (((DistrictNetworkVertexNode) node).hover(false) && !changed) {
- changed = true;
- }
- }
+
+ Collections.sort(pickables, DNPickSorter.nearestVerticesFirst(false, DNPickSorter.centerDistSq(canvasPos.getX(), canvasPos.getY())));
+
+ updateHoveredElement(pickables, true, isConnectionTool, viewTransform);
+ // Will repaint once the async hover info calculation is ready, no need to do it here
+ return false;
+ }
+
+ private boolean updateHoveredElement(List<IElement> elements, boolean hover, boolean isConnectionTool, AffineTransform viewTransform) {
+ if (elements == null || elements.isEmpty()) {
+ currentHoverElement = null;
+ return dynamicVisualisationContributionsParticipant.doHover(false, isConnectionTool);
+ } else {
+ dynamicVisualisationContributionsParticipant.doHover(true, isConnectionTool);
+
+ // we prefer the first picked element only
+ IElement elem = elements.get(0);
+ if (elem.equals(currentHoverElement))
+ return false;
+
+ INode node = elem.getHint(DistrictNetworkVertexElement.KEY_DN_VERTEX_NODE);
+ if (node == null)
+ node = elem.getHint(DistrictNetworkEdgeElement.KEY_DN_EDGE_NODE);
+ if (node == null)
+ return false;
+
+ Resource mapElement = elem.getHint(ElementHints.KEY_OBJECT);
+ Resource runtimeDiagram = diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RUNTIME_RESOURCE);
+ currentHoverElement = elem;
+ dynamicVisualisationContributionsParticipant.hoverNode(runtimeDiagram, mapElement, node, MapScalingTransform.zoomLevel(viewTransform));
+ return true;