https://github.com/Robmaister/SharpFont TODO: replace Code Bold.otf with the full version, fix any bugs, build on Linux, possibly move ToolBox string wrapping and limiting logic to ScalableFont class for better results.
231 lines
6.7 KiB
C#
231 lines
6.7 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, GUIStyle style, GUIComponent parent = null)
|
|
: this(rect, text, null, Alignment.Left, style, parent)
|
|
{
|
|
}
|
|
|
|
public GUIButton(Rectangle rect, string text, Alignment alignment, GUIStyle style, GUIComponent parent = null)
|
|
: this(rect, text, null, alignment, style, parent)
|
|
{
|
|
}
|
|
|
|
public GUIButton(Rectangle rect, string text, Color? color, GUIStyle style, GUIComponent parent = null)
|
|
: this(rect, text, color, (Alignment.Left | Alignment.Top), style, parent)
|
|
{
|
|
}
|
|
|
|
public GUIButton(Rectangle rect, string text, Color? color, Alignment alignment, GUIStyle 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, GUIStyle 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);
|
|
if (style != null) style.Apply(frame, this);
|
|
|
|
textBlock = new GUITextBlock(Rectangle.Empty, text,
|
|
Color.Transparent, (this.style == null) ? Color.Black : this.style.textColor,
|
|
textAlignment, style, this);
|
|
|
|
Enabled = true;
|
|
}
|
|
|
|
public override void Draw(SpriteBatch spriteBatch)
|
|
{
|
|
if (!Visible) return;
|
|
|
|
//Color currColor = color;
|
|
//if (state == ComponentState.Hover) currColor = hoverColor;
|
|
//if (state == ComponentState.Selected) currColor = selectedColor;
|
|
|
|
//GUI.DrawRectangle(spriteBatch, rect, currColor * alpha, true);
|
|
|
|
////spriteBatch.DrawString(HUD.font, text, new Vector2(rect.X+rect.Width/2, rect.Y+rect.Height/2), Color.Black, 0.0f, new Vector2(0.5f,0.5f), 1.0f, SpriteEffects.None, 0.0f);
|
|
|
|
//GUI.DrawRectangle(spriteBatch, rect, Color.Black * alpha, false);
|
|
|
|
DrawChildren(spriteBatch);
|
|
|
|
//if (!Enabled) GUI.DrawRectangle(spriteBatch, rect, Color.Gray*0.5f, true);
|
|
}
|
|
|
|
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.Selected;
|
|
}
|
|
}
|
|
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;
|
|
}
|
|
}
|
|
}
|