package net.mograsim.logic.model.editor;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
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.am2900.Am2900Loader;
import net.mograsim.logic.model.editor.handles.ComponentHandle;
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.model.ViewModelModifiable;
-import net.mograsim.logic.model.model.components.GUIComponent;
-import net.mograsim.logic.model.model.wires.GUIWire;
+import net.mograsim.logic.model.editor.ui.DialogManager;
+import net.mograsim.logic.model.editor.ui.EditorGUI;
+import net.mograsim.logic.model.model.LogicModelModifiable;
+import net.mograsim.logic.model.model.components.ModelComponent;
+import net.mograsim.logic.model.model.wires.ModelWire;
import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent;
-import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator;
+import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
+import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler;
+import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer;
+import net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer;
public final class Editor
{
final Set<ComponentInfo> copyBuffer = new HashSet<>();
public final DeserializedSubmodelComponent toBeEdited;
public final HandleManager handleManager;
- final static Map<GUIComponent, String> identifierPerComponent = new HashMap<>();
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()
+
+ public LogicModelModifiable 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());
}
}
selection.clear();
for (ComponentInfo info : copyBuffer)
{
- GUIComponent comp = addComponent(info.identifier, info.params);
+ ModelComponent comp = addComponent(info.identifier, info.params);
ComponentHandle h = handleManager.getHandle(comp);
h.reqMove(info.relX, info.relY);
selection.add(h);
}
moveSelection(x, y);
}
-
+
public void save()
{
saveManager.save();
}
- public void addComponent(double x, double y)
+ public void saveAs()
{
- GUIComponent c = addComponent(gui.getAddListSelected(), new JsonObject());
- selection.clear();
- selection.add(handleManager.getHandle(c));
- moveSelection(x, y);
+ saveManager.openSaveAsDialog();
}
-
- private GUIComponent addComponent(String identifier, JsonElement params)
+
+ public void addComponent(double x, double y)
{
- GUIComponent comp = IndirectGUIComponentCreator.createComponent(toBeEdited.getSubmodelModifiable(), identifier,
- params);
- identifierPerComponent.put(comp, identifier);
- return comp;
+ boolean successful = false;
+ JsonElement params = JsonNull.INSTANCE;
+ outer: while (!successful)
+ {
+ String selected = gui.getAddListSelected();
+ try
+ {
+ ModelComponent c = addComponent(selected, params);
+ selection.clear();
+ selection.add(handleManager.getHandle(c));
+ moveSelection(x, y);
+ successful = true;
+ }
+ catch (@SuppressWarnings("unused") UnsupportedOperationException | JsonSyntaxException | NumberFormatException
+ | NullPointerException e)
+ {
+ String result = DialogManager.openMultiLineTextDialog("Add component", "Create", "Cancel", "Parameters:");
+ if (result == null)
+ break outer;
+ params = new JsonParser().parse(result);
+ }
+ }
}
-
- public static String getIdentifier(GUIComponent c)
+
+ private ModelComponent addComponent(String identifier, JsonElement params)
{
- return identifierPerComponent.get(c);
+ return IndirectModelComponentCreator.createComponent(toBeEdited.getSubmodelModifiable(), identifier, params);
}
public void duplicate()
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)
+ {
+ new ModelWire(toBeEdited.getSubmodelModifiable(), a.getPin(), b.getPin(), new Point[0]);
+ }
+
+ public static enum Snapping
{
- //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);
+ OFF, ABSOLUTE;
+
+ @Override
+ public String toString()
+ {
+ return super.toString().toLowerCase();
+ }
}
- public Point getWorldMousePosition()
+ public static void main(String[] args)
{
- return gui.logicCanvas.canvasToWorldCoords(getCanvasMousePosition());
+ Am2900Loader.setup();
+ openNewEditor();
+// SaveLoadManager.openLoadDialog();
}
- public void addWire(PinHandle a, PinHandle b)
+ public static void openNewEditor()
{
- new GUIWire(toBeEdited.getSubmodelModifiable(), a.getPin(), b.getPin(), new Point[0]);
+ DeserializedSubmodelComponent toBeEdited = new DeserializedSubmodelComponent(new LogicModelModifiable(), null, null, null);
+ toBeEdited.setOutlineRenderer(new DefaultOutlineRenderer(toBeEdited));
+ toBeEdited.setSymbolRenderer(new DefaultSymbolRenderer(toBeEdited));
+ toBeEdited.setHighLevelStateHandler(new DefaultHighLevelStateHandler());
+ new Editor(toBeEdited);
}
- 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;
}
}