diff options
Diffstat (limited to 'Plugins/MonoGame.Extended/source/MonoGame.Extended.Gui/Element.cs')
-rw-r--r-- | Plugins/MonoGame.Extended/source/MonoGame.Extended.Gui/Element.cs | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/Plugins/MonoGame.Extended/source/MonoGame.Extended.Gui/Element.cs b/Plugins/MonoGame.Extended/source/MonoGame.Extended.Gui/Element.cs new file mode 100644 index 0000000..0c364a9 --- /dev/null +++ b/Plugins/MonoGame.Extended/source/MonoGame.Extended.Gui/Element.cs @@ -0,0 +1,125 @@ +using System.Collections.Generic; +using System.ComponentModel; +using System.Reflection; +using System.Text.Json.Serialization; +using Microsoft.Xna.Framework; +using MonoGame.Extended.TextureAtlases; + +namespace MonoGame.Extended.Gui +{ + public class Binding + { + public Binding(object viewModel, string viewModelProperty, string viewProperty) + { + ViewModel = viewModel; + ViewModelProperty = viewModelProperty; + ViewProperty = viewProperty; + } + + public object ViewModel { get; } + public string ViewModelProperty { get; } + public string ViewProperty { get; } + } + + public abstract class Element + { + public string Name { get; set; } + public Point Position { get; set; } + public Point Origin { get; set; } + public Color BackgroundColor { get; set; } + public Color BorderColor { get; set; } = Color.White; + public int BorderThickness { get; set; } = 0; + + private TextureRegion2D _backgroundRegion; + public TextureRegion2D BackgroundRegion + { + get => _backgroundRegion; + set + { + _backgroundRegion = value; + + if (_backgroundRegion != null && BackgroundColor == Color.Transparent) + BackgroundColor = Color.White; + } + } + + public List<Binding> Bindings { get; } = new List<Binding>(); + + protected void OnPropertyChanged(string propertyName) + { + foreach (var binding in Bindings) + { + if (binding.ViewProperty == propertyName) + { + var value = GetType() + .GetTypeInfo() + .GetDeclaredProperty(binding.ViewProperty) + .GetValue(this); + + binding.ViewModel + .GetType() + .GetTypeInfo() + .GetDeclaredProperty(binding.ViewModelProperty) + .SetValue(binding.ViewModel, value); + } + } + } + + private Size _size; + public Size Size + { + get => _size; + set + { + _size = value; + OnSizeChanged(); + } + } + + protected virtual void OnSizeChanged() { } + + public int MinWidth { get; set; } + public int MinHeight { get; set; } + public int MaxWidth { get; set; } = int.MaxValue; + public int MaxHeight { get; set; } = int.MaxValue; + + public int Width + { + get => Size.Width; + set => Size = new Size(value, Size.Height); + } + + public int Height + { + get => Size.Height; + set => Size = new Size(Size.Width, value); + } + + public Size ActualSize { get; internal set; } + + public abstract void Draw(IGuiContext context, IGuiRenderer renderer, float deltaSeconds); + } + + public abstract class Element<TParent> : Element, IRectangular + where TParent : IRectangular + { + [EditorBrowsable(EditorBrowsableState.Never)] + [JsonIgnore] + public TParent Parent { get; internal set; } + + [EditorBrowsable(EditorBrowsableState.Never)] + [JsonIgnore] + public Rectangle BoundingRectangle + { + get + { + var offset = Point.Zero; + + if (Parent != null) + offset = Parent.BoundingRectangle.Location; + + return new Rectangle(offset + Position - ActualSize * Origin, ActualSize); + } + } + } +} |