mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
143 lines
5.8 KiB
C#
143 lines
5.8 KiB
C#
|
using System;
|
|||
|
using Microsoft.Xna.Framework;
|
|||
|
using Microsoft.Xna.Framework.Graphics;
|
|||
|
using ProjectZ.InGame.Controls;
|
|||
|
using ProjectZ.InGame.Things;
|
|||
|
|
|||
|
namespace ProjectZ.InGame.Interface
|
|||
|
{
|
|||
|
public class InterfaceToggle : InterfaceElement
|
|||
|
{
|
|||
|
public delegate void BFunction(bool toggleState);
|
|||
|
public BFunction ClickFunction;
|
|||
|
|
|||
|
private readonly Color _colorToggledBackground;
|
|||
|
private readonly Color _colorNotToggledBackground = new Color(188, 188, 188);
|
|||
|
private readonly Color _colorToggled;
|
|||
|
private readonly Color _colorNotToggled = new Color(79, 79, 79);
|
|||
|
|
|||
|
private readonly Rectangle _toggleBackgroundRectangle;
|
|||
|
private readonly Rectangle _toggleRectangle;
|
|||
|
|
|||
|
private float _toggleAnimationState;
|
|||
|
private float _toggleAnimationCounter;
|
|||
|
|
|||
|
private const int ToggleAnimationTime = 100;
|
|||
|
|
|||
|
private bool _toggleState;
|
|||
|
|
|||
|
public bool ToggleState => _toggleState;
|
|||
|
|
|||
|
public InterfaceToggle()
|
|||
|
{
|
|||
|
Color = Values.MenuButtonColor;
|
|||
|
SelectionColor = Values.MenuButtonColorSelected;
|
|||
|
|
|||
|
_colorToggledBackground = Values.MenuButtonColorSelected;
|
|||
|
_colorToggled = Values.MenuButtonColorSlider;
|
|||
|
}
|
|||
|
|
|||
|
public InterfaceToggle(Point size, Point margin, bool startState, BFunction clickFunction) : this()
|
|||
|
{
|
|||
|
Size = size;
|
|||
|
Margin = margin;
|
|||
|
|
|||
|
_toggleState = startState;
|
|||
|
|
|||
|
ClickFunction = clickFunction;
|
|||
|
|
|||
|
_toggleBackgroundRectangle = new Rectangle(0, 0, size.X, size.Y);
|
|||
|
_toggleRectangle = new Rectangle(2, 2, size.Y - 4, size.Y - 4);
|
|||
|
|
|||
|
_toggleAnimationState = _toggleState ? 1 : 0;
|
|||
|
}
|
|||
|
|
|||
|
public static InterfaceListLayout GetToggleButton(Point size, Point margin, string textKey, bool startState, BFunction clickFunction)
|
|||
|
{
|
|||
|
var toggleLayout = new InterfaceListLayout() { Size = size, Margin = margin, HorizontalMode = true, Selectable = true };
|
|||
|
|
|||
|
var toggleSize = new Point((int)(size.Y * 1.75f), size.Y - 2);
|
|||
|
var buttonSize = new Point(size.X - toggleSize.X - 4, size.Y);
|
|||
|
|
|||
|
var toggle = new InterfaceToggle(toggleSize, new Point(2, 0), startState, clickFunction);
|
|||
|
var button = new InterfaceButton(buttonSize, new Point(2, 0), textKey, buttonElement => toggle.Toggle());
|
|||
|
|
|||
|
toggleLayout.AddElement(button);
|
|||
|
toggleLayout.AddElement(toggle);
|
|||
|
|
|||
|
return toggleLayout;
|
|||
|
}
|
|||
|
|
|||
|
public override InputEventReturn PressedButton(CButtons pressedButton)
|
|||
|
{
|
|||
|
if (!ControlHandler.ButtonPressed(CButtons.A))
|
|||
|
return InputEventReturn.Nothing;
|
|||
|
|
|||
|
Toggle();
|
|||
|
|
|||
|
return ClickFunction != null ? InputEventReturn.Something : InputEventReturn.Nothing;
|
|||
|
}
|
|||
|
|
|||
|
public void SetToggle(bool state)
|
|||
|
{
|
|||
|
_toggleState = state;
|
|||
|
// no animation
|
|||
|
_toggleAnimationCounter = 0;
|
|||
|
}
|
|||
|
|
|||
|
public void Toggle()
|
|||
|
{
|
|||
|
_toggleState = !_toggleState;
|
|||
|
_toggleAnimationCounter = ToggleAnimationTime;
|
|||
|
|
|||
|
ClickFunction?.Invoke(_toggleState);
|
|||
|
}
|
|||
|
|
|||
|
public override void Update()
|
|||
|
{
|
|||
|
base.Update();
|
|||
|
|
|||
|
// update the toggle animation
|
|||
|
_toggleAnimationCounter -= Game1.DeltaTime;
|
|||
|
if (_toggleAnimationCounter <= 0)
|
|||
|
_toggleAnimationCounter = 0;
|
|||
|
var percentage = (float)Math.Sin((1 - _toggleAnimationCounter / ToggleAnimationTime) * Math.PI / 2);
|
|||
|
_toggleAnimationState = _toggleState ? percentage : 1 - percentage;
|
|||
|
}
|
|||
|
|
|||
|
public override void Draw(SpriteBatch spriteBatch, Vector2 drawPosition, float scale, float transparency)
|
|||
|
{
|
|||
|
Resources.RoundedCornerEffect.Parameters["scale"].SetValue(Game1.UiScale);
|
|||
|
|
|||
|
spriteBatch.End();
|
|||
|
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, null, null, Resources.RoundedCornerEffect, Game1.GetMatrix);
|
|||
|
|
|||
|
Resources.RoundedCornerEffect.Parameters["radius"].SetValue(4.0f);
|
|||
|
Resources.RoundedCornerEffect.Parameters["width"].SetValue(_toggleBackgroundRectangle.Width);
|
|||
|
Resources.RoundedCornerEffect.Parameters["height"].SetValue(_toggleBackgroundRectangle.Height);
|
|||
|
|
|||
|
// draw the toggle background
|
|||
|
spriteBatch.Draw(Resources.SprWhite, new Rectangle(
|
|||
|
(int)(drawPosition.X + _toggleBackgroundRectangle.X * scale),
|
|||
|
(int)(drawPosition.Y + _toggleBackgroundRectangle.Y * scale),
|
|||
|
(int)(_toggleBackgroundRectangle.Width * scale),
|
|||
|
(int)(_toggleBackgroundRectangle.Height * scale)),
|
|||
|
(_toggleState ? _colorToggledBackground : _colorNotToggledBackground) * transparency);
|
|||
|
|
|||
|
Resources.RoundedCornerEffect.Parameters["radius"].SetValue(4.0f);
|
|||
|
Resources.RoundedCornerEffect.Parameters["width"].SetValue(_toggleRectangle.Width);
|
|||
|
Resources.RoundedCornerEffect.Parameters["height"].SetValue(_toggleRectangle.Height);
|
|||
|
|
|||
|
// draw the toggle
|
|||
|
spriteBatch.Draw(Resources.SprWhite, new Rectangle(
|
|||
|
(int)(drawPosition.X + (_toggleRectangle.X + _toggleAnimationState * (_toggleBackgroundRectangle.Width - _toggleRectangle.Width - 4)) * scale),
|
|||
|
(int)(drawPosition.Y + _toggleRectangle.Y * scale),
|
|||
|
(int)(_toggleRectangle.Width * scale),
|
|||
|
(int)(_toggleRectangle.Height * scale)),
|
|||
|
(_toggleState ? _colorToggled : _colorNotToggled) * transparency);
|
|||
|
|
|||
|
spriteBatch.End();
|
|||
|
spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointWrap, null, null, null, Game1.GetMatrix);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|