This commit is contained in:
limil 2025-12-17 21:55:12 +08:00
parent 9770157420
commit dd2703418a
8 changed files with 169 additions and 39 deletions

View File

@ -1,13 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Godot;
using Learn.Inspector;
using Learn.Models;
public partial class NodeInfoEditPanel : Tree
{
[Export]
private ParsedInfoPanel _notifyNodeChanged;
public event Action OnNodeInfoEdited;
private IEnumerable<TreeNode> _nodes;
private ItemGroup _itemGroup;
@ -59,7 +58,7 @@ public partial class NodeInfoEditPanel : Tree
_itemGroup.Remove(prevKey);
}
_itemGroup.SetValue(currentKey, value);
_notifyNodeChanged.OnNodeChanged();
OnNodeInfoEdited?.Invoke();
}
public void SetNodes(IEnumerable<TreeNode> nodes)
@ -119,6 +118,6 @@ public partial class NodeInfoEditPanel : Tree
_itemGroup.Remove(_nodeKeys[node]);
root.RemoveChild(node);
}
_notifyNodeChanged.OnNodeChanged();
OnNodeInfoEdited?.Invoke();
}
}

View File

@ -6,12 +6,14 @@ namespace Learn.Inspector;
public partial class ParsedInfoPanel : Tree
{
[Export] private NodeInfoEditPanel _editPanel;
private TreeNode _node;
#region Columns Definitions
private const int NotesColumn = 0;
private const int KeyColumn = 1;
private const int ValueColumn = 2;
private const int KeyColumn = 0;
private const int ValueColumn = 1;
private const int NotesColumn = 2;
#endregion
public override void _Ready()
@ -19,16 +21,18 @@ public partial class ParsedInfoPanel : Tree
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);
SetColumnTitle(NotesColumn, "备注");
SetColumnCustomMinimumWidth(NotesColumn, 80);
SetColumnExpand(NotesColumn, false);
_editPanel.OnNodeInfoEdited += OnNodeChanged;
}
public void SetNode(TreeNode node)

View File

@ -4,7 +4,4 @@
<TargetFramework Condition=" '$(GodotTargetPlatform)' == 'android' ">net9.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
</PropertyGroup>
<ItemGroup>
<Folder Include="Parsers\" />
</ItemGroup>
</Project>

View File

@ -7,14 +7,14 @@ using Learn.Models;
public partial class MainTreePanel : Tree
{
[Export]
private FileDirSelector _dirSelector;
[Export]
private NodeInfoEditPanel _nodeInfoEditPanel;
[Export]
private ParsedInfoPanel _parsedInfoPanel;
[Export]
private MenuButton _menuButton;
[Export] private FileDirSelector _dirSelector;
[Export] private NodeInfoEditPanel _nodeInfoEditPanel;
[Export] private ParsedInfoPanel _parsedInfoPanel;
[Export] private LineEdit _columnText;
[Export] private Button _addColumnButton;
[Export] private Button _removeColumnButton;
private readonly HashSet<string> _columns = new();
private bool _updateItemInfoPanel;
private readonly HashSet<TreeNode> _selectingNodes = new ();
@ -22,11 +22,65 @@ public partial class MainTreePanel : Tree
public override void _Ready()
{
_menuButton.GetPopup().AddItem("test");
Columns = 1;
SetColumnTitlesVisible(true);
SetColumnTitle(0, "文件名");
SetColumnCustomMinimumWidth(0, 400);
SetColumnExpand(0, true);
MultiSelected += OnMultiSelected;
_addColumnButton.Pressed += OnAddColumn;
_removeColumnButton.Pressed += OnRemoveColumn;
_nodeInfoEditPanel.OnNodeInfoEdited += OnUpdateColumns;
}
private void OnAddColumn()
{
if (string.IsNullOrEmpty(_columnText.Text)) return;
_columns.Add(_columnText.Text);
OnUpdateColumns();
}
private void OnRemoveColumn()
{
if (string.IsNullOrEmpty(_columnText.Text)) return;
_columns.Remove(_columnText.Text);
OnUpdateColumns();
}
private void OnUpdateColumns()
{
Columns = _columns.Count + 1;
int index = 1;
foreach (var column in _columns)
{
SetColumnTitle(index, column);
SetColumnCustomMinimumWidth(index, 200);
SetColumnExpand(index, true);
index += 1;
}
foreach (var kv in _mapper)
{
index = 1;
foreach (var column in _columns)
{
if (kv.Value.TryGetValue(column, out var value, out _))
{
kv.Key.SetText(index, value);
}
else
{
kv.Key.SetText(index, "");
}
index += 1;
}
}
}
public override void _Process(double delta)
{
if (_updateItemInfoPanel)
@ -110,4 +164,10 @@ public partial class MainTreePanel : Tree
BuildTree(root, path);
_updateItemInfoPanel = true;
}
private void DoParse()
{
var nodes = _mapper.Values.ToList();
}
}

View File

