]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkHoverInfoNode.java
DynamicVisualisations enhancements & deprecate old profiles & settings
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / nodes / DistrictNetworkHoverInfoNode.java
index cb7053a01839d4c0a457e859c56a2985c76afd4f..7a75ad5f2e4382390f798ebc0ea38ea7c7614da5 100644 (file)
@@ -6,16 +6,24 @@ import java.awt.Graphics2D;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
+import java.util.Comparator;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.atomic.AtomicReference;
 
+import org.simantics.district.network.ui.styles.DistrictNetworkHoverInfoStyle;
+import org.simantics.maps.MapScalingTransform;
+import org.simantics.scenegraph.ParentNode;
 import org.simantics.scenegraph.g2d.G2DNode;
+import org.simantics.scenegraph.g2d.nodes.spatial.RTreeNode;
+import org.simantics.scenegraph.utils.DPIUtil;
+import org.simantics.scenegraph.utils.NodeUtil;
 import org.simantics.scl.runtime.Lists;
 import org.simantics.scl.runtime.tuple.Tuple3;
 
-public class DistrictNetworkHoverInfoNode extends G2DNode implements HoverSensitiveNode {
+public class DistrictNetworkHoverInfoNode extends G2DNode implements HoverSensitiveNode, DeferredNode {
 
-       private static final Font FONT = new Font(Font.DIALOG, Font.PLAIN, 12);
+       private static final Font FONT = new Font("Tahoma", Font.PLAIN, (int)(DPIUtil.upscale(9) * MapScalingTransform.getScaleY() + 0.5));
 
        private static final long serialVersionUID = 1L;
 
@@ -27,9 +35,12 @@ public class DistrictNetworkHoverInfoNode extends G2DNode implements HoverSensit
 
        private List<Tuple3> labels;
 
+       @SuppressWarnings("unused")
        private Point2D origin;
 
        private boolean hover = false;
+
+       private Point2D mousePosition;
        
        private static AtomicReference<DistrictNetworkHoverInfoNode> activeNode = new AtomicReference<>();
 
@@ -38,6 +49,16 @@ public class DistrictNetworkHoverInfoNode extends G2DNode implements HoverSensit
                if (!hover || activeNode.get() != this)
                        return;
 
+               ParentNode<?> root = (ParentNode<?>) NodeUtil.getNearestParentOfType(this, RTreeNode.class);
+               DeferredRenderingNode deferred = root != null ? (DeferredRenderingNode) root.getNode(DistrictNetworkHoverInfoStyle.HOVER_INFO_DEFERRED) : null;
+               if (deferred != null)
+                       deferred.deferNode(g.getTransform(), this);
+               else
+                       renderDeferred(g);
+       }
+       
+       @Override
+       public void renderDeferred(Graphics2D g) {
                AffineTransform ot = g.getTransform();
                Font of = g.getFont();
                doRender(g);
@@ -46,13 +67,22 @@ public class DistrictNetworkHoverInfoNode extends G2DNode implements HoverSensit
        }
 
        private void doRender(Graphics2D g) {
-               g.translate(origin.getX(), origin.getY());
+               g.transform(MapScalingTransform.INVERSE);
+               g.translate(mousePosition.getX(), mousePosition.getY());
+               //g.translate(origin.getX(), origin.getY());
                double scale = 1.5 / g.getTransform().getScaleX();
                g.scale(scale, scale);
 
                g.setFont(FONT);
                double rowHeight = g.getFontMetrics().getHeight() * 1.1;
 
+        // let's calculate the max width
+        Optional<Integer> max = labels.stream().map(t -> g.getFontMetrics().stringWidth((String) t.c2)).max(Comparator.naturalOrder());
+        int width = max.orElse(10);
+        g.setColor(Color.WHITE);
+        int totalHeight = (int)Math.round(rowHeight * labels.size());
+        g.fillRect(-(W1 + PAD + W2 + 5), -(totalHeight + (int)Math.round(rowHeight)), (W1 + PAD + W2 + width + 10), totalHeight + 5);
+
                g.setColor(Color.BLACK);
                
                for (Tuple3 t : labels) {
@@ -101,6 +131,11 @@ public class DistrictNetworkHoverInfoNode extends G2DNode implements HoverSensit
                return changed;
        }
        
+       @Override
+       public void setMousePosition(Point2D p) {
+               mousePosition = p;
+       }
+       
        @Override
        public void delete() {
                super.delete();