//----------------------------------------------------------------------- //----------------------------------------------------------------------- // file="TriggerButton.cs" // Project: StgSharp // AuthorGroup: Nitload Space // Copyright (c) Nitload Space. All rights reserved. // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the “Software”), to deal in the Software without restriction, // including without limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of the Software, // and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and // this permission notice shall be included in all copies // or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED “AS IS”, // WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, // ARISING FROM, OUT OF OR IN CONNECTION WITH // THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // //----------------------------------------------------------------------- //----------------------------------------------------------------------- using StgSharp.Controls; using StgSharp.Geometries; using StgSharp.Graphics; using StgSharp.Math; using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; namespace StgSharp.Controls { public delegate void RenderButtonTextureCallback( ButtonStatus status, float beginTime, in TextureProvider texture ); public enum ButtonStatus { Error = 0b0, Disable = 0b1, Enable = 0b10, Highlight = 0b100, Confirm = 0b1000, DisableToEnable = Disable | Enable, EnableToDisable = -( Enable | DisableToEnable ), EnableToHighlight = Enable | Highlight, HighlightToEnable = -( Enable | Highlight ), HighlightToDisable = -( Highlight | Disable ), } public class TriggerButton : ControllingItem { private Action? confirmCallback; private Action? disableCallback; #nullable enable private Action? enableCallback; private float _statusBeginTime; private RenderButtonTextureCallback _renderButton; private TextureProvider _texture; #nullable restore public TriggerButton() { CurrentStatus = ButtonStatus.Disable; } public event Action ConfirmEvent { add { confirmCallback += value; } remove { confirmCallback -= value; } } public event Action DisableEvent { add { disableCallback += value; } remove { disableCallback -= value; } } public event Action EnableEvent { add { enableCallback += value; } remove { enableCallback -= value; } } public event RenderButtonTextureCallback RenderButtonTexture { add { if( _renderButton == null ) { _renderButton = value; } else { _renderButton += value; } } remove { if( _renderButton != null ) { _renderButton -= value; } } } public bool IsHighLighted { get; internal set; } public bool IsDisabled { get; internal set; } public bool IsEntity => true; public ReadOnlySpan TextureBox { get => MemoryMarshal.Cast( _texture.TextureCoordinate ); } public Rectangle BoundingBox { get; set; } public TriggerButton Left { get; internal set; } public TriggerButton Right { get; internal set; } public TriggerButton Up { get; internal set; } public TriggerButton Down { get; internal set; } public Vec2 Position { get; set; } internal TextureProvider Texture { get => _texture; set => _texture = value; } protected ButtonStatus CurrentStatus { get; set; } public void DeHighlight() { if( CurrentStatus == ButtonStatus.Highlight ) { CurrentStatus = ButtonStatus.HighlightToEnable; } } public void Disable() { CurrentStatus = CurrentStatus switch { ButtonStatus.Enable => ButtonStatus.EnableToDisable, ButtonStatus.Highlight => ButtonStatus.HighlightToDisable, _ => CurrentStatus, }; if( disableCallback != null ) { disableCallback(); } } public void Enable() { if( CurrentStatus == ButtonStatus.Disable ) { CurrentStatus = ButtonStatus.DisableToEnable; } else { return; } if( enableCallback != null ) { enableCallback(); } } public IEnumerator GetEnumerator() { _renderButton( CurrentStatus, _statusBeginTime, in _texture ); yield return new PlainGeometryMesh( this.BoundingBox, _texture ); } public void Highlight() { if( CurrentStatus == ButtonStatus.Enable ) { CurrentStatus |= ButtonStatus.EnableToHighlight; } else { return; } if( confirmCallback != null ) { confirmCallback(); } } internal void Init( ButtonStatus status ) { if( CurrentStatus == ButtonStatus.Error ) { CurrentStatus = status; } } }//----------------------------------- End of class -------------------------------------------- }