//Some things have not been implimented fully!
        #region Add HierarchyObjects Methods
        public HierarchyObjectElementV2 AddHierarchyObjectWithoutUpdate(HierarchyObjectV2 hierarchyObject)
        {
            var hierarchyObjectElement = CreateHierarchy(hierarchyObject);

            _parentElements.Add(hierarchyObjectElement);
            return(hierarchyObjectElement);
        }
        private HierarchyObjectElementV2 CreateHierarchy(HierarchyObjectV2 hierarchyObject, int depthOffset)
        {
            var bufferedHierarchyObject = hierarchyElementArchetypeBuffer[hierarchyObject.bufferedHierarchyType].bufferedHierarchyObjectElements.GetUnusedPooledObjects(1)[0];

            var hierarchyObjectElement = bufferedHierarchyObject.hierarchyObjectElement;

            hierarchyObjectElement.elementName = hierarchyObject.elementName;
            hierarchyObjectElement.bufferedHierarchyObjectElement = bufferedHierarchyObject;
            hierarchyObjectElement.bufferedHierarchyType          = hierarchyObject.bufferedHierarchyType;

            if (hierarchyObject.childrenObjects.Count > 0)
            {
                //identifity the corresponding strucutre, initalise from that strucutre,
                for (int i = 0; i < hierarchyObject.childrenObjects.Count; i++)
                {
                    var childHierarchyObject = CreateHierarchy(hierarchyObject.childrenObjects[i], depthOffset + 1);
                    hierarchyObjectElement.AddHeirarchyElement(childHierarchyObject);
                }

                hierarchyObjectElement.enableArrowElement = true;
            }
            else
            {
                hierarchyObjectElement.enableArrowElement = false;
            }

            hierarchyObjectElement.elementHeight = hierarchyAnimationValues.hierarchyElementsHeight;
            hierarchyObjectElement.AddTabElements(bufferedHierarchyTabElements.GetUnusedPooledObjects(depthOffset));
            //bufferedHierarchyObject.hierarchyObjectElement.ResetHierarchyElement();

            return(hierarchyObjectElement);
        }
        public HierarchyObjectElementV2 AddHierarchyObject(HierarchyObjectV2 hierarchyObject, int siblingIndex)
        {
            var hierarchyObjectElement = AddHierarchyObjectWithoutUpdate(hierarchyObject, siblingIndex);

            hierarchyContentElement.UpdateRootElements();
            hierarchyContentElement.UpdateChildrenElements(hierarchyObjectElement);
            return(hierarchyObjectElement);
        }
        public HierarchyObjectElementV2 AddHierarchyObjectWithoutUpdate(HierarchyObjectV2 hierarchyObject, int siblingIndex)
        {
            var hierarchyObjectElement = CreateHierarchy(hierarchyObject);

            _parentElements.Insert(Mathf.Clamp(siblingIndex, 0, _parentElements.Count), hierarchyObjectElement);
            hierarchyObjectElement.rectTransform.SetSiblingIndex(siblingIndex);
            return(hierarchyObjectElement);
        }
        public HierarchyObjectElementV2 AddHierarchyObjectWithoutUpdate(HierarchyObjectV2 hierarchyObject, HierarchyObjectElementV2 parent)
        {
            var hierarchyObjectElement = CreateHierarchy(hierarchyObject, parent.depthIndex + 1);

            if (parent.hierarchyObjectElements.Count == 0)
            {
                parent.enableArrowElement = true;
            }
            parent.AddHeirarchyElement(hierarchyObjectElement);

            return(hierarchyObjectElement);
        }
        public HierarchyObjectElementV2 AddHierarchyObject(HierarchyObjectV2 hierarchyObject, HierarchyObjectElementV2 parent, int siblingIndex)
        {
            var hierarchyObjectElement = AddHierarchyObjectWithoutUpdate(hierarchyObject, parent, siblingIndex);

            //Cannot use this function as even though this places the Object correctly while being more optmised than updating all children elements
            //If the update is being is being optimised by calling AddHierarchyObjectWithoutUpdate, when finally calling AddHierarchyObject, the objects called WithoutUpdate would be missplaced
            //hierarchyBaseElement.hierarchyContentElement.UpdateElementPosition(hierarchyObjectElement);

            hierarchyContentElement.UpdateChildrenElements(parent);
            hierarchyContentElement.UpdateHierarchyBranch(parent);
            if (parent.isExpanded)
            {
                hierarchyContentElement.UpdateRootElements();
            }
            return(hierarchyObjectElement);
        }
 private HierarchyObjectElementV2 CreateHierarchy(HierarchyObjectV2 hierarchyObject)
 {
     return(CreateHierarchy(hierarchyObject, 0));
 }