X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.logic.model.editor%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Feditor%2Fstates%2FBoxSelectionState.java;fp=plugins%2Fnet.mograsim.logic.model.editor%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Feditor%2Fstates%2FBoxSelectionState.java;h=ef109cdb1f5de59046706a62ad30217d3292b3eb;hb=7d05144c25daa53e60fc9ed9fd503546a86567f8;hp=0000000000000000000000000000000000000000;hpb=8bed58cd47f4e53a0a83e066d38864aa6875502f;p=Mograsim.git diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java new file mode 100644 index 00000000..ef109cdb --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java @@ -0,0 +1,89 @@ +package net.mograsim.logic.model.editor.states; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.Selection; +import net.mograsim.logic.model.editor.handles.Handle; + +public class BoxSelectionState extends EditorState +{ + private Point origin; + private double mX, mY; + + private final ZoomedRenderer boxRenderer = gc -> + { + if (origin != null) + { + gc.setLineWidth(0.5); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW)); + gc.drawRectangle(origin.x, origin.y, mX - origin.x, mY - origin.y); + } + }; + + public BoxSelectionState(Editor editor, StateManager manager) + { + super(editor, manager); + } + + @Override + public void onEntry() + { + editor.gui.logicCanvas.addZoomedRenderer(boxRenderer); + editor.gui.logicCanvas.redrawThreadsafe(); + } + + @Override + public void onExit() + { + editor.gui.logicCanvas.removeZoomedRenderer(boxRenderer); + editor.gui.logicCanvas.redrawThreadsafe(); + } + + @Override + public void boxSelect() + { + manager.setState(new SelectionState(editor, manager)); + } + + @Override + public void clicked(Point clicked, int stateMask) + { + if (origin == null) + { + origin = new Point(clicked.x, clicked.y); + mX = clicked.x; + mY = clicked.y; + } else + { + Selection s = editor.getSelection(); + s.clear(); + boolean leftToRight = mX > origin.x, topToBottom = mY > origin.y; + double x = leftToRight ? origin.x : mX, y = topToBottom ? origin.y : mY, width = leftToRight ? mX - origin.x : origin.x - mX, + height = topToBottom ? mY - origin.y : origin.y - mY; + + Rectangle selected = new Rectangle(x, y, width, height); + for (Handle h : editor.handleManager.getHandles()) + { + Rectangle hBounds = h.getBounds(); + if (selected.contains(hBounds.x, hBounds.y) && selected.contains(hBounds.x + hBounds.width, hBounds.y + hBounds.height)) + { + s.add(h); + } + } + manager.setState(new SelectionState(editor, manager)); + } + } + + @Override + public void mouseMoved(double x, double y) + { + mX = x; + mY = y; + editor.gui.logicCanvas.redrawThreadsafe(); + } +}