185 lines
5.7 KiB
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|