X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.ui%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fui%2Fmodel%2Fcomponents%2FSubmodelComponent.java;h=57560574ee3211687c1b718ea0a48ae96eb4eb2c;hb=7fff8ff23871cf904cb95c92305e903fbba3d773;hp=27699bd9ca0b07c417a970ae7a42138d6e2aaf07;hpb=19ee1a7fdb06a1df65cd7df78fed935124496707;p=Mograsim.git diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SubmodelComponent.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SubmodelComponent.java index 27699bd9..57560574 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SubmodelComponent.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SubmodelComponent.java @@ -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++; }