Exemplo n.º 1
0
 /// <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;
 }
Exemplo n.º 2
0
 /// <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);
 }
Exemplo n.º 3
0
        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);
        }