Improved rendering:
[Mograsim.git] / net.mograsim.logic.ui / src / net / mograsim / logic / ui / model / components / GUIManualSwitch.java
index 8ca57ee..dbeabd2 100644 (file)
@@ -6,6 +6,8 @@ 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.core.LogicObservable;
+import net.mograsim.logic.core.LogicObserver;
 import net.mograsim.logic.core.components.ManualSwitch;
 import net.mograsim.logic.core.types.BitVectorFormatter;
 import net.mograsim.logic.core.wires.Wire.ReadEnd;
@@ -18,12 +20,15 @@ public class GUIManualSwitch extends GUIComponent
 
        private final Pin outputPin;
 
+       private final LogicObserver logicObs;
        private ManualSwitch logicSwitch;
        private ReadEnd end;
 
        public GUIManualSwitch(ViewModel model)
        {
                super(model);
+               logicObs = (i) -> requestRedraw();
+
                setSize(width, height);
                addPin(this.outputPin = new Pin(this, 1, width, height / 2));
        }
@@ -34,6 +39,7 @@ public class GUIManualSwitch extends GUIComponent
                double posX = getBounds().x;
                double posY = getBounds().y;
 
+               // TODO maybe draw switch state too?
                gc.drawRectangle(posX, posY, width, height);
                String label = BitVectorFormatter.formatValueAsString(end);
                Font oldFont = gc.getFont();
@@ -46,10 +52,24 @@ public class GUIManualSwitch extends GUIComponent
 
        public void setLogicModelBinding(ManualSwitch logicSwitch, ReadEnd end)
        {
+               deregisterLogicObs(this.end);
+               deregisterLogicObs(this.logicSwitch);
                this.logicSwitch = logicSwitch;
                this.end = end;
-               // TODO when ManualSwitch supports it, add listeners
-               end.addObserver((i, o) -> callComponentLookChangedListeners());
+               registerLogicObs(end);
+               registerLogicObs(logicSwitch);
+       }
+
+       private void registerLogicObs(LogicObservable observable)
+       {
+               if (observable != null)
+                       observable.registerObserver(logicObs);
+       }
+
+       private void deregisterLogicObs(LogicObservable observable)
+       {
+               if (observable != null)
+                       observable.deregisterObserver(logicObs);
        }
 
        @Override