package org.janelia.saalfeldlab.paintera.control.navigation; import java.util.function.Consumer; import bdv.fx.viewer.ViewerPanelFX; import net.imglib2.RealLocalizable; import net.imglib2.RealPoint; import net.imglib2.RealPositionable; public class CoordinateDisplayListener { private final ViewerPanelFX viewer; private double x = -1; private double y = -1; private final Consumer<RealPoint> submitViewerCoordinate; private final Consumer<RealPoint> submitWorldCoordinate; public CoordinateDisplayListener( final ViewerPanelFX viewer, final Consumer<RealPoint> submitViewerCoordinate, final Consumer<RealPoint> submitWorldCoordinate) { super(); this.viewer = viewer; this.submitViewerCoordinate = submitViewerCoordinate; this.submitWorldCoordinate = submitWorldCoordinate; } public void update(final double x, final double y) { this.x = x; this.y = y; final RealPoint p = new RealPoint(x, y); this.submitViewerCoordinate.accept(p); synchronized (viewer) { updateWorldCoordinates(); } } private static <P extends RealLocalizable & RealPositionable> void toGlobalCoordinate( final double x, final double y, final P p, final ViewerPanelFX viewer) { p.setPosition(x, 0); p.setPosition(y, 1); p.setPosition(0l, 2); viewer.displayToGlobalCoordinates(p); } private void updateWorldCoordinates() { final RealPoint p = new RealPoint(3); toGlobalCoordinate(x, y, p, viewer); submitWorldCoordinate.accept(p); } public static String worldToString(final RealPoint p) { final String s1 = String.format("%.3f", p.getDoublePosition(0)); final String s2 = String.format("%.3f", p.getDoublePosition(1)); final String s3 = String.format("%.3f", p.getDoublePosition(2)); return String.format( "(%8s, %8s, %8s)", s1.length() > 8 ? s1.substring(0, 8) : s1, s2.length() > 8 ? s2.substring(0, 8) : s2, s3.length() > 8 ? s3.substring(0, 8) : s3); } }