1
0
Fork 0
mirror of https://github.com/Ellpeck/MLEM.git synced 2024-05-23 00:53:37 +02:00

better implementation of the touch mousing from yesterday

This commit is contained in:
Ellpeck 2020-06-04 20:52:21 +02:00
parent 81ed3d3bee
commit 6b1e5f8dd9
3 changed files with 79 additions and 11 deletions

View file

@ -259,7 +259,7 @@ namespace MLEM.Ui.Elements {
public float DrawAlpha = 1;
/// <summary>
/// Stores whether this element is currently being moused over.
/// Stores whether this element is currently being moused over or touched.
/// </summary>
public bool IsMouseOver { get; protected set; }
/// <summary>
@ -300,6 +300,14 @@ namespace MLEM.Ui.Elements {
/// </summary>
public GenericCallback OnMouseExit;
/// <summary>
/// Event that is called when this element starts being touched
/// </summary>
public GenericCallback OnTouchEnter;
/// <summary>
/// Event that is called when this element stops being touched
/// </summary>
public GenericCallback OnTouchExit;
/// <summary>
/// Event that is called when text input is made.
/// Note that this event is called for every element, even if it is not selected.
/// Also note that if <see cref="TextInputWrapper.RequiresOnScreenKeyboard"/> is true, this event is never called.
@ -315,6 +323,11 @@ namespace MLEM.Ui.Elements {
/// </summary>
public OtherElementCallback OnMousedElementChanged;
/// <summary>
/// Event that is called when the element that is currently being touched changes within the ui system.
/// Note that the event fired doesn't necessarily correlate to this specific element.
/// </summary>
public OtherElementCallback OnTouchedElementChanged;
/// <summary>
/// Event that is called when the element that is currently selected changes within the ui system.
/// Note that the event fired doesn't necessarily correlate to this specific element.
/// </summary>
@ -362,6 +375,8 @@ namespace MLEM.Ui.Elements {
this.OnMouseEnter += element => this.IsMouseOver = true;
this.OnMouseExit += element => this.IsMouseOver = false;
this.OnTouchEnter += element => this.IsMouseOver = true;
this.OnTouchExit += element => this.IsMouseOver = false;
this.OnSelected += element => this.IsSelected = true;
this.OnDeselected += element => this.IsSelected = false;
this.GetTabNextElement += (backward, next) => next;

View file

@ -35,11 +35,15 @@ namespace MLEM.Ui {
/// The <see cref="RootElement"/> that is currently active.
/// The active root element is the one with the highest <see cref="RootElement.Priority"/> that whose <see cref="RootElement.CanSelectContent"/> property is true.
/// </summary>
public RootElement ActiveRoot { get; private set; }
public RootElement ActiveRoot { get; protected set; }
/// <summary>
/// The <see cref="Element"/> that the mouse is currently over.
/// </summary>
public Element MousedElement { get; private set; }
public Element MousedElement { get; protected set; }
/// <summary>
/// The <see cref="Element"/> that is currently touched.
/// </summary>
public Element TouchedElement { get; protected set; }
private readonly Dictionary<string, Element> selectedElements = new Dictionary<string, Element>();
/// <summary>
/// The element that is currently selected.
@ -141,14 +145,7 @@ namespace MLEM.Ui {
// MOUSE INPUT
if (this.HandleMouse) {
var mousedNow = this.GetElementUnderPos(this.Input.MousePosition.ToVector2());
if (mousedNow != this.MousedElement) {
if (this.MousedElement != null)
this.System.OnElementMouseExit?.Invoke(this.MousedElement);
if (mousedNow != null)
this.System.OnElementMouseEnter?.Invoke(mousedNow);
this.MousedElement = mousedNow;
this.System.OnMousedElementChanged?.Invoke(mousedNow);
}
this.SetMousedElement(mousedNow);
if (this.Input.IsMouseButtonPressed(MouseButton.Left)) {
this.IsAutoNavMode = false;
@ -200,6 +197,19 @@ namespace MLEM.Ui {
this.SelectElement(this.ActiveRoot, held);
if (held != null && held.CanBePressed)
this.System.OnElementSecondaryPressed?.Invoke(held);
} else if (this.Input.TouchState.Count <= 0) {
this.SetTouchedElement(null);
} else {
foreach (var location in this.Input.TouchState) {
var element = this.GetElementUnderPos(location.Position);
if (location.State == TouchLocationState.Pressed) {
// start touching an element if we just touched down on it
this.SetTouchedElement(element);
} else if (element != this.TouchedElement) {
// if we moved off of the touched element, we stop touching
this.SetTouchedElement(null);
}
}
}
}
@ -269,6 +279,36 @@ namespace MLEM.Ui {
this.IsAutoNavMode = autoNav.Value;
}
/// <summary>
/// Sets the <see cref="MousedElement"/> to the given value, calling the appropriate events.
/// </summary>
/// <param name="element">The element to set as moused</param>
public void SetMousedElement(Element element) {
if (element != this.MousedElement) {
if (this.MousedElement != null)
this.System.OnElementMouseExit?.Invoke(this.MousedElement);
if (element != null)
this.System.OnElementMouseEnter?.Invoke(element);
this.MousedElement = element;
this.System.OnMousedElementChanged?.Invoke(element);
}
}
/// <summary>
/// Sets the <see cref="TouchedElement"/> to the given value, calling the appropriate events.
/// </summary>
/// <param name="element">The element to set as touched</param>
public void SetTouchedElement(Element element) {
if (element != this.TouchedElement) {
if (this.TouchedElement != null)
this.System.OnElementTouchExit?.Invoke(this.TouchedElement);
if (element != null)
this.System.OnElementTouchEnter?.Invoke(element);
this.TouchedElement = element;
this.System.OnTouchedElementChanged?.Invoke(element);
}
}
/// <summary>
/// Returns the selected element for the given root element.
/// A property equivalent to this method is <see cref="RootElement.SelectedElement"/>.

View file

@ -141,6 +141,14 @@ namespace MLEM.Ui {
/// </summary>
public Element.GenericCallback OnElementMouseExit = e => e.OnMouseExit?.Invoke(e);
/// <summary>
/// Event that is invoked when an <see cref="Element"/> starts being touched
/// </summary>
public Element.GenericCallback OnElementTouchEnter = e => e.OnTouchEnter?.Invoke(e);
/// <summary>
/// Event that is invoked when an <see cref="Element"/> stops being touched
/// </summary>
public Element.GenericCallback OnElementTouchExit = e => e.OnTouchExit?.Invoke(e);
/// <summary>
/// Event that is invoked when an <see cref="Element"/>'s display area changes
/// </summary>
public Element.GenericCallback OnElementAreaUpdated = e => e.OnAreaUpdated?.Invoke(e);
@ -149,6 +157,10 @@ namespace MLEM.Ui {
/// </summary>
public Element.GenericCallback OnMousedElementChanged;
/// <summary>
/// Event that is invoked when the <see cref="Element"/> that is being touched changes
/// </summary>
public Element.GenericCallback OnTouchedElementChanged;
/// <summary>
/// Event that is invoked when the selected <see cref="Element"/> changes, either through automatic navigation, or by pressing on an element with the mouse
/// </summary>
public Element.GenericCallback OnSelectedElementChanged;
@ -184,6 +196,7 @@ namespace MLEM.Ui {
TextInputWrapper.Current.AddListener(window, (sender, key, character) => this.ApplyToAll(e => e.OnTextInput?.Invoke(e, key, character)));
this.OnMousedElementChanged = e => this.ApplyToAll(t => t.OnMousedElementChanged?.Invoke(t, e));
this.OnTouchedElementChanged = e => this.ApplyToAll(t => t.OnTouchedElementChanged?.Invoke(t, e));
this.OnSelectedElementChanged = e => this.ApplyToAll(t => t.OnSelectedElementChanged?.Invoke(t, e));
this.OnSelectedElementDrawn = (element, time, batch, alpha) => {
if (this.Controls.IsAutoNavMode && element.SelectionIndicator.HasValue()) {