/*!
@file
@author Albert Semenov
@date 11/2007
@module
*/
/*
This file is part of MyGUI.
MyGUI is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MyGUI is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with MyGUI. If not, see .
*/
#include "MyGUI_Precompiled.h"
#include "MyGUI_Button.h"
#include "MyGUI_ResourceSkin.h"
#include "MyGUI_StaticImage.h"
#include "MyGUI_InputManager.h"
namespace MyGUI
{
Button::Button() :
mIsMousePressed(false),
mIsMouseFocus(false),
mIsStateCheck(false),
mImage(nullptr),
mModeImage(false)
{
}
void Button::_initialise(WidgetStyle _style, const IntCoord& _coord, Align _align, ResourceSkin* _info, Widget* _parent, ICroppedRectangle * _croppedParent, IWidgetCreator * _creator, const std::string& _name)
{
Base::_initialise(_style, _coord, _align, _info, _parent, _croppedParent, _creator, _name);
initialiseWidgetSkin(_info);
}
Button::~Button()
{
shutdownWidgetSkin();
}
void Button::baseChangeWidgetSkin(ResourceSkin* _info)
{
shutdownWidgetSkin();
Base::baseChangeWidgetSkin(_info);
initialiseWidgetSkin(_info);
}
void Button::initialiseWidgetSkin(ResourceSkin* _info)
{
// парсим свойства
const MapString& properties = _info->getProperties();
if (!properties.empty())
{
MapString::const_iterator iter = properties.find("ButtonPressed");
if (iter != properties.end()) setButtonPressed(utility::parseValue(iter->second));
iter = properties.find("StateCheck");
if (iter != properties.end()) setStateCheck(utility::parseValue(iter->second));
iter = properties.find("ModeImage");
if (iter != properties.end()) setModeImage(utility::parseValue(iter->second));
}
for (VectorWidgetPtr::iterator iter=mWidgetChildSkin.begin(); iter!=mWidgetChildSkin.end(); ++iter)
{
if (*(*iter)->_getInternalData() == "Image")
{
MYGUI_DEBUG_ASSERT( ! mImage, "widget already assigned");
mImage = (*iter)->castType();
}
}
}
void Button::shutdownWidgetSkin()
{
mImage = nullptr;
}
void Button::onMouseSetFocus(Widget* _old)
{
_setMouseFocus(true);
Base::onMouseSetFocus(_old);
}
void Button::onMouseLostFocus(Widget* _new)
{
_setMouseFocus(false);
Base::onMouseLostFocus(_new);
}
void Button::onMouseButtonPressed(int _left, int _top, MouseButton _id)
{
if (_id == MouseButton::Left)
{
mIsMousePressed = true;
updateButtonState();
}
Base::onMouseButtonPressed(_left, _top, _id);
}
void Button::onMouseButtonReleased(int _left, int _top, MouseButton _id)
{
if (_id == MouseButton::Left)
{
mIsMousePressed = false;
updateButtonState();
}
Base::onMouseButtonReleased(_left, _top, _id);
}
void Button::setImageIndex(size_t _index)
{
if (mImage) mImage->setImageIndex(_index);
}
size_t Button::getImageIndex()
{
if (mImage) return mImage->getImageIndex();
return ITEM_NONE;
}
void Button::updateButtonState()
{
if (mIsStateCheck)
{
if (!mEnabled) { if (!_setState("disabled_checked")) _setState("disabled"); }
else if (mIsMousePressed) { if (!_setState("pushed_checked")) _setState("pushed"); }
else if (mIsMouseFocus) { if (!_setState("highlighted_checked")) _setState("pushed"); }
else _setState("normal_checked");
}
else
{
if (!mEnabled) _setState("disabled");
else if (mIsMousePressed) _setState("pushed");
else if (mIsMouseFocus) _setState("highlighted");
else _setState("normal");
}
}
void Button::setStateCheck(bool _check)
{
if (mIsStateCheck == _check) return;
mIsStateCheck = _check;
updateButtonState();
}
void Button::_setMouseFocus(bool _focus)
{
mIsMouseFocus = _focus;
updateButtonState();
}
void Button::setProperty(const std::string& _key, const std::string& _value)
{
/// @wproperty{Button, Button_Pressed, bool} Set pressed state.
if (_key == "Button_Pressed") setButtonPressed(utility::parseValue(_value));
else if (_key == "Button_ModeImage") setModeImage(utility::parseValue(_value));
else if (_key == "Button_ImageResource") setImageResource(_value);
else
{
Base::setProperty(_key, _value);
return;
}
eventChangeProperty(this, _key, _value);
}
void Button::baseUpdateEnable()
{
updateButtonState();
if (!mEnabled)
{
mIsMouseFocus = false;
}
}
void Button::setModeImage(bool _value)
{
mModeImage = _value;
updateButtonState();
}
bool Button::_setState(const std::string& _value)
{
if (mModeImage)
{
if (mImage)
mImage->setItemName(_value);
setState(_value);
return true;
}
return setState(_value);
}
void Button::setImageResource(const std::string& _name)
{
if (mImage)
mImage->setItemResource(_name);
updateButtonState();
}
} // namespace MyGUI