Make dock pager follow keyboard focus order

Keep keyboard navigation aligned with the compact desktop pager group. Right from the Desktop button now enters the pager, pager buttons expose accessible activation, and focus continues into dock content after the last desktop.
This commit is contained in:
Marco Allegretti 2026-05-29 11:11:59 +02:00
parent 2aae067337
commit b80c878487
2 changed files with 64 additions and 16 deletions

View file

@ -299,6 +299,30 @@ MouseArea {
return ""
}
function focusFirstDockContent() {
let firstPager = leftPagerRepeater.itemAt(0)
if (firstPager) { firstPager.forceActiveFocus(); return }
root.focusAfterPager()
}
function focusAfterPager() {
let first = repeater.itemAt(0)
if (first) { first.keyboardFocus(); return }
let firstTask = taskRepeater.itemAt(0)
if (firstTask) { firstTask.forceActiveFocus(); return }
searchButton.forceActiveFocus()
}
function focusBeforeSearch() {
let lastTask = taskRepeater.itemAt(taskRepeater.count - 1)
if (lastTask) { lastTask.forceActiveFocus(); return }
let lastFav = repeater.itemAt(repeater.count - 1)
if (lastFav) { lastFav.keyboardFocus(); return }
let lastPager = leftPagerRepeater.itemAt(leftPagerRepeater.count - 1)
if (lastPager) { lastPager.forceActiveFocus(); return }
desktopButton.forceActiveFocus()
}
function runningTaskStorageId(taskModel) {
var id = taskModel ? taskModel.AppId || "" : ""
if (id && !id.endsWith(".desktop"))
@ -441,13 +465,7 @@ MouseArea {
Keys.onEnterPressed: desktopButton.toggleDesktop()
Keys.onSpacePressed: desktopButton.toggleDesktop()
Keys.onLeftPressed: homeButton.forceActiveFocus()
Keys.onRightPressed: {
let first = repeater.itemAt(0)
if (first) { first.keyboardFocus(); return }
let firstTask = taskRepeater.itemAt(0)
if (firstTask) { firstTask.forceActiveFocus(); return }
searchButton.forceActiveFocus()
}
Keys.onRightPressed: root.focusFirstDockContent()
KeyboardHighlight {
anchors.fill: parent
@ -615,13 +633,7 @@ MouseArea {
Keys.onReturnPressed: root.folio.HomeScreenState.openSearchWidget()
Keys.onEnterPressed: root.folio.HomeScreenState.openSearchWidget()
Keys.onSpacePressed: root.folio.HomeScreenState.openSearchWidget()
Keys.onLeftPressed: {
let lastTask = taskRepeater.itemAt(taskRepeater.count - 1)
if (lastTask) { lastTask.forceActiveFocus(); return }
let lastFav = repeater.itemAt(repeater.count - 1)
if (lastFav) { lastFav.keyboardFocus(); return }
desktopButton.forceActiveFocus()
}
Keys.onLeftPressed: root.focusBeforeSearch()
Keys.onRightPressed: overviewButton.forceActiveFocus()
KeyboardHighlight {
@ -701,6 +713,36 @@ MouseArea {
y: 0
width: root.pagerButtonWidth
height: root.height
activeFocusOnTab: root.showPager
function activateDesktop() {
if (leftDesktopBtn.desktopId) {
root.folio.activateVirtualDesktop(leftDesktopBtn.desktopId)
}
}
Accessible.role: Accessible.Button
Accessible.name: root.pagerDesktopName(leftDesktopBtn.index)
Accessible.onPressAction: leftDesktopBtn.activateDesktop()
Keys.onReturnPressed: leftDesktopBtn.activateDesktop()
Keys.onEnterPressed: leftDesktopBtn.activateDesktop()
Keys.onSpacePressed: leftDesktopBtn.activateDesktop()
Keys.onLeftPressed: {
let previous = leftPagerRepeater.itemAt(index - 1)
if (previous) { previous.forceActiveFocus(); return }
desktopButton.forceActiveFocus()
}
Keys.onRightPressed: {
let next = leftPagerRepeater.itemAt(index + 1)
if (next) { next.forceActiveFocus(); return }
root.focusAfterPager()
}
KeyboardHighlight {
anchors.fill: parent
visible: leftDesktopBtn.activeFocus
}
MobileShell.MotionStateLayer {
anchors.fill: parent
@ -738,8 +780,8 @@ MouseArea {
root.hideDockToolTip(leftDesktopBtn)
if (mouse.button === Qt.RightButton) {
leftPagerContextMenu.open()
} else if (leftDesktopBtn.desktopId) {
root.folio.activateVirtualDesktop(leftDesktopBtn.desktopId)
} else {
leftDesktopBtn.activateDesktop()
}
}
onPressAndHold: {

View file

@ -92,6 +92,12 @@ require_line "$favourites_bar" "readonly property int pagerLeftCount: showPager
require_line "$favourites_bar" "readonly property int pagerRightCount: 0"
require_line "$favourites_bar" "readonly property real rightControlsWidth: convergenceMode ? navButtonWidth + searchButtonWidth + trashButtonWidth : 0"
require_line "$favourites_bar" "Virtual desktop pager: compact group next to the Desktop button"
require_line "$favourites_bar" "function focusFirstDockContent()"
require_line "$favourites_bar" "Keys.onRightPressed: root.focusFirstDockContent()"
require_line "$favourites_bar" "Keys.onLeftPressed: root.focusBeforeSearch()"
require_line "$favourites_bar" "Accessible.name: root.pagerDesktopName(leftDesktopBtn.index)"
require_line "$favourites_bar" "Keys.onRightPressed: {"
require_line "$favourites_bar" "root.focusAfterPager()"
if grep -Fq "Math.ceil(virtualDesktopInfo.numberOfDesktops / 2)" "$favourites_bar"; then
echo "Desktop pager must not split virtual desktops between dock edges" >&2
exit 1