diff --git a/DTLib/Console/ColoredConsole.cs b/DTLib/Console/ColoredConsole.cs index ff8015c..77cc0f7 100644 --- a/DTLib/Console/ColoredConsole.cs +++ b/DTLib/Console/ColoredConsole.cs @@ -1,86 +1,89 @@ namespace DTLib.Console; -// -// вывод и ввод цветного текста в консоли -// работает медленнее чем хотелось бы -// public static class ColoredConsole { - // парсит название цвета в ConsoleColor - public static ConsoleColor ParseColor(string color) => color switch - { - //case "magneta": - "m" => ConsoleColor.Magenta, - //case "green": - "g" => ConsoleColor.Green, - //case "red": - "r" => ConsoleColor.Red, - //case "yellow": - "y" => ConsoleColor.Yellow, - //case "white": - "w" => ConsoleColor.White, - //case "blue": - "b" => ConsoleColor.Blue, - //case "cyan": - "c" => ConsoleColor.Cyan, - //case "h": - "h" or "gray" => ConsoleColor.Gray, - //case "black": - "black" => ConsoleColor.Black, - _ => throw new Exception($"ColoredConsole.ParseColor({color}) error: incorrect color"), - }; - - public static void Write(ConsoleColor color,string msg) - { - System.Console.ForegroundColor = color; - System.Console.Write(msg); - System.Console.ForegroundColor = ConsoleColor.Gray; - } - - public static void Write(string msg) => Write(ConsoleColor.Gray, msg); + public static int Width => System.Console.WindowWidth; + public static int Height => System.Console.WindowHeight; - // вывод цветного текста - public static void Write(params string[] input) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Fg(ConsoleColor color) => System.Console.ForegroundColor = color; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Bg(ConsoleColor color) => System.Console.BackgroundColor = color; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void ResetColor() => System.Console.ResetColor(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Clear() { - if (input.Length == 1) - { - Write(input[0]); - return; - } - - if (input.Length % 2 != 0) - throw new Exception("ColoredConsole.Write() error: every text string must have color string before"); - - for (ushort i = 0; i < input.Length; i++) - { - System.Console.ForegroundColor = ParseColor(input[i++]); - System.Console.Write(input[i]); - } - System.Console.ForegroundColor = ConsoleColor.Gray; + ResetColor(); + System.Console.Clear(); } - public static void WriteLine() => System.Console.WriteLine(); - public static void WriteLine(ConsoleColor color,string msg) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Write(char c) => System.Console.Write(c); + + public static void Write(string msg, ConsoleColor? fg = null, ConsoleColor? bg = null) { - System.Console.ForegroundColor = color; - System.Console.WriteLine(msg); - System.Console.ForegroundColor = ConsoleColor.Gray; + if(fg != null) Fg(fg.Value); + if(bg != null) Bg(bg.Value); +#if NETSTANDARD2_0 + var chars = msg.ToCharArray(); +#else + var chars = msg.AsSpan(); +#endif + for (int i = 0; i < chars.Length; ++i) + { + Write(chars[i]); + } } - public static void WriteLine(params string[] input) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void WriteLine() => Write('\n'); + + public static void WriteLine(string msg, ConsoleColor? fg = null, ConsoleColor? bg = null) { - Write(input); + Write(msg, fg, bg); WriteLine(); } - - // ввод цветного текста - public static string? Read(ConsoleColor color) + + public static string? ReadLine(string query, ConsoleColor? fg = null, ConsoleColor? bg = null) { - System.Console.ForegroundColor = color; - var r = System.Console.ReadLine(); - System.Console.ForegroundColor = ConsoleColor.Gray; - return r; + Write(query, fg, bg); + Write(':'); + Write(' '); + return System.Console.ReadLine(); + } + + public static void WriteHLine(char c, ConsoleColor? fg = null, ConsoleColor? bg = null) + { + WriteLine(c.Multiply(Width - 1), fg, bg); + } + + public static void WriteTitle(string title, char spacing = '-', + string left_framing = "[", string right_framing = "]", + ConsoleColor? fg = null, ConsoleColor? bg = null) + { + int both_spacing_length = Width - title.Length - left_framing.Length - right_framing.Length - 1; + int left_spacing_length = both_spacing_length / 2; + int right_spacing_length = left_spacing_length + both_spacing_length % 2; + + var b = new StringBuilder(); + if(left_spacing_length > 0) + b.Append(spacing.Multiply(left_spacing_length)); + b.Append(left_framing); + b.Append(title); + b.Append(right_framing); + if(right_spacing_length > 0) + b.Append(spacing.Multiply(right_spacing_length)); + + WriteLine(b.ToString(), fg, bg); } - public static string? Read(string color) => Read(ParseColor(color)); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void WriteCentred(string title, ConsoleColor? fg = null, ConsoleColor? bg = null) + { + WriteTitle(title, ' ', "", "", fg, bg); + } } diff --git a/DTLib/DTLib.csproj b/DTLib/DTLib.csproj index 5afaab5..a34c6b8 100644 --- a/DTLib/DTLib.csproj +++ b/DTLib/DTLib.csproj @@ -2,7 +2,7 @@ DTLib - 1.4.3 + 1.6.0 Timerix Library for all my C# projects GIT diff --git a/DTLib/Logging/Loggers/ConsoleLogger.cs b/DTLib/Logging/Loggers/ConsoleLogger.cs index 231435b..2b0e04c 100644 --- a/DTLib/Logging/Loggers/ConsoleLogger.cs +++ b/DTLib/Logging/Loggers/ConsoleLogger.cs @@ -27,7 +27,7 @@ public class ConsoleLogger : ILogger var msg = format.CreateMessage(context, severity, message); lock (consolelocker) - ColoredConsole.WriteLine(ColorFromSeverity(severity),msg); + ColoredConsole.WriteLine(msg, fg: ColorFromSeverity(severity)); } private static ConsoleColor ColorFromSeverity(LogSeverity severity) diff --git a/DTLib/Logging/Loggers/ConsoleWrapperLogger.cs b/DTLib/Logging/Loggers/LineWriterLogger.cs similarity index 52% rename from DTLib/Logging/Loggers/ConsoleWrapperLogger.cs rename to DTLib/Logging/Loggers/LineWriterLogger.cs index 9b4f699..c988e1e 100644 --- a/DTLib/Logging/Loggers/ConsoleWrapperLogger.cs +++ b/DTLib/Logging/Loggers/LineWriterLogger.cs @@ -1,13 +1,11 @@ -using DTLib.Logging; +namespace DTLib.Logging; -namespace launcher_client; - -public interface IConsoleWrapper : IDisposable +public interface ILineWriter : IDisposable { public void WriteLine(string msg); } -public class ConsoleWrapperLogger : ILogger +public class LineWriterLogger : ILogger { public bool DebugLogEnabled { get; set; } = false; public bool InfoLogEnabled { get; set; } = true; @@ -15,16 +13,16 @@ public class ConsoleWrapperLogger : ILogger public bool ErrorLogEnabled { get; set; } = true; public ILogFormat Format { get; set; } - private readonly IConsoleWrapper _consoleWrapper; + private readonly ILineWriter _lineWriter; - public ConsoleWrapperLogger(IConsoleWrapper consoleWrapper, ILogFormat format) + public LineWriterLogger(ILineWriter lineWriter, ILogFormat format) { - _consoleWrapper = consoleWrapper; + _lineWriter = lineWriter; Format = format; } - public ConsoleWrapperLogger(IConsoleWrapper consoleWrapper) - : this(consoleWrapper, new DefaultLogFormat()) + public LineWriterLogger(ILineWriter lineWriter) + : this(lineWriter, new DefaultLogFormat()) {} public void Log(string context, LogSeverity severity, object message, ILogFormat format) @@ -33,14 +31,14 @@ public class ConsoleWrapperLogger : ILogger return; var msg = format.CreateMessage(context, severity, message); - lock (_consoleWrapper) - _consoleWrapper.WriteLine(msg); + lock (_lineWriter) + _lineWriter.WriteLine(msg); } public void Dispose() { - _consoleWrapper.Dispose(); + _lineWriter.Dispose(); } - ~ConsoleWrapperLogger() => Dispose(); + ~LineWriterLogger() => Dispose(); } \ No newline at end of file