From 251b55dba5c7c9530b60ad0da1a732e7f8ab6782 Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Tue, 2 Jul 2024 11:32:16 +0200 Subject: [PATCH] add a uniquie event for plugin function execution --- Pilz.Plugins.Advanced.UI/PluginModule{T}.cs | 28 ++++----- Pilz.Plugins.Advanced/Delegates.cs | 3 + Pilz.Plugins.Advanced/PluginFeature.cs | 57 ++++++++++++++++++- .../PluginFeatureExecuteEventArgs.cs | 9 +++ .../PluginFeatureExecuteEventType.cs | 7 +++ Pilz.Plugins.Advanced/PluginFunction.cs | 9 ++- 6 files changed, 95 insertions(+), 18 deletions(-) create mode 100644 Pilz.Plugins.Advanced/Delegates.cs create mode 100644 Pilz.Plugins.Advanced/PluginFeatureExecuteEventArgs.cs create mode 100644 Pilz.Plugins.Advanced/PluginFeatureExecuteEventType.cs diff --git a/Pilz.Plugins.Advanced.UI/PluginModule{T}.cs b/Pilz.Plugins.Advanced.UI/PluginModule{T}.cs index 4ebc214..53848a6 100644 --- a/Pilz.Plugins.Advanced.UI/PluginModule{T}.cs +++ b/Pilz.Plugins.Advanced.UI/PluginModule{T}.cs @@ -1,16 +1,7 @@ -using System.Reflection.Metadata; - -namespace Pilz.Plugins.Advanced.UI; +namespace Pilz.Plugins.Advanced.UI; public abstract class PluginModule : PluginModuleBase where TPluginModuleUI : Control { - public delegate void PluginModuleUIEventHandler(PluginModuleBase module, TPluginModuleUI ui); - - /// - /// Fires when a instance has been created. - /// - public static event PluginModuleUIEventHandler? OnUICreated; - public bool Visible { get; set; } = true; public bool AllowEmbedding { get; set; } = true; @@ -40,17 +31,22 @@ public abstract class PluginModule : PluginModuleBase where TPl { } - public virtual TPluginModuleUI CreateUI() + public virtual TPluginModuleUI? CreateUI() { return CreateUI(null); } - public virtual TPluginModuleUI CreateUI(PluginFunctionParameter? @params) + public virtual TPluginModuleUI? CreateUI(PluginFunctionParameter? @params) { - var ui = CreateNewUI(@params); - OnUICreated?.Invoke(this, ui); - return ui; + object? ui = default; + + if (!OnPreExecute(@params, ref ui)) + ui = CreateNewUI(@params); + + OnPostExecute(@params, ref ui); + + return ui as TPluginModuleUI; } - protected abstract TPluginModuleUI CreateNewUI(PluginFunctionParameter? @params); + protected abstract TPluginModuleUI? CreateNewUI(PluginFunctionParameter? @params); } \ No newline at end of file diff --git a/Pilz.Plugins.Advanced/Delegates.cs b/Pilz.Plugins.Advanced/Delegates.cs new file mode 100644 index 0000000..8e1ab6a --- /dev/null +++ b/Pilz.Plugins.Advanced/Delegates.cs @@ -0,0 +1,3 @@ +namespace Pilz.Plugins.Advanced; + +public delegate void PluginFeatureExecuteEventHandler(object sender, PluginFeatureExecuteEventArgs e); diff --git a/Pilz.Plugins.Advanced/PluginFeature.cs b/Pilz.Plugins.Advanced/PluginFeature.cs index 1b64a4f..21fa9c2 100644 --- a/Pilz.Plugins.Advanced/PluginFeature.cs +++ b/Pilz.Plugins.Advanced/PluginFeature.cs @@ -1,7 +1,17 @@ -namespace Pilz.Plugins.Advanced; +using System.Reflection.Metadata; + +namespace Pilz.Plugins.Advanced; public abstract class PluginFeature { + /// + /// Fires when the plugin feature gets used. + ///
- For this fires on . + ///
- For this fires on . + ///
- For any other custom feature implementation this may variate. + ///
+ public static event PluginFeatureExecuteEventHandler? OnExecute; + /// /// The type of the feature defines where the feature get integrated. /// @@ -50,4 +60,49 @@ public abstract class PluginFeature { return $"{featureType}:{identifier}"; } + + /// + /// Fires the event with the status . + /// + /// The present . + /// The resulting object that will be returned. + /// Returns true if the original function should be executed. + protected bool OnPreExecute(PluginFunctionParameter? @params, ref object? result) + { + if (OnExecute != null) + { + var args = new PluginFeatureExecuteEventArgs(PluginFeatureExecuteEventType.PreEvent, @params); + + OnExecute.Invoke(this, args); + + if (args.Handled) + { + result = args.Result; + return false; + } + } + + return true; + } + + /// + /// Fires the event with the status . + /// + /// The present . + /// The resulting object that will be returned. + protected void OnPostExecute(PluginFunctionParameter? @params, ref object? result) + { + if (OnExecute != null) + { + var args = new PluginFeatureExecuteEventArgs(PluginFeatureExecuteEventType.PostEvent, @params) + { + Result = result + }; + + OnExecute.Invoke(this, args); + + if (args.Handled) + result = args.Result; + } + } } diff --git a/Pilz.Plugins.Advanced/PluginFeatureExecuteEventArgs.cs b/Pilz.Plugins.Advanced/PluginFeatureExecuteEventArgs.cs new file mode 100644 index 0000000..2031af0 --- /dev/null +++ b/Pilz.Plugins.Advanced/PluginFeatureExecuteEventArgs.cs @@ -0,0 +1,9 @@ +namespace Pilz.Plugins.Advanced; + +public class PluginFeatureExecuteEventArgs(PluginFeatureExecuteEventType eventType, PluginFunctionParameter? parameters) : EventArgs +{ + public PluginFeatureExecuteEventType EventType { get; } = eventType; + public PluginFunctionParameter? Parameters { get; } = parameters; + public bool Handled { get; set; } + public object? Result { get; set; } +} diff --git a/Pilz.Plugins.Advanced/PluginFeatureExecuteEventType.cs b/Pilz.Plugins.Advanced/PluginFeatureExecuteEventType.cs new file mode 100644 index 0000000..b4e6caa --- /dev/null +++ b/Pilz.Plugins.Advanced/PluginFeatureExecuteEventType.cs @@ -0,0 +1,7 @@ +namespace Pilz.Plugins.Advanced; + +public enum PluginFeatureExecuteEventType +{ + PreEvent, + PostEvent, +} diff --git a/Pilz.Plugins.Advanced/PluginFunction.cs b/Pilz.Plugins.Advanced/PluginFunction.cs index e7f6e2b..2affe6b 100644 --- a/Pilz.Plugins.Advanced/PluginFunction.cs +++ b/Pilz.Plugins.Advanced/PluginFunction.cs @@ -34,7 +34,14 @@ public abstract class PluginFunction : PluginFeature public virtual object? Execute(PluginFunctionParameter? @params) { - return ExecuteFunction(@params); + object? result = default; + + if (!OnPreExecute(@params, ref result)) + result = ExecuteFunction(@params); + + OnPostExecute(@params, ref result); + + return result; } protected abstract object? ExecuteFunction(PluginFunctionParameter? @params);