LearnGodot/Inspector/RawInfoPanel.cs
2025-12-16 20:53:40 +08:00

123 lines
2.6 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Godot;
using Learn.Models;
public partial class RawInfoPanel : Tree
{
private IEnumerable<TreeNode> _nodes;
private ItemGroup _itemGroup;
private readonly Dictionary<TreeItem, string> _nodeKeys = new ();
private readonly HashSet<TreeItem> _selectingNodes = new ();
#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;
MultiSelected += OnMultiSelected;
}
private void OnMultiSelected(TreeItem item, long column, bool selected)
{
if (selected)
{
_selectingNodes.Add(item);
}
else
{
_selectingNodes.Remove(item);
}
}
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();
_selectingNodes.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 root = GetRoot();
foreach (var node in _selectingNodes)
{
_itemGroup.Remove(_nodeKeys[node]);
root.RemoveChild(node);
}
}
}