コード例 #1
0
ファイル: PowerLine.cs プロジェクト: rkeithhill/PowerLine
        public override string ToString()
        {
            object value = Object;
            string text  = null;

            if (Object is ScriptBlock)
            {
                value = ((ScriptBlock)Object).Invoke();
            }
            if (value is Block)
            {
                return(value.ToString());
            }

            if (Object is IEnumerable <ScriptBlock> )
            {
                text = AnsiHelper.GetString(((IEnumerable <ScriptBlock>)Object)
                                            .SelectMany(block => block.Invoke()
                                                        .Select(pso => pso.BaseObject))
                                            .Select(o => o is Block ? ((Block)o).ToString() : AnsiHelper.GetString(o)));
            }

            if (value is IEnumerable <Block> )
            {
                text = AnsiHelper.GetString(((IEnumerable <Block>)value).Select(block => block.ToString()));
            }

            if (value is IEnumerable <object> )
            {
                text = AnsiHelper.GetString(((IEnumerable <object>)value).Select(o => o is Block ? ((Block)o).ToString() : AnsiHelper.GetString(o)));
            }

            return(AnsiHelper.WriteAnsi(ForegroundColor, BackgroundColor, text ?? GetObjectText(), Clear));
        }
コード例 #2
0
ファイル: Block.cs プロジェクト: Xainey/PowerLine
 public override string ToString()
 {
     // If there's nothing but escape codes, don't bother outputting new colors
     if (Length == 0)
     {
         return((string)Object);
     }
     return(AnsiHelper.WriteAnsi(ForegroundColor, BackgroundColor, (string)Object));
 }
コード例 #3
0
ファイル: PowerLine.cs プロジェクト: RedFalsh/PowerLine
        public string ToString(int width)
        {
            var columns = PreCalculateValues();

            var output = new StringBuilder();

            // Output each block with appropriate separators and caps
            for (int l = 0; l < columns.Count;)
            {
                var column = columns[l];
                // Use null columns as spacers
                if (column != null && column.Length > 0)
                {
                    string text = column.ToString(Prompt.Separator, Prompt.ColorSeparator);
                    output.Append(text);
                    output.Append(AnsiHelper.WriteAnsi(column.EndBackgroundColor, null, Prompt.ColorSeparator));
                }

                // Force the prompt location to the end of the first column
                output.Append(AnsiHelper.EscapeCodes.PromptLocation);

                // CURRENTLY we only support two columns, so ...
                // if there are more columns, the next one is right-aligned
                if (columns.Count > ++l)
                {
                    column = columns[l];
                    // Use null columns as spacers
                    if (column != null && column.Length > 0)
                    {
                        // Move to the start location for the next column
                        output.Append(AnsiHelper.EscapeCodes.Esc + (width - column.Length) + "G");

                        output.Append(AnsiHelper.WriteAnsi(column.StartBackgroundColor, null, Prompt.ReverseColorSeparator));
                        output.Append(column.ToString(Prompt.ReverseSeparator, Prompt.ReverseColorSeparator, true));
                    }
                }

                if (columns.Count > ++l)
                {
                    // Because we only support two columns, if there are still more columns, they must go on the next line
                    output.Append("\n");
                }
            }

            return(output.ToString());
        }
コード例 #4
0
ファイル: PowerLine.cs プロジェクト: RedFalsh/PowerLine
        public string ToString(string separator, string colorSeparator, bool rightJustified = false)
        {
            // Initialize variables ...
            var output = new StringBuilder();

            PreCalculateValues();

            for (int l = 0; l < ValidBlocks.Length; l++)
            {
                var block = ValidBlocks[l];
                output.Append(block);

                // Write a separator between blocks, unless the next one has no (non-escape) text
                if (l < ValidBlocks.Length - 1 && ValidBlocks[l + 1].Length > 0)
                {
                    // if the colors are the same, use the separator
                    if (block.BackgroundColor == ValidBlocks[l + 1].BackgroundColor)
                    {
                        output.Append(separator);
                    }
                    // if they're different, use the colorSeparator
                    else
                    {
                        if (rightJustified)
                        {
                            output.Append(AnsiHelper.WriteAnsi(ValidBlocks[l + 1].BackgroundColor, block.BackgroundColor, colorSeparator));
                        }
                        else
                        {
                            output.Append(AnsiHelper.WriteAnsi(block.BackgroundColor, ValidBlocks[l + 1].BackgroundColor, colorSeparator));
                        }
                    }
                }
            }
            // clear colors at the end of each column
            output.Append(AnsiHelper.Foreground["Default"]);
            output.Append(AnsiHelper.Background["Default"]);
            return(output.ToString());
        }
