Browse Source

CanvasRenderingComplete

TomTroppmann 2 years ago
parent
commit
bbfd071a78

BIN
res/images/canvas/extern.png


+ 2 - 0
src/holeg/preferences/ImagePreference.java

@@ -19,6 +19,8 @@ public class ImagePreference {
 		}		
 		public static final String ImageNotFound = "/images/canvas/image_not_found.png";
 		public static final String ReplaceSymbol = "/images/canvas/replace.png";
+		public static final String ExternSymbol = "/images/canvas/extern.png";
+
 	}
 	
 	public static class Button {

+ 49 - 23
src/holeg/ui/view/canvas/Canvas.java

@@ -15,13 +15,12 @@ import java.util.HashSet;
 import java.util.Optional;
 import java.util.Set;
 import java.util.logging.Logger;
-import java.util.stream.Collectors;
 
 public class Canvas extends JPanel {
     private static final Logger log = Logger.getLogger(Canvas.class.getName());
-    private GroupNode groupNode;
     private final Control control;
     private final CanvasMouseListener canvasMouseListener = new CanvasMouseListener();
+    private GroupNode groupNode;
     private boolean enabled = true;
 
 
@@ -38,10 +37,6 @@ public class Canvas extends JPanel {
         this.addMouseMotionListener(canvasMouseListener);
     }
 
-    public void setGroupNode(GroupNode groupNode){
-        this.groupNode = groupNode;
-    }
-
     public static Rectangle getBoundsOfObject(AbstractCanvasObject obj) {
         int pictureScale = GuiSettings.getPictureScale();
         int pictureScaleDiv2 = GuiSettings.getPictureScaleDiv2();
@@ -57,24 +52,16 @@ public class Canvas extends JPanel {
         return this.groupNode;
     }
 
+    public void setGroupNode(GroupNode groupNode) {
+        this.groupNode = groupNode;
+    }
+
     @Override
     public void paintComponent(java.awt.Graphics g) {
         super.paintComponent(g);
         Graphics2D g2d = Rendering.initGraphics2D(g);
         Rendering.drawSelection(g2d);
-        control.getModel().getEdgesOnCanvas().forEach(edge -> {
-            if (edge.getA().getGroupNode().isEmpty() || edge.getB().getGroupNode().isEmpty()){
-                return;
-            }
-            boolean edgeAinside = edge.getA().getGroupNode().get() == groupNode;
-            boolean edgeBinside = edge.getB().getGroupNode().get() == groupNode;
-            //both
-            if (edgeAinside && edgeBinside) {
-                Rendering.drawEdge(g2d, edge);
-            }
-            //TODO(Tom2022-01-16): oneside
-            //none
-        });
+        paintEdges(g2d);
         groupNode.getHolonObjects().forEach(hO -> Rendering.drawHolonObject(g2d, hO));
         groupNode.getSwitches().forEach(hS -> Rendering.drawSwitchObject(g2d, hS));
         groupNode.getGroupNodes().forEach(groupNode -> Rendering.drawGroupNode(g2d, groupNode));
@@ -83,8 +70,47 @@ public class Canvas extends JPanel {
             case BoxSelection -> Rendering.drawSelectionBox(g2d, canvasMouseListener.getRectangleOfSelectionBox());
             case EdgeCreation -> Rendering.drawNewEdgeLine(g2d, canvasMouseListener.selectedOnPressed.getPosition(), canvasMouseListener.lastPosition);
         }
+    }
 
 
+    private void paintEdges(Graphics2D g2d) {
+        control.getModel().getEdgesOnCanvas().forEach(edge -> {
+            if (edge.getA().getGroupNode().isEmpty() || edge.getB().getGroupNode().isEmpty()) {
+                return;
+            }
+            boolean aInside = edge.getA().getGroupNode().get() == groupNode;
+            boolean bInside = edge.getB().getGroupNode().get() == groupNode;
+            //both
+            if (aInside && bInside) {
+                Rendering.drawEdge(g2d, edge, edge.getA(), edge.getB());
+            } else if (aInside) {
+                SearchObjectIfParentOfGroupNode(edge.getB()).ifPresentOrElse(
+                        alternative -> Rendering.drawEdge(g2d, edge, edge.getA(), alternative),
+                        () -> Rendering.drawExternConnection(g2d, edge.getA()));
+            } else if (bInside) {
+                SearchObjectIfParentOfGroupNode(edge.getA()).ifPresentOrElse(
+                        alternative -> Rendering.drawEdge(g2d, edge, alternative, edge.getB()),
+                        () -> Rendering.drawExternConnection(g2d, edge.getB()));
+            } else {
+                Optional<AbstractCanvasObject> alternativeA = SearchObjectIfParentOfGroupNode(edge.getA());
+                Optional<AbstractCanvasObject> alternativeB = SearchObjectIfParentOfGroupNode(edge.getB());
+                if (alternativeA.isPresent() && alternativeB.isPresent() && !alternativeA.equals(alternativeB)) {
+                    Rendering.drawEdge(g2d, edge, alternativeA.get(), alternativeB.get());
+                }
+            }
+            //none
+        });
+    }
+
+    private Optional<AbstractCanvasObject> SearchObjectIfParentOfGroupNode(AbstractCanvasObject current) {
+        while (current.getGroupNode().isPresent()) {
+            if (current.getGroupNode().get() == this.groupNode) {
+                return Optional.of(current);
+            }
+            ;
+            current = current.getGroupNode().get();
+        }
+        return Optional.empty();
     }
 
     private Optional<AbstractCanvasObject> getObjectAtPosition(Vec2i pos) {
@@ -189,9 +215,9 @@ public class Canvas extends JPanel {
                 }
                 case EdgeCreation -> {
                     getObjectAtPosition(lastPosition).ifPresentOrElse(obj -> {
-                            if(control.addEdgeOnCanvas(new Edge(selectedOnPressed, obj, GuiSettings.maxCapacityForNewCreatedEdges))){
-                                control.calculateStateAndVisualForCurrentTimeStep();
-                            }
+                        if (control.addEdgeOnCanvas(new Edge(selectedOnPressed, obj, GuiSettings.maxCapacityForNewCreatedEdges))) {
+                            control.calculateStateAndVisualForCurrentTimeStep();
+                        }
                     }, () -> {
                         Node node = new Node("Node");
                         groupNode.add(node);
@@ -215,7 +241,7 @@ public class Canvas extends JPanel {
                         sw.setMode(HolonSwitch.SwitchMode.Manual);
                         sw.flipManualState();
                         control.calculateStateAndVisualForCurrentTimeStep();
-                    } else if(obj instanceof GroupNode gNode){
+                    } else if (obj instanceof GroupNode gNode) {
                         control.showGroupNode(gNode);
                     }
                 });

+ 16 - 4
src/holeg/ui/view/canvas/Rendering.java

@@ -23,6 +23,8 @@ class Rendering {
     private static final Dimension SupplyBarDimensions = new Dimension(GuiSettings.getPictureScale(), GuiSettings.getPictureScale() / 5);
     private static final Font SupplyBarFont = new Font("TimesNewRoman", Font.PLAIN, (int) (GuiSettings.getPictureScale() * 0.3) - 2);
 
+    private static final Dimension LeavingEdgeTunnelSize = new Dimension(20, 20);
+
 
 
     static Graphics2D initGraphics2D(Graphics g) {
@@ -68,10 +70,9 @@ class Rendering {
         drawCanvasObject(g, ImagePreference.Canvas.Node.Unselected, pos);
     }
 
-    static void drawEdge(Graphics2D g, Edge edge) {
-        //both
-        Vec2i start = edge.getA().getPosition();
-        Vec2i end = edge.getB().getPosition();
+    static void drawEdge(Graphics2D g, Edge edge, AbstractCanvasObject a, AbstractCanvasObject b) {
+        Vec2i start = a.getPosition();
+        Vec2i end = b.getPosition();
         float currentEnergy = edge.getActualFlow();
         float capacity = edge.maxCapacity;
         boolean unlimited = edge.mode == Edge.EdgeMode.Unlimited;
@@ -90,6 +91,17 @@ class Rendering {
         g.drawString(currentEnergy + "/" + (unlimited ? "\u221E" : capacity), middle.getX(), middle.getY());
     }
 
+    static void drawExternConnection(Graphics2D g, AbstractCanvasObject object) {
+        Vec2i pos = object.getPosition();
+        Dimension size = new Dimension(16, 16);
+        Image image = Import.loadImage(ImagePreference.Canvas.ExternSymbol, size.width, size.height);
+        g.drawImage(image, pos.getX() + GuiSettings.getPictureScaleDiv2(), pos.getY() - GuiSettings.getPictureScaleDiv2() - size.height,
+                  size.width, size.height, null);
+    }
+
+
+
+
     static void drawNewEdgeLine(Graphics2D g, Vec2i start, Vec2i end){
         g.setStroke(TwoPixelStroke);
         g.setColor(ColorPreference.Edge.Working);