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(); } }