private void AssignToLayer(LayerTreeElement[] elements, LayerTreeElement layer)
        {
            if (layer == null || layer.Type != LayerTreeViewElementType.Layer || elements.Length == 0)
            {
                return;
            }

            foreach (var element in elements)
            {
                if (element.Type == LayerTreeViewElementType.Item)
                {
                    var oldLayer = element.ReParent(layer) as LayerTreeElement;
                    var bh       = element.Item as MonoBehaviour;
                    if (oldLayer != null)
                    {
                        _layers[oldLayer.Name].Remove(bh);
                    }
                    _layers[layer.Name].Add(bh);
                }
            }
            Rebuild();
            ItemsAssigned?.Invoke(layer, elements);
        }
        /// <summary>
        /// Deletes a layer using a TreeElement ID used within TreeRoot
        /// </summary>
        /// <param name="id">the id of the layer TreeElement</param>
        /// <remarks>
        /// Cannot delete the last layer, table need at least one layer
        /// Will transfer all items from the deleted layer to the first layer of the table
        /// </remarks>
        public void DeleteLayer(int id)
        {
            var layerItem = TreeRoot.Find(id);

            if (layerItem != null && layerItem.Type == LayerTreeViewElementType.Layer)
            {
                if (_layers.Keys.Count == 1)
                {
                    EditorUtility.DisplayDialog("Visual Pinball", "Cannot delete all layers.", "Close");
                    return;
                }

                if (!EditorUtility.DisplayDialog("Visual Pinball", $"Do you really want to delete layer {layerItem.Name} ?", "Yes", "No"))
                {
                    return;
                }

                // Keep layer's items and put them in the first layer
                var items = layerItem.GetChildren();
                _layers.Remove(layerItem.LayerName);
                if (items.Length > 0)
                {
                    var firstLayer = TreeRoot.GetChildren(e => e.Type == LayerTreeViewElementType.Layer)[0];
                    foreach (var item in items)
                    {
                        item.ReParent(firstLayer);
                    }
                    Rebuild();
                    ItemsAssigned?.Invoke(firstLayer, items);
                }
                else
                {
                    Rebuild();
                }
            }
        }