Script for automating a large assortment of AME related actions
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
7.9 KiB

using System;
using System.Linq;
namespace Ameliorated.ConsoleUtils
{
public static partial class ConsoleTUI
{
public static Frame OpenFrame;
public partial class Frame
{
private int _displayWidth;
private int _sidePadding;
/// <summary>
/// Sets the visual "frame" to be used later.
/// </summary>
/// <param name="header">The header to be displayed just under the top of the frame.</param>
/// <param name="ignoreHeader">
/// Indicates whether an exception should be raised if the header cannot be aligned with the
/// frame.
/// </param>
/// <exception cref="MethodAccessException">Function was called before a TUI initialization.</exception>
public Frame(string header, bool throwOnMisalignedHeader = true)
{
if (!IsInitialized) throw new MethodAccessException("Console TUI must be initialized before calling other TUI functions.");
if (header.Split(new[]
{ "\r\n", "\n" }, StringSplitOptions.None).Any(x => x.Length > InitializedWidth)) throw new ArgumentException("Header must not be longer than the window width.");
int frameWidth;
if (InitializedWidth.IsEven())
{
if (!header.Length.IsEven() && throwOnMisalignedHeader) throw new ArgumentException("Header length should be even while window width is even.");
frameWidth = (.725 * InitializedWidth).RoundToEven();
} else
{
if (header.Length.IsEven() && throwOnMisalignedHeader) throw new ArgumentException("Header length should be odd while window width is odd.");
frameWidth = (.725 * InitializedWidth).RoundToOdd();
}
Header = header;
FrameWidth = frameWidth;
DisplayWidth = frameWidth - SidePadding * 2;
DisplayOffset = (InitializedWidth - DisplayWidth) / 2;
}
public string Header { get; set; }
public char FrameChar { get; set; } = '_';
public int FrameWidth { get; set; }
public int SidePadding
{
get => _sidePadding;
set
{
_sidePadding = value;
DisplayWidth = FrameWidth - value * 2;
DisplayOffset = (InitializedWidth - DisplayWidth) / 2;
}
}
public int DisplayWidth
{
get => _displayWidth;
set
{
_displayWidth = value;
DisplayOffset = (InitializedWidth - value) / 2;
}
}
internal int DisplayOffset { get; private set; }
internal int DisplayHeight { get; } = Console.WindowHeight - 13;
public void Open(bool paddingLines = true)
{
Console.WriteLine();
var frameOffset = (InitializedWidth - FrameWidth) / 2;
Console.WriteLine(new string(' ', frameOffset) + new string(FrameChar, FrameWidth));
Console.WriteLine();
WriteCenteredLine(Header);
if (paddingLines)
{
Console.WriteLine();
Console.WriteLine();
}
OpenFrame = this;
}
public object Close(Prompt prompt = null, bool alignToBottom = false)
{
OpenFrame = null;
if (alignToBottom)
Console.SetCursorPosition(0, Console.WindowHeight - 7);
Console.WriteLine();
Console.WriteLine();
var frameOffset = (InitializedWidth - FrameWidth) / 2;
Console.WriteLine(new string(' ', frameOffset) + new string(FrameChar, FrameWidth));
Console.WriteLine();
if (prompt != null)
{
if (!prompt.MaxLength.HasValue)
prompt.MaxLength = DisplayWidth - prompt.Text.LastLine().Length;
prompt.BindToOpenFrame = false;
prompt.Text = new string(' ', frameOffset) + prompt.Text;
try { return ((ChoicePrompt)prompt).Start(); } catch (InvalidCastException) {}
try { return ((InputPrompt)prompt).Start(); } catch (InvalidCastException) {}
}
return null;
}
public object Close(string text, Prompt prompt = null, bool alignToBottom = false)
{
OpenFrame = null;
if (alignToBottom)
Console.SetCursorPosition(0, Console.WindowHeight - 7);
Console.WriteLine();
WriteCenteredLine(text, true);
var frameOffset = (InitializedWidth - FrameWidth) / 2;
Console.WriteLine(new string(' ', frameOffset) + new string(FrameChar, FrameWidth));
Console.WriteLine();
if (prompt != null)
{
if (!prompt.MaxLength.HasValue)
prompt.MaxLength = DisplayWidth - prompt.Text.LastLine().Length;
prompt.BindToOpenFrame = false;
prompt.Text = new string(' ', frameOffset) + prompt.Text;
try { return ((ChoicePrompt)prompt).Start(); } catch (InvalidCastException) {}
try { return ((InputPrompt)prompt).Start(); } catch (InvalidCastException) {}
}
return null;
}
public object Close(string text, ConsoleColor foreground, ConsoleColor background, Prompt prompt = null, bool alignToBottom = false)
{
OpenFrame = null;
if (alignToBottom)
Console.SetCursorPosition(0, Console.WindowHeight - 7);
Console.WriteLine();
WriteCenteredLine(text, foreground, background, true);
var frameOffset = (InitializedWidth - FrameWidth) / 2;
Console.WriteLine(new string(' ', frameOffset) + new string(FrameChar, FrameWidth));
Console.WriteLine();
if (prompt != null)
{
if (!prompt.MaxLength.HasValue)
prompt.MaxLength = DisplayWidth - prompt.Text.LastLine().Length;
prompt.BindToOpenFrame = false;
prompt.Text = new string(' ', frameOffset) + prompt.Text;
try { return ((ChoicePrompt)prompt).Start(); } catch (InvalidCastException) {}
try { return ((InputPrompt)prompt).Start(); } catch (InvalidCastException) {}
}
return null;
}
public void Clear(int bottomOffset = 2)
{
for (int i = 0; i < Console.WindowHeight - (6 + bottomOffset); i++)
{
Console.SetCursorPosition(DisplayOffset, i + 6);
Console.Write(new string(' ', DisplayWidth));
}
Console.SetCursorPosition(0, 6);
OpenFrame = this;
}
public int AvailableLines()
{
var totalLines = DisplayHeight - (Math.Max(Console.CursorTop - 6, 0));
return totalLines;
}
public int AvailableChars()
{
var totalChars = Math.Max(Console.CursorLeft - DisplayOffset, 0) + (AvailableLines() * DisplayWidth);
return totalChars;
}
}
}
}