LearnGodot/ItemInfoPanel.cs
2025-12-15 23:21:10 +08:00

112 lines
2.4 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Godot;
using Learn.Models;
public partial class ItemInfoPanel : Tree
{
private IEnumerable<TreeNode> _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<TreeItem, string> _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<TreeNode> 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;
}
}
}