Procházet zdrojové kódy

Converts flags -> enum State

TomTroppmann před 3 roky
rodič
revize
9022c6f6b4

+ 40 - 40
src/holeg/model/HolonSwitch.java

@@ -39,45 +39,45 @@ public class HolonSwitch extends AbstractCanvasObject implements TimelineDepende
     private int localPeriod;
     private int localPeriod;
     private SwitchState state = SwitchState.Closed;
     private SwitchState state = SwitchState.Closed;
 
 
-	/**
-	 * Create a new HolonSwitch with a custom name, a default value of automatic
-	 * handle and active status.
-	 * 
-	 * @param name String
-	 */
-	public HolonSwitch(String name) {
-		super(name);
-		initGraphPoints();
-		sampleGraph();
-	}
-
-	/**
-	 * Create a copy of an existing HolonSwitch.
-	 * 
-	 * @param other the Object to copy
-	 */
-	public HolonSwitch(HolonSwitch other) {
-		super(other);
-		mode = other.mode;
-		manualState = other.manualState;
-		state = other.state;
-
-		setLocalPeriod(other.getLocalPeriod());
-		setUseLocalPeriod(other.isUsingLocalPeriod());
-		activeAt = new boolean[LocalMode.STANDARD_GRAPH_ACCURACY];
-		setName(other.getName());
-		for (Vec2f p : other.getGraphPoints()) {
-			this.graphPoints.add(new Vec2f(p.getX(), p.getY()));
-		}
-		sampleGraph();
-	}
+    /**
+     * Create a new HolonSwitch with a custom name, a default value of automatic
+     * handle and active status.
+     *
+     * @param name String
+     */
+    public HolonSwitch(String name) {
+        super(name);
+        initGraphPoints();
+        sampleGraph();
+    }
+
+    /**
+     * Create a copy of an existing HolonSwitch.
+     *
+     * @param other the Object to copy
+     */
+    public HolonSwitch(HolonSwitch other) {
+        super(other);
+        mode = other.mode;
+        manualState = other.manualState;
+        state = other.state;
+
+        setLocalPeriod(other.getLocalPeriod());
+        setUseLocalPeriod(other.isUsingLocalPeriod());
+        activeAt = new boolean[LocalMode.STANDARD_GRAPH_ACCURACY];
+        setName(other.getName());
+        for (Vec2f p : other.getGraphPoints()) {
+            this.graphPoints.add(new Vec2f(p.getX(), p.getY()));
+        }
+        sampleGraph();
+    }
 
 
     @Override
     @Override
     public String getImage() {
     public String getImage() {
-		return switch (state) {
-			case Open -> ImagePreference.Canvas.Switch.Open;
-			case Closed -> ImagePreference.Canvas.Switch.Closed;
-		};
+        return switch (state) {
+            case Open -> ImagePreference.Canvas.Switch.Open;
+            case Closed -> ImagePreference.Canvas.Switch.Closed;
+        };
     }
     }
 
 
     @Override
     @Override
@@ -232,10 +232,10 @@ public class HolonSwitch extends AbstractCanvasObject implements TimelineDepende
         Open, Closed;
         Open, Closed;
 
 
         public static SwitchState opposite(SwitchState state) {
         public static SwitchState opposite(SwitchState state) {
-			return switch (state) {
-				case Closed -> Open;
-				case Open -> Closed;
-			};
+            return switch (state) {
+                case Closed -> Open;
+                case Open -> Closed;
+            };
         }
         }
 
 
         public boolean isOpen() {
         public boolean isOpen() {

+ 2 - 1
src/holeg/ui/controller/SimulationManager.java

@@ -42,7 +42,8 @@ public class SimulationManager {
 	public void calculateStateForTimeStep(int timestep, boolean updateVisual) {
 	public void calculateStateForTimeStep(int timestep, boolean updateVisual) {
 		log.fine("Calculate");
 		log.fine("Calculate");
 		long start = System.currentTimeMillis();
 		long start = System.currentTimeMillis();
-		ArrayList<MinimumNetwork> list = new ArrayList<MinimumNetwork>();
+		ArrayList<MinimumNetwork> list = new ArrayList<>();
+		model.getCanvas().getAllSwitchObjectsRecursive().forEach(sw -> sw.calculateState(timestep));
 		MinimumModel minimumModel = new MinimumModel(model.getCanvas(), model.getEdgesOnCanvas(),
 		MinimumModel minimumModel = new MinimumModel(model.getCanvas(), model.getEdgesOnCanvas(),
 				model.getCurrentIteration());
 				model.getCurrentIteration());
 		ArrayList<Edge> leftOver = new ArrayList<Edge>();
 		ArrayList<Edge> leftOver = new ArrayList<Edge>();

+ 78 - 70
src/holeg/ui/view/canvas/Canvas.java

@@ -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
+        }
 
 
+    }
 }
 }