This repository has been archived on 2023-07-11. You can view files and clone it, but cannot push or open issues or pull requests.
gwen-dotnet/Gwen/Control/WindowControl.cs

178 lines
5.5 KiB
C#

using System;
//using System.Drawing;
using System.Linq;
using Gwen.ControlInternal;
namespace Gwen.Control
{
/// <summary>
/// Movable window with title bar.
/// </summary>
public class WindowControl : ResizableControl
{
private readonly Dragger m_TitleBar;
private readonly Label m_Caption;
private readonly CloseButton m_CloseButton;
private bool m_DeleteOnClose;
private Modal m_Modal;
/// <summary>
/// Window caption.
/// </summary>
public String Caption { get { return m_Caption.Text; } set { m_Caption.Text = value; } }
/// <summary>
/// Determines whether the window has close button.
/// </summary>
public bool IsClosable { get { return !m_CloseButton.IsHidden; } set { m_CloseButton.IsHidden = !value; } }
/// <summary>
/// Determines whether the control should be disposed on close.
/// </summary>
public bool DeleteOnClose { get { return m_DeleteOnClose; } set { m_DeleteOnClose = value; } }
/// <summary>
/// Indicates whether the control is hidden.
/// </summary>
public override bool IsHidden
{
get { return base.IsHidden; }
set
{
if (!value)
BringToFront();
base.IsHidden = value;
}
}
/// <summary>
/// Initializes a new instance of the <see cref="WindowControl"/> class.
/// </summary>
/// <param name="parent">Parent control.</param>
/// <param name="caption">Window caption.</param>
/// <param name="modal">Determines whether the window should be modal.</param>
public WindowControl(Base parent, String caption = "", bool modal = false)
: base(parent)
{
m_TitleBar = new Dragger(this);
m_TitleBar.Height = 24;
m_TitleBar.Padding = Gwen.Padding.Zero;
m_TitleBar.Margin = new Margin(0, 0, 0, 4);
m_TitleBar.Target = this;
m_TitleBar.Dock = Pos.Top;
m_Caption = new Label(m_TitleBar);
m_Caption.Alignment = Pos.Left | Pos.CenterV;
m_Caption.Text = caption;
m_Caption.Dock = Pos.Fill;
m_Caption.Padding = new Padding(8, 0, 0, 0);
m_Caption.TextColor = Skin.Colors.Window.TitleInactive;
m_CloseButton = new CloseButton(m_TitleBar, this);
//m_CloseButton.Text = String.Empty;
m_CloseButton.SetSize(24, 24);
m_CloseButton.Dock = Pos.Right;
m_CloseButton.Clicked += CloseButtonPressed;
m_CloseButton.IsTabable = false;
m_CloseButton.Name = "closeButton";
//Create a blank content control, dock it to the top - Should this be a ScrollControl?
m_InnerPanel = new Base(this);
m_InnerPanel.Dock = Pos.Fill;
GetResizer(8).Hide();
BringToFront();
IsTabable = false;
Focus();
MinimumSize = new Point(100, 40);
ClampMovement = true;
KeyboardInputEnabled = false;
if (modal)
MakeModal();
}
protected virtual void CloseButtonPressed(Base control)
{
IsHidden = true;
if (m_Modal != null)
{
m_Modal.DelayedDelete();
m_Modal = null;
}
if (m_DeleteOnClose)
{
Parent.RemoveChild(this, true);
}
}
/// <summary>
/// Makes the window modal: covers the whole canvas and gets all input.
/// </summary>
/// <param name="dim">Determines whether all the background should be dimmed.</param>
public void MakeModal(bool dim = false)
{
if (m_Modal != null)
return;
m_Modal = new Modal(GetCanvas());
Parent = m_Modal;
if (dim)
m_Modal.ShouldDrawBackground = true;
else
m_Modal.ShouldDrawBackground = false;
}
/// <summary>
/// Indicates whether the control is on top of its parent's children.
/// </summary>
public override bool IsOnTop
{
get { return Parent.Children.Where(x => x is WindowControl).Last() == this; }
}
/// <summary>
/// Renders the control using specified skin.
/// </summary>
/// <param name="skin">Skin to use.</param>
protected override void Render(Skin.Base skin)
{
bool hasFocus = IsOnTop;
if (hasFocus)
m_Caption.TextColor = Skin.Colors.Window.TitleActive;
else
m_Caption.TextColor = Skin.Colors.Window.TitleInactive;
skin.DrawWindow(this, m_TitleBar.Bottom, hasFocus);
}
/// <summary>
/// Renders under the actual control (shadows etc).
/// </summary>
/// <param name="skin">Skin to use.</param>
protected override void RenderUnder(Skin.Base skin)
{
base.RenderUnder(skin);
skin.DrawShadow(this);
}
public override void Touch()
{
base.Touch();
BringToFront();
}
/// <summary>
/// Renders the focus overlay.
/// </summary>
/// <param name="skin">Skin to use.</param>
protected override void RenderFocus(Skin.Base skin)
{
}
}
}