button events and stuff properly work

This commit is contained in:
XtraCube committed 2024-11-24 21:25:51 -05:00
1 parent eac41a7c9e
commit 8884996c06
5 files changed
+52 -5

No files matched your search

+1 -1
View File
@@ -29,7 +29,7 @@ public partial class ExamplePlugin : BasePlugin, IMiraPlugin
{
Logger<ExamplePlugin>.Warning("Freeze button clicked!");
e.Cancel();
e.Button.SetTimer(5f);
e.Button.SetTimer(15f);
});
MiraEventManager.RegisterEventHandler<MiraButtonCancelledEvent<FreezeButton>>(e=>
@@ -22,3 +22,23 @@ public sealed class MiraButtonClickEvent<T> : MiraCancelableEvent where T : Cust
Button = button;
}
}
/// <summary>
/// Button click event for Mira Buttons only. Do not use for vanilla buttons.
/// </summary>
public sealed class MiraButtonClickEvent : MiraCancelableEvent
{
/// <summary>
/// Gets Mira Button that was clicked.
/// </summary>
public CustomActionButton Button { get; }
/// <summary>
/// Initializes a new instance of the <see cref="MiraButtonClickEvent"/> class.
/// </summary>
/// <param name="button">The Mira Button that was clicked.</param>
public MiraButtonClickEvent(CustomActionButton button)
{
Button = button;
}
}
+20
View File
@@ -31,6 +31,26 @@ public static class MiraEventManager
}
}
/// <summary>
/// Invoke an event and use a specific type to find the handlers.
/// </summary>
/// <param name="eventInstance">The event instance.</param>
/// <param name="type">The type to use for handler lookup.</param>
public static void InvokeEvent(MiraEvent eventInstance, Type type)
{
EventHandlers.TryGetValue(type, out var handlers);
if (handlers == null)
{
Logger<MiraApiPlugin>.Warning("No handlers for event " + type.Name);
return;
}
foreach (var handler in handlers)
{
handler.DynamicInvoke(eventInstance);
}
}
/// <summary>
/// Register an event.
/// </summary>
+5 -4
View File
@@ -101,13 +101,14 @@ public abstract class CustomActionButton
pb.OnClick = new Button.ButtonClickedEvent();
pb.OnClick.AddListener((UnityAction)(() =>
{
var eventType = typeof(MiraButtonClickEvent<>).MakeGenericType(GetType());
var eventType = CustomButtonManager.ButtonEventTypes[GetType()];
var @event = (MiraCancelableEvent)Activator.CreateInstance(eventType, this)!;
MiraEventManager.InvokeEvent(@event);
MiraEventManager.InvokeEvent(@event, eventType);
if (@event.IsCancelled)
{
var cancelledEvent = new MiraButtonCancelledEvent<CustomActionButton>(this);
MiraEventManager.InvokeEvent(cancelledEvent);
var cancelEventType = CustomButtonManager.ButtonCancelledEventTypes[GetType()];
var cancelEvent = (MiraEvent)Activator.CreateInstance(cancelEventType, this)!;
MiraEventManager.InvokeEvent(cancelEvent, cancelEventType);
}
else
{
+6
View File
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using MiraAPI.Events.Mira;
using MiraAPI.PluginLoading;
using Reactor.Utilities;
@@ -9,6 +10,8 @@ namespace MiraAPI.Hud;
internal static class CustomButtonManager
{
internal static readonly List<CustomActionButton> CustomButtons = [];
internal static readonly Dictionary<Type, Type> ButtonEventTypes = [];
internal static readonly Dictionary<Type, Type> ButtonCancelledEventTypes = [];
internal static void RegisterButton(Type buttonType, MiraPluginInfo pluginInfo)
{
@@ -29,5 +32,8 @@ internal static class CustomButtonManager
typeof(CustomButtonSingleton<>).MakeGenericType(buttonType)
.GetField("_instance", BindingFlags.Static | BindingFlags.NonPublic)!
.SetValue(null, button);
ButtonEventTypes.Add(buttonType, typeof(MiraButtonClickEvent<>).MakeGenericType(buttonType));
ButtonCancelledEventTypes.Add(buttonType, typeof(MiraButtonCancelledEvent<>).MakeGenericType(buttonType));
}
}