public EgretConsole(IConsole providedConsole, ILogger <EgretConsole> providedLogger) { logger = providedLogger; console = providedConsole; terminal = console.GetTerminal(preferVirtualTerminal: true, OutputMode.Auto); OutputMode = (terminal ?? console).DetectOutputMode(); formatter = new TextSpanFormatter(); renderer = new ConsoleRenderer(terminal ?? console, resetAfterRender: false); formatter.AddFormatter <FileInfo>((f) => f.FullName.StyleValue()); formatter.AddFormatter <double>((x) => x.ToString("N2").StyleNumber()); formatter.AddFormatter <int>((x) => x.ToString().StyleNumber()); var queue = new BlockingCollection <string>(); // created our own little async event loop so we can run things sequentially context = new AsyncContextThread(); }
public DirectoryView(DirectoryInfo directory) { if (directory == null) { throw new ArgumentNullException(nameof(directory)); } var formatter = new TextSpanFormatter(); formatter.AddFormatter <DateTime>(d => $"{d:d} {ForegroundColorSpan.DarkGray()}{d:t}"); Add(new ContentView("")); Add(new ContentView("")); Add(new ContentView($"Directory: {directory.FullName}")); Add(new ContentView("")); Add(new ContentView("")); var directoryContents = directory.EnumerateFileSystemInfos() .OrderBy(f => f is DirectoryInfo ? 0 : 1).ToList(); var tableView = new TableView <FileSystemInfo>(); tableView.Items = directoryContents; tableView.AddColumn(f => f is DirectoryInfo ? Span($"{ForegroundColorSpan.LightGreen()}{f.Name} ") : Span($"{ForegroundColorSpan.White()}{f.Name} "), new ContentView(formatter.ParseToSpan($"{Ansi.Text.UnderlinedOn}Name{Ansi.Text.UnderlinedOff}"))); tableView.AddColumn(f => formatter.Format(f.CreationTime), new ContentView(formatter.ParseToSpan($"{Ansi.Text.UnderlinedOn}Created{Ansi.Text.UnderlinedOff}"))); tableView.AddColumn(f => formatter.Format(f.LastWriteTime), new ContentView(formatter.ParseToSpan($"{Ansi.Text.UnderlinedOn}Modified{Ansi.Text.UnderlinedOff}"))); Add(tableView); TextSpan Span(FormattableString formattableString) { return(formatter.ParseToSpan(formattableString)); } }
public ProcessesView(Process[] processes) { var formatter = new TextSpanFormatter(); formatter.AddFormatter <TimeSpan>(t => new ContentSpan(t.ToString(@"hh\:mm\:ss"))); Add(new ContentView("")); Add(new ContentView("Processes")); Add(new ContentView("")); var table = new TableView <Process> { Items = processes }; table.AddColumn(p => p.Id, new ContentView("PID".Underline())); table.AddColumn(p => Name(p), new ContentView("COMMAND".Underline())); table.AddColumn(p => p.PrivilegedProcessorTime, new ContentView("TIME".Underline())); table.AddColumn(p => p.Threads.Count, new ContentView("#TH".Underline())); table.AddColumn( p => p.PrivateMemorySize64.Abbreviate(), new ContentView("MEM".Underline()) ); table.AddColumn( p => { #pragma warning disable CS0618 // Type or member is obsolete var usage = p.TrackCpuUsage().First(); #pragma warning restore CS0618 // Type or member is obsolete return($"{usage.UsageTotal:P}"); }, new ContentView("CPU".Underline()) ); Add(table); FormattableString Name(Process p) { if (!p.Responding) { return($"{ForegroundColorSpan.Rgb(180, 0, 0)}{p.ProcessName}{ForegroundColorSpan.Reset()}"); } return($"{p.ProcessName}"); } }