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.
(cherry picked from commit 7f2b2e99f8)
This commit is contained in:
Johannes Schickel 2011-10-28 12:06:01 +02:00 committed by Alyssa Milburn
parent 29dd6df611
commit 58c4b4870e
4 changed files with 26 additions and 41 deletions

View file

@ -245,6 +245,8 @@ void ConsoleDialog::handleTickle() {
} else
draw();
}
_scrollBar->handleTickle();
}
void ConsoleDialog::handleMouseWheel(int x, int y, int direction) {

View file

@ -220,6 +220,7 @@ void ListWidget::scrollBarRecalc() {
void ListWidget::handleTickle() {
if (_editMode)
EditableWidget::handleTickle();
_scrollBar->handleTickle();
}
void ListWidget::handleMouseDown(int x, int y, int button, int clickCount) {

View file

@ -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) {

View file

@ -49,6 +49,12 @@ protected:
Part _draggingPart;
int _sliderDeltaMouseDownPos;
enum {
kRepeatInitialDelay = 500,
kRepeatDelay = 100
};
uint32 _repeatTimer;
public:
int _numEntries;
int _entriesPerPage;