Fallback to default buffer size

Also fixes a bug when using Spectre.Console in GitHub Actions.
This commit is contained in:
Patrik Svensson 2020-08-28 11:12:23 +02:00 committed by Patrik Svensson
parent ab73d16583
commit a16daade6c
13 changed files with 222 additions and 63 deletions

View File

@ -31,6 +31,16 @@ jobs:
with: with:
dotnet-version: 3.1.301 dotnet-version: 3.1.301
- name: Integration Tests
shell: bash
run: |
dotnet tool restore
dotnet example diagnostic
dotnet example table
dotnet example grid
dotnet example panel
dotnet example colors
- name: Build - name: Build
shell: bash shell: bash
run: | run: |

View File

@ -13,6 +13,12 @@
"commands": [ "commands": [
"gpr" "gpr"
] ]
},
"dotnet-example": {
"version": "0.8.0",
"commands": [
"dotnet-example"
]
} }
} }
} }

View File

@ -2,9 +2,44 @@ using Spectre.Console;
namespace ColorExample namespace ColorExample
{ {
class Program public static class Program
{ {
static void Main(string[] args) public static void Main(string[] args)
{
if (AnsiConsole.Capabilities.ColorSystem == ColorSystem.NoColors)
{
/////////////////////////////////////////////////////////////////
// No colors
/////////////////////////////////////////////////////////////////
AnsiConsole.WriteLine("No colors are supported.");
return;
}
if (AnsiConsole.Capabilities.Supports(ColorSystem.Legacy))
{
/////////////////////////////////////////////////////////////////
// 3-BIT
/////////////////////////////////////////////////////////////////
AnsiConsole.ResetColors();
AnsiConsole.WriteLine();
AnsiConsole.MarkupLine("[bold underline]3-bit Colors[/]");
AnsiConsole.WriteLine();
for (var i = 0; i < 8; i++)
{
AnsiConsole.Background = Color.FromInt32(i);
AnsiConsole.Write(string.Format(" {0,-9}", AnsiConsole.Background.ToString()));
AnsiConsole.ResetColors();
if ((i + 1) % 8 == 0)
{
AnsiConsole.WriteLine();
}
}
}
if (AnsiConsole.Capabilities.Supports(ColorSystem.Standard))
{ {
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// 4-BIT // 4-BIT
@ -25,7 +60,10 @@ namespace ColorExample
AnsiConsole.WriteLine(); AnsiConsole.WriteLine();
} }
} }
}
if (AnsiConsole.Capabilities.Supports(ColorSystem.EightBit))
{
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// 8-BIT // 8-BIT
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
@ -49,7 +87,10 @@ namespace ColorExample
} }
} }
} }
}
if (AnsiConsole.Capabilities.Supports(ColorSystem.TrueColor))
{
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
// 24-BIT // 24-BIT
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
@ -76,3 +117,4 @@ namespace ColorExample
} }
} }
} }
}

View File

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<IsPackable>false</IsPackable>
<Description>Displays the capabilities of the current console.</Description>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Spectre.Console\Spectre.Console.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,18 @@
using System;
using Spectre.Console;
namespace Diagnostic
{
public class Program
{
public static void Main(string[] args)
{
AnsiConsole.MarkupLine("Color system: [bold]{0}[/]", AnsiConsole.Capabilities.ColorSystem);
AnsiConsole.MarkupLine("Supports ansi? [bold]{0}[/]", AnsiConsole.Capabilities.SupportsAnsi);
AnsiConsole.MarkupLine("Legacy console? [bold]{0}[/]", AnsiConsole.Capabilities.LegacyConsole);
AnsiConsole.WriteLine();
AnsiConsole.MarkupLine("Buffer width: [bold]{0}[/]", AnsiConsole.Console.Width);
AnsiConsole.MarkupLine("Buffer height: [bold]{0}[/]", AnsiConsole.Console.Height);
}
}
}

View File

