From 1002e9aade64108e7c03901f38957e4d62e3678e Mon Sep 17 00:00:00 2001 From: fengfeng Date: Tue, 16 Dec 2025 20:53:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=9B=AE=E5=BD=95=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FileDirSelector.cs.uid | 1 - Inspector/ParsedInfoPanel.cs | 8 ++ Inspector/ParsedInfoPanel.cs.uid | 1 + ItemInfoPanel.cs => Inspector/RawInfoPanel.cs | 27 +++++-- Inspector/RawInfoPanel.cs.uid | 1 + ItemInfoPanel.cs.uid | 1 - Learn.sln.DotSettings.user | 2 + LearnTree.cs.uid | 1 - LearnTree.cs => MainTreePanel.cs | 14 ++-- MainTreePanel.cs.uid | 1 + .../FileDirSelector.cs | 0 Utils/FileDirSelector.cs.uid | 1 + tree.tscn | 81 +++++++++++++------ 13 files changed, 97 insertions(+), 42 deletions(-) delete mode 100644 FileDirSelector.cs.uid create mode 100644 Inspector/ParsedInfoPanel.cs create mode 100644 Inspector/ParsedInfoPanel.cs.uid rename ItemInfoPanel.cs => Inspector/RawInfoPanel.cs (82%) create mode 100644 Inspector/RawInfoPanel.cs.uid delete mode 100644 ItemInfoPanel.cs.uid delete mode 100644 LearnTree.cs.uid rename LearnTree.cs => MainTreePanel.cs (89%) create mode 100644 MainTreePanel.cs.uid rename FileDirSelector.cs => Utils/FileDirSelector.cs (100%) create mode 100644 Utils/FileDirSelector.cs.uid diff --git a/FileDirSelector.cs.uid b/FileDirSelector.cs.uid deleted file mode 100644 index a5eb20a..0000000 --- a/FileDirSelector.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://hbu73fxqen34 diff --git a/Inspector/ParsedInfoPanel.cs b/Inspector/ParsedInfoPanel.cs new file mode 100644 index 0000000..418141f --- /dev/null +++ b/Inspector/ParsedInfoPanel.cs @@ -0,0 +1,8 @@ +using Godot; + +namespace Learn.Inspector; + +public partial class ParsedInfoPanel : Tree +{ + +} \ No newline at end of file diff --git a/Inspector/ParsedInfoPanel.cs.uid b/Inspector/ParsedInfoPanel.cs.uid new file mode 100644 index 0000000..b558dec --- /dev/null +++ b/Inspector/ParsedInfoPanel.cs.uid @@ -0,0 +1 @@ +uid://bkx2esr711e68 diff --git a/ItemInfoPanel.cs b/Inspector/RawInfoPanel.cs similarity index 82% rename from ItemInfoPanel.cs rename to Inspector/RawInfoPanel.cs index 0c0402d..3d01c31 100644 --- a/ItemInfoPanel.cs +++ b/Inspector/RawInfoPanel.cs @@ -3,11 +3,14 @@ using System.Linq; using Godot; using Learn.Models; -public partial class ItemInfoPanel : Tree +public partial class RawInfoPanel : Tree { private IEnumerable _nodes; private ItemGroup _itemGroup; + private readonly Dictionary _nodeKeys = new (); + private readonly HashSet _selectingNodes = new (); + #region Columns Definitions private const int EmptyColumn = 0; private const int KeyColumn = 1; @@ -30,9 +33,20 @@ public partial class ItemInfoPanel : Tree 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 readonly Godot.Collections.Dictionary _nodeKeys = new (); private void OnItemEdited() { @@ -66,6 +80,7 @@ public partial class ItemInfoPanel : Tree { Clear(); _nodeKeys.Clear(); + _selectingNodes.Clear(); if (_itemGroup == null) return; var root = CreateItem(); foreach (var key in _itemGroup.GetKeys()) @@ -97,15 +112,11 @@ public partial class ItemInfoPanel : Tree { if(_itemGroup == null) return; - var node = GetSelected(); var root = GetRoot(); - while (node != null) + foreach (var node in _selectingNodes) { _itemGroup.Remove(_nodeKeys[node]); - _nodeKeys.Remove(node); - var next = GetNextSelected(node); root.RemoveChild(node); - node = next; } } } diff --git a/Inspector/RawInfoPanel.cs.uid b/Inspector/RawInfoPanel.cs.uid new file mode 100644 index 0000000..4f45e9b --- /dev/null +++ b/Inspector/RawInfoPanel.cs.uid @@ -0,0 +1 @@ +uid://dehqc84newiyv diff --git a/ItemInfoPanel.cs.uid b/ItemInfoPanel.cs.uid deleted file mode 100644 index 7e532e3..0000000 --- a/ItemInfoPanel.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dxkhiggkgqs6 diff --git a/Learn.sln.DotSettings.user b/Learn.sln.DotSettings.user index 903b9e2..64a225a 100644 --- a/Learn.sln.DotSettings.user +++ b/Learn.sln.DotSettings.user @@ -1,3 +1,5 @@  + ForceIncluded + ForceIncluded ForceIncluded ForceIncluded \ No newline at end of file diff --git a/LearnTree.cs.uid b/LearnTree.cs.uid deleted file mode 100644 index eebd837..0000000 --- a/LearnTree.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bngqk8kje5m2k diff --git a/LearnTree.cs b/MainTreePanel.cs similarity index 89% rename from LearnTree.cs rename to MainTreePanel.cs index a13330b..4822835 100644 --- a/LearnTree.cs +++ b/MainTreePanel.cs @@ -1,15 +1,14 @@ using System.Collections.Generic; using System.IO; -using System.Linq; using Godot; using Learn.Models; -public partial class LearnTree : Tree +public partial class MainTreePanel : Tree { [Export] private FileDirSelector _dirSelector; [Export] - private ItemInfoPanel _itemInfoPanel; + private RawInfoPanel _rawInfoPanel; private bool _updateItemInfoPanel; private readonly HashSet _selectingNodes = new (); @@ -25,7 +24,7 @@ public partial class LearnTree : Tree if (_updateItemInfoPanel) { _updateItemInfoPanel = false; - _itemInfoPanel.SetSelectedNodes(_selectingNodes); + _rawInfoPanel.SetSelectedNodes(_selectingNodes); } } @@ -89,8 +88,11 @@ public partial class LearnTree : Tree private async void Open() { - var path = await _dirSelector.SelectFolderAsync() ?? "None"; - if (string.IsNullOrEmpty(path)) return; + var path = await _dirSelector.SelectFolderAsync(); + if (string.IsNullOrEmpty(path)) + { + return; + } Clear(); _mapper.Clear(); _selectingNodes.Clear(); diff --git a/MainTreePanel.cs.uid b/MainTreePanel.cs.uid new file mode 100644 index 0000000..7ad9a01 --- /dev/null +++ b/MainTreePanel.cs.uid @@ -0,0 +1 @@ +uid://bmepprx2mndih diff --git a/FileDirSelector.cs b/Utils/FileDirSelector.cs similarity index 100% rename from FileDirSelector.cs rename to Utils/FileDirSelector.cs diff --git a/Utils/FileDirSelector.cs.uid b/Utils/FileDirSelector.cs.uid new file mode 100644 index 0000000..d321dd6 --- /dev/null +++ b/Utils/FileDirSelector.cs.uid @@ -0,0 +1 @@ +uid://dqs5segp8tixm diff --git a/tree.tscn b/tree.tscn index 5457036..abca6d8 100644 --- a/tree.tscn +++ b/tree.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=4 format=3 uid="uid://b3ypva4l8wfoh"] +[gd_scene load_steps=5 format=3 uid="uid://b3ypva4l8wfoh"] -[ext_resource type="Script" uid="uid://bngqk8kje5m2k" path="res://LearnTree.cs" id="1_brfkd"] -[ext_resource type="Script" uid="uid://dxkhiggkgqs6" path="res://ItemInfoPanel.cs" id="2_gvmkm"] -[ext_resource type="Script" uid="uid://hbu73fxqen34" path="res://FileDirSelector.cs" id="2_nnvrw"] +[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"] [node name="Control" type="Control"] layout_mode = 3 @@ -12,62 +13,92 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="VBoxContainer" type="VBoxContainer" parent="."] +[node name="FileDirDialog" type="FileDialog" parent="."] +script = ExtResource("1_d2g23") + +[node name="MarginContainer" type="MarginContainer" parent="."] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 -[node name="Toolbar" type="HBoxContainer" parent="VBoxContainer"] +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] layout_mode = 2 -[node name="Button" type="Button" parent="VBoxContainer/Toolbar"] +[node name="Toolbar" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="Button" type="Button" parent="MarginContainer/VBoxContainer/Toolbar"] layout_mode = 2 size_flags_vertical = 4 text = "打开文件夹" -[node name="HSplitContainer" type="HSplitContainer" parent="VBoxContainer"] +[node name="HSplitContainer" type="HSplitContainer" parent="MarginContainer/VBoxContainer"] layout_mode = 2 size_flags_vertical = 3 -[node name="Tree" type="Tree" parent="VBoxContainer/HSplitContainer" node_paths=PackedStringArray("_dirSelector", "_itemInfoPanel")] -custom_minimum_size = Vector2(700, 0) +[node name="MainTreePanel" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer" node_paths=PackedStringArray("_dirSelector", "_rawInfoPanel")] +custom_minimum_size = Vector2(600, 0) layout_mode = 2 allow_search = false hide_root = true select_mode = 2 -script = ExtResource("1_brfkd") -_dirSelector = NodePath("../../../FileDirDialog") -_itemInfoPanel = NodePath("../VBoxContainer/ItemInfoPanel") +script = ExtResource("2_44ud8") +_dirSelector = NodePath("../../../../FileDirDialog") +_rawInfoPanel = NodePath("../ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/Raw") -[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HSplitContainer"] +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/VBoxContainer/HSplitContainer"] layout_mode = 2 -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HSplitContainer/VBoxContainer"] +[node name="VBoxContainer2" type="VBoxContainer" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="FoldableContainer2" type="FoldableContainer" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2"] +layout_mode = 2 +title = "解析数据" + +[node name="Parsed" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2"] +custom_minimum_size = Vector2(0, 300) +layout_mode = 2 +script = ExtResource("3_d2g23") + +[node name="FoldableContainer" type="FoldableContainer" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2"] +layout_mode = 2 +folded = true +title = "原始数据" + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer"] +visible = false layout_mode = 2 -[node name="Add" type="Button" parent="VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer"] +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer"] +layout_mode = 2 + +[node name="Add" type="Button" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 size_flags_horizontal = 0 text = "添加字段" -[node name="Remove" type="Button" parent="VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer"] +[node name="Remove" type="Button" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 text = "移除选中" -[node name="ItemInfoPanel" type="Tree" parent="VBoxContainer/HSplitContainer/VBoxContainer"] +[node name="Raw" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer"] +custom_minimum_size = Vector2(0, 300) layout_mode = 2 size_flags_vertical = 3 allow_search = false hide_root = true select_mode = 2 -script = ExtResource("2_gvmkm") +script = ExtResource("4_ind6k") -[node name="FileDirDialog" type="FileDialog" parent="."] -script = ExtResource("2_nnvrw") - -[connection signal="pressed" from="VBoxContainer/Toolbar/Button" to="VBoxContainer/HSplitContainer/Tree" method="Open"] -[connection signal="pressed" from="VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/Add" to="VBoxContainer/HSplitContainer/VBoxContainer/ItemInfoPanel" method="AddKeyValue"] -[connection signal="pressed" from="VBoxContainer/HSplitContainer/VBoxContainer/HBoxContainer/Remove" to="VBoxContainer/HSplitContainer/VBoxContainer/ItemInfoPanel" method="RemoveKeyValue"] +[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"]