@ -26,6 +26,25 @@ public class TreeNode(Item item)
node._parent = this;
}
public bool TryGetValue(string key, out string value, out bool isInherited)
{
var curr = this;
while (curr.Info != null)
{
if (curr.Info.Info.TryGetValue(key, out value))
{
isInherited = curr != this;
return true;
}
curr = curr.Parent;
}
value = null;
isInherited = false;
return false;
}
public IEnumerable<KeyValueInfo> GetKeyValueInfos()
{
var result = new List<KeyValueInfo>();

View File

@ -0,0 +1,35 @@
using System.Collections.Generic;
using Learn.Models;
namespace Learn.Parsers;
/// <summary>
/// 目标的解析字段:
/// "季度"
/// "剧名"
/// "发布组"
/// "集数"
/// "类型""额外内容", "字幕", "剧集"
/// "字幕语言"
/// "年份"
/// </summary>
public static class ParseItemHelper
{
private static void ParseItem(Item item)
{
var info = item.Info;
if (info["IsDir"] == "True")
{
}
}
public static void DoParse(IEnumerable<TreeNode> nodes)
{
foreach (var node in nodes)
{
if (node.Info == null) continue;
ParseItem(node.Info);
}
}
}

View File

@ -0,0 +1 @@
uid://dbm2l6j6s1t7r

View File

@ -34,16 +34,21 @@ layout_mode = 2
[node name="Toolbar" type="HBoxContainer" parent="MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Button" type="Button" parent="MarginContainer/VBoxContainer/Toolbar"]
[node name="OpenDir" type="Button" parent="MarginContainer/VBoxContainer/Toolbar"]
layout_mode = 2
size_flags_vertical = 4
text = "打开文件夹"
[node name="DoParse" type="Button" parent="MarginContainer/VBoxContainer/Toolbar"]
layout_mode = 2
size_flags_vertical = 4
text = "开始解析"
[node name="HSplitContainer" type="HSplitContainer" parent="MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="MainTreePanel" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer" node_paths=PackedStringArray("_dirSelector", "_nodeInfoEditPanel", "_parsedInfoPanel", "_menuButton")]
[node name="MainTreePanel" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer" node_paths=PackedStringArray("_dirSelector", "_nodeInfoEditPanel", "_parsedInfoPanel", "_columnText", "_addColumnButton", "_removeColumnButton")]
custom_minimum_size = Vector2(600, 0)
layout_mode = 2
allow_search = false
@ -53,7 +58,9 @@ script = ExtResource("2_44ud8")
_dirSelector = NodePath("../../../../FileDirDialog")
_nodeInfoEditPanel = NodePath("../ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/NodeEditPanel")
_parsedInfoPanel = NodePath("../ScrollContainer/VBoxContainer2/FoldableContainer2/ParsedNodePanel")
_menuButton = NodePath("../ScrollContainer/VBoxContainer2/FoldableContainer3/HBoxContainer/MenuButton")
_columnText = NodePath("../ScrollContainer/VBoxContainer2/FoldableContainer3/HBoxContainer/ColunmText")
_addColumnButton = NodePath("../ScrollContainer/VBoxContainer2/FoldableContainer3/HBoxContainer/AddColumn")
_removeColumnButton = NodePath("../ScrollContainer/VBoxContainer2/FoldableContainer3/HBoxContainer/RemoveColumn")
[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/VBoxContainer/HSplitContainer"]
layout_mode = 2
@ -64,36 +71,44 @@ size_flags_horizontal = 3
[node name="FoldableContainer3" type="FoldableContainer" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2"]
layout_mode = 2
folded = true
title = "添加显示字段"
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer3"]
visible = false
layout_mode = 2
[node name="MenuButton" type="MenuButton" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer3/HBoxContainer"]
custom_minimum_size = Vector2(100, 50)
[node name="ColunmText" type="LineEdit" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer3/HBoxContainer"]
custom_minimum_size = Vector2(100, 0)
layout_mode = 2
size_flags_horizontal = 0
text = "eee"
[node name="Button" type="Button" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer3/HBoxContainer"]
[node name="AddColumn" type="Button" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer3/HBoxContainer"]
layout_mode = 2
text = "添加"
text = "显示"
[node name="RemoveColumn" type="Button" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer3/HBoxContainer"]
layout_mode = 2
text = "隐藏"
[node name="FoldableContainer2" type="FoldableContainer" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2"]
layout_mode = 2
title = "解析数据"
[node name="ParsedNodePanel" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2"]
custom_minimum_size = Vector2(0, 300)
[node name="ParsedNodePanel" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2" node_paths=PackedStringArray("_editPanel")]
custom_minimum_size = Vector2(0, 400)
layout_mode = 2
hide_root = true
select_mode = 1
script = ExtResource("3_d2g23")
_editPanel = NodePath("../../FoldableContainer/VBoxContainer/NodeEditPanel")
[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="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer"]
@ -108,16 +123,16 @@ text = "添加字段"
layout_mode = 2
text = "移除选中"
[node name="NodeEditPanel" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer" node_paths=PackedStringArray("_notifyNodeChanged")]
custom_minimum_size = Vector2(0, 300)
[node name="NodeEditPanel" type="Tree" parent="MarginContainer/VBoxContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer"]
custom_minimum_size = Vector2(0, 400)
layout_mode = 2
size_flags_vertical = 3
allow_search = false
hide_root = true
select_mode = 2
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/Toolbar/OpenDir" to="MarginContainer/VBoxContainer/HSplitContainer/MainTreePanel" method="Open"]
[connection signal="pressed" from="MarginContainer/VBoxContainer/Toolbar/DoParse" to="MarginContainer/VBoxContainer/HSplitContainer/MainTreePanel" method="DoParse"]
[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"]