X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=net.mograsim.logic.ui%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fui%2Fmodel%2Fcomponents%2FSubmodelComponent.java;h=b9939afeecf385c1c767d0e338da557c882afbcb;hb=b2f3d0b16783289fab229c667c18d61f84119bbd;hp=eae636a9f9d4ca2e85b38c09cb209c013be57140;hpb=f4ecc0a914889474581caf5f4da0dad7a410ae3c;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 eae636a9..b9939afe 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 @@ -2,19 +2,29 @@ package net.mograsim.logic.ui.model.components; import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Map.Entry; -import net.haspamelodica.swt.helper.gcs.GCDefaultConfig; +import net.haspamelodica.swt.helper.gcs.GCConfig; import net.haspamelodica.swt.helper.gcs.GeneralGC; import net.haspamelodica.swt.helper.gcs.TranslatedGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; 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.wires.GUIWire; import net.mograsim.logic.ui.model.wires.Pin; -public class SubmodelComponent extends GUIComponent +public abstract class SubmodelComponent extends GUIComponent { protected final ViewModelModifiable submodelModifiable; public final ViewModel submodel; @@ -41,7 +51,7 @@ public class SubmodelComponent extends GUIComponent this.submodelInterface = new SubmodelInterface(submodelModifiable); this.submodelScale = 1; - this.maxVisibleRegionFillRatioForAlpha0 = 0.1; + this.maxVisibleRegionFillRatioForAlpha0 = 0.4; this.minVisibleRegionFillRatioForAlpha1 = 0.8; this.renderer = new LogicUIRenderer(submodelModifiable); @@ -58,6 +68,11 @@ public class SubmodelComponent extends GUIComponent requestRedraw();// needed if there is no submodel interface pin } + protected double getSubmodelScale() + { + return submodelScale; + } + /** * Returns the submodel pin. */ @@ -135,25 +150,52 @@ public class SubmodelComponent extends GUIComponent double posX = getBounds().x; double posY = getBounds().y; - GCDefaultConfig conf = new GCDefaultConfig(gc); + GCConfig conf = new GCConfig(gc); TranslatedGC tgc = new TranslatedGC(gc, posX, posY, submodelScale, true); conf.reset(tgc); double visibleRegionFillRatio = Math.max(getBounds().width / visibleRegion.width, getBounds().height / 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. - gc.setAlpha(Math.max(0, Math.min(255, (int) (gc.getAlpha() * alphaFactor)))); - renderer.render(tgc, visibleRegion.translate(posX, posY, submodelScale)); + int oldAlpha = gc.getAlpha(); + int submodelAlpha = Math.max(0, Math.min(255, (int) (oldAlpha * alphaFactor))); + int labelAlpha = Math.max(0, Math.min(255, (int) (oldAlpha * (1 - alphaFactor)))); + if (submodelAlpha != 0) + { + gc.setAlpha(submodelAlpha); + renderer.render(tgc, visibleRegion.translate(posX / submodelScale, posY / submodelScale, 1 / submodelScale)); + } + if (labelAlpha != 0) + { + gc.setAlpha(labelAlpha); + renderSymbol(gc, visibleRegion); + } conf.reset(gc); - // draw the "bounding box" after all other operations to make interface pins look better - gc.drawRectangle(getBounds()); + // draw the outline after all other operations to make interface pins look better + renderOutline(gc, visibleRegion); } + protected abstract void renderOutline(GeneralGC gc, Rectangle visibleRegion); + + protected abstract void renderSymbol(GeneralGC gc, Rectangle visibleRegion); + private static double map(double val, double valMin, double valMax, double mapMin, double mapMax) { return mapMin + (val - valMin) * (mapMax - mapMin) / (valMax - valMin); } + @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; + } + private static class PinMovable extends Pin { public PinMovable(GUIComponent component, int logicWidth, double relX, double relY) @@ -167,4 +209,73 @@ public class SubmodelComponent extends GUIComponent super.setRelPos(relX, relY); } } + + public SubComponentParams calculateParams() + { + SubComponentParams params = new SubComponentParams(); + params.composition = calculateCompositionParams(); + + Rectangle bounds = getBounds(); + params.width = bounds.width; + params.height = bounds.height; + + List pinList = pinsUnmodifiable; + InterfacePinParams[] iPins = new InterfacePinParams[pinList.size()]; + int i = 0; + for (Pin p : pinList) + { + InterfacePinParams iPinParams = new InterfacePinParams(); + iPins[i] = iPinParams; + iPinParams.location = p.getRelPos(); + iPinParams.logicWidth = p.logicWidth; + i++; + } + params.interfacePins = iPins; + return params; + } + + protected GeneralComponentParams calculateCompositionParams() + { + GeneralComponentParams params = new GeneralComponentParams(); + 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); + inner.type = component.getIdentifier(); + 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; + } } \ No newline at end of file