CmEditorWindowManager.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "CmEditorWindowManager.h"
  2. #include "CmEditorApplication.h"
  3. #include "CmQtEditorWindow.h"
  4. #include "CmEditorWindowFactory.h"
  5. #include "CmWindowDockManager.h"
  6. #include "CmEditorPrefs.h"
  7. #include "CmException.h"
  8. #include "CmQtEditor.h"
  9. #include <boost/bind.hpp>
  10. namespace CamelotEditor
  11. {
  12. struct WindowLayoutNode
  13. {
  14. QtEditorWindow* window;
  15. WindowLayoutNode* child;
  16. };
  17. void EditorWindowManager::registerWindowFactory(EditorWindowFactory* factory)
  18. {
  19. assert(factory != nullptr);
  20. mFactories[factory->getWindowName()] = factory;
  21. }
  22. QtEditorWindow* EditorWindowManager::openWindow(const QString& name)
  23. {
  24. auto iterFind = mOpenWindows.find(name);
  25. if(iterFind != mOpenWindows.end())
  26. return nullptr; // Window already open
  27. EditorWindowFactory* factory = getFactory(name);
  28. QtEditorWindow* window = factory->create(gEditorApp().getMainWindow());
  29. window->onClosed.connect(boost::bind(&EditorWindowManager::windowClosed, this, _1));
  30. window->setAttribute(Qt::WA_DeleteOnClose, true);
  31. window->show();
  32. mOpenWindows[name] = window;
  33. return window;
  34. }
  35. boost::function<void()> EditorWindowManager::getOpenCallback(const QString& name)
  36. {
  37. return boost::bind(&EditorWindowManager::openWindow, this, name);
  38. }
  39. QtEditorWindow* EditorWindowManager::getOpenWindow(const QString& name) const
  40. {
  41. auto iterFind = mOpenWindows.find(name);
  42. if(iterFind == mOpenWindows.end())
  43. CM_EXCEPT(InvalidParametersException, "There is no open window with name " + name.toStdString() + ".");
  44. return iterFind->second;
  45. }
  46. void EditorWindowManager::restoreWindowsFromPrefs()
  47. {
  48. vector<WindowLayoutDesc>::type windowLayouts = gEditorPrefs().getWindowLayouts();
  49. WindowLayoutNode* rootDockNode = nullptr;
  50. QString parentName = gWindowDockManager().getRootDockNodeName();
  51. bool foundDockedWindow = true;
  52. while(foundDockedWindow)
  53. {
  54. foundDockedWindow = false;
  55. for(auto iter = windowLayouts.begin(); iter != windowLayouts.end(); ++iter)
  56. {
  57. if(iter->dockState != WDS_FLOATING && iter->dockParentName == parentName)
  58. {
  59. QtEditorWindow* window = openWindow(iter->name);
  60. window->restoreFromLayoutDesc(*iter);
  61. parentName = window->getName();
  62. foundDockedWindow = true;
  63. break;
  64. }
  65. }
  66. }
  67. // Open non-docked windows
  68. for(auto iter = windowLayouts.begin(); iter != windowLayouts.end(); ++iter)
  69. {
  70. if(iter->dockState == WDS_FLOATING)
  71. {
  72. QtEditorWindow* window = openWindow(iter->name);
  73. window->restoreFromLayoutDesc(*iter);
  74. }
  75. }
  76. }
  77. void EditorWindowManager::saveWindowsToPrefs()
  78. {
  79. vector<WindowLayoutDesc>::type windowLayouts;
  80. for(auto iter = mOpenWindows.begin(); iter != mOpenWindows.end(); ++iter)
  81. {
  82. windowLayouts.push_back(iter->second->getLayoutDesc());
  83. }
  84. gEditorPrefs().setWindowLayouts(windowLayouts);
  85. }
  86. vector<QString>::type EditorWindowManager::getAvailableWindowTypes() const
  87. {
  88. vector<QString>::type types;
  89. for(auto iter = mFactories.begin(); iter != mFactories.end(); ++iter)
  90. {
  91. types.push_back(iter->first);
  92. }
  93. return types;
  94. }
  95. EditorWindowFactory* EditorWindowManager::getFactory(const QString& name) const
  96. {
  97. auto iterFind = mFactories.find(name);
  98. if(iterFind == mFactories.end())
  99. CM_EXCEPT(InvalidParametersException, "Window with the name: \"" + name.toStdString() + "\" doesn't exist.");
  100. return iterFind->second;
  101. }
  102. void EditorWindowManager::windowClosed(QtEditorWindow* window)
  103. {
  104. assert(window != nullptr);
  105. auto iterFind = mOpenWindows.find(window->getName());
  106. if(iterFind == mOpenWindows.end())
  107. CM_EXCEPT(InternalErrorException, "Trying to close a window " + window->getName().toStdString() + " that is not in the open window list.");
  108. assert(iterFind->second == window);
  109. mOpenWindows.erase(iterFind);
  110. }
  111. EditorWindowManager& gEditorWindowManager()
  112. {
  113. return EditorWindowManager::instance();
  114. }
  115. }