X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2FViewModel.java;h=c85f1fd3f037a94facd7c729ed70ca85cec6e76e;hb=0a0877d1d0fca51260e66d65da3636752ded4242;hp=68cc489f06accd934d3f8883be94f3fde4f46d21;hpb=a86976434d00dce2652d93256cc12b6e3a0f324a;p=Mograsim.git diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/ViewModel.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/ViewModel.java index 68cc489f..c85f1fd3 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/ViewModel.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/ViewModel.java @@ -21,9 +21,9 @@ public class ViewModel private final List> componentRemovedListeners; private final List> wireAddedListeners; private final List> wireRemovedListeners; - private final List redrawListeners; + private final List> redrawHandlerChangedListeners; - private final Runnable redrawListenerForSubcomponents; + private Runnable redrawHandler; protected ViewModel() { @@ -36,9 +36,7 @@ public class ViewModel componentRemovedListeners = new ArrayList<>(); wireAddedListeners = new ArrayList<>(); wireRemovedListeners = new ArrayList<>(); - redrawListeners = new ArrayList<>(); - - redrawListenerForSubcomponents = this::callRedrawListeners; + redrawHandlerChangedListeners = new ArrayList<>(); } /** @@ -51,8 +49,7 @@ public class ViewModel throw new IllegalStateException("Don't add the same component twice!"); components.put(component.name, component); callComponentAddedListeners(component); - component.addRedrawListener(redrawListenerForSubcomponents); - callRedrawListeners(); + requestRedraw(); } /** @@ -65,8 +62,7 @@ public class ViewModel throw new IllegalStateException("Don't remove the same component twice!"); components.remove(component.name); callComponentRemovedListeners(component); - component.removeRedrawListener(redrawListenerForSubcomponents); - callRedrawListeners(); + requestRedraw(); } /** @@ -79,8 +75,7 @@ public class ViewModel throw new IllegalStateException("Don't add the same wire twice!"); wires.put(wire.name, wire); callWireAddedListeners(wire); - wire.addRedrawListener(redrawListenerForSubcomponents); - callRedrawListeners(); + requestRedraw(); } /** @@ -93,8 +88,7 @@ public class ViewModel throw new IllegalStateException("Don't remove the same wire twice!"); wires.remove(wire.name); callWireRemovedListeners(wire); - wire.removeRedrawListener(redrawListenerForSubcomponents); - callRedrawListeners(); + requestRedraw(); } public Map getComponentsByName() @@ -108,22 +102,39 @@ public class ViewModel } // @formatter:off - public void addComponentAddedListener (Consumer listener) {componentAddedListeners .add (listener);} - public void addComponentRemovedListener (Consumer listener) {componentRemovedListeners.add (listener);} - public void addWireAddedListener (Consumer listener) {wireAddedListeners .add (listener);} - public void addWireRemovedListener (Consumer listener) {wireRemovedListeners .add (listener);} - public void addRedrawListener (Runnable listener) {redrawListeners .add (listener);} - - public void removeComponentAddedListener (Consumer listener) {componentAddedListeners .remove(listener);} - public void removeComponentRemovedListener(Consumer listener) {componentRemovedListeners.remove(listener);} - public void removeWireAddedListener (Consumer listener) {wireAddedListeners .remove(listener);} - public void removeWireRemovedListener (Consumer listener) {wireRemovedListeners .remove(listener);} - public void removeRedrawListener (Runnable listener) {redrawListeners .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));} - private void callRedrawListeners ( ) {redrawListeners .forEach(l -> l.run( ));} + public void addComponentAddedListener (Consumer listener) {componentAddedListeners .add (listener);} + public void addComponentRemovedListener (Consumer listener) {componentRemovedListeners .add (listener);} + public void addWireAddedListener (Consumer listener) {wireAddedListeners .add (listener);} + public void addWireRemovedListener (Consumer listener) {wireRemovedListeners .add (listener);} + public void addRedrawHandlerChangedListener (Consumer listener) {redrawHandlerChangedListeners.add (listener);} + + public void removeComponentAddedListener (Consumer listener) {componentAddedListeners .remove(listener);} + public void removeComponentRemovedListener (Consumer listener) {componentRemovedListeners .remove(listener);} + public void removeWireAddedListener (Consumer listener) {wireAddedListeners .remove(listener);} + public void removeWireRemovedListener (Consumer listener) {wireRemovedListeners .remove(listener);} + public void removeRedrawHandlerChangedListener(Consumer listener) {redrawHandlerChangedListeners.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));} + private void callRedrawHandlerChangedListener(Runnable r) {redrawHandlerChangedListeners.forEach(l -> l.accept(r));} // @formatter:on + + public void setRedrawHandler(Runnable handler) + { + this.redrawHandler = handler; + callRedrawHandlerChangedListener(handler); + } + + public Runnable getRedrawHandler() + { + return redrawHandler; + } + + public void requestRedraw() + { + if (redrawHandler != null) + redrawHandler.run(); + } } \ No newline at end of file