90 lines
2.4 KiB
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();
|
|
}
|
|
|
|
}
|