1 package net.mograsim.logic.model.editor.states;
3 import org.eclipse.swt.SWT;
4 import org.eclipse.swt.widgets.Display;
6 import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
7 import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer;
8 import net.mograsim.logic.model.editor.Editor;
9 import net.mograsim.logic.model.editor.Selection;
10 import net.mograsim.logic.model.editor.handles.Handle;
11 import net.mograsim.logic.model.editor.handles.PinHandle;
12 import net.mograsim.logic.model.editor.handles.WireHandle;
13 import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo;
14 import net.mograsim.logic.model.editor.handles.WireHandle.WireHandleClickInfo;
15 import net.mograsim.logic.model.editor.ui.DialogManager;
16 import net.mograsim.logic.model.model.wires.MovablePin;
17 import net.mograsim.logic.model.model.wires.Pin;
18 import net.mograsim.logic.model.model.wires.PinUsage;
20 public class SelectionState extends EditorState
22 private final ZoomedRenderer outlineRenderer = gc ->
24 if (editor.getSelection().size() > 1)
27 gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW));
28 gc.drawRectangle(editor.getSelection().getBounds());
32 public SelectionState(Editor editor, StateManager manager)
34 super(editor, manager);
40 Point curserPos = editor.userInput.getWorldMousePosition();
41 editor.addComponent(curserPos.x, curserPos.y);
47 editor.deleteSelection();
59 Point curserPos = editor.userInput.getWorldMousePosition();
60 editor.paste(curserPos.x, curserPos.y);
64 public void duplicate()
72 if (!editor.getSelection().isEmpty())
73 manager.setState(new GrabState(editor, manager));
77 public void boxSelect()
79 manager.setState(new BoxSelectionState(editor, manager));
85 editor.gui.logicCanvas.addZoomedRenderer(outlineRenderer);
86 editor.gui.logicCanvas.redrawThreadsafe();
92 editor.gui.logicCanvas.removeZoomedRenderer(outlineRenderer);
93 editor.gui.logicCanvas.redrawThreadsafe();
97 public void clickedEmpty(Point clicked, int stateMask)
99 editor.getSelection().clear();
100 if ((stateMask & SWT.ALT) == SWT.ALT)
102 String[] result = DialogManager.openMultiTextDialog("Add Pin...", "Add", "Cancel", "Name", "Logic Width", "Usage");
107 Pin p = editor.toBeEdited.addSubmodelInterface(new MovablePin(editor.getSubmodel(), editor.toBeEdited, result[0],
108 Integer.parseInt(result[1]), PinUsage.valueOf(result[2]), clicked.x, clicked.y));
109 editor.handleManager.getInterfacePinHandle(p).reqMove(clicked.x, clicked.y);
111 catch (@SuppressWarnings("unused") NumberFormatException e)
113 editor.dialogManager.openWarningDialog("Failed to create Pin!", "Bit width must be a number!");
115 catch (@SuppressWarnings("unused") IllegalArgumentException e)
117 editor.dialogManager.openWarningDialog("Failed to create Pin!", "Usage must be one of INPUT, OUTPUT, TRISTATE!");
124 public boolean clickedHandle(HandleClickInfo handleClickInfo)
126 switch (handleClickInfo.clicked.getType())
129 if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL)
131 manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked));
138 boolean additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT;
139 select(handleClickInfo.clicked, additive);
142 if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL)
143 manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked));
148 if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL)
150 WireHandleClickInfo info = (WireHandleClickInfo) handleClickInfo;
151 WireHandle clicked = (WireHandle) info.clicked;
152 clicked.parent.insertPathPoint(info.posOnWire, info.segment);
155 additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT;
156 select(handleClickInfo.clicked, additive);
165 private void select(Handle h, boolean additive)
167 Selection sel = editor.getSelection();
173 if (editor.getSelection().size() > 1)