| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- #include "BsGUIToggle.h"
- #include "BsImageSprite.h"
- #include "BsGUIWidget.h"
- #include "BsGUISkin.h"
- #include "BsSpriteTexture.h"
- #include "BsTextSprite.h"
- #include "BsGUILayoutOptions.h"
- #include "BsGUIMouseEvent.h"
- #include "BsGUIToggleGroup.h"
- #include "BsGUIHelper.h"
- #include "CmTexture.h"
- using namespace CamelotFramework;
- namespace BansheeEngine
- {
- const String& GUIToggle::getGUITypeName()
- {
- static String name = "Toggle";
- return name;
- }
- GUIToggle::GUIToggle(GUIWidget& parent, const GUIElementStyle* style, const GUIContent& content, std::shared_ptr<GUIToggleGroup> toggleGroup, const GUILayoutOptions& layoutOptions)
- :GUIButtonBase(parent, style, content, layoutOptions), mIsToggled(false), mToggleGroup(nullptr)
- {
- if(toggleGroup != nullptr)
- toggleGroup->add(this);
- }
- GUIToggle::~GUIToggle()
- {
- if(mToggleGroup != nullptr)
- {
- mToggleGroup->remove(this);
- }
- }
- GUIToggle* GUIToggle::create(GUIWidget& parent, const HString& text, const GUIElementStyle* style)
- {
- return create(parent, GUIContent(text), style);
- }
- GUIToggle* GUIToggle::create(GUIWidget& parent, const HString& text, const GUIOptions& layoutOptions, const GUIElementStyle* style)
- {
- return create(parent, GUIContent(text), layoutOptions, style);
- }
- GUIToggle* GUIToggle::create(GUIWidget& parent, const HString& text, std::shared_ptr<GUIToggleGroup> toggleGroup, const GUIElementStyle* style)
- {
- return create(parent, GUIContent(text), toggleGroup, style);
- }
- GUIToggle* GUIToggle::create(GUIWidget& parent, const HString& text, std::shared_ptr<GUIToggleGroup> toggleGroup, const GUIOptions& layoutOptions, const GUIElementStyle* style)
- {
- return create(parent, GUIContent(text), toggleGroup, layoutOptions, style);
- }
- GUIToggle* GUIToggle::create(GUIWidget& parent, const GUIContent& content, const GUIElementStyle* style)
- {
- if(style == nullptr)
- {
- const GUISkin& skin = parent.getSkin();
- style = skin.getStyle(getGUITypeName());
- }
- return new (cm_alloc<GUIToggle, PoolAlloc>()) GUIToggle(parent, style, content, nullptr, GUILayoutOptions::create(style));
- }
- GUIToggle* GUIToggle::create(GUIWidget& parent, const GUIContent& content, const GUIOptions& layoutOptions, const GUIElementStyle* style)
- {
- if(style == nullptr)
- {
- const GUISkin& skin = parent.getSkin();
- style = skin.getStyle(getGUITypeName());
- }
- return new (cm_alloc<GUIToggle, PoolAlloc>()) GUIToggle(parent, style, content, nullptr, GUILayoutOptions::create(layoutOptions, style));
- }
- GUIToggle* GUIToggle::create(GUIWidget& parent, const GUIContent& content, std::shared_ptr<GUIToggleGroup> toggleGroup, const GUIElementStyle* style)
- {
- if(style == nullptr)
- {
- const GUISkin& skin = parent.getSkin();
- style = skin.getStyle(getGUITypeName());
- }
- return new (cm_alloc<GUIToggle, PoolAlloc>()) GUIToggle(parent, style, content, toggleGroup, GUILayoutOptions::create(style));
- }
- GUIToggle* GUIToggle::create(GUIWidget& parent, const GUIContent& content, std::shared_ptr<GUIToggleGroup> toggleGroup, const GUIOptions& layoutOptions, const GUIElementStyle* style)
- {
- if(style == nullptr)
- {
- const GUISkin& skin = parent.getSkin();
- style = skin.getStyle(getGUITypeName());
- }
- return new (cm_alloc<GUIToggle, PoolAlloc>()) GUIToggle(parent, style, content, toggleGroup, GUILayoutOptions::create(layoutOptions, style));
- }
- std::shared_ptr<GUIToggleGroup> GUIToggle::createToggleGroup()
- {
- std::shared_ptr<GUIToggleGroup> toggleGroup = std::shared_ptr<GUIToggleGroup>(new GUIToggleGroup());
- toggleGroup->initialize(toggleGroup);
- return toggleGroup;
- }
- void GUIToggle::_setToggleGroup(std::shared_ptr<GUIToggleGroup> toggleGroup)
- {
- mToggleGroup = toggleGroup;
- bool isToggled = false;
- if(mToggleGroup != nullptr) // If in group ensure at least one element is toggled on
- {
- for(auto& toggleElem : mToggleGroup->mButtons)
- {
- if(isToggled)
- {
- if(toggleElem->mIsToggled)
- toggleElem->toggleOff();
- }
- else
- {
- if(toggleElem->mIsToggled)
- isToggled = true;
- }
- }
- if(!isToggled)
- toggleOn();
- }
- }
- void GUIToggle::toggleOn()
- {
- if(mIsToggled)
- return;
- mIsToggled = true;
- if(!onToggled.empty())
- onToggled(mIsToggled);
- if(mToggleGroup != nullptr)
- {
- for(auto& toggleElem : mToggleGroup->mButtons)
- {
- if(toggleElem != this)
- toggleElem->toggleOff();
- }
- }
- _setOn(true);
- }
- void GUIToggle::toggleOff()
- {
- if(!mIsToggled)
- return;
- bool canBeToggledOff = false;
- if(mToggleGroup != nullptr) // If in group ensure at least one element is toggled on
- {
- for(auto& toggleElem : mToggleGroup->mButtons)
- {
- if(toggleElem != this)
- {
- if(toggleElem->mIsToggled)
- {
- canBeToggledOff = true;
- break;
- }
- }
- }
- }
- else
- canBeToggledOff = true;
- if(canBeToggledOff)
- {
- mIsToggled = false;
- if(!onToggled.empty())
- onToggled(mIsToggled);
- _setOn(false);
- }
- }
- bool GUIToggle::mouseEvent(const GUIMouseEvent& ev)
- {
- bool processed = GUIButtonBase::mouseEvent(ev);
- if(ev.getType() == GUIMouseEventType::MouseUp)
- {
- if(mIsToggled)
- toggleOff();
- else
- toggleOn();
- processed = true;
- }
- return processed;
- }
- }
|