BsGUITabbedTitleBar.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "BsGUITabbedTitleBar.h"
  2. #include "BsGUIArea.h"
  3. #include "BsGUILayout.h"
  4. #include "BsGUITexture.h"
  5. #include "BsGUIButton.h"
  6. #include "BsGUITabButton.h"
  7. #include "BsGUISpace.h"
  8. #include "BsGUIWindowMover.h"
  9. #include "BsEngineGUI.h"
  10. #include "BsGUIWidget.h"
  11. #include "CmMath.h"
  12. using namespace CamelotFramework;
  13. using namespace BansheeEngine;
  14. namespace BansheeEditor
  15. {
  16. GUITabbedTitleBar::GUITabbedTitleBar(BS::GUIWidget* parent)
  17. :mLastDropElement(nullptr), mMinBtn(nullptr), mCloseBtn(nullptr),
  18. mMainArea(nullptr), mMainLayout(nullptr), mParentWidget(parent), mBackgroundArea(nullptr), mUniqueTabIdx(0), mActiveTabIdx(0)
  19. {
  20. mBackgroundArea = GUIArea::create(*parent, 0, 0, 1, 13, 9900);
  21. GUIWindowMover* titleBarBg = GUIWindowMover::create(*parent, parent->getSkin()->getStyle("TitleBarBackground"));
  22. mBackgroundArea->getLayout().addSpace(1);
  23. mBackgroundArea->getLayout().addElement(titleBarBg);
  24. mBackgroundArea->getLayout().addSpace(1);
  25. mMainArea = GUIArea::create(*parent, 0, 0, 1, 13, 9899);
  26. GUIWindowMover* dragDropElement = GUIWindowMover::create(*parent, GUILayoutOptions::expandableX(13, 20), parent->getSkin()->getStyle("TabbedBarDropArea"));
  27. mLastDropElement = dragDropElement;
  28. mMinBtn = GUIButton::create(*parent, L"", parent->getSkin()->getStyle("WinMinimizeBtn"));
  29. mCloseBtn = GUIButton::create(*parent, L"", parent->getSkin()->getStyle("WinCloseBtn"));
  30. mCloseBtn->onClick.connect(boost::bind(&GUITabbedTitleBar::tabClosed, this));
  31. mMainArea->getLayout().addSpace(1);
  32. mMainLayout = &mMainArea->getLayout().addLayoutX();
  33. mMainLayout->addElement(dragDropElement);
  34. mMainLayout->addElement(mMinBtn);
  35. mMainLayout->addSpace(3);
  36. mMainLayout->addElement(mCloseBtn);
  37. mMainArea->getLayout().addSpace(3);
  38. }
  39. GUITabbedTitleBar::~GUITabbedTitleBar()
  40. {
  41. GUIArea::destroy(mMainArea);
  42. GUIArea::destroy(mBackgroundArea);
  43. GUIElement::destroy(mLastDropElement);
  44. GUIElement::destroy(mMinBtn);
  45. GUIElement::destroy(mCloseBtn);
  46. for(auto& tabButton : mTabButtons)
  47. {
  48. GUIElement::destroy(tabButton);
  49. }
  50. for(auto& dragDropButton : mDragDropElements)
  51. {
  52. GUIElement::destroy(dragDropButton);
  53. }
  54. }
  55. void GUITabbedTitleBar::addTab(const CM::WString& name)
  56. {
  57. insertTab((UINT32)mTabButtons.size(), name);
  58. }
  59. void GUITabbedTitleBar::insertTab(UINT32 idx, const CM::WString& name)
  60. {
  61. GUITabButton* newTabToggle = GUITabButton::create(*mParentWidget, this, mUniqueTabIdx, name, EngineGUI::instance().getSkin().getStyle("TabbedBarBtn"));
  62. GUIWindowMover* newDragDropElement = GUIWindowMover::create(*mParentWidget, EngineGUI::instance().getSkin().getStyle("TabbedBarDropArea"));
  63. idx = Math::Clamp(idx, 0U, (UINT32)mTabButtons.size());
  64. newTabToggle->onToggled.connect(boost::bind(&GUITabbedTitleBar::tabToggled, this, mUniqueTabIdx));
  65. newTabToggle->onDragged.connect(boost::bind(&GUITabbedTitleBar::tabDraggedOff, this, _1));
  66. newDragDropElement->onDraggedItemDropped.connect(boost::bind(&GUITabbedTitleBar::tabDraggedOn, this, mUniqueTabIdx));
  67. mTabButtons.insert(mTabButtons.begin() + idx, newTabToggle);
  68. mDragDropElements.insert(mDragDropElements.begin() + idx, newDragDropElement);
  69. mMainLayout->insertElement(idx * 2, newTabToggle);
  70. mMainLayout->insertElement(idx * 2, newDragDropElement);
  71. mUniqueTabIdx++;
  72. }
  73. void GUITabbedTitleBar::removeTab(UINT32 idx)
  74. {
  75. if(mTabButtons.size() == 0)
  76. return;
  77. idx = Math::Clamp(idx, 0U, (UINT32)mTabButtons.size() - 1);
  78. GUIElement::destroy(mTabButtons[idx]);
  79. GUIElement::destroy(mDragDropElements[idx]);
  80. mTabButtons.erase(mTabButtons.begin() + idx);
  81. mDragDropElements.erase(mDragDropElements.begin() + idx);
  82. }
  83. void GUITabbedTitleBar::setPosition(INT32 x, INT32 y)
  84. {
  85. mMainArea->setPosition(x, y);
  86. mBackgroundArea->setPosition(x, y);
  87. }
  88. void GUITabbedTitleBar::setSize(UINT32 width, UINT32 height)
  89. {
  90. mMainArea->setSize(width, height);
  91. mBackgroundArea->setSize(width, height);
  92. }
  93. void GUITabbedTitleBar::tabToggled(CM::UINT32 tabIdx)
  94. {
  95. INT32 idx = uniqueIdxToSeqIdx(tabIdx);
  96. if(idx != -1)
  97. {
  98. if(!onTabActivated.empty())
  99. onTabActivated(idx);
  100. }
  101. mActiveTabIdx = tabIdx;
  102. }
  103. void GUITabbedTitleBar::tabClosed()
  104. {
  105. INT32 idx = uniqueIdxToSeqIdx(mActiveTabIdx);
  106. if(idx != -1)
  107. {
  108. removeTab(idx);
  109. if(mTabButtons.size() > 0)
  110. mActiveTabIdx = mTabButtons[0]->getIndex();
  111. if(!onTabClosed.empty())
  112. onTabClosed(idx);
  113. }
  114. }
  115. void GUITabbedTitleBar::tabDraggedOff(CM::UINT32 tabIdx)
  116. {
  117. INT32 idx = uniqueIdxToSeqIdx(tabIdx);
  118. if(idx != -1)
  119. {
  120. if(!onTabDraggedOff.empty())
  121. onTabDraggedOff(idx);
  122. }
  123. }
  124. void GUITabbedTitleBar::tabDraggedOn(CM::UINT32 tabIdx)
  125. {
  126. INT32 idx = uniqueIdxToSeqIdx(tabIdx);
  127. if(idx != -1)
  128. {
  129. if(!onTabDraggedOn.empty())
  130. onTabDraggedOn(idx + 1);
  131. }
  132. }
  133. CM::INT32 GUITabbedTitleBar::uniqueIdxToSeqIdx(CM::UINT32 uniqueIdx) const
  134. {
  135. UINT32 idx = 0;
  136. for(auto& tab : mTabButtons)
  137. {
  138. if(tab->getIndex() == uniqueIdx)
  139. return idx;
  140. idx++;
  141. }
  142. return -1;
  143. }
  144. }