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=07ad2eedb4df1decd66f4ac0e965a76a67d6039c;hb=6f8ba9e7f5c9d07c11f495d2f88f17dae4d6705f;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..07ad2eed 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,26 @@ 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.INode; +import org.simantics.scenegraph.NodeException; +import org.simantics.scenegraph.ParentNode; import org.simantics.scenegraph.g2d.G2DNode; +import org.simantics.scenegraph.g2d.G2DParentNode; +import org.simantics.scenegraph.g2d.nodes.spatial.RTreeNode; +import org.simantics.scenegraph.profile.common.ProfileVariables; 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,17 +39,30 @@ 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<>(); + private static AtomicReference activeNode = new AtomicReference<>(); @Override public void render(Graphics2D g) { - 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) { + if (!hover || activeNode.get() == null) + return; AffineTransform ot = g.getTransform(); Font of = g.getFont(); doRender(g); @@ -48,13 +71,25 @@ public class DistrictNetworkHoverInfoNode extends G2DNode implements HoverSensit } private void doRender(Graphics2D g) { - g.translate(origin.getX(), origin.getY()); + AffineTransform tt = getTransform(); + g.transform(tt); + if (mousePosition == null) + return; + 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) { @@ -91,21 +126,51 @@ public class DistrictNetworkHoverInfoNode extends G2DNode implements HoverSensit @Override public boolean hover(boolean hover, boolean isConnectionTool) { - hover = hover && activeNode.updateAndGet(current -> current == null ? this : current) == this; +// hover = hover && activeNode.updateAndGet(current -> current == null ? this : current) == this; boolean changed = hover != this.hover; this.hover = hover; - - if (changed) { - if (!hover) activeNode.updateAndGet(current -> current == this ? null : current); - repaint(); - } - +// +// if (changed) { +// if (!hover) activeNode.updateAndGet(current -> current == this ? null : current); +// repaint(); +// } +// return changed; } + @Override + public void setMousePosition(Point2D p) { + mousePosition = p; + } + @Override public void delete() { super.delete(); - activeNode.getAndUpdate(current -> current == this ? null : current); + activeNode.set(null); } + + public void hover2(G2DParentNode hoveredNode) { + ParentNode root = (ParentNode) NodeUtil.getNearestParentOfType(parent, RTreeNode.class); + if (root != null) { + + INode child = ProfileVariables.browseChild(root, ""); + if(child == null) { + throw new NullPointerException("Scenegraph child node was not found: " + ""); + } + + INode existing = NodeUtil.getChildById(child, DistrictNetworkHoverInfoStyle.HOVER_INFO_DEFERRED); + if (existing == null) { + if (child instanceof ParentNode) { + existing = ((ParentNode) child).addNode(DistrictNetworkHoverInfoStyle.HOVER_INFO_DEFERRED, DeferredRenderingNode.class); + ((DeferredRenderingNode)existing).setZIndex(Integer.MAX_VALUE); + } else { + throw new NodeException("Cannot claim child node for non-parent-node " + child); + } + } + } + + activeNode.set(hoveredNode); + repaint(); + } + }