X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2Fcomponents%2Fatomic%2FModelManualSwitch.java;h=d4e04376f732a88fbe43b6c77677c4e1eb22105d;hb=69ec19d54ceb6d5abbb8b4faa55284af22174859;hp=cf9735aebe524e131deab3519b43b4a8d08e6815;hpb=f1933b06b5fe800902131e4dc34f002ac3fa17f0;p=Mograsim.git diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java index cf9735ae..d4e04376 100644 --- a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java @@ -1,5 +1,9 @@ package net.mograsim.logic.model.model.components.atomic; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + import org.eclipse.swt.graphics.Color; import net.haspamelodica.swt.helper.gcs.GeneralGC; @@ -35,6 +39,8 @@ public class ModelManualSwitch extends ModelComponent private final LogicObserver logicObs; private CoreManualSwitch manualSwitch; + private final List> hlsListeners; + public ModelManualSwitch(LogicModelModifiable model, int logicWidth) { this(model, logicWidth, null); @@ -44,21 +50,29 @@ public class ModelManualSwitch extends ModelComponent { super(model, name, false); this.logicWidth = logicWidth; - logicObs = (i) -> model.requestRedraw(); setSize(width, height); addPin(this.outputPin = new Pin(model, this, "", logicWidth, PinUsage.OUTPUT, width, height / 2)); + hlsListeners = new ArrayList<>(); + + logicObs = i -> + { + model.requestRedraw(); + BitVector v = getOutValues(); + hlsListeners.forEach(l -> l.accept(v)); + }; + setHighLevelStateHandler(new HighLevelStateHandler() { @Override - public Object getHighLevelState(String stateID) + public Object get(String stateID) { switch (stateID) { case "out": if (manualSwitch != null) - return manualSwitch.getValues(); + return getOutValues(); return null; default: throw new IllegalArgumentException("No high level state with ID " + stateID); @@ -66,7 +80,7 @@ public class ModelManualSwitch extends ModelComponent } @Override - public void setHighLevelState(String stateID, Object newState) + public void set(String stateID, Object newState) { switch (stateID) { @@ -79,6 +93,32 @@ public class ModelManualSwitch extends ModelComponent } } + @Override + public void addListener(String stateID, Consumer stateChanged) + { + switch (stateID) + { + case "out": + hlsListeners.add(stateChanged); + break; + default: + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + } + + @Override + public void removeListener(String stateID, java.util.function.Consumer stateChanged) + { + switch (stateID) + { + case "out": + hlsListeners.remove(stateChanged); + break; + default: + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + } + @Override public String getIDForSerializing(IdentifyParams idParams) { @@ -102,7 +142,7 @@ public class ModelManualSwitch extends ModelComponent if (foreground != null) gc.setForeground(foreground); gc.drawRectangle(getBounds()); - String label = BitVectorFormatter.formatAsString(manualSwitch == null ? null : manualSwitch.getValues()); + String label = BitVectorFormatter.formatAsString(manualSwitch == null ? null : getOutValues()); Font oldFont = gc.getFont(); Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); gc.setFont(labelFont); @@ -120,7 +160,7 @@ public class ModelManualSwitch extends ModelComponent gc.drawLine(x, y + heightMiniButtons, x + width, y + heightMiniButtons); Color c = gc.getBackground(); gc.setBackground(gc.getForeground()); - BitVector bv = manualSwitch.getValues(); + BitVector bv = getOutValues(); double part = width / bv.length(); for (int i = 0; i < bv.length(); i++) { @@ -160,7 +200,7 @@ public class ModelManualSwitch extends ModelComponent if (heightMiniButtons > 0 && y - getPosY() < heightMiniButtons) { int part = (int) ((x - getPosX()) * logicWidth / width); - manualSwitch.setState(manualSwitch.getValues().withBitChanged(part, Bit::not)); + manualSwitch.setState(getOutValues().withBitChanged(part, Bit::not)); } else { manualSwitch.toggle(); @@ -191,6 +231,11 @@ public class ModelManualSwitch extends ModelComponent return logicWidth; } + private BitVector getOutValues() + { + return manualSwitch.getValues(); + } + static { LogicCoreAdapter.addComponentAdapter(new ManualSwitchAdapter());