Paginaweergave bouwt het volledige document opnieuw op voor iedere pagina #1654

Closed
opened 2026-08-21 12:00:28 +00:00 by brenno · 1 comment
Owner

Probleem

Voor elk berekend vel wordt opnieuw een complete DocumentMarkdownView in de widgetboom geplaatst en vervolgens alleen met clip/translate tot het paginavenster beperkt. Een document van N pagina's wordt daardoor ruwweg N keer volledig opgebouwd en gelayout, inclusief beelden en diagrammen. Kosten groeien ongeveer kwadratisch en dezelfde semantische inhoud kan meerdere keren in de toegankelijkheidsboom belanden.

Reproductie

  1. Open een lang document van tientallen pagina's in paginaweergave.
  2. Profileer build/layout en vergelijk met de doorlopende weergave.
  3. Inspecteer de semantics tree.

Verwacht

Elk inhoudsblok wordt één keer gerenderd of per pagina daadwerkelijk gesegmenteerd, zonder volledige documentkopie per vel.

Technische aanwijzing

lib/widgets/reader/paged_document_view.dart:_pages maakt één DocumentMarkdownView-configuratie en geeft die aan iedere _sheet; elk gebruik krijgt een eigen Element en volledige layout.

Gevonden bij audit van commit d439638c6b.

## Probleem Voor elk berekend vel wordt opnieuw een complete DocumentMarkdownView in de widgetboom geplaatst en vervolgens alleen met clip/translate tot het paginavenster beperkt. Een document van N pagina's wordt daardoor ruwweg N keer volledig opgebouwd en gelayout, inclusief beelden en diagrammen. Kosten groeien ongeveer kwadratisch en dezelfde semantische inhoud kan meerdere keren in de toegankelijkheidsboom belanden. ## Reproductie 1. Open een lang document van tientallen pagina's in paginaweergave. 2. Profileer build/layout en vergelijk met de doorlopende weergave. 3. Inspecteer de semantics tree. ## Verwacht Elk inhoudsblok wordt één keer gerenderd of per pagina daadwerkelijk gesegmenteerd, zonder volledige documentkopie per vel. ## Technische aanwijzing lib/widgets/reader/paged_document_view.dart:_pages maakt één DocumentMarkdownView-configuratie en geeft die aan iedere _sheet; elk gebruik krijgt een eigen Element en volledige layout. Gevonden bij audit van commit d439638c6bd1b519d68d87680cb022b7d5eddc85.
Author
Owner

Triage: accepted — maar niet de voorgestelde oplossing

Bevestigd tegen main (e93ef205c). _pages bouwt één DocumentMarkdownView (lib/widgets/reader/paged_document_view.dart) en geeft dezelfde widget aan elke _sheet. Elk vel monteert hem opnieuw in ClipRectOverflowBoxTransform.translate. Eén widgetconfiguratie, N elementen, N volledige layouts van het hele document — inclusief beelden en diagrammen — plus dezelfde tekst N keer in de semantics-boom.

Wat ik níét wil bouwen

De "Verwacht" van dit issue — per pagina echt segmenteren — wijs ik af. Dat het vel een venster is op één doorlopende stroom is juist de reden dat de paginaweergave hetzelfde breekt als de druk. Een tweede opmaakweg naast de doorlopende weergave laat scherm en papier stil uit elkaar lopen, en dat is precies wat deze stand hoort te voorkomen.

Oplossingsrichting

De kosten zitten niet in het ontwerp maar in het feit dat álle vellen tegelijk gemonteerd staan. Dus:

  1. De verticale rol wordt een ListView.builder over offsets, zodat alleen de vellen rond het kijkvenster gebouwd en opgemaakt worden. De horizontale zoomrol eromheen blijft.
  2. RepaintBoundary per vel.
  3. Eén Semantics-label per vel en ExcludeSemantics op het documentvenster erbinnen, zodat dezelfde tekst niet N keer in de toegankelijkheidsboom staat.

De meetboom blijft ongemoeid: die rendert het document precies één keer, en dat was al goed.

Aandachtspunt: de bestaande boom nest twee SingleChildScrollViews met een Center/ConstrainedBox ertussen; de verticale wordt de builder en de breedteberekening (fit) moet daarbuiten blijven staan.

Regressietest (verplicht)

test/paged_document_view_test.dart: lang document → het aantal gebouwde vellen (find.byKey(const Key('document-sheet'))) blijft begrensd ten opzichte van het aantal pagina's, en de semantics-boom bevat elke tekst één keer. Toets bij het gedocumenteerde maximum, niet bij drie pagina's (zie Toets het gedocumenteerde maximum).

Kosten

Eén bestand, maar de rolstructuur is het lastige deel. Halve dag tot een dag inclusief tests.

Prioriteit

Middel. Merkbaar vanaf enkele tientallen pagina's, en het raakt ook de toegankelijkheid.

## Triage: accepted — maar niet de voorgestelde oplossing **Bevestigd tegen `main` (e93ef205c).** `_pages` bouwt één `DocumentMarkdownView` (`lib/widgets/reader/paged_document_view.dart`) en geeft dezelfde widget aan elke `_sheet`. Elk vel monteert hem opnieuw in `ClipRect` → `OverflowBox` → `Transform.translate`. Eén widgetconfiguratie, N elementen, N volledige layouts van het hele document — inclusief beelden en diagrammen — plus dezelfde tekst N keer in de semantics-boom. ## Wat ik níét wil bouwen De "Verwacht" van dit issue — per pagina echt segmenteren — wijs ik af. Dat het vel een venster is op één doorlopende stroom is juist de reden dat de paginaweergave hetzelfde breekt als de druk. Een tweede opmaakweg naast de doorlopende weergave laat scherm en papier stil uit elkaar lopen, en dat is precies wat deze stand hoort te voorkomen. ## Oplossingsrichting De kosten zitten niet in het ontwerp maar in het feit dat álle vellen tegelijk gemonteerd staan. Dus: 1. De verticale rol wordt een `ListView.builder` over `offsets`, zodat alleen de vellen rond het kijkvenster gebouwd en opgemaakt worden. De horizontale zoomrol eromheen blijft. 2. `RepaintBoundary` per vel. 3. Eén `Semantics`-label per vel en `ExcludeSemantics` op het documentvenster erbinnen, zodat dezelfde tekst niet N keer in de toegankelijkheidsboom staat. De meetboom blijft ongemoeid: die rendert het document precies één keer, en dat was al goed. Aandachtspunt: de bestaande boom nest twee `SingleChildScrollView`s met een `Center`/`ConstrainedBox` ertussen; de verticale wordt de builder en de breedteberekening (`fit`) moet daarbuiten blijven staan. ## Regressietest (verplicht) `test/paged_document_view_test.dart`: lang document → het aantal gebouwde vellen (`find.byKey(const Key('document-sheet'))`) blijft begrensd ten opzichte van het aantal pagina's, en de semantics-boom bevat elke tekst één keer. Toets bij het gedocumenteerde maximum, niet bij drie pagina's (zie `Toets het gedocumenteerde maximum`). ## Kosten Eén bestand, maar de rolstructuur is het lastige deel. Halve dag tot een dag inclusief tests. ## Prioriteit Middel. Merkbaar vanaf enkele tientallen pagina's, en het raakt ook de toegankelijkheid.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1654
No description provided.