BsGUITabButton.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include "BsGUITabButton.h"
  2. #include "BsGUIWidget.h"
  3. #include "BsGUISkin.h"
  4. #include "BsGUILayoutOptions.h"
  5. #include "BsGUIMouseEvent.h"
  6. #include "BsGUITabbedTitleBar.h"
  7. using namespace CamelotFramework;
  8. using namespace BansheeEngine;
  9. namespace BansheeEditor
  10. {
  11. const CM::UINT32 GUITabButton::DRAG_MIN_DISTANCE = 3;
  12. const String& GUITabButton::getGUITypeName()
  13. {
  14. static String name = "TabButton";
  15. return name;
  16. }
  17. GUITabButton::GUITabButton(GUIWidget& parent, const GUIElementStyle* style, const GUIToggleGroupPtr& toggleGroup, CM::UINT32 index, const GUIContent& content, const GUILayoutOptions& layoutOptions)
  18. :GUIToggle(parent, style, content, toggleGroup, layoutOptions), mIndex(index), mDraggedState(false)
  19. {
  20. }
  21. GUITabButton* GUITabButton::create(GUIWidget& parent, const GUIToggleGroupPtr& toggleGroup, CM::UINT32 index, const HString& text, const GUIElementStyle* style)
  22. {
  23. if(style == nullptr)
  24. {
  25. const GUISkin& skin = parent.getSkin();
  26. style = skin.getStyle(getGUITypeName());
  27. }
  28. return new (cm_alloc<GUITabButton, PoolAlloc>()) GUITabButton(parent, style, toggleGroup, index, GUIContent(text), GUILayoutOptions::create(style));
  29. }
  30. GUITabButton* GUITabButton::create(GUIWidget& parent, const GUIToggleGroupPtr& toggleGroup, CM::UINT32 index, const HString& text, const GUIOptions& layoutOptions, const GUIElementStyle* style)
  31. {
  32. if(style == nullptr)
  33. {
  34. const GUISkin& skin = parent.getSkin();
  35. style = skin.getStyle(getGUITypeName());
  36. }
  37. return new (cm_alloc<GUITabButton, PoolAlloc>()) GUITabButton(parent, style, toggleGroup, index, GUIContent(text), GUILayoutOptions::create(layoutOptions, style));
  38. }
  39. GUITabButton* GUITabButton::create(GUIWidget& parent, const GUIToggleGroupPtr& toggleGroup, CM::UINT32 index, const GUIContent& content, const GUIElementStyle* style)
  40. {
  41. if(style == nullptr)
  42. {
  43. const GUISkin& skin = parent.getSkin();
  44. style = skin.getStyle(getGUITypeName());
  45. }
  46. return new (cm_alloc<GUITabButton, PoolAlloc>()) GUITabButton(parent, style, toggleGroup, index, content, GUILayoutOptions::create(style));
  47. }
  48. GUITabButton* GUITabButton::create(GUIWidget& parent, const GUIToggleGroupPtr& toggleGroup, CM::UINT32 index, const GUIContent& content, const GUIOptions& layoutOptions, const GUIElementStyle* style)
  49. {
  50. if(style == nullptr)
  51. {
  52. const GUISkin& skin = parent.getSkin();
  53. style = skin.getStyle(getGUITypeName());
  54. }
  55. return new (cm_alloc<GUITabButton, PoolAlloc>()) GUITabButton(parent, style, toggleGroup, index, content, GUILayoutOptions::create(layoutOptions, style));
  56. }
  57. void GUITabButton::_setDraggedState(bool active)
  58. {
  59. if(mDraggedState == active)
  60. return;
  61. mDraggedState = active;
  62. if(mDraggedState)
  63. {
  64. mInactiveState = getState();
  65. if(mInactiveState != GUIButtonState::Normal)
  66. setState(GUIButtonState::Normal);
  67. }
  68. else
  69. {
  70. if(getState() != mInactiveState)
  71. setState(mInactiveState);
  72. }
  73. }
  74. bool GUITabButton::mouseEvent(const GUIMouseEvent& ev)
  75. {
  76. if(ev.getType() == GUIMouseEventType::MouseOver)
  77. {
  78. GUIButtonState state = _isOn() ? GUIButtonState::HoverOn : GUIButtonState::Hover;
  79. if(!mDraggedState)
  80. {
  81. setState(state);
  82. if(!onHover.empty())
  83. onHover();
  84. }
  85. else
  86. mInactiveState = state;
  87. return true;
  88. }
  89. else if(ev.getType() == GUIMouseEventType::MouseOut)
  90. {
  91. GUIButtonState state = _isOn() ? GUIButtonState::NormalOn : GUIButtonState::Normal;
  92. if(!mDraggedState)
  93. {
  94. setState(state);
  95. if(!onOut.empty())
  96. onOut();
  97. }
  98. else
  99. mInactiveState = state;
  100. return true;
  101. }
  102. else if(ev.getType() == GUIMouseEventType::MouseDown)
  103. {
  104. if(!mDraggedState)
  105. setState(_isOn() ? GUIButtonState::ActiveOn : GUIButtonState::Active);
  106. return true;
  107. }
  108. else if(ev.getType() == GUIMouseEventType::MouseUp)
  109. {
  110. if(!mDraggedState)
  111. {
  112. setState(_isOn() ? GUIButtonState::HoverOn : GUIButtonState::Hover);
  113. if(!onClick.empty())
  114. onClick();
  115. if(!mIsToggled)
  116. toggleOn();
  117. }
  118. return true;
  119. }
  120. else if(ev.getType() == GUIMouseEventType::MouseDragStart)
  121. {
  122. mDragStartPosition = ev.getPosition();
  123. return true;
  124. }
  125. else if(ev.getType() == GUIMouseEventType::MouseDrag)
  126. {
  127. UINT32 dist = mDragStartPosition.manhattanDist(ev.getPosition());
  128. if(dist > DRAG_MIN_DISTANCE)
  129. {
  130. if(!onDragged.empty())
  131. onDragged(mIndex, ev.getPosition());
  132. }
  133. return true;
  134. }
  135. else if(ev.getType() == GUIMouseEventType::MouseDragEnd)
  136. {
  137. UINT32 dist = mDragStartPosition.manhattanDist(ev.getPosition());
  138. if(dist > DRAG_MIN_DISTANCE)
  139. {
  140. if(!onDragEnd.empty())
  141. onDragEnd(mIndex, ev.getPosition());
  142. }
  143. return true;
  144. }
  145. return false;
  146. }
  147. }