feat(kwaliteit,presenteren): splitsen-eerst, streepjes, live-fix (F) en Fix alle problemen (#912-#915) #917

Merged
brenno merged 7 commits from feat/kwaliteitssysteem-verbeteringen into main 2026-07-27 11:58:59 +00:00
Owner

Vier verbeteringen aan het kwaliteitssysteem, in één PR (issues #912, #913, #914, #915).

Wat & waarom

#912 — bij te veel bullets eerst splitsen. Op een dia met te veel bullets is Splits slide nu de eerste en enige aangeboden remedie. Uitleg naar notities verschijnt pas bij acht bullets of minder (kMoveToNotesMaxBulletCount): naar de notities halen verandert het aantal bullets niet, dus lost "te vol" niet op — splitsen wel.

#913 — streepjes in de notities. Regels die naar de sprekersnotities verhuizen (via Uitleg naar notities en Zinnen naar losse bullets) krijgen een - ervoor, zodat ze daar als opsomming lezen. Een tussenkop blijft zonder streepje (het is context, geen punt).

#914 — live-fix tijdens presenteren (F). Tijdens presenteren lost F het probleem op de getoonde dia meteen op zonder te onderbreken: een meerzins-dia wordt opgeknipt (blijft één dia), een te volle dia wordt live gesplitst — de overloop komt als vervolgpagina('s) erachter. Werkt in enkel- én dubbelscherm (de beamer krijgt de verse dia-reeks via een nieuw replaceDeck-kanaal). De knip wordt op de bron doorgeschreven via het dia-id (onSlideSplit → DeckNotifier.splitSlide), als één ongedaan-stap. Een geredigeerde dia blijft ongemoeid — de zwartgelakte blokken mogen niet naar de bron terug. Niets op te lossen of geredigeerd → een vluchtige melding in plaats van een stille no-op.

#915 — knop "Fix alle problemen". Voor wie niet wil nadenken: één knop die alle structureel en veilig oplosbare problemen in de juiste volgorde wegwerkt (te volle dia's splitsen, meerzins-bullets opknippen, meegesleepte pagina's losmaken), steeds met de veiligste keuze en zonder ooit inhoud van een dia te halen. Eén ongedaan-stap. Wat menselijk oordeel vraagt (alt-tekst, themacontrast, privacy) blijft staan en wordt gemeld. De knop verschijnt alleen als er echt iets automatisch op te lossen valt.

Ontwerpkeuzes (met de indiener afgestemd)

  • #914 doet een volwaardige live-splitsing inclusief extra dia's en beamer-synchronisatie (niet uitgesteld tot na afloop).
  • #915 blijft strikt structureel: alleen omkeerbare fixes die álle inhoud zichtbaar houden — nooit inhoud van een dia halen.

Structuur

De split-in-pagina's logica is naar één gedeelde functie getrokken (bullet_fixes.splitBulletSlidePages), zodat de paneelknop, de fix-alles-motor en de live-fix overal hetzelfde doen. De fix-beslissing zit in de pure, testbare service services/quality_autofix.dart (fixAllStructuralQualityIssues als vast punt; safeFixForSlide voor één dia). In de presenter staan de fix-logica en de badge-bouwers top-level, zodat _FullscreenPresenterState onder zijn plafond en het bestand onder de 1000-regelgrens blijft.

Tests, docs, l10n

  • Nieuwe/aangepaste tests: bullet_trim_test, bullet_fixes_test, quality_autofix_test, slide_quality_panel_test, fullscreen_presenter_test, audience_window_test.
  • Docs: CHANGELOG, USER_GUIDE, SOURCE_MAP, SHORTCUTS.
  • l10n: zes nieuwe strings in alle 31 talen.
  • make check groen (11 gates, volledige testsuite, dekkingsvloer).

Closes #912, #913, #914, #915.

🤖 Generated with Claude Code

Vier verbeteringen aan het kwaliteitssysteem, in één PR (issues #912, #913, #914, #915). ## Wat & waarom **#912 — bij te veel bullets eerst splitsen.** Op een dia met te veel bullets is **Splits slide** nu de eerste en enige aangeboden remedie. **Uitleg naar notities** verschijnt pas bij acht bullets of minder (`kMoveToNotesMaxBulletCount`): naar de notities halen verandert het aantal bullets niet, dus lost "te vol" niet op — splitsen wel. **#913 — streepjes in de notities.** Regels die naar de sprekersnotities verhuizen (via *Uitleg naar notities* en *Zinnen naar losse bullets*) krijgen een `- ` ervoor, zodat ze daar als opsomming lezen. Een tussenkop blijft zonder streepje (het is context, geen punt). **#914 — live-fix tijdens presenteren (F).** Tijdens presenteren lost `F` het probleem op de getoonde dia meteen op zonder te onderbreken: een meerzins-dia wordt opgeknipt (blijft één dia), een te volle dia wordt live gesplitst — de overloop komt als vervolgpagina('s) erachter. Werkt in enkel- én dubbelscherm (de beamer krijgt de verse dia-reeks via een nieuw `replaceDeck`-kanaal). De knip wordt op de bron doorgeschreven via het dia-id (`onSlideSplit` → `DeckNotifier.splitSlide`), als één ongedaan-stap. Een geredigeerde dia blijft ongemoeid — de zwartgelakte blokken mogen niet naar de bron terug. Niets op te lossen of geredigeerd → een vluchtige melding in plaats van een stille no-op. **#915 — knop "Fix alle problemen".** Voor wie niet wil nadenken: één knop die alle structureel en veilig oplosbare problemen in de juiste volgorde wegwerkt (te volle dia's splitsen, meerzins-bullets opknippen, meegesleepte pagina's losmaken), steeds met de veiligste keuze en **zonder ooit inhoud van een dia te halen**. Eén ongedaan-stap. Wat menselijk oordeel vraagt (alt-tekst, themacontrast, privacy) blijft staan en wordt gemeld. De knop verschijnt alleen als er echt iets automatisch op te lossen valt. ## Ontwerpkeuzes (met de indiener afgestemd) - **#914** doet een *volwaardige* live-splitsing inclusief extra dia's en beamer-synchronisatie (niet uitgesteld tot na afloop). - **#915** blijft strikt structureel: alleen omkeerbare fixes die álle inhoud zichtbaar houden — nooit inhoud van een dia halen. ## Structuur De split-in-pagina's logica is naar één gedeelde functie getrokken (`bullet_fixes.splitBulletSlidePages`), zodat de paneelknop, de fix-alles-motor en de live-fix overal hetzelfde doen. De fix-beslissing zit in de pure, testbare service `services/quality_autofix.dart` (`fixAllStructuralQualityIssues` als vast punt; `safeFixForSlide` voor één dia). In de presenter staan de fix-logica en de badge-bouwers top-level, zodat `_FullscreenPresenterState` onder zijn plafond en het bestand onder de 1000-regelgrens blijft. ## Tests, docs, l10n - Nieuwe/aangepaste tests: `bullet_trim_test`, `bullet_fixes_test`, `quality_autofix_test`, `slide_quality_panel_test`, `fullscreen_presenter_test`, `audience_window_test`. - Docs: CHANGELOG, USER_GUIDE, SOURCE_MAP, SHORTCUTS. - l10n: zes nieuwe strings in alle 31 talen. - `make check` groen (11 gates, volledige testsuite, dekkingsvloer). Closes #912, #913, #914, #915. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
#912 — 'Uitleg naar notities' verschijnt pas bij ≤8 bullets. Boven die grens
telt de dia als 'te veel bullets' en is splitsen de enige remedie: naar de
notities halen verandert het aantal bullets niet, dus lost 'te vol' niet op.
Gate via visibleContentBulletCount() ≤ kMoveToNotesMaxBulletCount.

#913 — regels die naar de sprekersnotities verhuizen (Uitleg naar notities,
Zinnen naar losse bullets) krijgen een '- ' ervoor. Tussenkoppen niet: die zijn
context, geen punt. Gedeelde helper _movedNoteLine().

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fix-alles-motor (services/quality_autofix.dart) werkt structurele, veilige
kwaliteitsproblemen weg als een vast punt — meerzins-bullets opknippen, te volle
dia's splitsen, meegesleepte pagina's losmaken — en haalt nooit inhoud van een
dia. Wat menselijk oordeel vraagt (alt-tekst, themacontrast, privacy) blijft
staan en wordt gemeld. Eén klik = één ongedaan-stap (DeckNotifier.fixAll…).

Knop verschijnt in het kwaliteitspaneel alleen als er echt iets structureel op
te lossen valt. Terugkoppeling zegt dat wat overblijft om een keuze vraagt.

De split-in-pagina's logica is uit DeckNotifier._splitSlide getrokken naar
bullet_fixes.splitBulletSlidePages(), zodat splitsen overal (knop, motor, en de
live-fix van #914) exact hetzelfde doet.

Nieuwe l10n-strings komen in een aparte l10n-commit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Tijdens presenteren lost F het kwaliteitsprobleem op de huidige dia ter plekke
op, zonder te onderbreken: een meerzins-dia wordt opgeknipt (blijft één dia),
een te volle dia wordt live gesplitst — de overloop komt als vervolgpagina('s)
erachter. Werkt in enkel- én dubbelscherm; de beamer krijgt de verse markdown
via een nieuw replaceDeck-kanaal. Een geredigeerde dia blijft ongemoeid (de
zwarte blokken mogen niet naar de bron terug). De knip wordt op de bron
doorgeschreven via het dia-id (onSlideSplit → DeckNotifier.splitSlide), één
ongedaan-stap. Gedeelde beslissing met de editor via safeFixForSlide().

Was er niets op te lossen of is de dia geredigeerd, dan verschijnt een vluchtige
melding in plaats van een stille no-op.

Klasse-plafond: de fix-logica en de drie badge-bouwers staan nu top-level
(planLiveFix/sendDeckReplaceToAudience/_buildTypedBadge/_buildTargetBadge),
AudienceWindowHandle verhuisde naar een part — zo blijft _FullscreenPresenterState
onder zijn plafond en het bestand onder 1000 regels.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
CHANGELOG development-log-entries; SOURCE_MAP: quality_autofix.dart, bullet_fixes
(splitBulletSlidePages, de ≤8-gate, streepjes), fullscreen_presenter (F-live-fix,
replaceDeck) en de Fix-alles-knop; USER_GUIDE: de één-klik-fixes, de gate, de
knop en de F-toets; SHORTCUTS: F in de presentatietabel.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fix alle problemen / de twee snackbars / de F-sneltoetslegenda / de twee
live-fix-flashmeldingen, vertaald naar alle niet-Nederlandse talen via
make add-l10n. make l10n-check groen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
style: dart format op de gewijzigde bestanden (#912-#915)
All checks were successful
scans / scans (pull_request) Successful in 3m32s
f36ff35d65
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 93ab94914b into main 2026-07-27 11:58:59 +00:00
brenno deleted branch feat/kwaliteitssysteem-verbeteringen 2026-07-27 11:59:00 +00:00
Sign in to join this conversation.
No description provided.