package net.mograsim.logic.model.editor;
+import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
+import com.google.gson.JsonNull;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonSyntaxException;
import net.haspamelodica.swt.helper.swtobjectwrappers.Point;
import net.mograsim.logic.model.editor.handles.ComponentHandle;
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;
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);
dialogManager = new DialogManager(gui.shell);
toBeEdited.submodel.addComponentRemovedListener(c -> identifierPerComponent.remove(c));
-
+
gui.open();
}
-
+
public ViewModelModifiable getSubmodel()
{
return toBeEdited.getSubmodelModifiable();
return selection;
}
- //TODO: Remove this error prone method: Relative offset may change between multiple moves,
- //because Handles have different ways of responding to reqMove(...), causing strange behaviour
+ // TODO: Remove this error prone method: Relative offset may change between multiple moves,
+ // because Handles have different ways of responding to reqMove(...), causing strange behaviour
@Deprecated
public void moveSelection(double x, double y)
{
c.reqMove(newX, newY);
}
}
-
+
public void moveHandles(double x, double y, Map<Handle, Point> handleOffsetMap)
{
Point snapped = new Point(x, y);
for (Handle h : selection)
{
Optional<ComponentInfo> cInfo = h.reqCopy(refPoint);
- if(cInfo.isPresent())
+ if (cInfo.isPresent())
copyBuffer.add(cInfo.get());
}
}
}
moveSelection(x, y);
}
-
+
public void save()
{
saveManager.save();
}
+ public void saveAs()
+ {
+ saveManager.openSaveAsDialog();
+ }
+
public void addComponent(double x, double y)
{
- GUIComponent c = addComponent(gui.getAddListSelected(), new JsonObject());
- selection.clear();
- selection.add(handleManager.getHandle(c));
- moveSelection(x, y);
+ boolean successful = false;
+ JsonElement params = JsonNull.INSTANCE;
+ outer: while (!successful)
+ {
+ String selected = gui.getAddListSelected();
+ try
+ {
+ GUIComponent c = addComponent(selected, params);
+ selection.clear();
+ selection.add(handleManager.getHandle(c));
+ moveSelection(x, y);
+ successful = true;
+ }
+ catch (@SuppressWarnings("unused") UnsupportedOperationException | JsonSyntaxException | NumberFormatException e)
+ {
+ String result = DialogManager.openMultiLineTextDialog("Add component", "Create", "Cancel", "Parameters:");
+ if (result == null)
+ break outer;
+ params = new JsonParser().parse(result);
+ }
+ }
}
-
+
private GUIComponent addComponent(String identifier, JsonElement params)
{
- GUIComponent comp = IndirectGUIComponentCreator.createComponent(toBeEdited.getSubmodelModifiable(), identifier,
- params);
+ GUIComponent comp = IndirectGUIComponentCreator.createComponent(toBeEdited.getSubmodelModifiable(), identifier, params);
identifierPerComponent.put(comp, identifier);
return comp;
}
-
+
public static String getIdentifier(GUIComponent c)
{
return identifierPerComponent.get(c);
case OFF:
break;
case ABSOLUTE:
- newP.x -= newP.x % snapX;
- newP.y -= newP.y % snapY;
+ newP.x = (int) (newP.x / snapX + .5) * snapX;
+ newP.y = (int) (newP.y / snapY + .5) * snapY;
+ break;
+ default:
break;
}
}
public final double relX, relY;
public final String identifier;
public final JsonElement params;
-
+
public ComponentInfo(double relX, double relY, String identifier, JsonElement params)
{
this.relX = relX;
}
}
- public Point getCanvasMousePosition()
+ @SuppressWarnings("unused")
+ public void addWire(PinHandle a, PinHandle b)
{
- //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);
+ new GUIWire(toBeEdited.getSubmodelModifiable(), a.getPin(), b.getPin(), new Point[0]);
}
- public Point getWorldMousePosition()
+ public static enum Snapping
{
- return gui.logicCanvas.canvasToWorldCoords(getCanvasMousePosition());
+ OFF, ABSOLUTE;
+
+ @Override
+ public String toString()
+ {
+ return super.toString().toLowerCase();
+ }
}
- public void addWire(PinHandle a, PinHandle b)
+ public static void main(String[] args) throws IOException
{
- new GUIWire(toBeEdited.getSubmodelModifiable(), a.getPin(), b.getPin(), new Point[0]);
+ SaveLoadManager.openLoadDialog();
}
- public static enum Snapping
+ public Snapping getSnapping()
{
- OFF, ABSOLUTE;
+ return snapping;
}
-
- public static void main(String[] args)
+
+ public void setSnapping(Snapping snapping)
{
- SaveLoadManager.openLoadDialog();
+ this.snapping = snapping;
}
}