Goal
A fuller OO redesign of the preview scroll / location subsystem, building on the PreviewScrollController landed in PR #22.
PR #22 centralised scroll-to-match and added a locate() / scroll_to_location() read-counterpart with a ViewportLocation value object. The logic is still split between preview_scroll.py (controller + strategies) and app.py (mount / dispatch / swap / finalize). A SOTA pass would unify these further.
Direction (to refine in a brainstorm)
- Polymorphic location/target value objects (e.g.
MatchLocation, ViewportLocation, LineLocation), each resolving itself to a scroll target.
- One
scroll_to(location) that the match-scroll also routes through, so there is a single scroll primitive instead of bespoke paths.
- Strategy per preview kind; a Facade controller; Memento for capture/restore.
- Reduce duplication and the app.py/preview_scroll.py split; eliminate remaining code smells.
Process
Run as its own brainstorm → spec → plan effort (not folded into a feature PR). Deferred from PR #22 by design.
Goal
A fuller OO redesign of the preview scroll / location subsystem, building on the
PreviewScrollControllerlanded in PR #22.PR #22 centralised scroll-to-match and added a
locate()/scroll_to_location()read-counterpart with aViewportLocationvalue object. The logic is still split betweenpreview_scroll.py(controller + strategies) andapp.py(mount / dispatch / swap / finalize). A SOTA pass would unify these further.Direction (to refine in a brainstorm)
MatchLocation,ViewportLocation,LineLocation), each resolving itself to a scroll target.scroll_to(location)that the match-scroll also routes through, so there is a single scroll primitive instead of bespoke paths.Process
Run as its own brainstorm → spec → plan effort (not folded into a feature PR). Deferred from PR #22 by design.