228 lines
6.4 KiB
C#
228 lines
6.4 KiB
C#
using Microsoft.Xna.Framework;
|
|
using Microsoft.Xna.Framework.Graphics;
|
|
using Microsoft.Xna.Framework.Input;
|
|
|
|
namespace Barotrauma
|
|
{
|
|
public class GUIButton : GUIComponent
|
|
{
|
|
protected GUITextBlock textBlock;
|
|
protected GUIFrame frame;
|
|
|
|
public delegate bool OnClickedHandler(GUIButton button, object obj);
|
|
public OnClickedHandler OnClicked;
|
|
|
|
public delegate bool OnPressedHandler();
|
|
public OnPressedHandler OnPressed;
|
|
|
|
public bool CanBeSelected = true;
|
|
|
|
private bool enabled;
|
|
|
|
public bool Enabled
|
|
{
|
|
get
|
|
{
|
|
return enabled;
|
|
}
|
|
|
|
set
|
|
{
|
|
if (value == enabled) return;
|
|
|
|
enabled = value;
|
|
frame.Color = enabled ? color : Color.Gray * 0.7f;
|
|
}
|
|
}
|
|
|
|
public override Color Color
|
|
{
|
|
get { return base.Color; }
|
|
set
|
|
{
|
|
base.Color = value;
|
|
frame.Color = value;
|
|
}
|
|
}
|
|
|
|
public override Color HoverColor
|
|
{
|
|
get { return base.HoverColor; }
|
|
set
|
|
{
|
|
base.HoverColor = value;
|
|
frame.HoverColor = value;
|
|
}
|
|
}
|
|
|
|
public override Color SelectedColor
|
|
{
|
|
get
|
|
{
|
|
return base.SelectedColor;
|
|
}
|
|
set
|
|
{
|
|
base.SelectedColor = value;
|
|
frame.SelectedColor = value;
|
|
}
|
|
}
|
|
|
|
public override Color OutlineColor
|
|
{
|
|
get { return base.OutlineColor; }
|
|
set
|
|
{
|
|
base.OutlineColor = value;
|
|
if (frame != null) frame.OutlineColor = value;
|
|
}
|
|
}
|
|
|
|
public Color TextColor
|
|
{
|
|
get { return textBlock.TextColor; }
|
|
set { textBlock.TextColor = value; }
|
|
}
|
|
|
|
public override ScalableFont Font
|
|
{
|
|
get
|
|
{
|
|
return (textBlock==null) ? GUI.Font : textBlock.Font;
|
|
}
|
|
set
|
|
{
|
|
base.Font = value;
|
|
if (textBlock != null) textBlock.Font = value;
|
|
}
|
|
}
|
|
|
|
public string Text
|
|
{
|
|
get { return textBlock.Text; }
|
|
set { textBlock.Text = value; }
|
|
}
|
|
|
|
public override string ToolTip
|
|
{
|
|
get
|
|
{
|
|
return base.ToolTip;
|
|
}
|
|
set
|
|
{
|
|
textBlock.ToolTip = value;
|
|
base.ToolTip = value;
|
|
}
|
|
}
|
|
|
|
public override Rectangle Rect
|
|
{
|
|
get
|
|
{
|
|
return rect;
|
|
}
|
|
set
|
|
{
|
|
base.Rect = value;
|
|
|
|
frame.Rect = new Rectangle(value.X, value.Y, frame.Rect.Width, frame.Rect.Height);
|
|
textBlock.Rect = value;
|
|
}
|
|
}
|
|
|
|
public bool Selected { get; set; }
|
|
|
|
public GUIButton(Rectangle rect, string text, string style, GUIComponent parent = null)
|
|
: this(rect, text, null, Alignment.Left, style, parent)
|
|
{
|
|
}
|
|
|
|
public GUIButton(Rectangle rect, string text, Alignment alignment, string style, GUIComponent parent = null)
|
|
: this(rect, text, null, alignment, style, parent)
|
|
{
|
|
}
|
|
|
|
public GUIButton(Rectangle rect, string text, Color? color, string style, GUIComponent parent = null)
|
|
: this(rect, text, color, (Alignment.Left | Alignment.Top), style, parent)
|
|
{
|
|
}
|
|
|
|
public GUIButton(Rectangle rect, string text, Color? color, Alignment alignment, string style = "", GUIComponent parent = null)
|
|
: this(rect, text, color, alignment, Alignment.Center, style, parent)
|
|
{
|
|
|
|
}
|
|
|
|
public GUIButton(Rectangle rect, string text, Color? color, Alignment alignment, Alignment textAlignment, string style = "", GUIComponent parent = null)
|
|
: base(style)
|
|
{
|
|
this.rect = rect;
|
|
if (color != null) this.color = (Color)color;
|
|
this.alignment = alignment;
|
|
|
|
if (parent != null) parent.AddChild(this);
|
|
|
|
frame = new GUIFrame(Rectangle.Empty, style, this);
|
|
GUI.Style.Apply(frame, style == "" ? "GUIButton" : style);
|
|
|
|
textBlock = new GUITextBlock(Rectangle.Empty, text,
|
|
Color.Transparent, (this.style == null) ? Color.Black : this.style.textColor,
|
|
textAlignment, null, this);
|
|
GUI.Style.Apply(textBlock, style, this);
|
|
|
|
Enabled = true;
|
|
}
|
|
|
|
public override void ApplyStyle(GUIComponentStyle style)
|
|
{
|
|
base.ApplyStyle(style);
|
|
|
|
if (frame != null) frame.ApplyStyle(style);
|
|
if (textBlock != null) textBlock.ApplyStyle(style);
|
|
}
|
|
|
|
public override void Draw(SpriteBatch spriteBatch)
|
|
{
|
|
if (!Visible) return;
|
|
|
|
DrawChildren(spriteBatch);
|
|
}
|
|
|
|
public override void Update(float deltaTime)
|
|
{
|
|
if (!Visible) return;
|
|
base.Update(deltaTime);
|
|
if (rect.Contains(PlayerInput.MousePosition) && CanBeSelected && Enabled && (MouseOn == null || MouseOn == this || IsParentOf(MouseOn)))
|
|
{
|
|
state = ComponentState.Hover;
|
|
if (PlayerInput.LeftButtonHeld())
|
|
{
|
|
if (OnPressed != null)
|
|
{
|
|
if (OnPressed()) state = ComponentState.Pressed;
|
|
}
|
|
}
|
|
else if (PlayerInput.LeftButtonClicked())
|
|
{
|
|
GUI.PlayUISound(GUISoundType.Click);
|
|
if (OnClicked != null)
|
|
{
|
|
if (OnClicked(this, UserData) && CanBeSelected) state = ComponentState.Selected;
|
|
}
|
|
else
|
|
{
|
|
Selected = !Selected;
|
|
// state = state == ComponentState.Selected ? ComponentState.None : ComponentState.Selected;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
state = Selected ? ComponentState.Selected : ComponentState.None;
|
|
}
|
|
frame.State = state;
|
|
}
|
|
}
|
|
}
|