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

185 lines
5.7 KiB
Java

package de.ph87.electro.circuit;
import de.ph87.electro.circuit.part.Part;
import de.ph87.electro.circuit.part.Position;
import de.ph87.electro.circuit.part.junction.Junction;
import de.ph87.electro.circuit.wire.Wire;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Optional;
import static de.ph87.electro.CONFIG.*;
import static java.awt.event.MouseEvent.BUTTON1;
import static java.awt.event.MouseEvent.BUTTON3;
class CircuitPanelMouseAdapter extends MouseAdapter {
private final CircuitPanel circuitPanel;
private final Circuit circuit;
private Part partHover = null;
private Junction junctionHover = null;
private Wire wireHover = null;
private Part partDrag = null;
private Junction junctionDrag = null;
private Position dragPosition = null;
CircuitPanelMouseAdapter(final CircuitPanel circuitPanel, final Circuit circuit) {
this.circuitPanel = circuitPanel;
this.circuit = circuit;
circuitPanel.addMouseListener(this);
circuitPanel.addMouseMotionListener(this);
}
@Override
public void mouseClicked(final MouseEvent event) {
final Position position = new Position(event);
if (event.getButton() == BUTTON3) {
final Optional<Wire> wireOptional = circuit.findWireByPosition(position);
if (wireOptional.isPresent()) {
circuit.removeWire(wireOptional.get());
circuitPanel.evaluate();
return;
}
}
final Optional<Part> partOptional = circuit.findPartByPosition(position);
switch (event.getButton()) {
case BUTTON1:
partOptional.ifPresent(Part::action);
circuitPanel.evaluate();
break;
case BUTTON3:
partOptional.ifPresent(Part::clockwise);
circuitPanel.save();
break;
}
}
@Override
public void mouseMoved(final MouseEvent event) {
findHover(new Position(event));
circuitPanel.repaint();
}
@Override
public void mousePressed(final MouseEvent event) {
final Position position = new Position(event);
circuit.findPartByPosition(position).ifPresent(part -> startPartOrJunction(part, position));
}
private void startPartOrJunction(final Part part, final Position position) {
part.findJunctionByPosition(position).ifPresentOrElse(junction -> {
partDrag = null;
junctionDrag = junction;
}, () -> {
partDrag = part;
junctionDrag = null;
});
}
@Override
public void mouseDragged(final MouseEvent event) {
final Position position = new Position(event);
findHover(position);
if (partDrag != null || junctionDrag != null) {
dragPosition = position;
}
circuitPanel.repaint();
}
private void findHover(final Position position) {
partHover = circuit.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);
if (wireHover != null) {
partHover = null;
}
}
@Override
public void mouseReleased(final MouseEvent event) {
final Position position = new Position(event);
if (partDrag != null) {
circuit.movePart(partDrag, position);
circuitPanel.save();
}
if (junctionDrag != null) {
circuit.findJunctionByAbsolute(position).filter(destination -> destination != junctionDrag).ifPresent(destination -> {
circuit.connect(junctionDrag, destination);
circuitPanel.evaluate();
});
}
partDrag = null;
junctionDrag = null;
dragPosition = null;
circuitPanel.repaint();
}
public void drawHover(final Graphics2D g) {
if (partHover != null) {
g.setColor(PART_HOVER_COLOR);
g.setStroke(HOVER_STROKE);
g.drawRect(partHover.getPosition().absolute.x, partHover.getPosition().absolute.y, RASTER, RASTER);
}
if (junctionHover != null) {
g.setColor(junctionHover.getColor());
g.fillArc(junctionHover.getPosition().absolute.x - JUNCTION_RADIUS_HOVER, junctionHover.getPosition().absolute.y - JUNCTION_RADIUS_HOVER, 2 * JUNCTION_RADIUS_HOVER, 2 * JUNCTION_RADIUS_HOVER, 0, 360);
g.setColor(JUNCTION_HOVER_BORDER_COLOR);
g.setStroke(HOVER_STROKE);
g.drawArc(junctionHover.getPosition().absolute.x - JUNCTION_RADIUS_HOVER, junctionHover.getPosition().absolute.y - JUNCTION_RADIUS_HOVER, 2 * JUNCTION_RADIUS_HOVER, 2 * JUNCTION_RADIUS_HOVER, 0, 360);
}
if (wireHover != null) {
g.setColor(WIRE_HOVER_COLOR_BACK);
g.setStroke(WIRE_HOVER_STROKE_BACK);
g.drawLine(
wireHover.getA().getPosition().absolute.x,
wireHover.getA().getPosition().absolute.y,
wireHover.getB().getPosition().absolute.x,
wireHover.getB().getPosition().absolute.y
);
g.setColor(wireHover.getA().getColor());
g.setStroke(WIRE_HOVER_STROKE);
g.drawLine(
wireHover.getA().getPosition().absolute.x,
wireHover.getA().getPosition().absolute.y,
wireHover.getB().getPosition().absolute.x,
wireHover.getB().getPosition().absolute.y
);
}
}
public void drawDrag(final Graphics2D g) {
if (dragPosition != null) {
if (partDrag != null) {
g.setColor(PART_HOVER_COLOR);
g.fillRect(dragPosition.absolute.x - P50, dragPosition.absolute.y - P50, RASTER, RASTER);
}
if (junctionDrag != null) {
g.setColor(junctionDrag.getColor());
g.setStroke(WIRE_STROKE);
g.drawLine(junctionDrag.getPosition().absolute.x, junctionDrag.getPosition().absolute.y, dragPosition.absolute.x, dragPosition.absolute.y);
}
}
}
}