using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using MLEM.Font;
using MLEM.Formatting;
using MLEM.Formatting.Codes;
using MLEM.Maths;
using MLEM.Misc;
using MLEM.Sound;
using MLEM.Textures;
using MLEM.Ui.Elements;
namespace MLEM.Ui.Style {
///
/// The style settings for a .
/// Each uses these style settings by default, however you can also change these settings per element using the elements' individual style settings.
/// Additional styles for built-in or custom element types can easily be added using .
///
public class UiStyle : GenericDataHolder {
///
/// The texture that is rendered on top of the
///
public NinePatch SelectionIndicator;
///
/// A that is played when the mouse enters an element.
///
public UiAnimation MouseEnterAnimation;
///
/// A that is played when the mouse exists an element.
///
public UiAnimation MouseExitAnimation;
///
/// The texture that the element uses
///
public NinePatch ButtonTexture;
///
/// The texture that the element uses when it is moused over ()
/// Note that, if you just want to change the button's color when hovered, use .
///
public NinePatch ButtonHoveredTexture;
///
/// The color that the element renders with when it is moused over ()
///
public Color ButtonHoveredColor = Color.LightGray;
///
/// The texture that the element uses when it
///
public NinePatch ButtonDisabledTexture;
///
/// The color that the element uses when it
///
public Color ButtonDisabledColor = Color.Gray;
///
/// The texture that the element uses
///
public NinePatch PanelTexture;
///
/// The color that the element draws with.
///
public Color PanelColor = Color.White;
///
/// The to apply to a by default
///
public Padding PanelChildPadding = new Vector2(5);
///
/// The amount that a 's scrollable area is moved per single movement of the scroll wheel
///
public float PanelStepPerScroll = 10;
///
/// The size of the scroller of a 's scroll bar
///
public Vector2 PanelScrollerSize = new Vector2(5, 10);
///
/// The amount of pixels of room there should be between a 's scroll bar and the rest of its content
///
public float PanelScrollBarOffset = 1;
///
/// The texture that the element uses
///
public NinePatch TextFieldTexture;
///
/// The texture that the element uses when it is moused over ()
///
public NinePatch TextFieldHoveredTexture;
///
/// The color that the renders with when it is moused over ()
///
public Color TextFieldHoveredColor = Color.LightGray;
///
/// The x position that a 's text should start rendering at, based on the x position of the text field
///
public float TextFieldTextOffsetX = 4;
///
/// The width that a 's caret should render with
///
public float TextFieldCaretWidth = 0.5F;
///
/// The background texture that the element uses
///
public NinePatch ScrollBarBackground;
///
/// The texture that the scroll indicator of the element uses
///
public NinePatch ScrollBarScrollerTexture;
///
/// Whether or not a should use smooth scrolling
///
public bool ScrollBarSmoothScrolling;
///
/// The factor with which a 's smooth scrolling happens
///
public float ScrollBarSmoothScrollFactor = 0.75F;
///
/// The texture that the element uses
///
public NinePatch CheckboxTexture;
///
/// The texture that the element uses when it is moused over ()
///
public NinePatch CheckboxHoveredTexture;
///
/// The color that the element renders with when it is moused over ()
///
public Color CheckboxHoveredColor = Color.LightGray;
///
/// The texture that the element uses when it .
///
public NinePatch CheckboxDisabledTexture;
///
/// The color that the element uses when it .
///
public Color CheckboxDisabledColor = Color.Gray;
///
/// The texture that the element renders on top of its regular texture when it is
///
public TextureRegion CheckboxCheckmark;
///
/// The width of the space between a and its
///
public float CheckboxTextOffsetX = 2;
///
/// The texture that the element uses
///
public NinePatch RadioTexture;
///
/// The texture that the element uses when it is moused over ()
///
public NinePatch RadioHoveredTexture;
///
/// The color that the element renders with when it is moused over ()
///
public Color RadioHoveredColor = Color.LightGray;
///
/// The texture that the renders on top of its regular texture when it is
///
public TextureRegion RadioCheckmark;
///
/// The texture that the uses for its background
///
public NinePatch TooltipBackground;
///
/// The offset of the element's top left corner from the mouse position
///
public Vector2 TooltipOffset = new Vector2(8, 16);
///
/// The offset of the element's top center coordinate from the bottom center of the element snapped to when is true.
///
public Vector2 TooltipAutoNavOffset = new Vector2(0, 8);
///
/// The auto-nav anchor that is used or tooltips by default.
///
public Anchor TooltipAutoNavAnchor = Anchor.BottomCenter;
///
/// The mouse anchor that is used for tooltips by default.
///
public Anchor TooltipMouseAnchor = Anchor.BottomRight;
///
/// Whether tooltips should use auto-nav rendering behavior for tooltips even when using a mouse by default.
///
public bool TooltipUseAutoNavBehaviorForMouse;
///
/// The color that the text of a should have
///
public Color TooltipTextColor = Color.White;
///
/// The amount of time that the mouse has to be over an element with a for the tooltip to appear
///
public TimeSpan TooltipDelay = TimeSpan.Zero;
///
/// The width of a 's default text
///
public float TooltipTextWidth = 50;
///
/// The to apply to a by default
///
public Padding TooltipChildPadding = new Vector2(2);
///
/// The texture that the element uses for its background
///
public NinePatch ProgressBarTexture;
///
/// The color that the element renders with
///
public Color ProgressBarColor = Color.White;
///
/// The padding that the uses for its progress texture ()
///
public Vector2 ProgressBarProgressPadding = new Vector2(1);
///
/// The texture that the uses for displaying its progress
///
public NinePatch ProgressBarProgressTexture;
///
/// The color that the renders its progress texture with
///
public Color ProgressBarProgressColor = Color.Red;
///
/// The font that and other elements should use for rendering.
/// Note that, to specify a bold and italic font for , you should use and .
///
public GenericFont Font;
///
/// The scale that text should be rendered with in and other elements
///
public float TextScale = 1;
///
/// The color that the text of a should have
///
public Color TextColor = Color.White;
///
/// The that a should use by default.
///
public TextAlignment TextAlignment;
///
/// The that should be played when an element's and events are called.
/// Note that this sound is only played if the callbacks have any subscribers.
///
public SoundEffectInfo ActionSound;
///
/// The color that a 's codes should have.
/// This value is passed to .
///
public Color? LinkColor = Color.CornflowerBlue;
///
/// A set of additional fonts that can be used for the <f FontName> formatting code
///
public Dictionary AdditionalFonts = new Dictionary();
private readonly Dictionary> elementStyles = new Dictionary>();
///
/// Creates a new set of style settings with the default values.
///
public UiStyle() {}
///
/// Creates a new set of style settings with values inherited from the given style settings.
///
/// The original style settings, to copy into the new instance.
public UiStyle(UiStyle original) {
this.SelectionIndicator = original.SelectionIndicator;
this.MouseEnterAnimation = original.MouseEnterAnimation;
this.MouseExitAnimation = original.MouseExitAnimation;
this.ButtonTexture = original.ButtonTexture;
this.ButtonHoveredTexture = original.ButtonHoveredTexture;
this.ButtonHoveredColor = original.ButtonHoveredColor;
this.ButtonDisabledTexture = original.ButtonDisabledTexture;
this.ButtonDisabledColor = original.ButtonDisabledColor;
this.PanelTexture = original.PanelTexture;
this.PanelColor = original.PanelColor;
this.PanelChildPadding = original.PanelChildPadding;
this.PanelStepPerScroll = original.PanelStepPerScroll;
this.PanelScrollerSize = original.PanelScrollerSize;
this.PanelScrollBarOffset = original.PanelScrollBarOffset;
this.TextFieldTexture = original.TextFieldTexture;
this.TextFieldHoveredTexture = original.TextFieldHoveredTexture;
this.TextFieldHoveredColor = original.TextFieldHoveredColor;
this.TextFieldTextOffsetX = original.TextFieldTextOffsetX;
this.TextFieldCaretWidth = original.TextFieldCaretWidth;
this.ScrollBarBackground = original.ScrollBarBackground;
this.ScrollBarScrollerTexture = original.ScrollBarScrollerTexture;
this.ScrollBarSmoothScrolling = original.ScrollBarSmoothScrolling;
this.ScrollBarSmoothScrollFactor = original.ScrollBarSmoothScrollFactor;
this.CheckboxTexture = original.CheckboxTexture;
this.CheckboxHoveredTexture = original.CheckboxHoveredTexture;
this.CheckboxHoveredColor = original.CheckboxHoveredColor;
this.CheckboxDisabledTexture = original.CheckboxDisabledTexture;
this.CheckboxDisabledColor = original.CheckboxDisabledColor;
this.CheckboxCheckmark = original.CheckboxCheckmark;
this.CheckboxTextOffsetX = original.CheckboxTextOffsetX;
this.RadioTexture = original.RadioTexture;
this.RadioHoveredTexture = original.RadioHoveredTexture;
this.RadioHoveredColor = original.RadioHoveredColor;
this.RadioCheckmark = original.RadioCheckmark;
this.TooltipBackground = original.TooltipBackground;
this.TooltipOffset = original.TooltipOffset;
this.TooltipAutoNavOffset = original.TooltipAutoNavOffset;
this.TooltipTextColor = original.TooltipTextColor;
this.TooltipDelay = original.TooltipDelay;
this.TooltipTextWidth = original.TooltipTextWidth;
this.TooltipChildPadding = original.TooltipChildPadding;
this.ProgressBarTexture = original.ProgressBarTexture;
this.ProgressBarColor = original.ProgressBarColor;
this.ProgressBarProgressPadding = original.ProgressBarProgressPadding;
this.ProgressBarProgressTexture = original.ProgressBarProgressTexture;
this.ProgressBarProgressColor = original.ProgressBarProgressColor;
this.Font = original.Font;
this.TextScale = original.TextScale;
this.TextColor = original.TextColor;
this.TextAlignment = original.TextAlignment;
this.ActionSound = original.ActionSound;
this.LinkColor = original.LinkColor;
this.AdditionalFonts = new Dictionary(original.AdditionalFonts);
this.elementStyles = new Dictionary>(original.elementStyles);
}
///
/// Adds an action to the given type that allows applying any kind of custom styling or behavior to it.
/// Custom styles added in this manner can be applied to an element using .
///
/// The style action to add.
/// Whether the function should be added to the existing style settings rather than replacing them.
/// The type that the should apply to.
public void AddCustomStyle(Action style, bool add = false) where T : Element {
if (add && this.elementStyles.ContainsKey(typeof(T))) {
this.elementStyles[typeof(T)] += Action;
} else {
this.elementStyles[typeof(T)] = Action;
}
void Action(Element e) {
style.Invoke((T) e);
}
}
///
/// Applies a set of custom styling actions to the given which were added through .
/// This method is automatically invoked in .
///
/// The element to apply custom styling to.
/// Whether any custom styling exists for the given .
public bool ApplyCustomStyle(Element element) {
if (this.elementStyles.TryGetValue(element.GetType(), out var style)) {
style?.Invoke(element);
return true;
}
return false;
}
}
}