X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=LogicUI%2Fsrc%2Fera%2Fmi%2Fgui%2Fmodel%2Fcomponents%2FGUIComponent.java;h=7f4107d76f701f599be61da521f56da3a0de24b5;hb=4a6a0a2c85c1a16112efaf7ca6d2b5fba3c9b466;hp=75a7a53f142a6b2016e1f82c510070fc2d870d47;hpb=4d29cabdc45d68b5e5f210266dc4fbc5560dbcdd;p=Mograsim.git 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