2
0

BsGUITabButton.cpp 4.1 KB

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