unity-atoms/Packages/BaseAtoms/Runtime/Collections/AtomBaseVariableList.cs

127 lines
4.0 KiB
C#
Raw Normal View History

Added Variable Instancer, Event Reference, Atom Collection and Atom List (old Atom List renamed to Atom Value List) (#110) AtomVariableInstancer - Added AtomVariableInstancer as an option to AtomReference. - Added AtomVariableInstancer to generator. - Added editor icon for AtomVariableInstancer. AtomEventReference - Added an AtomEventReference class (and AtomEventX2Reference). It’s similar to an AtomReference, but for Events. Let’s you pick between an Event, Variable (will select the Changed event) and a VariableInstancer (see above). - Added AtomEventReference and AtomEventX2Reference to generator. - Added a drawer for AtomEventReference. - Listeners are now using AtomEventReference instead of AtomEvent. - Refactoring of VoidHooks since Listeners are now using AtomEventReference. AtomCollection - Created an AtomCollection - a collection of Atoms associated with key strings (AtomReferences). - Added new editor icon for collections. - Created a SerializableDictionary class, which AtomCollection is using. - Custom property drawer for SerializableDictionary. - SerializableDictionary supports nested structures meaning that a AtomCollection can have a KVP that is pointing to another AtomCollection. - AtomCollections have 3 events: Added, Removed, Cleared. - Added an option to sync an InstanceVariable to collection - adding it to the collection when created (using gameObject’s instance id as key) and removing it from the collection when destroyed. AtomList - Renamed old AtomList to AtomValueList - Added AtomList, like Collection, but a list - Added new icon for AtomList - Created a AtomBaseVariableList class, which AtomList is using. - Custom property drawer for AtomBaseVariableList. - AtomLists have 3 events: Added, Removed, Cleared. - Added an option to sync an InstanceVariable to list - adding it to the list when created and removing it from the list when destroyed.
2020-02-22 20:39:43 -05:00
using System;
using System.Collections.Generic;
using UnityEngine;
2020-03-01 20:26:06 -05:00
namespace UnityAtoms.BaseAtoms
Added Variable Instancer, Event Reference, Atom Collection and Atom List (old Atom List renamed to Atom Value List) (#110) AtomVariableInstancer - Added AtomVariableInstancer as an option to AtomReference. - Added AtomVariableInstancer to generator. - Added editor icon for AtomVariableInstancer. AtomEventReference - Added an AtomEventReference class (and AtomEventX2Reference). It’s similar to an AtomReference, but for Events. Let’s you pick between an Event, Variable (will select the Changed event) and a VariableInstancer (see above). - Added AtomEventReference and AtomEventX2Reference to generator. - Added a drawer for AtomEventReference. - Listeners are now using AtomEventReference instead of AtomEvent. - Refactoring of VoidHooks since Listeners are now using AtomEventReference. AtomCollection - Created an AtomCollection - a collection of Atoms associated with key strings (AtomReferences). - Added new editor icon for collections. - Created a SerializableDictionary class, which AtomCollection is using. - Custom property drawer for SerializableDictionary. - SerializableDictionary supports nested structures meaning that a AtomCollection can have a KVP that is pointing to another AtomCollection. - AtomCollections have 3 events: Added, Removed, Cleared. - Added an option to sync an InstanceVariable to collection - adding it to the collection when created (using gameObject’s instance id as key) and removing it from the collection when destroyed. AtomList - Renamed old AtomList to AtomValueList - Added AtomList, like Collection, but a list - Added new icon for AtomList - Created a AtomBaseVariableList class, which AtomList is using. - Custom property drawer for AtomBaseVariableList. - AtomLists have 3 events: Added, Removed, Cleared. - Added an option to sync an InstanceVariable to list - adding it to the list when created and removing it from the list when destroyed.
2020-02-22 20:39:43 -05:00
{
/// <summary>
/// A List of type AtomBaseVariable. Used by AtomList.
/// </summary>
[Serializable]
2020-03-01 20:26:06 -05:00
public class AtomBaseVariableList : List<AtomBaseVariable>, ISerializationCallbackReceiver, IAtomList
Added Variable Instancer, Event Reference, Atom Collection and Atom List (old Atom List renamed to Atom Value List) (#110) AtomVariableInstancer - Added AtomVariableInstancer as an option to AtomReference. - Added AtomVariableInstancer to generator. - Added editor icon for AtomVariableInstancer. AtomEventReference - Added an AtomEventReference class (and AtomEventX2Reference). It’s similar to an AtomReference, but for Events. Let’s you pick between an Event, Variable (will select the Changed event) and a VariableInstancer (see above). - Added AtomEventReference and AtomEventX2Reference to generator. - Added a drawer for AtomEventReference. - Listeners are now using AtomEventReference instead of AtomEvent. - Refactoring of VoidHooks since Listeners are now using AtomEventReference. AtomCollection - Created an AtomCollection - a collection of Atoms associated with key strings (AtomReferences). - Added new editor icon for collections. - Created a SerializableDictionary class, which AtomCollection is using. - Custom property drawer for SerializableDictionary. - SerializableDictionary supports nested structures meaning that a AtomCollection can have a KVP that is pointing to another AtomCollection. - AtomCollections have 3 events: Added, Removed, Cleared. - Added an option to sync an InstanceVariable to collection - adding it to the collection when created (using gameObject’s instance id as key) and removing it from the collection when destroyed. AtomList - Renamed old AtomList to AtomValueList - Added AtomList, like Collection, but a list - Added new icon for AtomList - Created a AtomBaseVariableList class, which AtomList is using. - Custom property drawer for AtomBaseVariableList. - AtomLists have 3 events: Added, Removed, Cleared. - Added an option to sync an InstanceVariable to list - adding it to the list when created and removing it from the list when destroyed.
2020-02-22 20:39:43 -05:00
{
public Action<AtomBaseVariable> Added { get => _added; set => _added = value; }
public Action<AtomBaseVariable> Removed { get => _removed; set => _removed = value; }
public Action Cleared { get => _cleared; set => _cleared = value; }
private event Action<AtomBaseVariable> _added;
private event Action<AtomBaseVariable> _removed;
private event Action _cleared;
[SerializeField]
private List<AtomBaseVariable> _serializedList = new List<AtomBaseVariable>();
public void OnAfterDeserialize()
{
if (_serializedList != null)
{
base.Clear();
for (var i = 0; i < _serializedList.Count; ++i)
{
base.Add(_serializedList[i]);
}
}
}
public void OnBeforeSerialize()
{
_serializedList.Clear();
for (var i = 0; i < this.Count; ++i)
{
_serializedList.Add(this[i]);
}
}
/// <summary>
/// Generic getter.
/// </summary>
/// <param name="index">The index you want to retrieve.</param>
/// <typeparam name="T">The expected type of the value you want to retrieve.</typeparam>
/// <returns>The value of type T at specified index.</returns>
public T Get<T>(int index) where T : AtomBaseVariable
{
return (T)this[index];
}
/// <summary>
/// Generic getter.
/// </summary>
/// <param name="index">The index you want to retrieve.</param>
/// <typeparam name="T">The expected type of the value you want to retrieve.</typeparam>
/// <returns>The value of type T at specified index.</returns>
public T Get<T>(AtomBaseVariable<int> index) where T : AtomBaseVariable
{
if (index == null) throw new ArgumentNullException("index");
return (T)this[index.Value];
}
/// <summary>
/// Add an item to the list.
/// </summary>
/// <param name="item">The item to add.</param>
public new void Add(AtomBaseVariable item)
{
base.Add(item);
_serializedList.Add(item);
Added?.Invoke(item);
}
/// <summary>
/// Remove an item from the list.
/// </summary>
/// <param name="item">The item to remove.</param>
/// <returns>True if it was removed, otherwise false..</returns>
public new bool Remove(AtomBaseVariable item)
{
var removed = base.Remove(item);
_serializedList.Remove(item);
if (!removed) return false;
Removed?.Invoke(item);
return true;
}
/// <summary>
/// Remove an item at provided index.
/// </summary>
/// <param name="index">The index to remove item at.</param>
public new void RemoveAt(int index)
{
var item = this[index];
base.RemoveAt(index);
_serializedList.RemoveAt(index);
Removed?.Invoke(item);
}
/// <summary>
/// Insert item at index.
/// </summary>
/// <param name="index">Index to insert item at.</param>
/// <param name="item">Item to insert.</param>
public new void Insert(int index, AtomBaseVariable item)
{
this.Insert(index, item);
_serializedList.Insert(index, item);
Added?.Invoke(item);
}
/// <summary>
/// Ckear list.
/// </summary>
public new void Clear()
{
base.Clear();
_serializedList.Clear();
_cleared?.Invoke();
}
}
}