PluginRegistry.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "PluginRegistry.h"
  2. #include "../../Include/RmlUi/Core/Plugin.h"
  3. #include "ControlledLifetimeResource.h"
  4. #include <algorithm>
  5. namespace Rml {
  6. struct PluginVectors {
  7. Vector<Plugin*> basic;
  8. Vector<Plugin*> document;
  9. Vector<Plugin*> element;
  10. };
  11. static ControlledLifetimeResource<PluginVectors> plugin_vectors;
  12. static void EnsurePluginVectorsInitialized()
  13. {
  14. if (!plugin_vectors)
  15. {
  16. plugin_vectors.Initialize();
  17. }
  18. }
  19. void PluginRegistry::RegisterPlugin(Plugin* plugin)
  20. {
  21. EnsurePluginVectorsInitialized();
  22. int event_classes = plugin->GetEventClasses();
  23. if (event_classes & Plugin::EVT_BASIC)
  24. plugin_vectors->basic.push_back(plugin);
  25. if (event_classes & Plugin::EVT_DOCUMENT)
  26. plugin_vectors->document.push_back(plugin);
  27. if (event_classes & Plugin::EVT_ELEMENT)
  28. plugin_vectors->element.push_back(plugin);
  29. }
  30. void PluginRegistry::UnregisterPlugin(Plugin* plugin)
  31. {
  32. auto erase_value = [](Vector<Plugin*>& container, Plugin* value) {
  33. container.erase(std::remove(container.begin(), container.end(), value), container.end());
  34. };
  35. int event_classes = plugin->GetEventClasses();
  36. if (event_classes & Plugin::EVT_BASIC)
  37. erase_value(plugin_vectors->basic, plugin);
  38. if (event_classes & Plugin::EVT_DOCUMENT)
  39. erase_value(plugin_vectors->document, plugin);
  40. if (event_classes & Plugin::EVT_ELEMENT)
  41. erase_value(plugin_vectors->element, plugin);
  42. }
  43. void PluginRegistry::NotifyInitialise()
  44. {
  45. EnsurePluginVectorsInitialized();
  46. for (Plugin* plugin : plugin_vectors->basic)
  47. plugin->OnInitialise();
  48. }
  49. void PluginRegistry::NotifyShutdown()
  50. {
  51. while (!plugin_vectors->basic.empty())
  52. {
  53. Plugin* plugin = plugin_vectors->basic.back();
  54. PluginRegistry::UnregisterPlugin(plugin);
  55. plugin->OnShutdown();
  56. }
  57. plugin_vectors.Shutdown();
  58. }
  59. void PluginRegistry::NotifyContextCreate(Context* context)
  60. {
  61. for (Plugin* plugin : plugin_vectors->basic)
  62. plugin->OnContextCreate(context);
  63. }
  64. void PluginRegistry::NotifyContextDestroy(Context* context)
  65. {
  66. for (Plugin* plugin : plugin_vectors->basic)
  67. plugin->OnContextDestroy(context);
  68. }
  69. void PluginRegistry::NotifyDocumentOpen(Context* context, const String& document_path)
  70. {
  71. for (Plugin* plugin : plugin_vectors->document)
  72. plugin->OnDocumentOpen(context, document_path);
  73. }
  74. void PluginRegistry::NotifyDocumentLoad(ElementDocument* document)
  75. {
  76. for (Plugin* plugin : plugin_vectors->document)
  77. plugin->OnDocumentLoad(document);
  78. }
  79. void PluginRegistry::NotifyDocumentUnload(ElementDocument* document)
  80. {
  81. for (Plugin* plugin : plugin_vectors->document)
  82. plugin->OnDocumentUnload(document);
  83. }
  84. void PluginRegistry::NotifyElementCreate(Element* element)
  85. {
  86. for (Plugin* plugin : plugin_vectors->element)
  87. plugin->OnElementCreate(element);
  88. }
  89. void PluginRegistry::NotifyElementDestroy(Element* element)
  90. {
  91. for (Plugin* plugin : plugin_vectors->element)
  92. plugin->OnElementDestroy(element);
  93. }
  94. } // namespace Rml