BsGUIToggle.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #include "BsGUIToggle.h"
  2. #include "BsImageSprite.h"
  3. #include "BsGUIWidget.h"
  4. #include "BsGUISkin.h"
  5. #include "BsSpriteTexture.h"
  6. #include "BsTextSprite.h"
  7. #include "BsGUILayoutOptions.h"
  8. #include "BsGUIMouseEvent.h"
  9. #include "BsGUIToggleGroup.h"
  10. #include "BsGUIHelper.h"
  11. #include "CmTexture.h"
  12. using namespace CamelotFramework;
  13. namespace BansheeEngine
  14. {
  15. const String& GUIToggle::getGUITypeName()
  16. {
  17. static String name = "Toggle";
  18. return name;
  19. }
  20. GUIToggle::GUIToggle(GUIWidget& parent, const GUIElementStyle* style, const GUIContent& content, std::shared_ptr<GUIToggleGroup> toggleGroup, const GUILayoutOptions& layoutOptions)
  21. :GUIButtonBase(parent, style, content, layoutOptions), mIsToggled(false), mToggleGroup(nullptr)
  22. {
  23. if(toggleGroup != nullptr)
  24. toggleGroup->add(this);
  25. }
  26. GUIToggle::~GUIToggle()
  27. {
  28. if(mToggleGroup != nullptr)
  29. {
  30. mToggleGroup->remove(this);
  31. }
  32. }
  33. GUIToggle* GUIToggle::create(GUIWidget& parent, const HString& text, const GUIElementStyle* style)
  34. {
  35. return create(parent, GUIContent(text), style);
  36. }
  37. GUIToggle* GUIToggle::create(GUIWidget& parent, const HString& text, const GUIOptions& layoutOptions, const GUIElementStyle* style)
  38. {
  39. return create(parent, GUIContent(text), layoutOptions, style);
  40. }
  41. GUIToggle* GUIToggle::create(GUIWidget& parent, const HString& text, std::shared_ptr<GUIToggleGroup> toggleGroup, const GUIElementStyle* style)
  42. {
  43. return create(parent, GUIContent(text), toggleGroup, style);
  44. }
  45. GUIToggle* GUIToggle::create(GUIWidget& parent, const HString& text, std::shared_ptr<GUIToggleGroup> toggleGroup, const GUIOptions& layoutOptions, const GUIElementStyle* style)
  46. {
  47. return create(parent, GUIContent(text), toggleGroup, layoutOptions, style);
  48. }
  49. GUIToggle* GUIToggle::create(GUIWidget& parent, const GUIContent& content, const GUIElementStyle* style)
  50. {
  51. if(style == nullptr)
  52. {
  53. const GUISkin& skin = parent.getSkin();
  54. style = skin.getStyle(getGUITypeName());
  55. }
  56. return new (cm_alloc<GUIToggle, PoolAlloc>()) GUIToggle(parent, style, content, nullptr, GUILayoutOptions::create(style));
  57. }
  58. GUIToggle* GUIToggle::create(GUIWidget& parent, const GUIContent& content, const GUIOptions& layoutOptions, const GUIElementStyle* style)
  59. {
  60. if(style == nullptr)
  61. {
  62. const GUISkin& skin = parent.getSkin();
  63. style = skin.getStyle(getGUITypeName());
  64. }
  65. return new (cm_alloc<GUIToggle, PoolAlloc>()) GUIToggle(parent, style, content, nullptr, GUILayoutOptions::create(layoutOptions, style));
  66. }
  67. GUIToggle* GUIToggle::create(GUIWidget& parent, const GUIContent& content, std::shared_ptr<GUIToggleGroup> toggleGroup, const GUIElementStyle* style)
  68. {
  69. if(style == nullptr)
  70. {
  71. const GUISkin& skin = parent.getSkin();
  72. style = skin.getStyle(getGUITypeName());
  73. }
  74. return new (cm_alloc<GUIToggle, PoolAlloc>()) GUIToggle(parent, style, content, toggleGroup, GUILayoutOptions::create(style));
  75. }
  76. GUIToggle* GUIToggle::create(GUIWidget& parent, const GUIContent& content, std::shared_ptr<GUIToggleGroup> toggleGroup, const GUIOptions& layoutOptions, const GUIElementStyle* style)
  77. {
  78. if(style == nullptr)
  79. {
  80. const GUISkin& skin = parent.getSkin();
  81. style = skin.getStyle(getGUITypeName());
  82. }
  83. return new (cm_alloc<GUIToggle, PoolAlloc>()) GUIToggle(parent, style, content, toggleGroup, GUILayoutOptions::create(layoutOptions, style));
  84. }
  85. std::shared_ptr<GUIToggleGroup> GUIToggle::createToggleGroup()
  86. {
  87. std::shared_ptr<GUIToggleGroup> toggleGroup = std::shared_ptr<GUIToggleGroup>(new GUIToggleGroup());
  88. toggleGroup->initialize(toggleGroup);
  89. return toggleGroup;
  90. }
  91. void GUIToggle::_setToggleGroup(std::shared_ptr<GUIToggleGroup> toggleGroup)
  92. {
  93. mToggleGroup = toggleGroup;
  94. bool isToggled = false;
  95. if(mToggleGroup != nullptr) // If in group ensure at least one element is toggled on
  96. {
  97. for(auto& toggleElem : mToggleGroup->mButtons)
  98. {
  99. if(isToggled)
  100. {
  101. if(toggleElem->mIsToggled)
  102. toggleElem->toggleOff();
  103. }
  104. else
  105. {
  106. if(toggleElem->mIsToggled)
  107. isToggled = true;
  108. }
  109. }
  110. if(!isToggled)
  111. toggleOn();
  112. }
  113. }
  114. void GUIToggle::toggleOn()
  115. {
  116. if(mIsToggled)
  117. return;
  118. mIsToggled = true;
  119. if(!onToggled.empty())
  120. onToggled(mIsToggled);
  121. if(mToggleGroup != nullptr)
  122. {
  123. for(auto& toggleElem : mToggleGroup->mButtons)
  124. {
  125. if(toggleElem != this)
  126. toggleElem->toggleOff();
  127. }
  128. }
  129. _setOn(true);
  130. }
  131. void GUIToggle::toggleOff()
  132. {
  133. if(!mIsToggled)
  134. return;
  135. bool canBeToggledOff = false;
  136. if(mToggleGroup != nullptr) // If in group ensure at least one element is toggled on
  137. {
  138. for(auto& toggleElem : mToggleGroup->mButtons)
  139. {
  140. if(toggleElem != this)
  141. {
  142. if(toggleElem->mIsToggled)
  143. {
  144. canBeToggledOff = true;
  145. break;
  146. }
  147. }
  148. }
  149. }
  150. else
  151. canBeToggledOff = true;
  152. if(canBeToggledOff)
  153. {
  154. mIsToggled = false;
  155. if(!onToggled.empty())
  156. onToggled(mIsToggled);
  157. _setOn(false);
  158. }
  159. }
  160. bool GUIToggle::mouseEvent(const GUIMouseEvent& ev)
  161. {
  162. bool processed = GUIButtonBase::mouseEvent(ev);
  163. if(ev.getType() == GUIMouseEventType::MouseUp)
  164. {
  165. if(mIsToggled)
  166. toggleOff();
  167. else
  168. toggleOn();
  169. processed = true;
  170. }
  171. return processed;
  172. }
  173. }