X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.ui%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fui%2Fmodel%2Fcomponents%2FSimpleRectangularSubmodelComponent.java;h=558df2493355004078d7709e4d016d9b7de8da72;hb=ae74a6a022756a4cc7ee5b453ad7a68e13832788;hp=f537eec220296ec27940a7bbc2a22bbe33548367;hpb=ddb921f849b4393fd01e70de4447865d09bb9daa;p=Mograsim.git diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SimpleRectangularSubmodelComponent.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SimpleRectangularSubmodelComponent.java index f537eec2..558df249 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SimpleRectangularSubmodelComponent.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/components/SimpleRectangularSubmodelComponent.java @@ -2,25 +2,26 @@ package net.mograsim.logic.ui.model.components; import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.TreeMap; import net.haspamelodica.swt.helper.gcs.GeneralGC; import net.haspamelodica.swt.helper.swtobjectwrappers.Font; import net.haspamelodica.swt.helper.swtobjectwrappers.Point; import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; import net.mograsim.logic.ui.model.ViewModelModifiable; -import net.mograsim.logic.ui.model.components.ComponentParams.InnerComponentParams; -import net.mograsim.logic.ui.model.components.ComponentParams.InnerPinParams; -import net.mograsim.logic.ui.model.components.ComponentParams.InnerWireParams; -import net.mograsim.logic.ui.model.wires.GUIWire; import net.mograsim.logic.ui.model.wires.Pin; public class SimpleRectangularSubmodelComponent extends SubmodelComponent { + public static String kLabel = "label", kInCount = "input_count", kOutCount = "output_count", kLogicWidth = "logic_width"; + private static final double width = 35; private static final double pinDistance = 10; - private static final double fontHeight = 5; + private static final double pinNameMargin = .5; + private static final double labelFontHeight = 5; + private static final double pinNameFontHeight = 3.5; private final String label; protected final int logicWidth; @@ -49,8 +50,9 @@ public class SimpleRectangularSubmodelComponent extends SubmodelComponent this.outputSubmodelPinsUnmodifiable = Collections.unmodifiableList(outputSubmodelPins); } - protected void setInputCount(int inputCount) + protected void setInputPins(String... pinNames) { + int inputCount = pinNames.length; int oldInputCount = inputSupermodelPins.size(); double height = Math.max(inputCount, outputSupermodelPins.size()) * pinDistance; setSize(width, height); @@ -58,34 +60,55 @@ public class SimpleRectangularSubmodelComponent extends SubmodelComponent while (inputSupermodelPins.size() > inputCount) { inputSubmodelPins.remove(inputCount); - removePin(inputSupermodelPins.remove(inputCount)); + removeSubmodelInterface(inputSupermodelPins.remove(inputCount)); } else if (oldInputCount < inputCount) for (int i = oldInputCount; i < inputCount; i++) { - Pin submodelPin = addSubmodelInterface(logicWidth, 0, pinDistance / 2 + i * pinDistance); + Pin submodelPin = addSubmodelInterface(pinNames[i], logicWidth, 0, pinDistance / 2 + i * pinDistance); inputSubmodelPins.add(submodelPin); inputSupermodelPins.add(getSupermodelPin(submodelPin)); } + for (int i = 0; i < Math.min(oldInputCount, inputCount); i++) + { + if (!inputSubmodelPins.get(i).name.equals(pinNames[i])) + { + removeSubmodelInterface(inputSupermodelPins.get(i)); + Pin submodelPin = addSubmodelInterface(pinNames[i], logicWidth, 0, pinDistance / 2 + i * pinDistance); + inputSubmodelPins.set(i, submodelPin); + inputSupermodelPins.set(i, getSupermodelPin(submodelPin)); + } + } } - protected void setOutputCount(int outputCount) + protected void setOutputPins(String... pinNames) { + int outputCount = pinNames.length; int oldOutputCount = outputSupermodelPins.size(); setSize(width, Math.max(inputSupermodelPins.size(), outputCount) * pinDistance); if (oldOutputCount > outputCount) while (outputSupermodelPins.size() > outputCount) { outputSubmodelPins.remove(outputCount); - removePin(outputSupermodelPins.get(outputCount)); + removeSubmodelInterface(outputSupermodelPins.get(outputCount)); } else if (oldOutputCount < outputCount) for (int i = oldOutputCount; i < outputCount; i++) { - Pin submodelPin = addSubmodelInterface(logicWidth, width, pinDistance / 2 + i * pinDistance); + Pin submodelPin = addSubmodelInterface(pinNames[i], logicWidth, width, pinDistance / 2 + i * pinDistance); outputSubmodelPins.add(submodelPin); outputSupermodelPins.add(getSupermodelPin(submodelPin)); } + for (int i = 0; i < Math.min(oldOutputCount, outputCount); i++) + { + if (!outputSubmodelPins.get(i).name.equals(pinNames[i])) + { + removeSubmodelInterface(outputSupermodelPins.get(i)); + Pin submodelPin = addSubmodelInterface(pinNames[i], logicWidth, width, pinDistance / 2 + i * pinDistance); + outputSubmodelPins.set(i, submodelPin); + outputSupermodelPins.set(i, getSupermodelPin(submodelPin)); + } + } } public List getInputPins() @@ -115,10 +138,23 @@ public class SimpleRectangularSubmodelComponent extends SubmodelComponent double posY = getBounds().y; Font oldFont = gc.getFont(); - Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); - gc.setFont(labelFont); + gc.setFont(new Font(oldFont.getName(), labelFontHeight, oldFont.getStyle())); Point textExtent = gc.textExtent(label); gc.drawText(label, posX + (getBounds().width - textExtent.x) / 2, posY + (getBounds().height - textExtent.y) / 2, true); + gc.setFont(new Font(oldFont.getName(), pinNameFontHeight, oldFont.getStyle())); + for (int i = 0; i < inputSupermodelPins.size(); i++) + { + String pinName = inputSupermodelPins.get(i).name; + textExtent = gc.textExtent(pinName); + gc.drawText(pinName, posX + pinNameMargin, posY + i * pinDistance + (pinDistance - textExtent.y) / 2, true); + } + for (int i = 0; i < outputSupermodelPins.size(); i++) + { + String pinName = outputSupermodelPins.get(i).name; + textExtent = gc.textExtent(pinName); + gc.drawText(pinName, posX + width - textExtent.x - pinNameMargin, posY + i * pinDistance + (pinDistance - textExtent.y) / 2, + true); + } gc.setFont(oldFont); } @@ -128,55 +164,17 @@ public class SimpleRectangularSubmodelComponent extends SubmodelComponent gc.drawRectangle(getBounds()); } - public ComponentParams calculateParams() + @Override + public SubmodelComponentParams calculateParams() { - ComponentParams params = new ComponentParams(); - params.displayName = label; - params.inputCount = inputSupermodelPins.size(); - params.outputCount = outputSubmodelPins.size(); - params.logicWidth = logicWidth; - params.innerScale = getSubmodelScale(); - - List compList = submodelModifiable.getComponents(); - Iterator componentIt = compList.iterator(); - componentIt.next(); // Skip inner SubmodelInterface - InnerComponentParams[] comps = new InnerComponentParams[compList.size() - 1]; - int i = 0; - while (componentIt.hasNext()) - { - 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 - Rectangle bounds = component.getBounds(); - inner.pos = new Point(bounds.x, bounds.y); - if (component instanceof GUICustomComponent) - inner.type = "file:" + ((GUICustomComponent) component).getPath(); - else - inner.type = "class:" + component.getClass().getCanonicalName(); - i++; - } - params.subComps = comps; - - List wireList = submodelModifiable.getWires(); - InnerWireParams wires[] = new InnerWireParams[wireList.size()]; - i = 0; - for (GUIWire wire : wireList) - { - InnerWireParams inner = new InnerWireParams(); - wires[i] = inner; - InnerPinParams pin1Params = new InnerPinParams(), pin2Params = new InnerPinParams(); - - pin1Params.pinIndex = wire.getPin1().component.getPins().indexOf(wire.getPin1()); - pin1Params.compId = compList.indexOf(wire.getPin1().component); - pin2Params.pinIndex = wire.getPin2().component.getPins().indexOf(wire.getPin2()); - pin2Params.compId = compList.indexOf(wire.getPin2().component); - inner.pin1 = pin1Params; - inner.pin2 = pin2Params; - inner.path = wire.getPath(); - i++; - } - params.innerWires = wires; - return params; + SubmodelComponentParams ret = super.calculateParams(); + ret.type = SimpleRectangularSubmodelComponent.class.getSimpleName(); + Map m = new TreeMap<>(); + m.put(kLabel, label); + m.put(kInCount, inputSupermodelPins.size()); + m.put(kOutCount, outputSupermodelPins.size()); + m.put(kLogicWidth, logicWidth); + ret.specialized = m; + return ret; } } \ No newline at end of file