more sidebar buttons

This commit is contained in:
Patrick Haßel 2024-05-23 10:50:15 +02:00
parent 6d34e37572
commit ad7562e3d2
5 changed files with 76 additions and 55 deletions

View File

@ -16,8 +16,9 @@ public class Window extends JFrame {
setPreferredSize(new Dimension(1200, 900));
setExtendedState(MAXIMIZED_BOTH);
final Sidebar sidebar = new Sidebar();
final CircuitPanel circuitPanel = new CircuitPanel();
final Sidebar sidebar = new Sidebar(circuitPanel::newCircuit, circuitPanel::save);
final JSplitPane splitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sidebar, circuitPanel);
sidebar.setRepaintCallback(circuitPanel::repaint);
sidebar.setPreferredSize(new Dimension(calcWidth(3), 0));
@ -26,7 +27,6 @@ public class Window extends JFrame {
circuitPanel.setPreferredSize(new Dimension(calcWidth(8), 0));
circuitPanel.setMinimumSize(new Dimension(calcWidth(2), 0));
final JSplitPane splitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sidebar, circuitPanel);
splitter.setDividerLocation(calcWidth(3));
add(splitter);

View File

@ -4,6 +4,7 @@ import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.junction.Junction;
import de.ph87.electro.circuit.part.parts.Battery;
import de.ph87.electro.circuit.part.parts.Light;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import javax.swing.*;
@ -16,12 +17,13 @@ import static de.ph87.electro.circuit.part.Position.RST;
@Slf4j
public class CircuitPanel extends JPanel {
private final Circuit circuit = new Circuit();
@Getter
private Circuit circuit = new Circuit();
private final CircuitPanelMouseAdapter mouseAdapter = new CircuitPanelMouseAdapter(this, circuit);
private final CircuitPanelMouseAdapter mouseAdapter = new CircuitPanelMouseAdapter(this);
public CircuitPanel() {
new CircuitPanelDropTarget(this, circuit);
new CircuitPanelDropTarget(this);
final Battery b0 = circuit.addPart(new Battery(circuit, RST(0, 0)));
final Light l = circuit.addPart(new Light(circuit, RST(2, 0)));
final Battery b1 = circuit.addPart(new Battery(circuit, RST(4, 0)));
@ -100,4 +102,13 @@ public class CircuitPanel extends JPanel {
}
}
public void newCircuit() {
circuit = new Circuit();
repaint();
}
public void save() {
circuit.save();
}
}

View File

