diff --git a/ugs-platform/ugs-platform-visualizer/src/main/java/com/willwinder/ugs/nbm/visualizer/RendererInputHandler.java b/ugs-platform/ugs-platform-visualizer/src/main/java/com/willwinder/ugs/nbm/visualizer/RendererInputHandler.java index 6c893977b2..506f58cb66 100644 --- a/ugs-platform/ugs-platform-visualizer/src/main/java/com/willwinder/ugs/nbm/visualizer/RendererInputHandler.java +++ b/ugs-platform/ugs-platform-visualizer/src/main/java/com/willwinder/ugs/nbm/visualizer/RendererInputHandler.java @@ -1,5 +1,5 @@ /* - Copyright 2016-2018 Will Winder + Copyright 2016-2024 Will Winder This file is part of Universal Gcode Sender (UGS). @@ -36,8 +36,11 @@ This file is part of Universal Gcode Sender (UGS). import com.willwinder.universalgcodesender.model.events.SettingChangedEvent; import com.willwinder.universalgcodesender.utils.Settings; import com.willwinder.universalgcodesender.utils.Settings.FileStats; +import org.apache.commons.lang3.SystemUtils; import javax.swing.SwingUtilities; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsEnvironment; import java.awt.Point; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; @@ -48,6 +51,7 @@ This file is part of Universal Gcode Sender (UGS). import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.awt.event.WindowListener; +import java.awt.geom.AffineTransform; import java.util.prefs.PreferenceChangeEvent; import java.util.prefs.PreferenceChangeListener; @@ -59,16 +63,18 @@ This file is part of Universal Gcode Sender (UGS). public class RendererInputHandler implements WindowListener, MouseWheelListener, MouseMotionListener, MouseListener, KeyListener, PreferenceChangeListener, UGSEventListener { - final private GcodeRenderer gcodeRenderer; - final private FPSAnimator animator; + private static final int HIGH_FPS = 15; + private static final int LOW_FPS = 4; + private final GcodeRenderer gcodeRenderer; + private final FPSAnimator animator; private final BackendAPI backend; private final GcodeModel gcodeModel; private final SizeDisplay sizeDisplay; private final Selection selection; private final Settings settings; - - private static final int HIGH_FPS = 15; - private static final int LOW_FPS = 4; + private boolean selecting = false; + private Position selectionStart = null; + private Position selectionEnd = null; public RendererInputHandler(GcodeRenderer gr, FPSAnimator a, BackendAPI backend) { gcodeRenderer = gr; @@ -86,7 +92,23 @@ public RendererInputHandler(GcodeRenderer gr, FPSAnimator a, BackendAPI backend) gr.registerRenderable(sizeDisplay); gr.registerRenderable(selection); } - + + /** + * Returns the pixel coordinate with the screen scale applied to it. + * + * @param x the point x + * @param y the point y + * @return a screen pixel coordinate + */ + private static Point getScreenPoint(int x, int y) { + if (!SystemUtils.IS_OS_WINDOWS) { + return new Point(x, y); + } + GraphicsConfiguration graphicsConfiguration = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); + AffineTransform defaultTransform = graphicsConfiguration.getDefaultTransform(); + return new Point((int) Math.round(x * defaultTransform.getScaleX()), (int) Math.round(y * defaultTransform.getScaleY())); + } + private void setFPS(int fps) { animator.stop(); animator.setFPS(fps); @@ -97,7 +119,7 @@ private void setFPS(int fps) { public void preferenceChange(PreferenceChangeEvent evt) { gcodeRenderer.reloadPreferences(); } - + public void setGcodeFile(String file) { gcodeModel.setGcodeFile(file); gcodeRenderer.setObjectSize(gcodeModel.getMin(), gcodeModel.getMax()); @@ -121,9 +143,8 @@ private void updateBounds(Position min, Position max) { */ @Override public void UGSEvent(UGSEvent cse) { - if (cse instanceof FileStateEvent) { + if (cse instanceof FileStateEvent fileStateEvent) { animator.pause(); - FileStateEvent fileStateEvent = (FileStateEvent) cse; switch (fileStateEvent.getFileState()) { case FILE_UNLOADED: setGcodeFile(null); @@ -139,12 +160,10 @@ public void UGSEvent(UGSEvent cse) { animator.resume(); } else if (cse instanceof SettingChangedEvent) { sizeDisplay.setUnits(settings.getPreferredUnits()); - } else if (cse instanceof ControllerStatusEvent) { - ControllerStatusEvent controllerStatusEvent = (ControllerStatusEvent) cse; + } else if (cse instanceof ControllerStatusEvent controllerStatusEvent) { gcodeRenderer.setMachineCoordinate(controllerStatusEvent.getStatus().getMachineCoord()); gcodeRenderer.setWorkCoordinate(controllerStatusEvent.getStatus().getWorkCoord()); - } else if (cse instanceof CommandEvent) { - CommandEvent commandEvent = (CommandEvent) cse; + } else if (cse instanceof CommandEvent commandEvent) { if (commandEvent.getCommandEventType() == CommandEventType.COMMAND_COMPLETE && !commandEvent.getCommand().isGenerated()) { gcodeModel.setCurrentCommandNumber(commandEvent.getCommand().getCommandNumber()); } @@ -157,31 +176,31 @@ public void UGSEvent(UGSEvent cse) { @Override public void mouseDragged(java.awt.event.MouseEvent e) { + Point point = getScreenPoint(e.getX(), e.getY()); + // Don't rotate if we're making a selection. - if (selecting){ - gcodeRenderer.mouseMoved(new Point(e.getX(), e.getY())); + if (selecting) { + gcodeRenderer.mouseMoved(point); selection.setEnd(gcodeRenderer.getMouseWorldLocation()); return; } if (SwingUtilities.isLeftMouseButton(e)) { - int x = e.getX(); - int y = e.getY(); - int panMouseButton = InputEvent.BUTTON2_MASK; // TODO: Make configurable if (e.isShiftDown() || e.getModifiers() == panMouseButton) { - gcodeRenderer.mousePan(new Point(x,y)); + gcodeRenderer.mousePan(point); } else { - gcodeRenderer.mouseRotate(new Point(x,y)); + gcodeRenderer.mouseRotate(point); } } } @Override public void mouseMoved(java.awt.event.MouseEvent e) { - gcodeRenderer.mouseMoved(new Point(e.getX(), e.getY())); + Point point = getScreenPoint(e.getX(), e.getY()); + gcodeRenderer.mouseMoved(point); } /** @@ -191,7 +210,7 @@ public void mouseMoved(java.awt.event.MouseEvent e) { public void mouseWheelMoved(MouseWheelEvent e) { gcodeRenderer.zoom(e.getWheelRotation()); } - + /** * Window Listener */ @@ -248,10 +267,6 @@ public void mouseClicked(MouseEvent e) { } } - private boolean selecting = false; - private Position selectionStart = null; - private Position selectionEnd = null; - /** * Mouse pressed is called on mouse-down. * Mouse released and mouse clicked are called on mouse-up. @@ -292,7 +307,7 @@ public void mouseExited(MouseEvent e) { * Key Listener */ - /** + /** * KeyListener method. */ @Override @@ -307,8 +322,8 @@ public void keyPressed(KeyEvent ke) { setFPS(HIGH_FPS); int DELTA_SIZE = 1; - - switch(ke.getKeyCode()) { + + switch (ke.getKeyCode()) { case KeyEvent.VK_UP: gcodeRenderer.pan(0, DELTA_SIZE); //this.eye.y+=DELTA_SIZE; @@ -331,15 +346,15 @@ public void keyPressed(KeyEvent ke) { gcodeRenderer.resetView(); break; } - - switch(ke.getKeyChar()) { + + switch (ke.getKeyChar()) { case '+': if (ke.isControlDown()) gcodeRenderer.zoom(1); break; } } - + /** * KeyListener method. */