Report the folders container with the List role (was PageTabList) and
each folder as a ListItem, which matches NVDA's native single-selection
list behaviour better than a tab control. TabListLayout opts in to
RpWidget::accessibilitySelectionList(), so the selection interface and
selected-item focus forwarding apply only to this strip, not to every
List-role widget.
- Locked (premium) folders are ordinary list items now: a ListItem is
clickable, so they can open the Premium box, and they are reachable
with the arrow keys like any other folder (they keep their locked
accessible name/description, and report selectable = false).
- Arrow keys move focus only and scroll the focused folder into view;
activation - switching the chat list, or opening the Premium box for a
locked folder - happens on Enter.
- The list has one roving Tab-stop driven by focus (setListTabStop): a
FocusIn on any folder - arrow, mouse or UIA SetFocus - makes it the
single Tab-stop, wired main menu -> folder -> edit, always demoting the
previous one; the active folder seeds it when nothing is focused. A
refresh re-establishes the Tab-stop on the folder that was focused (or
the active one), so rebuilding the list never leaves it without one. So
Tab/Shift+Tab leave the list the same way regardless of which folder is
focused, with no stray extra tab-stops.
A locked (premium) folder can never become the current tab - pressing it
opens the Premium box. Mark it not a page tab once locked, so it reports
as a plain button instead of a selectable PageTab and the tab container's
select() correctly rejects it.
Override TabListLayout::accessibilityOrientation() to return
Qt::Vertical, so screen readers announce the folders strip as a vertical
tab control (UIA Orientation). Relies on desktop-app/lib_ui#304 and
desktop-app/patches#254.
When autoupdates are disabled, there's no permanent updater reference making each UpdateChecker call create an Updater instance with make_shared just to destruct it immediately