From b2d8f4d73b66c2ddb5f59d8051cc29642dbc1c31 Mon Sep 17 00:00:00 2001 From: bbedward Date: Mon, 23 Feb 2026 19:32:13 -0500 Subject: [PATCH] keybinds: preserve scroll position of expanded item on list change fixes #1766 --- quickshell/Modules/Settings/KeybindsTab.qml | 25 +++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/quickshell/Modules/Settings/KeybindsTab.qml b/quickshell/Modules/Settings/KeybindsTab.qml index c030b084..f04c59b1 100644 --- a/quickshell/Modules/Settings/KeybindsTab.qml +++ b/quickshell/Modules/Settings/KeybindsTab.qml @@ -107,6 +107,22 @@ Item { flickable.contentY = 0; } + function _scrollToExpandedItem() { + for (let i = 0; i < bindsRepeater.count; i++) { + const item = bindsRepeater.itemAt(i); + if (item && item.modelData.action === expandedKey) { + const itemY = item.mapToItem(flickable.contentItem, 0, 0).y; + const itemH = item.height; + const viewH = flickable.height; + if (itemY >= flickable.contentY && itemY + itemH <= flickable.contentY + viewH) + return; + flickable.contentY = Math.max(0, Math.min(itemY - viewH / 4, flickable.contentHeight - viewH)); + return; + } + } + flickable.contentY = _savedScrollY; + } + Timer { id: searchDebounce interval: 150 @@ -122,8 +138,12 @@ Item { keybindsTab._updateCategories(); keybindsTab._updateFiltered(); keybindsTab._preserveScroll = false; - if (wasPreserving) - Qt.callLater(() => flickable.contentY = savedY); + if (wasPreserving) { + if (keybindsTab.expandedKey) + Qt.callLater(keybindsTab._scrollToExpandedItem); + else + Qt.callLater(() => flickable.contentY = savedY); + } } function onBindSaved(key) { keybindsTab._savedScrollY = flickable.contentY; @@ -569,6 +589,7 @@ Item { spacing: Theme.spacingXS Repeater { + id: bindsRepeater model: ScriptModel { values: keybindsTab._filteredBinds objectProp: "action"