using UnityEngine; using UnityEngine.UIElements; using UnityEditor; using System; using System.Collections.Generic; using System.IO; using System.Linq; using WordsToolkit.Scripts.NLP; namespace WordsToolkit.Scripts.Levels.Editor { public class LevelHierarchyVisualTree : VisualElement { private IModelController ModelController => EditorScope.Resolve(); private Dictionary> addButtonCallbacks = new Dictionary>(); private Dictionary> deleteButtonCallbacks = new Dictionary>(); // Events public event Action OnSelectionChanged; public event Action OnDeleteItem; public event Action OnCreateSubgroup; public event Action OnCreateLevel; public event Action OnHierarchyChanged; // UI Elements private TreeView treeView; private Dictionary idToItem = new Dictionary(); private List> rootItems = new List>(); private LevelHierarchyItem selectedItem; public LevelHierarchyVisualTree() { Init(); } private void Init() { style.flexGrow = 1; // Create TreeView treeView = new TreeView(); treeView.style.flexGrow = 1; treeView.selectionType = SelectionType.Single; // Configure data callbacks treeView.makeItem = MakeTreeItem; treeView.bindItem = (element, index) => { var itemData = treeView.GetItemDataForIndex>(index); BindTreeItem(element, itemData); }; treeView.unbindItem = UnbindTreeItem; // Set up TreeView events treeView.selectionChanged += OnTreeSelectionChanged; treeView.RegisterCallback(OnKeyDown); treeView.RegisterCallback(OnContextClick); // Enable drag and drop treeView.reorderable = true; treeView.RegisterCallback(OnDragUpdated); treeView.RegisterCallback(OnDragPerform); Add(treeView); Reload(); } private VisualElement MakeTreeItem() { var itemContainer = new VisualElement(); itemContainer.style.flexDirection = FlexDirection.Row; itemContainer.style.alignItems = Align.Center; var label = new Label(); label.style.flexGrow = 1; itemContainer.Add(label); // Buttons container for group items var buttonsContainer = new VisualElement(); buttonsContainer.style.flexDirection = FlexDirection.Row; buttonsContainer.style.display = DisplayStyle.None; var addButton = new Button(() => { }) { text = "+" }; addButton.AddToClassList("unity-button"); addButton.style.width = 20; addButton.style.marginRight = 2; var deleteButton = new Button(() => { }) { text = "−" }; deleteButton.AddToClassList("unity-button"); deleteButton.style.width = 20; buttonsContainer.Add(addButton); buttonsContainer.Add(deleteButton); itemContainer.Add(buttonsContainer); return itemContainer; } private void BindTreeItem(VisualElement element, TreeViewItemData itemData) { var item = itemData.data; var label = element.Q