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.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;

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.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<Junction> 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<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.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<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()) {
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;

View File

@ -15,7 +15,7 @@ public class CircuitDto {
private List<PartDto> parts;
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;
@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;

View File

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

View File

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

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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<Part> onAdd;
@ -17,11 +14,11 @@ public class Sidebar extends JPanel {
public Sidebar(final Consumer<Part> 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) {

View File

@ -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());
}
}
}
}
});
});
}
}