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=63c2160dab73d258dd5bbf6eea723b6d2f82b40f;hb=63a0289cdf12e2f349267b6be9897350171d9741;hp=736c0ea67d3ef2253695e45ff9e4466d55b8a1d2;hpb=07faf07e3acb8b2afdc2bf65a46bc868faaed0f8;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 736c0ea6..63c2160d 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,44 +2,64 @@ 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.ViewModelModifiable; public class GUIWire { - private final ViewModel model; + private final ViewModelModifiable model; public final int logicWidth; private Pin pin1; 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) + public GUIWire(ViewModelModifiable model, WireCrossPoint pin1, WireCrossPoint pin2, Point... path) + { + this(model, pin1.getPin(), pin2.getPin(), path); + } + + public GUIWire(ViewModelModifiable model, WireCrossPoint pin1, Pin pin2, Point... path) { + this(model, pin1.getPin(), pin2, path); + } + + public GUIWire(ViewModelModifiable model, Pin pin1, WireCrossPoint pin2, Point... path) + { + this(model, pin1, pin2.getPin(), path); + } + + public GUIWire(ViewModelModifiable model, Pin pin1, Pin pin2, Point... path) + { + logicObs = (i) -> callRedrawListeners(); this.model = model; this.logicWidth = pin1.logicWidth; if (pin2.logicWidth != pin1.logicWidth) throw new IllegalArgumentException("Can't connect pins of different logic width"); - this.path = new double[path.length * 2 + 4]; - for (int srcI = 0, dstI = 2; srcI < path.length; srcI++, dstI += 2) + + if (path.length == 0) { - this.path[dstI + 0] = path[srcI].x; - this.path[dstI + 1] = path[srcI].y; + Point pos1 = pin1.getPos(), pos2 = pin2.getPos(); + path = new Point[] { new Point((pos1.x + pos2.x) / 2, pos1.y), new Point((pos1.x + pos2.x) / 2, pos2.y) }; } + applyPath(path); + this.pin1 = pin1; this.pin2 = pin2; - wireLookChangedListeners = new ArrayList<>(); + redrawListeners = new ArrayList<>(); pin1.addPinMovedListener(p -> pin1Moved()); pin2.addPinMovedListener(p -> pin2Moved()); @@ -49,11 +69,23 @@ public class GUIWire model.wireCreated(this); } + private void applyPath(Point... path) + { + this.path = new double[path.length * 2 + 4]; + + for (int srcI = 0, dstI = 2; srcI < path.length; srcI++, dstI += 2) + { + this.path[dstI + 0] = path[srcI].x; + this.path[dstI + 1] = path[srcI].y; + } + } + private void pin1Moved() { Point pos = pin1.getPos(); this.path[0] = pos.x; this.path[1] = pos.y; + callRedrawListeners(); } private void pin2Moved() @@ -61,6 +93,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 +108,21 @@ public class GUIWire public void setLogicModelBinding(ReadEnd end) { + deregisterLogicObs(this.end); this.end = end; - end.addObserver((i, o) -> 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 +136,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