From 2e52e63c3f7f4fe8d692dd078de0002e79d6e6e1 Mon Sep 17 00:00:00 2001 From: Marcello Lamonaca <marcello@lamonaca.eu> Date: Fri, 11 Mar 2022 17:30:33 +0100 Subject: [PATCH] Add style to selection prompt --- src/Program.cs | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/Program.cs b/src/Program.cs index aae8e0c..f9faa55 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -47,11 +47,13 @@ static void RootCommand( if (multiple) { var prompt = new MultiSelectionPrompt<FileInfo>() - .Title("Select scripts") + .Title("Select a script the scripts to execute:") .NotRequired() .PageSize(ScriptListSize) .MoreChoicesText("[grey]Move up and down to reveal more options[/]") .InstructionsText("[grey](Press [blue]<space>[/] to toggle a script, [green]<enter>[/] to accept)[/]") + .UseConverter(PromptDecorator.GetStyledOption) + .HighlightStyle(PromptDecorator.SelectionHighlight) .AddChoices(files); var scripts = AnsiConsole.Prompt(prompt); @@ -61,9 +63,11 @@ static void RootCommand( else { var prompt = new SelectionPrompt<FileInfo>() - .Title("Select a script") + .Title("Select a script to execute:") .PageSize(ScriptListSize) .MoreChoicesText("[grey]Move up and down to reveal more options[/]") + .UseConverter(PromptDecorator.GetStyledOption) + .HighlightStyle(PromptDecorator.SelectionHighlight) .AddChoices(files); var script = AnsiConsole.Prompt(prompt); @@ -72,6 +76,20 @@ static void RootCommand( } }; +static class PromptDecorator +{ + internal static string GetStyledOption(FileInfo info) + { + var directory = $"[blue]{info.DirectoryName ?? "."}{Path.DirectorySeparatorChar}[/]"; + var filename = $"[orangered1]{Path.GetFileNameWithoutExtension(info.Name)}[/]"; + var extension = $"[greenyellow]{Path.GetExtension(info.Name)}[/]"; + + return $"{directory}{filename}{extension}"; + } + + internal static Style SelectionHighlight => new Style(decoration: Decoration.Bold | Decoration.Underline); +} + static class ScriptExecutor { internal static void Exec(FileInfo file, bool elevated) @@ -146,19 +164,19 @@ readonly struct ScriptFinder }; } - internal readonly FileInfo[] GetScriptFiles(string extension) + internal readonly IEnumerable<FileInfo> GetScriptFiles(string extension) { try { var filenames = Directory.GetFiles(RootFolder, $"*.{extension}", _options); - return filenames.Select(x => new FileInfo(x)).ToArray(); + return filenames.Select(x => new FileInfo(x)); } catch (UnauthorizedAccessException) { - return Array.Empty<FileInfo>(); + return Enumerable.Empty<FileInfo>(); } } - internal readonly FileInfo[] GetScriptFiles() => + internal readonly FileInfo[] GetScriptFiles() => Extensions.Select(GetScriptFiles).SelectMany(x => x).ToArray(); } \ No newline at end of file