prohibit double-placement

This commit is contained in:
Patrick Haßel 2024-05-16 11:54:52 +02:00
parent b19547922c
commit 3da368bfe0
12 changed files with 91 additions and 69 deletions

View File

@ -19,7 +19,7 @@ public class Window extends JFrame {
c.weightx = 1; c.weightx = 1;
c.weighty = 1; c.weighty = 1;
c.fill = GridBagConstraints.BOTH; 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 = new GridBagConstraints();
c.gridx = 1; c.gridx = 1;

View File

@ -6,15 +6,15 @@ import de.ph87.electro.circuit.part.Junction;
import de.ph87.electro.circuit.part.Orientation; import de.ph87.electro.circuit.part.Orientation;
import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.impl.*; import de.ph87.electro.circuit.part.impl.*;
import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.awt.*; import java.awt.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Stream; import java.util.stream.Stream;
@Getter @Slf4j
@NoArgsConstructor @NoArgsConstructor
public class Circuit { public class Circuit {
@ -24,7 +24,7 @@ public class Circuit {
final List<Junction> junctions = new ArrayList<>(); final List<Junction> junctions = new ArrayList<>();
for (PartDto partDto : dto.getParts()) { for (PartDto partDto : dto.getParts()) {
final Part part = Part.of(partDto); final Part part = Part.of(partDto);
parts.add(part); partAdd(part);
junctions.addAll(part.getJunctions()); junctions.addAll(part.getJunctions());
} }
parts.forEach(part -> part.link(junctions)); 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) { 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); final PartBattery battery = new PartBattery(name, new Point(x, y), orientation, voltage);
parts.add(battery); partAdd(battery);
return battery; return battery;
} }
public PartLight addLight(final String name, final int x, final int y, final Orientation orientation, final double maxVoltage) { 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); final PartLight light = new PartLight(name, new Point(x, y), orientation, maxVoltage);
parts.add(light); partAdd(light);
return light; return light;
} }
public PartSwitch1x1 addSwitch1x1(final String name, final int x, final int y, final Orientation orientation, final boolean state) { 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); final PartSwitch1x1 switch1x1 = new PartSwitch1x1(name, new Point(x, y), orientation, state);
parts.add(switch1x1); partAdd(switch1x1);
return switch1x1; return switch1x1;
} }
public PartSwitch1x2 addSwitch1x2(final String name, final int x, final int y, final Orientation orientation, final boolean state) { 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); final PartSwitch1x2 switch1x2 = new PartSwitch1x2(name, new Point(x, y), orientation, state);
parts.add(switch1x2); partAdd(switch1x2);
return switch1x2; return switch1x2;
} }
public PartSwitchCross addSwitchCross(final String name, final int x, final int y, final Orientation orientation, final boolean state) { 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); final PartSwitchCross switchCross = new PartSwitchCross(name, new Point(x, y), orientation, state);
parts.add(switchCross); partAdd(switchCross);
return switchCross; return switchCross;
} }
@ -93,9 +93,35 @@ public class Circuit {
return wires; return wires;
} }
public void add(final Part part) { public void partAdd(final Part part) {
parts.add(part); if (parts.contains(part)) {
evaluate(); 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<Part> streamParts() {
return parts.stream();
}
public int getPartCount() {
return parts.size();
} }
} }

View File

