فهرست منبع

Add Rml::UnregisterPlugin

Lucien Catonnet 4 سال پیش
والد
کامیت
4f073e30d4
4فایلهای تغییر یافته به همراه26 افزوده شده و 0 حذف شده
  1. 3 0
      Include/RmlUi/Core/Core.h
  2. 9 0
      Source/Core/Core.cpp
  3. 13 0
      Source/Core/PluginRegistry.cpp
  4. 1 0
      Source/Core/PluginRegistry.h

+ 3 - 0
Include/RmlUi/Core/Core.h

@@ -134,6 +134,9 @@ RMLUICORE_API bool LoadFontFace(const byte* data, int data_size, const String& f
 /// Registers a generic RmlUi plugin.
 RMLUICORE_API void RegisterPlugin(Plugin* plugin);
 
+/// Unregisters a generic RmlUi plugin.
+RMLUICORE_API void UnregisterPlugin(Plugin* plugin);
+
 /// Registers a new event type. If the type already exists, it will replace custom event types, but not internal types.
 /// @param[in] type The new event type.
 /// @param[in] interruptible Whether the event can be interrupted during dispatch.

+ 9 - 0
Source/Core/Core.cpp

@@ -342,6 +342,15 @@ void RegisterPlugin(Plugin* plugin)
 	PluginRegistry::RegisterPlugin(plugin);
 }
 
+// Unregisters a generic rmlui plugin
+void UnregisterPlugin(Plugin* plugin)
+{
+	PluginRegistry::UnregisterPlugin(plugin);
+
+	if(initialised)
+		plugin->OnShutdown();
+}
+
 EventId RegisterEventType(const String& type, bool interruptible, bool bubbles, DefaultActionPhase default_action_phase)
 {
 	return EventSpecificationInterface::InsertOrReplaceCustom(type, interruptible, bubbles, default_action_phase);

+ 13 - 0
Source/Core/PluginRegistry.cpp

@@ -28,6 +28,7 @@
 
 #include "PluginRegistry.h"
 #include "../../Include/RmlUi/Core/Plugin.h"
+#include <algorithm>
 
 namespace Rml {
 
@@ -52,6 +53,18 @@ void PluginRegistry::RegisterPlugin(Plugin* plugin)
 		element_plugins.push_back(plugin);
 }
 
+void PluginRegistry::UnregisterPlugin(Plugin* plugin)
+{
+	int event_classes = plugin->GetEventClasses();
+
+	if(event_classes & Plugin::EVT_BASIC)
+		basic_plugins.erase(std::remove(basic_plugins.begin(), basic_plugins.end(), plugin), basic_plugins.end());
+	if(event_classes & Plugin::EVT_DOCUMENT)
+		document_plugins.erase(std::remove(document_plugins.begin(), document_plugins.end(), plugin), document_plugins.end());
+	if(event_classes & Plugin::EVT_ELEMENT)
+		element_plugins.erase(std::remove(element_plugins.begin(), element_plugins.end(), plugin), element_plugins.end());
+}
+
 // Calls OnInitialise() on all plugins.
 void PluginRegistry::NotifyInitialise()
 {

+ 1 - 0
Source/Core/PluginRegistry.h

@@ -46,6 +46,7 @@ class PluginRegistry
 {
 public:
 	static void RegisterPlugin(Plugin* plugin);
+	static void UnregisterPlugin(Plugin* plugin);
 
 	/// Calls OnInitialise() on all plugins.
 	static void NotifyInitialise();