easier placement of inputs and outputs in minified circuit shapes

This commit is contained in:
hneemann 2023-11-08 07:53:28 +01:00
parent 4e17404783
commit 686c419bff

View File

@ -12,6 +12,7 @@ import de.neemann.digital.core.io.In;
import de.neemann.digital.core.io.InValue;
import de.neemann.digital.core.io.Out;
import de.neemann.digital.core.switching.Switch;
import de.neemann.digital.core.wiring.Clock;
import de.neemann.digital.draw.elements.*;
import de.neemann.digital.draw.graphics.Polygon;
import de.neemann.digital.draw.graphics.Vector;
@ -19,6 +20,7 @@ import de.neemann.digital.draw.graphics.*;
import de.neemann.digital.draw.library.*;
import de.neemann.digital.draw.model.Net;
import de.neemann.digital.draw.model.NetList;
import de.neemann.digital.draw.shapes.CustomCircuitShapeType;
import de.neemann.digital.draw.shapes.Drawable;
import de.neemann.digital.draw.shapes.InputShape;
import de.neemann.digital.draw.shapes.ShapeFactory;
@ -1035,6 +1037,21 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
(int) Math.round((double) pos.y / SIZE) * SIZE);
}
/**
* rounds the given vector to the raster in minimized circuit shapes
*
* @param pos the vector
* @param minRaster if set to false the given values is returned
* @return pos round to raster
*/
public static Vector toMinRaster(Vector pos, boolean minRaster) {
if (!minRaster)
return pos;
final int s = SIZE * 2;
return new Vector((int) Math.round((double) pos.x / s) * s,
(int) Math.round((double) pos.y / s) * s);
}
/**
* @return the circuit used
*/
@ -1846,6 +1863,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
private final class MouseControllerInsertElement extends MouseController {
private VisualElement element;
private Vector delta;
private boolean minRaster;
private MouseControllerInsertElement(Cursor cursor) {
super(cursor);
@ -1857,6 +1875,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
delta = null;
deleteAction.setEnabled(true);
rotateAction.setEnabled(true);
minRaster = needsMinRaster(element);
}
@Override
@ -1869,7 +1888,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
GraphicMinMax minMax = element.getMinMax(false);
delta = element.getPos().sub(minMax.getMax());
}
element.setPos(pos.add(delta));
element.setPos(toMinRaster(pos.add(delta), minRaster));
repaint();
}
@ -1907,6 +1926,15 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
}
private boolean needsMinRaster(VisualElement element) {
if (getCircuit().getAttributes().get(Keys.SHAPE_TYPE) != CustomCircuitShapeType.MINIMIZED)
return false;
return element.equalsDescription(In.DESCRIPTION) ||
element.equalsDescription(Out.DESCRIPTION) ||
element.equalsDescription(Clock.DESCRIPTION);
}
private void insertWires(VisualElement element) {
if (tutorialListener == null) {
Modifications.Builder<Circuit> wires = new Modifications.Builder<>(Lang.get("lib_wires"));
@ -1960,6 +1988,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
private VisualElement visualElement;
private Vector delta;
private VisualElement originalVisualElement;
private boolean minRaster;
private MouseControllerMoveElement(Cursor cursor) {
super(cursor);
@ -1975,6 +2004,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
deleteAction.setEnabled(true);
rotateAction.setEnabled(true);
copyAction.setEnabled(true);
minRaster = needsMinRaster(visualElement);
graphicHasChanged();
}
@ -1995,7 +2025,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
void moved(MouseEvent e) {
if (!isLocked()) {
Vector pos = getPosVector(e);
visualElement.setPos(pos.add(delta));
visualElement.setPos(toMinRaster(pos.add(delta), minRaster));
repaint();
}
}