Changed SubmodelComponent.addSubmodelInterface() interface
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / model / components / SubmodelComponent.java
index 27699bd..5756057 100644 (file)
@@ -80,10 +80,13 @@ public abstract class SubmodelComponent extends GUIComponent
        /**
         * Returns the submodel pin.
         */
-       protected Pin addSubmodelInterface(String name, int logicWidth, double relX, double relY)
+       protected Pin addSubmodelInterface(MovablePin supermodelPin)
        {
-               MovablePin submodelPin = new MovablePin(submodelInterface, name, logicWidth, relX / submodelScale, relY / submodelScale);
-               MovablePin supermodelPin = new MovablePin(this, name, logicWidth, relX, relY);
+               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);
 
                submodelPin.addPinMovedListener(p ->
                {
@@ -101,7 +104,6 @@ public abstract class SubmodelComponent extends GUIComponent
                });
 
                submodelInterface.addPin(submodelPin);
-               super.addPin(supermodelPin);
 
                submodelPins.put(name, submodelPin);
                supermodelPins.put(name, supermodelPin);
@@ -165,13 +167,10 @@ public abstract class SubmodelComponent extends GUIComponent
        @Override
        public void render(GeneralGC gc, Rectangle visibleRegion)
        {
-               double posX = getBounds().x;
-               double posY = getBounds().y;
-
                GCConfig conf = new GCConfig(gc);
-               TranslatedGC tgc = new TranslatedGC(gc, posX, posY, submodelScale, true);
+               TranslatedGC tgc = new TranslatedGC(gc, getPosX(), getPosY(), submodelScale, true);
                conf.reset(tgc);
-               double visibleRegionFillRatio = Math.max(getBounds().width / visibleRegion.width, getBounds().height / visibleRegion.height);
+               double visibleRegionFillRatio = Math.max(getWidth() / visibleRegion.width, getHeight() / visibleRegion.height);
                double alphaFactor = map(visibleRegionFillRatio, maxVisibleRegionFillRatioForAlpha0, minVisibleRegionFillRatioForAlpha1, 0, 1);
                alphaFactor = Math.max(0, Math.min(1, alphaFactor));
                // we need to take the old alpha into account to support nested submodules better.
@@ -181,7 +180,7 @@ public abstract class SubmodelComponent extends GUIComponent
                if (submodelAlpha != 0)
                {
                        gc.setAlpha(submodelAlpha);
-                       renderer.render(tgc, visibleRegion.translate(posX / submodelScale, posY / submodelScale, 1 / submodelScale));
+                       renderer.render(tgc, visibleRegion.translate(getPosX() / submodelScale, getPosY() / submodelScale, 1 / submodelScale));
                }
                if (labelAlpha != 0)
                {
@@ -205,13 +204,12 @@ public abstract class SubmodelComponent extends GUIComponent
        @Override
        public boolean clicked(double x, double y)
        {
-               // TODO
-               double scaledX = (x - getBounds().x) / submodelScale;
-               double scaledY = (y - getBounds().y) / submodelScale;
-               double roundedScaledX = Math.round(scaledX / 5 * 2) * 5 / 2.;
-               double roundedScaledY = Math.round(scaledY / 5 * 2) * 5 / 2.;
-               System.out.println(scaledX + "|" + scaledY + ", rounded " + roundedScaledX + "|" + roundedScaledY);
-               return true;
+               double scaledX = (x - getPosX()) / submodelScale;
+               double scaledY = (y - getPosY()) / submodelScale;
+               for (GUIComponent component : submodel.getComponents())
+                       if (component.getBounds().contains(scaledX, scaledY) && component.clicked(scaledX, scaledY))
+                               return true;
+               return false;
        }
 
        /**
@@ -223,13 +221,12 @@ public abstract class SubmodelComponent extends GUIComponent
                params.type = SubmodelComponent.class.getSimpleName();
                params.composition = calculateCompositionParams();
 
-               Rectangle bounds = getBounds();
-               params.width = bounds.width;
-               params.height = bounds.height;
+               params.width = getWidth();
+               params.height = getHeight();
 
                InterfacePinParams[] iPins = new InterfacePinParams[getPins().size()];
                int i = 0;
-               for (Pin p : getPins())
+               for (Pin p : getPins().values())
                {
                        InterfacePinParams iPinParams = new InterfacePinParams();
                        iPins[i] = iPinParams;
@@ -257,9 +254,8 @@ public abstract class SubmodelComponent extends GUIComponent
                        GUIComponent component = componentIt.next();
                        InnerComponentParams inner = new InnerComponentParams();
                        comps[i] = inner;
-                       inner.logicWidth = component.getPins().iterator().next().logicWidth; // TODO This could be done a little more elegantly
-                       Rectangle bounds = component.getBounds();
-                       inner.pos = new Point(bounds.x, bounds.y);
+                       inner.params = component.getInstantiationParameters();
+                       inner.pos = new Point(getPosX(), getPosY());
                        inner.type = component.getIdentifier();
                        i++;
                }