Add optional smooth scrolling across UI scrollable widgets

Introduce UIScrollController to provide frame-rate-independent wheel
interpolation, touch dragging, and momentum for code editors, terminals,
scroll views, and scrollable widgets while preserving the legacy instant
scrolling path.

Add a UISceneNode-level smooth-scrolling policy. Embedded scenes inherit
the root scene setting, new widgets snapshot it during construction, and
setSmoothScrollEnabled() can optionally apply changes to existing widgets
across the complete embedded-scene hierarchy.

Move native macOS scrolling and title-bar helpers into PlatformHelper,
enable native momentum from UIApplication, and explicitly enable it in
ecode. Preserve precise SDL2 and SDL3 wheel deltas for fractional momentum
events without changing normal integer wheel steps.

Replace the separate editor and terminal preferences in ecode and eterm
with one global smooth-scrolling setting, including legacy configuration
migration, live updates, and localized settings text.

Improve UITouchDraggableWidget momentum handling and add regression tests
for scrolling interpolation, pixel-aligned editor positions, scene
inheritance, widget overrides, and immediate policy application.
This commit is contained in:
Martín Lucas Golini
2026-09-13 20:27:37 -03:00
parent 42de99cf3b
commit 071bc5d697
46 changed files with 1250 additions and 305 deletions
+2
View File
@@ -1146,6 +1146,8 @@ Für sichtbare Änderung ecode neu starten.</string>
<string name="scrollbar_type">Bildlaufleistentyp</string>
<string name="scroll_outside_tooltip">Die Bildlaufleiste hat eigenen Platz und verdeckt nie den Inhalt.</string>
<string name="scroll_overlay_tooltip">Die Bildlaufleiste wird über dem Inhalt angezeigt.</string>
<string name="smooth_scroll">Sanftes Scrollen</string>
<string name="smooth_scroll_desc">Animiert das Scrollen mit Mausrad und Trackpad.</string>
<string name="set_screenshot_save_path">Speicherpfad für Bildschirmfotos</string>
<string name="slight">Leicht</string>
<string name="steady_bar">Statischer Balken</string>
+2
View File
@@ -1131,6 +1131,8 @@ Restart ecode to see the changes.</string>
<string name="scrollbar_type">Scrollbar Type</string>
<string name="scroll_outside_tooltip">The scrollbar has its own space and never covers content.</string>
<string name="scroll_overlay_tooltip">The scrollbar appears over content.</string>
<string name="smooth_scroll">Smooth Scrolling</string>
<string name="smooth_scroll_desc">Animate scrolling from mouse wheels and trackpads.</string>
<string name="set_screenshot_save_path">Screenshot Save Path</string>
<string name="slight">Slight</string>
<string name="steady_bar">Steady Bar</string>
+2
View File
@@ -1130,6 +1130,8 @@ Redémarrer ecode pour voir les changements.</string>
<string name="scrollbar_type">Type de barre de défilement</string>
<string name="scroll_outside_tooltip">La barre de défilement occupe son propre espace et ne recouvre jamais le contenu.</string>
<string name="scroll_overlay_tooltip">La barre de défilement apparaît par-dessus le contenu.</string>
<string name="smooth_scroll">Défilement fluide</string>
<string name="smooth_scroll_desc">Anime le défilement avec la molette de la souris et le pavé tactile.</string>
<string name="set_screenshot_save_path">Chemin d'enregistrement des captures d'écran</string>
<string name="slight">Léger</string>
<string name="steady_bar">Barre fixe</string>
+2
View File
@@ -924,6 +924,8 @@ file in the directory tree.</string>
<string name="scrollbar_type">滚动条类型</string>
<string name="scroll_outside_tooltip">滚动条占用独立空间,不会覆盖内容。</string>
<string name="scroll_overlay_tooltip">滚动条叠加显示在内容上方。</string>
<string name="smooth_scroll">平滑滚动</string>
<string name="smooth_scroll_desc">为鼠标滚轮和触控板触发的滚动添加动画。</string>
<string name="session_snapshot">会话快照与定期备份</string>
<string name="session_snapshot_desc">保留会话之间未保存的文档更改。</string>
<string name="set_screenshot_save_path">截图保存路径</string>