BsGUITabbedTitleBar.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #include "BsGUITabbedTitleBar.h"
  2. #include "BsGUIArea.h"
  3. #include "BsGUILayout.h"
  4. #include "BsGUITexture.h"
  5. #include "BsGUIButton.h"
  6. #include "BsGUIToggle.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.toggle);
  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. GUIToggle* newTabToggle = GUIToggle::create(*mParentWidget, 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. mTabButtons.insert(mTabButtons.begin() + idx, Tab(newTabToggle, mUniqueTabIdx));
  66. mDragDropElements.insert(mDragDropElements.begin() + idx, newDragDropElement);
  67. mMainLayout->insertElement(idx * 2, newTabToggle);
  68. mMainLayout->insertElement(idx * 2, newDragDropElement);
  69. mUniqueTabIdx++;
  70. }
  71. void GUITabbedTitleBar::removeTab(UINT32 idx)
  72. {
  73. if(mTabButtons.size() == 0)
  74. return;
  75. idx = Math::Clamp(idx, 0U, (UINT32)mTabButtons.size() - 1);
  76. GUIElement::destroy(mTabButtons[idx].toggle);
  77. GUIElement::destroy(mDragDropElements[idx]);
  78. mTabButtons.erase(mTabButtons.begin() + idx);
  79. mDragDropElements.erase(mDragDropElements.begin() + idx);
  80. }
  81. void GUITabbedTitleBar::setPosition(INT32 x, INT32 y)
  82. {
  83. mMainArea->setPosition(x, y);
  84. mBackgroundArea->setPosition(x, y);
  85. }
  86. void GUITabbedTitleBar::setSize(UINT32 width, UINT32 height)
  87. {
  88. mMainArea->setSize(width, height);
  89. mBackgroundArea->setSize(width, height);
  90. }
  91. void GUITabbedTitleBar::tabToggled(CM::UINT32 tabIdx)
  92. {
  93. INT32 idx = uniqueIdxToIdx(tabIdx);
  94. if(idx != -1)
  95. {
  96. if(!onTabActivated.empty())
  97. onTabActivated(idx);
  98. }
  99. mActiveTabIdx = tabIdx;
  100. }
  101. void GUITabbedTitleBar::tabClosed()
  102. {
  103. INT32 idx = uniqueIdxToIdx(mActiveTabIdx);
  104. if(idx != -1)
  105. {
  106. removeTab(idx);
  107. if(mTabButtons.size() > 0)
  108. mActiveTabIdx = mTabButtons[0].index;
  109. if(!onTabClosed.empty())
  110. onTabClosed(idx);
  111. }
  112. }
  113. CM::INT32 GUITabbedTitleBar::uniqueIdxToIdx(CM::UINT32 uniqueIdx) const
  114. {
  115. UINT32 idx = 0;
  116. for(auto& tab : mTabButtons)
  117. {
  118. if(tab.index == uniqueIdx)
  119. return idx;
  120. idx++;
  121. }
  122. return -1;
  123. }
  124. }