UI connect wires
This commit is contained in:
parent
b00951b9bb
commit
66a536802b
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -91,7 +91,7 @@ public class PartLight extends PartOther {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void click() {
|
public void action() {
|
||||||
defect = false;
|
defect = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -65,7 +65,7 @@ public class PartSwitch1x1 extends PartOther {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void click() {
|
public void action() {
|
||||||
state = !state;
|
state = !state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -75,7 +75,7 @@ public class PartSwitch1x2 extends PartOther {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void click() {
|
public void action() {
|
||||||
state = !state;
|
state = !state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -91,7 +91,7 @@ public class PartSwitchCross extends PartOther {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void click() {
|
public void action() {
|
||||||
state = !state;
|
state = !state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user