X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2Fnodes%2FDistrictNetworkHoverInfoNode.java;h=7a75ad5f2e4382390f798ebc0ea38ea7c7614da5;hb=899b77b837b4473c0176dc9eb1b67e632b98db25;hp=b8a1617bab12bafa050dd8bba2c21b19d4a4e572;hpb=4eaa57fae457a1c612dffe138004afed7094a484;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkHoverInfoNode.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkHoverInfoNode.java index b8a1617b..7a75ad5f 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkHoverInfoNode.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/nodes/DistrictNetworkHoverInfoNode.java @@ -6,16 +6,22 @@ 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("Tahoma", Font.PLAIN, (int)(DPIUtil.upscale(9) * MapScalingTransform.getScaleY() + 0.5)); @@ -29,9 +35,12 @@ public class DistrictNetworkHoverInfoNode extends G2DNode implements HoverSensit private List labels; + @SuppressWarnings("unused") private Point2D origin; private boolean hover = false; + + private Point2D mousePosition; private static AtomicReference activeNode = new AtomicReference<>(); @@ -40,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); @@ -48,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 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) { @@ -103,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();