diff options
author | Johannes Schickel | 2011-10-28 12:06:01 +0200 |
---|---|---|
committer | Johannes Schickel | 2011-10-28 12:08:15 +0200 |
commit | 7f2b2e99f8cea8258b0a28ca40ce46abd5d17347 (patch) | |
tree | 430708032c4e58893245f3208d186d9e867f3bd6 /gui/widgets/scrollbar.cpp | |
parent | b0398cd53bee245f9cee61f4b9070b9ed72800d4 (diff) | |
download | scummvm-rg350-7f2b2e99f8cea8258b0a28ca40ce46abd5d17347.tar.gz scummvm-rg350-7f2b2e99f8cea8258b0a28ca40ce46abd5d17347.tar.bz2 scummvm-rg350-7f2b2e99f8cea8258b0a28ca40ce46abd5d17347.zip |
GUI: Change scrollbar repeat handling from a timer proc to handleTickle.
This should be less heavy on timer usage and makes sure no race conditions
will occur.
Diffstat (limited to 'gui/widgets/scrollbar.cpp')
-rw-r--r-- | gui/widgets/scrollbar.cpp | 58 |
1 files changed, 17 insertions, 41 deletions
diff --git a/gui/widgets/scrollbar.cpp b/gui/widgets/scrollbar.cpp index e0dbcec59c..c7c17bc908 100644 --- a/gui/widgets/scrollbar.cpp +++ b/gui/widgets/scrollbar.cpp @@ -45,28 +45,8 @@ ScrollBarWidget::ScrollBarWidget(GuiObject *boss, int x, int y, int w, int h) _numEntries = 0; _entriesPerPage = 0; _currentPos = 0; -} - -static void upArrowRepeater(void *ref) { - ScrollBarWidget *sb = (ScrollBarWidget *)ref; - int old_pos = sb->_currentPos; - - sb->_currentPos -= 3; - sb->checkBounds(old_pos); - - g_system->getTimerManager()->removeTimerProc(&upArrowRepeater); - g_system->getTimerManager()->installTimerProc(&upArrowRepeater, 1000000/10, ref, "guiScrollBarUp"); -} - -static void downArrowRepeater(void *ref) { - ScrollBarWidget *sb = (ScrollBarWidget *)ref; - int old_pos = sb->_currentPos; - sb->_currentPos += 3; - sb->checkBounds(old_pos); - - g_system->getTimerManager()->removeTimerProc(&downArrowRepeater); - g_system->getTimerManager()->installTimerProc(&downArrowRepeater, 1000000/10, ref, "guiScrollBarDown"); + _repeatTimer = 0; } void ScrollBarWidget::handleMouseDown(int x, int y, int button, int clickCount) { @@ -79,13 +59,13 @@ void ScrollBarWidget::handleMouseDown(int x, int y, int button, int clickCount) if (y <= UP_DOWN_BOX_HEIGHT) { // Up arrow _currentPos--; + _repeatTimer = g_system->getMillis() + kRepeatInitialDelay; _draggingPart = kUpArrowPart; - g_system->getTimerManager()->installTimerProc(&upArrowRepeater, 1000000/2, this, "guiScrollBarUp"); } else if (y >= _h - UP_DOWN_BOX_HEIGHT) { // Down arrow _currentPos++; + _repeatTimer = g_system->getMillis() + kRepeatInitialDelay; _draggingPart = kDownArrowPart; - g_system->getTimerManager()->installTimerProc(&downArrowRepeater, 1000000/2, this, "guiScrollBarDown"); } else if (y < _sliderPos) { _currentPos -= _entriesPerPage - 1; } else if (y >= _sliderPos + _sliderHeight) { @@ -101,9 +81,7 @@ void ScrollBarWidget::handleMouseDown(int x, int y, int button, int clickCount) void ScrollBarWidget::handleMouseUp(int x, int y, int button, int clickCount) { _draggingPart = kNoPart; - - g_system->getTimerManager()->removeTimerProc(&upArrowRepeater); - g_system->getTimerManager()->removeTimerProc(&downArrowRepeater); + _repeatTimer = 0; } void ScrollBarWidget::handleMouseWheel(int x, int y, int direction) { @@ -160,23 +138,21 @@ void ScrollBarWidget::handleMouseMoved(int x, int y, int button) { } void ScrollBarWidget::handleTickle() { -/* - // FIXME/TODO - this code is supposed to allow for "click-repeat" (like key repeat), - // i.e. if you click on one of the arrows and keep clicked, it will scroll - // continuously. However, just like key repeat, this requires two delays: - // First an "initial" delay that has to pass before repeating starts (otherwise - // it is near to impossible to achieve single clicks). Secondly, a repeat delay - // that determines how often per second a click is simulated. - int old_pos = _currentPos; + if (_repeatTimer) { + const uint32 curTime = g_system->getMillis(); + if (curTime >= _repeatTimer) { + const int old_pos = _currentPos; - if (_draggingPart == kUpArrowPart) - _currentPos--; - else if (_draggingPart == kDownArrowPart) - _currentPos++; + if (_part == kUpArrowPart) + _currentPos -= 3; + else if (_part == kDownArrowPart) + _currentPos += 3; - // Make sure that _currentPos is still inside the bounds - checkBounds(old_pos); -*/ + checkBounds(old_pos); + + _repeatTimer = curTime + kRepeatDelay; + } + } } void ScrollBarWidget::checkBounds(int old_pos) { |