mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-18 17:34:43 -04:00
added a rotate function
This commit is contained in:
parent
dbf36b9bda
commit
5aa9b9a134
@ -15,4 +15,6 @@ public interface Moveable {
|
|||||||
* @param delta the movement
|
* @param delta the movement
|
||||||
*/
|
*/
|
||||||
void move(Vector delta);
|
void move(Vector delta);
|
||||||
|
|
||||||
|
Vector getPos();
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,11 @@ public class Wire implements Drawable, Moveable {
|
|||||||
p2 = p2.add(delta);
|
p2 = p2.add(delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Vector getPos() {
|
||||||
|
return 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
|
||||||
@ -178,14 +183,34 @@ public class Wire implements Drawable, Moveable {
|
|||||||
* @return a moveable representing point one
|
* @return a moveable representing point one
|
||||||
*/
|
*/
|
||||||
public Moveable getMovableP1() {
|
public Moveable getMovableP1() {
|
||||||
return delta -> p1 = p1.add(delta);
|
return new Moveable() {
|
||||||
|
@Override
|
||||||
|
public void move(Vector delta) {
|
||||||
|
p1 = p1.add(delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Vector getPos() {
|
||||||
|
return p1;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return a moveable representing point two
|
* @return a moveable representing point two
|
||||||
*/
|
*/
|
||||||
public Moveable getMovableP2() {
|
public Moveable getMovableP2() {
|
||||||
return delta -> p2 = p2.add(delta);
|
return new Moveable() {
|
||||||
|
@Override
|
||||||
|
public void move(Vector delta) {
|
||||||
|
p2 = p2.add(delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Vector getPos() {
|
||||||
|
return p2;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Orientation {horzontal, vertical, diagonal}
|
enum Orientation {horzontal, vertical, diagonal}
|
||||||
|
@ -402,8 +402,16 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E
|
|||||||
edit.add(orderOutputs.createJMenuItem());
|
edit.add(orderOutputs.createJMenuItem());
|
||||||
edit.add(orderMeasurements.createJMenuItem());
|
edit.add(orderMeasurements.createJMenuItem());
|
||||||
edit.addSeparator();
|
edit.addSeparator();
|
||||||
edit.add(circuitComponent.getCopyAction());
|
|
||||||
edit.add(circuitComponent.getPasteAction());
|
JMenuItem copyItem = new JMenuItem(circuitComponent.getCopyAction());
|
||||||
|
copyItem.setAccelerator(KeyStroke.getKeyStroke('C', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
||||||
|
edit.add(copyItem);
|
||||||
|
JMenuItem pasteItem = new JMenuItem(circuitComponent.getPasteAction());
|
||||||
|
pasteItem.setAccelerator(KeyStroke.getKeyStroke('V', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
|
||||||
|
edit.add(pasteItem);
|
||||||
|
JMenuItem rotateItem = new JMenuItem(circuitComponent.getRotateAction());
|
||||||
|
rotateItem.setAccelerator(KeyStroke.getKeyStroke('R'));
|
||||||
|
edit.add(rotateItem);
|
||||||
edit.addSeparator();
|
edit.addSeparator();
|
||||||
edit.add(editSettings.createJMenuItem());
|
edit.add(editSettings.createJMenuItem());
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ import java.util.HashSet;
|
|||||||
|
|
||||||
import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
|
import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
|
||||||
import static de.neemann.digital.draw.shapes.GenericShape.SIZE2;
|
import static de.neemann.digital.draw.shapes.GenericShape.SIZE2;
|
||||||
|
import static java.awt.event.InputEvent.CTRL_DOWN_MASK;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author hneemann
|
* @author hneemann
|
||||||
@ -61,6 +62,7 @@ public class CircuitComponent extends JComponent {
|
|||||||
private final Cursor moveCursor;
|
private final Cursor moveCursor;
|
||||||
private final AbstractAction copyAction;
|
private final AbstractAction copyAction;
|
||||||
private final AbstractAction pasteAction;
|
private final AbstractAction pasteAction;
|
||||||
|
private final AbstractAction rotateAction;
|
||||||
|
|
||||||
private Circuit circuit;
|
private Circuit circuit;
|
||||||
private MouseController activeMouseController;
|
private MouseController activeMouseController;
|
||||||
@ -80,6 +82,20 @@ public class CircuitComponent extends JComponent {
|
|||||||
this.parentsSavedListener = parentsSavedListener;
|
this.parentsSavedListener = parentsSavedListener;
|
||||||
highLighted = new HashSet<>();
|
highLighted = new HashSet<>();
|
||||||
|
|
||||||
|
rotateAction = new AbstractAction(Lang.get("menu_rotate")) {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
if (activeMouseController instanceof MouseControllerSelect) {
|
||||||
|
MouseControllerSelect mcs = ((MouseControllerSelect) activeMouseController);
|
||||||
|
ArrayList<Moveable> elements = circuit.getElementsToMove(Vector.min(mcs.corner1, mcs.corner2), Vector.max(mcs.corner1, mcs.corner2));
|
||||||
|
if (elements != null)
|
||||||
|
rotateElements(elements, mcs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
rotateAction.setEnabled(false);
|
||||||
|
|
||||||
|
|
||||||
copyAction = new AbstractAction(Lang.get("menu_copy")) {
|
copyAction = new AbstractAction(Lang.get("menu_copy")) {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
@ -123,10 +139,12 @@ public class CircuitComponent extends JComponent {
|
|||||||
|
|
||||||
getInputMap().put(KeyStroke.getKeyStroke("DELETE"), DEL_ACTION);
|
getInputMap().put(KeyStroke.getKeyStroke("DELETE"), DEL_ACTION);
|
||||||
getActionMap().put(DEL_ACTION, deleteAction);
|
getActionMap().put(DEL_ACTION, deleteAction);
|
||||||
getInputMap().put(KeyStroke.getKeyStroke("control C"), "myCopy");
|
getInputMap().put(KeyStroke.getKeyStroke('C', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "myCopy");
|
||||||
getActionMap().put("myCopy", copyAction);
|
getActionMap().put("myCopy", copyAction);
|
||||||
getInputMap().put(KeyStroke.getKeyStroke("control V"), "myPaste");
|
getInputMap().put(KeyStroke.getKeyStroke('V', Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()), "myPaste");
|
||||||
getActionMap().put("myPaste", pasteAction);
|
getActionMap().put("myPaste", pasteAction);
|
||||||
|
getInputMap().put(KeyStroke.getKeyStroke("R"), "myRotate");
|
||||||
|
getActionMap().put("myRotate", rotateAction);
|
||||||
|
|
||||||
|
|
||||||
setFocusable(true);
|
setFocusable(true);
|
||||||
@ -202,6 +220,44 @@ public class CircuitComponent extends JComponent {
|
|||||||
return pasteAction;
|
return pasteAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the rotate action
|
||||||
|
*/
|
||||||
|
public AbstractAction getRotateAction() {
|
||||||
|
return rotateAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void rotateElements(ArrayList<Moveable> elements, MouseControllerSelect mcs) {
|
||||||
|
Vector p1 = Vector.min(mcs.corner1, mcs.corner2);
|
||||||
|
Vector p2 = Vector.max(mcs.corner1, mcs.corner2);
|
||||||
|
|
||||||
|
Transform transform = new TransformRotate(p1.add(0, p2.y - p1.y), 1) {
|
||||||
|
@Override
|
||||||
|
public Vector transform(Vector v) {
|
||||||
|
return super.transform(v.sub(p1));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (Moveable m : elements) {
|
||||||
|
Vector p = m.getPos();
|
||||||
|
Vector t = transform.transform(p);
|
||||||
|
m.move(t.sub(p));
|
||||||
|
|
||||||
|
if (m instanceof VisualElement) {
|
||||||
|
VisualElement ve = (VisualElement) m;
|
||||||
|
int r = ve.getRotate() + 1;
|
||||||
|
if (r > 3) r -= 4;
|
||||||
|
ve.setRotate(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
mcs.corner1 = transform.transform(mcs.corner1);
|
||||||
|
mcs.corner2 = transform.transform(mcs.corner2);
|
||||||
|
circuit.modified();
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the observer to call if the user is clicking on elements while running.
|
* Sets the observer to call if the user is clicking on elements while running.
|
||||||
*
|
*
|
||||||
@ -485,6 +541,7 @@ public class CircuitComponent extends JComponent {
|
|||||||
activeMouseController = this;
|
activeMouseController = this;
|
||||||
deleteAction.setActive(false);
|
deleteAction.setActive(false);
|
||||||
copyAction.setEnabled(false);
|
copyAction.setEnabled(false);
|
||||||
|
rotateAction.setEnabled(false);
|
||||||
setCursor(mouseCursor);
|
setCursor(mouseCursor);
|
||||||
repaint();
|
repaint();
|
||||||
}
|
}
|
||||||
@ -697,6 +754,7 @@ public class CircuitComponent extends JComponent {
|
|||||||
this.corner2 = corner2;
|
this.corner2 = corner2;
|
||||||
deleteAction.setActive(true);
|
deleteAction.setActive(true);
|
||||||
copyAction.setEnabled(true);
|
copyAction.setEnabled(true);
|
||||||
|
rotateAction.setEnabled(true);
|
||||||
wasReleased = false;
|
wasReleased = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -724,7 +782,26 @@ public class CircuitComponent extends JComponent {
|
|||||||
removeHighLighted();
|
removeHighLighted();
|
||||||
mouseMoveSelected.activate(corner1, corner2, getPosVector(e));
|
mouseMoveSelected.activate(corner1, corner2, getPosVector(e));
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
corner2 = getPosVector(e);
|
corner2 = getPosVector(e);
|
||||||
|
if ((e.getModifiersEx() & CTRL_DOWN_MASK) != 0) {
|
||||||
|
Vector dif = corner2.sub(corner1);
|
||||||
|
int dx = dif.x;
|
||||||
|
int dy = dif.y;
|
||||||
|
int absDx = Math.abs(dx);
|
||||||
|
int absDy = Math.abs(dy);
|
||||||
|
if (absDx != absDy) {
|
||||||
|
if (absDx > absDy) {
|
||||||
|
if (dx > absDy) dx = absDy;
|
||||||
|
else dx = -absDy;
|
||||||
|
} else {
|
||||||
|
if (dy > absDx) dy = absDx;
|
||||||
|
else dy = -absDx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
corner2 = corner1.add(dx, dy);
|
||||||
|
}
|
||||||
|
|
||||||
ArrayList<Drawable> elements = circuit.getElementsToHighlight(Vector.min(corner1, corner2), Vector.max(corner1, corner2));
|
ArrayList<Drawable> elements = circuit.getElementsToHighlight(Vector.min(corner1, corner2), Vector.max(corner1, corner2));
|
||||||
removeHighLighted();
|
removeHighLighted();
|
||||||
if (elements != null)
|
if (elements != null)
|
||||||
|
@ -333,6 +333,8 @@ menu_table_create_jedec_tt=Erzeugt eine JEDEC Datei f\u00FCr den Baustein
|
|||||||
menu_table_exportTableLaTeX=Export LaTeX
|
menu_table_exportTableLaTeX=Export LaTeX
|
||||||
menu_copy=Kopieren
|
menu_copy=Kopieren
|
||||||
menu_paste=Einf\u00FCgen
|
menu_paste=Einf\u00FCgen
|
||||||
|
menu_rotate=Rotieren
|
||||||
|
|
||||||
|
|
||||||
menu_editSettings=Einstellungen
|
menu_editSettings=Einstellungen
|
||||||
menu_editSettings_tt=Bearbeitet die globalen Einstellungen
|
menu_editSettings_tt=Bearbeitet die globalen Einstellungen
|
||||||
|
@ -314,7 +314,7 @@ menu_editSettings=Settings
|
|||||||
menu_editSettings_tt=Edits Digitals Preferences
|
menu_editSettings_tt=Edits Digitals Preferences
|
||||||
menu_copy=Copy
|
menu_copy=Copy
|
||||||
menu_paste=Paste
|
menu_paste=Paste
|
||||||
|
menu_rotate=Rotate
|
||||||
|
|
||||||
win_saveChanges=Save Changes?
|
win_saveChanges=Save Changes?
|
||||||
win_confirmExit=Confirm Exit!
|
win_confirmExit=Confirm Exit!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user