Skip to content

Commit

Permalink
Fixes mouse position on windows with screen scaling (#2457)
Browse files Browse the repository at this point in the history
* Fix problem with mouse position when using screen scaling
* Only apply the scale on Windows
  • Loading branch information
breiler authored Feb 7, 2024
1 parent 7a01cf1 commit 425f582
Showing 1 changed file with 48 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Copyright 2016-2018 Will Winder
Copyright 2016-2024 Will Winder
This file is part of Universal Gcode Sender (UGS).
Expand Down Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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());
Expand All @@ -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);
Expand All @@ -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());
}
Expand All @@ -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);
}

/**
Expand All @@ -191,7 +210,7 @@ public void mouseMoved(java.awt.event.MouseEvent e) {
public void mouseWheelMoved(MouseWheelEvent e) {
gcodeRenderer.zoom(e.getWheelRotation());
}

/**
* Window Listener
*/
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -292,7 +307,7 @@ public void mouseExited(MouseEvent e) {
* Key Listener
*/

/**
/**
* KeyListener method.
*/
@Override
Expand All @@ -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;
Expand All @@ -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.
*/
Expand Down

0 comments on commit 425f582

Please sign in to comment.