X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=LogicUI%2Fsrc%2Fera%2Fmi%2Fgui%2Fmodel%2Fcomponents%2FGUIComponent.java;h=cf9b23a2116909a347008f39bc05dff0f6612a95;hb=f2886cbd57dd08b797921fc2421b41bd92915799;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..cf9b23a2 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,31 @@ 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<>(); + + model.componentCreated(this); } public void moveTo(double x, double y) { bounds.x = x; bounds.y = y; + callComponentMovedListeners(); } /** @@ -38,9 +52,9 @@ public abstract class GUIComponent return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); } - // TODO /** - * Called when this component is clicked. Relative coordinates of the click are given. Returns true if this component has to be redrawn. + * Called when this component is clicked. Absolute coordinates of the click are given. Returns true if this component consumed this + * click. */ public boolean clicked(double x, double y) { @@ -55,6 +69,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 +95,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