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