TemplateCache.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "TemplateCache.h"
  2. #include "../../Include/RmlUi/Core/Log.h"
  3. #include "StreamFile.h"
  4. #include "Template.h"
  5. namespace Rml {
  6. static TemplateCache* instance = nullptr;
  7. TemplateCache::TemplateCache()
  8. {
  9. RMLUI_ASSERT(instance == nullptr);
  10. instance = this;
  11. }
  12. TemplateCache::~TemplateCache()
  13. {
  14. for (Templates::iterator itr = instance->templates.begin(); itr != instance->templates.end(); ++itr)
  15. {
  16. delete (*itr).second;
  17. }
  18. instance = nullptr;
  19. }
  20. bool TemplateCache::Initialise()
  21. {
  22. new TemplateCache();
  23. return true;
  24. }
  25. void TemplateCache::Shutdown()
  26. {
  27. delete instance;
  28. }
  29. Template* TemplateCache::LoadTemplate(const String& name)
  30. {
  31. // Check if the template is already loaded
  32. Templates::iterator itr = instance->templates.find(name);
  33. if (itr != instance->templates.end())
  34. return (*itr).second;
  35. // Nope, we better load it
  36. Template* new_template = nullptr;
  37. auto stream = MakeUnique<StreamFile>();
  38. if (stream->Open(name))
  39. {
  40. new_template = new Template();
  41. if (!new_template->Load(stream.get()))
  42. {
  43. Log::Message(Log::LT_ERROR, "Failed to load template %s.", name.c_str());
  44. delete new_template;
  45. new_template = nullptr;
  46. }
  47. else if (new_template->GetName().empty())
  48. {
  49. Log::Message(Log::LT_ERROR, "Failed to load template %s, template is missing its name.", name.c_str());
  50. delete new_template;
  51. new_template = nullptr;
  52. }
  53. else
  54. {
  55. instance->templates[name] = new_template;
  56. instance->template_ids[new_template->GetName()] = new_template;
  57. }
  58. }
  59. else
  60. {
  61. Log::Message(Log::LT_ERROR, "Failed to open template file %s.", name.c_str());
  62. }
  63. return new_template;
  64. }
  65. Template* TemplateCache::GetTemplate(const String& name)
  66. {
  67. // Check if the template is already loaded
  68. Templates::iterator itr = instance->template_ids.find(name);
  69. if (itr != instance->template_ids.end())
  70. return (*itr).second;
  71. return nullptr;
  72. }
  73. void TemplateCache::Clear()
  74. {
  75. for (Templates::iterator i = instance->templates.begin(); i != instance->templates.end(); ++i)
  76. delete (*i).second;
  77. instance->templates.clear();
  78. instance->template_ids.clear();
  79. }
  80. } // namespace Rml