public Entry_Components AddObserver()
    {
        Entry_Components componentEntry = ScriptableObject.CreateInstance <Entry_Components>();

        AssetsPath.CreateAsset(componentEntry, AssetsPath.AssetName_TemplateEntryObserver);

        //add observer components
        ComponentTemplatesList.ForEach(x => componentEntry.Componets.Add(x.AddObserver()));

        //set observer settings
        componentEntry.ShowAddButton             = componentEntry.ShowRemoveButton
                                                 = componentEntry.ShowDraggableButton = componentEntry.ShowEditModeOption = false;

        //add observer to list
        ObserversList.Add(componentEntry);


        return(componentEntry);
    }
 public void ClearObservers()
 {
     ComponentTemplatesList.ForEach(x => x.ClearObservers());
     ObserversList.ForEach(AssetsPath.DestroyAsset);
     ObserversList.Clear();
 }
    private void OnComponentChanged(ListChangeType listChangeType, int i1, int i2)
    {
        switch (listChangeType)
        {
        //---------------------------------------------------------------------------------------------------------------------
        case ListChangeType.Add:
            ComponentTemplatesList.Add(new EntryComponentTemplate(TemplateInstance.Componets[i1]));
            ObserversList.ForEach(x => x.Componets.Add(ComponentTemplatesList[ComponentTemplatesList.Count - 1].AddObserver()));
            TemplateInstance.Componets[i1].OnEditModeModified += () => ApplyComponentToObservers(TemplateInstance.Componets.IndexOf(TemplateInstance.Componets[i1]));

            break;
        //---------------------------------------------------------------------------------------------------------------------

        case ListChangeType.Duplicate:
            ComponentTemplatesList.Insert(i1 + 1, new EntryComponentTemplate(TemplateInstance.Componets[i1 + 1]));
            ObserversList.ForEach(x => x.Componets.Insert(i1 + 1, ComponentTemplatesList[i1 + 1].AddObserver()));
            TemplateInstance.Componets[i1].OnEditModeModified += () => ApplyComponentToObservers(TemplateInstance.Componets.IndexOf(TemplateInstance.Componets[i1]));

            break;
        //---------------------------------------------------------------------------------------------------------------------

        case ListChangeType.Remove:


            if (ComponentTemplatesList.Count == 0)
            {
                goto case ListChangeType.Clear;
            }

            ComponentTemplatesList[i1].ClearObservers();

            //remove component from entry observers
            ObserversList.ForEach(x => { x.Componets.RemoveAt(i1); });

            //remove component from template
            ComponentTemplatesList.RemoveAt(i1);


            break;

        //---------------------------------------------------------------------------------------------------------------------

        case ListChangeType.Clear:

            foreach (var entryComponent in ComponentTemplatesList)
            {
                entryComponent.ClearObservers();
            }
            ComponentTemplatesList.Clear();


            ObserversList.ForEach(x => { x.Componets.Clear(); });

            break;

        //---------------------------------------------------------------------------------------------------------------------

        case ListChangeType.Reorder:
            var temp = ComponentTemplatesList[i1];
            ComponentTemplatesList[i1] = ComponentTemplatesList[i2];
            ComponentTemplatesList[i2] = temp;

            foreach (var observer in ObserversList)
            {
                var temp2 = observer.Componets[i1];
                observer.Componets[i1] = observer.Componets[i2];
                observer.Componets[i2] = temp2;
            }
            break;

        //---------------------------------------------------------------------------------------------------------------------

        case ListChangeType.None:
        case ListChangeType.DataChanged:
        default:
            break;
            //---------------------------------------------------------------------------------------------------------------------
        }
    }