using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using JetBrains.Annotations;
|
|
|
|
namespace Ameliorated.ConsoleUtils
|
|
{
|
|
[AttributeUsage(AttributeTargets.Property)]
|
|
internal sealed class OptionalAttribute : Attribute
|
|
{
|
|
}
|
|
|
|
public static class ConsoleUtils
|
|
{
|
|
public class LoadingIndicator : IDisposable
|
|
{
|
|
public LoadingIndicator() {}
|
|
|
|
public LoadingIndicator(bool start)
|
|
{
|
|
if (start)
|
|
StartAsync();
|
|
}
|
|
|
|
private CancellationTokenSource cts = new CancellationTokenSource();
|
|
Task currentTask = Task.CompletedTask;
|
|
public async Task StartAsync()
|
|
{
|
|
Console.CursorVisible = false;
|
|
cts = new CancellationTokenSource();
|
|
currentTask = Task.Run(() =>
|
|
{
|
|
if (cts.IsCancellationRequested)
|
|
{
|
|
Console.WriteLine("...");
|
|
return;
|
|
}
|
|
|
|
Console.Write('.');
|
|
while (true)
|
|
{
|
|
Thread.Sleep(500);
|
|
Console.Write('.');
|
|
Thread.Sleep(500);
|
|
Console.Write('.');
|
|
Thread.Sleep(500);
|
|
if (cts.IsCancellationRequested)
|
|
{
|
|
Console.WriteLine();
|
|
return;
|
|
}
|
|
|
|
Console.Write("\b \b\b \b");
|
|
}
|
|
});
|
|
|
|
await currentTask;
|
|
}
|
|
|
|
public void Stop()
|
|
{
|
|
cts.Cancel();
|
|
|
|
currentTask.Wait();
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Stop();
|
|
|
|
this.currentTask = null;
|
|
this.cts = null;
|
|
}
|
|
}
|
|
|
|
public static bool DisplayErrors { get; set; } = true;
|
|
|
|
|
|
|
|
public static void ClearInputBuffer()
|
|
{
|
|
while (Console.KeyAvailable) Console.ReadKey(true);
|
|
}
|
|
|
|
internal static void WriteError(string text)
|
|
{
|
|
if (DisplayErrors) Console.WriteLine("ConsoleUtils: " + text);
|
|
}
|
|
|
|
|
|
private static ConsoleColor foregroundCache;
|
|
private static ConsoleColor backgroundCache;
|
|
private static bool? foregroundOnly;
|
|
|
|
internal static void SetColor([CanBeNull] ConsoleColor? foreground)
|
|
{
|
|
foregroundCache = Console.ForegroundColor;
|
|
if (foreground.HasValue)
|
|
Console.ForegroundColor = foreground.Value;
|
|
|
|
foregroundOnly = true;
|
|
}
|
|
|
|
internal static void SetColor([CanBeNull] ConsoleColor? foreground, [CanBeNull] ConsoleColor? background)
|
|
{
|
|
foregroundCache = Console.ForegroundColor;
|
|
backgroundCache = Console.BackgroundColor;
|
|
|
|
if (foreground.HasValue)
|
|
Console.ForegroundColor = foreground.Value;
|
|
if (background.HasValue)
|
|
Console.BackgroundColor = background.Value;
|
|
|
|
foregroundOnly = false;
|
|
}
|
|
|
|
internal static void ResetColor()
|
|
{
|
|
if (!foregroundOnly.HasValue) throw new MethodAccessException("SetColor must be used before calling ResetColor.");
|
|
|
|
if (foregroundOnly.Value)
|
|
{
|
|
Console.ForegroundColor = foregroundCache;
|
|
} else
|
|
{
|
|
Console.ForegroundColor = foregroundCache;
|
|
Console.BackgroundColor = backgroundCache;
|
|
}
|
|
|
|
foregroundOnly = null;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void WriteLine(string text, ConsoleColor? foreground)
|
|
{
|
|
foreach (var line in text.SplitByLine())
|
|
{
|
|
ConsoleUtils.SetColor(foreground);
|
|
Console.WriteLine(line);
|
|
ConsoleUtils.ResetColor();
|
|
}
|
|
}
|
|
public static void WriteLine(string text, ConsoleColor? foreground, ConsoleColor? background)
|
|
{
|
|
foreach (var line in text.SplitByLine())
|
|
{
|
|
ConsoleUtils.SetColor(foreground);
|
|
Console.WriteLine(line);
|
|
ConsoleUtils.ResetColor();
|
|
}
|
|
}
|
|
|
|
public static void WriteLine(string text, int offset)
|
|
{
|
|
foreach (var line in text.SplitByLine())
|
|
{
|
|
Console.WriteLine(line.Insert(0, new string(' ', offset)));
|
|
}
|
|
}
|
|
|
|
public static void WriteLine(string text, int offset, ConsoleColor? foreground)
|
|
{
|
|
foreach (var line in text.SplitByLine())
|
|
{
|
|
Console.Write(new string(' ', offset));
|
|
|
|
ConsoleUtils.SetColor(foreground);
|
|
Console.WriteLine(line);
|
|
ConsoleUtils.ResetColor();
|
|
}
|
|
}
|
|
|
|
public static void WriteLine(string text, int offset, ConsoleColor? foreground, ConsoleColor? background)
|
|
{
|
|
foreach (var line in text.SplitByLine())
|
|
{
|
|
Console.Write(new string(' ', offset));
|
|
|
|
ConsoleUtils.SetColor(foreground, background);
|
|
Console.WriteLine(line);
|
|
ConsoleUtils.ResetColor();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public static void Write(string text, ConsoleColor? foreground)
|
|
{
|
|
foreach (var line in text.SplitByLine())
|
|
{
|
|
ConsoleUtils.SetColor(foreground);
|
|
Console.Write(line);
|
|
ConsoleUtils.ResetColor();
|
|
}
|
|
}
|
|
public static void Write(string text, ConsoleColor? foreground, ConsoleColor? background)
|
|
{
|
|
foreach (var line in text.SplitByLine())
|
|
{
|
|
ConsoleUtils.SetColor(foreground);
|
|
Console.Write(line);
|
|
ConsoleUtils.ResetColor();
|
|
}
|
|
}
|
|
|
|
public static void Write(string text, int offset)
|
|
{
|
|
foreach (var line in text.SplitByLine())
|
|
{
|
|
Console.Write(line.Insert(0, new string(' ', offset)));
|
|
}
|
|
}
|
|
|
|
public static void Write(string text, int offset, ConsoleColor? foreground)
|
|
{
|
|
foreach (var line in text.SplitByLine())
|
|
{
|
|
Console.Write(new string(' ', offset));
|
|
|
|
ConsoleUtils.SetColor(foreground);
|
|
Console.Write(line);
|
|
ConsoleUtils.ResetColor();
|
|
}
|
|
}
|
|
|
|
public static void Write(string text, int offset, ConsoleColor? foreground, ConsoleColor? background)
|
|
{
|
|
foreach (var line in text.SplitByLine())
|
|
{
|
|
Console.Write(new string(' ', offset));
|
|
|
|
ConsoleUtils.SetColor(foreground, background);
|
|
Console.Write(line);
|
|
ConsoleUtils.ResetColor();
|
|
}
|
|
}
|
|
}
|
|
}
|