From cff9e65dd62147eb44fa688d18db0032f5977f07 Mon Sep 17 00:00:00 2001 From: Fabian Stemmler Date: Sun, 14 Jul 2019 18:08:35 +0200 Subject: [PATCH] Added option to switch off snapping in the Editor Also moved all UI related classes into their own package --- .../META-INF/MANIFEST.MF | 3 +- .../mograsim/logic/model/editor/Editor.java | 35 +++-- .../logic/model/editor/EditorGUI.java | 78 ---------- .../logic/model/editor/EditorUserInput.java | 16 +- .../logic/model/editor/SaveLoadManager.java | 2 +- .../model/editor/states/SelectionState.java | 6 +- .../model/editor/{ => ui}/DialogManager.java | 4 +- .../model/editor/{ => ui}/EditorCanvas.java | 6 +- .../logic/model/editor/ui/EditorGUI.java | 147 ++++++++++++++++++ 9 files changed, 196 insertions(+), 101 deletions(-) delete mode 100644 net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorGUI.java rename net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/{ => ui}/DialogManager.java (97%) rename net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/{ => ui}/EditorCanvas.java (88%) create mode 100644 net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java diff --git a/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF b/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF index 40d06541..a666cdec 100644 --- a/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF +++ b/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF @@ -5,7 +5,8 @@ Bundle-SymbolicName: net.mograsim.logic.model.editor Bundle-Version: 0.1.0.qualifier Export-Package: net.mograsim.logic.model.editor, net.mograsim.logic.model.editor.handles, - net.mograsim.logic.model.editor.states + net.mograsim.logic.model.editor.states, + net.mograsim.logic.model.editor.ui Require-Bundle: net.mograsim.logic.model;bundle-version="0.1.0", net.mograsim.preferences;bundle-version="0.1.0" Bundle-RequiredExecutionEnvironment: JavaSE-11 diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java index 36dcbc7f..e285574e 100644 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java +++ b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java @@ -15,6 +15,8 @@ import net.mograsim.logic.model.editor.handles.Handle; import net.mograsim.logic.model.editor.handles.HandleManager; import net.mograsim.logic.model.editor.handles.PinHandle; import net.mograsim.logic.model.editor.states.StateManager; +import net.mograsim.logic.model.editor.ui.DialogManager; +import net.mograsim.logic.model.editor.ui.EditorGUI; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.GUIComponent; import net.mograsim.logic.model.model.wires.GUIWire; @@ -31,15 +33,17 @@ public final class Editor public final EditorGUI gui; public final StateManager stateManager; private final SaveLoadManager saveManager; - Snapping snapping = Snapping.ABSOLUTE; + private Snapping snapping = Snapping.ABSOLUTE; private double snapX = 5, snapY = 5; public final DialogManager dialogManager; + public final EditorUserInput userInput; public Editor(DeserializedSubmodelComponent toBeEdited) { this.toBeEdited = toBeEdited; handleManager = new HandleManager(this); gui = new EditorGUI(this); + userInput = new EditorUserInput(this); stateManager = new StateManager(this); handleManager.init(); saveManager = new SaveLoadManager(this); @@ -185,19 +189,6 @@ public final class Editor } } - public Point getCanvasMousePosition() - { - //TODO - org.eclipse.swt.graphics.Point canvasLoc = gui.logicCanvas.getLocation(), - mouseLoc = gui.display.getCursorLocation(), shellLoc = gui.shell.getLocation(); - return new Point(mouseLoc.x - shellLoc.x - canvasLoc.x, mouseLoc.y - shellLoc.y - canvasLoc.y); - } - - public Point getWorldMousePosition() - { - return gui.logicCanvas.canvasToWorldCoords(getCanvasMousePosition()); - } - public void addWire(PinHandle a, PinHandle b) { new GUIWire(toBeEdited.getSubmodelModifiable(), a.getPin(), b.getPin(), new Point[0]); @@ -206,10 +197,26 @@ public final class Editor public static enum Snapping { OFF, ABSOLUTE; + + @Override + public String toString() + { + return super.toString().toLowerCase(); + } } public static void main(String[] args) { SaveLoadManager.openLoadDialog(); } + + public Snapping getSnapping() + { + return snapping; + } + + public void setSnapping(Snapping snapping) + { + this.snapping = snapping; + } } diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorGUI.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorGUI.java deleted file mode 100644 index 2627d3c0..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorGUI.java +++ /dev/null @@ -1,78 +0,0 @@ -package net.mograsim.logic.model.editor; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.List; -import org.eclipse.swt.widgets.Shell; - -import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay; -import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; -import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; - -public class EditorGUI -{ - final Display display; - final Shell shell; - public final EditorCanvas logicCanvas; - private final List addList; - - public EditorGUI(Editor editor) - { - display = Display.getDefault(); - shell = new Shell(display); - - //Layout - GridLayout layout = new GridLayout(); - shell.setLayout(layout); - layout.numColumns = 2; - - GridData d = new GridData(); - d.grabExcessVerticalSpace = true; - d.verticalAlignment = SWT.FILL; - addList = new List(shell, SWT.FILL); - addList.setLayoutData(d); - refreshAddList(); - - d = new GridData(); - d.grabExcessHorizontalSpace = true; - d.horizontalAlignment = SWT.FILL; - d.grabExcessVerticalSpace = true; - d.verticalAlignment = SWT.FILL; - - logicCanvas = new EditorCanvas(shell, SWT.TRAIL, editor); - logicCanvas.setLayoutData(d); - - - new EditorUserInput(editor, this); - ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(logicCanvas); - userInput.buttonDrag = 3; - userInput.buttonZoom = 2; - userInput.enableUserInput(); - new ZoomableCanvasOverlay(logicCanvas, null).enableScale(); - } - - public void refreshAddList() - { - addList.setItems(IndirectGUIComponentCreator.getStandardComponentIDs().toArray(String[]::new)); - addList.select(0); - } - - public String getAddListSelected() - { - String[] selection = addList.getSelection(); - if(selection.length == 0) - throw new IllegalStateException("Selection in the Add Component List may never be empty!"); - return selection[0]; - } - - public void open() - { - shell.open(); - while (!shell.isDisposed()) - if (!display.readAndDispatch()) - display.sleep(); - } - -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java index cb66e94f..441360d8 100644 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java +++ b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java @@ -7,11 +7,15 @@ import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.editor.ui.EditorGUI; public class EditorUserInput { - public EditorUserInput(Editor editor, EditorGUI gui) + private final EditorGUI gui; + + public EditorUserInput(Editor editor) { + this.gui = editor.gui; gui.logicCanvas.addMouseListener(new MouseListener() { @Override @@ -92,4 +96,14 @@ public class EditorUserInput } }); } + + public Point getCanvasMousePosition() + { + return new Point(gui.logicCanvas.toControl(gui.display.getCursorLocation())); + } + + public Point getWorldMousePosition() + { + return gui.logicCanvas.canvasToWorldCoords(getCanvasMousePosition()); + } } \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java index 848227bc..1ba1d252 100644 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java +++ b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java @@ -2,7 +2,7 @@ package net.mograsim.logic.model.editor; import java.io.IOException; -import net.mograsim.logic.model.editor.DialogManager.InteractiveDialog; +import net.mograsim.logic.model.editor.ui.DialogManager.InteractiveDialog; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; import net.mograsim.logic.model.serializing.SubmodelComponentDeserializer; diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java index 446635ee..2a66e476 100644 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java +++ b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java @@ -7,12 +7,12 @@ import net.haspamelodica.swt.helper.swtobjectwrappers.Point; 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.DialogManager.InteractiveDialog; import net.mograsim.logic.model.editor.handles.Handle; import net.mograsim.logic.model.editor.handles.PinHandle; import net.mograsim.logic.model.editor.handles.WireHandle; import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; import net.mograsim.logic.model.editor.handles.WireHandle.WireHandleClickInfo; +import net.mograsim.logic.model.editor.ui.DialogManager.InteractiveDialog; import net.mograsim.logic.model.model.wires.MovablePin; import net.mograsim.logic.model.model.wires.Pin; @@ -36,7 +36,7 @@ public class SelectionState extends EditorState @Override public void add() { - Point curserPos = editor.getWorldMousePosition(); + Point curserPos = editor.userInput.getWorldMousePosition(); editor.addComponent(curserPos.x, curserPos.y); } @@ -55,7 +55,7 @@ public class SelectionState extends EditorState @Override public void paste() { - Point curserPos = editor.getWorldMousePosition(); + Point curserPos = editor.userInput.getWorldMousePosition(); editor.paste(curserPos.x, curserPos.y); } diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/DialogManager.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java similarity index 97% rename from net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/DialogManager.java rename to net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java index 347e6222..7d982e01 100644 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/DialogManager.java +++ b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java @@ -1,4 +1,4 @@ -package net.mograsim.logic.model.editor; +package net.mograsim.logic.model.editor.ui; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; @@ -10,6 +10,8 @@ import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; +import net.mograsim.logic.model.editor.Editor; + public class DialogManager { private Shell parent; diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorCanvas.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java similarity index 88% rename from net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorCanvas.java rename to net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java index df6b9137..357e88ff 100644 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorCanvas.java +++ b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java @@ -1,4 +1,4 @@ -package net.mograsim.logic.model.editor; +package net.mograsim.logic.model.editor.ui; import java.util.Collection; @@ -8,9 +8,11 @@ import org.eclipse.swt.widgets.Composite; import net.haspamelodica.swt.helper.gcs.TranslatedGC; import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; import net.mograsim.logic.model.LogicUICanvas; +import net.mograsim.logic.model.editor.Editor; import net.mograsim.logic.model.editor.handles.Handle; import net.mograsim.preferences.Preferences; +//TODO: Remove Inheritance public class EditorCanvas extends LogicUICanvas { private Collection handles; @@ -22,7 +24,7 @@ public class EditorCanvas extends LogicUICanvas handles = editor.handleManager.getHandles(); editor.handleManager.addHandleAddedListener(h -> h.addRedrawListener(this::redrawThreadsafe)); - //Is this even necessary? The Handle should be finalized by the gc + //TODO: Is this even necessary? The Handle should be finalized by the gc editor.handleManager.addHandleRemovedListener(h -> h.removeRedrawListener(this::redrawThreadsafe)); addZoomedRenderer(gc -> diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java new file mode 100644 index 00000000..4d5236f6 --- /dev/null +++ b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java @@ -0,0 +1,147 @@ +package net.mograsim.logic.model.editor.ui; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.List; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; + +import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay; +import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator; + +public class EditorGUI +{ + public final Display display; + public final Shell shell; + public final EditorCanvas logicCanvas; + private final List addList; + private final Editor editor; + + public EditorGUI(Editor editor) + { + this.editor = editor; + display = Display.getDefault(); + shell = new Shell(display); + + // Layout + GridLayout layout = new GridLayout(); + shell.setLayout(layout); + layout.numColumns = 2; + + GridData d = new GridData(); + d.grabExcessVerticalSpace = true; + d.verticalAlignment = SWT.FILL; + d.verticalSpan = 2; + addList = new List(shell, SWT.FILL); + addList.setLayoutData(d); + refreshAddList(); + + d = new GridData(); + d.grabExcessHorizontalSpace = true; + d.horizontalAlignment = SWT.FILL; + d.grabExcessVerticalSpace = true; + d.verticalAlignment = SWT.FILL; + + logicCanvas = new EditorCanvas(shell, SWT.TRAIL, editor); + logicCanvas.setLayoutData(d); + + setupToolBar(); + + ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(logicCanvas); + userInput.buttonDrag = 3; + userInput.buttonZoom = 2; + userInput.enableUserInput(); + new ZoomableCanvasOverlay(logicCanvas, null).enableScale(); + } + + private ToolBar setupToolBar() + { + GridData d = new GridData(); + d.grabExcessHorizontalSpace = true; + d.horizontalAlignment = SWT.FILL; + + ToolBar toolBar = new ToolBar(shell, SWT.BORDER); + toolBar.setLayoutData(d); + + ToolItem snappingLabel = new ToolItem(toolBar, SWT.NONE); + snappingLabel.setText("Snapping:"); + + Menu menu = new Menu(shell, SWT.POP_UP); + ToolItem snappSelect = new ToolItem(toolBar, SWT.DROP_DOWN); + for (Editor.Snapping sn : Editor.Snapping.values()) + { + MenuItem item = new MenuItem(menu, SWT.PUSH); + item.addSelectionListener(new SelectionListener() + { + @Override + public void widgetSelected(SelectionEvent arg0) + { + editor.setSnapping(sn); + snappSelect.setText(sn.toString()); + } + + @Override + public void widgetDefaultSelected(SelectionEvent arg0) {} + }); + item.setText(sn.toString()); + } + + snappSelect.setText(editor.getSnapping().toString()); + snappSelect.addListener(SWT.Selection, new Listener() + { + public void handleEvent(Event event) + { + if (event.detail == SWT.ARROW) + { + Rectangle rect = snappSelect.getBounds(); + Point pt = new Point(rect.x, rect.y + rect.height); + pt = toolBar.toDisplay(pt); + menu.setLocation(pt.x, pt.y); + menu.setVisible(true); + } + } + }); + + new ToolItem(toolBar, SWT.SEPARATOR); + + toolBar.pack(); + + return toolBar; + } + + public void refreshAddList() + { + addList.setItems(IndirectGUIComponentCreator.getStandardComponentIDs().toArray(String[]::new)); + addList.select(0); + } + + public String getAddListSelected() + { + String[] selection = addList.getSelection(); + if (selection.length == 0) + throw new IllegalStateException("Selection in the Add Component List may never be empty!"); + return selection[0]; + } + + public void open() + { + shell.open(); + while (!shell.isDisposed()) + if (!display.readAndDispatch()) + display.sleep(); + } + +} -- 2.17.1