X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2Fparticipants%2FDynamicVisualisationContributionsParticipant.java;fp=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2Fparticipants%2FDynamicVisualisationContributionsParticipant.java;h=9fbb8a29d008f8d24e9c7971b384b04199875ef6;hb=f888cdd5d8d8e9b958de302c96cf6b013519eaca;hp=7dd11b7ab83225bcd5e943b42099fffa24df1d1f;hpb=932a9b82b349d8e63a36df1cdc5cbb37bdd8ff80;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DynamicVisualisationContributionsParticipant.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DynamicVisualisationContributionsParticipant.java index 7dd11b7a..9fbb8a29 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DynamicVisualisationContributionsParticipant.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/participants/DynamicVisualisationContributionsParticipant.java @@ -3,6 +3,7 @@ package org.simantics.district.network.ui.participants; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.util.Map; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ScheduledFuture; @@ -28,7 +29,7 @@ import org.simantics.district.network.visualisations.model.SizeBarOptions; import org.simantics.g2d.canvas.ICanvasContext; import org.simantics.g2d.canvas.impl.AbstractCanvasParticipant; import org.simantics.g2d.canvas.impl.SGNodeReflection.SGInit; -import org.simantics.layer0.Layer0; +import org.simantics.scenegraph.INode; import org.simantics.scenegraph.g2d.G2DParentNode; import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler; import org.simantics.scenegraph.g2d.events.command.CommandEvent; @@ -54,10 +55,9 @@ public class DynamicVisualisationContributionsParticipant extends AbstractCanvas } } }; - + private DynamicVisualisationContributionsNode node; private AffineTransform transform; - private DistrictNetworkHoverInfoNode hoverInfoNode; public DynamicVisualisationContributionsParticipant(AffineTransform tr) { @@ -72,7 +72,7 @@ public class DynamicVisualisationContributionsParticipant extends AbstractCanvas getHintStack().addKeyHintListener(getThread(), DistrictDiagramViewer.KEY_MAP_SIZING_OBJECTS, hintListener); getHintStack().addKeyHintListener(getThread(), DistrictDiagramViewer.KEY_MAP_SIZE_BAR_OPTIONS, hintListener); } - + @Override public void removedFromContext(ICanvasContext ctx) { // Ensure hover polling is stopped @@ -93,13 +93,13 @@ public class DynamicVisualisationContributionsParticipant extends AbstractCanvas node.setTransform(transform); node.setEnabled(true); node.setZIndex(1000); - + hoverInfoNode = parent.addNode("districtNetworkHoverInfoNode", DistrictNetworkHoverInfoNode.class); hoverInfoNode.setLookupId("districtNetworkHoverInfoNode"); hoverInfoNode.setTransform(transform); hoverInfoNode.setZIndex(Integer.MAX_VALUE - 500); } - + @EventHandler(priority = 0) protected boolean handleKeyEvent(CommandEvent e) { if (e.command.equals(DistrictDiagramViewer.MAP_COLOR_BAR_OPTIONS_CHANGE)) { @@ -108,20 +108,7 @@ public class DynamicVisualisationContributionsParticipant extends AbstractCanvas } return false; } - -// @Override -// protected boolean handleCommand(CommandEvent e) { -// if (e.command.equals(DistrictDiagramViewer.MAP_COLOR_BAR_OPTIONS_CHANGE)) { -// ICanvasContext context = (ICanvasContext) e.getContext(); -// ColorBarOptions options = context.getHintStack().getHint(DistrictDiagramViewer.KEY_MAP_COLOR_BAR_OPTIONS); -// this.colorBarsOptions = options; -// repaint(); -// return true; -// } else { -// return super.handleCommand(e); -// } -// } - + protected void updateNode() { node.setDynamicColoringObjects(getDynamicColoringObjects()); node.setColorBarOptions(getColorBarOptions()); @@ -129,105 +116,102 @@ public class DynamicVisualisationContributionsParticipant extends AbstractCanvas node.setSizeBarOptions(getSizeBarOptions()); } - private Map getDynamicColoringObjects() { - Map objects = getHint(DistrictDiagramViewer.KEY_MAP_COLORING_OBJECTS); - return objects; + private Map getDynamicColoringObjects() { + return getHint(DistrictDiagramViewer.KEY_MAP_COLORING_OBJECTS); } private ColorBarOptions getColorBarOptions() { - ColorBarOptions options = getHint(DistrictDiagramViewer.KEY_MAP_COLOR_BAR_OPTIONS); - return options; + return getHint(DistrictDiagramViewer.KEY_MAP_COLOR_BAR_OPTIONS); } private Map getDynamicSizingObjects() { - Map objects = getHint(DistrictDiagramViewer.KEY_MAP_SIZING_OBJECTS); - return objects; + return getHint(DistrictDiagramViewer.KEY_MAP_SIZING_OBJECTS); } private SizeBarOptions getSizeBarOptions() { - SizeBarOptions options = getHint(DistrictDiagramViewer.KEY_MAP_SIZE_BAR_OPTIONS); - return options; + return getHint(DistrictDiagramViewer.KEY_MAP_SIZE_BAR_OPTIONS); } private ScheduledFuture hoverUpdateSchedule; private static final Object COMPLETE = new Object(); - - public void hoverNode(Resource runtimeDiagram, Resource mapElement, G2DParentNode hoveredNode) { + + public void hoverNode(Resource runtimeDiagram, Resource mapElement, INode hoveredNode, int zoomLevel) { IThreadWorkQueue thread = getThread(); Simantics.getSession().asyncRequest(new ReadRequest() { - @Override public void run(ReadGraph graph) throws DatabaseException { DynamicVisualisation visualisation = graph.syncRequest(new RuntimeDynamicVisualisationsRequest(runtimeDiagram)); if (visualisation == null) return; - if (hoverUpdateSchedule != null && !hoverUpdateSchedule.isDone()) { - hoverUpdateSchedule.cancel(false); - } - hoverUpdateSchedule = ThreadUtils.getNonBlockingWorkExecutor().scheduleWithFixedDelay(() -> { - - CompletableFuture 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.getPossibleObject(mapElement, Layer0.getInstance(graph).InstanceOf); - if (mapElementInstanceOf == null) { - future.complete(COMPLETE); - return; - } - - 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(COMPLETE); - }); - } else { - future.complete(COMPLETE); - } + 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 future = new CompletableFuture<>(); + try { + Simantics.getSession().syncRequest(new ReadRequest() { + @Override + public void run(ReadGraph graph) throws DatabaseException { + Set 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); + 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); } + future.complete(COMPLETE); }); - } catch (DatabaseException e) { - future.completeExceptionally(e); - } - // this waits until everything is done - try { - future.get(); - } catch (InterruptedException | ExecutionException e) { - LOGGER.debug("Interrupted hovering", e); + } else { + future.complete(COMPLETE); } - }, 0, visualisation.getInterval(), TimeUnit.MILLISECONDS); - } - }); + } + }); + } catch (DatabaseException e) { + future.completeExceptionally(e); + } + // this waits until everything is done + try { + future.get(); + } catch (InterruptedException | ExecutionException e) { + LOGGER.debug("Interrupted hovering", e); + } } public boolean doHover(boolean hover, boolean isConnectionTool) { + if (!hover) + cancelCurrentHoverUpdate(); return hoverInfoNode.hover(hover, isConnectionTool); } + + private void cancelCurrentHoverUpdate() { + if (hoverUpdateSchedule != null && !hoverUpdateSchedule.isDone()) + hoverUpdateSchedule.cancel(false); + } + }