From 4a6a0a2c85c1a16112efaf7ca6d2b5fba3c9b466 Mon Sep 17 00:00:00 2001 From: Daniel Kirschten Date: Tue, 28 May 2019 11:36:26 +0200 Subject: [PATCH] Improved listener system --- LogicUI/src/era/mi/gui/model/ViewModel.java | 9 +++-- .../mi/gui/model/components/GUIComponent.java | 36 +++++++++++++++++-- LogicUI/src/era/mi/gui/model/wires/Pin.java | 19 ++++++++++ 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/LogicUI/src/era/mi/gui/model/ViewModel.java b/LogicUI/src/era/mi/gui/model/ViewModel.java index de22f447..5a41d0ea 100644 --- a/LogicUI/src/era/mi/gui/model/ViewModel.java +++ b/LogicUI/src/era/mi/gui/model/ViewModel.java @@ -37,7 +37,7 @@ public class ViewModel if (components.contains(component)) throw new IllegalStateException("Don't add the same component twice!"); components.add(component); - componentAddedListeners.forEach(l -> l.accept(component)); + callComponentAddedListeners(component); } /** @@ -49,7 +49,7 @@ public class ViewModel if (!components.contains(component)) throw new IllegalStateException("Don't remove the same component twice!"); components.remove(component); - componentRemovedListeners.forEach(l -> l.accept(component)); + callComponentRemovedListeners(component); } // @formatter:off @@ -62,5 +62,10 @@ public class ViewModel public void removeComponentRemovedListener(Consumer listener){componentRemovedListeners.remove(listener);} public void removeWireAddedListener (Consumer listener){wireAddedListeners .remove(listener);} public void removeWireRemovedListener (Consumer listener){wireRemovedListeners .remove(listener);} + + private void callComponentAddedListeners (GUIComponent c) {componentAddedListeners .forEach(l -> l.accept(c));} + private void callComponentRemovedListeners(GUIComponent c) {componentRemovedListeners.forEach(l -> l.accept(c));} + private void callWireAddedListeners (GUIWire w ) {wireAddedListeners .forEach(l -> l.accept(w));} + private void callWireRemovedListeners (GUIWire w ) {wireRemovedListeners .forEach(l -> l.accept(w));} // @formatter:on } \ No newline at end of file diff --git a/LogicUI/src/era/mi/gui/model/components/GUIComponent.java b/LogicUI/src/era/mi/gui/model/components/GUIComponent.java index 75a7a53f..7f4107d7 100644 --- a/LogicUI/src/era/mi/gui/model/components/GUIComponent.java +++ b/LogicUI/src/era/mi/gui/model/components/GUIComponent.java @@ -3,6 +3,7 @@ package era.mi.gui.model.components; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.function.Consumer; import era.mi.gui.model.ViewModel; import era.mi.gui.model.wires.Pin; @@ -16,18 +17,29 @@ public abstract class GUIComponent private final List pins; protected final List pinsUnmodifiable; + private final List> componentChangedListeners; + private final List> componentMovedListeners; + private final List> pinAddedListeners; + private final List> pinRemovedListeners; + public GUIComponent(ViewModel model) { this.model = model; this.bounds = new Rectangle(0, 0, 0, 0); this.pins = new ArrayList<>(); this.pinsUnmodifiable = Collections.unmodifiableList(pins); + + this.componentChangedListeners = new ArrayList<>(); + this.componentMovedListeners = new ArrayList<>(); + this.pinAddedListeners = new ArrayList<>(); + this.pinRemovedListeners = new ArrayList<>(); } public void moveTo(double x, double y) { bounds.x = x; bounds.y = y; + callComponentMovedListeners(); } /** @@ -55,6 +67,23 @@ public abstract class GUIComponent return pinsUnmodifiable; } + // @formatter:off + public void addComponentChangedListener (Consumer listener) {componentChangedListeners.add (listener);} + public void addComponentMovedListener (Consumer listener) {componentMovedListeners .add (listener);} + public void addPinAddedListener (Consumer listener) {pinAddedListeners .add (listener);} + public void addPinRemovedListener (Consumer listener) {pinRemovedListeners .add (listener);} + + public void removeComponentChangedListener(Consumer listener) {componentChangedListeners.remove(listener);} + public void removeComponentMovedListener (Consumer listener) {componentMovedListeners .remove(listener);} + public void removePinAddedListener (Consumer listener) {pinAddedListeners .remove(listener);} + public void removePinRemovedListener (Consumer listener) {pinRemovedListeners .remove(listener);} + + private void callComponentChangedListeners( ) {componentChangedListeners.forEach(l -> l.accept(this));} + private void callComponentMovedListeners ( ) {componentMovedListeners .forEach(l -> l.accept(this));} + private void callPinAddedListeners (Pin p) {pinAddedListeners .forEach(l -> l.accept(p ));} + private void callPinRemovedListeners (Pin p) {pinRemovedListeners .forEach(l -> l.accept(p ));} + // @formatter:on + /** * Render this component to the given gc. */ @@ -64,15 +93,18 @@ public abstract class GUIComponent { bounds.width = width; bounds.height = height; + callComponentChangedListeners(); } protected void addPin(Pin pin) - {// TODO notify pins they are "created" + { pins.add(pin); + callPinAddedListeners(pin); } protected void removePin(Pin pin) - {// TODO notify pins they are "destroyed" + { pins.remove(pin); + callPinRemovedListeners(pin); } } \ No newline at end of file diff --git a/LogicUI/src/era/mi/gui/model/wires/Pin.java b/LogicUI/src/era/mi/gui/model/wires/Pin.java index 1ab74047..3dc89677 100644 --- a/LogicUI/src/era/mi/gui/model/wires/Pin.java +++ b/LogicUI/src/era/mi/gui/model/wires/Pin.java @@ -1,5 +1,9 @@ package era.mi.gui.model.wires; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + import era.mi.gui.model.components.GUIComponent; import net.haspamelodica.swt.helper.swtobjectwrappers.Point; import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; @@ -10,11 +14,17 @@ public class Pin protected double relX; protected double relY; + private final List> pinMovedListeners; + public Pin(GUIComponent component, double relX, double relY) { this.component = component; this.relX = relX; this.relY = relY; + + this.pinMovedListeners = new ArrayList<>(); + + component.addComponentMovedListener(c -> callPinMovedListeners()); } public double getRelX() @@ -38,9 +48,18 @@ public class Pin return new Point(relX + componentBounds.x, relY + componentBounds.y); } + // @formatter:off + public void addPinMovedListener (Consumer listener){pinMovedListeners.add (listener);} + + public void removePinMovedListener(Consumer listener){pinMovedListeners.remove(listener);} + + private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));} + // @formatter:on + protected void setRelPos(double relX, double relY) { this.relX = relX; this.relY = relY; + callPinMovedListeners(); } } \ No newline at end of file -- 2.17.1