コード例 #5
0
ファイル: PowerLine.cs プロジェクト: rkeithhill/PowerLine
        public override string ToString()
        {
            // Initialize variables ...
            var width       = Console.BufferWidth;
            var leftLength  = 0;
            var rightLength = 0;

            // Precalculate all the text and remove empty blocks
            var ValidBlocks = this.Select(e => e.Cache()).Where(e => e.Length > 0).ToArray();

            var output = new StringBuilder();

            // Output each block with appropriate separators and caps
            for (int l = 0; l < ValidBlocks.Length; l++)
            {
                var block = ValidBlocks[l];

                // Console.WriteLine("Is '" + block + "' a Column? " + BlockCache.Column.Equals(block) + " or a Prompt? " + BlockCache.Prompt.Equals(block));
                if (BlockCache.Column.Equals(block))
                {
                    // the length of the second column
                    rightLength = ValidBlocks.Skip(l + 1).Sum(e => e.Length + 1) - 1;

                    var space = width - rightLength;

                    // Output a cap on the left if there isn't one already
                    if (l > 0 && !BlockCache.Prompt.Equals(ValidBlocks[l - 1]))
                    {
                        // Use the Background of the previous block as the foreground
                        output.Append(AnsiHelper.WriteAnsi(ValidBlocks[l - 1].BackgroundColor, null, Block.LeftCap, true));
                    }

                    output.Append(AnsiHelper.EscapeCodes.ESC + space + "G");

                    if (l < ValidBlocks.Length)
                    {
                        // the right cap uses the background of the next block as it's foreground
                        output.Append(AnsiHelper.WriteAnsi(ValidBlocks[l + 1].BackgroundColor, null, Block.RightCap));
                    }
                }
                else if (BlockCache.Prompt.Equals(block))
                {
                    output.Append(block.ToString());
                }
                else
                {
                    if (leftLength == 0 && rightLength == 0)
                    {
                        // On a new line, recalculate the length of the "left-aligned" line
                        leftLength = ValidBlocks.TakeWhile(e => !BlockCache.Column.Equals(e)).Sum(e => e.Length + 1);
                    }

                    output.Append(block.ToString());

                    // Write a separator between blocks
                    if (l + 1 < ValidBlocks.Length && !BlockCache.Column.Equals(ValidBlocks[l + 1]))
                    {
                        // if the next block is the sambe background color, use a >
                        if (block.BackgroundColor == ValidBlocks[l + 1].BackgroundColor)
                        {
                            output.Append(rightLength > 0 ? Block.RightSep : Block.LeftSep);
                        }
                        else
                        {
                            if (rightLength > 0)
                            {
                                output.Append(AnsiHelper.WriteAnsi(ValidBlocks[l + 1].BackgroundColor, block.BackgroundColor, Block.RightCap));
                            }
                            else
                            {
                                output.Append(AnsiHelper.WriteAnsi(block.BackgroundColor, ValidBlocks[l + 1].BackgroundColor, Block.LeftCap));
                            }
                        }
                    }
                }
            }

            // Output a cap on the left if we didn't already
            if (rightLength == 0 && leftLength > 0)
            {
                output.Append(AnsiHelper.WriteAnsi(ValidBlocks.Last().BackgroundColor, null, Block.LeftCap, true));
            }
            // clear the end of each line in case it's not part of a prompt.
            output.Append(AnsiHelper.Foreground["Clear"]);
            output.Append(AnsiHelper.Background["Clear"]);
            return(output.ToString());
        }
コード例 #6
0
ファイル: PowerLine.cs プロジェクト: rkeithhill/PowerLine
 public override string ToString()
 {
     return(AnsiHelper.WriteAnsi(ForegroundColor, BackgroundColor, Object, Clear));
 }