Added: Smooth scrolling

This commit is contained in:
Nimetu 2015-12-06 16:38:29 +02:00
parent 2b11880d9f
commit 4827dcd60e
2 changed files with 56 additions and 3 deletions

View file

@ -66,6 +66,8 @@ namespace NLGUI
// from CCtrlBase
virtual void elementCaptured(CCtrlBase *capturedElement);
// setup vertical scrolling event
void smoothScrollY (sint32 dy);
REFLECT_EXPORT_START(CGroupScrollText, CInterfaceGroup)
REFLECT_EXPORT_END
@ -78,6 +80,9 @@ namespace NLGUI
bool _Settuped;
bool _InvertScrollBar;
sint32 _ListHeight;
bool _Scrolling;
float _ScrollDistance;
bool _ClockMsgEventRegistered;
protected:
void setup();
void updateScrollBar();

View file

@ -40,6 +40,9 @@ namespace NLGUI
_Settuped(false),
_InvertScrollBar(true),
_ListHeight(0),
_Scrolling(false),
_ScrollDistance(0),
_ClockMsgEventRegistered(false),
_StartHeight(0),
_EllapsedTime(0)
{
@ -166,18 +169,63 @@ namespace NLGUI
{
if (isIn(eventDesc.getX(), eventDesc.getY()))
{
sint32 h = _List->getMaxHReal() / 2;
// limit scroll to 100px with single wheel event
sint32 h = std::min(100, _List->getMaxHReal() / 2);
if (h == 0) h = 1;
_ScrollBar->moveTargetY(- eventDesc.getWheel() * h);
smoothScrollY(- eventDesc.getWheel() * h);
return true;
}
}
}
}
if (event.getType() == NLGUI::CEventDescriptor::system)
{
if (_Scrolling && _ScrollBar)
{
float dy = _ScrollDistance / 4;
if ((sint32) dy != 0)
{
_ScrollBar->moveTargetY(dy);
_ScrollDistance -= dy;
}
else
{
_Scrolling = false;
if (_ClockMsgEventRegistered)
{
_ClockMsgEventRegistered = false;
CWidgetManager::getInstance()->unregisterClockMsgTarget(this);
}
}
}
}
if (CInterfaceGroup::handleEvent(event)) return true;
return false;
}
//========================================================================
void CGroupScrollText::smoothScrollY(sint32 dy)
{
if (!_Scrolling)
{
_Scrolling = true;
_ScrollDistance = 0;
// register for clock tick event if not already done
CWidgetManager *pWM = CWidgetManager::getInstance();
if (!pWM->isClockMsgTarget(this))
{
pWM->registerClockMsgTarget(this);
_ClockMsgEventRegistered = true;
}
}
_ScrollDistance += dy;
}
//========================================================================
void CGroupScrollText::setup()
{