添加解析器
This commit is contained in:
parent
a4c5834da5
commit
47df98a25e
@ -1,10 +1,11 @@
|
||||
using System.Collections.Generic;
|
||||
using Godot;
|
||||
using Learn.Models;
|
||||
using Learn.Parsers;
|
||||
|
||||
namespace Learn.Component;
|
||||
|
||||
public partial class ParsedInfoPanel : Tree
|
||||
public partial class InspectorPanel : Tree
|
||||
{
|
||||
[Export] private NodeInfoEditPanel _editPanel;
|
||||
|
||||
@ -34,7 +35,7 @@ public partial class ParsedInfoPanel : Tree
|
||||
|
||||
_editPanel.OnNodeInfoEdited += OnNodeChanged;
|
||||
}
|
||||
|
||||
|
||||
public void SetNode(TreeNode node)
|
||||
{
|
||||
_node = node;
|
||||
@ -47,6 +48,11 @@ public partial class ParsedInfoPanel : Tree
|
||||
if (_node == null) return;
|
||||
|
||||
var root = CreateItem();
|
||||
|
||||
var nameNode = CreateItem(root);
|
||||
nameNode.SetText(KeyColumn, "Name");
|
||||
nameNode.SetText(ValueColumn, _node.Info.Name());
|
||||
|
||||
var kvs = _node.GetKeyValueInfos();
|
||||
foreach (var kv in kvs)
|
||||
{
|
||||
1
Component/InspectorPanel.cs.uid
Normal file
1
Component/InspectorPanel.cs.uid
Normal file
@ -0,0 +1 @@
|
||||
uid://bl3kpjp1rfw8n
|
||||
@ -17,7 +17,7 @@ public partial class MainTreePanel : Tree
|
||||
}
|
||||
|
||||
|
||||
private readonly HashSet<string> _columns = new();
|
||||
private readonly List<string> _columns = new();
|
||||
private readonly HashSet<TreeNode> _selectingNodes = new();
|
||||
private readonly Dictionary<TreeItem, TreeNode> _mapper = new();
|
||||
private readonly Dictionary<string, Item> _items = new();
|
||||
@ -30,7 +30,7 @@ public partial class MainTreePanel : Tree
|
||||
SetColumnTitlesVisible(true);
|
||||
|
||||
SetColumnTitle(0, "文件名");
|
||||
SetColumnCustomMinimumWidth(0, 400);
|
||||
SetColumnCustomMinimumWidth(0, 500);
|
||||
SetColumnExpand(0, true);
|
||||
|
||||
MultiSelected += OnMultiSelected;
|
||||
@ -38,10 +38,15 @@ public partial class MainTreePanel : Tree
|
||||
UpdateColumns();
|
||||
}
|
||||
|
||||
public void AddColumn(string columnName)
|
||||
public void AddColumn(string columnName, int index)
|
||||
{
|
||||
if (string.IsNullOrEmpty(columnName)) return;
|
||||
_columns.Add(columnName);
|
||||
if (_columns.Contains(columnName)) return;
|
||||
if (index < 0)
|
||||
{
|
||||
_columns.Add(columnName);
|
||||
}
|
||||
_columns.Insert(index, columnName);
|
||||
UpdateColumns();
|
||||
}
|
||||
|
||||
@ -52,6 +57,12 @@ public partial class MainTreePanel : Tree
|
||||
UpdateColumns();
|
||||
}
|
||||
|
||||
public void ClearColumns()
|
||||
{
|
||||
_columns.Clear();
|
||||
UpdateColumns();
|
||||
}
|
||||
|
||||
public void UpdateColumns()
|
||||
{
|
||||
Columns = _columns.Count + 1;
|
||||
@ -59,7 +70,7 @@ public partial class MainTreePanel : Tree
|
||||
foreach (var column in _columns)
|
||||
{
|
||||
SetColumnTitle(index, column);
|
||||
SetColumnCustomMinimumWidth(index, 200);
|
||||
SetColumnCustomMinimumWidth(index, 400);
|
||||
SetColumnExpand(index, true);
|
||||
index += 1;
|
||||
}
|
||||
@ -161,6 +172,11 @@ public partial class MainTreePanel : Tree
|
||||
TreeItem root = CreateItem();
|
||||
BuildTree(root, path);
|
||||
}
|
||||
|
||||
public bool Query(TreeItem item, out TreeNode node)
|
||||
{
|
||||
return _mapper.TryGetValue(item, out node);
|
||||
}
|
||||
|
||||
private void BuildTree(TreeItem root, string path)
|
||||
{
|
||||
|
||||
@ -1 +0,0 @@
|
||||
uid://bkx2esr711e68
|
||||
132
Main.cs
132
Main.cs
@ -1,42 +1,41 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Godot;
|
||||
using System.Linq;
|
||||
using Learn.Component;
|
||||
using Learn.Parsers;
|
||||
|
||||
public partial class Main : Node
|
||||
{
|
||||
[ExportGroup("文件夹操作")][Export] private FileDirSelector _dirSelector;
|
||||
[ExportGroup("文件夹操作")]
|
||||
[Export] private FileDirSelector _dirSelector;
|
||||
|
||||
[ExportGroup("操作面板")][Export] private RichTextLabel _console;
|
||||
[ExportGroup("操作面板")][Export] private Button _openDirButton;
|
||||
[ExportGroup("操作面板")][Export] private Button _doParseButton;
|
||||
[ExportGroup("操作面板")][Export] private Button _saveButton;
|
||||
[ExportGroup("操作面板")][Export] private Button _resetButton;
|
||||
[ExportGroup("操作面板")]
|
||||
[Export] private Button _openDirButton;
|
||||
[Export] private Button _doParseButton;
|
||||
[Export] private Button _saveButton;
|
||||
[Export] private Button _resetButton;
|
||||
[Export] private Button _loadButton;
|
||||
|
||||
[ExportGroup("编辑面板")][Export] private NodeInfoEditPanel _nodeInfoEditPanel;
|
||||
[ExportGroup("编辑面板")][Export] private Button _addKeyButton;
|
||||
[ExportGroup("编辑面板")][Export] private Button _removeKeyButton;
|
||||
[ExportGroup("编辑面板")]
|
||||
[Export] private NodeInfoEditPanel _nodeInfoEditPanel;
|
||||
[Export] private Button _addKeyButton;
|
||||
[Export] private Button _removeKeyButton;
|
||||
|
||||
[ExportGroup("解析面板")][Export] private ParsedInfoPanel _parsedInfoPanel;
|
||||
[ExportGroup("解析面板")]
|
||||
[Export] private InspectorPanel _inspectorPanel;
|
||||
|
||||
[ExportGroup("主展示面板")] [Export] private MainTreePanel _mainTreePanel;
|
||||
[ExportGroup("主展示面板")][Export] private LineEdit _columnText;
|
||||
[ExportGroup("主展示面板")][Export] private Button _addColumnButton;
|
||||
[ExportGroup("主展示面板")][Export] private Button _removeColumnButton;
|
||||
[ExportGroup("主展示面板")]
|
||||
[Export] private MainTreePanel _mainTreePanel;
|
||||
[Export] private LineEdit _columnIndexText;
|
||||
[Export] private LineEdit _columnText;
|
||||
[Export] private Button _addColumnButton;
|
||||
[Export] private Button _removeColumnButton;
|
||||
[Export] private Button _clearColumnButton;
|
||||
[Export] private Button _expandAllButton;
|
||||
[Export] private Button _foldAllButton;
|
||||
|
||||
private bool _refreshPanels;
|
||||
|
||||
private void Log(string log)
|
||||
{
|
||||
var time = Time.GetTimeDictFromSystem();
|
||||
string timestamp = $"[{time["hour"]:D2}:{time["minute"]:D2}:{time["second"]:D2}]";
|
||||
|
||||
string bbcode = $"[color=#888888]{timestamp}[/color] " +
|
||||
$"{log}\n";
|
||||
|
||||
_console.AppendText(bbcode);
|
||||
_console.ScrollToLine(_console.GetLineCount());
|
||||
}
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
@ -45,23 +44,65 @@ public partial class Main : Node
|
||||
_removeKeyButton.Pressed += _nodeInfoEditPanel.RemoveKeyValue;
|
||||
|
||||
_mainTreePanel.MultiSelected += (_, _, _) => { _refreshPanels = true; };
|
||||
_addColumnButton.Pressed += () => _mainTreePanel.AddColumn(_columnText.Text);
|
||||
_addColumnButton.Pressed += () => _mainTreePanel.AddColumn(_columnText.Text, int.TryParse(_columnIndexText.Text, out var index) ? index : -1);
|
||||
_removeColumnButton.Pressed += () => _mainTreePanel.RemoveColumn(_columnText.Text);
|
||||
_clearColumnButton.Pressed += () => _mainTreePanel.ClearColumns();
|
||||
|
||||
_expandAllButton.Pressed += ExpandAll;
|
||||
_foldAllButton.Pressed += FoldAll;
|
||||
|
||||
// 功能区
|
||||
_openDirButton.Pressed += ScanDir;
|
||||
_doParseButton.Pressed += DoParse;
|
||||
_saveButton.Pressed += DoSave;
|
||||
_resetButton.Pressed += DoReset;
|
||||
_loadButton.Pressed += LoadData;
|
||||
|
||||
LoadData();
|
||||
|
||||
// 先加载保存的数据
|
||||
_mainTreePanel.Scan("C:/Users/15401/Desktop/2025-up7"); // todo: 弄好后删掉
|
||||
|
||||
FoldAll();
|
||||
_refreshPanels = true;
|
||||
}
|
||||
|
||||
private void LoadData()
|
||||
{
|
||||
if (File.Exists(DataPath))
|
||||
{
|
||||
_mainTreePanel.LoadData(DataPath);
|
||||
Log("加载成功:" + DataPath);
|
||||
GD.Print("加载成功:" + DataPath);
|
||||
_refreshPanels = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void ExpandAll()
|
||||
{
|
||||
SetAllCollapsed(false);
|
||||
}
|
||||
|
||||
private void FoldAll()
|
||||
{
|
||||
SetAllCollapsed(true);
|
||||
}
|
||||
|
||||
private void SetAllCollapsed(bool collapsed)
|
||||
{
|
||||
var root = _mainTreePanel.GetRoot();
|
||||
if (root == null) return;
|
||||
var queue = new Queue<TreeItem>();
|
||||
queue.Enqueue(root);
|
||||
while (queue.Count > 0)
|
||||
{
|
||||
var treeItem = queue.Dequeue();
|
||||
foreach (var child in treeItem.GetChildren())
|
||||
{
|
||||
if(child == null) continue;
|
||||
child.Collapsed = collapsed;
|
||||
queue.Enqueue(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
@ -69,11 +110,13 @@ public partial class Main : Node
|
||||
{
|
||||
_refreshPanels = false;
|
||||
_nodeInfoEditPanel.SetNodes(_mainTreePanel.SelectingNodes);
|
||||
_parsedInfoPanel.SetNode(_mainTreePanel.SelectingNodes.FirstOrDefault());
|
||||
_inspectorPanel.SetNode(_mainTreePanel.SelectingNodes.FirstOrDefault());
|
||||
}
|
||||
}
|
||||
|
||||
#region Commands
|
||||
|
||||
|
||||
private async void ScanDir()
|
||||
{
|
||||
var path = await _dirSelector.SelectFolderAsync();
|
||||
@ -82,12 +125,33 @@ public partial class Main : Node
|
||||
return;
|
||||
}
|
||||
_mainTreePanel.Scan(path);
|
||||
FoldAll();
|
||||
_refreshPanels = true;
|
||||
}
|
||||
|
||||
private void DoParse()
|
||||
{
|
||||
// todo;
|
||||
var root = _mainTreePanel.GetRoot();
|
||||
if (root == null) return;
|
||||
|
||||
ItemParser parser = new NormalParser();
|
||||
|
||||
var queue = new Queue<TreeItem>();
|
||||
queue.Enqueue(root);
|
||||
while (queue.Count > 0)
|
||||
{
|
||||
var treeItem = queue.Dequeue();
|
||||
foreach (var child in treeItem.GetChildren())
|
||||
{
|
||||
if(child == null) continue;
|
||||
if (_mainTreePanel.Query(child, out var node))
|
||||
{
|
||||
parser.DoParse(node);
|
||||
}
|
||||
queue.Enqueue(child);
|
||||
}
|
||||
}
|
||||
_mainTreePanel.UpdateColumns();
|
||||
}
|
||||
|
||||
private const string DataPath = "data.json";
|
||||
@ -95,14 +159,14 @@ public partial class Main : Node
|
||||
private void DoSave()
|
||||
{
|
||||
_mainTreePanel.SaveData(DataPath);
|
||||
Log("保存成功");
|
||||
GD.Print("保存成功");
|
||||
}
|
||||
|
||||
private void DoReset()
|
||||
{
|
||||
_mainTreePanel.ClearData();
|
||||
_nodeInfoEditPanel.OnNodesChanged();
|
||||
Log("清空成功");
|
||||
GD.Print("清空成功");
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -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://Component/MainTreePanel.cs" id="2_44ud8"]
|
||||
[ext_resource type="Script" uid="uid://biwhkhqrhpf6a" path="res://Main.cs" id="2_0727o"]
|
||||
[ext_resource type="Script" uid="uid://bkx2esr711e68" path="res://Component/ParsedInfoPanel.cs" id="3_d2g23"]
|
||||
[ext_resource type="Script" uid="uid://bl3kpjp1rfw8n" path="res://Component/InspectorPanel.cs" id="4_0727o"]
|
||||
[ext_resource type="Script" uid="uid://bbgo6drfpvv2a" path="res://Component/NodeInfoEditPanel.cs" id="4_d2g23"]
|
||||
|
||||
[node name="Control" type="Control"]
|
||||
@ -17,22 +17,26 @@ grow_vertical = 2
|
||||
[node name="FileDirDialog" type="FileDialog" parent="."]
|
||||
script = ExtResource("1_d2g23")
|
||||
|
||||
[node name="Main" type="Node" parent="." node_paths=PackedStringArray("_dirSelector", "_console", "_openDirButton", "_doParseButton", "_saveButton", "_resetButton", "_nodeInfoEditPanel", "_addKeyButton", "_removeKeyButton", "_parsedInfoPanel", "_mainTreePanel", "_columnText", "_addColumnButton", "_removeColumnButton")]
|
||||
[node name="Main" type="Node" parent="." node_paths=PackedStringArray("_dirSelector", "_openDirButton", "_doParseButton", "_saveButton", "_resetButton", "_loadButton", "_nodeInfoEditPanel", "_addKeyButton", "_removeKeyButton", "_inspectorPanel", "_mainTreePanel", "_columnIndexText", "_columnText", "_addColumnButton", "_removeColumnButton", "_clearColumnButton", "_expandAllButton", "_foldAllButton")]
|
||||
script = ExtResource("2_0727o")
|
||||
_dirSelector = NodePath("../FileDirDialog")
|
||||
_console = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/RichTextLabel")
|
||||
_openDirButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer/ScanDir")
|
||||
_doParseButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer/DoParse")
|
||||
_saveButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer/Save")
|
||||
_resetButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer/Reset")
|
||||
_openDirButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/文件夹操作/ScanDir")
|
||||
_doParseButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/文件夹操作/DoParse")
|
||||
_saveButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/保存操作/Save")
|
||||
_resetButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/保存操作/Reset")
|
||||
_loadButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/保存操作/Load")
|
||||
_nodeInfoEditPanel = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/NodeEditPanel")
|
||||
_addKeyButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/HBoxContainer/AddKey")
|
||||
_removeKeyButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/HBoxContainer/RemoveKey")
|
||||
_parsedInfoPanel = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2/ParsedNodePanel")
|
||||
_inspectorPanel = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2/InspectorPanel")
|
||||
_mainTreePanel = NodePath("../MarginContainer/HSplitContainer/MainTreePanel")
|
||||
_columnText = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HBoxContainer/ColunmText")
|
||||
_addColumnButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HBoxContainer/AddColumn")
|
||||
_removeColumnButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HBoxContainer/RemoveColumn")
|
||||
_columnIndexText = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer2/ColumnIndex")
|
||||
_columnText = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer/ColunmText")
|
||||
_addColumnButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer/AddColumn")
|
||||
_removeColumnButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer/RemoveColumn")
|
||||
_clearColumnButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/ClearColumns")
|
||||
_expandAllButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/ExpandAll")
|
||||
_foldAllButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/FoldAll")
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="."]
|
||||
layout_mode = 1
|
||||
@ -48,11 +52,11 @@ theme_override_constants/margin_bottom = 5
|
||||
|
||||
[node name="HSplitContainer" type="HSplitContainer" parent="MarginContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="MainTreePanel" type="Tree" parent="MarginContainer/HSplitContainer"]
|
||||
custom_minimum_size = Vector2(600, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_stretch_ratio = 7.0
|
||||
allow_search = false
|
||||
hide_root = true
|
||||
select_mode = 2
|
||||
@ -60,6 +64,8 @@ script = ExtResource("2_44ud8")
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/HSplitContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_stretch_ratio = 3.0
|
||||
|
||||
[node name="VBoxContainer2" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer"]
|
||||
layout_mode = 2
|
||||
@ -69,60 +75,109 @@ size_flags_horizontal = 3
|
||||
layout_mode = 2
|
||||
title = "功能操作"
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4"]
|
||||
[node name="VBoxContainer2" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="RichTextLabel" type="RichTextLabel" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer"]
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="TabContainer" type="TabContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2"]
|
||||
custom_minimum_size = Vector2(0, 200)
|
||||
layout_mode = 2
|
||||
bbcode_enabled = true
|
||||
current_tab = 0
|
||||
|
||||
[node name="HFlowContainer" type="HFlowContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer"]
|
||||
[node name="文件夹操作" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer"]
|
||||
layout_mode = 2
|
||||
metadata/_tab_index = 0
|
||||
|
||||
[node name="ScanDir" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer"]
|
||||
[node name="ScanDir" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/文件夹操作"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 4
|
||||
text = "扫描文件夹"
|
||||
|
||||
[node name="DoParse" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer"]
|
||||
[node name="DoParse" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/文件夹操作"]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 4
|
||||
text = "开始解析"
|
||||
|
||||
[node name="Save" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer"]
|
||||
[node name="保存操作" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer"]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
text = "保存"
|
||||
metadata/_tab_index = 1
|
||||
|
||||
[node name="Reset" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer"]
|
||||
[node name="Save" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/保存操作"]
|
||||
layout_mode = 2
|
||||
text = "重置"
|
||||
text = "保存树表"
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer"]
|
||||
[node name="Load" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/保存操作"]
|
||||
layout_mode = 2
|
||||
text = "加载树表"
|
||||
|
||||
[node name="Reset" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/保存操作"]
|
||||
layout_mode = 2
|
||||
text = "重置树表"
|
||||
|
||||
[node name="树表操作" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer"]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
metadata/_tab_index = 2
|
||||
|
||||
[node name="HBoxContainer2" type="HBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="ColunmText" type="LineEdit" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HBoxContainer"]
|
||||
[node name="Label2" type="Label" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer2"]
|
||||
layout_mode = 2
|
||||
text = " 第"
|
||||
|
||||
[node name="ColumnIndex" type="LineEdit" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer2"]
|
||||
custom_minimum_size = Vector2(50, 0)
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label3" type="Label" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer2"]
|
||||
layout_mode = 2
|
||||
text = "行"
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="ColunmText" type="LineEdit" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer"]
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 0
|
||||
|
||||
[node name="AddColumn" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HBoxContainer"]
|
||||
[node name="AddColumn" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "显示"
|
||||
size_flags_vertical = 0
|
||||
text = "显示字段"
|
||||
|
||||
[node name="RemoveColumn" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HBoxContainer"]
|
||||
[node name="RemoveColumn" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "隐藏"
|
||||
size_flags_vertical = 0
|
||||
text = "隐藏字段"
|
||||
|
||||
[node name="ClearColumns" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作"]
|
||||
layout_mode = 2
|
||||
text = "清空字段"
|
||||
|
||||
[node name="ExpandAll" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作"]
|
||||
layout_mode = 2
|
||||
text = "展开全部"
|
||||
|
||||
[node name="FoldAll" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作"]
|
||||
layout_mode = 2
|
||||
text = "折叠全部"
|
||||
|
||||
[node name="FoldableContainer2" type="FoldableContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2"]
|
||||
layout_mode = 2
|
||||
title = "解析数据"
|
||||
title = "检查器"
|
||||
|
||||
[node name="ParsedNodePanel" type="Tree" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2" node_paths=PackedStringArray("_editPanel")]
|
||||
[node name="InspectorPanel" type="Tree" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2" node_paths=PackedStringArray("_editPanel")]
|
||||
custom_minimum_size = Vector2(0, 300)
|
||||
layout_mode = 2
|
||||
allow_rmb_select = true
|
||||
hide_root = true
|
||||
select_mode = 1
|
||||
script = ExtResource("3_d2g23")
|
||||
script = ExtResource("4_0727o")
|
||||
_editPanel = NodePath("../../FoldableContainer/VBoxContainer/NodeEditPanel")
|
||||
|
||||
[node name="FoldableContainer" type="FoldableContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2"]
|
||||
|
||||
49
Parsers/ItemFieldExtension.cs
Normal file
49
Parsers/ItemFieldExtension.cs
Normal file
@ -0,0 +1,49 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Learn.Models;
|
||||
|
||||
namespace Learn.Parsers;
|
||||
|
||||
public static class ItemFieldExtension
|
||||
{
|
||||
#region 基础信息
|
||||
|
||||
public static string Name(this Item item)
|
||||
{
|
||||
var path = item.MainInfo["Path"];
|
||||
return Path.GetFileName(path);
|
||||
}
|
||||
|
||||
public static bool IsFolder(this Item item)
|
||||
{
|
||||
return item.MainInfo["IsDir"] == "True";
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
public static void SetGroupIfNotExist(this Item item, string group)
|
||||
{
|
||||
item.Info.TryAdd("Group", group);
|
||||
}
|
||||
|
||||
public static void SetTitleIfNotExist(this Item item, string title)
|
||||
{
|
||||
item.Info.TryAdd("Title", title);
|
||||
}
|
||||
|
||||
public static void SetRawTitle(this Item item, string rawTitle)
|
||||
{
|
||||
item.Info.TryAdd("RawTitle", rawTitle);
|
||||
}
|
||||
|
||||
public static string RawTitle(this Item item)
|
||||
{
|
||||
return item.Info["RawTitle"];
|
||||
}
|
||||
|
||||
public static void SetSeasonIfNotExist(this Item item, string season)
|
||||
{
|
||||
item.Info.TryAdd("Season", season);
|
||||
}
|
||||
}
|
||||
1
Parsers/ItemFieldExtension.cs.uid
Normal file
1
Parsers/ItemFieldExtension.cs.uid
Normal file
@ -0,0 +1 @@
|
||||
uid://fo70m114nwe7
|
||||
19
Parsers/ItemParser.cs
Normal file
19
Parsers/ItemParser.cs
Normal file
@ -0,0 +1,19 @@
|
||||
using System.Collections.Generic;
|
||||
using Learn.Models;
|
||||
|
||||
namespace Learn.Parsers;
|
||||
|
||||
/// <summary>
|
||||
/// 目标的解析字段:
|
||||
/// "季度"
|
||||
/// "剧名"
|
||||
/// "发布组"
|
||||
/// "集数"
|
||||
/// "类型":"额外内容", "字幕", "剧集"
|
||||
/// "字幕语言"
|
||||
/// "年份"
|
||||
/// </summary>
|
||||
public interface ItemParser
|
||||
{
|
||||
public bool DoParse(TreeNode node);
|
||||
}
|
||||
1
Parsers/ItemParser.cs.uid
Normal file
1
Parsers/ItemParser.cs.uid
Normal file
@ -0,0 +1 @@
|
||||
uid://d2o60ij0d4uhb
|
||||
61
Parsers/NormalParser.cs
Normal file
61
Parsers/NormalParser.cs
Normal file
@ -0,0 +1,61 @@
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using Learn.Models;
|
||||
|
||||
namespace Learn.Parsers;
|
||||
|
||||
public class NormalParser : ItemParser
|
||||
{
|
||||
private string ParseSeason(string season)
|
||||
{
|
||||
if (int.TryParse(season, out _)) return season;
|
||||
|
||||
switch (season)
|
||||
{
|
||||
case "零": return "0";
|
||||
case "一": return "1";
|
||||
case "二": return "2";
|
||||
case "三": return "3";
|
||||
case "四": return "4";
|
||||
case "五": return "5";
|
||||
case "六": return "6";
|
||||
case "七": return "7";
|
||||
case "八": return "8";
|
||||
case "九": return "9";
|
||||
}
|
||||
return season;
|
||||
}
|
||||
|
||||
public bool DoParse(TreeNode node)
|
||||
{
|
||||
var item = node.Info;
|
||||
var name = item.Name();
|
||||
var matches = Regex.Matches(name, @"[^\[\]_]+").Select(match => match.Value).ToArray();
|
||||
|
||||
if (matches.Length == 1)
|
||||
{
|
||||
node.Info.SetRawTitle(matches[0]);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (matches.Length >= 2)
|
||||
{
|
||||
node.Info.SetGroupIfNotExist(matches[0]);
|
||||
|
||||
var title = matches[1].Trim();
|
||||
var match = Regex.Match(title, "(.+)第(.+)季");
|
||||
if (match.Success)
|
||||
{
|
||||
node.Info.SetSeasonIfNotExist(ParseSeason(match.Groups[2].Value.Trim()));
|
||||
node.Info.SetRawTitle(match.Groups[1].Value.Trim());
|
||||
}
|
||||
else
|
||||
{
|
||||
node.Info.SetRawTitle(title);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
1
Parsers/NormalParser.cs.uid
Normal file
1
Parsers/NormalParser.cs.uid
Normal file
@ -0,0 +1 @@
|
||||
uid://bfixayy5gpwd6
|
||||
@ -1,35 +0,0 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1 +0,0 @@
|
||||
uid://dbm2l6j6s1t7r
|
||||
@ -15,6 +15,11 @@ run/main_scene="res://MediaTreeEditor.tscn"
|
||||
config/features=PackedStringArray("4.5", "C#", "Forward Plus")
|
||||
config/icon="res://icon.svg"
|
||||
|
||||
[display]
|
||||
|
||||
window/size/viewport_width=1920
|
||||
window/size/viewport_height=1080
|
||||
|
||||
[dotnet]
|
||||
|
||||
project/assembly_name="Learn"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user