MyGUI  3.2.0
MyGUI_Button.cpp
Go to the documentation of this file.
00001 
00006 /*
00007     This file is part of MyGUI.
00008 
00009     MyGUI is free software: you can redistribute it and/or modify
00010     it under the terms of the GNU Lesser General Public License as published by
00011     the Free Software Foundation, either version 3 of the License, or
00012     (at your option) any later version.
00013 
00014     MyGUI is distributed in the hope that it will be useful,
00015     but WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017     GNU Lesser General Public License for more details.
00018 
00019     You should have received a copy of the GNU Lesser General Public License
00020     along with MyGUI.  If not, see <http://www.gnu.org/licenses/>.
00021 */
00022 #include "MyGUI_Precompiled.h"
00023 #include "MyGUI_Button.h"
00024 #include "MyGUI_ResourceSkin.h"
00025 #include "MyGUI_ImageBox.h"
00026 #include "MyGUI_InputManager.h"
00027 
00028 namespace MyGUI
00029 {
00030 
00031     Button::Button() :
00032         mIsMousePressed(false),
00033         mIsMouseFocus(false),
00034         mStateSelected(false),
00035         mImage(nullptr),
00036         mModeImage(false)
00037     {
00038     }
00039 
00040     void Button::initialiseOverride()
00041     {
00042         Base::initialiseOverride();
00043 
00044         assignWidget(mImage, "Image");
00045     }
00046 
00047     void Button::shutdownOverride()
00048     {
00049         mImage = nullptr;
00050 
00051         Base::shutdownOverride();
00052     }
00053 
00054     void Button::onMouseSetFocus(Widget* _old)
00055     {
00056         _setMouseFocus(true);
00057 
00058         Base::onMouseSetFocus(_old);
00059     }
00060 
00061     void Button::onMouseLostFocus(Widget* _new)
00062     {
00063         _setMouseFocus(false);
00064 
00065         Base::onMouseLostFocus(_new);
00066     }
00067 
00068     void Button::onMouseButtonPressed(int _left, int _top, MouseButton _id)
00069     {
00070         if (_id == MouseButton::Left)
00071         {
00072             mIsMousePressed = true;
00073             updateButtonState();
00074         }
00075 
00076         Base::onMouseButtonPressed(_left, _top, _id);
00077     }
00078 
00079     void Button::onMouseButtonReleased(int _left, int _top, MouseButton _id)
00080     {
00081         if (_id == MouseButton::Left)
00082         {
00083             mIsMousePressed = false;
00084             updateButtonState();
00085         }
00086 
00087         Base::onMouseButtonReleased(_left, _top, _id);
00088     }
00089 
00090     void Button::updateButtonState()
00091     {
00092         if (mStateSelected)
00093         {
00094             if (!getEnabled())
00095             {
00096                 if (!_setState("disabled_checked"))
00097                     _setState("disabled");
00098             }
00099             else if (mIsMousePressed)
00100             {
00101                 if (!_setState("pushed_checked"))
00102                     _setState("pushed");
00103             }
00104             else if (mIsMouseFocus)
00105             {
00106                 if (!_setState("highlighted_checked"))
00107                     _setState("pushed");
00108             }
00109             else
00110                 _setState("normal_checked");
00111         }
00112         else
00113         {
00114             if (!getEnabled())
00115                 _setState("disabled");
00116             else if (mIsMousePressed)
00117                 _setState("pushed");
00118             else if (mIsMouseFocus)
00119                 _setState("highlighted");
00120             else
00121                 _setState("normal");
00122         }
00123     }
00124 
00125     void Button::setStateSelected(bool _check)
00126     {
00127         if (mStateSelected == _check)
00128             return;
00129 
00130         mStateSelected = _check;
00131         updateButtonState();
00132     }
00133 
00134     void Button::_setMouseFocus(bool _focus)
00135     {
00136         mIsMouseFocus = _focus;
00137         updateButtonState();
00138     }
00139 
00140     void Button::baseUpdateEnable()
00141     {
00142         updateButtonState();
00143         if (!getEnabled())
00144         {
00145             mIsMouseFocus = false;
00146         }
00147     }
00148 
00149     void Button::setModeImage(bool _value)
00150     {
00151         mModeImage = _value;
00152         updateButtonState();
00153     }
00154 
00155     bool Button::_setState(const std::string& _value)
00156     {
00157         if (mModeImage)
00158         {
00159             if (mImage)
00160                 mImage->setItemName(_value);
00161 
00162             _setWidgetState(_value);
00163             return true;
00164         }
00165 
00166         return _setWidgetState(_value);
00167     }
00168 
00169     void Button::setImageResource(const std::string& _name)
00170     {
00171         if (mImage)
00172             mImage->setItemResource(_name);
00173         updateButtonState();
00174     }
00175 
00176     void Button::setImageGroup(const std::string& _name)
00177     {
00178         if (mImage)
00179             mImage->setItemGroup(_name);
00180         updateButtonState();
00181     }
00182 
00183     void Button::setImageName(const std::string& _name)
00184     {
00185         if (mImage)
00186             mImage->setItemName(_name);
00187     }
00188 
00189     void Button::setPropertyOverride(const std::string& _key, const std::string& _value)
00190     {
00192         if (_key == "StateSelected")
00193             setStateSelected(utility::parseValue<bool>(_value));
00194         else if (_key == "ModeImage")
00195             setModeImage(utility::parseValue<bool>(_value));
00196         else if (_key == "ImageResource")
00197             setImageResource(_value);
00198         else if (_key == "ImageGroup")
00199             setImageGroup(_value);
00200         else if (_key == "ImageName")
00201             setImageName(_value);
00202         else
00203         {
00204             Base::setPropertyOverride(_key, _value);
00205             return;
00206         }
00207         eventChangeProperty(this, _key, _value);
00208     }
00209 
00210     bool Button::getStateSelected() const
00211     {
00212         return mStateSelected;
00213     }
00214 
00215     bool Button::getModeImage() const
00216     {
00217         return mModeImage;
00218     }
00219 
00220     ImageBox* Button::_getImageBox()
00221     {
00222         return mImage;
00223     }
00224 
00225 } // namespace MyGUI