diff --git a/src/main/java/de/ph87/electro/Window.java b/src/main/java/de/ph87/electro/Window.java index 87caad2..67e06b7 100644 --- a/src/main/java/de/ph87/electro/Window.java +++ b/src/main/java/de/ph87/electro/Window.java @@ -19,7 +19,7 @@ public class Window extends JFrame { c.weightx = 1; c.weighty = 1; c.fill = GridBagConstraints.BOTH; - add(new Sidebar(part -> circuit.getCircuit().getParts().add(part)), c); + add(new Sidebar(part -> circuit.getCircuit().partAdd(part)), c); c = new GridBagConstraints(); c.gridx = 1; diff --git a/src/main/java/de/ph87/electro/circuit/Circuit.java b/src/main/java/de/ph87/electro/circuit/Circuit.java index c8c7bda..a955e04 100644 --- a/src/main/java/de/ph87/electro/circuit/Circuit.java +++ b/src/main/java/de/ph87/electro/circuit/Circuit.java @@ -6,15 +6,15 @@ import de.ph87.electro.circuit.part.Junction; import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.impl.*; -import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; import java.awt.*; import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; -@Getter +@Slf4j @NoArgsConstructor public class Circuit { @@ -24,7 +24,7 @@ public class Circuit { final List junctions = new ArrayList<>(); for (PartDto partDto : dto.getParts()) { final Part part = Part.of(partDto); - parts.add(part); + partAdd(part); junctions.addAll(part.getJunctions()); } parts.forEach(part -> part.link(junctions)); @@ -32,31 +32,31 @@ public class Circuit { public PartBattery addBattery(final String name, final int x, final int y, final Orientation orientation, final double voltage) { final PartBattery battery = new PartBattery(name, new Point(x, y), orientation, voltage); - parts.add(battery); + partAdd(battery); return battery; } public PartLight addLight(final String name, final int x, final int y, final Orientation orientation, final double maxVoltage) { final PartLight light = new PartLight(name, new Point(x, y), orientation, maxVoltage); - parts.add(light); + partAdd(light); return light; } public PartSwitch1x1 addSwitch1x1(final String name, final int x, final int y, final Orientation orientation, final boolean state) { final PartSwitch1x1 switch1x1 = new PartSwitch1x1(name, new Point(x, y), orientation, state); - parts.add(switch1x1); + partAdd(switch1x1); return switch1x1; } public PartSwitch1x2 addSwitch1x2(final String name, final int x, final int y, final Orientation orientation, final boolean state) { final PartSwitch1x2 switch1x2 = new PartSwitch1x2(name, new Point(x, y), orientation, state); - parts.add(switch1x2); + partAdd(switch1x2); return switch1x2; } public PartSwitchCross addSwitchCross(final String name, final int x, final int y, final Orientation orientation, final boolean state) { final PartSwitchCross switchCross = new PartSwitchCross(name, new Point(x, y), orientation, state); - parts.add(switchCross); + partAdd(switchCross); return switchCross; } @@ -93,9 +93,35 @@ public class Circuit { return wires; } - public void add(final Part part) { - parts.add(part); - evaluate(); + public void partAdd(final Part part) { + if (parts.contains(part)) { + throw new RuntimeException(); + } + if (isFree(part.getPosition())) { + parts.add(part); + evaluate(); + } + } + + public void partMove(final Part part, final Point newPosition) { + if (!parts.contains(part)) { + throw new RuntimeException(); + } + if (isFree(newPosition)) { + part.setPosition(newPosition); + } + } + + public boolean isFree(final Point position) { + return parts.stream().noneMatch(part -> part.getPosition().equals(position)); + } + + public Stream streamParts() { + return parts.stream(); + } + + public int getPartCount() { + return parts.size(); } } diff --git a/src/main/java/de/ph87/electro/circuit/CircuitPanel.java b/src/main/java/de/ph87/electro/circuit/CircuitPanel.java index d2b1f1e..971d3e1 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitPanel.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitPanel.java @@ -2,7 +2,6 @@ package de.ph87.electro.circuit; import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.impl.*; -import de.ph87.electro.demo.DemoAll; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -26,7 +25,7 @@ import static java.awt.event.MouseEvent.BUTTON3; public class CircuitPanel extends JPanel { @Getter - private final Circuit circuit = DemoAll.create(); + private final Circuit circuit = new Circuit(); private Part dragPart = null; @@ -42,7 +41,6 @@ public class CircuitPanel extends JPanel { @Override public void drop(final DropTargetDropEvent event) { - log.info("drop"); try { final Transferable transferable = event.getTransferable(); if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) { @@ -50,15 +48,15 @@ public class CircuitPanel extends JPanel { final Point raster = div(event.getLocation(), RASTER); final String data = (String) transferable.getTransferData(DataFlavor.stringFlavor); if (data.equals(PartBattery.class.getSimpleName())) { - circuit.add(new PartBattery(raster)); + circuit.partAdd(new PartBattery(raster)); } else if (data.equals(PartLight.class.getSimpleName())) { - circuit.add(new PartLight(raster)); + circuit.partAdd(new PartLight(raster)); } else if (data.equals(PartSwitch1x1.class.getSimpleName())) { - circuit.add(new PartSwitch1x1(raster)); + circuit.partAdd(new PartSwitch1x1(raster)); } else if (data.equals(PartSwitch1x2.class.getSimpleName())) { - circuit.add(new PartSwitch1x2(raster)); + circuit.partAdd(new PartSwitch1x2(raster)); } else if (data.equals(PartSwitchCross.class.getSimpleName())) { - circuit.add(new PartSwitchCross(raster)); + circuit.partAdd(new PartSwitchCross(raster)); } repaint(); event.dropComplete(true); @@ -92,7 +90,7 @@ public class CircuitPanel extends JPanel { } private void drawParts(final Graphics2D g) { - circuit.getParts().forEach(part -> part.paint(g)); + circuit.streamParts().forEach(part -> part.paint(g)); } private void drawRaster(final Graphics2D g, final int w, final int h) { @@ -133,7 +131,7 @@ public class CircuitPanel extends JPanel { @Override public void mouseClicked(final MouseEvent e) { final Point cell = div(e.getPoint(), RASTER); - final Optional partOptional = circuit.getParts().stream().filter(p -> p.getPosition().equals(cell)).findFirst(); + final Optional partOptional = circuit.streamParts().filter(p -> p.getPosition().equals(cell)).findFirst(); switch (e.getButton()) { case BUTTON1: partOptional.ifPresent(part -> { @@ -156,7 +154,7 @@ public class CircuitPanel extends JPanel { public void mousePressed(final MouseEvent e) { final Point cell = div(e.getPoint(), RASTER); dragOffset = new Point(HALF, HALF); - dragPart = circuit.getParts().stream().filter(p -> p.getPosition().equals(cell)).findFirst().orElse(null); + dragPart = circuit.streamParts().filter(p -> p.getPosition().equals(cell)).findFirst().orElse(null); } @Override @@ -170,7 +168,7 @@ public class CircuitPanel extends JPanel { @Override public void mouseReleased(final MouseEvent e) { if (dragPart != null) { - dragPart.setPosition(div(e.getPoint(), RASTER)); + circuit.partMove(dragPart, div(e.getPoint(), RASTER)); dragPart = null; dragPoint = null; dragOffset = null; diff --git a/src/main/java/de/ph87/electro/circuit/dto/CircuitDto.java b/src/main/java/de/ph87/electro/circuit/dto/CircuitDto.java index 255de50..50fbe6f 100644 --- a/src/main/java/de/ph87/electro/circuit/dto/CircuitDto.java +++ b/src/main/java/de/ph87/electro/circuit/dto/CircuitDto.java @@ -15,7 +15,7 @@ public class CircuitDto { private List parts; public CircuitDto(final Circuit circuit) { - this.parts = circuit.getParts().stream().map(PartDto::of).toList(); + this.parts = circuit.streamParts().map(PartDto::of).toList(); } } diff --git a/src/main/java/de/ph87/electro/circuit/part/Part.java b/src/main/java/de/ph87/electro/circuit/part/Part.java index 0d643e0..8eca2b6 100644 --- a/src/main/java/de/ph87/electro/circuit/part/Part.java +++ b/src/main/java/de/ph87/electro/circuit/part/Part.java @@ -17,17 +17,18 @@ import static de.ph87.electro.CONFIG.*; import static java.lang.Math.round; @Getter -@Setter @ToString(onlyExplicitlyIncluded = true) public abstract class Part { @ToString.Include private final String uuid; + @Setter @ToString.Include - protected String name; + private String name; - protected Point position; + @Setter + private Point position; private Orientation orientation; diff --git a/src/main/java/de/ph87/electro/circuit/part/impl/PartBattery.java b/src/main/java/de/ph87/electro/circuit/part/impl/PartBattery.java index c8305f2..7656bf3 100644 --- a/src/main/java/de/ph87/electro/circuit/part/impl/PartBattery.java +++ b/src/main/java/de/ph87/electro/circuit/part/impl/PartBattery.java @@ -83,8 +83,8 @@ public class PartBattery extends Part { } @Override - public PartBattery duplicate(final Point position) { - return new PartBattery(name, position, getOrientation(), voltage); + public PartBattery duplicate(final Point newPosition) { + return new PartBattery(getName(), newPosition, getOrientation(), voltage); } @Override diff --git a/src/main/java/de/ph87/electro/circuit/part/impl/PartLight.java b/src/main/java/de/ph87/electro/circuit/part/impl/PartLight.java index edabe45..b79315b 100644 --- a/src/main/java/de/ph87/electro/circuit/part/impl/PartLight.java +++ b/src/main/java/de/ph87/electro/circuit/part/impl/PartLight.java @@ -91,8 +91,8 @@ public class PartLight extends PartOther { } @Override - public PartLight duplicate(final Point position) { - return new PartLight(name, position, getOrientation(), maxVoltage); + public PartLight duplicate(final Point newPosition) { + return new PartLight(getName(), newPosition, getOrientation(), maxVoltage); } @Override diff --git a/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x1.java b/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x1.java index 5a0408c..f824a61 100644 --- a/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x1.java +++ b/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x1.java @@ -70,8 +70,8 @@ public class PartSwitch1x1 extends PartOther { } @Override - public PartSwitch1x1 duplicate(final Point position) { - return new PartSwitch1x1(name, position, getOrientation(), state); + public PartSwitch1x1 duplicate(final Point newPosition) { + return new PartSwitch1x1(getName(), newPosition, getOrientation(), state); } } diff --git a/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x2.java b/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x2.java index a5a7938..0dcb4de 100644 --- a/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x2.java +++ b/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x2.java @@ -80,8 +80,8 @@ public class PartSwitch1x2 extends PartOther { } @Override - public PartSwitch1x2 duplicate(final Point position) { - return new PartSwitch1x2(name, position, getOrientation(), state); + public PartSwitch1x2 duplicate(final Point newPosition) { + return new PartSwitch1x2(getName(), newPosition, getOrientation(), state); } } diff --git a/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitchCross.java b/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitchCross.java index cf3ae6a..1e069a3 100644 --- a/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitchCross.java +++ b/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitchCross.java @@ -96,8 +96,8 @@ public class PartSwitchCross extends PartOther { } @Override - public PartSwitchCross duplicate(final Point position) { - return new PartSwitchCross(name, position, getOrientation(), state); + public PartSwitchCross duplicate(final Point newPosition) { + return new PartSwitchCross(getName(), newPosition, getOrientation(), state); } } diff --git a/src/main/java/de/ph87/electro/sidebar/Sidebar.java b/src/main/java/de/ph87/electro/sidebar/Sidebar.java index 1caaf1f..5962b94 100644 --- a/src/main/java/de/ph87/electro/sidebar/Sidebar.java +++ b/src/main/java/de/ph87/electro/sidebar/Sidebar.java @@ -1,6 +1,5 @@ package de.ph87.electro.sidebar; -import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.impl.*; @@ -8,8 +7,6 @@ import javax.swing.*; import java.awt.*; import java.util.function.Consumer; -import static de.ph87.electro.CONFIG.VOLTAGE; - public class Sidebar extends JPanel { private final Consumer onAdd; @@ -17,11 +14,11 @@ public class Sidebar extends JPanel { public Sidebar(final Consumer onAdd) { this.onAdd = onAdd; setLayout(new FlowLayout()); - add(new PartBattery("Batterie", new Point(0, 0), Orientation.R0, VOLTAGE)); - add(new PartLight("Licht", new Point(0, 0), Orientation.R0, VOLTAGE)); - add(new PartSwitch1x1("Ausschalter", new Point(0, 0), Orientation.R0, false)); - add(new PartSwitch1x2("Wechselschalter", new Point(0, 0), Orientation.R0, false)); - add(new PartSwitchCross("Kreuzschalter", new Point(0, 0), Orientation.R0, false)); + add(new PartBattery(new Point(0, 0))); + add(new PartLight(new Point(0, 0))); + add(new PartSwitch1x1(new Point(0, 0))); + add(new PartSwitch1x2(new Point(0, 0))); + add(new PartSwitchCross(new Point(0, 0))); } private void add(final Part part) { diff --git a/src/test/java/de/ph87/electro/circuit/CircuitServiceTest.java b/src/test/java/de/ph87/electro/circuit/CircuitServiceTest.java index 0caf565..59f292a 100644 --- a/src/test/java/de/ph87/electro/circuit/CircuitServiceTest.java +++ b/src/test/java/de/ph87/electro/circuit/CircuitServiceTest.java @@ -2,7 +2,6 @@ package de.ph87.electro.circuit; import de.ph87.electro.circuit.part.Junction; import de.ph87.electro.circuit.part.Orientation; -import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.impl.PartBattery; import de.ph87.electro.circuit.part.impl.PartLight; import org.junit.jupiter.api.Test; @@ -38,30 +37,31 @@ class CircuitServiceTest { original.evaluate(); reloaded.evaluate(); - assertEquals(original.getParts().size(), reloaded.getParts().size()); - for (final Part originalPart : original.getParts()) { + assertEquals(original.getPartCount(), reloaded.getPartCount()); + original.streamParts().forEach(originalPart -> { System.out.printf("Part: %s\n", originalPart.getUuid()); - final Part reloadedPart = reloaded.getParts().stream().filter(part -> part.getUuid().equals(originalPart.getUuid())).findFirst().orElseThrow(); - assertEquals(originalPart.getUuid(), reloadedPart.getUuid()); - assertEquals(originalPart.getName(), reloadedPart.getName()); - assertEquals(originalPart.getPosition(), reloadedPart.getPosition()); - assertEquals(originalPart.getOrientation(), reloadedPart.getOrientation()); - assertEquals(originalPart.getJunctions().size(), reloadedPart.getJunctions().size()); - for (final Junction originalJunction : originalPart.getJunctions()) { - System.out.printf(" - Junction: %s\n", originalJunction.getUuid()); - final Junction reloadedJunction = reloadedPart.getJunctions().stream().filter(junction -> junction.getUuid().equals(originalJunction.getUuid())).findFirst().orElseThrow(); - assertEquals(originalJunction.getUuid(), reloadedJunction.getUuid()); - assertEquals(originalJunction.getName(), reloadedJunction.getName()); - assertEquals(originalJunction.getPosition(), reloadedJunction.getPosition()); - assertEquals(originalJunction.getDestinations().size(), reloadedJunction.getDestinations().size()); - for (final Junction originalDestination : originalJunction.getDestinations()) { - System.out.printf(" - Destination: %s\n", originalDestination.getUuid()); - final Junction reloadedDestination = reloadedJunction.getDestinations().stream().filter(destination -> destination.getUuid().equals(originalDestination.getUuid())).findFirst().orElseThrow(); - assertEquals(originalDestination.getUuid(), reloadedDestination.getUuid()); - assertEquals(originalDestination.getOwner().getUuid(), reloadedDestination.getOwner().getUuid()); + reloaded.streamParts().forEach(reloadedPart -> { + assertEquals(originalPart.getUuid(), reloadedPart.getUuid()); + assertEquals(originalPart.getName(), reloadedPart.getName()); + assertEquals(originalPart.getPosition(), reloadedPart.getPosition()); + assertEquals(originalPart.getOrientation(), reloadedPart.getOrientation()); + assertEquals(originalPart.getJunctions().size(), reloadedPart.getJunctions().size()); + for (final Junction originalJunction : originalPart.getJunctions()) { + System.out.printf(" - Junction: %s\n", originalJunction.getUuid()); + final Junction reloadedJunction = reloadedPart.getJunctions().stream().filter(junction -> junction.getUuid().equals(originalJunction.getUuid())).findFirst().orElseThrow(); + assertEquals(originalJunction.getUuid(), reloadedJunction.getUuid()); + assertEquals(originalJunction.getName(), reloadedJunction.getName()); + assertEquals(originalJunction.getPosition(), reloadedJunction.getPosition()); + assertEquals(originalJunction.getDestinations().size(), reloadedJunction.getDestinations().size()); + for (final Junction originalDestination : originalJunction.getDestinations()) { + System.out.printf(" - Destination: %s\n", originalDestination.getUuid()); + final Junction reloadedDestination = reloadedJunction.getDestinations().stream().filter(destination -> destination.getUuid().equals(originalDestination.getUuid())).findFirst().orElseThrow(); + assertEquals(originalDestination.getUuid(), reloadedDestination.getUuid()); + assertEquals(originalDestination.getOwner().getUuid(), reloadedDestination.getOwner().getUuid()); + } } - } - } + }); + }); } } \ No newline at end of file