1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
Robert b779a86d13 Event conditions - Fix start-node disconnecting
Input - Performance optimizations
2022-09-16 19:46:43 +02:00

149 lines
6.6 KiB
C#

using System;
namespace Artemis.Core.Services;
/// <summary>
/// Represents an interface for an input provider that provides and implementation for sending and receiving device
/// input
/// </summary>
public abstract class InputProvider : IDisposable
{
public InputProvider()
{
ProviderName = GetType().FullName ?? throw new InvalidOperationException("Input provider must have a type with a name");
}
internal string ProviderName { get; set; }
/// <summary>
/// Called when the input service requests a <see cref="KeyboardToggleStatusReceived" /> event
/// </summary>
public virtual void OnKeyboardToggleStatusRequested()
{
}
/// <summary>
/// Occurs when the input provided has received keyboard data
/// </summary>
public event EventHandler<InputProviderKeyboardEventArgs>? KeyboardDataReceived;
/// <summary>
/// Occurs when the input provider has received new toggle data for keyboards
/// </summary>
public event EventHandler<InputProviderKeyboardToggleEventArgs>? KeyboardToggleStatusReceived;
/// <summary>
/// Occurs when the input provided has received mouse button data
/// </summary>
public event EventHandler<InputProviderMouseButtonEventArgs>? MouseButtonDataReceived;
/// <summary>
/// Occurs when the input provided has received mouse scroll data
/// </summary>
public event EventHandler<InputProviderMouseScrollEventArgs>? MouseScrollDataReceived;
/// <summary>
/// Occurs when the input provided has received mouse move data
/// </summary>
public event EventHandler<InputProviderMouseMoveEventArgs>? MouseMoveDataReceived;
/// <summary>
/// Occurs when the input provided received a device identifier
/// </summary>
public event EventHandler<InputProviderIdentifierEventArgs>? IdentifierReceived;
/// <summary>
/// Invokes the <see cref="KeyboardDataReceived" /> event which the <see cref="IInputService" /> listens to as long as
/// this provider is registered
/// </summary>
/// <param name="device">The device that triggered the event</param>
/// <param name="key">The key that triggered the event</param>
/// <param name="isDown">Whether the key is pressed down</param>
protected virtual void OnKeyboardDataReceived(ArtemisDevice? device, KeyboardKey key, bool isDown)
{
KeyboardDataReceived?.Invoke(this, new InputProviderKeyboardEventArgs(device, key, isDown));
}
/// <summary>
/// Invokes the <see cref="MouseButtonDataReceived" /> event which the <see cref="IInputService" /> listens to as long
/// as this provider is registered
/// </summary>
/// <param name="device">The device that triggered the event</param>
/// <param name="button">The button that triggered the event</param>
/// <param name="isDown">Whether the button is pressed down</param>
protected virtual void OnMouseButtonDataReceived(ArtemisDevice? device, MouseButton button, bool isDown)
{
MouseButtonDataReceived?.Invoke(this, new InputProviderMouseButtonEventArgs(device, button, isDown));
}
/// <summary>
/// Invokes the <see cref="MouseScrollDataReceived" /> event which the <see cref="IInputService" /> listens to as long
/// as this provider is registered
/// </summary>
/// <param name="device">The device that triggered the event</param>
/// <param name="direction">The direction in which was scrolled</param>
/// <param name="delta">The scroll delta (can positive or negative)</param>
protected virtual void OnMouseScrollDataReceived(ArtemisDevice? device, MouseScrollDirection direction, int delta)
{
MouseScrollDataReceived?.Invoke(this, new InputProviderMouseScrollEventArgs(device, direction, delta));
}
/// <summary>
/// Invokes the <see cref="MouseMoveDataReceived" /> event which the <see cref="IInputService" /> listens to as long as
/// this provider is registered
/// </summary>
/// <param name="device">The device that triggered the event</param>
/// <param name="cursorX">The X position of the mouse cursor (not necessarily tied to the specific device)</param>
/// <param name="cursorY">The Y position of the mouse cursor (not necessarily tied to the specific device)</param>
/// <param name="deltaX">The movement delta in the horizontal direction</param>
/// <param name="deltaY">The movement delta in the vertical direction</param>
protected virtual void OnMouseMoveDataReceived(ArtemisDevice? device, int cursorX, int cursorY, int deltaX, int deltaY)
{
MouseMoveDataReceived?.Invoke(this, new InputProviderMouseMoveEventArgs(device, cursorX, cursorY, deltaX, deltaY));
}
// TODO: Remove this as the core should handle this in GetDeviceByIdentifier
/// <summary>
/// Invokes the <see cref="IdentifierReceived" /> event which the <see cref="IInputService" /> listens to as long as
/// this provider is registered
/// <para>Except for on mouse movement, call this whenever you have an identifier ready for the core to process</para>
/// </summary>
/// <param name="identifier">A value that can be used to identify this device</param>
/// <param name="deviceType">The type of device this identifier belongs to</param>
protected virtual void OnIdentifierReceived(object identifier, InputDeviceType deviceType)
{
IdentifierReceived?.Invoke(this, new InputProviderIdentifierEventArgs(identifier, deviceType));
}
/// <summary>
/// Invokes the <see cref="KeyboardToggleStatusReceived" /> event which the <see cref="IInputService" /> listens to as
/// long as
/// this provider is registered
/// </summary>
/// <param name="keyboardToggleStatus">The toggle status of the keyboard</param>
protected virtual void OnKeyboardToggleStatusReceived(KeyboardToggleStatus keyboardToggleStatus)
{
KeyboardToggleStatusReceived?.Invoke(this, new InputProviderKeyboardToggleEventArgs(keyboardToggleStatus));
}
/// <summary>
/// Releases the unmanaged resources used by the object and optionally releases the managed resources.
/// </summary>
/// <param name="disposing">
/// <see langword="true" /> to release both managed and unmanaged resources;
/// <see langword="false" /> to release only unmanaged resources.
/// </param>
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
}
}
/// <inheritdoc />
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}