new wire drawing mode

This commit is contained in:
hneemann 2017-05-26 19:52:25 +02:00
parent 44bca8c0bc
commit 2d0b46c8ea
4 changed files with 135 additions and 22 deletions

View File

@ -87,6 +87,16 @@ public class Wire implements Drawable, Movable {
return p1; 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. * Setter for point 2.
* Is used to move the line with the mouse * Is used to move the line with the mouse

View File

@ -67,7 +67,8 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
private final MouseControllerInsertElement mouseInsertElement; private final MouseControllerInsertElement mouseInsertElement;
private final MouseControllerMoveElement mouseMoveElement; private final MouseControllerMoveElement mouseMoveElement;
private final MouseControllerMoveWire mouseMoveWire; private final MouseControllerMoveWire mouseMoveWire;
private final MouseControllerWire mouseWire; private final MouseControllerWireDiag mouseWireDiag;
private final MouseControllerWireRect mouseWireRect;
private final MouseControllerSelect mouseSelect; private final MouseControllerSelect mouseSelect;
private final MouseControllerMoveSelected mouseMoveSelected; private final MouseControllerMoveSelected mouseMoveSelected;
private final MouseController mouseRun; private final MouseController mouseRun;
@ -205,7 +206,8 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
mouseInsertList = new MouseControllerInsertCopied(normalCursor); mouseInsertList = new MouseControllerInsertCopied(normalCursor);
mouseMoveElement = new MouseControllerMoveElement(normalCursor); mouseMoveElement = new MouseControllerMoveElement(normalCursor);
mouseMoveWire = new MouseControllerMoveWire(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)); mouseSelect = new MouseControllerSelect(new Cursor(Cursor.CROSSHAIR_CURSOR));
mouseMoveSelected = new MouseControllerMoveSelected(moveCursor); mouseMoveSelected = new MouseControllerMoveSelected(moveCursor);
mouseRun = new MouseControllerRun(normalCursor); mouseRun = new MouseControllerRun(normalCursor);
@ -282,8 +284,10 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
* @param modification the modification * @param modification the modification
*/ */
public void modify(Modification modification) { public void modify(Modification modification) {
modification.modify(circuit); if (modification != null) {
addModificationAlreadyMade(modification); modification.modify(circuit);
addModificationAlreadyMade(modification);
}
} }
/** /**
@ -292,14 +296,16 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
* @param modification the modification * @param modification the modification
*/ */
private void addModificationAlreadyMade(Modification modification) { private void addModificationAlreadyMade(Modification modification) {
while (modifications.size() > undoPosition) if (modification != null) {
modifications.remove(modifications.size() - 1); while (modifications.size() > undoPosition)
redoAction.setEnabled(false); modifications.remove(modifications.size() - 1);
modifications.add(modification); redoAction.setEnabled(false);
undoPosition = modifications.size(); modifications.add(modification);
undoAction.setEnabled(true); undoPosition = modifications.size();
circuit.modified(); undoAction.setEnabled(true);
hasChanged(); circuit.modified();
hasChanged();
}
} }
/** /**
@ -926,7 +932,7 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
VisualElement vp = getVisualElement(pos, false); VisualElement vp = getVisualElement(pos, false);
if (vp != null) { if (vp != null) {
if (circuit.isPinPos(raster(pos), vp) && !e.isControlDown()) { if (circuit.isPinPos(raster(pos), vp) && !e.isControlDown()) {
if (!isLocked()) mouseWire.activate(pos); if (!isLocked()) mouseWireRect.activate(pos);
} else } else
mouseMoveElement.activate(vp, pos); mouseMoveElement.activate(vp, pos);
} else if (!isLocked()) { } else if (!isLocked()) {
@ -935,7 +941,7 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
if (wire != null) if (wire != null)
mouseMoveWire.activate(wire, pos); mouseMoveWire.activate(wire, pos);
} else if (!focusWasLost) } else if (!focusWasLost)
mouseWire.activate(pos); mouseWireRect.activate(pos);
} }
} }
focusWasLost = false; 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 Wire wire;
private MouseControllerWire(Cursor cursor) { private MouseControllerWireDiag(Cursor cursor) {
super(cursor); super(cursor);
} }
private void activate(Vector startPos) { private void activate(Vector startPos) {
activate(startPos, startPos);
}
private void activate(Vector startPos, Vector endPos) {
super.activate(); super.activate();
Vector pos = raster(startPos); wire = new Wire(raster(startPos), raster(endPos));
wire = new Wire(pos, pos);
} }
@Override @Override
@ -1181,11 +1190,11 @@ public class CircuitComponent extends JComponent implements Circuit.ChangedListe
if (e.getButton() == MouseEvent.BUTTON3) if (e.getButton() == MouseEvent.BUTTON3)
mouseNormal.activate(); mouseNormal.activate();
else { else {
modify(new ModifyInsertWire(wire)); modify(new ModifyInsertWire(wire).checkIfLenZero());
if (circuit.isPinPos(wire.p2)) if (circuit.isPinPos(wire.p2))
mouseNormal.activate(); mouseNormal.activate();
else 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 final class MouseControllerSelect extends MouseController {
private static final int MIN_SIZE = 8; private static final int MIN_SIZE = 8;
private Vector corner1; private Vector corner1;

View File

@ -41,7 +41,8 @@ public final class Modifications implements Modification {
* @return this for chained calls * @return this for chained calls
*/ */
public Builder add(Modification m) { public Builder add(Modification m) {
list.add(m); if (m != null)
list.add(m);
return this; return this;
} }
@ -51,7 +52,13 @@ public final class Modifications implements Modification {
* @return the unified modification * @return the unified modification
*/ */
public Modification build() { 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);
} }
} }
} }

View File

@ -26,4 +26,14 @@ public class ModifyInsertWire implements Modification {
public void modify(Circuit circuit) { public void modify(Circuit circuit) {
circuit.add(new Wire(p1, p2)); 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;
}
} }