fix(shell): app-brede sneltoets vuurt niet meer door een dialoog heen (#1927) #1933

Merged
brenno merged 3 commits from fix/single-open-dialog-guard into main 2026-09-03 07:56:43 +00:00
Owner

Samenvatting

Twee keer snel Ctrl/Cmd+O opende twee gestapelde "Presentatie openen"-dialogen; de onderste moest apart weggeklikt worden (#1927).

showDialog duwt zijn route synchroon, maar de focusboom verwerkt die wissel pas in de volgende frame — een tweede aanslag binnen dezelfde frame komt dus nog bij de app-brede binding aan. Op macOS telt daar een tweede ingang bij op: de native menubalk draagt dezelfde Cmd-sneltoets.

De navigatiegeschiedenis weet meteen wat er bovenop ligt. Alle app-brede bindingen lopen daarom nu langs _onlyWhenShellIsOnTop: staat er iets boven de shell (een dialoog, de documentatielezer, het presentatiescherm), dan doet de sneltoets niets. Dat geldt voor elke app-brede sneltoets — opslaan, sluiten, zoeken — en niet alleen voor openen, want het is dezelfde frame-race.

Gewijzigde bestanden

  • lib/widgets/app_shell.dart_onlyWhenShellIsOnTop + de bindingen naar _appWideShortcuts() (build() liep anders 2 regels over de methodelengte-ratchet)
  • lib/widgets/shell/shell_actions.dart / shell_actions_export.dart — het doccommentaar boven _openWithSearch beschreef de pakketexport; het bleef achter toen _exportPackage verhuisde, en staat nu weer bij die functie
  • docs/SHORTCUTS.md — de app-brede Ctrl/Cmd+W stond er niet in (sinds 0.5.0 gebonden, alleen bij de presentator vermeld), en er stond niets over sneltoetsen met een dialoog ervoor
  • CHANGELOG.md — Unreleased → Fixed
  • test/bug_1927_double_open_dialog_test.dart — regressietest

Testplan

  • Regressietest eerst rood: drie tests, twee aanslagen zonder frame ertussen, findsOneWidget mislukte met "Found 2 widgets"
  • make check groen (7175 tests, dekkingsvloeren, goldens) — daarna gerebaseerd op verse main en make check-static + de shell-tests opnieuw groen
  • make check-secrets — 0 leaks (gitleaks + trufflehog)
  • make sast — 0 findings (semgrep, lokale regels)
  • Derde test bewaakt dat de poort zich niet vastzet: sluiten en opnieuw openen werkt

Bewaker

Overgeslagen, expliciet: deze wijziging raakt het bestandsformaat niet, de opslag niet, geen afhankelijkheid, geen uitgaand verkeer en geen nieuwe publieke belofte. De documentatiewijziging haalt een bestaande belofte juist in overeenstemming met de code.

🤖 Generated with Claude Code

## Samenvatting Twee keer snel `Ctrl/Cmd+O` opende **twee** gestapelde "Presentatie openen"-dialogen; de onderste moest apart weggeklikt worden (#1927). `showDialog` duwt zijn route synchroon, maar de focusboom verwerkt die wissel pas in de volgende frame — een tweede aanslag binnen dezelfde frame komt dus nog bij de app-brede binding aan. Op macOS telt daar een tweede ingang bij op: de native menubalk draagt dezelfde `Cmd`-sneltoets. De navigatiegeschiedenis weet meteen wat er bovenop ligt. Alle app-brede bindingen lopen daarom nu langs `_onlyWhenShellIsOnTop`: staat er iets boven de shell (een dialoog, de documentatielezer, het presentatiescherm), dan doet de sneltoets niets. Dat geldt voor **elke** app-brede sneltoets — opslaan, sluiten, zoeken — en niet alleen voor openen, want het is dezelfde frame-race. ## Gewijzigde bestanden - `lib/widgets/app_shell.dart` — `_onlyWhenShellIsOnTop` + de bindingen naar `_appWideShortcuts()` (`build()` liep anders 2 regels over de methodelengte-ratchet) - `lib/widgets/shell/shell_actions.dart` / `shell_actions_export.dart` — het doccommentaar boven `_openWithSearch` beschreef de *pakketexport*; het bleef achter toen `_exportPackage` verhuisde, en staat nu weer bij die functie - `docs/SHORTCUTS.md` — de app-brede `Ctrl/Cmd+W` stond er niet in (sinds 0.5.0 gebonden, alleen bij de presentator vermeld), en er stond niets over sneltoetsen met een dialoog ervoor - `CHANGELOG.md` — Unreleased → Fixed - `test/bug_1927_double_open_dialog_test.dart` — regressietest ## Testplan - [x] Regressietest eerst rood: drie tests, twee aanslagen zonder frame ertussen, `findsOneWidget` mislukte met "Found 2 widgets" - [x] `make check` groen (7175 tests, dekkingsvloeren, goldens) — daarna gerebaseerd op verse main en `make check-static` + de shell-tests opnieuw groen - [x] `make check-secrets` — 0 leaks (gitleaks + trufflehog) - [x] `make sast` — 0 findings (semgrep, lokale regels) - [x] Derde test bewaakt dat de poort zich niet vastzet: sluiten en opnieuw openen werkt ## Bewaker Overgeslagen, expliciet: deze wijziging raakt het bestandsformaat niet, de opslag niet, geen afhankelijkheid, geen uitgaand verkeer en geen nieuwe publieke belofte. De documentatiewijziging haalt een bestaande belofte juist in overeenstemming met de code. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Het doccommentaar boven _openWithSearch beschreef de pakketexport — het bleef
achter toen _exportPackage naar shell_actions_export.dart verhuisde, waar de
functie sindsdien zonder eigen beschrijving stond. Verhuisd, en _openWithSearch
beschrijft nu wat het doet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Twee keer Ctrl/Cmd+O achter elkaar stapelde twee openen-dialogen. showDialog
duwt zijn route synchroon, maar de focusboom verwerkt die wissel pas in de
volgende frame — een tweede aanslag binnen dezelfde frame komt dus nog bij de
app-brede binding aan. Op macOS telt daar een tweede ingang bij op: de native
menubalk draagt dezelfde Cmd-sneltoets.

De navigatiegeschiedenis weet meteen wat er bovenop ligt, dus alle bindingen
lopen nu langs _onlyWhenShellIsOnTop: staat er iets boven de shell, dan doet de
sneltoets niets. Dat geldt voor élke app-brede sneltoets (opslaan, sluiten,
zoeken), niet alleen voor openen. De bindingen verhuizen naar
_appWideShortcuts() zodat build() onder de methodelengte-ratchet blijft.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docs: de dubbele openen-dialoog in CHANGELOG en SHORTCUTS (#1927)
All checks were successful
scans / scans (pull_request) Successful in 2m8s
static-gate / static-gate (pull_request) Successful in 5m32s
d93f38864d
SHORTCUTS.md miste bovendien de app-brede Ctrl/Cmd+W (sinds 0.5.0 gebonden,
maar alleen bij de presentator vermeld) en zei niets over sneltoetsen terwijl
er een dialoog voor staat.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brenno force-pushed fix/single-open-dialog-guard from d93f38864d
All checks were successful
scans / scans (pull_request) Successful in 2m8s
static-gate / static-gate (pull_request) Successful in 5m32s
to d07bd3cda4
All checks were successful
scans / scans (pull_request) Successful in 3m41s
static-gate / static-gate (pull_request) Successful in 9m59s
2026-09-03 07:43:32 +00:00
Compare
brenno merged commit af87159351 into main 2026-09-03 07:56:43 +00:00
Sign in to join this conversation.
No description provided.