@ -2,7 +2,6 @@ package de.ph87.electro.circuit;
import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.impl.*; import de.ph87.electro.circuit.part.impl.*;
import de.ph87.electro.demo.DemoAll;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -26,7 +25,7 @@ import static java.awt.event.MouseEvent.BUTTON3;
public class CircuitPanel extends JPanel { public class CircuitPanel extends JPanel {
@Getter @Getter
private final Circuit circuit = DemoAll.create(); private final Circuit circuit = new Circuit();
private Part dragPart = null; private Part dragPart = null;
@ -42,7 +41,6 @@ public class CircuitPanel extends JPanel {
@Override @Override
public void drop(final DropTargetDropEvent event) { public void drop(final DropTargetDropEvent event) {
log.info("drop");
try { try {
final Transferable transferable = event.getTransferable(); final Transferable transferable = event.getTransferable();
if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) { if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
@ -50,15 +48,15 @@ public class CircuitPanel extends JPanel {
final Point raster = div(event.getLocation(), RASTER); final Point raster = div(event.getLocation(), RASTER);
final String data = (String) transferable.getTransferData(DataFlavor.stringFlavor); final String data = (String) transferable.getTransferData(DataFlavor.stringFlavor);
if (data.equals(PartBattery.class.getSimpleName())) { if (data.equals(PartBattery.class.getSimpleName())) {
circuit.add(new PartBattery(raster)); circuit.partAdd(new PartBattery(raster));
} else if (data.equals(PartLight.class.getSimpleName())) { } else if (data.equals(PartLight.class.getSimpleName())) {
circuit.add(new PartLight(raster)); circuit.partAdd(new PartLight(raster));
} else if (data.equals(PartSwitch1x1.class.getSimpleName())) { } else if (data.equals(PartSwitch1x1.class.getSimpleName())) {
circuit.add(new PartSwitch1x1(raster)); circuit.partAdd(new PartSwitch1x1(raster));
} else if (data.equals(PartSwitch1x2.class.getSimpleName())) { } else if (data.equals(PartSwitch1x2.class.getSimpleName())) {
circuit.add(new PartSwitch1x2(raster)); circuit.partAdd(new PartSwitch1x2(raster));
} else if (data.equals(PartSwitchCross.class.getSimpleName())) { } else if (data.equals(PartSwitchCross.class.getSimpleName())) {
circuit.add(new PartSwitchCross(raster)); circuit.partAdd(new PartSwitchCross(raster));
} }
repaint(); repaint();
event.dropComplete(true); event.dropComplete(true);
@ -92,7 +90,7 @@ public class CircuitPanel extends JPanel {
} }
private void drawParts(final Graphics2D g) { 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) { private void drawRaster(final Graphics2D g, final int w, final int h) {
@ -133,7 +131,7 @@ public class CircuitPanel extends JPanel {
@Override @Override
public void mouseClicked(final MouseEvent e) { public void mouseClicked(final MouseEvent e) {
final Point cell = div(e.getPoint(), RASTER); final Point cell = div(e.getPoint(), RASTER);
final Optional<Part> partOptional = circuit.getParts().stream().filter(p -> p.getPosition().equals(cell)).findFirst(); final Optional<Part> partOptional = circuit.streamParts().filter(p -> p.getPosition().equals(cell)).findFirst();
switch (e.getButton()) { switch (e.getButton()) {
case BUTTON1: case BUTTON1:
partOptional.ifPresent(part -> { partOptional.ifPresent(part -> {
@ -156,7 +154,7 @@ public class CircuitPanel extends JPanel {
public void mousePressed(final MouseEvent e) { public void mousePressed(final MouseEvent e) {
final Point cell = div(e.getPoint(), RASTER); final Point cell = div(e.getPoint(), RASTER);
dragOffset = new Point(HALF, HALF); 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 @Override
@ -170,7 +168,7 @@ public class CircuitPanel extends JPanel {
@Override @Override
public void mouseReleased(final MouseEvent e) { public void mouseReleased(final MouseEvent e) {
if (dragPart != null) { if (dragPart != null) {
dragPart.setPosition(div(e.getPoint(), RASTER)); circuit.partMove(dragPart, div(e.getPoint(), RASTER));
dragPart = null; dragPart = null;
dragPoint = null; dragPoint = null;
dragOffset = null; dragOffset = null;

View File

@ -15,7 +15,7 @@ public class CircuitDto {
private List<PartDto> parts; private List<PartDto> parts;
public CircuitDto(final Circuit circuit) { public CircuitDto(final Circuit circuit) {
this.parts = circuit.getParts().stream().map(PartDto::of).toList(); this.parts = circuit.streamParts().map(PartDto::of).toList();
} }
} }

View File

@ -17,17 +17,18 @@ import static de.ph87.electro.CONFIG.*;
import static java.lang.Math.round; import static java.lang.Math.round;
@Getter @Getter
@Setter
@ToString(onlyExplicitlyIncluded = true) @ToString(onlyExplicitlyIncluded = true)
public abstract class Part { public abstract class Part {
@ToString.Include @ToString.Include
private final String uuid; private final String uuid;
@Setter
@ToString.Include @ToString.Include
protected String name; private String name;
protected Point position; @Setter
private Point position;
private Orientation orientation; private Orientation orientation;

View File

@ -83,8 +83,8 @@ public class PartBattery extends Part {
} }
@Override @Override
public PartBattery duplicate(final Point position) { public PartBattery duplicate(final Point newPosition) {
return new PartBattery(name, position, getOrientation(), voltage); return new PartBattery(getName(), newPosition, getOrientation(), voltage);
} }
@Override @Override

View File

@ -91,8 +91,8 @@ public class PartLight extends PartOther {
} }
@Override @Override
public PartLight duplicate(final Point position) { public PartLight duplicate(final Point newPosition) {
return new PartLight(name, position, getOrientation(), maxVoltage); return new PartLight(getName(), newPosition, getOrientation(), maxVoltage);
} }
@Override @Override

View File

@ -70,8 +70,8 @@ public class PartSwitch1x1 extends PartOther {
} }
@Override @Override
public PartSwitch1x1 duplicate(final Point position) { public PartSwitch1x1 duplicate(final Point newPosition) {
return new PartSwitch1x1(name, position, getOrientation(), state); return new PartSwitch1x1(getName(), newPosition, getOrientation(), state);
} }
} }

View File

@ -80,8 +80,8 @@ public class PartSwitch1x2 extends PartOther {
} }
@Override @Override
public PartSwitch1x2 duplicate(final Point position) { public PartSwitch1x2 duplicate(final Point newPosition) {
return new PartSwitch1x2(name, position, getOrientation(), state); return new PartSwitch1x2(getName(), newPosition, getOrientation(), state);
} }
} }

View File

@ -96,8 +96,8 @@ public class PartSwitchCross extends PartOther {
} }
@Override @Override
public PartSwitchCross duplicate(final Point position) { public PartSwitchCross duplicate(final Point newPosition) {
return new PartSwitchCross(name, position, getOrientation(), state); return new PartSwitchCross(getName(), newPosition, getOrientation(), state);
} }
} }

View File

@ -1,6 +1,5 @@
package de.ph87.electro.sidebar; 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.Part;
import de.ph87.electro.circuit.part.impl.*; import de.ph87.electro.circuit.part.impl.*;
@ -8,8 +7,6 @@ import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.util.function.Consumer; import java.util.function.Consumer;
import static de.ph87.electro.CONFIG.VOLTAGE;
public class Sidebar extends JPanel { public class Sidebar extends JPanel {
private final Consumer<Part> onAdd; private final Consumer<Part> onAdd;
@ -17,11 +14,11 @@ public class Sidebar extends JPanel {
public Sidebar(final Consumer<Part> onAdd) { public Sidebar(final Consumer<Part> onAdd) {
this.onAdd = onAdd; this.onAdd = onAdd;
setLayout(new FlowLayout()); setLayout(new FlowLayout());
add(new PartBattery("Batterie", new Point(0, 0), Orientation.R0, VOLTAGE)); add(new PartBattery(new Point(0, 0)));
add(new PartLight("Licht", new Point(0, 0), Orientation.R0, VOLTAGE)); add(new PartLight(new Point(0, 0)));
add(new PartSwitch1x1("Ausschalter", new Point(0, 0), Orientation.R0, false)); add(new PartSwitch1x1(new Point(0, 0)));
add(new PartSwitch1x2("Wechselschalter", new Point(0, 0), Orientation.R0, false)); add(new PartSwitch1x2(new Point(0, 0)));
add(new PartSwitchCross("Kreuzschalter", new Point(0, 0), Orientation.R0, false)); add(new PartSwitchCross(new Point(0, 0)));
} }
private void add(final Part part) { private void add(final Part part) {

View File

@ -2,7 +2,6 @@ package de.ph87.electro.circuit;
import de.ph87.electro.circuit.part.Junction; import de.ph87.electro.circuit.part.Junction;
import de.ph87.electro.circuit.part.Orientation; 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.PartBattery;
import de.ph87.electro.circuit.part.impl.PartLight; import de.ph87.electro.circuit.part.impl.PartLight;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -38,30 +37,31 @@ class CircuitServiceTest {
original.evaluate(); original.evaluate();
reloaded.evaluate(); reloaded.evaluate();
assertEquals(original.getParts().size(), reloaded.getParts().size()); assertEquals(original.getPartCount(), reloaded.getPartCount());
for (final Part originalPart : original.getParts()) { original.streamParts().forEach(originalPart -> {
System.out.printf("Part: %s\n", originalPart.getUuid()); System.out.printf("Part: %s\n", originalPart.getUuid());
final Part reloadedPart = reloaded.getParts().stream().filter(part -> part.getUuid().equals(originalPart.getUuid())).findFirst().orElseThrow(); reloaded.streamParts().forEach(reloadedPart -> {
assertEquals(originalPart.getUuid(), reloadedPart.getUuid()); assertEquals(originalPart.getUuid(), reloadedPart.getUuid());
assertEquals(originalPart.getName(), reloadedPart.getName()); assertEquals(originalPart.getName(), reloadedPart.getName());
assertEquals(originalPart.getPosition(), reloadedPart.getPosition()); assertEquals(originalPart.getPosition(), reloadedPart.getPosition());
assertEquals(originalPart.getOrientation(), reloadedPart.getOrientation()); assertEquals(originalPart.getOrientation(), reloadedPart.getOrientation());
assertEquals(originalPart.getJunctions().size(), reloadedPart.getJunctions().size()); assertEquals(originalPart.getJunctions().size(), reloadedPart.getJunctions().size());
for (final Junction originalJunction : originalPart.getJunctions()) { for (final Junction originalJunction : originalPart.getJunctions()) {
System.out.printf(" - Junction: %s\n", originalJunction.getUuid()); System.out.printf(" - Junction: %s\n", originalJunction.getUuid());
final Junction reloadedJunction = reloadedPart.getJunctions().stream().filter(junction -> junction.getUuid().equals(originalJunction.getUuid())).findFirst().orElseThrow(); final Junction reloadedJunction = reloadedPart.getJunctions().stream().filter(junction -> junction.getUuid().equals(originalJunction.getUuid())).findFirst().orElseThrow();
assertEquals(originalJunction.getUuid(), reloadedJunction.getUuid()); assertEquals(originalJunction.getUuid(), reloadedJunction.getUuid());
assertEquals(originalJunction.getName(), reloadedJunction.getName()); assertEquals(originalJunction.getName(), reloadedJunction.getName());
assertEquals(originalJunction.getPosition(), reloadedJunction.getPosition()); assertEquals(originalJunction.getPosition(), reloadedJunction.getPosition());
assertEquals(originalJunction.getDestinations().size(), reloadedJunction.getDestinations().size()); assertEquals(originalJunction.getDestinations().size(), reloadedJunction.getDestinations().size());
for (final Junction originalDestination : originalJunction.getDestinations()) { for (final Junction originalDestination : originalJunction.getDestinations()) {
System.out.printf(" - Destination: %s\n", originalDestination.getUuid()); System.out.printf(" - Destination: %s\n", originalDestination.getUuid());
final Junction reloadedDestination = reloadedJunction.getDestinations().stream().filter(destination -> destination.getUuid().equals(originalDestination.getUuid())).findFirst().orElseThrow(); final Junction reloadedDestination = reloadedJunction.getDestinations().stream().filter(destination -> destination.getUuid().equals(originalDestination.getUuid())).findFirst().orElseThrow();
assertEquals(originalDestination.getUuid(), reloadedDestination.getUuid()); assertEquals(originalDestination.getUuid(), reloadedDestination.getUuid());
assertEquals(originalDestination.getOwner().getUuid(), reloadedDestination.getOwner().getUuid()); assertEquals(originalDestination.getOwner().getUuid(), reloadedDestination.getOwner().getUuid());
}
} }
} });
} });
} }
} }