kick
/Users/morten/Programmering/cpp/kick/src/kick/2d/toggle_button.cpp
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 };
 All Classes Functions Variables