UI connect wires

This commit is contained in:
Patrick Haßel 2024-05-16 14:38:02 +02:00
parent b00951b9bb
commit 66a536802b
14 changed files with 79 additions and 68 deletions

View File

@ -8,8 +8,6 @@ import java.awt.*;
public class Window extends JFrame { public class Window extends JFrame {
private final CircuitPanel circuit = new CircuitPanel();
public Window() { public Window() {
GridBagConstraints c; GridBagConstraints c;
setLayout(new GridBagLayout()); setLayout(new GridBagLayout());
@ -19,14 +17,14 @@ 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().partAdd(part)), c); add(new Sidebar(), c);
c = new GridBagConstraints(); c = new GridBagConstraints();
c.gridx = 1; c.gridx = 1;
c.weightx = 4; c.weightx = 4;
c.weighty = 1; c.weighty = 1;
c.fill = GridBagConstraints.BOTH; c.fill = GridBagConstraints.BOTH;
add(circuit, c); add(new CircuitPanel(), c);
positionOnRightMostScreen(); positionOnRightMostScreen();
setDefaultCloseOperation(EXIT_ON_CLOSE); setDefaultCloseOperation(EXIT_ON_CLOSE);

View File

@ -63,15 +63,12 @@ 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();
} }
public void evaluate() { public void evaluate() {
parts.forEach(Part::reset); parts.forEach(Part::reset);
streamBatteries().forEach(PartBattery::startPropagation); streamBatteries().forEach(PartBattery::startPropagation);
render();
}
public void render() {
parts.forEach(Part::render); parts.forEach(Part::render);
} }

View File

@ -1,27 +1,29 @@
package de.ph87.electro.circuit; package de.ph87.electro.circuit;
import de.ph87.electro.circuit.part.Junction;
import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.Part;
import lombok.extern.slf4j.Slf4j;
import java.awt.*; import java.awt.*;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.Optional; import java.util.Optional;
import static de.ph87.electro.CONFIG.HALF; import static de.ph87.electro.CONFIG.*;
import static de.ph87.electro.CONFIG.RASTER;
import static de.ph87.electro.common.MathHelpers.div; import static de.ph87.electro.common.MathHelpers.div;
import static java.awt.event.MouseEvent.BUTTON1; import static java.awt.event.MouseEvent.BUTTON1;
import static java.awt.event.MouseEvent.BUTTON3; import static java.awt.event.MouseEvent.BUTTON3;
@Slf4j
class CircuitPanelMouseAdapter extends MouseAdapter { class CircuitPanelMouseAdapter extends MouseAdapter {
private final CircuitPanel circuitPanel; private final CircuitPanel circuitPanel;
private Part dragPart = null; private Part part = null;
private Point dragPoint = null; private Junction junction = null;
private Point dragOffset = null; private Point dragPosition = null;
CircuitPanelMouseAdapter(final CircuitPanel circuitPanel) { CircuitPanelMouseAdapter(final CircuitPanel circuitPanel) {
this.circuitPanel = circuitPanel; this.circuitPanel = circuitPanel;
@ -35,52 +37,63 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
final Optional<Part> partOptional = circuitPanel.getCircuit().streamParts().filter(p -> p.getPosition().equals(cell)).findFirst(); final Optional<Part> partOptional = circuitPanel.getCircuit().streamParts().filter(p -> p.getPosition().equals(cell)).findFirst();
switch (e.getButton()) { switch (e.getButton()) {
case BUTTON1: case BUTTON1:
partOptional.ifPresent(part -> { partOptional.ifPresent(Part::action);
part.click(); circuitPanel.getCircuit().evaluate();
circuitPanel.getCircuit().evaluate();
circuitPanel.repaint();
});
break; break;
case BUTTON3: case BUTTON3:
partOptional.ifPresent(part -> { partOptional.ifPresent(Part::clockwise);
part.clockwise();
circuitPanel.getCircuit().render();
circuitPanel.repaint();
});
break; break;
} }
} }
@Override @Override
public void mousePressed(final MouseEvent e) { public void mousePressed(final MouseEvent event) {
final Point cell = div(e.getPoint(), RASTER); findPart(event.getPoint()).ifPresent(part -> startPartOrJunction(part, event.getPoint()));
dragOffset = new Point(HALF, HALF); }
dragPart = circuitPanel.getCircuit().streamParts().filter(p -> p.getPosition().equals(cell)).findFirst().orElse(null);
private void startPartOrJunction(final Part part, final Point point) {
part.findJunction(point).ifPresentOrElse(junction -> this.junction = junction, () -> this.part = part);
}
private Optional<Part> findPart(final Point point) {
final Point cell = div(point, RASTER);
return circuitPanel.getCircuit().streamParts().filter(p -> p.getPosition().equals(cell)).findFirst();
} }
@Override @Override
public void mouseDragged(final MouseEvent e) { public void mouseDragged(final MouseEvent e) {
if (dragPart != null) { if (part != null || junction != null) {
dragPoint = e.getPoint(); dragPosition = e.getPoint();
circuitPanel.repaint(); circuitPanel.repaint();
} }
} }
@Override @Override
public void mouseReleased(final MouseEvent e) { public void mouseReleased(final MouseEvent event) {
if (dragPart != null) { if (part != null) {
circuitPanel.getCircuit().partMove(dragPart, div(e.getPoint(), RASTER)); circuitPanel.getCircuit().partMove(part, div(event.getPoint(), RASTER));
dragPart = null;
dragPoint = null; part = null;
dragOffset = null; circuitPanel.repaint();
}
if (junction != null) {
findPart(event.getPoint())
.flatMap(part -> part.findJunction(event.getPoint()).filter(destination -> destination != junction))
.ifPresent(destination -> circuitPanel.getCircuit().connect(junction, destination));
junction = null;
circuitPanel.repaint(); circuitPanel.repaint();
} }
} }
public void drawDrag(final Graphics2D g) { public void drawDrag(final Graphics2D g) {
if (dragPart != null && dragPoint != null) { if (part != null) {
g.setColor(new Color(192, 192, 192, 128)); g.setColor(new Color(192, 192, 192, 128));
g.fillRect(dragPoint.x - dragOffset.x, dragPoint.y - dragOffset.y, RASTER, RASTER); g.fillRect(dragPosition.x - HALF, dragPosition.y - HALF, RASTER, RASTER);
}
if (junction != null) {
junction.getOwner().line(g, junction.getAbsolute(), dragPosition, junction.getColor(), WIRE_STROKE);
} }
} }

View File

@ -13,6 +13,7 @@ import java.util.Set;
import java.util.UUID; import java.util.UUID;
import static de.ph87.electro.CONFIG.*; import static de.ph87.electro.CONFIG.*;
import static de.ph87.electro.common.MathHelpers.distance;
@Getter @Getter
@ToString(onlyExplicitlyIncluded = true) @ToString(onlyExplicitlyIncluded = true)
@ -107,4 +108,8 @@ public class Junction {
return owner.getOrientation().rotate(position); return owner.getOrientation().rotate(position);
} }
public boolean intersects(final Point absolute) {
return distance(getAbsolute(), absolute) <= JUNCTION_RADIUS;
}
} }

