[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