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));
private List<Tuple3> labels;
+ @SuppressWarnings("unused")
private Point2D origin;
private boolean hover = false;
+
+ private Point2D mousePosition;
private static AtomicReference<DistrictNetworkHoverInfoNode> activeNode = new AtomicReference<>();
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);
}
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) {
return changed;
}
+ @Override
+ public void setMousePosition(Point2D p) {
+ mousePosition = p;
+ }
+
@Override
public void delete() {
super.delete();