View File

@ -11,6 +11,7 @@ import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import static de.ph87.electro.CONFIG.*; import static de.ph87.electro.CONFIG.*;
@ -85,12 +86,17 @@ public abstract class Part {
public void clockwise() { public void clockwise() {
orientation = orientation.clockwise(); orientation = orientation.clockwise();
render();
} }
public void line(final Graphics2D g, final Junction junction0, final Junction junction1, final Color color, final BasicStroke stroke) { public void line(final Graphics2D g, final Junction junction0, final Junction junction1, final Color color, final BasicStroke stroke) {
line(g, junction0.getPosition().x, junction0.getPosition().y, junction1.getPosition().x, junction1.getPosition().y, color, stroke); line(g, junction0.getPosition().x, junction0.getPosition().y, junction1.getPosition().x, junction1.getPosition().y, color, stroke);
} }
public void line(final Graphics2D g, final Point p0, final Point p1, final Color color, final BasicStroke stroke) {
line(g, p0.x, p0.y, p1.x, p1.y, color, stroke);
}
public void line(final Graphics2D g, final Junction junction0, final double x1, final double y1, final Color color, final BasicStroke stroke) { public void line(final Graphics2D g, final Junction junction0, final double x1, final double y1, final Color color, final BasicStroke stroke) {
line(g, junction0.getPosition().x, junction0.getPosition().y, x1, y1, color, stroke); line(g, junction0.getPosition().x, junction0.getPosition().y, x1, y1, color, stroke);
} }
@ -147,7 +153,11 @@ public abstract class Part {
); );
} }
public abstract void click(); public Optional<Junction> findJunction(final Point absolute) {
return junctions.stream().filter(junction -> junction.intersects(absolute)).findFirst();
}
public abstract void action();
public abstract void propagate(final Junction source) throws ShortCircuit; public abstract void propagate(final Junction source) throws ShortCircuit;

View File

@ -54,11 +54,6 @@ public class PartBattery extends Part {
voltage = dto.getVoltage(); voltage = dto.getVoltage();
} }
@Override
public void clockwise() {
super.clockwise();
}
public void startPropagation() { public void startPropagation() {
try { try {
shortCircuit = null; shortCircuit = null;
@ -83,7 +78,7 @@ public class PartBattery extends Part {
} }
@Override @Override
public void click() { public void action() {
// nothing // nothing
} }

View File

@ -91,7 +91,7 @@ public class PartLight extends PartOther {
} }
@Override @Override
public void click() { public void action() {
defect = false; defect = false;
} }

View File

@ -65,7 +65,7 @@ public class PartSwitch1x1 extends PartOther {
} }
@Override @Override
public void click() { public void action() {
state = !state; state = !state;
} }

View File

@ -75,7 +75,7 @@ public class PartSwitch1x2 extends PartOther {
} }
@Override @Override
public void click() { public void action() {
state = !state; state = !state;
} }

View File

