improve bulk selection

only start with first click after starting bulk selection
remove redundant rectangle calc code
change cursor while bulk selection is active
This commit is contained in:
Meduris 2025-08-05 23:37:40 +02:00
parent f8f3ac270e
commit f9c4f5e685
2 changed files with 21 additions and 19 deletions

View File

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

View File

@ -1,6 +1,7 @@
package speiger.src.ui; package speiger.src.ui;
import java.awt.Color; import java.awt.Color;
import java.awt.Cursor;
import java.awt.EventQueue; import java.awt.EventQueue;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
@ -34,6 +35,7 @@ public class MapPanel extends JPanel {
Point lastDrag = null; Point lastDrag = null;
Point startPos; Point startPos;
Point lastPos; Point lastPos;
boolean bulkSelectionBegin;
Image map = new ImageIcon(MapPanel.class.getResource("/assets/images/map.png")).getImage(); Image map = new ImageIcon(MapPanel.class.getResource("/assets/images/map.png")).getImage();
Image[] medal = new Image[] { Image[] medal = new Image[] {
new ImageIcon(MapPanel.class.getResource("/assets/images/medal.png")).getImage(), new ImageIcon(MapPanel.class.getResource("/assets/images/medal.png")).getImage(),
@ -114,13 +116,23 @@ public class MapPanel extends JPanel {
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
if(startPos != null) { if (bulkSelectionBegin && startPos == null) {
startPos = screenToMap(e.getPoint());
bulkSelectionBegin = false;
repaint();
return;
} else if(startPos != null) {
if(e.getButton() == 1) { 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"); 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); List<Marker> markers = getMarkers(getMarkedArea(), zoom);
if(markers.isEmpty()) return; if(markers.isEmpty()) return;
boolean completion = result == 0; boolean completion = result == JOptionPane.OK_OPTION;
Registry.INSTANCE.setBulkOperation(true); Registry.INSTANCE.setBulkOperation(true);
markers.forEach(T -> T.setCompletion(completion)); markers.forEach(T -> T.setCompletion(completion));
Registry.INSTANCE.setBulkOperation(false); Registry.INSTANCE.setBulkOperation(false);
@ -153,8 +165,9 @@ public class MapPanel extends JPanel {
this.progressUpdate = run; this.progressUpdate = run;
} }
public void startBulkMarking(Point point) { public void startBulkMarking() {
this.startPos = this.screenToMap(point); bulkSelectionBegin = true;
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
} }
public void onImported() { public void onImported() {
@ -214,20 +227,9 @@ public class MapPanel extends JPanel {
marker.drawHover(g2, (float)zoom); marker.drawHover(g2, (float)zoom);
} }
if(startPos != null && lastPos != null) { if(startPos != null && lastPos != null) {
Point start = new Point(startPos); Rectangle rect = getMarkedArea();
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;
}
g2.setColor(Color.BLUE); 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);
} }
} }