prohibit double-placement
This commit is contained in:
parent
b19547922c
commit
3da368bfe0
@ -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;
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user