MyGUI  3.2.1
MyGUI_Button.cpp
Go to the documentation of this file.
00001 /*
00002  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
00003  * Distributed under the MIT License
00004  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
00005  */
00006 
00007 #include "MyGUI_Precompiled.h"
00008 #include "MyGUI_Button.h"
00009 #include "MyGUI_ResourceSkin.h"
00010 #include "MyGUI_ImageBox.h"
00011 #include "MyGUI_InputManager.h"
00012 
00013 namespace MyGUI
00014 {
00015 
00016     Button::Button() :
00017         mIsMousePressed(false),
00018         mIsMouseFocus(false),
00019         mStateSelected(false),
00020         mImage(nullptr),
00021         mModeImage(false)
00022     {
00023     }
00024 
00025     void Button::initialiseOverride()
00026     {
00027         Base::initialiseOverride();
00028 
00030         assignWidget(mImage, "Image");
00031     }
00032 
00033     void Button::shutdownOverride()
00034     {
00035         mImage = nullptr;
00036 
00037         Base::shutdownOverride();
00038     }
00039 
00040     void Button::onMouseSetFocus(Widget* _old)
00041     {
00042         _setMouseFocus(true);
00043 
00044         Base::onMouseSetFocus(_old);
00045     }
00046 
00047     void Button::onMouseLostFocus(Widget* _new)
00048     {
00049         _setMouseFocus(false);
00050 
00051         Base::onMouseLostFocus(_new);
00052     }
00053 
00054     void Button::onMouseButtonPressed(int _left, int _top, MouseButton _id)
00055     {
00056         if (_id == MouseButton::Left)
00057         {
00058             mIsMousePressed = true;
00059             updateButtonState();
00060         }
00061 
00062         Base::onMouseButtonPressed(_left, _top, _id);
00063     }
00064 
00065     void Button::onMouseButtonReleased(int _left, int _top, MouseButton _id)
00066     {
00067         if (_id == MouseButton::Left)
00068         {
00069             mIsMousePressed = false;
00070             updateButtonState();
00071         }
00072 
00073         Base::onMouseButtonReleased(_left, _top, _id);
00074     }
00075 
00076     void Button::updateButtonState()
00077     {
00078         if (mStateSelected)
00079         {
00080             if (!getInheritedEnabled())
00081             {
00082                 if (!_setState("disabled_checked"))
00083                     _setState("disabled");
00084             }
00085             else if (mIsMousePressed)
00086             {
00087                 if (!_setState("pushed_checked"))
00088                     _setState("pushed");
00089             }
00090             else if (mIsMouseFocus)
00091             {
00092                 if (!_setState("highlighted_checked"))
00093                     _setState("pushed");
00094             }
00095             else
00096                 _setState("normal_checked");
00097         }
00098         else
00099         {
00100             if (!getInheritedEnabled())
00101                 _setState("disabled");
00102             else if (mIsMousePressed)
00103                 _setState("pushed");
00104             else if (mIsMouseFocus)
00105                 _setState("highlighted");
00106             else
00107                 _setState("normal");
00108         }
00109     }
00110 
00111     void Button::setStateSelected(bool _check)
00112     {
00113         if (mStateSelected == _check)
00114             return;
00115 
00116         mStateSelected = _check;
00117         updateButtonState();
00118     }
00119 
00120     void Button::_setMouseFocus(bool _focus)
00121     {
00122         mIsMouseFocus = _focus;
00123         updateButtonState();
00124     }
00125 
00126     void Button::baseUpdateEnable()
00127     {
00128         updateButtonState();
00129         if (!getInheritedEnabled())
00130         {
00131             mIsMouseFocus = false;
00132         }
00133     }
00134 
00135     void Button::setModeImage(bool _value)
00136     {
00137         mModeImage = _value;
00138         updateButtonState();
00139     }
00140 
00141     bool Button::_setState(const std::string& _value)
00142     {
00143         if (mModeImage)
00144         {
00145             if (mImage)
00146                 mImage->setItemName(_value);
00147 
00148             _setWidgetState(_value);
00149             return true;
00150         }
00151 
00152         return _setWidgetState(_value);
00153     }
00154 
00155     void Button::setImageResource(const std::string& _name)
00156     {
00157         if (mImage)
00158             mImage->setItemResource(_name);
00159         updateButtonState();
00160     }
00161 
00162     void Button::setImageGroup(const std::string& _name)
00163     {
00164         if (mImage)
00165             mImage->setItemGroup(_name);
00166         updateButtonState();
00167     }
00168 
00169     void Button::setImageName(const std::string& _name)
00170     {
00171         if (mImage)
00172             mImage->setItemName(_name);
00173     }
00174 
00175     void Button::setPropertyOverride(const std::string& _key, const std::string& _value)
00176     {
00178         if (_key == "StateSelected")
00179             setStateSelected(utility::parseValue<bool>(_value));
00180 
00182         else if (_key == "ModeImage")
00183             setModeImage(utility::parseValue<bool>(_value));
00184 
00186         else if (_key == "ImageResource")
00187             setImageResource(_value);
00188 
00190         else if (_key == "ImageGroup")
00191             setImageGroup(_value);
00192 
00194         else if (_key == "ImageName")
00195             setImageName(_value);
00196 
00197         else
00198         {
00199             Base::setPropertyOverride(_key, _value);
00200             return;
00201         }
00202 
00203         eventChangeProperty(this, _key, _value);
00204     }
00205 
00206     bool Button::getStateSelected() const
00207     {
00208         return mStateSelected;
00209     }
00210 
00211     bool Button::getModeImage() const
00212     {
00213         return mModeImage;
00214     }
00215 
00216     ImageBox* Button::_getImageBox()
00217     {
00218         return mImage;
00219     }
00220 
00221 } // namespace MyGUI