- if (hoverUpdateSchedule != null && !hoverUpdateSchedule.isDone()) {
- hoverUpdateSchedule.cancel(false);
- }
- hoverUpdateSchedule = ThreadUtils.getNonBlockingWorkExecutor().scheduleWithFixedDelay(() -> {
-
- CompletableFuture<Object> future = new CompletableFuture<>();
- try {
- Simantics.getSession().syncRequest(new ReadRequest() {
-
- @Override
- public void run(ReadGraph graph) throws DatabaseException {
- boolean keyVariablesVertexHover = visualisation.isKeyVariablesVertexHover();
- boolean keyVariablesEdgesHover = visualisation.isKeyVariablesEdgesHover();
-
- Resource mapElementInstanceOf = graph.getSingleObject(mapElement, Layer0.getInstance(graph).InstanceOf);
- DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
-
- boolean doHover = true;
- if (mapElementInstanceOf.equals(DN.Vertex) && !keyVariablesVertexHover) {
- doHover = false;
- } else if (mapElementInstanceOf.equals(DN.Edge) && !keyVariablesEdgesHover) {
- doHover = false;
- }
- final boolean finalDoHover = doHover;
-
- StyleResult results = DistrictNetworkHoverInfoStyle.doCalculateStyleResult(graph, runtimeDiagram, mapElement);
- if (results != null) {
- Point2D location = DistrictNetworkHoverInfoStyle.calculatePoint(graph, mapElement);
- thread.asyncExec(() -> {
- if (isRemoved())
- return;
- if (finalDoHover) {
- hoverInfoNode.setLabels(results.getLabels());
- hoverInfoNode.setOrigin(results.getOrigin());
-
- hoverInfoNode.setMousePosition(location);
- hoverInfoNode.hover2(hoveredNode);
- } else {
- hoverInfoNode.hover2(null);
- }
- future.complete(new Object());
- });
- } else {
- future.complete(new Object());
- }
+ cancelCurrentHoverUpdate();
+ hoverUpdateSchedule = ThreadUtils.getNonBlockingWorkExecutor().scheduleWithFixedDelay(
+ () -> updateHoverInfo(runtimeDiagram, mapElement, hoveredNode, zoomLevel, visualisation, thread),
+ 0,
+ visualisation.getInterval(),
+ TimeUnit.MILLISECONDS);
+ }
+ });
+ }
+
+ private void updateHoverInfo(Resource runtimeDiagram, Resource mapElement, INode hoveredNode, int zoomLevel, DynamicVisualisation visualisation, IThreadWorkQueue thread) {
+ CompletableFuture<Object> future = new CompletableFuture<>();
+ try {
+ Simantics.getSession().syncRequest(new ReadRequest() {
+ @Override
+ public void run(ReadGraph graph) throws DatabaseException {
+ Set<Resource> mapElementTypes = graph.getTypes(mapElement);
+ if (mapElementTypes.isEmpty()) {
+ future.complete(COMPLETE);
+ return;
+ }
+
+ DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
+
+ boolean doHover =
+ (mapElementTypes.contains(DN.Vertex) && visualisation.isKeyVariablesVertexHover())
+ || (mapElementTypes.contains(DN.Edge) && visualisation.isKeyVariablesEdgesHover());
+
+ StyleResult results = DistrictNetworkHoverInfoStyle.doCalculateStyleResult(graph, runtimeDiagram, mapElement);
+ if (results != null) {
+ Point2D location = DistrictNetworkHoverInfoStyle.calculatePoint(hoveredNode, zoomLevel, null);
+ thread.asyncExec(() -> {
+ if (isRemoved())
+ return;
+ if (doHover) {
+ hoverInfoNode.setLabels(results.getLabels());
+ hoverInfoNode.setOrigin(results.getOrigin());
+ hoverInfoNode.setMousePosition(location);
+ hoverInfoNode.setHoveredNode(hoveredNode);
+ } else {
+ hoverInfoNode.setHoveredNode(null);