kick
|
00001 // 00002 // Created by morten on 18/01/15. 00003 // 00004 00005 #include "toggle_button.h" 00006 #include <algorithm> 00007 00008 namespace kick { 00009 00010 ToggleButton::ToggleButton(GameObject *gameObject, std::shared_ptr<Canvas> canvas) 00011 :Button{gameObject, canvas}//, mGroup{new ToggleButtonGroup{}} 00012 { 00013 setGroup(std::make_shared<ToggleButtonGroup>()); 00014 } 00015 00016 ToggleButton::~ToggleButton() { 00017 setGroup(std::shared_ptr<ToggleButtonGroup>()); // clean up group 00018 } 00019 00020 std::shared_ptr<ToggleButtonGroup> ToggleButton::group() { 00021 return mGroup; 00022 } 00023 00024 void ToggleButton::setGroup(std::shared_ptr<ToggleButtonGroup> group) { 00025 if (mGroup != group){ 00026 if (mGroup){ 00027 auto pos = std::find(mGroup->buttons.begin(),mGroup->buttons.end(), this); 00028 if (pos != mGroup->buttons.end()){ 00029 mGroup->buttons.erase(pos); 00030 } 00031 if (mGroup->selectedButton == this){ 00032 mGroup->selectedButton = nullptr; 00033 } 00034 } 00035 mGroup = group; 00036 if (mGroup){ 00037 mGroup->buttons.push_back(this); 00038 if (mGroup->buttonCount()==1){ 00039 mGroup->buttons[0]->setSelected(true); 00040 } 00041 } 00042 } 00043 } 00044 00045 bool ToggleButton::selected() { 00046 return this == mGroup->selectedButton; 00047 } 00048 00049 void ToggleButton::toggleSelected(){ 00050 setSelected(!selected()); 00051 } 00052 00053 void ToggleButton::setSelected(bool selectedState) { 00054 if (selectedState){ 00055 bool doToggle = mGroup->buttons.size() == 1; 00056 if (selected()) { 00057 return; 00058 } 00059 if (mGroup->selectedButton) { 00060 mGroup->selectedButton->setSelected(false); 00061 } 00062 mGroup->selectedButton = this; 00063 00064 } 00065 if (!selectedState){ 00066 if (!selected()){ 00067 return; 00068 } 00069 mGroup->selectedButton = nullptr; 00070 } 00071 updateTextureAndTxtColor(); 00072 mOnChange(this); 00073 } 00074 00075 void ToggleButton::updateTextureAndTxtColor() { 00076 if (selected()){ 00077 setSpriteName(mSelectedSprite); 00078 mTextComponent->material()->setUniform("mainColor", mPressedColor); 00079 } else { 00080 Button::updateTextureAndTxtColor(); 00081 } 00082 } 00083 00084 void ToggleButton::invokeClick() { 00085 if (mGroup->buttonCount()==1){ 00086 toggleSelected(); 00087 } else { 00088 setSelected(true); 00089 } 00090 Button::invokeClick(); 00091 } 00092 00093 std::function<void(ToggleButton*)> const &ToggleButton::onChange() const { 00094 return mOnChange; 00095 } 00096 00097 void ToggleButton::setOnChange(std::function<void(ToggleButton*)> const &onChange) { 00098 this->mOnChange = onChange; 00099 } 00100 00101 std::string ToggleButton::selectedSprite() const { 00102 return mSelectedSprite; 00103 } 00104 00105 void ToggleButton::setSelectedSprite(std::string const &selectedSprite) { 00106 mSelectedSprite = selectedSprite; 00107 Button::updateTextureAndTxtColor(); 00108 } 00109 00110 int ToggleButtonGroup::buttonCount() { 00111 return buttons.size(); 00112 } 00113 };