@ -91,7 +91,7 @@ public class PartSwitchCross extends PartOther {
} }
@Override @Override
public void click() { public void action() {
state = !state; state = !state;
} }

View File

@ -2,10 +2,17 @@ package de.ph87.electro.common;
import java.awt.*; import java.awt.*;
import static java.lang.Math.pow;
import static java.lang.Math.sqrt;
public class MathHelpers { public class MathHelpers {
public static Point div(final Point p, final int div) { public static Point div(final Point p, final int div) {
return new Point(p.x / div, p.y / div); return new Point(p.x / div, p.y / div);
} }
public static double distance(final Point a, final Point b) {
return sqrt(pow(b.x - a.x, 2) + pow(b.y - a.y, 2));
}
} }

View File

@ -9,8 +9,6 @@ import static de.ph87.electro.CONFIG.VOLTAGE;
public class DemoAll { public class DemoAll {
public static Circuit complexTrippleAndSimple() { public static Circuit complexTrippleAndSimple() {
final double voltage = 3.0;
final Circuit circuit = new Circuit(); final Circuit circuit = new Circuit();
final PartBattery battery = circuit.addBattery("Batterie", 0, 0, Orientation.R2, VOLTAGE); final PartBattery battery = circuit.addBattery("Batterie", 0, 0, Orientation.R2, VOLTAGE);
@ -30,18 +28,15 @@ public class DemoAll {
circuit.connect(switcherX.getOutput1(), switcher1.getOutput0()); circuit.connect(switcherX.getOutput1(), switcher1.getOutput0());
circuit.connect(switcher1.getCommon(), light.getPin1()); circuit.connect(switcher1.getCommon(), light.getPin1());
circuit.evaluate();
return circuit; return circuit;
} }
public static Circuit simpleAlternative() { public static Circuit simpleAlternative() {
final double voltage = 3.0;
final Circuit circuit = new Circuit(); final Circuit circuit = new Circuit();
final PartBattery battery = circuit.addBattery("Batterie", 2, 0, Orientation.R1, voltage); final PartBattery battery = circuit.addBattery("Batterie", 2, 0, Orientation.R1, VOLTAGE);
final PartLight light0 = circuit.addLight("Licht 0", 4, 2, Orientation.R1, voltage); final PartLight light0 = circuit.addLight("Licht 0", 4, 2, Orientation.R1, VOLTAGE);
final PartLight light1 = circuit.addLight("Licht 1", 0, 2, Orientation.R1, voltage); final PartLight light1 = circuit.addLight("Licht 1", 0, 2, Orientation.R1, VOLTAGE);
final PartSwitch1x2 switcher0 = circuit.addSwitch1x2("Wechselschalter 0", 2, 2, Orientation.R1, false); final PartSwitch1x2 switcher0 = circuit.addSwitch1x2("Wechselschalter 0", 2, 2, Orientation.R1, false);
circuit.connect(battery.getMinus(), light0.getPin0()); circuit.connect(battery.getMinus(), light0.getPin0());
@ -51,7 +46,6 @@ public class DemoAll {
circuit.connect(switcher0.getOutput0(), light0.getPin1()); circuit.connect(switcher0.getOutput0(), light0.getPin1());
circuit.connect(switcher0.getOutput1(), light1.getPin1()); circuit.connect(switcher0.getOutput1(), light1.getPin1());
circuit.evaluate();
return circuit; return circuit;
} }

View File

@ -5,14 +5,10 @@ import de.ph87.electro.circuit.part.impl.*;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.util.function.Consumer;
public class Sidebar extends JPanel { public class Sidebar extends JPanel {
private final Consumer<Part> onAdd; public Sidebar() {
public Sidebar(final Consumer<Part> onAdd) {
this.onAdd = onAdd;
setLayout(new FlowLayout()); setLayout(new FlowLayout());
add(new PartBattery(new Point(0, 0))); add(new PartBattery(new Point(0, 0)));
add(new PartLight(new Point(0, 0))); add(new PartLight(new Point(0, 0)));
@ -22,7 +18,7 @@ public class Sidebar extends JPanel {
} }
private void add(final Part part) { private void add(final Part part) {
final SidebarPart entry = new SidebarPart(part, onAdd); final SidebarPart entry = new SidebarPart(part);
add(entry); add(entry);
} }

View File

@ -9,7 +9,6 @@ import java.awt.*;
import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.StringSelection;
import java.awt.dnd.DnDConstants; import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragSource; import java.awt.dnd.DragSource;
import java.util.function.Consumer;
import static de.ph87.electro.CONFIG.RASTER; import static de.ph87.electro.CONFIG.RASTER;
@ -19,11 +18,8 @@ public class SidebarPart extends JPanel {
private final Part part; private final Part part;
private final Consumer<Part> add; public SidebarPart(final Part part) {
public SidebarPart(final Part part, final Consumer<Part> add) {
this.part = part; this.part = part;
this.add = add;
setTransferHandler(new TransferHandler("text")); setTransferHandler(new TransferHandler("text"));
setPreferredSize(new Dimension(RASTER, RASTER)); setPreferredSize(new Dimension(RASTER, RASTER));
createDragSource(part); createDragSource(part);