Sidebar WIP

This commit is contained in:
Patrick Haßel 2024-05-15 16:18:06 +02:00
parent 510a3ec977
commit c61317f705
11 changed files with 133 additions and 3 deletions

View File

@ -1,14 +1,32 @@
package de.ph87.electro; package de.ph87.electro;
import de.ph87.electro.circuit.CircuitPanel; import de.ph87.electro.circuit.CircuitPanel;
import de.ph87.electro.sidebar.Sidebar;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
public class Window extends JFrame { public class Window extends JFrame {
private final CircuitPanel circuit = new CircuitPanel();
public Window() { 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(); positionOnRightMostScreen();
setDefaultCloseOperation(EXIT_ON_CLOSE); setDefaultCloseOperation(EXIT_ON_CLOSE);

View File

@ -38,7 +38,7 @@ public class Circuit {
for (int i = 0; i < rotate % 4; i++) { for (int i = 0; i < rotate % 4; i++) {
part.rotate(); 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) { 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); b.getDestinations().add(a);
} }
public void add(final Part part) {
parts.add(part);
evaluate();
}
public void evaluate() { public void evaluate() {
parts.forEach(Part::reset); parts.forEach(Part::reset);
streamBatteries().forEach(PartBattery::startPropagation); streamBatteries().forEach(PartBattery::startPropagation);

View File

@ -2,6 +2,7 @@ package de.ph87.electro.circuit;
import de.ph87.electro.circuit.part.Part; import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.demo.DemoAll; import de.ph87.electro.demo.DemoAll;
import lombok.Getter;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
@ -15,6 +16,7 @@ import static java.awt.event.MouseEvent.BUTTON3;
public class CircuitPanel extends JPanel { public class CircuitPanel extends JPanel {
@Getter
private Circuit circuit = new Circuit(); private Circuit circuit = new Circuit();
private Part dragPart = null; private Part dragPart = null;

View File

@ -26,7 +26,7 @@ public abstract class Part {
private final String uuid; private final String uuid;
@ToString.Include @ToString.Include
private String name; protected String name;
protected int x; protected int x;
@ -142,4 +142,6 @@ public abstract class Part {
}; };
} }
public abstract Part duplicate(final int x, final int y);
} }

View File

@ -89,6 +89,11 @@ public class PartBattery extends Part {
img(g, img, 0, 0); img(g, img, 0, 0);
} }
@Override
public PartBattery duplicate(final int x, final int y) {
return new PartBattery(name, x, y, voltage);
}
@Override @Override
public void click() { public void click() {
// nothing // nothing

View File

@ -89,6 +89,11 @@ public class PartLight extends PartOther {
line(g, diag, 1 - diag, 1 - diag, diag, Color.BLACK, SYMBOL_STROKE); 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 @Override
public void click() { public void click() {
defect = false; defect = false;

View File

@ -68,4 +68,9 @@ public class PartSwitch1x1 extends PartOther {
state = !state; state = !state;
} }
@Override
public PartSwitch1x1 duplicate(final int x, final int y) {
return new PartSwitch1x1(name, x, y, state);
}
} }

View File

@ -80,4 +80,9 @@ public class PartSwitch1x2 extends PartOther {
state = !state; state = !state;
} }
@Override
public PartSwitch1x2 duplicate(final int x, final int y) {
return new PartSwitch1x2(name, x, y, state);
}
} }

View File

@ -98,4 +98,9 @@ public class PartSwitchCross extends PartOther {
state = !state; state = !state;
} }
@Override
public PartSwitchCross duplicate(final int x, final int y) {
return new PartSwitchCross(name, x, y, state);
}
} }

View File

@ -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<Part> onAdd;
private final List<SidebarPart> parts = new ArrayList<>();
public Sidebar(final Consumer<Part> 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);
}
}
}

View File

@ -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<Part> add;
public SidebarPart(final Part part, final Consumer<Part> 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));
}
});
}
}