Added a constructor for ModelSplitterParams; added a TODO
[Mograsim.git] / plugins / net.mograsim.logic.model / src / net / mograsim / logic / model / model / components / ModelComponent.java
index d543c54..b8d9f14 100644 (file)
@@ -11,9 +11,11 @@ import net.haspamelodica.swt.helper.gcs.GeneralGC;
 import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
 import net.mograsim.logic.model.model.LogicModelModifiable;
 import net.mograsim.logic.model.model.wires.Pin;
+import net.mograsim.logic.model.preferences.RenderPreferences;
 import net.mograsim.logic.model.serializing.IdentifyParams;
 import net.mograsim.logic.model.serializing.JSONSerializable;
 import net.mograsim.logic.model.snippets.HighLevelStateHandler;
+import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler;
 
 /**
  * The base class for all model components.<br>
@@ -23,6 +25,7 @@ import net.mograsim.logic.model.snippets.HighLevelStateHandler;
  * 
  * @author Daniel Kirschten
  */
+// TODO split into "blueprint" and "used component"
 public abstract class ModelComponent implements JSONSerializable
 {
        /**
@@ -77,6 +80,8 @@ public abstract class ModelComponent implements JSONSerializable
                this.pinAddedListeners = new ArrayList<>();
                this.pinRemovedListeners = new ArrayList<>();
 
+               this.highLevelStateHandler = new DefaultHighLevelStateHandler();
+
                if (callInit)
                        init();
        }
@@ -95,13 +100,6 @@ public abstract class ModelComponent implements JSONSerializable
                model.componentCreated(this, this::destroyed);
        }
 
-       // basic getters
-
-       public String getName()
-       {
-               return name;
-       }
-
        /**
         * Destroys this component. This method is called from {@link LogicModelModifiable#componentDestroyed(ModelComponent)
         * destroyComponent()} of the model this component is a part of.<br>
@@ -114,6 +112,13 @@ public abstract class ModelComponent implements JSONSerializable
                pinsByName.values().forEach(this::removePinWithoutRedraw);
        }
 
+       // basic getters
+
+       public String getName()
+       {
+               return name;
+       }
+
        // pins
 
        /**
@@ -212,13 +217,13 @@ public abstract class ModelComponent implements JSONSerializable
         * See {@link HighLevelStateHandler} for an explanation of high-level state IDs.
         * 
         * @see #setHighLevelState(String, Object)
-        * @see HighLevelStateHandler#getHighLevelState(String)
+        * @see HighLevelStateHandler#get(String)
         * 
         * @author Daniel Kirschten
         */
-       public Object getHighLevelState(String stateID)
+       public final Object getHighLevelState(String stateID)
        {
-               return highLevelStateHandler.getHighLevelState(stateID);
+               return highLevelStateHandler.get(stateID);
        }
 
        /**
@@ -226,13 +231,23 @@ public abstract class ModelComponent implements JSONSerializable
         * See {@link HighLevelStateHandler} for an explanation of high-level state IDs.
         * 
         * @see #getHighLevelState(String)
-        * @see HighLevelStateHandler#setHighLevelState(String, Object)
+        * @see HighLevelStateHandler#set(String, Object)
         * 
         * @author Daniel Kirschten
         */
-       public void setHighLevelState(String stateID, Object newState)
+       public final void setHighLevelState(String stateID, Object newState)
+       {
+               highLevelStateHandler.set(stateID, newState);
+       }
+
+       public final void addHighLevelStateListener(String stateID, Consumer<Object> stateChanged)
+       {
+               highLevelStateHandler.addListener(stateID, stateChanged);
+       }
+
+       public final void removeHighLevelStateListener(String stateID, Consumer<Object> stateChanged)
        {
-               highLevelStateHandler.setHighLevelState(stateID, newState);
+               highLevelStateHandler.removeListener(stateID, stateChanged);
        }
 
        // "graphical" operations
@@ -331,7 +346,7 @@ public abstract class ModelComponent implements JSONSerializable
         * 
         * @author Daniel Kirschten
         */
-       public abstract void render(GeneralGC gc, Rectangle visibleRegion);
+       public abstract void render(GeneralGC gc, RenderPreferences renderPrefs, Rectangle visibleRegion);
 
        // serializing