mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-28 08:47:59 +01:00
154 lines
6.2 KiB
C#
154 lines
6.2 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Text.Json.Serialization;
|
|
using NStack;
|
|
using Terminal.Gui.Configuration;
|
|
using static Terminal.Gui.Configuration.ConfigurationManager;
|
|
|
|
namespace Terminal.Gui {
|
|
|
|
/// <summary>
|
|
/// A <see cref="Toplevel"/> <see cref="View"/> that draws a border around its <see cref="View.Frame"/> with a Title at the top.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// The 'client area' of a <see cref="Window"/> is a rectangle deflated by one or more rows/columns from <see cref="View.Bounds"/>. A this time there is no
|
|
/// API to determine this rectangle.
|
|
/// </remarks>
|
|
public class Window : Toplevel {
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="Gui.Window"/> class with an optional title using <see cref="LayoutStyle.Absolute"/> positioning.
|
|
/// </summary>
|
|
/// <param name="frame">Superview-relative rectangle specifying the location and size</param>
|
|
/// <param name="title">Title</param>
|
|
/// <remarks>
|
|
/// This constructor initializes a Window with a <see cref="LayoutStyle"/> of <see cref="LayoutStyle.Absolute"/>. Use constructors
|
|
/// that do not take <c>Rect</c> parameters to initialize a Window with <see cref="LayoutStyle.Computed"/>.
|
|
/// </remarks>
|
|
public Window (Rect frame, ustring title = null) : this (frame, title, padding: 0, border: null)
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="Window"/> class with an optional title using <see cref="LayoutStyle.Computed"/> positioning.
|
|
/// </summary>
|
|
/// <param name="title">Title.</param>
|
|
/// <remarks>
|
|
/// This constructor initializes a View with a <see cref="LayoutStyle"/> of <see cref="LayoutStyle.Computed"/>.
|
|
/// Use <see cref="View.X"/>, <see cref="View.Y"/>, <see cref="View.Width"/>, and <see cref="View.Height"/> properties to dynamically control the size and location of the view.
|
|
/// </remarks>
|
|
public Window (ustring title = null) : this (title, padding: 0, border: null)
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="Window"/> class using <see cref="LayoutStyle.Computed"/> positioning.
|
|
/// </summary>
|
|
public Window () : this (title: null) { }
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="Window"/> using <see cref="LayoutStyle.Absolute"/> positioning with the specified frame for its location, with the specified frame padding,
|
|
/// and an optional title.
|
|
/// </summary>
|
|
/// <param name="frame">Superview-relative rectangle specifying the location and size</param>
|
|
/// <param name="title">Title</param>
|
|
/// <param name="padding">Number of characters to use for padding of the drawn frame.</param>
|
|
/// <param name="border">The <see cref="Border"/>.</param>
|
|
/// <remarks>
|
|
/// This constructor initializes a Window with a <see cref="LayoutStyle"/> of <see cref="LayoutStyle.Absolute"/>. Use constructors
|
|
/// that do not take <c>Rect</c> parameters to initialize a Window with <see cref="LayoutStyle"/> of <see cref="LayoutStyle.Computed"/>
|
|
/// </remarks>
|
|
public Window (Rect frame, ustring title = null, int padding = 0, Border border = null) : base (frame)
|
|
{
|
|
SetInitialProperties (title, frame, padding, border);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="Window"/> using <see cref="LayoutStyle.Computed"/> positioning,
|
|
/// and an optional title.
|
|
/// </summary>
|
|
/// <param name="title">Title.</param>
|
|
/// <param name="padding">Number of characters to use for padding of the drawn frame.</param>
|
|
/// <param name="border">The <see cref="Border"/>.</param>
|
|
/// <remarks>
|
|
/// This constructor initializes a View with a <see cref="LayoutStyle"/> of <see cref="LayoutStyle.Computed"/>.
|
|
/// Use <see cref="View.X"/>, <see cref="View.Y"/>, <see cref="View.Width"/>, and <see cref="View.Height"/> properties to dynamically control the size and location of the view.
|
|
/// </remarks>
|
|
public Window (ustring title = null, int padding = 0, Border border = null) : base ()
|
|
{
|
|
SetInitialProperties (title, Rect.Empty, padding, border);
|
|
}
|
|
|
|
/// <summary>
|
|
/// The default <see cref="BorderStyle"/> for <see cref="FrameView"/>. The default is <see cref="BorderStyle.Single"/>.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// This property can be set in a Theme to change the default <see cref="BorderStyle"/> for all <see cref="Window"/>s.
|
|
/// </remarks>
|
|
///[SerializableConfigurationProperty (Scope = typeof (ThemeScope)), JsonConverter (typeof (JsonStringEnumConverter))]
|
|
public static BorderStyle DefaultBorderStyle { get; set; } = BorderStyle.Single;
|
|
|
|
void SetInitialProperties (ustring title, Rect frame, int padding = 0, Border border = null)
|
|
{
|
|
CanFocus = true;
|
|
ColorScheme = Colors.Base;
|
|
if (title == null) title = ustring.Empty;
|
|
Title = title;
|
|
|
|
if (border == null) {
|
|
// TODO: v2 this is a hack until Border gets refactored
|
|
Border = new Border () {
|
|
BorderStyle = DefaultBorderStyle,
|
|
PaddingThickness = new Thickness (padding),
|
|
};
|
|
} else {
|
|
Border = border;
|
|
}
|
|
BorderFrame.Thickness = new Thickness (1);
|
|
BorderFrame.BorderStyle = Border.BorderStyle;
|
|
//BorderFrame.ColorScheme = ColorScheme;
|
|
BorderFrame.Data = "BorderFrame";
|
|
|
|
// TODO: Hack until Border is refactored
|
|
Padding.Thickness = Border.PaddingThickness ?? Padding.Thickness;
|
|
|
|
if (frame.IsEmpty) {
|
|
// Make it bigger to fit the margin, border, & padding
|
|
frame = new Rect (frame.Location, new Size (Margin.Thickness.Horizontal + BorderFrame.Thickness.Horizontal + Padding.Thickness.Horizontal + 1, Margin.Thickness.Vertical + BorderFrame.Thickness.Vertical + Padding.Thickness.Vertical + 1));
|
|
}
|
|
}
|
|
|
|
///// <summary>
|
|
///// Enumerates the various <see cref="View"/>s in the embedded <see cref="ContentView"/>.
|
|
///// </summary>
|
|
///// <returns>The enumerator.</returns>
|
|
//public new IEnumerator GetEnumerator ()
|
|
//{
|
|
// return contentView.GetEnumerator ();
|
|
//}
|
|
|
|
/// <inheritdoc/>
|
|
public override void Add (View view)
|
|
{
|
|
base.Add (view);
|
|
if (view.CanFocus) {
|
|
CanFocus = true;
|
|
}
|
|
AddMenuStatusBar (view);
|
|
}
|
|
|
|
|
|
/// <inheritdoc/>
|
|
public override void Remove (View view)
|
|
{
|
|
if (view == null) {
|
|
return;
|
|
}
|
|
|
|
SetNeedsDisplay ();
|
|
base.Remove (view);
|
|
RemoveMenuStatusBar (view);
|
|
|
|
}
|
|
}
|
|
}
|