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.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 _saveButton; [Export] private Button _resetButton; [Export] private Button _loadButton; [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 _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); _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; _doParseButton.Text = "开始解析"; LoadData(); _mainTreePanel.Scan("C:/Users/15401/Desktop/2025-up7"); // todo: 弄好后删掉 FoldAll(); _refreshPanels = true; _configs = new Configs(); _configs.ConfigPath = "config.json"; _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; var queue = new Queue(); 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) { if (_refreshPanels) { _refreshPanels = false; _nodeInfoEditPanel.SetNodes(_mainTreePanel.SelectingNodes); _inspectorPanel.SetNode(_mainTreePanel.SelectingNodes.FirstOrDefault()); } } #region Commands private async void ScanDir() { var path = await _dirSelector.SelectFolderAsync(); if (string.IsNullOrEmpty(path)) { return; } _mainTreePanel.Scan(path); FoldAll(); _refreshPanels = true; } private async void DoParse() { var root = _mainTreePanel.GetRoot(); if (root == null) return; var originName = _doParseButton.Text; _doParseButton.Disabled = true; ItemParser parser = new TMDBParser(_configs); var stopwatch = Stopwatch.StartNew(); var stack = new Stack(); stack.Push(root); while (stack.Count > 0) { _doParseButton.Text = "解析中"; if (stopwatch.ElapsedMilliseconds > 2000) { _mainTreePanel.UpdateColumns(); stopwatch.Restart(); } var treeItem = stack.Pop(); foreach (var child in treeItem.GetChildren()) { if(child == null) continue; if (_mainTreePanel.Query(child, out var node)) { try { if (!await parser.DoParse(node)) { GD.PrintErr($"解析{child.GetText(0)}失败"); } } catch (Exception ex) { GD.PrintErr($"解析{child.GetText(0)}出现异常:" + ex); } } stack.Push(child); } } _doParseButton.Text = originName; _doParseButton.Disabled = false; _mainTreePanel.UpdateColumns(); GD.Print("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 }