/// <summary> /// Initializes a new instance of the <see cref="T:iox.PowerlineBuilder"/> class. /// </summary> public PowerlineBuilder() { Builder = new StringBuilder(); lastconsole = ANSIColor.Default; lastfg = new ANSIColor(lastconsole.GetForegroundBase()); lastbg = new ANSIColor(lastconsole.GetBackgroundBase()); first = true; }
/// <summary> /// Add a segment to the powerline. /// </summary> /// <returns>The segment.</returns> /// <param name="text">Text.</param> /// <param name="fg">Foreground color.</param> /// <param name="bg">Background color.</param> public PowerlineBuilder Segment(string text, ANSIColor fg = null, ANSIColor bg = null) { // $"\x1b[39m\x1b[46m iox \x1b[43m\x1b[36m{PLColor}\x1b[30m test.id \x1b[40m\x1b[33m{PLColor}\x1b[0m" fg = fg ?? lastfg; bg = bg ?? lastbg; if (first) { lastfg = fg ?? lastfg; lastbg = bg ?? lastbg; } if (!first) { Builder.Append($"{bg.bg}{lastbg.fg}{PLColor}"); } Builder.Append($"{bg.bg}{fg.fg} {text}"); lastfg = fg; lastbg = bg; if (first) { first = false; } return(this); }
public static string ReadHintedLine <T, TResult> (IEnumerable <T> hintSource, Func <T, TResult> hintField, ANSIColor hintColor, string inputRegex = ".*") { ConsoleKeyInfo input; var editComplete = true; var accum = string.Empty; var lastWord = string.Empty; var userInput = string.Empty; var suggestion = string.Empty; var initialCursorTop = Console.CursorTop; var initialCursorLeft = Console.CursorLeft; var lastInitialCursorTop = Console.CursorTop; var lastInitialCursorLeft = Console.CursorLeft; var localInitialCursorTop = Console.CursorTop; var localInitialCursorLeft = Console.CursorLeft; #if DEBUG var __DEBUG_TRD = new System.Threading.Thread(() => { while (true) { Console.Title = ($"ACCUM: {accum} | USRIN: {userInput}"); System.Threading.Thread.Sleep(100); } }); __DEBUG_TRD.Start(); #endif // Read next key while (ConsoleKey.Enter != (input = Console.ReadKey(intercept: true)).Key) { // Prepare state if (editComplete) { lastWord = string.Empty; userInput = string.Empty; suggestion = string.Empty; editComplete = false; lastInitialCursorTop = localInitialCursorTop; lastInitialCursorLeft = localInitialCursorLeft; localInitialCursorTop = Console.CursorTop; localInitialCursorLeft = Console.CursorLeft; } // Handle backspace if (input.Key == ConsoleKey.Backspace) { if (userInput.Any()) { userInput = userInput.Any() ? userInput.Remove(userInput.Length - 1, 1) : string.Empty; } else { accum = accum.Remove(Math.Max(0, accum.Length - 1), accum.Length > 0 ? 1 : 0); editComplete = true; // Clear line Console.SetCursorPosition(initialCursorLeft, initialCursorTop); Console.Write(string.Empty.PadLeft(Console.WindowWidth - initialCursorLeft)); Console.SetCursorPosition(initialCursorLeft, initialCursorTop); // Write finished line Console.Write(accum); continue; } } // Handle member access else if (input.Key == ConsoleKey.OemPeriod) { editComplete = true; userInput += input.KeyChar; } // Handle space else if (input.Key == ConsoleKey.Spacebar) { editComplete = true; userInput += input.KeyChar; } // Handle tab (accept suggestion) else if (input.Key == ConsoleKey.Tab) { editComplete = true; userInput = suggestion ?? userInput; } // Test if keychar is not alphanumeric else if (!char.IsLetterOrDigit(input.KeyChar)) { editComplete = true; userInput += input.KeyChar; } // Test if keychar matches input regex else if (Regex.IsMatch(input.KeyChar.ToString(), inputRegex)) { Console.CursorLeft++; userInput += input.KeyChar; } // Get the suggestion suggestion = ( hintSource.Select(item => hintField(item).ToString()) .FirstOrDefault( item => ( item.Length > userInput.Length && item.Substring(0, userInput.Length) == userInput ) ) ); // Get line lastWord = suggestion ?? userInput; // Clear line Console.SetCursorPosition(localInitialCursorLeft, localInitialCursorTop); Console.Write(string.Empty.PadLeft(Console.WindowWidth - localInitialCursorLeft)); Console.SetCursorPosition(localInitialCursorLeft, localInitialCursorTop); // Write user input ANSI.Write($"{(suggestion != null ? White : Default)}{userInput}"); // Write suggestion if (userInput.Any()) { ANSI.Write($"{hintColor}{lastWord.Substring (userInput.Length, lastWord.Length - userInput.Length)}"); if (editComplete) { // Clear line Console.SetCursorPosition(initialCursorLeft, initialCursorTop); Console.Write(string.Empty.PadLeft(Console.WindowWidth - initialCursorLeft)); Console.SetCursorPosition(initialCursorLeft, initialCursorTop); // Write finished line accum += lastWord; Console.Write(accum); } } continue; } if (!editComplete) { accum += userInput; } // Clear line Console.SetCursorPosition(initialCursorLeft, initialCursorTop); Console.Write(string.Empty.PadLeft(Console.WindowWidth - initialCursorLeft)); Console.SetCursorPosition(initialCursorLeft, initialCursorTop); // Write finished line Console.WriteLine(accum); #if DEBUG __DEBUG_TRD.Abort(); #endif // Return read line return(accum); }