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=27699bd9ca0b07c417a970ae7a42138d6e2aaf07;hb=19ee1a7fdb06a1df65cd7df78fed935124496707;hp=b9939afeecf385c1c767d0e338da557c882afbcb;hpb=b2f3d0b16783289fab229c667c18d61f84119bbd;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 b9939afe..27699bd9 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 @@ -15,23 +15,25 @@ import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; import net.mograsim.logic.ui.LogicUIRenderer; import net.mograsim.logic.ui.model.ViewModel; import net.mograsim.logic.ui.model.ViewModelModifiable; -import net.mograsim.logic.ui.model.components.params.GeneralComponentParams; -import net.mograsim.logic.ui.model.components.params.SubComponentParams; -import net.mograsim.logic.ui.model.components.params.RectComponentParams.InnerComponentParams; -import net.mograsim.logic.ui.model.components.params.RectComponentParams.InnerPinParams; -import net.mograsim.logic.ui.model.components.params.RectComponentParams.InnerWireParams; -import net.mograsim.logic.ui.model.components.params.SubComponentParams.InterfacePinParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.ComponentCompositionParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.ComponentCompositionParams.InnerComponentParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.InnerPinParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.InnerWireParams; +import net.mograsim.logic.ui.model.components.SubmodelComponentParams.InterfacePinParams; import net.mograsim.logic.ui.model.wires.GUIWire; +import net.mograsim.logic.ui.model.wires.MovablePin; import net.mograsim.logic.ui.model.wires.Pin; public abstract class SubmodelComponent extends GUIComponent { protected final ViewModelModifiable submodelModifiable; public final ViewModel submodel; - private final Map submodelPinsPerSupermodelPin; - private final Map submodelPinsPerSupermodelPinUnmodifiable; - private final Map supermodelPinsPerSubmodelPin; - private final Map supermodelPinsPerSubmodelPinUnmodifiable; + private final Map submodelPins; + private final Map submodelMovablePinsUnmodifiable; + private final Map submodelUnmovablePinsUnmodifiable; + private final Map supermodelPins; + private final Map supermodelMovablePinsUnmodifiable; + private final Map supermodelUnmovablePinsUnmodifiable; private final SubmodelInterface submodelInterface; private double submodelScale; @@ -44,10 +46,12 @@ public abstract class SubmodelComponent extends GUIComponent super(model); this.submodelModifiable = new ViewModelModifiable(); this.submodel = submodelModifiable; - this.submodelPinsPerSupermodelPin = new HashMap<>(); - this.submodelPinsPerSupermodelPinUnmodifiable = Collections.unmodifiableMap(submodelPinsPerSupermodelPin); - this.supermodelPinsPerSubmodelPin = new HashMap<>(); - this.supermodelPinsPerSubmodelPinUnmodifiable = Collections.unmodifiableMap(supermodelPinsPerSubmodelPin); + this.submodelPins = new HashMap<>(); + this.submodelMovablePinsUnmodifiable = Collections.unmodifiableMap(submodelPins); + this.submodelUnmovablePinsUnmodifiable = Collections.unmodifiableMap(submodelPins); + this.supermodelPins = new HashMap<>(); + this.supermodelMovablePinsUnmodifiable = Collections.unmodifiableMap(supermodelPins); + this.supermodelUnmovablePinsUnmodifiable = Collections.unmodifiableMap(supermodelPins); this.submodelInterface = new SubmodelInterface(submodelModifiable); this.submodelScale = 1; @@ -62,8 +66,8 @@ public abstract class SubmodelComponent extends GUIComponent { this.submodelScale = submodelScale; - for (Entry e : supermodelPinsPerSubmodelPin.entrySet()) - e.getKey().setRelPos(e.getValue().getRelX() * submodelScale, e.getValue().getRelY() * submodelScale); + for (Entry e : supermodelPins.entrySet()) + getSubmodelMovablePin(e.getKey()).setRelPos(e.getValue().getRelX() * submodelScale, e.getValue().getRelY() * submodelScale); requestRedraw();// needed if there is no submodel interface pin } @@ -76,72 +80,86 @@ public abstract class SubmodelComponent extends GUIComponent /** * Returns the submodel pin. */ - protected Pin addSubmodelInterface(int logicWidth, double relX, double relY) + protected Pin addSubmodelInterface(String name, int logicWidth, double relX, double relY) { - PinMovable submodelPin = new PinMovable(submodelInterface, logicWidth, relX / submodelScale, relY / submodelScale); - submodelInterface.addPin(submodelPin); + MovablePin submodelPin = new MovablePin(submodelInterface, name, logicWidth, relX / submodelScale, relY / submodelScale); + MovablePin supermodelPin = new MovablePin(this, name, logicWidth, relX, relY); - PinMovable supermodelPin = new PinMovable(this, logicWidth, relX, relY); - addPin(supermodelPin); + submodelPin.addPinMovedListener(p -> + { + double newRelX = p.getRelX() * submodelScale; + double newRelY = p.getRelY() * submodelScale; + if (supermodelPin.getRelX() != newRelX || supermodelPin.getRelY() != newRelY) + supermodelPin.setRelPos(newRelX, newRelY); + }); + supermodelPin.addPinMovedListener(p -> + { + double newRelX = p.getRelX() / submodelScale; + double newRelY = p.getRelY() / submodelScale; + if (submodelPin.getRelX() != newRelX || submodelPin.getRelY() != newRelY) + submodelPin.setRelPos(newRelX, newRelY); + }); - submodelPinsPerSupermodelPin.put(supermodelPin, submodelPin); - supermodelPinsPerSubmodelPin.put(submodelPin, supermodelPin); + submodelInterface.addPin(submodelPin); + super.addPin(supermodelPin); + + submodelPins.put(name, submodelPin); + supermodelPins.put(name, supermodelPin); // no need to call requestRedraw() because addPin() will request a redraw return submodelPin; } - protected void moveSubmodelInterface(Pin supermodelPin, double relX, double relY) + protected void removeSubmodelInterface(String name) { - PinMovable submodelPin = getSubmodelMovablePin(supermodelPin); - PinMovable supermodelPinMovable = getSupermodelMovablePin(submodelPin); + super.removePin(name); + Pin submodelPin = getSubmodelMovablePin(name); + submodelInterface.removePin(submodelPin.name); - submodelPin.setRelPos(relX / submodelScale, relY / submodelScale); - supermodelPinMovable.setRelPos(relX, relY); + submodelPins.remove(name); + supermodelPins.remove(name); - // no need to call requestRedraw() because setRelPos() will request a redraw + // no need to call requestRedraw() because removePin() will request a redraw } - protected void removeSubmodelInterface(Pin supermodelPin) + public Map getSubmodelPins() { - removePin(supermodelPin); - Pin submodelPin = getSubmodelMovablePin(supermodelPin); - submodelInterface.removePin(submodelPin); - - submodelPinsPerSupermodelPin.remove(supermodelPin); - supermodelPinsPerSubmodelPin.remove(submodelPin); + return submodelUnmovablePinsUnmodifiable; + } - // no need to call requestRedraw() because removePin() will request a redraw + public Pin getSubmodelPin(String name) + { + return getSubmodelMovablePin(name); } - public Map getSupermodelPinsPerSubmodelPin() + protected Map getSubmodelMovablePins() { - return supermodelPinsPerSubmodelPinUnmodifiable; + return submodelMovablePinsUnmodifiable; } - public Pin getSupermodelPin(Pin submodelPin) + protected MovablePin getSubmodelMovablePin(String name) { - return getSupermodelMovablePin(submodelPin); + return submodelPins.get(name); } - protected PinMovable getSupermodelMovablePin(Pin submodelPin) + public Map getSupermodelPins() { - return supermodelPinsPerSubmodelPin.get(submodelPin); + return supermodelUnmovablePinsUnmodifiable; } - public Map getSubmodelPinsPerSupermodelPin() + public Pin getSupermodelPin(String name) { - return submodelPinsPerSupermodelPinUnmodifiable; + return getSupermodelMovablePin(name); } - public Pin getSubmodelPin(Pin supermodelPin) + protected Map getSupermodelMovablePins() { - return getSubmodelMovablePin(supermodelPin); + return supermodelMovablePinsUnmodifiable; } - protected PinMovable getSubmodelMovablePin(Pin supermodelPin) + protected MovablePin getSupermodelMovablePin(String name) { - return submodelPinsPerSupermodelPin.get(supermodelPin); + return supermodelPins.get(name); } @Override @@ -196,37 +214,27 @@ public abstract class SubmodelComponent extends GUIComponent return true; } - private static class PinMovable extends Pin - { - public PinMovable(GUIComponent component, int logicWidth, double relX, double relY) - { - super(component, logicWidth, relX, relY); - } - - @Override - protected void setRelPos(double relX, double relY) - { - super.setRelPos(relX, relY); - } - } - - public SubComponentParams calculateParams() + /** + * @return {@link SubmodelComponentParams}, which describe this {@link SubmodelComponent}. + */ + public SubmodelComponentParams calculateParams() { - SubComponentParams params = new SubComponentParams(); + SubmodelComponentParams params = new SubmodelComponentParams(); + params.type = SubmodelComponent.class.getSimpleName(); params.composition = calculateCompositionParams(); Rectangle bounds = getBounds(); params.width = bounds.width; params.height = bounds.height; - List pinList = pinsUnmodifiable; - InterfacePinParams[] iPins = new InterfacePinParams[pinList.size()]; + InterfacePinParams[] iPins = new InterfacePinParams[getPins().size()]; int i = 0; - for (Pin p : pinList) + for (Pin p : getPins()) { InterfacePinParams iPinParams = new InterfacePinParams(); iPins[i] = iPinParams; iPinParams.location = p.getRelPos(); + iPinParams.name = p.name; iPinParams.logicWidth = p.logicWidth; i++; } @@ -234,9 +242,9 @@ public abstract class SubmodelComponent extends GUIComponent return params; } - protected GeneralComponentParams calculateCompositionParams() + protected ComponentCompositionParams calculateCompositionParams() { - GeneralComponentParams params = new GeneralComponentParams(); + ComponentCompositionParams params = new ComponentCompositionParams(); params.innerScale = getSubmodelScale(); List compList = submodelModifiable.getComponents(); @@ -249,7 +257,7 @@ public abstract class SubmodelComponent extends GUIComponent GUIComponent component = componentIt.next(); InnerComponentParams inner = new InnerComponentParams(); comps[i] = inner; - inner.logicWidth = component.getPins().get(0).logicWidth; // This could be done a little more elegantly + 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.type = component.getIdentifier(); @@ -266,9 +274,9 @@ public abstract class SubmodelComponent extends GUIComponent wires[i] = inner; InnerPinParams pin1Params = new InnerPinParams(), pin2Params = new InnerPinParams(); - pin1Params.pinIndex = wire.getPin1().component.getPins().indexOf(wire.getPin1()); + pin1Params.pinName = wire.getPin1().name; pin1Params.compId = compList.indexOf(wire.getPin1().component); - pin2Params.pinIndex = wire.getPin2().component.getPins().indexOf(wire.getPin2()); + pin2Params.pinName = wire.getPin2().name; pin2Params.compId = compList.indexOf(wire.getPin2().component); inner.pin1 = pin1Params; inner.pin2 = pin2Params; @@ -278,4 +286,16 @@ public abstract class SubmodelComponent extends GUIComponent params.innerWires = wires; return params; } + + @Override + protected void addPin(Pin pin) + { + throw new UnsupportedOperationException("Can't add pins to a SubmodelComponent directly, call addSubmodelInterface instead"); + } + + @Override + protected void removePin(String name) + { + throw new UnsupportedOperationException("Can't remove pins of a SubmodelComponent directly, call removeSubmodelInterface instead"); + } } \ No newline at end of file