using System.Collections.Generic; using System.Linq; using Godot; using Learn.Models; public partial class ItemInfoPanel : Tree { private IEnumerable _nodes; private ItemGroup _itemGroup; #region Columns Definitions private const int EmptyColumn = 0; private const int KeyColumn = 1; private const int ValueColumn = 2; #endregion public override void _Ready() { Columns = 3; SetColumnTitlesVisible(true); SetColumnCustomMinimumWidth(EmptyColumn, 30); SetColumnExpand(EmptyColumn, false); SetColumnTitle(KeyColumn, "键"); SetColumnCustomMinimumWidth(KeyColumn, 100); SetColumnExpand(KeyColumn, false); SetColumnTitle(ValueColumn, "值"); SetColumnExpand(ValueColumn, true); ItemEdited += OnItemEdited; } private readonly Godot.Collections.Dictionary _nodeKeys = new (); private void OnItemEdited() { var node = GetEdited(); var prevKey = _nodeKeys[node]; var currentKey = node.GetText(KeyColumn); var value = node.GetText(ValueColumn); if (prevKey != currentKey) { _itemGroup.Remove(prevKey); } _itemGroup.SetValue(currentKey, value); } public void SetSelectedNodes(IEnumerable nodes) { if (nodes == null) { _nodes = null; _itemGroup = null; } else { _nodes = nodes; _itemGroup = new ItemGroup(_nodes.Select(node => node.Info).ToList()); } OnCurrentItemChanged(); } private void OnCurrentItemChanged() { Clear(); _nodeKeys.Clear(); if (_itemGroup == null) return; var root = CreateItem(); foreach (var key in _itemGroup.GetKeys()) { if(!_itemGroup.TryGetValue(key, out var value, out var isSame)) continue; var node = CreateItem(root); node.SetText(KeyColumn, key); node.SetText(ValueColumn, isSame ? value : "-"); node.SetEditable(KeyColumn, true); node.SetEditable(ValueColumn, true); _nodeKeys.Add(node, key); } } private void AddKeyValue() { if(_itemGroup == null) return; var newFieldName = "newField"; int index = 0; while (!_itemGroup.TryAdd(newFieldName + (index == 0 ? "" : index.ToString()), "")) { index += 1; } OnCurrentItemChanged(); } private void RemoveKeyValue() { if(_itemGroup == null) return; var node = GetSelected(); var root = GetRoot(); while (node != null) { _itemGroup.Remove(_nodeKeys[node]); _nodeKeys.Remove(node); var next = GetNextSelected(node); root.RemoveChild(node); node = next; } } }