UiManager.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #include <OgreRoot.h>
  2. #include <OgreStringVector.h>
  3. #include "core/Logger.h"
  4. #include "core/ScriptManager.h"
  5. #include "core/UiManager.h"
  6. #include "core/Utilites.h"
  7. #include "core/XmlFontsFile.h"
  8. #include "core/XmlPrototypesFile.h"
  9. #include "core/XmlScreensFile.h"
  10. #include "core/XmlTextsFile.h"
  11. template<>UiManager *Ogre::Singleton<UiManager>::msSingleton = nullptr;
  12. UiManager::UiManager()
  13. {
  14. Ogre::Root::getSingleton().getSceneManager("Scene")->addRenderQueueListener(this);
  15. }
  16. UiManager::~UiManager()
  17. {
  18. Ogre::Root::getSingleton().getSceneManager("Scene")->removeRenderQueueListener(this);
  19. UnloadTexts();
  20. for(size_t i = 0; i < m_Fonts.size(); ++i)
  21. {
  22. delete m_Fonts[i];
  23. }
  24. for(size_t i = 0; i < m_Widgets.size(); ++i)
  25. {
  26. delete m_Widgets[i];
  27. }
  28. }
  29. void
  30. UiManager::Initialise()
  31. {
  32. XmlFontsFile fonts("./data/fonts.xml");
  33. fonts.LoadFonts();
  34. XmlPrototypesFile prototypes("./data/screens/prototypes.xml");
  35. prototypes.LoadPrototypes();
  36. XmlScreensFile screens("./data/screens.xml");
  37. screens.LoadScreens();
  38. }
  39. void
  40. UiManager::Update()
  41. {
  42. // update all ui scripts
  43. ScriptManager::getSingleton().Update(ScriptManager::UI);
  44. for(unsigned int i = 0; i < m_Widgets.size(); ++i)
  45. {
  46. m_Widgets[i]->Update();
  47. }
  48. }
  49. void
  50. UiManager::OnResize()
  51. {
  52. for(unsigned int i = 0; i < m_Widgets.size(); ++i)
  53. {
  54. m_Widgets[i]->OnResize();
  55. }
  56. }
  57. void
  58. UiManager::SetLanguage(const Ogre::String& language)
  59. {
  60. UnloadTexts();
  61. XmlTextsFile texts("./data/texts.xml");
  62. texts.LoadTexts(language);
  63. }
  64. void
  65. UiManager::AddText(const Ogre::String& name, TiXmlNode* text)
  66. {
  67. UiText ui_text;
  68. ui_text.name = name;
  69. ui_text.node = text;
  70. m_Texts.push_back(ui_text);
  71. }
  72. void
  73. UiManager::UnloadTexts()
  74. {
  75. for(unsigned int i = 0; i < m_Texts.size(); ++i)
  76. {
  77. delete m_Texts[i].node;
  78. }
  79. m_Texts.clear();
  80. }
  81. TiXmlNode*
  82. UiManager::GetText(const Ogre::String& name) const
  83. {
  84. for(unsigned int i = 0; i < m_Texts.size(); ++i)
  85. {
  86. if(m_Texts[i].name == name)
  87. {
  88. return m_Texts[i].node;
  89. }
  90. }
  91. return nullptr;
  92. }
  93. void
  94. UiManager::AddFont(UiFont* font)
  95. {
  96. m_Fonts.push_back(font);
  97. }
  98. UiFont*
  99. UiManager::GetFont(const Ogre::String& name)
  100. {
  101. for(unsigned int i = 0; i < m_Fonts.size(); ++i)
  102. {
  103. if(m_Fonts[i]->GetName() == name)
  104. {
  105. return m_Fonts[i];
  106. }
  107. }
  108. return nullptr;
  109. }
  110. void
  111. UiManager::AddPrototype(const Ogre::String& name, TiXmlNode* prototype)
  112. {
  113. UiPrototype ui_prototype;
  114. ui_prototype.name = name;
  115. ui_prototype.node = prototype;
  116. m_Prototypes.push_back(ui_prototype);
  117. }
  118. TiXmlNode*
  119. UiManager::GetPrototype(const Ogre::String& name) const
  120. {
  121. for(unsigned int i = 0; i < m_Prototypes.size(); ++i)
  122. {
  123. if(m_Prototypes[i].name == name)
  124. {
  125. return m_Prototypes[i].node;
  126. }
  127. }
  128. return nullptr;
  129. }
  130. void
  131. UiManager::AddWidget(UiWidget* widget)
  132. {
  133. m_Widgets.push_back(widget);
  134. }
  135. UiWidget*
  136. UiManager::GetWidget(const Ogre::String& name)
  137. {
  138. // get real table by name
  139. Ogre::StringVector table_path = StringTokenise(name, ".");
  140. UiWidget* widget = nullptr;
  141. if(table_path.size() > 0)
  142. {
  143. for(unsigned int i = 0; i < m_Widgets.size(); ++i)
  144. {
  145. if(m_Widgets[i]->GetName() == table_path[0])
  146. {
  147. widget = m_Widgets[i];
  148. for(unsigned int j = 1; (j < table_path.size()) && (widget != nullptr); ++j)
  149. {
  150. widget = widget->GetChild(table_path[j]);
  151. }
  152. }
  153. }
  154. }
  155. return widget;
  156. }
  157. UiWidget*
  158. UiManager::ScriptGetWidget(const char* name)
  159. {
  160. return GetWidget(Ogre::String(name));
  161. }
  162. void
  163. UiManager::renderQueueStarted(Ogre::uint8 queueGroupId, const Ogre::String& invocation, bool& skipThisInvocation)
  164. {
  165. if(queueGroupId == Ogre::RENDER_QUEUE_OVERLAY)
  166. {
  167. Ogre::Root::getSingletonPtr()->getRenderSystem()->clearFrameBuffer(Ogre::FBT_DEPTH);
  168. for(unsigned int i = 0; i < m_Widgets.size(); ++i)
  169. {
  170. m_Widgets[i]->Render();
  171. }
  172. }
  173. }