From 4b44a3ebcf077343b5640f26c479114ae45f6fc1 Mon Sep 17 00:00:00 2001 From: limil Date: Tue, 16 Dec 2025 22:14:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=9F=A5=E7=9C=8B=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{RawInfoPanel.cs => NodeInfoEditPanel.cs} | 28 +++++---- Inspector/NodeInfoEditPanel.cs.uid | 1 + Inspector/ParsedInfoPanel.cs | 60 ++++++++++++++++++- Inspector/RawInfoPanel.cs.uid | 1 - MainTreePanel.cs | 9 ++- Models/TreeNode.cs | 1 + tree.tscn | 24 ++++---- 7 files changed, 96 insertions(+), 28 deletions(-) rename Inspector/{RawInfoPanel.cs => NodeInfoEditPanel.cs} (84%) create mode 100644 Inspector/NodeInfoEditPanel.cs.uid delete mode 100644 Inspector/RawInfoPanel.cs.uid diff --git a/Inspector/RawInfoPanel.cs b/Inspector/NodeInfoEditPanel.cs similarity index 84% rename from Inspector/RawInfoPanel.cs rename to Inspector/NodeInfoEditPanel.cs index 3d01c31..69b2675 100644 --- a/Inspector/RawInfoPanel.cs +++ b/Inspector/NodeInfoEditPanel.cs @@ -1,10 +1,14 @@ using System.Collections.Generic; using System.Linq; using Godot; +using Learn.Inspector; using Learn.Models; -public partial class RawInfoPanel : Tree +public partial class NodeInfoEditPanel : Tree { + [Export] + private ParsedInfoPanel _notifyNodeChanged; + private IEnumerable _nodes; private ItemGroup _itemGroup; @@ -12,19 +16,15 @@ public partial class RawInfoPanel : Tree private readonly HashSet _selectingNodes = new (); #region Columns Definitions - private const int EmptyColumn = 0; - private const int KeyColumn = 1; - private const int ValueColumn = 2; + private const int KeyColumn = 0; + private const int ValueColumn = 1; #endregion public override void _Ready() { - Columns = 3; + Columns = 2; SetColumnTitlesVisible(true); - SetColumnCustomMinimumWidth(EmptyColumn, 30); - SetColumnExpand(EmptyColumn, false); - SetColumnTitle(KeyColumn, "键"); SetColumnCustomMinimumWidth(KeyColumn, 100); SetColumnExpand(KeyColumn, false); @@ -59,9 +59,10 @@ public partial class RawInfoPanel : Tree _itemGroup.Remove(prevKey); } _itemGroup.SetValue(currentKey, value); + _notifyNodeChanged.OnNodeChanged(); } - public void SetSelectedNodes(IEnumerable nodes) + public void SetNodes(IEnumerable nodes) { if (nodes == null) { @@ -73,10 +74,10 @@ public partial class RawInfoPanel : Tree _nodes = nodes; _itemGroup = new ItemGroup(_nodes.Select(node => node.Info).ToList()); } - OnCurrentItemChanged(); + OnNodesChanged(); } - private void OnCurrentItemChanged() + private void OnNodesChanged() { Clear(); _nodeKeys.Clear(); @@ -105,18 +106,19 @@ public partial class RawInfoPanel : Tree { index += 1; } - OnCurrentItemChanged(); + OnNodesChanged(); } private void RemoveKeyValue() { if(_itemGroup == null) return; - + var root = GetRoot(); foreach (var node in _selectingNodes) { _itemGroup.Remove(_nodeKeys[node]); root.RemoveChild(node); } + _notifyNodeChanged.OnNodeChanged(); } } diff --git a/Inspector/NodeInfoEditPanel.cs.uid b/Inspector/NodeInfoEditPanel.cs.uid new file mode 100644 index 0000000..d3cfe19 --- /dev/null +++ b/Inspector/NodeInfoEditPanel.cs.uid @@ -0,0 +1 @@ +uid://bbgo6drfpvv2a diff --git a/Inspector/ParsedInfoPanel.cs b/Inspector/ParsedInfoPanel.cs index 418141f..2366e38 100644 --- a/Inspector/ParsedInfoPanel.cs +++ b/Inspector/ParsedInfoPanel.cs @@ -1,8 +1,66 @@ +using System.Collections.Generic; using Godot; +using Learn.Models; namespace Learn.Inspector; public partial class ParsedInfoPanel : Tree { - + private TreeNode _node; + + #region Columns Definitions + private const int NotesColumn = 0; + private const int KeyColumn = 1; + private const int ValueColumn = 2; + #endregion + + public override void _Ready() + { + Columns = 3; + SetColumnTitlesVisible(true); + + SetColumnTitle(NotesColumn, "备注"); + SetColumnCustomMinimumWidth(NotesColumn, 80); + SetColumnExpand(NotesColumn, false); + + SetColumnTitle(KeyColumn, "键"); + SetColumnCustomMinimumWidth(KeyColumn, 100); + SetColumnExpand(KeyColumn, false); + + SetColumnTitle(ValueColumn, "值"); + SetColumnExpand(ValueColumn, true); + } + + public void SetNode(TreeNode node) + { + _node = node; + OnNodeChanged(); + } + + public void OnNodeChanged() + { + Clear(); + if (_node == null) return; + + var root = CreateItem(); + var keys = new HashSet(); + var curr = _node; + + while (curr != null) + { + foreach (var kv in curr.Info.Info) + { + if(!keys.Add(kv.Key)) continue; + var node = CreateItem(root); + if (curr != _node) + { + node.SetText(NotesColumn, "(继承)"); + } + node.SetText(KeyColumn, kv.Key); + node.SetText(ValueColumn, kv.Value); + } + curr = curr.Parent; + } + } + } \ No newline at end of file diff --git a/Inspector/RawInfoPanel.cs.uid b/Inspector/RawInfoPanel.cs.uid deleted file mode 100644 index 4f45e9b..0000000 --- a/Inspector/RawInfoPanel.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dehqc84newiyv diff --git a/MainTreePanel.cs b/MainTreePanel.cs index 4822835..6f0f333 100644 --- a/MainTreePanel.cs +++ b/MainTreePanel.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; using System.IO; +using System.Linq; using Godot; +using Learn.Inspector; using Learn.Models; public partial class MainTreePanel : Tree @@ -8,7 +10,9 @@ public partial class MainTreePanel : Tree [Export] private FileDirSelector _dirSelector; [Export] - private RawInfoPanel _rawInfoPanel; + private NodeInfoEditPanel _nodeInfoEditPanel; + [Export] + private ParsedInfoPanel _parsedInfoPanel; private bool _updateItemInfoPanel; private readonly HashSet _selectingNodes = new (); @@ -24,7 +28,8 @@ public partial class MainTreePanel : Tree if (_updateItemInfoPanel) { _updateItemInfoPanel = false; - _rawInfoPanel.SetSelectedNodes(_selectingNodes); + _nodeInfoEditPanel.SetNodes(_selectingNodes); + _parsedInfoPanel.SetNode(_selectingNodes.FirstOrDefault()); } } diff --git a/Models/TreeNode.cs b/Models/TreeNode.cs index ddfc786..800445f 100644 --- a/Models/TreeNode.cs +++ b/Models/TreeNode.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; namespace Learn.Models; diff --git a/tree.tscn b/tree.tscn index abca6d8..ab687a8 100644 --- a/tree.tscn +++ b/tree.tscn @@ -3,7 +3,7 @@ [ext_resource type="Script" uid="uid://dqs5segp8tixm" path="res://Utils/FileDirSelector.cs" id="1_d2g23"] [ext_resource type="Script" uid="uid://bmepprx2mndih" path="res://MainTreePanel.cs" id="2_44ud8"] [ext_resource type="Script" uid="uid://bkx2esr711e68" path="res://Inspector/ParsedInfoPanel.cs" id="3_d2g23"] -[ext_resource type="Script" uid="uid://dehqc84newiyv" path="res://Inspector/RawInfoPanel.cs" id="4_ind6k"] +[ext_resource type="Script" uid="uid://bbgo6drfpvv2a" path="res://Inspector/NodeInfoEditPanel.cs" id="4_d2g23"] [node name="Control" type="Control"] layout_mode = 3 @@ -43,7 +43,7 @@ text = "打开文件夹" layout_mode = 2 size_flags_vertical = 3 -[node name="MainTreePanel" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer" node_paths=PackedStringArray("_dirSelector", "_rawInfoPanel")] +[node name="MainTreePanel" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer" node_paths=PackedStringArray("_dirSelector", "_nodeInfoEditPanel", "_parsedInfoPanel")] custom_minimum_size = Vector2(600, 0) layout_mode = 2 allow_search = false @@ -51,7 +51,8 @@ hide_root = true select_mode = 2 script = ExtResource("2_44ud8") _dirSelector = NodePath("../../../../FileDirDialog") -_rawInfoPanel = NodePath("../ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/Raw") +_nodeInfoEditPanel = NodePath("../ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/NodeEditPanel") +_parsedInfoPanel = NodePath("../ScrollContainer/VBoxContainer2/FoldableContainer2/ParsedNodePanel") [node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/VBoxContainer/HSplitContainer"] layout_mode = 2 @@ -64,18 +65,18 @@ size_flags_horizontal = 3 layout_mode = 2 title = "解析数据" -[node name="Parsed" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2"] +[node name="ParsedNodePanel" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2"] custom_minimum_size = Vector2(0, 300) layout_mode = 2 +hide_root = true +select_mode = 1 script = ExtResource("3_d2g23") [node name="FoldableContainer" type="FoldableContainer" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2"] layout_mode = 2 -folded = true -title = "原始数据" +title = "数据编辑" [node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer"] -visible = false layout_mode = 2 [node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer"] @@ -90,15 +91,16 @@ text = "添加字段" layout_mode = 2 text = "移除选中" -[node name="Raw" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer"] +[node name="NodeEditPanel" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer" node_paths=PackedStringArray("_notifyNodeChanged")] custom_minimum_size = Vector2(0, 300) layout_mode = 2 size_flags_vertical = 3 allow_search = false hide_root = true select_mode = 2 -script = ExtResource("4_ind6k") +script = ExtResource("4_d2g23") +_notifyNodeChanged = NodePath("../../../FoldableContainer2/ParsedNodePanel") [connection signal="pressed" from="MarginContainer/VBoxContainer/Toolbar/Button" to="MarginContainer/VBoxContainer/HSplitContainer/MainTreePanel" method="Open"] -[connection signal="pressed" from="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/HBoxContainer/Add" to="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/Raw" method="AddKeyValue"] -[connection signal="pressed" from="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/HBoxContainer/Remove" to="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/Raw" method="RemoveKeyValue"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/HBoxContainer/Add" to="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/NodeEditPanel" method="AddKeyValue"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/HBoxContainer/Remove" to="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/NodeEditPanel" method="RemoveKeyValue"]