@ -10,12 +10,9 @@ public class CircuitPanelDropTarget extends AbstractDropTarget {
private final CircuitPanel circuitPanel;
private final Circuit circuit;
public CircuitPanelDropTarget(final CircuitPanel circuitPanel, final Circuit circuit) {
public CircuitPanelDropTarget(final CircuitPanel circuitPanel) {
super(circuitPanel);
this.circuitPanel = circuitPanel;
this.circuit = circuit;
circuitPanel.setDropTarget(this);
}
@ -23,23 +20,23 @@ public class CircuitPanelDropTarget extends AbstractDropTarget {
protected boolean drop(final Point point, final String data) {
final Position position = new Position(point);
if (data.equals(Battery.class.getSimpleName())) {
circuit.addPart(new Battery(circuit, position));
circuitPanel.getCircuit().addPart(new Battery(circuitPanel.getCircuit(), position));
} else if (data.equals(ConnectorCorner.class.getSimpleName())) {
circuit.addPart(new ConnectorCorner(circuit, position));
circuitPanel.getCircuit().addPart(new ConnectorCorner(circuitPanel.getCircuit(), position));
} else if (data.equals(ConnectorEdge.class.getSimpleName())) {
circuit.addPart(new ConnectorEdge(circuit, position));
circuitPanel.getCircuit().addPart(new ConnectorEdge(circuitPanel.getCircuit(), position));
} else if (data.equals(ConnectorMiddle.class.getSimpleName())) {
circuit.addPart(new ConnectorMiddle(circuit, position));
circuitPanel.getCircuit().addPart(new ConnectorMiddle(circuitPanel.getCircuit(), position));
} else if (data.equals(Light.class.getSimpleName())) {
circuit.addPart(new Light(circuit, position));
circuitPanel.getCircuit().addPart(new Light(circuitPanel.getCircuit(), position));
} else if (data.equals(Switch1x1.class.getSimpleName())) {
circuit.addPart(new Switch1x1(circuit, position));
circuitPanel.getCircuit().addPart(new Switch1x1(circuitPanel.getCircuit(), position));
} else if (data.equals(Switch1x2.class.getSimpleName())) {
circuit.addPart(new Switch1x2(circuit, position));
circuitPanel.getCircuit().addPart(new Switch1x2(circuitPanel.getCircuit(), position));
} else if (data.equals(SwitchCross.class.getSimpleName())) {
circuit.addPart(new SwitchCross(circuit, position));
circuitPanel.getCircuit().addPart(new SwitchCross(circuitPanel.getCircuit(), position));
} else if (data.equals(Poti.class.getSimpleName())) {
circuit.addPart(new Poti(circuit, position));
circuitPanel.getCircuit().addPart(new Poti(circuitPanel.getCircuit(), position));
} else {
throw new RuntimeException();
}

View File

@ -18,8 +18,6 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
private final CircuitPanel circuitPanel;
private final Circuit circuit;
private Part partHover = null;
private Junction junctionHover = null;
@ -32,9 +30,8 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
private Position dragPosition = null;
CircuitPanelMouseAdapter(final CircuitPanel circuitPanel, final Circuit circuit) {
CircuitPanelMouseAdapter(final CircuitPanel circuitPanel) {
this.circuitPanel = circuitPanel;
this.circuit = circuit;
circuitPanel.addMouseListener(this);
circuitPanel.addMouseMotionListener(this);
}
@ -44,15 +41,15 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
final Position position = new Position(event);
if (event.getButton() == BUTTON3) {
final Optional<Wire> wireOptional = circuit.findWireByPosition(position);
final Optional<Wire> wireOptional = circuitPanel.getCircuit().findWireByPosition(position);
if (wireOptional.isPresent()) {
circuit.disconnect(wireOptional.get());
circuitPanel.getCircuit().disconnect(wireOptional.get());
circuitPanel.repaint();
return;
}
}
circuit.findPartByPosition(position).ifPresent(part -> {
circuitPanel.getCircuit().findPartByPosition(position).ifPresent(part -> {
switch (event.getButton()) {
case BUTTON1:
part.action();
@ -75,7 +72,7 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
@Override
public void mousePressed(final MouseEvent event) {
final Position position = new Position(event);
circuit.findPartByPosition(position).ifPresent(part -> startPartOrJunction(part, position));
circuitPanel.getCircuit().findPartByPosition(position).ifPresent(part -> startPartOrJunction(part, position));
}
private void startPartOrJunction(final Part part, final Position position) {
@ -99,14 +96,14 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
}
private void findHover(final Position position) {
partHover = circuit.findPartByPosition(position).orElse(null);
partHover = circuitPanel.getCircuit().findPartByPosition(position).orElse(null);
junctionHover = partHover != null ? partHover.findJunctionByPosition(position).orElse(null) : null;
if (junctionHover != null) {
partHover = null;
wireHover = null;
return;
}
wireHover = circuit.findWireByPosition(position).orElse(null);
wireHover = circuitPanel.getCircuit().findWireByPosition(position).orElse(null);
if (wireHover != null) {
partHover = null;
}
@ -116,11 +113,11 @@ class CircuitPanelMouseAdapter extends MouseAdapter {
public void mouseReleased(final MouseEvent event) {
final Position position = new Position(event);
if (partDrag != null) {
circuit.movePart(partDrag, position);
circuitPanel.getCircuit().movePart(partDrag, position);
}
if (junctionDrag != null) {
circuit.findJunctionByAbsolute(position).filter(destination -> destination != junctionDrag).ifPresent(destination -> circuit.connect(junctionDrag, destination));
circuitPanel.getCircuit().findJunctionByAbsolute(position).filter(destination -> destination != junctionDrag).ifPresent(destination -> circuitPanel.getCircuit().connect(junctionDrag, destination));
}
partDrag = null;

View File

@ -17,43 +17,59 @@ public class Sidebar extends JPanel {
@Setter
private Runnable repaintCallback = null;
public Sidebar() {
addToggle("Kabel Details", () -> SHOW_WIRE_DETAILS, v -> SHOW_WIRE_DETAILS = v);
addToggle("Kontakt Namen", () -> SHOW_JUNCTION_NAMES, v -> SHOW_JUNCTION_NAMES = v);
addToggle("Kontakt Spannungen", () -> SHOW_JUNCTION_VOLTAGES, v -> SHOW_JUNCTION_VOLTAGES = v);
add(new Battery(null, Position.ZERO));
add(new ConnectorCorner(null, Position.ZERO));
add(new ConnectorEdge(null, Position.ZERO));
add(new ConnectorMiddle(null, Position.ZERO));
add(new Light(null, Position.ZERO));
add(new Switch1x1(null, Position.ZERO));
add(new Switch1x2(null, Position.ZERO));
add(new SwitchCross(null, Position.ZERO));
add(new Poti(null, Position.ZERO));
public Sidebar(final Runnable newCircuit, final Runnable doSave) {
setPreferredSize(new Dimension(0, 200));
addButton("Neu", null, newCircuit, new Color(128, 202, 255));
addButton("Öffnen", null, doSave, new Color(128, 202, 255));
addButton("Speichern", null, doSave, new Color(128, 202, 255));
addToggle("Details", () -> SHOW_WIRE_DETAILS, v -> SHOW_WIRE_DETAILS = v);
addToggle("Namen", () -> SHOW_JUNCTION_NAMES, v -> SHOW_JUNCTION_NAMES = v);
addToggle("Spannungen", () -> SHOW_JUNCTION_VOLTAGES, v -> SHOW_JUNCTION_VOLTAGES = v);
addPart(new Battery(null, Position.ZERO));
addPart(new ConnectorCorner(null, Position.ZERO));
addPart(new ConnectorEdge(null, Position.ZERO));
addPart(new ConnectorMiddle(null, Position.ZERO));
addPart(new Light(null, Position.ZERO));
addPart(new Switch1x1(null, Position.ZERO));
addPart(new Switch1x2(null, Position.ZERO));
addPart(new SwitchCross(null, Position.ZERO));
addPart(new Poti(null, Position.ZERO));
}
private void addToggle(final String label, final Supplier<Boolean> get, final Consumer<Boolean> set) {
final Button button = new Button(label);
button.setPreferredSize(new Dimension(RASTER, RASTER));
final Runnable toggle = () -> {
@SuppressWarnings("UnusedReturnValue")
private Button addToggle(final String label, final Supplier<Boolean> get, final Consumer<Boolean> set) {
final Consumer<Button> refresh = button -> {
if (get.get()) {
button.setBackground(new Color(128, 255, 128));
} else {
button.setBackground(new Color(255, 128, 128));
}
};
toggle.run();
button.addActionListener(e -> {
final Runnable click = () -> {
set.accept(!get.get());
toggle.run();
triggerRepaint();
});
};
return addButton(label, refresh, click, null);
}
private Button addButton(final String label, final Consumer<Button> refresh, final Runnable click, final Color background) {
final Button button = new Button(label);
button.setBackground(background);
button.setPreferredSize(new Dimension(RASTER / 2, RASTER / 2));
if (refresh != null) {
refresh.accept(button);
}
button.addActionListener(e -> {
click.run();
if (refresh != null) {
refresh.accept(button);
}
});
add(button);
return button;
}
private void triggerRepaint() {
@ -62,7 +78,7 @@ public class Sidebar extends JPanel {
}
}
private void add(final Part part) {
private void addPart(final Part part) {
final SidebarPart entry = new SidebarPart(part);
add(entry);
}