BsEditorWindowManager.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "BsEditorWindowManager.h"
  2. #include "BsEditorWindow.h"
  3. #include "BsModalWindow.h"
  4. #include "BsMainEditorWindow.h"
  5. namespace BansheeEngine
  6. {
  7. EditorWindowManager::EditorWindowManager()
  8. :mMainWindow(nullptr)
  9. {
  10. }
  11. EditorWindowManager::~EditorWindowManager()
  12. {
  13. while(mEditorWindows.size() > 0)
  14. destroy(mEditorWindows[0]);
  15. for (auto& windowToDestroy : mScheduledForDestruction)
  16. bs_delete(windowToDestroy);
  17. mScheduledForDestruction.clear();
  18. if(mMainWindow != nullptr)
  19. bs_delete(mMainWindow);
  20. }
  21. MainEditorWindow* EditorWindowManager::createMain(const RenderWindowPtr& parentRenderWindow)
  22. {
  23. if(mMainWindow == nullptr)
  24. mMainWindow = new (bs_alloc<MainEditorWindow>()) MainEditorWindow(parentRenderWindow);
  25. return mMainWindow;
  26. }
  27. EditorWindow* EditorWindowManager::create()
  28. {
  29. EditorWindow* newWindow = new (bs_alloc<EditorWindow>()) EditorWindow();
  30. mEditorWindows.push_back(newWindow);
  31. newWindow->initialize();
  32. return newWindow;
  33. }
  34. ModalWindow* EditorWindowManager::createModal()
  35. {
  36. ModalWindow* newWindow = new (bs_alloc<ModalWindow>()) ModalWindow();
  37. mEditorWindows.push_back(newWindow);
  38. newWindow->initialize();
  39. return newWindow;
  40. }
  41. void EditorWindowManager::destroy(EditorWindowBase* window)
  42. {
  43. auto iterFind = std::find(begin(mEditorWindows), end(mEditorWindows), window);
  44. if(iterFind == end(mEditorWindows))
  45. return;
  46. auto iterFind2 = std::find(begin(mScheduledForDestruction), end(mScheduledForDestruction), window);
  47. if(iterFind2 == end(mScheduledForDestruction))
  48. mScheduledForDestruction.push_back(window);
  49. mEditorWindows.erase(iterFind);
  50. }
  51. void EditorWindowManager::update()
  52. {
  53. // Editor window destroy is deferred to this point, otherwise we risk
  54. // destroying a window while it's still being used (situation that was happening with GUIManager)
  55. for(auto& windowToDestroy : mScheduledForDestruction)
  56. {
  57. bs_delete(windowToDestroy);
  58. }
  59. mScheduledForDestruction.clear();
  60. mMainWindow->update();
  61. for(auto& window : mEditorWindows)
  62. {
  63. window->update();
  64. }
  65. }
  66. }