@ -7,9 +7,8 @@ namespace PanelExample
static void Main(string[] args) static void Main(string[] args)
{ {
var content = new Markup( var content = new Markup(
"[underline]I[/] heard [underline on blue]you[/] like 📦\n\n\n\n" + "[underline]I[/] heard [underline on blue]you[/] like panels\n\n\n\n" +
"So I put a 📦 in a 📦\n\n" + "So I put a panel in a panel").Centered();
"😅").Centered();
AnsiConsole.Render( AnsiConsole.Render(
new Panel( new Panel(

View File

@ -41,16 +41,16 @@ namespace TableExample
table.AddColumn(new TableColumn("[blue]Bar[/]") { Alignment = Justify.Right, NoWrap = true }); table.AddColumn(new TableColumn("[blue]Bar[/]") { Alignment = Justify.Right, NoWrap = true });
// Add some rows // Add some rows
table.AddRow("[blue][underline]Hell[/]o[/]", "World 🌍"); table.AddRow("[blue][underline]Hell[/]o[/]", "World");
table.AddRow("[yellow]Patrik [green]\"Hello World\"[/] Svensson[/]", "Was [underline]here[/]!"); table.AddRow("[yellow]Patrik [green]\"Hello World\"[/] Svensson[/]", "Was [underline]here[/]!");
table.AddEmptyRow(); table.AddEmptyRow();
table.AddRow( table.AddRow(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " + "Lorem ipsum dolor sit amet, consectetur adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " +
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure " + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure " +
"dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat " + "dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat " +
"non proident, sunt in culpa qui officia deserunt mollit anim id est laborum", " Strange language"); "non proident, sunt in culpa qui officia deserunt mollit anim id est laborum", "<- Strange language");
table.AddEmptyRow(); table.AddEmptyRow();
table.AddRow("Hej 👋", "[green]Världen[/]"); table.AddRow("Hej", "[green]Världen[/]");
AnsiConsole.Render(table); AnsiConsole.Render(table);
} }
@ -81,7 +81,7 @@ namespace TableExample
table.AddColumn(new TableColumn(new Panel("[u]Baz[/]").SetBorderColor(Color.Blue))); table.AddColumn(new TableColumn(new Panel("[u]Baz[/]").SetBorderColor(Color.Blue)));
// Add some rows // Add some rows
table.AddRow(new Text("Hello").Centered(), new Markup("[red]World![/] 🌍"), Text.Empty); table.AddRow(new Text("Hello").Centered(), new Markup("[red]World![/]"), Text.Empty);
table.AddRow(second, new Text("Whaaat"), new Text("Lol")); table.AddRow(second, new Text("Whaaat"), new Text("Lol"));
table.AddRow(new Markup("[blue]Hej[/]").Centered(), new Markup("[yellow]Världen![/]"), Text.Empty); table.AddRow(new Markup("[blue]Hej[/]").Centered(), new Markup("[yellow]Världen![/]"), Text.Empty);

View File

@ -25,6 +25,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grid", "..\examples\Grid\Gr
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Colors", "..\examples\Colors\Colors.csproj", "{1F51C55C-BA4C-4856-9001-0F7924FFB179}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Colors", "..\examples\Colors\Colors.csproj", "{1F51C55C-BA4C-4856-9001-0F7924FFB179}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Diagnostic", "..\examples\Diagnostic\Diagnostic.csproj", "{4337F255-88E9-4408-81A3-DF1AF58AC753}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -107,6 +109,18 @@ Global
{1F51C55C-BA4C-4856-9001-0F7924FFB179}.Release|x64.Build.0 = Release|Any CPU {1F51C55C-BA4C-4856-9001-0F7924FFB179}.Release|x64.Build.0 = Release|Any CPU
{1F51C55C-BA4C-4856-9001-0F7924FFB179}.Release|x86.ActiveCfg = Release|Any CPU {1F51C55C-BA4C-4856-9001-0F7924FFB179}.Release|x86.ActiveCfg = Release|Any CPU
{1F51C55C-BA4C-4856-9001-0F7924FFB179}.Release|x86.Build.0 = Release|Any CPU {1F51C55C-BA4C-4856-9001-0F7924FFB179}.Release|x86.Build.0 = Release|Any CPU
{4337F255-88E9-4408-81A3-DF1AF58AC753}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4337F255-88E9-4408-81A3-DF1AF58AC753}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4337F255-88E9-4408-81A3-DF1AF58AC753}.Debug|x64.ActiveCfg = Debug|Any CPU
{4337F255-88E9-4408-81A3-DF1AF58AC753}.Debug|x64.Build.0 = Debug|Any CPU
{4337F255-88E9-4408-81A3-DF1AF58AC753}.Debug|x86.ActiveCfg = Debug|Any CPU
{4337F255-88E9-4408-81A3-DF1AF58AC753}.Debug|x86.Build.0 = Debug|Any CPU
{4337F255-88E9-4408-81A3-DF1AF58AC753}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4337F255-88E9-4408-81A3-DF1AF58AC753}.Release|Any CPU.Build.0 = Release|Any CPU
{4337F255-88E9-4408-81A3-DF1AF58AC753}.Release|x64.ActiveCfg = Release|Any CPU
{4337F255-88E9-4408-81A3-DF1AF58AC753}.Release|x64.Build.0 = Release|Any CPU
{4337F255-88E9-4408-81A3-DF1AF58AC753}.Release|x86.ActiveCfg = Release|Any CPU
{4337F255-88E9-4408-81A3-DF1AF58AC753}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -116,6 +130,7 @@ Global
{BFF37228-B376-4ADD-9657-4E501F929713} = {F0575243-121F-4DEE-9F6B-246E26DC0844} {BFF37228-B376-4ADD-9657-4E501F929713} = {F0575243-121F-4DEE-9F6B-246E26DC0844}
{C7FF6FDB-FB59-4517-8669-521C96AB7323} = {F0575243-121F-4DEE-9F6B-246E26DC0844} {C7FF6FDB-FB59-4517-8669-521C96AB7323} = {F0575243-121F-4DEE-9F6B-246E26DC0844}
{1F51C55C-BA4C-4856-9001-0F7924FFB179} = {F0575243-121F-4DEE-9F6B-246E26DC0844} {1F51C55C-BA4C-4856-9001-0F7924FFB179} = {F0575243-121F-4DEE-9F6B-246E26DC0844}
{4337F255-88E9-4408-81A3-DF1AF58AC753} = {F0575243-121F-4DEE-9F6B-246E26DC0844}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5729B071-67A0-48FB-8B1B-275E6822086C} SolutionGuid = {5729B071-67A0-48FB-8B1B-275E6822086C}

