X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;ds=inline;f=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2Fcomponents%2Fsubmodels%2FSubmodelComponent.java;h=bcf85aeed0684b487a8c1fc91604739987a2339b;hb=4b580a621ec0b174c70b1d9e3937f46394656aef;hp=6ca770539ba4cfe652616208e53f9c5e25089898;hpb=e104b507f81eebed56d923d5b0629f72d68d8b5a;p=Mograsim.git
diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java
index 6ca77053..bcf85aee 100644
--- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java
+++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java
@@ -16,13 +16,18 @@ import net.mograsim.logic.model.model.ViewModelModifiable;
import net.mograsim.logic.model.model.components.GUIComponent;
import net.mograsim.logic.model.model.wires.MovablePin;
import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.model.wires.PinUsage;
+import net.mograsim.logic.model.serializing.IdentifierGetter;
+import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator;
+import net.mograsim.logic.model.serializing.SubmodelComponentParams;
+import net.mograsim.logic.model.serializing.SubmodelComponentSerializer;
import net.mograsim.logic.model.snippets.Renderer;
+import net.mograsim.logic.model.util.JsonHandler;
/**
* A {@link GUIComponent} consisting of another model. A SubmodelComponent
can have so-called "interface pins" connecting the
* inner and outer models.
*/
-//TODO override getParams
public abstract class SubmodelComponent extends GUIComponent
{
public static final String SUBMODEL_INTERFACE_NAME = "_submodelinterface";
@@ -107,8 +112,8 @@ public abstract class SubmodelComponent extends GUIComponent
this.submodelInterface = new SubmodelInterface(submodelModifiable, SUBMODEL_INTERFACE_NAME);
this.submodelScale = 1;
- this.maxVisibleRegionFillRatioForAlpha0 = 0.0;
- this.minVisibleRegionFillRatioForAlpha1 = 0.0;
+ this.maxVisibleRegionFillRatioForAlpha0 = 0.8;
+ this.minVisibleRegionFillRatioForAlpha1 = 0.9;
this.renderer = new LogicUIRenderer(submodelModifiable);
Consumer redrawHandlerChangedListener = submodelModifiable::setRedrawHandler;
@@ -137,8 +142,24 @@ public abstract class SubmodelComponent extends GUIComponent
super.addPin(supermodelPin);// do this first to be fail-fast if the supermodel does not belong to this component
String name = supermodelPin.name;
- MovablePin submodelPin = new MovablePin(submodelInterface, name, supermodelPin.logicWidth, supermodelPin.getRelX() / submodelScale,
- supermodelPin.getRelY() / submodelScale);
+ // TODO if we upgrade to Java 12, replace with switch-expression
+ PinUsage submodelPinUsage;
+ switch (supermodelPin.usage)
+ {
+ case INPUT:
+ submodelPinUsage = PinUsage.OUTPUT;
+ break;
+ case OUTPUT:
+ submodelPinUsage = PinUsage.INPUT;
+ break;
+ case TRISTATE:
+ submodelPinUsage = PinUsage.TRISTATE;
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown enum constant: " + supermodelPin.usage);
+ }
+ MovablePin submodelPin = new MovablePin(submodelInterface, name, supermodelPin.logicWidth, submodelPinUsage,
+ supermodelPin.getRelX() / submodelScale, supermodelPin.getRelY() / submodelScale);
submodelPin.addPinMovedListener(p ->
{
@@ -329,6 +350,17 @@ public abstract class SubmodelComponent extends GUIComponent
return outlineRenderer;
}
+ @Override
+ public boolean clicked(double x, double y)
+ {
+ double scaledX = (x - getPosX()) / submodelScale;
+ double scaledY = (y - getPosY()) / submodelScale;
+ for (GUIComponent component : submodel.getComponentsByName().values())
+ if (component.getBounds().contains(scaledX, scaledY) && component.clicked(scaledX, scaledY))
+ return true;
+ return false;
+ }
+
@Override
public void render(GeneralGC gc, Rectangle visibleRegion)
{
@@ -384,15 +416,12 @@ public abstract class SubmodelComponent extends GUIComponent
return mapMin + (val - valMin) * (mapMax - mapMin) / (valMax - valMin);
}
+ // serializing
+
@Override
- public boolean clicked(double x, double y)
+ public SubmodelComponentParams getParamsForSerializing(IdentifierGetter idGetter)
{
- double scaledX = (x - getPosX()) / submodelScale;
- double scaledY = (y - getPosY()) / submodelScale;
- for (GUIComponent component : submodel.getComponentsByName().values())
- if (component.getBounds().contains(scaledX, scaledY) && component.clicked(scaledX, scaledY))
- return true;
- return false;
+ return SubmodelComponentSerializer.serialize(this, idGetter);
}
// operations no longer supported
@@ -408,4 +437,10 @@ public abstract class SubmodelComponent extends GUIComponent
{
throw new UnsupportedOperationException("Can't remove pins of a SubmodelComponent directly, call removeSubmodelInterface instead");
}
+
+ static
+ {
+ IndirectGUIComponentCreator.setComponentSupplier(SubmodelComponent.class.getCanonicalName(),
+ (m, p, n) -> SubmodelComponentSerializer.deserialize(m, JsonHandler.fromJsonTree(p, SubmodelComponentParams.class), n));
+ }
}
\ No newline at end of file