KinderElektro/src/main/java/de/ph87/electro/circuit/CircuitPanel.java

90 lines
2.4 KiB
Java

package de.ph87.electro.circuit;
import de.ph87.electro.circuit.part.parts.PartBattery;
import de.ph87.electro.circuit.part.parts.PartLight;
import lombok.extern.slf4j.Slf4j;
import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import static de.ph87.electro.CONFIG.*;
import static de.ph87.electro.circuit.CircuitIOService.write;
import static de.ph87.electro.circuit.part.Position.RST;
@Slf4j
public class CircuitPanel extends JPanel {
private final Circuit circuit = new Circuit();
private final CircuitPanelMouseAdapter mouseAdapter = new CircuitPanelMouseAdapter(this, circuit);
public CircuitPanel() {
new CircuitPanelDropTarget(this, circuit);
final PartBattery battery = circuit.addPart(new PartBattery(RST(0, 0)));
final PartLight light = circuit.addPart(new PartLight(RST(0, 1)));
circuit.connect(battery.getMinus(), light.getA());
circuit.connect(light.getB(), battery.getPlus());
circuit.evaluate();
}
@Override
public void paint(final Graphics _g) {
final Graphics2D g = (Graphics2D) _g;
final int w = getWidth();
final int h = getHeight();
drawBack(g, w, h);
drawParts(g);
drawRaster(g, w, h);
drawWires(g);
mouseAdapter.drawHover(g);
mouseAdapter.drawDrag(g);
}
private void drawBack(final Graphics2D g, final int w, final int h) {
g.setColor(Color.white);
g.fillRect(0, 0, w, h);
}
private void drawParts(final Graphics2D g) {
circuit.streamParts().forEach(part -> part.paint(g));
}
private void drawRaster(final Graphics2D g, final int w, final int h) {
g.setStroke(RASTER_STROKE);
g.setColor(RASTER_COLOR);
for (int x = 0; x < w; x += RASTER) {
g.drawLine(x, 0, x, h);
}
for (int y = 0; y < h; y += RASTER) {
g.drawLine(0, y, w, y);
}
}
private void drawWires(final Graphics2D g) {
circuit.streamWires().forEach(wire -> wire.draw(g));
}
public void evaluate() {
circuit.evaluate();
save();
}
public void save() {
// TODO make async
try {
final File file = new File("./data/circuit.json");
if (file.getParentFile().mkdirs()) {
log.info("Directory created: {}", file.getParent());
}
write(circuit, new FileOutputStream(file));
} catch (IOException e) {
log.error(e.toString());
}
repaint();
}
}