X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodel%2FViewModel.java;h=b0d6a3cfcf1a050ba27df4950f7cdc9574a1c453;hb=552986fd8718d5f2db00802015fdd1ecd58a5a2f;hp=193813297d3584912290051a5875652a0a7a1647;hpb=b5d8c2d71e27350ea7c9314e40df5bb0584271cd;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 19381329..b0d6a3cf 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 @@ -7,123 +7,147 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; -import net.mograsim.logic.model.model.components.GUIComponent; -import net.mograsim.logic.model.model.wires.GUIWire; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; public class ViewModel { - private final Map components; - private final Map componentsUnmodifiable; - private final List wires; - private final List wiresUnmodifiable; + private final Map components; + private final Map componentDestroyFunctions; + private final Map componentsUnmodifiable; + private final Map wires; + private final Map wireDestroyFunctions; + private final Map wiresUnmodifiable; - private final List> componentAddedListeners; - private final List> componentRemovedListeners; - private final List> wireAddedListeners; - private final List> wireRemovedListeners; - private final List redrawListeners; + private final List> componentAddedListeners; + private final List> componentRemovedListeners; + private final List> wireAddedListeners; + private final List> wireRemovedListeners; + private final List> redrawHandlerChangedListeners; - private final Runnable redrawListenerForSubcomponents; + private Runnable redrawHandler; protected ViewModel() { components = new HashMap<>(); + componentDestroyFunctions = new HashMap<>(); componentsUnmodifiable = Collections.unmodifiableMap(components); - wires = new ArrayList<>(); - wiresUnmodifiable = Collections.unmodifiableList(wires); + wires = new HashMap<>(); + wireDestroyFunctions = new HashMap<>(); + wiresUnmodifiable = Collections.unmodifiableMap(wires); componentAddedListeners = new ArrayList<>(); componentRemovedListeners = new ArrayList<>(); wireAddedListeners = new ArrayList<>(); wireRemovedListeners = new ArrayList<>(); - redrawListeners = new ArrayList<>(); - - redrawListenerForSubcomponents = this::callRedrawListeners; + redrawHandlerChangedListeners = new ArrayList<>(); } /** * Adds the given component to the list of components and calls all componentAddedListeners. Don't call this method from application - * code as it is automatically called in {@link GUIComponent}'s constructor. + * code as it is automatically called in {@link ModelComponent}'s constructor. + * + * @author Daniel Kirschten */ - protected void componentCreated(GUIComponent component) + protected void componentCreated(ModelComponent component, Runnable destroyed) { if (components.containsKey(component.name)) throw new IllegalStateException("Don't add the same component twice!"); components.put(component.name, component); + componentDestroyFunctions.put(component.name, destroyed); callComponentAddedListeners(component); - component.addRedrawListener(redrawListenerForSubcomponents); - callRedrawListeners(); + requestRedraw(); } /** - * Removes the given component from the list of components and calls all componentRemovedListeners. Don't call this method from - * application code as it is automatically called in {@link GUIComponent#destroy()}. + * Destroyes the given component, removes it from the list of components and calls all componentRemovedListeners. + * + * @author Daniel Kirschten */ - protected void componentDestroyed(GUIComponent component) + protected void destroyComponent(ModelComponent component) { + componentDestroyFunctions.get(component.name).run(); if (!components.containsKey(component.name)) throw new IllegalStateException("Don't remove the same component twice!"); components.remove(component.name); callComponentRemovedListeners(component); - component.removeRedrawListener(redrawListenerForSubcomponents); - callRedrawListeners(); + requestRedraw(); } /** - * Adds the given wire to the list of wires and calls all wireAddedListeners. Don't call this method from application code as it is - * automatically called in {@link GUIWire}'s constructor(s). + * Adds the given wire to the list of wires and calls all wireAddedListeners. + * + * @author Daniel Kirschten */ - protected void wireCreated(GUIWire wire) + protected void wireCreated(ModelWire wire, Runnable destroyed) { - if (wires.contains(wire)) + if (wires.containsKey(wire.name)) throw new IllegalStateException("Don't add the same wire twice!"); - wires.add(wire); + wires.put(wire.name, wire); + wireDestroyFunctions.put(wire.name, destroyed); callWireAddedListeners(wire); - wire.addRedrawListener(redrawListenerForSubcomponents); - callRedrawListeners(); + requestRedraw(); } /** - * Removes the given wire from the list of wires and calls all wireRemovedListeners. Don't call this method from application code as it - * is automatically called in {@link GUIWire#destroy()}. + * Destroys the given wire, removes it from the list of wires and calls all wireRemovedListeners. + * + * @author Daniel Kirschten */ - protected void wireDestroyed(GUIWire wire) + protected void destroyWire(ModelWire wire) { - if (!wires.contains(wire)) + wireDestroyFunctions.get(wire.name).run(); + if (!wires.containsKey(wire.name)) throw new IllegalStateException("Don't remove the same wire twice!"); - wires.remove(wire); + wires.remove(wire.name); callWireRemovedListeners(wire); - wire.removeRedrawListener(redrawListenerForSubcomponents); - callRedrawListeners(); + requestRedraw(); } - public Map getComponentsByName() + public Map getComponentsByName() { return componentsUnmodifiable; } - public List getWires() + public Map getWiresByName() { return wiresUnmodifiable; } // @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 (ModelComponent c) {componentAddedListeners .forEach(l -> l.accept(c));} + private void callComponentRemovedListeners (ModelComponent c) {componentRemovedListeners .forEach(l -> l.accept(c));} + private void callWireAddedListeners (ModelWire w) {wireAddedListeners .forEach(l -> l.accept(w));} + private void callWireRemovedListeners (ModelWire 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