From c61317f705ae3c388a782d021857e20a43ad417c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Wed, 15 May 2024 16:18:06 +0200 Subject: [PATCH] Sidebar WIP --- src/main/java/de/ph87/electro/Window.java | 20 ++++++++- .../java/de/ph87/electro/circuit/Circuit.java | 7 ++- .../de/ph87/electro/circuit/CircuitPanel.java | 2 + .../de/ph87/electro/circuit/part/Part.java | 4 +- .../circuit/part/impl/PartBattery.java | 5 +++ .../electro/circuit/part/impl/PartLight.java | 5 +++ .../circuit/part/impl/PartSwitch1x1.java | 5 +++ .../circuit/part/impl/PartSwitch1x2.java | 5 +++ .../circuit/part/impl/PartSwitchCross.java | 5 +++ .../java/de/ph87/electro/sidebar/Sidebar.java | 43 +++++++++++++++++++ .../de/ph87/electro/sidebar/SidebarPart.java | 35 +++++++++++++++ 11 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 src/main/java/de/ph87/electro/sidebar/Sidebar.java create mode 100644 src/main/java/de/ph87/electro/sidebar/SidebarPart.java diff --git a/src/main/java/de/ph87/electro/Window.java b/src/main/java/de/ph87/electro/Window.java index ea57d78..239917b 100644 --- a/src/main/java/de/ph87/electro/Window.java +++ b/src/main/java/de/ph87/electro/Window.java @@ -1,14 +1,32 @@ package de.ph87.electro; import de.ph87.electro.circuit.CircuitPanel; +import de.ph87.electro.sidebar.Sidebar; import javax.swing.*; import java.awt.*; public class Window extends JFrame { + private final CircuitPanel circuit = new CircuitPanel(); + public Window() { - add(new CircuitPanel()); + GridBagConstraints c; + setLayout(new GridBagLayout()); + + c = new GridBagConstraints(); + c.gridx = 0; + c.weightx = 1; + c.weighty = 1; + c.fill = GridBagConstraints.BOTH; + add(new Sidebar(part -> circuit.getCircuit().add(part)), c); + + c = new GridBagConstraints(); + c.gridx = 1; + c.weightx = 4; + c.weighty = 1; + c.fill = GridBagConstraints.BOTH; + add(circuit, c); positionOnRightMostScreen(); setDefaultCloseOperation(EXIT_ON_CLOSE); diff --git a/src/main/java/de/ph87/electro/circuit/Circuit.java b/src/main/java/de/ph87/electro/circuit/Circuit.java index 618a7e1..a4f8466 100644 --- a/src/main/java/de/ph87/electro/circuit/Circuit.java +++ b/src/main/java/de/ph87/electro/circuit/Circuit.java @@ -38,7 +38,7 @@ public class Circuit { for (int i = 0; i < rotate % 4; i++) { part.rotate(); } - parts.add(part); + add(part); } public PartLight addLight(final String name, final int x, final int y, final int rotate, final double maxVoltage) { @@ -70,6 +70,11 @@ public class Circuit { b.getDestinations().add(a); } + public void add(final Part part) { + parts.add(part); + evaluate(); + } + public void evaluate() { parts.forEach(Part::reset); streamBatteries().forEach(PartBattery::startPropagation); diff --git a/src/main/java/de/ph87/electro/circuit/CircuitPanel.java b/src/main/java/de/ph87/electro/circuit/CircuitPanel.java index 2946994..0f7b4f3 100644 --- a/src/main/java/de/ph87/electro/circuit/CircuitPanel.java +++ b/src/main/java/de/ph87/electro/circuit/CircuitPanel.java @@ -2,6 +2,7 @@ package de.ph87.electro.circuit; import de.ph87.electro.circuit.part.Part; import de.ph87.electro.demo.DemoAll; +import lombok.Getter; import javax.swing.*; import java.awt.*; @@ -15,6 +16,7 @@ import static java.awt.event.MouseEvent.BUTTON3; public class CircuitPanel extends JPanel { + @Getter private Circuit circuit = new Circuit(); private Part dragPart = null; diff --git a/src/main/java/de/ph87/electro/circuit/part/Part.java b/src/main/java/de/ph87/electro/circuit/part/Part.java index af41e3c..b67d079 100644 --- a/src/main/java/de/ph87/electro/circuit/part/Part.java +++ b/src/main/java/de/ph87/electro/circuit/part/Part.java @@ -26,7 +26,7 @@ public abstract class Part { private final String uuid; @ToString.Include - private String name; + protected String name; protected int x; @@ -142,4 +142,6 @@ public abstract class Part { }; } + public abstract Part duplicate(final int x, final int y); + } diff --git a/src/main/java/de/ph87/electro/circuit/part/impl/PartBattery.java b/src/main/java/de/ph87/electro/circuit/part/impl/PartBattery.java index c1dd4cd..b8b46e2 100644 --- a/src/main/java/de/ph87/electro/circuit/part/impl/PartBattery.java +++ b/src/main/java/de/ph87/electro/circuit/part/impl/PartBattery.java @@ -89,6 +89,11 @@ public class PartBattery extends Part { img(g, img, 0, 0); } + @Override + public PartBattery duplicate(final int x, final int y) { + return new PartBattery(name, x, y, voltage); + } + @Override public void click() { // nothing diff --git a/src/main/java/de/ph87/electro/circuit/part/impl/PartLight.java b/src/main/java/de/ph87/electro/circuit/part/impl/PartLight.java index 7415701..49de107 100644 --- a/src/main/java/de/ph87/electro/circuit/part/impl/PartLight.java +++ b/src/main/java/de/ph87/electro/circuit/part/impl/PartLight.java @@ -89,6 +89,11 @@ public class PartLight extends PartOther { line(g, diag, 1 - diag, 1 - diag, diag, Color.BLACK, SYMBOL_STROKE); } + @Override + public PartLight duplicate(final int x, final int y) { + return new PartLight(name, x, y, maxVoltage); + } + @Override public void click() { defect = false; diff --git a/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x1.java b/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x1.java index b3bf0d5..914873f 100644 --- a/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x1.java +++ b/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x1.java @@ -68,4 +68,9 @@ public class PartSwitch1x1 extends PartOther { state = !state; } + @Override + public PartSwitch1x1 duplicate(final int x, final int y) { + return new PartSwitch1x1(name, x, y, state); + } + } diff --git a/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x2.java b/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x2.java index cfe328e..af2ae4d 100644 --- a/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x2.java +++ b/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitch1x2.java @@ -80,4 +80,9 @@ public class PartSwitch1x2 extends PartOther { state = !state; } + @Override + public PartSwitch1x2 duplicate(final int x, final int y) { + return new PartSwitch1x2(name, x, y, state); + } + } diff --git a/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitchCross.java b/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitchCross.java index f6e1c8f..9929f95 100644 --- a/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitchCross.java +++ b/src/main/java/de/ph87/electro/circuit/part/impl/PartSwitchCross.java @@ -98,4 +98,9 @@ public class PartSwitchCross extends PartOther { state = !state; } + @Override + public PartSwitchCross duplicate(final int x, final int y) { + return new PartSwitchCross(name, x, y, state); + } + } diff --git a/src/main/java/de/ph87/electro/sidebar/Sidebar.java b/src/main/java/de/ph87/electro/sidebar/Sidebar.java new file mode 100644 index 0000000..3d3fcad --- /dev/null +++ b/src/main/java/de/ph87/electro/sidebar/Sidebar.java @@ -0,0 +1,43 @@ +package de.ph87.electro.sidebar; + +import de.ph87.electro.circuit.part.Part; +import de.ph87.electro.circuit.part.impl.*; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public class Sidebar extends JPanel { + + private final Consumer onAdd; + + private final List parts = new ArrayList<>(); + + public Sidebar(final Consumer onAdd) { + this.onAdd = onAdd; + setLayout(new GridBagLayout()); + add(new PartBattery("Batterie", 0, 0, 3.0)); + add(new PartLight("Licht", 1, 0, 3.0)); + add(new PartSwitch1x1("Ausschalter", 0, 1, false)); + add(new PartSwitch1x2("Wechselschalter", 1, 1, false)); + add(new PartSwitchCross("Kreuzschalter", 0, 2, false)); + } + + private void add(final Part part) { + final SidebarPart entry = new SidebarPart(part, onAdd); + parts.add(entry); + add(entry); + } + + @Override + public void paint(final Graphics g) { + g.setColor(Color.gray); + g.fillRect(0, 0, getWidth(), getHeight()); + for (final SidebarPart part : parts) { + part.getPart().paint((Graphics2D) g); + } + } + +} diff --git a/src/main/java/de/ph87/electro/sidebar/SidebarPart.java b/src/main/java/de/ph87/electro/sidebar/SidebarPart.java new file mode 100644 index 0000000..d2765d4 --- /dev/null +++ b/src/main/java/de/ph87/electro/sidebar/SidebarPart.java @@ -0,0 +1,35 @@ +package de.ph87.electro.sidebar; + +import de.ph87.electro.circuit.part.Part; +import lombok.Getter; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.function.Consumer; + +import static de.ph87.electro.CONFIG.RASTER; + +@Getter +public class SidebarPart extends JPanel { + + private final Part part; + + private final Consumer add; + + public SidebarPart(final Part part, final Consumer add) { + this.part = part; + this.add = add; + setPreferredSize(new Dimension(RASTER, RASTER)); + addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(final MouseEvent e) { + add.accept(part.duplicate(e.getPoint().x / RASTER, e.getPoint().y / RASTER)); + } + + }); + } + +}