|
@@ -5,10 +5,10 @@ import holeg.ui.controller.Control;
|
|
|
import holeg.ui.model.GuiSettings;
|
|
|
import holeg.ui.view.dialog.CreateTemplatePopUp;
|
|
|
import holeg.utility.math.vector.Geometry;
|
|
|
+import holeg.utility.math.vector.Vec2f;
|
|
|
import holeg.utility.math.vector.Vec2i;
|
|
|
|
|
|
import javax.swing.*;
|
|
|
-import javax.swing.text.html.Option;
|
|
|
import java.awt.*;
|
|
|
import java.awt.event.MouseEvent;
|
|
|
import java.awt.event.MouseListener;
|
|
@@ -16,7 +16,6 @@ import java.awt.event.MouseMotionListener;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.Optional;
|
|
|
import java.util.Set;
|
|
|
-import java.util.logging.Filter;
|
|
|
import java.util.logging.Logger;
|
|
|
|
|
|
public class Canvas extends JPanel {
|
|
@@ -231,7 +230,7 @@ public class Canvas extends JPanel {
|
|
|
}
|
|
|
case ObjectDragging -> {
|
|
|
Vec2i delta = actualPos.subtract(lastPosition);
|
|
|
- GuiSettings.getSelectedObjects().forEach(obj -> obj.setPosition(BoundsToCanvas(obj.getPosition().add(delta))));
|
|
|
+ GuiSettings.getSelectedObjects().forEach(obj -> obj.setPosition(boundsToCanvas(obj.getPosition().add(delta))));
|
|
|
canBeReplaced = checkForReplacement(actualPos).isPresent();
|
|
|
repaint();
|
|
|
}
|
|
@@ -278,10 +277,25 @@ public class Canvas extends JPanel {
|
|
|
control.addEdgeOnCanvasOrRemoveExisting(new Edge(selectedOnPressed, obj, GuiSettings.maxCapacityForNewCreatedEdges));
|
|
|
}
|
|
|
}, () -> {
|
|
|
+
|
|
|
Node node = new Node("Node");
|
|
|
groupNode.add(node);
|
|
|
- node.setPosition(new Vec2i(BoundsToCanvas(lastPosition)));
|
|
|
-
|
|
|
+ Geometry.Circle detectionCircle = new Geometry.Circle(new Vec2f(lastPosition), 15f);
|
|
|
+ node.setPosition(new Vec2i(boundsToCanvas(lastPosition)));
|
|
|
+ for(Edge edge : control.getModel().getEdgesOnCanvas()) {
|
|
|
+ if(edge.getA().getGroupNode().isEmpty() || edge.getB().getGroupNode().isEmpty() ||
|
|
|
+ edge.getA().getGroupNode().get() != groupNode || edge.getB().getGroupNode().get() != groupNode){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ Optional<Vec2f> pos = Geometry.getProjectionOnSegmentIfInRange(new Geometry.Line(new Vec2f(edge.getA().getPosition())
|
|
|
+ , new Vec2f(edge.getB().getPosition())), detectionCircle);
|
|
|
+ if(pos.isPresent()){
|
|
|
+ Vec2f position = pos.get();
|
|
|
+ node.setPosition(new Vec2i((int)position.getX(), (int)position.getY()));
|
|
|
+ splitEdge(edge, node);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
control.addEdgeOnCanvas(new Edge(selectedOnPressed, node, GuiSettings.maxCapacityForNewCreatedEdges));
|
|
|
control.calculateStateForCurrentIteration();
|
|
|
});
|
|
@@ -339,7 +353,7 @@ public class Canvas extends JPanel {
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
- private Vec2i BoundsToCanvas(Vec2i pos){
|
|
|
+ private Vec2i boundsToCanvas(Vec2i pos){
|
|
|
Vec2i position = new Vec2i(pos);
|
|
|
position.clampX(GuiSettings.getPictureScaleDiv2(), GuiSettings.canvasSize.getX() - GuiSettings.getPictureScaleDiv2());
|
|
|
position.clampY(GuiSettings.getPictureScaleDiv2(), GuiSettings.canvasSize.getY() - GuiSettings.getPictureScaleDiv2());
|
|
@@ -350,6 +364,14 @@ public class Canvas extends JPanel {
|
|
|
return Geometry.createRectangleFromCorners(lastPosition, pressedPosition);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ public void splitEdge(Edge edge, Node node){
|
|
|
+ AbstractCanvasObject end = edge.getB();
|
|
|
+ edge.setB(node);
|
|
|
+ Edge additional = new Edge(node, end, edge.maxCapacity);
|
|
|
+ control.getModel().addEdgeOnCanvas(additional);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void mouseEntered(MouseEvent e) {
|
|
|
}
|