LearnGodot/Main.cs
2026-01-03 23:53:29 +08:00

207 lines
4.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using Godot;
using System.Linq;
using System.Threading.Tasks;
using Learn.Component;
using Learn.Config;
using Learn.Parsers;
using Learn.Utils;
public partial class Main : Node
{
[ExportGroup("文件夹操作")]
[Export] private FileDirSelector _dirSelector;
[ExportGroup("操作面板")]
[Export] private Button _openDirButton;
[Export] private Button _doParseButton;
[Export] private Button _doTMDBParseButton;
[Export] private Button _saveButton;
[Export] private Button _resetButton;
[Export] private Button _loadButton;
[Export] private Button _reloadConfigButton;
[ExportGroup("编辑面板")]
[Export] private NodeInfoEditPanel _nodeInfoEditPanel;
[Export] private Button _addKeyButton;
[Export] private Button _removeKeyButton;
[ExportGroup("解析面板")]
[Export] private InspectorPanel _inspectorPanel;
[ExportGroup("主展示面板")]
[Export] private MainTreePanel _mainTreePanel;
[Export] private LineEdit _columnIndexText;
[Export] private LineEdit _columnWidthText;
[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 Configs _configs;
public override void _Ready()
{
_nodeInfoEditPanel.OnNodeInfoEdited += _mainTreePanel.UpdateColumns;
_addKeyButton.Pressed += _nodeInfoEditPanel.AddKeyValue;
_removeKeyButton.Pressed += _nodeInfoEditPanel.RemoveKeyValue;
_mainTreePanel.MultiSelected += (_, _, _) => { _refreshPanels = true; };
_addColumnButton.Pressed += () =>
{
_mainTreePanel.AddColumn(_columnText.Text,
int.TryParse(_columnIndexText.Text, out var index) ? index : -1,
int.TryParse(_columnWidthText.Text, out var width) ? width : -1);
};
_removeColumnButton.Pressed += () => _mainTreePanel.RemoveColumn(_columnText.Text);
_clearColumnButton.Pressed += () => _mainTreePanel.ClearColumns();
_expandAllButton.Pressed += ExpandAll;
_foldAllButton.Pressed += FoldAll;
// 功能区
_openDirButton.Pressed += ScanDir;
_doParseButton.Pressed += DoParse;
_doTMDBParseButton.Pressed += DoTMDBParse;
_saveButton.Pressed += DoSave;
_resetButton.Pressed += DoReset;
_loadButton.Pressed += LoadData;
_reloadConfigButton.Pressed += ReloadConfig;
_doParseButton.Text = "开始解析";
_configs = new Configs();
_configs.ConfigPath = "config.json";
_configs.Load(true);
LoadData();
ScanDir();
FoldAll();
_refreshPanels = true;
}
private void ReloadConfig()
{
_configs.Load(true);
}
private void LoadData()
{
if (File.Exists(DataPath))
{
_mainTreePanel.LoadData(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;
foreach (var child in root.GetChildren())
{
child.SetCollapsedRecursive(collapsed);
}
}
public override void _Process(double delta)
{
if (_refreshPanels)
{
_refreshPanels = false;
_nodeInfoEditPanel.SetNodes(_mainTreePanel.SelectingNodes);
_inspectorPanel.SetNode(_mainTreePanel.SelectingNodes.FirstOrDefault());
}
}
#region Commands
private async void ScanDir()
{
// var path = await _dirSelector.SelectFolderAsync();
var path = _configs.Get<AppConfig>().ScanPath;
if (string.IsNullOrEmpty(path))
{
return;
}
_mainTreePanel.Scan(path);
FoldAll();
_refreshPanels = true;
}
private async void DoTMDBParse()
{
var root = _mainTreePanel.GetRoot();
if (root == null) return;
_doTMDBParseButton.Disabled = true;
ItemParser parser = new TMDBParser(_configs);
foreach (var node in _mainTreePanel.SelectingNodes)
{
await parser.Parse(node);
}
_doTMDBParseButton.Disabled = false;
_mainTreePanel.UpdateColumns();
GD.Print("[TMDBParse] Done");
}
private async void DoParse()
{
var root = _mainTreePanel.GetRoot();
if (root == null) return;
_doParseButton.Disabled = true;
ItemParser parser = new RawParser(_configs);
if (_mainTreePanel.Query(root, out var node))
{
await parser.Parse(node);
}
_doParseButton.Disabled = false;
_mainTreePanel.UpdateColumns();
GD.Print("[RawParse] Done");
}
private const string DataPath = "data.json";
private void DoSave()
{
_mainTreePanel.SaveData(DataPath);
GD.Print("保存成功");
}
private void DoReset()
{
_mainTreePanel.ClearData();
_nodeInfoEditPanel.OnNodesChanged();
GD.Print("清空成功");
}
#endregion
}