1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-02 23:45:33 +00:00
openmw/extern/mygui_3.0.1/MyGUIEngine/src/MyGUI_ControllerEdgeHide.cpp
2010-07-08 00:23:28 +02:00

179 lines
5.1 KiB
C++

/*!
@file
@author Evmenov Georgiy
@date 03/2008
@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 <http://www.gnu.org/licenses/>.
*/
#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
{
#ifndef M_PI
const float M_PI = 3.141593f;
#endif
ControllerEdgeHide::ControllerEdgeHide() :
mTime(1.0),
mRemainPixels(0),
mShadowSize(0),
mElapsedTime(0)
{
}
void ControllerEdgeHide::prepareItem(Widget* _widget)
{
recalculateTime(_widget);
// вызываем пользовательский делегат для подготовки
eventPreAction(_widget);
}
bool ControllerEdgeHide::addTime(Widget* _widget, float _time)
{
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->isVisible() == false);
mElapsedTime += (1 - 2*haveFocus) * _time;
if (mElapsedTime >= mTime)
{
mElapsedTime = mTime;
}
if (mElapsedTime <= 0)
{
mElapsedTime = 0.0f;
return true;
}
float k = sin(M_PI * mElapsedTime/mTime - M_PI/2);
if (k<0) k = (-pow(-k, 0.7f) + 1)/2;
else k = (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;
else
recalculateTime(_widget);
}
IntSize view_size;
if (_widget->getCroppedParent() == nullptr)
view_size = _widget->getLayer()->getSize();
else
view_size = ((Widget*)_widget->getCroppedParent())->getSize();
bool nearBorder = false;
if ((coord.left <= 0) && !(coord.right() >= view_size.width - 1))
{
coord.left = - int( float(coord.width - mRemainPixels - mShadowSize) * k);
nearBorder = true;
}
else if ((coord.top <= 0) && !(coord.bottom() >= view_size.height - 1))
{
coord.top = - int( float(coord.height - mRemainPixels - mShadowSize) * k);
nearBorder = true;
}
else if ((coord.right() >= view_size.width - 1) && !(coord.left <= 0))
{
coord.left = int(float(view_size.width - 1) - float(mRemainPixels)*k - float(coord.width) * (1.f - k));
nearBorder = true;
}
else if ((coord.bottom() >= view_size.height-1) && !(coord.top <= 0))
{
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);
return true;
}
void ControllerEdgeHide::setProperty(const std::string& _key, const std::string& _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(); IntSize view_size;
if (_widget->getCroppedParent() == nullptr)
view_size = _widget->getLayer()->getSize();
else
view_size = ((Widget*)_widget->getCroppedParent())->getSize();
// check if widget is near any border and not near opposite borders at same time
if ((coord.left <= 0) && !(coord.right() >= view_size.width - 1))
{
k = - (float) coord.left / (coord.width - mRemainPixels - mShadowSize);
}
else if ((coord.top <= 0) && !(coord.bottom() >= view_size.height - 1))
{
k = - (float)coord.top / (coord.height - mRemainPixels - mShadowSize);
}
else if ((coord.right() >= view_size.width - 1) && !(coord.left <= 0))
{
k = (float)(coord.right() - view_size.width + 1 ) / (coord.width - mRemainPixels);
}
else if ((coord.bottom() >= view_size.height - 1) && !(coord.top <= 0))
{
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 = (asin( pow( 2*k - 1, 1/0.7f))/M_PI + 1.f/2) * mTime;
else
mElapsedTime = (asin(-pow(-2*k + 1, 1/0.7f))/M_PI + 1.f/2) * mTime;
}
} // namespace MyGUI