|
@@ -2,6 +2,7 @@ package holeg.ui.view.canvas;
|
|
|
|
|
|
import holeg.model.AbstractCanvasObject;
|
|
import holeg.model.AbstractCanvasObject;
|
|
import holeg.model.GroupNode;
|
|
import holeg.model.GroupNode;
|
|
|
|
+import holeg.model.HolonSwitch;
|
|
import holeg.ui.controller.Control;
|
|
import holeg.ui.controller.Control;
|
|
import holeg.ui.model.GuiSettings;
|
|
import holeg.ui.model.GuiSettings;
|
|
import holeg.utility.math.vector.Geometry;
|
|
import holeg.utility.math.vector.Geometry;
|
|
@@ -29,6 +30,7 @@ public class Canvas extends JPanel {
|
|
private final CanvasMouseListener listener = new CanvasMouseListener();
|
|
private final CanvasMouseListener listener = new CanvasMouseListener();
|
|
private boolean enabled = true;
|
|
private boolean enabled = true;
|
|
|
|
|
|
|
|
+
|
|
public Canvas(Control control, GroupNode groupNode) {
|
|
public Canvas(Control control, GroupNode groupNode) {
|
|
this.control = control;
|
|
this.control = control;
|
|
this.groupNode = groupNode;
|
|
this.groupNode = groupNode;
|
|
@@ -75,7 +77,7 @@ public class Canvas extends JPanel {
|
|
//none
|
|
//none
|
|
});
|
|
});
|
|
|
|
|
|
- if (listener.boxSelection) {
|
|
|
|
|
|
+ if (listener.state == CanvasMouseListener.State.BoxSelection) {
|
|
Rendering.drawSelectionBox(g2d, listener.getRectangleOfSelectionBox());
|
|
Rendering.drawSelectionBox(g2d, listener.getRectangleOfSelectionBox());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -97,71 +99,48 @@ public class Canvas extends JPanel {
|
|
private class CanvasMouseListener implements MouseListener, MouseMotionListener {
|
|
private class CanvasMouseListener implements MouseListener, MouseMotionListener {
|
|
private Vec2i lastPosition = new Vec2i();
|
|
private Vec2i lastPosition = new Vec2i();
|
|
private Vec2i pressedPosition = new Vec2i();
|
|
private Vec2i pressedPosition = new Vec2i();
|
|
- private boolean dragDetected = false;
|
|
|
|
- private boolean ctrlAdded = false;
|
|
|
|
- private boolean boxSelection = false;
|
|
|
|
private Set<AbstractCanvasObject> selectionBeforeBoxSelection = new HashSet<>();
|
|
private Set<AbstractCanvasObject> selectionBeforeBoxSelection = new HashSet<>();
|
|
-
|
|
|
|
- private static boolean LeftMouseButtonIsDown(MouseEvent e) {
|
|
|
|
- int onMask = MouseEvent.BUTTON1_DOWN_MASK;
|
|
|
|
- return (e.getModifiersEx() & onMask) == onMask;
|
|
|
|
- }
|
|
|
|
|
|
+ private State state = State.None;
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void mousePressed(MouseEvent e) {
|
|
public void mousePressed(MouseEvent e) {
|
|
if (!enabled) {
|
|
if (!enabled) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- log.info("Pressed");
|
|
|
|
- Vec2i pos = new Vec2i(e.getPoint());
|
|
|
|
- if (e.isControlDown()) {
|
|
|
|
- getObjectAtPosition(pos).ifPresentOrElse(obj -> {
|
|
|
|
- if (!GuiSettings.getSelectedObjects().contains(obj)) {
|
|
|
|
- control.addSelectedObject(obj);
|
|
|
|
- ctrlAdded = true;
|
|
|
|
- }
|
|
|
|
- }, this::initBoxSelection);
|
|
|
|
- } else {
|
|
|
|
- getObjectAtPosition(pos).ifPresentOrElse(obj -> {
|
|
|
|
- if (!GuiSettings.getSelectedObjects().contains(obj)) {
|
|
|
|
- GuiSettings.getSelectedObjects().clear();
|
|
|
|
- control.addSelectedObject(obj);
|
|
|
|
- }
|
|
|
|
- }, () -> {
|
|
|
|
- control.clearSelection();
|
|
|
|
- initBoxSelection();
|
|
|
|
- });
|
|
|
|
|
|
+ log.info(state.toString());
|
|
|
|
+ if(!e.isControlDown()){
|
|
|
|
+ GuiSettings.getSelectedObjects().clear();
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ Vec2i pos = new Vec2i(e.getPoint());
|
|
|
|
+ getObjectAtPosition(pos).ifPresentOrElse(obj -> {
|
|
|
|
+ if (!GuiSettings.getSelectedObjects().contains(obj)) {
|
|
|
|
+ state = State.Selection;
|
|
|
|
+ GuiSettings.getSelectedObjects().add(obj);
|
|
|
|
+ }
|
|
|
|
+ }, () -> {
|
|
|
|
+ state = State.BoxSelection;
|
|
|
|
+ selectionBeforeBoxSelection = Set.copyOf(GuiSettings.getSelectedObjects());
|
|
|
|
+ });
|
|
|
|
+ control.OnSelectionChanged.broadcast();
|
|
lastPosition = pressedPosition = pos;
|
|
lastPosition = pressedPosition = pos;
|
|
- dragDetected = false;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- private void initBoxSelection() {
|
|
|
|
- boxSelection = true;
|
|
|
|
- selectionBeforeBoxSelection = Set.copyOf(GuiSettings.getSelectedObjects());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
@Override
|
|
@Override
|
|
public void mouseReleased(MouseEvent e) {
|
|
public void mouseReleased(MouseEvent e) {
|
|
- log.info("Released");
|
|
|
|
- if (enabled && !dragDetected) {
|
|
|
|
- if (e.isControlDown()) {
|
|
|
|
- getObjectAtPosition(lastPosition).ifPresent(obj -> {
|
|
|
|
- if (!ctrlAdded && GuiSettings.getSelectedObjects().contains(obj)) {
|
|
|
|
- control.removeObjectFromSelection(obj);
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- } else if (!GuiSettings.getSelectedObjects().isEmpty()) {
|
|
|
|
- getObjectAtPosition(lastPosition).ifPresent(obj -> {
|
|
|
|
- GuiSettings.getSelectedObjects().clear();
|
|
|
|
|
|
+ if (!enabled) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ log.info(state.toString());
|
|
|
|
+ if (state == State.None) {
|
|
|
|
+ getObjectAtPosition(lastPosition).ifPresent(obj -> {
|
|
|
|
+ if (GuiSettings.getSelectedObjects().contains(obj)) {
|
|
|
|
+ control.removeObjectFromSelection(obj);
|
|
|
|
+ } else {
|
|
control.addSelectedObject(obj);
|
|
control.addSelectedObject(obj);
|
|
- });
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+ });
|
|
}
|
|
}
|
|
- ctrlAdded = false;
|
|
|
|
- boxSelection = false;
|
|
|
|
|
|
+ state = State.None;
|
|
repaint();
|
|
repaint();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -170,26 +149,41 @@ public class Canvas extends JPanel {
|
|
if (!enabled) {
|
|
if (!enabled) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- log.info("Dragged");
|
|
|
|
|
|
+ log.info(state.toString());
|
|
Vec2i actualPos = new Vec2i(e.getPoint());
|
|
Vec2i actualPos = new Vec2i(e.getPoint());
|
|
- dragDetected = dragDetected || (pressedPosition.getSquaredDistance(actualPos) > GuiSettings.dragThresholdDistance);
|
|
|
|
- if (dragDetected) {
|
|
|
|
- repaint();
|
|
|
|
- }
|
|
|
|
- if (boxSelection) {
|
|
|
|
- log.info("BoxSelection");
|
|
|
|
- Rectangle selectionBox = getRectangleOfSelectionBox();
|
|
|
|
- groupNode.getObjectsInThisLayer().forEach(obj -> {
|
|
|
|
- Rectangle bounds = getBoundsOfObject(obj);
|
|
|
|
- if (selectionBox.intersects(bounds) ^ selectionBeforeBoxSelection.contains(obj)) {
|
|
|
|
- control.addSelectedObject(obj);
|
|
|
|
- } else {
|
|
|
|
- control.removeObjectFromSelection(obj);
|
|
|
|
|
|
+ switch (state) {
|
|
|
|
+ case None, Selection -> {
|
|
|
|
+ // Not handle to small mouse dragging
|
|
|
|
+ if (!(pressedPosition.getSquaredDistance(actualPos) > GuiSettings.dragThresholdDistance)) {
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
- });
|
|
|
|
- } else if (LeftMouseButtonIsDown(e)) {
|
|
|
|
- Vec2i delta = actualPos.subtract(lastPosition);
|
|
|
|
- GuiSettings.getSelectedObjects().forEach(obj -> obj.getPosition().addAssign(delta));
|
|
|
|
|
|
+ if (SwingUtilities.isLeftMouseButton(e)) {
|
|
|
|
+ state = State.ObjectDragging;
|
|
|
|
+ } else if (SwingUtilities.isRightMouseButton(e)) {
|
|
|
|
+ state = State.EdgeCreation;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ case BoxSelection -> {
|
|
|
|
+ Rectangle selectionBox = getRectangleOfSelectionBox();
|
|
|
|
+ groupNode.getObjectsInThisLayer().forEach(obj -> {
|
|
|
|
+ Rectangle bounds = getBoundsOfObject(obj);
|
|
|
|
+ if (selectionBox.intersects(bounds) ^ selectionBeforeBoxSelection.contains(obj)) {
|
|
|
|
+ control.addSelectedObject(obj);
|
|
|
|
+ } else {
|
|
|
|
+ control.removeObjectFromSelection(obj);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ repaint();
|
|
|
|
+ }
|
|
|
|
+ case ObjectDragging -> {
|
|
|
|
+ Vec2i delta = actualPos.subtract(lastPosition);
|
|
|
|
+ GuiSettings.getSelectedObjects().forEach(obj -> obj.getPosition().addAssign(delta));
|
|
|
|
+ repaint();
|
|
|
|
+ }
|
|
|
|
+ case EdgeCreation -> {
|
|
|
|
+ log.info("Edge Creation");
|
|
|
|
+ repaint();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
lastPosition = actualPos;
|
|
lastPosition = actualPos;
|
|
|
|
|
|
@@ -201,6 +195,17 @@ public class Canvas extends JPanel {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void mouseClicked(MouseEvent e) {
|
|
public void mouseClicked(MouseEvent e) {
|
|
|
|
+ boolean doubleLeftClick = e.getClickCount() % 2 == 0 && SwingUtilities.isLeftMouseButton(e);
|
|
|
|
+ if (doubleLeftClick) {
|
|
|
|
+ log.info(state.toString());
|
|
|
|
+ getObjectAtPosition(new Vec2i(e.getPoint())).ifPresent(obj -> {
|
|
|
|
+ if (obj instanceof HolonSwitch sw) {
|
|
|
|
+ sw.setMode(HolonSwitch.SwitchMode.Manual);
|
|
|
|
+ sw.flipManualState();
|
|
|
|
+ control.calculateStateAndVisualForCurrentTimeStep();
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -215,6 +220,9 @@ public class Canvas extends JPanel {
|
|
public void mouseMoved(MouseEvent e) {
|
|
public void mouseMoved(MouseEvent e) {
|
|
}
|
|
}
|
|
|
|
|
|
- }
|
|
|
|
|
|
+ private enum State {
|
|
|
|
+ None, BoxSelection, EdgeCreation, ObjectDragging, Selection
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ }
|
|
}
|
|
}
|