code clean: evaluate, render, repaint

This commit is contained in:
Patrick Haßel 2024-05-17 09:25:14 +02:00
parent b832482606
commit 3591741ee5
10 changed files with 48 additions and 36 deletions

View File

@ -67,10 +67,10 @@ public class Circuit {
public void connect(final Junction a, final Junction b) { public void connect(final Junction a, final Junction b) {
a.getDestinations().add(b); a.getDestinations().add(b);
b.getDestinations().add(a); b.getDestinations().add(a);
evaluate(); evaluateAndRender();
} }
public void evaluate() { public void evaluateAndRender() {
parts.forEach(Part::reset); parts.forEach(Part::reset);
streamBatteries().forEach(PartBattery::startPropagation); streamBatteries().forEach(PartBattery::startPropagation);
parts.forEach(Part::render); parts.forEach(Part::render);
@ -100,7 +100,7 @@ public class Circuit {
} }
if (isFree(part.getPosition())) { if (isFree(part.getPosition())) {
parts.add(part); parts.add(part);
evaluate(); part.render();
} }
} }

View File

@ -1,6 +1,5 @@
package de.ph87.electro.circuit; package de.ph87.electro.circuit;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import javax.swing.*; import javax.swing.*;
@ -11,13 +10,12 @@ import static de.ph87.electro.CONFIG.*;
@Slf4j @Slf4j
public class CircuitPanel extends JPanel { public class CircuitPanel extends JPanel {
private final CircuitPanelMouseAdapter mouseAdapter = new CircuitPanelMouseAdapter(this);
@Getter
private final Circuit circuit = new Circuit(); private final Circuit circuit = new Circuit();
private final CircuitPanelMouseAdapter mouseAdapter = new CircuitPanelMouseAdapter(this, circuit);
public CircuitPanel() { public CircuitPanel() {
setDropTarget(new CircuitPanelDropTarget(this)); new CircuitPanelDropTarget(this, circuit);
} }
@Override @Override

View File

@ -1,5 +1,6 @@
package de.ph87.electro.circuit; package de.ph87.electro.circuit;
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.common.AbstractDropTarget; import de.ph87.electro.common.AbstractDropTarget;
@ -12,30 +13,34 @@ public class CircuitPanelDropTarget extends AbstractDropTarget {
private final CircuitPanel circuitPanel; private final CircuitPanel circuitPanel;
public CircuitPanelDropTarget(final CircuitPanel circuitPanel) { private final Circuit circuit;
public CircuitPanelDropTarget(final CircuitPanel circuitPanel, final Circuit circuit) {
super(circuitPanel); super(circuitPanel);
this.circuitPanel = circuitPanel; this.circuitPanel = circuitPanel;
this.circuit = circuit;
circuitPanel.setDropTarget(this);
} }
@Override @Override
protected boolean drop(final Point point, final String data) { protected boolean drop(final Point point, final String data) {
final Point raster = div(point, RASTER); final Point raster = div(point, RASTER);
if (data.equals(PartBattery.class.getSimpleName())) { if (data.equals(PartBattery.class.getSimpleName())) {
circuitPanel.getCircuit().partAdd(new PartBattery(raster)); addPart(new PartBattery(raster));
} else if (data.equals(PartJunctionCorner.class.getSimpleName())) { } else if (data.equals(PartJunctionCorner.class.getSimpleName())) {
circuitPanel.getCircuit().partAdd(new PartJunctionCorner(raster)); addPart(new PartJunctionCorner(raster));
} else if (data.equals(PartJunctionEdge.class.getSimpleName())) { } else if (data.equals(PartJunctionEdge.class.getSimpleName())) {
circuitPanel.getCircuit().partAdd(new PartJunctionEdge(raster)); addPart(new PartJunctionEdge(raster));
} else if (data.equals(PartJunctionMiddle.class.getSimpleName())) { } else if (data.equals(PartJunctionMiddle.class.getSimpleName())) {
circuitPanel.getCircuit().partAdd(new PartJunctionMiddle(raster)); addPart(new PartJunctionMiddle(raster));
} else if (data.equals(PartLight.class.getSimpleName())) { } else if (data.equals(PartLight.class.getSimpleName())) {
circuitPanel.getCircuit().partAdd(new PartLight(raster)); addPart(new PartLight(raster));
} else if (data.equals(PartSwitch1x1.class.getSimpleName())) { } else if (data.equals(PartSwitch1x1.class.getSimpleName())) {
circuitPanel.getCircuit().partAdd(new PartSwitch1x1(raster)); addPart(new PartSwitch1x1(raster));
} else if (data.equals(PartSwitch1x2.class.getSimpleName())) { } else if (data.equals(PartSwitch1x2.class.getSimpleName())) {
circuitPanel.getCircuit().partAdd(new PartSwitch1x2(raster)); addPart(new PartSwitch1x2(raster));
} else if (data.equals(PartSwitchCross.class.getSimpleName())) { } else if (data.equals(PartSwitchCross.class.getSimpleName())) {
circuitPanel.getCircuit().partAdd(new PartSwitchCross(raster)); addPart(new PartSwitchCross(raster));
} else { } else {
throw new RuntimeException(); throw new RuntimeException();
} }
@ -43,4 +48,9 @@ public class CircuitPanelDropTarget extends AbstractDropTarget {
return true; return true;
} }
public void addPart(final Part part) {
circuit.partAdd(part);
circuitPanel.repaint();
}
} }

View File

@ -19,6 +19,8 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
private final CircuitPanel circuitPanel; private final CircuitPanel circuitPanel;
private final Circuit circuit;
private Part partHover = null; private Part partHover = null;
private Junction junctionHover = null; private Junction junctionHover = null;
@ -31,8 +33,9 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
private Point dragPosition = null; private Point dragPosition = null;
CircuitPanelMouseAdapter(final CircuitPanel circuitPanel) { CircuitPanelMouseAdapter(final CircuitPanel circuitPanel, final Circuit circuit) {
this.circuitPanel = circuitPanel; this.circuitPanel = circuitPanel;
this.circuit = circuit;
circuitPanel.addMouseListener(this); circuitPanel.addMouseListener(this);
circuitPanel.addMouseMotionListener(this); circuitPanel.addMouseMotionListener(this);
} }
@ -40,26 +43,28 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
@Override @Override
public void mouseClicked(final MouseEvent e) { public void mouseClicked(final MouseEvent e) {
if (e.getButton() == BUTTON3) { if (e.getButton() == BUTTON3) {
final Optional<Wire> wireOptional = circuitPanel.getCircuit().findWireByPoint(e.getPoint()); final Optional<Wire> wireOptional = circuit.findWireByPoint(e.getPoint());
if (wireOptional.isPresent()) { if (wireOptional.isPresent()) {
final Wire wire = wireOptional.get(); final Wire wire = wireOptional.get();
wire.getA().getDestinations().remove(wire.getB()); wire.getA().getDestinations().remove(wire.getB());
wire.getB().getDestinations().remove(wire.getA()); wire.getB().getDestinations().remove(wire.getA());
circuitPanel.getCircuit().evaluate(); circuit.evaluateAndRender();
circuitPanel.repaint(); circuitPanel.repaint();
return; return;
} }
} }
final Point cell = div(e.getPoint(), RASTER); final Point cell = div(e.getPoint(), RASTER);
final Optional<Part> partOptional = circuitPanel.getCircuit().streamParts().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::action); partOptional.ifPresent(Part::action);
circuitPanel.getCircuit().evaluate(); circuit.evaluateAndRender();
circuitPanel.repaint();
break; break;
case BUTTON3: case BUTTON3:
partOptional.ifPresent(Part::clockwise); partOptional.ifPresent(Part::clockwise);
circuitPanel.repaint();
break; break;
} }
} }
@ -72,7 +77,7 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
@Override @Override
public void mousePressed(final MouseEvent event) { public void mousePressed(final MouseEvent event) {
circuitPanel.getCircuit().findPart(event.getPoint()).ifPresent(part -> startPartOrJunction(part, event.getPoint())); circuit.findPart(event.getPoint()).ifPresent(part -> startPartOrJunction(part, event.getPoint()));
} }
private void startPartOrJunction(final Part part, final Point point) { private void startPartOrJunction(final Part part, final Point point) {
@ -90,19 +95,18 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
findHover(e.getPoint()); findHover(e.getPoint());
if (partDrag != null || junctionDrag != null) { if (partDrag != null || junctionDrag != null) {
dragPosition = e.getPoint(); dragPosition = e.getPoint();
circuitPanel.repaint();
} }
circuitPanel.repaint();
} }
private void findHover(final Point point) { private void findHover(final Point point) {
partHover = circuitPanel.getCircuit().findPart(point).orElse(null); partHover = circuit.findPart(point).orElse(null);
junctionHover = partHover != null ? partHover.findJunction(point).orElse(null) : null; junctionHover = partHover != null ? partHover.findJunction(point).orElse(null) : null;
if (junctionHover == null) { if (junctionHover == null) {
wireHover = circuitPanel.getCircuit().findWireByPoint(point).orElse(null); wireHover = circuit.findWireByPoint(point).orElse(null);
} else { } else {
wireHover = null; wireHover = null;
} }
circuitPanel.repaint();
} }
@Override @Override
@ -115,11 +119,11 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
} }
if (partDrag != null) { if (partDrag != null) {
circuitPanel.getCircuit().partMove(partDrag, div(event.getPoint(), RASTER)); circuit.partMove(partDrag, div(event.getPoint(), RASTER));
} }
if (junctionDrag != null) { if (junctionDrag != null) {
circuitPanel.getCircuit().findJunctionByPoint(event.getPoint()).filter(destination -> destination != junctionDrag).ifPresent(destination -> circuitPanel.getCircuit().connect(junctionDrag, destination)); circuit.findJunctionByPoint(event.getPoint()).filter(destination -> destination != junctionDrag).ifPresent(destination -> circuit.connect(junctionDrag, destination));
} }
partDrag = null; partDrag = null;

