BsEditorWindowManager.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "EditorWindow/BsEditorWindowManager.h"
  4. #include "EditorWindow/BsEditorWindow.h"
  5. #include "EditorWindow/BsMainEditorWindow.h"
  6. #include "RenderAPI/BsRenderWindow.h"
  7. namespace bs
  8. {
  9. EditorWindowManager::EditorWindowManager()
  10. :mMainWindow(nullptr)
  11. {
  12. }
  13. EditorWindowManager::~EditorWindowManager()
  14. {
  15. while(mEditorWindows.size() > 0)
  16. destroy(mEditorWindows[0]);
  17. for (auto& windowToDestroy : mScheduledForDestruction)
  18. bs_delete(windowToDestroy);
  19. mScheduledForDestruction.clear();
  20. if(mMainWindow != nullptr)
  21. bs_delete(mMainWindow);
  22. }
  23. MainEditorWindow* EditorWindowManager::createMain(const SPtr<RenderWindow>& parentRenderWindow)
  24. {
  25. if(mMainWindow == nullptr)
  26. mMainWindow = new (bs_alloc<MainEditorWindow>()) MainEditorWindow(parentRenderWindow);
  27. return mMainWindow;
  28. }
  29. EditorWindow* EditorWindowManager::create()
  30. {
  31. EditorWindow* newWindow = new (bs_alloc<EditorWindow>()) EditorWindow();
  32. mEditorWindows.push_back(newWindow);
  33. newWindow->initialize();
  34. return newWindow;
  35. }
  36. void EditorWindowManager::registerWindow(EditorWindowBase* window)
  37. {
  38. mEditorWindows.push_back(window);
  39. }
  40. void EditorWindowManager::destroy(EditorWindowBase* window)
  41. {
  42. auto iterFind = std::find(begin(mEditorWindows), end(mEditorWindows), window);
  43. if(iterFind == end(mEditorWindows))
  44. return;
  45. auto iterFind2 = std::find(begin(mScheduledForDestruction), end(mScheduledForDestruction), window);
  46. if(iterFind2 == end(mScheduledForDestruction))
  47. mScheduledForDestruction.push_back(window);
  48. mEditorWindows.erase(iterFind);
  49. }
  50. void EditorWindowManager::showWindows()
  51. {
  52. for(auto& entry : mEditorWindows)
  53. {
  54. SPtr<RenderWindow> window = entry->getRenderWindow();
  55. if(window)
  56. window->show();
  57. }
  58. if(mMainWindow)
  59. {
  60. SPtr<RenderWindow> mainRenderWindow = mMainWindow->getRenderWindow();
  61. mainRenderWindow->show();
  62. }
  63. mNewWindowsHidden = false;
  64. }
  65. void EditorWindowManager::update()
  66. {
  67. // Editor window destroy is deferred to this point, otherwise we risk
  68. // destroying a window while it's still being used (situation that was happening with GUIManager)
  69. for(auto& windowToDestroy : mScheduledForDestruction)
  70. {
  71. bs_delete(windowToDestroy);
  72. }
  73. mScheduledForDestruction.clear();
  74. // Make a copy since other editors might be opened/closed from editor update() methods
  75. mEditorWindowsSnapshot = mEditorWindows;
  76. mMainWindow->update();
  77. for (auto& window : mEditorWindowsSnapshot)
  78. {
  79. window->update();
  80. }
  81. }
  82. bool EditorWindowManager::hasFocus() const
  83. {
  84. if (mMainWindow->hasFocus())
  85. return true;
  86. for(auto& window : mEditorWindows)
  87. {
  88. if (window->hasFocus())
  89. return true;
  90. }
  91. return false;
  92. }
  93. }