BsEditorWidgetContainer.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include "BsEditorWidgetContainer.h"
  2. #include "BsGUITabbedTitleBar.h"
  3. #include "BsEditorWidget.h"
  4. using namespace CamelotFramework;
  5. using namespace BansheeEngine;
  6. namespace BansheeEditor
  7. {
  8. const CM::UINT32 EditorWidgetContainer::TitleBarHeight = 13;
  9. EditorWidgetContainer::EditorWidgetContainer(BS::GUIWidget* parent)
  10. :mParent(parent), mX(0), mY(0), mWidth(0), mHeight(0), mTitleBar(nullptr), mActiveWidget(-1)
  11. {
  12. mTitleBar = cm_new<GUITabbedTitleBar>(parent);
  13. mTitleBar->onTabActivated.connect(boost::bind(&EditorWidgetContainer::tabActivated, this, _1));
  14. mTitleBar->onTabClosed.connect(boost::bind(&EditorWidgetContainer::tabClosed, this, _1));
  15. }
  16. EditorWidgetContainer::~EditorWidgetContainer()
  17. {
  18. cm_delete(mTitleBar);
  19. for(auto& widget : mWidgets)
  20. {
  21. EditorWidget::destroy(widget.widget);
  22. }
  23. }
  24. void EditorWidgetContainer::add(EditorWidget& widget)
  25. {
  26. for(auto& curWidget : mWidgets)
  27. {
  28. if(curWidget.widget == &widget)
  29. return;
  30. }
  31. auto conn = widget.onClosed.connect(boost::bind(&EditorWidgetContainer::widgetDestroyed, this, _1));
  32. mTitleBar->addTab(widget.getName());
  33. mWidgets.push_back(WidgetInfo(&widget, conn));
  34. widget._changeParent(*mParent);
  35. if(mActiveWidget == -1)
  36. {
  37. setActiveWidget((UINT32)mWidgets.size() - 1);
  38. }
  39. else
  40. widget._disable();
  41. }
  42. void EditorWidgetContainer::remove(EditorWidget& widget)
  43. {
  44. INT32 widgetIdx = -1;
  45. UINT32 curIdx = 0;
  46. for(auto& curWidget : mWidgets)
  47. {
  48. if(curWidget.widget == &widget)
  49. {
  50. widgetIdx = curIdx;
  51. break;
  52. }
  53. curIdx++;
  54. }
  55. if(widgetIdx == -1)
  56. return;
  57. mWidgets[widgetIdx].conn.disconnect();
  58. mWidgets.erase(mWidgets.begin() + widgetIdx);
  59. mTitleBar->removeTab((UINT32)widgetIdx);
  60. if(widgetIdx == mActiveWidget)
  61. {
  62. if(mWidgets.size() > 0)
  63. {
  64. setActiveWidget(0);
  65. }
  66. }
  67. }
  68. void EditorWidgetContainer::move(EditorWidget& widget, UINT32 newPosition)
  69. {
  70. // TODO
  71. }
  72. void EditorWidgetContainer::setSize(UINT32 width, UINT32 height)
  73. {
  74. // TODO - Title bar is always TitleBarHeight size, so what happens when the container area is smaller than that?
  75. mTitleBar->setSize(width, TitleBarHeight);
  76. if(mActiveWidget >= 0)
  77. {
  78. EditorWidget* activeWidgetPtr = mWidgets[mActiveWidget].widget;
  79. UINT32 contentHeight = (UINT32)std::max(0, (INT32)height - (INT32)TitleBarHeight);
  80. activeWidgetPtr->_setSize(width, contentHeight);
  81. }
  82. mWidth = width;
  83. mHeight = height;
  84. }
  85. void EditorWidgetContainer::setPosition(INT32 x, INT32 y)
  86. {
  87. mTitleBar->setPosition(x, y);
  88. if(mActiveWidget >= 0)
  89. {
  90. EditorWidget* activeWidgetPtr = mWidgets[mActiveWidget].widget;
  91. activeWidgetPtr->_setPosition(x, y + TitleBarHeight);
  92. }
  93. mX = x;
  94. mY = y;
  95. }
  96. void EditorWidgetContainer::setActiveWidget(UINT32 idx)
  97. {
  98. if(mActiveWidget == idx)
  99. return;
  100. mActiveWidget = idx;
  101. UINT32 curIdx = 0;
  102. for(auto& curWidget : mWidgets)
  103. {
  104. if(curIdx != (UINT32)mActiveWidget)
  105. curWidget.widget->_disable();
  106. else
  107. curWidget.widget->_enable();
  108. curIdx++;
  109. }
  110. setPosition(mX, mY);
  111. setSize(mWidth, mHeight);
  112. }
  113. void EditorWidgetContainer::tabActivated(UINT32 idx)
  114. {
  115. setActiveWidget(idx);
  116. }
  117. void EditorWidgetContainer::tabClosed(UINT32 idx)
  118. {
  119. EditorWidget* widget = mWidgets[idx].widget;
  120. remove(*widget);
  121. EditorWidget::destroy(widget);
  122. if(!onWidgetClosed.empty())
  123. onWidgetClosed();
  124. }
  125. void EditorWidgetContainer::widgetDestroyed(EditorWidget* widget)
  126. {
  127. for(auto& curWidget : mWidgets)
  128. {
  129. if(curWidget.widget == widget)
  130. {
  131. remove(*widget);
  132. if(!onWidgetClosed.empty())
  133. onWidgetClosed();
  134. return;
  135. }
  136. }
  137. }
  138. }