Compare commits

..

2 Commits

Author SHA1 Message Date
9e46ad50d0 allow dragging to select bulk area while still allowing to click to select the two corners 2025-08-06 23:27:21 +02:00
f9c4f5e685 improve bulk selection
only start with first click after starting bulk selection
remove redundant rectangle calc code
change cursor while bulk selection is active
2025-08-05 23:37:40 +02:00
2 changed files with 40 additions and 22 deletions

View File

@ -127,7 +127,7 @@ public class MarioKartWorldTracker {
panel.setCompletionState(false);
}, null));
bulk.add(item("Bulk Mark", T -> {
panel.startBulkMarking(panel.getMousePosition());
panel.startBulkMarking();
}, KeyStroke.getKeyStroke('m')));
bar.add(bulk);
JMenu fuckups = new JMenu("I Fucked up");

View File

@ -1,6 +1,7 @@
package speiger.src.ui;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
@ -34,6 +35,8 @@ public class MapPanel extends JPanel {
Point lastDrag = null;
Point startPos;
Point lastPos;
Point dragStart = null;
boolean bulkSelectionBegin;
Image map = new ImageIcon(MapPanel.class.getResource("/assets/images/map.png")).getImage();
Image[] medal = new Image[] {
new ImageIcon(MapPanel.class.getResource("/assets/images/medal.png")).getImage(),
@ -88,7 +91,14 @@ public class MapPanel extends JPanel {
@Override
public void mousePressed(MouseEvent e) {
if (bulkSelectionBegin && startPos == null) {
startPos = screenToMap(e.getPoint());
bulkSelectionBegin = false;
repaint();
return;
}
lastDrag = e.getPoint();
dragStart = lastDrag;
}
@Override
@ -106,6 +116,10 @@ public class MapPanel extends JPanel {
@Override
public void mouseDragged(MouseEvent e) {
if (startPos != null) {
lastPos = screenToMap(e.getPoint());
repaint();
}
if(lastDrag == null) return;
offset.translate((int)(e.getX() - lastDrag.getX()), (int)(e.getY() - lastDrag.getY()));
lastDrag = e.getPoint();
@ -113,23 +127,37 @@ public class MapPanel extends JPanel {
}
@Override
public void mouseClicked(MouseEvent e) {
if(startPos != null) {
public void mouseReleased(MouseEvent e) {
if (lastDrag != null && !e.getPoint().equals(dragStart)) {
lastDrag = null;
dragStart = null;
return;
}
dragStart = null;
if(startPos != null && !startPos.equals(screenToMap(e.getPoint()))) {
if(e.getButton() == 1) {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
int result = JOptionPane.showOptionDialog(frame, "What do you want to do?", "Bulk Marking", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[] {"Complete", "Uncomplete", "Cancel"}, "Complete");
if(result == 2) return;
if(result == JOptionPane.CANCEL_OPTION || result == JOptionPane.CLOSED_OPTION) {
startPos = null;
repaint();
return;
}
List<Marker> markers = getMarkers(getMarkedArea(), zoom);
if(markers.isEmpty()) return;
boolean completion = result == 0;
boolean completion = result == JOptionPane.OK_OPTION;
Registry.INSTANCE.setBulkOperation(true);
markers.forEach(T -> T.setCompletion(completion));
Registry.INSTANCE.setBulkOperation(false);
startPos = null;
repaint();
}
return;
}
}
@Override
public void mouseClicked(MouseEvent e) {
Point hover = screenToMap(e.getPoint());
Marker marker = findMarker(hover, zoom);
if(marker == null) return;
@ -153,8 +181,9 @@ public class MapPanel extends JPanel {
this.progressUpdate = run;
}
public void startBulkMarking(Point point) {
this.startPos = this.screenToMap(point);
public void startBulkMarking() {
bulkSelectionBegin = true;
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
public void onImported() {
@ -214,20 +243,9 @@ public class MapPanel extends JPanel {
marker.drawHover(g2, (float)zoom);
}
if(startPos != null && lastPos != null) {
Point start = new Point(startPos);
Point end = new Point(lastPos);
if(start.x > end.x) {
int x = start.x;
start.x = end.x;
end.x = x;
}
if(start.y > end.y) {
int y = start.y;
start.y = end.y;
end.y = y;
}
Rectangle rect = getMarkedArea();
g2.setColor(Color.BLUE);
g2.drawRect(start.x, start.y, end.x-start.x, end.y-start.y);
g2.drawRect(rect.x, rect.y, rect.width, rect.height);
}
}