1
0
Fork 0
mirror of https://github.com/Ellpeck/MLEM.git synced 2024-12-24 01:09:23 +01:00

added sliders (horizontal scroll bars)

This commit is contained in:
Ellpeck 2019-08-16 19:08:36 +02:00
parent 7cf031478d
commit 4e1c6d8128
4 changed files with 55 additions and 12 deletions

View file

@ -3,6 +3,7 @@ using System.Collections.Generic;
using Coroutine;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using MLEM.Extensions;
using MLEM.Font;
using MLEM.Input;
using MLEM.Startup;
@ -121,6 +122,10 @@ namespace Demos {
tooltip.IsHidden = !tooltip.IsHidden;
}
});
var slider = new Slider(Anchor.AutoLeft, new Vector2(1, 10), 5, 1);
root.AddChild(new Paragraph(Anchor.AutoLeft, 1, paragraph => "Slider is at " + (slider.CurrentValue * 100).Floor() + "%") {PositionOffset = new Vector2(0, 1)});
root.AddChild(slider);
}
protected override void DoDraw(GameTime gameTime) {

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
@ -25,11 +26,20 @@ namespace MLEM.Ui.Elements {
public string Text {
get => this.text;
set {
this.text = value;
this.SetAreaDirty();
if (this.text != value) {
this.text = value;
this.SetAreaDirty();
}
}
}
public bool AutoAdjustWidth;
public TextCallback GetTextCallback;
public Paragraph(Anchor anchor, float width, TextCallback textCallback, bool centerText = false, IGenericFont font = null)
: this(anchor, width, "", centerText, font) {
this.GetTextCallback = textCallback;
this.Text = textCallback(this);
}
public Paragraph(Anchor anchor, float width, string text, bool centerText = false, IGenericFont font = null) : base(anchor, new Vector2(width, 0)) {
this.text = text;
@ -54,6 +64,12 @@ namespace MLEM.Ui.Elements {
return new Point(this.AutoAdjustWidth ? this.longestLineLength.Ceil() + this.ScaledPadding.X * 2 : size.X, (this.lineHeight * this.splitText.Length).Ceil() + this.ScaledPadding.Y * 2);
}
public override void Update(GameTime time) {
base.Update(time);
if (this.GetTextCallback != null)
this.Text = this.GetTextCallback(this);
}
public override void Draw(GameTime time, SpriteBatch batch, float alpha, Point offset) {
if (this.Background != null)
batch.Draw(this.Background, this.Area.OffsetCopy(offset), this.BackgroundColor * alpha);
@ -77,6 +93,8 @@ namespace MLEM.Ui.Elements {
this.font = style.Font;
}
public delegate string TextCallback(Paragraph paragraph);
}
}

View file

@ -33,30 +33,37 @@ namespace MLEM.Ui.Elements {
}
}
}
public readonly bool Horizontal;
public float StepPerScroll = 1;
public ValueChanged OnValueChanged;
private bool isMouseHeld;
public ScrollBar(Anchor anchor, Vector2 size, int scrollerHeight, float maxValue) : base(anchor, size) {
public ScrollBar(Anchor anchor, Vector2 size, int scrollerSize, float maxValue, bool horizontal = false) : base(anchor, size) {
this.maxValue = maxValue;
this.ScrollerSize = new Point(size.X.Floor(), scrollerHeight);
this.Horizontal = horizontal;
this.ScrollerSize = new Point(horizontal ? scrollerSize : size.X.Floor(), !horizontal ? scrollerSize : size.Y.Floor());
}
public override void Update(GameTime time) {
base.Update(time);
var moused = this.System.MousedElement;
if (moused == this && this.Input.IsMouseButtonDown(MouseButton.Left)) {
if (moused == this && this.Input.IsMouseButtonPressed(MouseButton.Left)) {
this.isMouseHeld = true;
} else if (this.isMouseHeld && this.Input.IsMouseButtonUp(MouseButton.Left)) {
this.isMouseHeld = false;
}
if (this.isMouseHeld) {
var internalY = this.MousePos.Y - this.Area.Y;
this.CurrentValue = internalY / (float) this.Area.Height * this.MaxValue;
if (this.Horizontal) {
var internalX = this.MousePos.X - this.Area.X;
this.CurrentValue = internalX / (float) this.Area.Width * this.MaxValue;
} else {
var internalY = this.MousePos.Y - this.Area.Y;
this.CurrentValue = internalY / (float) this.Area.Height * this.MaxValue;
}
}
if (moused == this.Parent || moused?.Parent == this.Parent) {
if (!this.Horizontal && (moused == this.Parent || moused?.Parent == this.Parent)) {
var scroll = this.Input.LastScrollWheel - this.Input.ScrollWheel;
if (scroll != 0)
this.CurrentValue += this.StepPerScroll * Math.Sign(scroll);
@ -67,8 +74,10 @@ namespace MLEM.Ui.Elements {
batch.Draw(this.Background, this.DisplayArea.OffsetCopy(offset), Color.White * alpha, this.Scale);
var scrollerPos = new Point(this.DisplayArea.X + offset.X + this.ScrollerOffset.X, this.DisplayArea.Y + offset.Y + this.ScrollerOffset.Y);
var scrollerYOffset = (this.currValue / this.maxValue * (this.DisplayArea.Height - this.ScrollerSize.Y * this.Scale)).Floor();
var scrollerRect = new Rectangle(scrollerPos + new Point(0, scrollerYOffset), this.ScrollerSize.Multiply(this.Scale));
var scrollerOffset = new Point(
!this.Horizontal ? 0 : (this.currValue / this.maxValue * (this.DisplayArea.Width - this.ScrollerSize.X * this.Scale)).Floor(),
this.Horizontal ? 0 : (this.currValue / this.maxValue * (this.DisplayArea.Height - this.ScrollerSize.Y * this.Scale)).Floor());
var scrollerRect = new Rectangle(scrollerPos + scrollerOffset, this.ScrollerSize.Multiply(this.Scale));
batch.Draw(this.ScrollerTexture, scrollerRect, Color.White * alpha, this.Scale);
base.Draw(time, batch, alpha, offset);
}

View file

@ -0,0 +1,11 @@
using Microsoft.Xna.Framework;
namespace MLEM.Ui.Elements {
public class Slider : ScrollBar {
public Slider(Anchor anchor, Vector2 size, int scrollerSize, float maxValue) :
base(anchor, size, scrollerSize, maxValue, true) {
}
}
}