View File

@ -28,7 +28,7 @@ public class BatteryLightTest {
@Test @Test
void test() { void test() {
circuit.evaluate(); circuit.evaluateAndRender();
assertEquals(VOLTAGE, battery.getPlus().getVoltage()); assertEquals(VOLTAGE, battery.getPlus().getVoltage());
assertEquals(VOLTAGE, light.getPin1().getVoltage()); assertEquals(VOLTAGE, light.getPin1().getVoltage());

View File

@ -45,7 +45,7 @@ public class BatterySwitcher1x1Test {
switcher.setState(state); switcher.setState(state);
circuit.evaluate(); circuit.evaluateAndRender();
assertEquals(state, switcher.isState()); assertEquals(state, switcher.isState());

View File

@ -50,7 +50,7 @@ public class BatterySwitcher1x2Test {
switcher.setState(state); switcher.setState(state);
circuit.evaluate(); circuit.evaluateAndRender();
assertEquals(state, switcher.isState()); assertEquals(state, switcher.isState());

View File

@ -62,7 +62,7 @@ public class BatterySwitcher2x2Test {
switcher0.setState(state0); switcher0.setState(state0);
switcher1.setState(state1); switcher1.setState(state1);
circuit.evaluate(); circuit.evaluateAndRender();
assertEquals(state0, switcher0.isState()); assertEquals(state0, switcher0.isState());
assertEquals(state1, switcher1.isState()); assertEquals(state1, switcher1.isState());

View File

@ -90,7 +90,7 @@ public class BatterySwitcherCrossTest {
switcherX.setState(stateX); switcherX.setState(stateX);
switcher1.setState(state1); switcher1.setState(state1);
circuit.evaluate(); circuit.evaluateAndRender();
assertEquals(state0, switcher0.isState()); assertEquals(state0, switcher0.isState());
assertEquals(stateX, switcherX.isState()); assertEquals(stateX, switcherX.isState());

View File

@ -36,8 +36,8 @@ class CircuitServiceTest {
final ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray()); final ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
final Circuit reloaded = CircuitService.read(input); final Circuit reloaded = CircuitService.read(input);
original.evaluate(); original.evaluateAndRender();
reloaded.evaluate(); reloaded.evaluateAndRender();
assertEquals(original.getPartCount(), reloaded.getPartCount()); assertEquals(original.getPartCount(), reloaded.getPartCount());
original.streamParts().forEach(originalPart -> { original.streamParts().forEach(originalPart -> {