X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.ui%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fui%2Fmodel%2Fwires%2FGUIWire.java;h=50871fe59b7c13bb82e406f73e3796af3edf7361;hb=e7193d1fb16edc79e9cc3d8adcfb71caecd8463b;hp=c6c9432d6203b388aca1608278e33e02148f2498;hpb=f338e2a024c8edca6ab72230747ea5e4889d8b0b;p=Mograsim.git diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/GUIWire.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/GUIWire.java index c6c9432d..50871fe5 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/GUIWire.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/model/wires/GUIWire.java @@ -2,14 +2,15 @@ package net.mograsim.logic.ui.model.wires; import java.util.ArrayList; import java.util.List; -import java.util.function.Consumer; -import net.mograsim.logic.ui.ColorHelper; -import net.mograsim.logic.ui.model.ViewModel; import net.haspamelodica.swt.helper.gcs.GeneralGC; import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; import net.mograsim.logic.core.types.BitVectorFormatter; import net.mograsim.logic.core.wires.Wire.ReadEnd; +import net.mograsim.logic.ui.ColorHelper; +import net.mograsim.logic.ui.model.ViewModel; public class GUIWire { @@ -19,12 +20,14 @@ public class GUIWire private Pin pin2; private double[] path; - private final List> wireLookChangedListeners; + private final List redrawListeners; + private final LogicObserver logicObs; private ReadEnd end; public GUIWire(ViewModel model, Pin pin1, Pin pin2, Point... path) { + logicObs = (i) -> callRedrawListeners(); this.model = model; this.logicWidth = pin1.logicWidth; if (pin2.logicWidth != pin1.logicWidth) @@ -39,7 +42,7 @@ public class GUIWire this.pin1 = pin1; this.pin2 = pin2; - wireLookChangedListeners = new ArrayList<>(); + redrawListeners = new ArrayList<>(); pin1.addPinMovedListener(p -> pin1Moved()); pin2.addPinMovedListener(p -> pin2Moved()); @@ -54,6 +57,7 @@ public class GUIWire Point pos = pin1.getPos(); this.path[0] = pos.x; this.path[1] = pos.y; + callRedrawListeners(); } private void pin2Moved() @@ -61,6 +65,7 @@ public class GUIWire Point pos = pin2.getPos(); this.path[this.path.length - 2] = pos.x; this.path[this.path.length - 1] = pos.y; + callRedrawListeners(); } public void destroy() @@ -75,8 +80,21 @@ public class GUIWire public void setLogicModelBinding(ReadEnd end) { + deregisterLogicObs(this.end); this.end = end; - end.registerObserver((i) -> callWireLookChangedListeners()); + registerLogicObs(end); + } + + private void registerLogicObs(LogicObservable observable) + { + if (observable != null) + observable.registerObserver(logicObs); + } + + private void deregisterLogicObs(LogicObservable observable) + { + if (observable != null) + observable.deregisterObserver(logicObs); } public Pin getPin1() @@ -90,11 +108,11 @@ public class GUIWire } // @formatter:off - public void addWireLookChangedListener (Consumer listener) {wireLookChangedListeners.add (listener);} + public void addRedrawListener (Runnable listener) {redrawListeners .add (listener);} - public void removeWireLookChangedListener(Consumer listener) {wireLookChangedListeners.remove(listener);} + public void removeRedrawListener(Runnable listener) {redrawListeners .remove(listener);} - private void callWireLookChangedListeners() {wireLookChangedListeners.forEach(l -> l.accept(this));} + private void callRedrawListeners() {redrawListeners.forEach(l -> l.run());} // @formatter:on } \ No newline at end of file