mirror of
https://github.com/Leonmmcoset/CMLeonOS.git
synced 2026-04-21 19:24:00 +00:00
tuitree指令
This commit is contained in:
120
shell/Commands/FileSystem/TUITreeCommand.cs
Normal file
120
shell/Commands/FileSystem/TUITreeCommand.cs
Normal file
@@ -0,0 +1,120 @@
|
||||
// The CMLeonOS Project (https://github.com/Leonmmcoset/CMLeonOS)
|
||||
// Copyright (C) 2025-present LeonOS 2 Developer Team
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace CMLeonOS.Commands.FileSystem
|
||||
{
|
||||
public static class TUITreeCommand
|
||||
{
|
||||
public static void ShowTUITree(CMLeonOS.FileSystem fileSystem, string args, Action<string> showError)
|
||||
{
|
||||
string startPath = string.IsNullOrEmpty(args) ? "." : args;
|
||||
string fullPath = fileSystem.GetFullPath(startPath);
|
||||
|
||||
if (!global::System.IO.Directory.Exists(fullPath))
|
||||
{
|
||||
showError($"Directory not found: {startPath}");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var rootNode = BuildTree(fileSystem, fullPath, "");
|
||||
if (rootNode == null)
|
||||
{
|
||||
showError("No files or directories found.");
|
||||
return;
|
||||
}
|
||||
|
||||
Console.Clear();
|
||||
Console.WriteLine($"Tree View: {fullPath}");
|
||||
Console.WriteLine("Press ESC to exit");
|
||||
Console.WriteLine();
|
||||
|
||||
var treeView = new CMLeonOS.UI.TreeView(new CMLeonOS.UI.Rect(5, 4, Console.WindowWidth - 10, Console.WindowHeight - 8));
|
||||
treeView.Root = rootNode;
|
||||
treeView.BackgroundColor = ConsoleColor.Black;
|
||||
treeView.NormalColor = ConsoleColor.White;
|
||||
treeView.SelectedColor = ConsoleColor.Yellow;
|
||||
treeView.BorderColor = ConsoleColor.Gray;
|
||||
|
||||
if (rootNode.Children.Count > 0)
|
||||
{
|
||||
treeView.SelectedNodes.Add(rootNode.Children[0]);
|
||||
}
|
||||
|
||||
treeView.Render();
|
||||
|
||||
bool running = true;
|
||||
while (running)
|
||||
{
|
||||
var key = Console.ReadKey(true);
|
||||
if (key.Key == ConsoleKey.Escape)
|
||||
{
|
||||
running = false;
|
||||
}
|
||||
else if (treeView.HandleKey(key))
|
||||
{
|
||||
treeView.Render();
|
||||
}
|
||||
}
|
||||
|
||||
Console.Clear();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
showError($"Error displaying tree: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private static CMLeonOS.UI.TreeViewNode BuildTree(CMLeonOS.FileSystem fileSystem, string path, string prefix)
|
||||
{
|
||||
var node = new CMLeonOS.UI.TreeViewNode(prefix + global::System.IO.Path.GetFileName(path));
|
||||
|
||||
try
|
||||
{
|
||||
var dirs = fileSystem.GetFullPathDirectoryList(path);
|
||||
foreach (var dir in dirs)
|
||||
{
|
||||
var childNode = BuildTree(fileSystem, dir, prefix + " ");
|
||||
if (childNode != null)
|
||||
{
|
||||
node.Children.Add(childNode);
|
||||
}
|
||||
}
|
||||
|
||||
var files = fileSystem.GetFullPathFileList(path);
|
||||
foreach (var file in files)
|
||||
{
|
||||
var fileNode = new CMLeonOS.UI.TreeViewNode(prefix + " " + global::System.IO.Path.GetFileName(file));
|
||||
node.Children.Add(fileNode);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
if (node.Children.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user