aboutsummaryrefslogtreecommitdiff
path: root/gui/widgets
diff options
context:
space:
mode:
authorJohannes Schickel2013-04-16 23:11:37 +0200
committerJohannes Schickel2013-04-16 23:25:04 +0200
commita41457e224a1cc5fcde70fa9e75d1c82abd20fc9 (patch)
treed61c17e25bba6263736b7f31c5bd7eb6b3db3cd1 /gui/widgets
parentf280789afe397e384a81411a65e1e12a308c1125 (diff)
downloadscummvm-rg350-a41457e224a1cc5fcde70fa9e75d1c82abd20fc9.tar.gz
scummvm-rg350-a41457e224a1cc5fcde70fa9e75d1c82abd20fc9.tar.bz2
scummvm-rg350-a41457e224a1cc5fcde70fa9e75d1c82abd20fc9.zip
GUI: Always try to show as many entries as possible in ListWidget.
In case there were less items in the list than on a page, it was possible that a "scrollTo" call scrolled items out of the view even though all could be displayed. This caused odd behavior in the load dialog in T7G. There the list contains 10 entries. In case the last one was loaded via the dialog, the next time it was brought up again it showed the 9th entry at the top of the view and effectively hiding all the others. It furthermore did not show the scroll bar because all entries would have fit onto one page. To prevent this odd behavior, a boundary check has been added to all places where the scroll position is set. This has been taken from "scrollToCurrent" which already tried to prevent this. This fixes the second issue described in bug #3610960 "T7G - savegame glitches".
Diffstat (limited to 'gui/widgets')
-rw-r--r--gui/widgets/list.cpp15
-rw-r--r--gui/widgets/list.h1
2 files changed, 11 insertions, 5 deletions
diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp
index 95d39c4f24..473d5f04df 100644
--- a/gui/widgets/list.cpp
+++ b/gui/widgets/list.cpp
@@ -206,6 +206,7 @@ void ListWidget::scrollTo(int item) {
if (_currentPos != item) {
_currentPos = item;
+ checkBounds();
scrollBarRecalc();
}
}
@@ -467,6 +468,7 @@ void ListWidget::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
case kSetPositionCmd:
if (_currentPos != (int)data) {
_currentPos = data;
+ checkBounds();
draw();
// Scrollbar actions cause list focus (which triggers a redraw)
@@ -550,6 +552,13 @@ Common::Rect ListWidget::getEditRect() const {
return r;
}
+void ListWidget::checkBounds() {
+ if (_currentPos < 0 || _entriesPerPage > (int)_list.size())
+ _currentPos = 0;
+ else if (_currentPos + _entriesPerPage > (int)_list.size())
+ _currentPos = _list.size() - _entriesPerPage;
+}
+
void ListWidget::scrollToCurrent() {
// Only do something if the current item is not in our view port
if (_selectedItem < _currentPos) {
@@ -560,11 +569,7 @@ void ListWidget::scrollToCurrent() {
_currentPos = _selectedItem - _entriesPerPage + 1;
}
- if (_currentPos < 0 || _entriesPerPage > (int)_list.size())
- _currentPos = 0;
- else if (_currentPos + _entriesPerPage > (int)_list.size())
- _currentPos = _list.size() - _entriesPerPage;
-
+ checkBounds();
_scrollBar->_currentPos = _currentPos;
_scrollBar->recalc();
}
diff --git a/gui/widgets/list.h b/gui/widgets/list.h
index 47613b79f3..d18a82dd3f 100644
--- a/gui/widgets/list.h
+++ b/gui/widgets/list.h
@@ -145,6 +145,7 @@ protected:
void receivedFocusWidget();
void lostFocusWidget();
+ void checkBounds();
void scrollToCurrent();
int *_textWidth;