MyGUI_ControllerEdgeHide.cpp
Go to the documentation of this file.
/*
* This source file is part of MyGUI. For the latest info, see http://mygui.info/
* Distributed under the MIT License
* (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
*/
#include "MyGUI_Precompiled.h"
#include "MyGUI_ControllerEdgeHide.h"
#include "MyGUI_Gui.h"
#include "MyGUI_InputManager.h"
#include "MyGUI_WidgetManager.h"
#include "MyGUI_Widget.h"
namespace MyGUI
{
#ifdef M_PI
#undef M_PI
#endif
const float M_PI = 3.141593f;
void ControllerEdgeHide::prepareItem(Widget* _widget)
{
recalculateTime(_widget);
// вызываем пользовательский делегат для подготовки
eventPreAction(_widget, this);
}
bool ControllerEdgeHide::addTime(Widget* _widget, float _time)
{
const IntSize& view_size = _widget->getParentSize();
// do nothing if we have minimized window
if (view_size.width <= 1 && view_size.height <= 1)
return true;
Widget* keyFocus = InputManager::getInstance().getKeyFocusWidget();
Widget* mouseFocus = InputManager::getInstance().getMouseFocusWidget();
while ((keyFocus != nullptr) && (_widget != keyFocus))
keyFocus = keyFocus->getParent();
while ((mouseFocus != nullptr) && (_widget != mouseFocus))
mouseFocus = mouseFocus->getParent();
// if our widget or its children have focus
bool haveFocus = ((keyFocus != nullptr) || (mouseFocus != nullptr)) || (!_widget->getVisible());
mElapsedTime += haveFocus ? -_time : _time;
if (mElapsedTime >= mTime)
{
mElapsedTime = mTime;
}
if (mElapsedTime <= 0)
{
mElapsedTime = 0.0f;
return true;
}
float k = std::sin(M_PI * mElapsedTime / mTime - M_PI / 2);
if (k < 0)
k = (-std::pow(-k, 0.7f) + 1) / 2;
else
k = (std::pow(k, 0.7f) + 1) / 2;
MyGUI::IntCoord coord = _widget->getCoord();
// if widget was moved
if (coord != mLastCoord)
{
// if still moving - leave it alone
if (haveFocus)
return true;
recalculateTime(_widget);
}
bool nearBorder = false;
bool behindLeft = coord.left <= 0;
bool behindRight = coord.right() >= view_size.width - 1;
bool behindTop = coord.top <= 0;
bool behindBottom = coord.bottom() >= view_size.height - 1;
if (behindLeft && !behindRight)
{
coord.left = -int(float(coord.width - mRemainPixels - mShadowSize) * k);
nearBorder = true;
}
if (behindTop && !behindBottom)
{
coord.top = -int(float(coord.height - mRemainPixels - mShadowSize) * k);
nearBorder = true;
}
if (behindRight && !behindLeft)
{
coord.left = int(float(view_size.width - 1) - float(mRemainPixels) * k - float(coord.width) * (1.f - k));
nearBorder = true;
}
if (behindBottom && !behindTop)
{
coord.top = int(float(view_size.height - 1) - float(mRemainPixels) * k - float(coord.height) * (1.f - k));
nearBorder = true;
}
if (nearBorder)
{
_widget->setCoord(coord);
}
else
{
mElapsedTime = 0;
}
mLastCoord = coord;
eventUpdateAction(_widget, this);
return true;
}
void ControllerEdgeHide::setProperty(std::string_view _key, std::string_view _value)
{
if (_key == "Time")
setTime(utility::parseValue<float>(_value));
else if (_key == "RemainPixels")
setRemainPixels(utility::parseValue<int>(_value));
else if (_key == "ShadowSize")
setShadowSize(utility::parseValue<int>(_value));
}
void ControllerEdgeHide::recalculateTime(Widget* _widget)
{
float k = 0;
const MyGUI::IntCoord& coord = _widget->getCoord();
const MyGUI::IntSize& view_size = _widget->getParentSize();
bool behindLeft = coord.left <= 0;
bool behindRight = coord.right() >= view_size.width - 1;
bool behindTop = coord.top <= 0;
bool behindBottom = coord.bottom() >= view_size.height - 1;
// check if widget is near any border and not near opposite borders at same time
if (behindLeft && !behindRight)
{
k = -(float)coord.left / (coord.width - mRemainPixels - mShadowSize);
}
else if (behindTop && !behindBottom)
{
k = -(float)coord.top / (coord.height - mRemainPixels - mShadowSize);
}
else if (behindRight && !behindLeft)
{
k = (float)(coord.right() - view_size.width + 1) / (coord.width - mRemainPixels);
}
else if (behindBottom && !behindTop)
{
k = (float)(coord.bottom() - view_size.height + 1) / (coord.height - mRemainPixels);
}
//mElapsedTime = (asin(k)/M_PI + 1./2) * mTime;
// this is reversed formula from ControllerEdgeHide::addTime k calculation
if (k > 0.5f)
mElapsedTime = (std::asin(std::pow(2 * k - 1, 1 / 0.7f)) / M_PI + 1.f / 2) * mTime;
else
mElapsedTime = (std::asin(-std::pow(-2 * k + 1, 1 / 0.7f)) / M_PI + 1.f / 2) * mTime;
}
void ControllerEdgeHide::setTime(float _value)
{
mTime = _value;
}
void ControllerEdgeHide::setRemainPixels(int _value)
{
mRemainPixels = _value;
}
void ControllerEdgeHide::setShadowSize(int _value)
{
mShadowSize = _value;
}
} // namespace MyGUI
MyGUI_ControllerEdgeHide.h
MyGUI_Gui.h
MyGUI_InputManager.h
MyGUI_Precompiled.h
MyGUI_Widget.h
MyGUI_WidgetManager.h
MyGUI::ControllerEdgeHide::setRemainPixels
void setRemainPixels(int _value)
Definition MyGUI_ControllerEdgeHide.cpp:168
MyGUI::ControllerEdgeHide::setShadowSize
void setShadowSize(int _value)
Definition MyGUI_ControllerEdgeHide.cpp:173
MyGUI::ControllerEdgeHide::setTime
void setTime(float _value)
Definition MyGUI_ControllerEdgeHide.cpp:163
MyGUI::ControllerEdgeHide::addTime
bool addTime(Widget *_widget, float _time) override
Definition MyGUI_ControllerEdgeHide.cpp:29
MyGUI::ControllerEdgeHide::prepareItem
void prepareItem(Widget *_widget) override
Definition MyGUI_ControllerEdgeHide.cpp:22
MyGUI::ControllerEdgeHide::setProperty
void setProperty(std::string_view _key, std::string_view _value) override
Definition MyGUI_ControllerEdgeHide.cpp:117
MyGUI::ControllerItem::eventPreAction
EventPairAddParameter< EventHandle_WidgetPtr, EventHandle_WidgetPtrControllerItemPtr > eventPreAction
Definition MyGUI_ControllerItem.h:41
MyGUI::ControllerItem::eventUpdateAction
EventPairAddParameter< EventHandle_WidgetPtr, EventHandle_WidgetPtrControllerItemPtr > eventUpdateAction
Definition MyGUI_ControllerItem.h:47
MyGUI::ICroppedRectangle::getCoord
const IntCoord & getCoord() const
Definition MyGUI_ICroppedRectangle.h:56
MyGUI::InputManager::getKeyFocusWidget
Widget * getKeyFocusWidget() const
Definition MyGUI_InputManager.cpp:643
MyGUI::InputManager::getMouseFocusWidget
Widget * getMouseFocusWidget() const
Definition MyGUI_InputManager.cpp:638
MyGUI::InputManager::getInstance
static InputManager & getInstance()
MyGUI::Widget
widget description should be here.
Definition MyGUI_Widget.h:40
MyGUI::Widget::getParent
Widget * getParent() const
Definition MyGUI_Widget.cpp:1352
MyGUI::Widget::getParentSize
IntSize getParentSize() const
Definition MyGUI_Widget.cpp:1082
MyGUI::Widget::getVisible
bool getVisible() const
Definition MyGUI_Widget.cpp:1327
MyGUI::Widget::setCoord
void setCoord(const IntCoord &_coord) override
Definition MyGUI_Widget.cpp:730
MyGUI::utility::parseValue
T parseValue(std::string_view _value)
Definition MyGUI_StringUtility.h:60
MyGUI
Definition MyGUI_ActionController.h:15
MyGUI::M_PI
const float M_PI
Definition MyGUI_ControllerEdgeHide.cpp:20
MyGUI::IntCoord
types::TCoord< int > IntCoord
Definition MyGUI_Types.h:36
MyGUI::IntSize
types::TSize< int > IntSize
Definition MyGUI_Types.h:30
MyGUI::types::TCoord::height
T height
Definition MyGUI_TCoord.h:23
MyGUI::types::TCoord::right
T right() const
Definition MyGUI_TCoord.h:125
MyGUI::types::TCoord::width
T width
Definition MyGUI_TCoord.h:22
MyGUI::types::TCoord::top
T top
Definition MyGUI_TCoord.h:21
MyGUI::types::TCoord::left
T left
Definition MyGUI_TCoord.h:20
MyGUI::types::TCoord::bottom
T bottom() const
Definition MyGUI_TCoord.h:130
MyGUI::types::TSize::width
T width
Definition MyGUI_TSize.h:19
MyGUI::types::TSize::height
T height
Definition MyGUI_TSize.h:20