diff --git a/code/nel/include/nel/gui/ctrl_scroll.h b/code/nel/include/nel/gui/ctrl_scroll.h index b01a3bf81..cf01ada78 100644 --- a/code/nel/include/nel/gui/ctrl_scroll.h +++ b/code/nel/include/nel/gui/ctrl_scroll.h @@ -147,7 +147,7 @@ namespace NLGUI sint32 _Aligned; // 0-Top 1-Bottom 2-Left 3-Right sint32 _TrackDispPos; - sint32 _TrackPos; + float _TrackPos; sint32 _TrackSize; sint32 _TrackSizeMin; diff --git a/code/nel/include/nel/gui/group_scrolltext.h b/code/nel/include/nel/gui/group_scrolltext.h index 7c5c58f22..66fc89044 100644 --- a/code/nel/include/nel/gui/group_scrolltext.h +++ b/code/nel/include/nel/gui/group_scrolltext.h @@ -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(); diff --git a/code/nel/src/gui/ctrl_scroll.cpp b/code/nel/src/gui/ctrl_scroll.cpp index da42cd40b..d0d7483b3 100644 --- a/code/nel/src/gui/ctrl_scroll.cpp +++ b/code/nel/src/gui/ctrl_scroll.cpp @@ -653,8 +653,7 @@ namespace NLGUI factor = -(float)_Target->getOfsY() / factor; if (factor < 0.0f) factor = 0.0f; if (factor > 1.0f) factor = 1.0f; - factor = factor * (getHReal()-_TrackSize); - _TrackPos = (sint32)factor; + _TrackPos = factor * (getHReal()-_TrackSize); } else // TOP { @@ -663,8 +662,7 @@ namespace NLGUI if (factor < 0.0f) factor = 0.0f; if (factor > 1.0f) factor = 1.0f; sint32 hreal = getHReal(); - factor = (1.0f-factor) * (hreal - _TrackSize); - _TrackPos = (sint32)factor; + _TrackPos = (1.0f-factor) * (hreal - _TrackSize); } } @@ -712,8 +710,7 @@ namespace NLGUI factor = -(float)_Target->getOfsX() / factor; if (factor < 0.0f) factor = 0.0f; if (factor > 1.0f) factor = 1.0f; - factor = factor * (getWReal()-_TrackSize); - _TrackPos = (sint32)factor; + _TrackPos = factor * (getWReal()-_TrackSize); } else // RIGHT { @@ -722,8 +719,7 @@ namespace NLGUI if (factor < 0.0f) factor = 0.0f; if (factor > 1.0f) factor = 1.0f; sint32 hreal = getWReal(); - factor = (1.0f-factor) * (hreal - _TrackSize); - _TrackPos = (sint32)factor; + _TrackPos = (1.0f-factor) * (hreal - _TrackSize); } } @@ -930,8 +926,8 @@ namespace NLGUI if ((getWReal()-_TrackSize) <= 0) return 0; - sint32 newtpos; - sint32 tpos = _TrackPos; + float newtpos; + float tpos = _TrackPos; sint32 tsize = _TrackSize; // Limit the scroller to the defined area @@ -998,8 +994,8 @@ namespace NLGUI if ((getHReal()-_TrackSize) <= 0) return 0; - sint32 newtpos; - sint32 tpos = _TrackPos; + float newtpos; + float tpos = _TrackPos; sint32 tsize = _TrackSize; // Limit the scroller to the defined area @@ -1202,16 +1198,14 @@ namespace NLGUI float factor = (float)(wReal-maxWReal); factor = -(float)ofsX / factor; clamp(factor, 0.f, 1.f); - factor = factor * (getWReal()-_TrackSize); - _TrackPos = (sint32)factor; + _TrackPos = factor * (getWReal()-_TrackSize); } else // RIGHT { float factor = (float)(wReal-maxWReal); factor = (float)ofsX / factor; clamp(factor, 0.f, 1.f); - factor = (1.0f-factor) * (getWReal() - _TrackSize); - _TrackPos = (sint32)factor; + _TrackPos = (1.0f-factor) * (getWReal() - _TrackSize); } // invalidate only position. 1 pass is sufficient @@ -1240,8 +1234,7 @@ namespace NLGUI float factor = (float)(hReal-maxHReal); factor = -(float)ofsY / factor; clamp(factor, 0.f, 1.f); - factor = factor * (getHReal()-_TrackSize); - _TrackPos = (sint32)factor; + _TrackPos = factor * (getHReal()-_TrackSize); } else // TOP { @@ -1250,8 +1243,7 @@ namespace NLGUI float factor = (float)(hReal-maxHReal); factor = (float)ofsY / factor; clamp(factor, 0.f, 1.f); - factor = (1.0f-factor) * (getHReal() - _TrackSize); - _TrackPos = (sint32)factor; + _TrackPos = (1.0f-factor) * (getHReal() - _TrackSize); } // invalidate only position. 1 pass is sufficient diff --git a/code/nel/src/gui/group_scrolltext.cpp b/code/nel/src/gui/group_scrolltext.cpp index 2fa6c828e..c82bd40bf 100644 --- a/code/nel/src/gui/group_scrolltext.cpp +++ b/code/nel/src/gui/group_scrolltext.cpp @@ -40,8 +40,11 @@ namespace NLGUI _Settuped(false), _InvertScrollBar(true), _ListHeight(0), + _Scrolling(false), + _ScrollDistance(0), + _ClockMsgEventRegistered(false), _StartHeight(0), - _EllapsedTime(0) + _EllapsedTime(0) { _IsGroupScrollText = true; } @@ -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() {