mirror of
https://github.com/processing/processing4.git
synced 2026-02-03 21:59:20 +01:00
Polish inspect mode interaction
- interaction fixes for button2 click and ctrl/cmd+button1 click - makes it much less likely to be invoked it by accident
This commit is contained in:
@@ -24,10 +24,12 @@ import java.awt.GraphicsEnvironment;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseWheelEvent;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -41,6 +43,7 @@ import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -179,11 +182,18 @@ public class PDEX {
|
||||
|
||||
private class InspectMode {
|
||||
|
||||
boolean isMouseDown;
|
||||
boolean isCtrlDown;
|
||||
boolean isMetaDown;
|
||||
boolean inspectModeEnabled;
|
||||
|
||||
boolean isMouse1Down;
|
||||
boolean isMouse2Down;
|
||||
boolean isHotkeyDown;
|
||||
|
||||
Predicate<MouseEvent> mouseEventHotkeyTest = Platform.isMacOS() ?
|
||||
InputEvent::isMetaDown : InputEvent::isControlDown;
|
||||
Predicate<KeyEvent> keyEventHotkeyTest = Platform.isMacOS() ?
|
||||
e -> e.getKeyCode() == KeyEvent.VK_META :
|
||||
e -> e.getKeyCode() == KeyEvent.VK_CONTROL;
|
||||
|
||||
JavaEditor editor;
|
||||
PreprocessingService pps;
|
||||
|
||||
@@ -191,49 +201,76 @@ public class PDEX {
|
||||
this.editor = editor;
|
||||
this.pps = pps;
|
||||
|
||||
// Add ctrl+click listener
|
||||
// Add listeners
|
||||
|
||||
editor.getJavaTextArea().getPainter().addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
isMouseDown = true;
|
||||
isMouse1Down = isMouse1Down || (e.getButton() == MouseEvent.BUTTON1);
|
||||
isMouse2Down = isMouse2Down || (e.getButton() == MouseEvent.BUTTON2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent evt) {
|
||||
isMouseDown = false;
|
||||
if (inspectModeEnabled && evt.getButton() == MouseEvent.BUTTON1) {
|
||||
handleInspect(evt);
|
||||
} else if (!inspectModeEnabled && evt.getButton() == MouseEvent.BUTTON2) {
|
||||
handleInspect(evt);
|
||||
public void mouseReleased(MouseEvent e) {
|
||||
boolean releasingMouse1 = e.getButton() == MouseEvent.BUTTON1;
|
||||
boolean releasingMouse2 = e.getButton() == MouseEvent.BUTTON2;
|
||||
if (inspectModeEnabled && isMouse1Down && releasingMouse1) {
|
||||
handleInspect(e);
|
||||
} else if (!inspectModeEnabled && isMouse2Down && releasingMouse2) {
|
||||
handleInspect(e);
|
||||
}
|
||||
checkInspectMode();
|
||||
isMouse1Down = isMouse1Down && !releasingMouse1;
|
||||
isMouse2Down = isMouse2Down && !releasingMouse2;
|
||||
}
|
||||
});
|
||||
|
||||
editor.getJavaTextArea().getPainter().addMouseMotionListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseDragged(MouseEvent e) {
|
||||
if (editor.isSelectionActive()) {
|
||||
// Mouse was dragged too much, disable
|
||||
inspectModeEnabled = false;
|
||||
// Cancel possible mouse 2 press
|
||||
isMouse2Down = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseMoved(MouseEvent e) {
|
||||
isMouse1Down = false;
|
||||
isMouse2Down = false;
|
||||
isHotkeyDown = mouseEventHotkeyTest.test(e);
|
||||
inspectModeEnabled = isHotkeyDown;
|
||||
}
|
||||
});
|
||||
|
||||
editor.getJavaTextArea().addMouseWheelListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseWheelMoved(MouseWheelEvent e) {
|
||||
// Editor was scrolled while mouse 1 was pressed, disable
|
||||
if (isMouse1Down) inspectModeEnabled = false;
|
||||
}
|
||||
});
|
||||
|
||||
editor.getJavaTextArea().addKeyListener(new KeyAdapter() {
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
isMetaDown = isMetaDown || e.getKeyCode() == KeyEvent.VK_META;
|
||||
isCtrlDown = isCtrlDown || e.getKeyCode() == KeyEvent.VK_CONTROL;
|
||||
if (!inspectModeEnabled) checkInspectMode();
|
||||
isHotkeyDown = isHotkeyDown || keyEventHotkeyTest.test(e);
|
||||
// Enable if hotkey was just pressed and mouse 1 is not down
|
||||
inspectModeEnabled = inspectModeEnabled || (!isMouse1Down && isHotkeyDown);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void keyReleased(KeyEvent e) {
|
||||
isMetaDown = isMetaDown && e.getKeyCode() != KeyEvent.VK_META;
|
||||
isCtrlDown = isCtrlDown && e.getKeyCode() != KeyEvent.VK_CONTROL;
|
||||
if (inspectModeEnabled) checkInspectMode();
|
||||
isHotkeyDown = isHotkeyDown && !keyEventHotkeyTest.test(e);
|
||||
// Disable if hotkey was just released
|
||||
inspectModeEnabled = inspectModeEnabled && isHotkeyDown;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
void checkInspectMode() {
|
||||
inspectModeEnabled = !isMouseDown && (isCtrlDown && !Platform.isMacOS()) || isMetaDown;
|
||||
}
|
||||
|
||||
|
||||
// Thread: EDT
|
||||
void handleInspect(MouseEvent evt) {
|
||||
int off = editor.getJavaTextArea().xyToOffset(evt.getX(), evt.getY());
|
||||
|
||||
Reference in New Issue
Block a user