00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "MyGUI_Precompiled.h"
00024 #include "MyGUI_Button.h"
00025 #include "MyGUI_ResourceSkin.h"
00026 #include "MyGUI_StaticImage.h"
00027 #include "MyGUI_InputManager.h"
00028
00029 namespace MyGUI
00030 {
00031
00032 Button::Button() :
00033 mIsMousePressed(false),
00034 mIsMouseFocus(false),
00035 mIsStateCheck(false),
00036 mImage(nullptr),
00037 mModeImage(false)
00038 {
00039 }
00040
00041 void Button::_initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name)
00042 {
00043 Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name);
00044
00045 initialiseWidgetSkin(_info);
00046 }
00047
00048 Button::~Button()
00049 {
00050 shutdownWidgetSkin();
00051 }
00052
00053 void Button::baseChangeWidgetSkin(ResourceSkin* _info)
00054 {
00055 shutdownWidgetSkin();
00056 Base::baseChangeWidgetSkin(_info);
00057 initialiseWidgetSkin(_info);
00058 }
00059
00060 void Button::initialiseWidgetSkin(ResourceSkin* _info)
00061 {
00062
00063 const MapString& properties = _info->getProperties();
00064 if (!properties.empty())
00065 {
00066 MapString::const_iterator iter = properties.find("ButtonPressed");
00067 if (iter != properties.end()) setButtonPressed(utility::parseValue<bool>(iter->second));
00068 iter = properties.find("StateCheck");
00069 if (iter != properties.end()) setStateCheck(utility::parseValue<bool>(iter->second));
00070 iter = properties.find("ModeImage");
00071 if (iter != properties.end()) setModeImage(utility::parseValue<bool>(iter->second));
00072 }
00073
00074 for (VectorWidgetPtr::iterator iter=mWidgetChildSkin.begin(); iter!=mWidgetChildSkin.end(); ++iter)
00075 {
00076 if (*(*iter)->_getInternalData<std::string>() == "Image")
00077 {
00078 MYGUI_DEBUG_ASSERT( ! mImage, "widget already assigned");
00079 mImage = (*iter)->castType<StaticImage>();
00080 }
00081 }
00082 }
00083
00084 void Button::shutdownWidgetSkin()
00085 {
00086 mImage = nullptr;
00087 }
00088
00089 void Button::onMouseSetFocus(Widget* _old)
00090 {
00091 _setMouseFocus(true);
00092
00093 Base::onMouseSetFocus(_old);
00094 }
00095
00096 void Button::onMouseLostFocus(Widget* _new)
00097 {
00098 _setMouseFocus(false);
00099
00100 Base::onMouseLostFocus(_new);
00101 }
00102
00103 void Button::onMouseButtonPressed(int _left, int _top, MouseButton _id)
00104 {
00105 if (_id == MouseButton::Left)
00106 {
00107 mIsMousePressed = true;
00108 updateButtonState();
00109 }
00110
00111 Base::onMouseButtonPressed(_left, _top, _id);
00112 }
00113
00114 void Button::onMouseButtonReleased(int _left, int _top, MouseButton _id)
00115 {
00116 if (_id == MouseButton::Left)
00117 {
00118 mIsMousePressed = false;
00119 updateButtonState();
00120 }
00121
00122 Base::onMouseButtonReleased(_left, _top, _id);
00123 }
00124
00125 void Button::setImageIndex(size_t _index)
00126 {
00127 if (mImage) mImage->setImageIndex(_index);
00128 }
00129
00130 size_t Button::getImageIndex()
00131 {
00132 if (mImage) return mImage->getImageIndex();
00133 return ITEM_NONE;
00134 }
00135
00136 void Button::updateButtonState()
00137 {
00138 if (mIsStateCheck)
00139 {
00140 if (!mEnabled) { if (!_setState("disabled_checked")) _setState("disabled"); }
00141 else if (mIsMousePressed) { if (!_setState("pushed_checked")) _setState("pushed"); }
00142 else if (mIsMouseFocus) { if (!_setState("highlighted_checked")) _setState("pushed"); }
00143 else _setState("normal_checked");
00144 }
00145 else
00146 {
00147 if (!mEnabled) _setState("disabled");
00148 else if (mIsMousePressed) _setState("pushed");
00149 else if (mIsMouseFocus) _setState("highlighted");
00150 else _setState("normal");
00151 }
00152 }
00153
00154 void Button::setStateCheck(bool _check)
00155 {
00156 if (mIsStateCheck == _check) return;
00157 mIsStateCheck = _check;
00158 updateButtonState();
00159 }
00160
00161 void Button::_setMouseFocus(bool _focus)
00162 {
00163 mIsMouseFocus = _focus;
00164 updateButtonState();
00165 }
00166
00167 void Button::setProperty(const std::string& _key, const std::string& _value)
00168 {
00170 if (_key == "Button_Pressed") setButtonPressed(utility::parseValue<bool>(_value));
00171 else if (_key == "Button_ModeImage") setModeImage(utility::parseValue<bool>(_value));
00172 else if (_key == "Button_ImageResource") setImageResource(_value);
00173 else
00174 {
00175 Base::setProperty(_key, _value);
00176 return;
00177 }
00178 eventChangeProperty(this, _key, _value);
00179 }
00180
00181 void Button::baseUpdateEnable()
00182 {
00183 updateButtonState();
00184 if (!mEnabled)
00185 {
00186 mIsMouseFocus = false;
00187 }
00188 }
00189
00190 void Button::setModeImage(bool _value)
00191 {
00192 mModeImage = _value;
00193 updateButtonState();
00194 }
00195
00196 bool Button::_setState(const std::string& _value)
00197 {
00198 if (mModeImage)
00199 {
00200 if (mImage)
00201 mImage->setItemName(_value);
00202
00203 setState(_value);
00204 return true;
00205 }
00206
00207 return setState(_value);
00208 }
00209
00210 void Button::setImageResource(const std::string& _name)
00211 {
00212 if (mImage)
00213 mImage->setItemResource(_name);
00214 updateButtonState();
00215 }
00216
00217 }