Houd de zichtbare documentpositie vast bij wisselen tussen Visueel en Bron #2322

Closed
opened 2026-10-06 12:16:18 +00:00 by brenno · 0 comments
Owner

Probleem

In een lang document kan wisselen tussen Visueel en Bron de doelweergave bovenaan openen, in plaats van op de plek waar de gebruiker bezig was. Dit moet in beide richtingen werken.

Dit is een gerichte follow-up op #1566. De toen toegevoegde MarkdownCaretMap vertaalt de cursorpositie nog steeds, maar de bestaande regressietest bewijst alleen de selectie-offset. Zij bewijst niet dat de bijbehorende alinea of bronregel ook werkelijk in beeld komt. Scrollen zonder de cursor te verplaatsen wordt evenmin bewaard.

Waarom dit ertoe doet

De gebruiker opent Bron juist om de Markdown van de huidige alinea te bekijken of te bewerken. Bovenaan landen dwingt in een lang document tot opnieuw zoeken en maakt de bronstand onpraktisch.

Huidige code

  • _changeViewMode vertaalt de caret en vraagt na de opbouw focus.
  • De Bron- en Visueel-weergaven krijgen bij opbouw een nieuwe scrollcontroller die bovenaan begint.
  • Er is geen expliciete stap die het vertaalde anker in beeld brengt.
  • Automatische Bron-fallback en zoeken vanuit Pagina's wijzigen de modus via verwante paden en horen dezelfde zichtbaarheidsgarantie te krijgen.
  • test/document_caret_across_modes_test.dart dekt beide richtingen, maar controleert alleen de logische cursorpositie.

De huidige caret- en conflictgerichte tests zijn groen; de ontbrekende bewijswaarde is de viewport.

Minimale oplossingsrichting

Hergebruik MarkdownCaretMap en bewaar één logisch Markdown-anker, geen pixelafstand:

  • als de gebruiker de cursor heeft verplaatst, is de caret het anker;
  • bij alleen scrollen is de eerste zichtbare alinea of het eerste zichtbare blok het anker;
  • bouw de doelweergave op en breng het vertaalde anker daarna expliciet in beeld.

Dit vereist geen nieuwe dependency, opslagvorm of bestandsformaatwijziging.

Acceptatiecriteria

  • Visueel → Bron toont in een lang document de bijbehorende bronregel.
  • Bron → Visueel toont de bijbehorende alinea.
  • Alleen scrollen, zonder de caret te verplaatsen, behoudt het dichtstbijzijnde zichtbare blok.
  • Soft-wrap, tabellen en afbeeldingen laten de weergave niet naar boven springen.
  • Automatische Bron-fallback brengt de probleemregel in beeld.
  • Wisselen wijzigt de inhoud niet en maakt geen stap in Ongedaan maken.
  • Een widget-regressietest controleert naast de selectie ook dat de caret of het doelblok binnen de zichtbare editor-viewport ligt.

Buiten scope

Geen gekoppelde live-scroll tussen panelen, positieherstel na sluiten/heropenen, Pagina's-weergave, presentatie-editor of generiek navigatieraamwerk.

## Probleem In een lang document kan wisselen tussen **Visueel** en **Bron** de doelweergave bovenaan openen, in plaats van op de plek waar de gebruiker bezig was. Dit moet in beide richtingen werken. Dit is een gerichte follow-up op #1566. De toen toegevoegde `MarkdownCaretMap` vertaalt de cursorpositie nog steeds, maar de bestaande regressietest bewijst alleen de selectie-offset. Zij bewijst niet dat de bijbehorende alinea of bronregel ook werkelijk in beeld komt. Scrollen zonder de cursor te verplaatsen wordt evenmin bewaard. ## Waarom dit ertoe doet De gebruiker opent Bron juist om de Markdown van de huidige alinea te bekijken of te bewerken. Bovenaan landen dwingt in een lang document tot opnieuw zoeken en maakt de bronstand onpraktisch. ## Huidige code - `_changeViewMode` vertaalt de caret en vraagt na de opbouw focus. - De Bron- en Visueel-weergaven krijgen bij opbouw een nieuwe scrollcontroller die bovenaan begint. - Er is geen expliciete stap die het vertaalde anker in beeld brengt. - Automatische Bron-fallback en zoeken vanuit Pagina's wijzigen de modus via verwante paden en horen dezelfde zichtbaarheidsgarantie te krijgen. - `test/document_caret_across_modes_test.dart` dekt beide richtingen, maar controleert alleen de logische cursorpositie. De huidige caret- en conflictgerichte tests zijn groen; de ontbrekende bewijswaarde is de viewport. ## Minimale oplossingsrichting Hergebruik `MarkdownCaretMap` en bewaar één logisch Markdown-anker, geen pixelafstand: - als de gebruiker de cursor heeft verplaatst, is de caret het anker; - bij alleen scrollen is de eerste zichtbare alinea of het eerste zichtbare blok het anker; - bouw de doelweergave op en breng het vertaalde anker daarna expliciet in beeld. Dit vereist geen nieuwe dependency, opslagvorm of bestandsformaatwijziging. ## Acceptatiecriteria - [ ] Visueel → Bron toont in een lang document de bijbehorende bronregel. - [ ] Bron → Visueel toont de bijbehorende alinea. - [ ] Alleen scrollen, zonder de caret te verplaatsen, behoudt het dichtstbijzijnde zichtbare blok. - [ ] Soft-wrap, tabellen en afbeeldingen laten de weergave niet naar boven springen. - [ ] Automatische Bron-fallback brengt de probleemregel in beeld. - [ ] Wisselen wijzigt de inhoud niet en maakt geen stap in Ongedaan maken. - [ ] Een widget-regressietest controleert naast de selectie ook dat de caret of het doelblok binnen de zichtbare editor-viewport ligt. ## Buiten scope Geen gekoppelde live-scroll tussen panelen, positieherstel na sluiten/heropenen, Pagina's-weergave, presentatie-editor of generiek navigatieraamwerk.
brenno 2026-10-07 14:34:42 +00:00
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#2322
No description provided.