[Scummvm-git-logs] scummvm master -> 8299ae1266f05df673706397eba7e9bb422c4a3e
sev-
noreply at scummvm.org
Fri Mar 20 12:14:28 UTC 2026
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
e14d381e76 GUI: Made PgUp/PgDown in the grouped list skip the groups
8299ae1266 GUI: Make Home/End button modify the selection
Commit: e14d381e76648184725b0cdbc952b830827f156e
https://github.com/scummvm/scummvm/commit/e14d381e76648184725b0cdbc952b830827f156e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2026-03-20T13:00:10+01:00
Commit Message:
GUI: Made PgUp/PgDown in the grouped list skip the groups
Changed paths:
gui/widgets/list.cpp
gui/widgets/list.h
diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp
index c021b45eba7..69ec4bcb284 100644
--- a/gui/widgets/list.cpp
+++ b/gui/widgets/list.cpp
@@ -446,6 +446,16 @@ static int matchingCharsIgnoringCase(const char *x, const char *y, bool &stop, b
return match;
}
+int ListWidget::findSelectableItem(int item, int direction) const {
+ int newItem = item;
+ while (newItem >= 0 && newItem < (int)_list.size()) {
+ if (isItemSelectable(newItem))
+ return newItem;
+ newItem += direction;
+ }
+ return -1;
+}
+
bool ListWidget::handleKeyDown(Common::KeyState state) {
bool handled = true;
bool dirty = false;
@@ -566,9 +576,9 @@ bool ListWidget::handleKeyDown(Common::KeyState state) {
bool scrolled = false;
if ( g_system->getEventManager()->getModifierState() & Common::KBD_SHIFT) {
// Skip selecting Group Headers
- while (newItem < (int)_list.size() && !isItemSelectable(newItem))
- newItem++;
- if (newItem < (int)_list.size()) {
+ newItem = findSelectableItem(newItem, 1);
+
+ if (newItem != -1) {
if (_lastSelectionStartItem < newItem)
markSelectedItem(newItem, true);
else
@@ -579,9 +589,8 @@ bool ListWidget::handleKeyDown(Common::KeyState state) {
} else {
clearSelection();
// Skip selecting Group Headers
- while (newItem < (int)_list.size() && !isItemSelectable(newItem))
- newItem++;
- if (newItem < (int)_list.size()) {
+ newItem = findSelectableItem(newItem, 1);
+ if (newItem != -1) {
_selectedItem = newItem;
scrolled = true;
}
@@ -604,15 +613,23 @@ bool ListWidget::handleKeyDown(Common::KeyState state) {
}
// fall through
case Common::KEYCODE_PAGEDOWN:
- clearSelection();
- markSelectedItem(_selectedItem, false);
- _selectedItem += _entriesPerPage - 1;
- if (_selectedItem >= (int)_list.size())
- _selectedItem = _list.size() - 1;
+ {
+ int newItem = _selectedItem + _entriesPerPage - 1;
+ if (newItem >= (int)_list.size()) {
+ newItem = _list.size() - 1;
+ scrollTo((int)_list.size() - 1);
+ }
- markSelectedItem(_selectedItem, true);
- scrollToCurrent();
- break;
+ newItem = findSelectableItem(newItem, -1);
+
+ if (newItem != -1) {
+ clearSelection();
+ _selectedItem = newItem;
+ markSelectedItem(_selectedItem, true);
+ scrollToCurrent();
+ }
+ break;
+ }
case Common::KEYCODE_KP7:
if (state.flags & Common::KBD_NUM) {
@@ -641,9 +658,8 @@ bool ListWidget::handleKeyDown(Common::KeyState state) {
bool scrolled = false;
if (g_system->getEventManager()->getModifierState() & Common::KBD_SHIFT) {
// Skip selecting Group Headers
- while (newItem >= 0 && !isItemSelectable(newItem))
- newItem--;
- if (newItem >= 0) {
+ newItem = findSelectableItem(newItem, -1);
+ if (newItem != -1) {
if (_lastSelectionStartItem > newItem)
markSelectedItem(newItem, true);
else
@@ -654,9 +670,8 @@ bool ListWidget::handleKeyDown(Common::KeyState state) {
} else {
clearSelection();
// Skip selecting Group Headers
- while (newItem >= 0 && !isItemSelectable(newItem))
- newItem--;
- if (newItem >= 0) {
+ newItem = findSelectableItem(newItem, -1);
+ if (newItem != -1) {
_selectedItem = newItem;
scrolled = true;
}
@@ -679,15 +694,23 @@ bool ListWidget::handleKeyDown(Common::KeyState state) {
}
// fall through
case Common::KEYCODE_PAGEUP:
- clearSelection();
- markSelectedItem(_selectedItem, false);
- _selectedItem -= _entriesPerPage - 1;
- if (_selectedItem < 0)
- _selectedItem = 0;
- markSelectedItem(_selectedItem, true);
- scrollToCurrent();
- break;
+ {
+ int newItem = _selectedItem - _entriesPerPage + 1;
+ if (newItem < 0) {
+ newItem = 0;
+ scrollTo(0);
+ }
+
+ newItem = findSelectableItem(newItem, 1);
+ if (newItem != -1) {
+ clearSelection();
+ _selectedItem = newItem;
+ markSelectedItem(_selectedItem, true);
+ scrollToCurrent();
+ }
+ break;
+ }
default:
handled = false;
}
diff --git a/gui/widgets/list.h b/gui/widgets/list.h
index 587a78df36d..f99b2574465 100644
--- a/gui/widgets/list.h
+++ b/gui/widgets/list.h
@@ -201,6 +201,10 @@ protected:
/// Check if an item at a given position is selectable
virtual bool isItemSelectable(int item) const { return true; }
+ // Searches for the next selectable item in the given direction (1 for down, -1 for up) starting from 'item' and returns its index.
+ // Returns -1 if no selectable item is found.
+ int findSelectableItem(int item, int direction) const;
+
virtual ThemeEngine::WidgetStateInfo getItemState(int item) const { return _state; }
void drawFormattedText(const Common::Rect &r, const Common::U32String &str, ThemeEngine::WidgetStateInfo state = ThemeEngine::kStateEnabled,
Commit: 8299ae1266f05df673706397eba7e9bb422c4a3e
https://github.com/scummvm/scummvm/commit/8299ae1266f05df673706397eba7e9bb422c4a3e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2026-03-20T13:13:25+01:00
Commit Message:
GUI: Make Home/End button modify the selection
Partially fixes #16600
Changed paths:
gui/widgets/list.cpp
diff --git a/gui/widgets/list.cpp b/gui/widgets/list.cpp
index 69ec4bcb284..ac44e1becb2 100644
--- a/gui/widgets/list.cpp
+++ b/gui/widgets/list.cpp
@@ -556,13 +556,12 @@ bool ListWidget::handleKeyDown(Common::KeyState state) {
// fall through
case Common::KEYCODE_END:
clearSelection();
- markSelectedItem(_selectedItem, false);
- _selectedItem = _list.size() - 1;
+ scrollTo((int)_list.size() - 1);
+ _selectedItem = findSelectableItem((int)_list.size() - 1, -1);
markSelectedItem(_selectedItem, true);
scrollToCurrent();
break;
-
case Common::KEYCODE_KP2:
if (state.flags & Common::KBD_NUM) {
handled = false;
@@ -639,8 +638,8 @@ bool ListWidget::handleKeyDown(Common::KeyState state) {
// fall through
case Common::KEYCODE_HOME:
clearSelection();
- markSelectedItem(_selectedItem, false);
- _selectedItem = 0;
+ scrollTo(0);
+ _selectedItem = findSelectableItem(0, 1);
markSelectedItem(_selectedItem, true);
scrollToCurrent();
break;
More information about the Scummvm-git-logs
mailing list