mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-26 14:31:02 -04:00
new wire drawing mode
This commit is contained in:
parent
44bca8c0bc
commit
2d0b46c8ea
@ -87,6 +87,16 @@ public class Wire implements Drawable, Movable {
|
||||
return p1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for point 1.
|
||||
* Is used to move the line with the mouse
|
||||
*
|
||||
* @param p1 the new point
|
||||
*/
|
||||
public void setP1(Vector p1) {
|
||||
this.p1 = p1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for point 2.
|
||||
* Is used to move the line with the mouse
|
||||
|
@ -67,7 +67,8 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
|
||||
private final MouseControllerInsertElement mouseInsertElement;
|
||||
private final MouseControllerMoveElement mouseMoveElement;
|
||||
private final MouseControllerMoveWire mouseMoveWire;
|
||||
private final MouseControllerWire mouseWire;
|
||||
private final MouseControllerWireDiag mouseWireDiag;
|
||||
private final MouseControllerWireRect mouseWireRect;
|
||||
private final MouseControllerSelect mouseSelect;
|
||||
private final MouseControllerMoveSelected mouseMoveSelected;
|
||||
private final MouseController mouseRun;
|
||||
@ -205,7 +206,8 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
|
||||
mouseInsertList = new MouseControllerInsertCopied(normalCursor);
|
||||
mouseMoveElement = new MouseControllerMoveElement(normalCursor);
|
||||
mouseMoveWire = new MouseControllerMoveWire(normalCursor);
|
||||
mouseWire = new MouseControllerWire(normalCursor);
|
||||
mouseWireRect = new MouseControllerWireRect(normalCursor);
|
||||
mouseWireDiag = new MouseControllerWireDiag(normalCursor);
|
||||
mouseSelect = new MouseControllerSelect(new Cursor(Cursor.CROSSHAIR_CURSOR));
|
||||
mouseMoveSelected = new MouseControllerMoveSelected(moveCursor);
|
||||
mouseRun = new MouseControllerRun(normalCursor);
|
||||
@ -282,8 +284,10 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
|
||||
* @param modification the modification
|
||||
*/
|
||||
public void modify(Modification modification) {
|
||||
modification.modify(circuit);
|
||||
addModificationAlreadyMade(modification);
|
||||
if (modification != null) {
|
||||
modification.modify(circuit);
|
||||
addModificationAlreadyMade(modification);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -292,14 +296,16 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
|
||||
* @param modification the modification
|
||||
*/
|
||||
private void addModificationAlreadyMade(Modification modification) {
|
||||
while (modifications.size() > undoPosition)
|
||||
modifications.remove(modifications.size() - 1);
|
||||
redoAction.setEnabled(false);
|
||||
modifications.add(modification);
|
||||
undoPosition = modifications.size();
|
||||
undoAction.setEnabled(true);
|
||||
circuit.modified();
|
||||
hasChanged();
|
||||
if (modification != null) {
|
||||
while (modifications.size() > undoPosition)
|
||||
modifications.remove(modifications.size() - 1);
|
||||
redoAction.setEnabled(false);
|
||||
modifications.add(modification);
|
||||
undoPosition = modifications.size();
|
||||
undoAction.setEnabled(true);
|
||||
circuit.modified();
|
||||
hasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -926,7 +932,7 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
|
||||
VisualElement vp = getVisualElement(pos, false);
|
||||
if (vp != null) {
|
||||
if (circuit.isPinPos(raster(pos), vp) && !e.isControlDown()) {
|
||||
if (!isLocked()) mouseWire.activate(pos);
|
||||
if (!isLocked()) mouseWireRect.activate(pos);
|
||||
} else
|
||||
mouseMoveElement.activate(vp, pos);
|
||||
} else if (!isLocked()) {
|
||||
@ -935,7 +941,7 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
|
||||
if (wire != null)
|
||||
mouseMoveWire.activate(wire, pos);
|
||||
} else if (!focusWasLost)
|
||||
mouseWire.activate(pos);
|
||||
mouseWireRect.activate(pos);
|
||||
}
|
||||
}
|
||||
focusWasLost = false;
|
||||
@ -1157,17 +1163,20 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
|
||||
}
|
||||
|
||||
|
||||
private final class MouseControllerWire extends MouseController {
|
||||
private final class MouseControllerWireDiag extends MouseController {
|
||||
private Wire wire;
|
||||
|
||||
private MouseControllerWire(Cursor cursor) {
|
||||
private MouseControllerWireDiag(Cursor cursor) {
|
||||
super(cursor);
|
||||
}
|
||||
|
||||
private void activate(Vector startPos) {
|
||||
activate(startPos, startPos);
|
||||
}
|
||||
|
||||
private void activate(Vector startPos, Vector endPos) {
|
||||
super.activate();
|
||||
Vector pos = raster(startPos);
|
||||
wire = new Wire(pos, pos);
|
||||
wire = new Wire(raster(startPos), raster(endPos));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -1181,11 +1190,11 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
|
||||
if (e.getButton() == MouseEvent.BUTTON3)
|
||||
mouseNormal.activate();
|
||||
else {
|
||||
modify(new ModifyInsertWire(wire));
|
||||
modify(new ModifyInsertWire(wire).checkIfLenZero());
|
||||
if (circuit.isPinPos(wire.p2))
|
||||
mouseNormal.activate();
|
||||
else
|
||||
wire = new Wire(wire.p2, wire.p2);
|
||||
mouseWireRect.activate(wire.p2);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1200,6 +1209,83 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
|
||||
}
|
||||
}
|
||||
|
||||
private final class MouseControllerWireRect extends MouseController {
|
||||
private Wire wire1;
|
||||
private Wire wire2;
|
||||
private boolean selectionMade;
|
||||
private boolean firstHori;
|
||||
private Vector initialPos;
|
||||
|
||||
private MouseControllerWireRect(Cursor cursor) {
|
||||
super(cursor);
|
||||
}
|
||||
|
||||
private void activate(Vector startPos) {
|
||||
super.activate();
|
||||
initialPos = raster(startPos);
|
||||
wire1 = new Wire(initialPos, initialPos);
|
||||
wire2 = new Wire(initialPos, initialPos);
|
||||
selectionMade = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
void moved(MouseEvent e) {
|
||||
Vector p = raster(getPosVector(e));
|
||||
if (!selectionMade) {
|
||||
Vector delta = p.sub(initialPos);
|
||||
boolean dx = Math.abs(delta.x) > DRAG_DISTANCE;
|
||||
boolean dy = Math.abs(delta.y) > DRAG_DISTANCE;
|
||||
if (dx || dy) {
|
||||
firstHori = dx;
|
||||
selectionMade = true;
|
||||
}
|
||||
}
|
||||
|
||||
Vector pm;
|
||||
if (firstHori)
|
||||
pm = new Vector(p.x, wire1.p1.y);
|
||||
else
|
||||
pm = new Vector(wire1.p1.x, p.y);
|
||||
wire1.setP2(pm);
|
||||
wire2.setP1(pm);
|
||||
wire2.setP2(p);
|
||||
repaint();
|
||||
}
|
||||
|
||||
@Override
|
||||
void clicked(MouseEvent e) {
|
||||
if (e.getButton() == MouseEvent.BUTTON3)
|
||||
mouseNormal.activate();
|
||||
else {
|
||||
modify(new Modifications.Builder()
|
||||
.add(new ModifyInsertWire(wire1).checkIfLenZero())
|
||||
.add(new ModifyInsertWire(wire2).checkIfLenZero())
|
||||
.build());
|
||||
if (circuit.isPinPos(wire2.p2))
|
||||
mouseNormal.activate();
|
||||
else {
|
||||
initialPos = wire2.p2;
|
||||
selectionMade = false;
|
||||
wire1 = new Wire(wire2.p2, wire2.p2);
|
||||
wire2 = new Wire(wire2.p2, wire2.p2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawTo(Graphic gr) {
|
||||
wire1.drawTo(gr, false);
|
||||
wire2.drawTo(gr, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void escapePressed() {
|
||||
mouseWireDiag.activate(initialPos, wire2.p2);
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private final class MouseControllerSelect extends MouseController {
|
||||
private static final int MIN_SIZE = 8;
|
||||
private Vector corner1;
|
||||
|
@ -41,7 +41,8 @@ public final class Modifications implements Modification {
|
||||
* @return this for chained calls
|
||||
*/
|
||||
public Builder add(Modification m) {
|
||||
list.add(m);
|
||||
if (m != null)
|
||||
list.add(m);
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -51,7 +52,13 @@ public final class Modifications implements Modification {
|
||||
* @return the unified modification
|
||||
*/
|
||||
public Modification build() {
|
||||
return new Modifications(list);
|
||||
if (list.isEmpty())
|
||||
return null;
|
||||
|
||||
if (list.size() == 1)
|
||||
return list.get(0);
|
||||
else
|
||||
return new Modifications(list);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,4 +26,14 @@ public class ModifyInsertWire implements Modification {
|
||||
public void modify(Circuit circuit) {
|
||||
circuit.add(new Wire(p1, p2));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return null if this is a wire with zero length
|
||||
*/
|
||||
public Modification checkIfLenZero() {
|
||||
if ((p1.x == p2.x) && (p1.y == p2.y))
|
||||
return null;
|
||||
else
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user