View File

@ -38,6 +38,17 @@ namespace Spectre.Console
LegacyConsole = legacyConsole; LegacyConsole = legacyConsole;
} }
/// <summary>
/// Checks whether the current capabilities supports
/// the specified color system.
/// </summary>
/// <param name="colorSystem">The color system to check.</param>
/// <returns><c>true</c> if the color system is supported, otherwise <c>false</c>.</returns>
public bool Supports(ColorSystem colorSystem)
{
return (int)colorSystem <= (int)ColorSystem;
}
/// <inheritdoc/> /// <inheritdoc/>
public override string ToString() public override string ToString()
{ {

View File

@ -21,7 +21,7 @@ namespace Spectre.Console.Internal
{ {
if (_out.IsStandardOut()) if (_out.IsStandardOut())
{ {
return System.Console.BufferWidth; return ConsoleHelper.GetSafeBufferWidth(Constants.DefaultBufferWidth);
} }
return Constants.DefaultBufferWidth; return Constants.DefaultBufferWidth;
@ -34,7 +34,7 @@ namespace Spectre.Console.Internal
{ {
if (_out.IsStandardOut()) if (_out.IsStandardOut())
{ {
return System.Console.BufferHeight; return ConsoleHelper.GetSafeBufferHeight(Constants.DefaultBufferHeight);
} }
return Constants.DefaultBufferHeight; return Constants.DefaultBufferHeight;

View File

@ -3,7 +3,7 @@ using System.Diagnostics.CodeAnalysis;
namespace Spectre.Console.Internal namespace Spectre.Console.Internal
{ {
internal static class ConsoleExtensions internal static class AnsiConsoleExtensions
{ {
public static IDisposable PushStyle(this IAnsiConsole console, Style style) public static IDisposable PushStyle(this IAnsiConsole console, Style style)
{ {

View File

@ -24,7 +24,7 @@ namespace Spectre.Console.Internal
{ {
if (_out.IsStandardOut()) if (_out.IsStandardOut())
{ {
return System.Console.BufferWidth; return ConsoleHelper.GetSafeBufferWidth(Constants.DefaultBufferWidth);
} }
return Constants.DefaultBufferWidth; return Constants.DefaultBufferWidth;
@ -37,7 +37,7 @@ namespace Spectre.Console.Internal
{ {
if (_out.IsStandardOut()) if (_out.IsStandardOut())
{ {
return System.Console.BufferHeight; return ConsoleHelper.GetSafeBufferHeight(Constants.DefaultBufferHeight);
} }
return Constants.DefaultBufferHeight; return Constants.DefaultBufferHeight;

View File

@ -0,0 +1,44 @@
using System.IO;
using System.Runtime.InteropServices;
namespace Spectre.Console.Internal
{
internal static class ConsoleHelper
{
public static int GetSafeBufferWidth(int defaultValue = Constants.DefaultBufferWidth)
{
try
{
var width = System.Console.BufferWidth;
if (width == 0)
{
width = defaultValue;
}
return width;
}
catch (IOException)
{
return defaultValue;
}
}
public static int GetSafeBufferHeight(int defaultValue = Constants.DefaultBufferWidth)
{
try
{
var height = System.Console.BufferHeight;
if (height == 0)
{
height = defaultValue;
}
return height;
}
catch (IOException)
{
return defaultValue;
}
}
}
}