From 1cafd3e0cc05e387069a4f3acb20db19a6d8c203 Mon Sep 17 00:00:00 2001 From: sivan22 Date: Tue, 30 Jul 2024 01:21:03 +0300 Subject: [PATCH] fixed progressive scroll from linear to curved --- lib/screens/combined_book_screen.dart | 8 +-- lib/screens/main_window_screen.dart | 2 +- lib/screens/simple_book_view.dart | 67 ++++++++++++-------------- lib/widgets/progressive_scrolling.dart | 30 ++++++++---- pubspec.yaml | 4 +- 5 files changed, 60 insertions(+), 51 deletions(-) diff --git a/lib/screens/combined_book_screen.dart b/lib/screens/combined_book_screen.dart index 50a156a3..297b1a5e 100644 --- a/lib/screens/combined_book_screen.dart +++ b/lib/screens/combined_book_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_html/flutter_html.dart'; import 'package:otzaria/widgets/progressive_scrolling.dart'; +import 'package:otzaria/widgets/progressive_scrolling.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:flutter_settings_screens/flutter_settings_screens.dart'; import 'package:otzaria/widgets/commentary_list.dart'; @@ -32,9 +33,10 @@ class _CombinedViewState extends State { FocusNode focusNode = FocusNode(); Widget buildKeyboardListener() { - return ProgressiveScrollWrapper( - maxSpeed: 5000.0, - acceleration: 10.0, + return ProgressiveScroll( + maxSpeed: 10000.0, + curve: 10.0, + accelerationFactor: 5, scrollController: widget.tab.scrollOffsetController, child: buildOuterList()); } diff --git a/lib/screens/main_window_screen.dart b/lib/screens/main_window_screen.dart index 2a2b1ad5..e6514900 100644 --- a/lib/screens/main_window_screen.dart +++ b/lib/screens/main_window_screen.dart @@ -111,7 +111,7 @@ class MainWindowScreenState extends State )); return jsonDecode(data.body)["body"]; }, - currentVersion: '0.1.8-dev.0', + currentVersion: '0.1.8-dev.2', updateChipBuilder: flatChip, callback: (status) {}, diff --git a/lib/screens/simple_book_view.dart b/lib/screens/simple_book_view.dart index 3d5bf22f..1159fb62 100644 --- a/lib/screens/simple_book_view.dart +++ b/lib/screens/simple_book_view.dart @@ -32,41 +32,36 @@ class _SimpleBookViewState extends State { @override Widget build(BuildContext context) { - return ProgressiveScrollWrapper( - scrollController: widget.tab.scrollOffsetController, - maxSpeed: 50.0, - acceleration: 0.5, - child: SelectionArea( - key: PageStorageKey(widget.tab), - child: ScrollablePositionedList.builder( - initialScrollIndex: widget.tab.index, - itemPositionsListener: widget.tab.positionsListener, - itemScrollController: widget.tab.scrollController, - scrollOffsetController: widget.tab.scrollOffsetController, - itemCount: widget.data.length, - itemBuilder: (context, index) { - return ValueListenableBuilder( - valueListenable: widget.tab.removeNikud, - builder: (context, removeNikud, child) => InkWell( - onTap: () => widget.tab.selectedIndex.value = index, - child: Html( - //remove nikud if needed - data: removeNikud - ? highLight(removeVolwels(widget.data[index]), - widget.tab.searchTextController.text) - : highLight(widget.data[index], - widget.tab.searchTextController.text), - style: { - 'body': Style( - fontSize: FontSize(widget.textSize), - fontFamily: - Settings.getValue('key-font-family') ?? - 'candara', - textAlign: TextAlign.justify), - }), - ), - ); - }), - )); + return SelectionArea( + key: PageStorageKey(widget.tab), + child: ScrollablePositionedList.builder( + initialScrollIndex: widget.tab.index, + itemPositionsListener: widget.tab.positionsListener, + itemScrollController: widget.tab.scrollController, + scrollOffsetController: widget.tab.scrollOffsetController, + itemCount: widget.data.length, + itemBuilder: (context, index) { + return ValueListenableBuilder( + valueListenable: widget.tab.removeNikud, + builder: (context, removeNikud, child) => InkWell( + onTap: () => widget.tab.selectedIndex.value = index, + child: Html( + //remove nikud if needed + data: removeNikud + ? highLight(removeVolwels(widget.data[index]), + widget.tab.searchTextController.text) + : highLight(widget.data[index], + widget.tab.searchTextController.text), + style: { + 'body': Style( + fontSize: FontSize(widget.textSize), + fontFamily: + Settings.getValue('key-font-family') ?? 'candara', + textAlign: TextAlign.justify), + }), + ), + ); + }), + ); } } diff --git a/lib/widgets/progressive_scrolling.dart b/lib/widgets/progressive_scrolling.dart index e35f11f9..d367741e 100644 --- a/lib/widgets/progressive_scrolling.dart +++ b/lib/widgets/progressive_scrolling.dart @@ -1,30 +1,34 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'dart:math'; + import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; -class ProgressiveScrollWrapper extends StatefulWidget { +class ProgressiveScroll extends StatefulWidget { final Widget child; final ScrollOffsetController scrollController; final double maxSpeed; - final double acceleration; + final double accelerationFactor; + final double curve; - ProgressiveScrollWrapper({ + ProgressiveScroll({ Key? key, required this.child, required this.scrollController, - this.maxSpeed = 50.0, - this.acceleration = 0.5, + this.maxSpeed = 5000.0, + this.accelerationFactor = 0.1, + this.curve = 2.0, }) : super(key: key); @override - _ProgressiveScrollWrapperState createState() => - _ProgressiveScrollWrapperState(); + _ProgressiveScrollState createState() => _ProgressiveScrollState(); } -class _ProgressiveScrollWrapperState extends State { +class _ProgressiveScrollState extends State { double _scrollSpeed = 0; bool _isKeyPressed = false; int _scrollDirection = 0; // 1 for down, -1 for up, 0 for no scroll + double _timePressedInSeconds = 0; @override void initState() { @@ -35,11 +39,15 @@ class _ProgressiveScrollWrapperState extends State { void _startScrolling() { Future.delayed(Duration(milliseconds: 16), () { if (_isKeyPressed) { - _scrollSpeed = (_scrollSpeed + widget.acceleration * _scrollDirection) + _timePressedInSeconds += 0.016; // 16 milliseconds in seconds + double t = _timePressedInSeconds; + double curvedT = exp(widget.curve * t); + _scrollSpeed = (curvedT * widget.accelerationFactor * _scrollDirection) .clamp(-widget.maxSpeed, widget.maxSpeed); print('scroll speed: $_scrollSpeed'); } else { _scrollSpeed = 0; + _timePressedInSeconds = 0; } if (_scrollSpeed != 0) { @@ -68,6 +76,10 @@ class _ProgressiveScrollWrapperState extends State { if (event.logicalKey == LogicalKeyboardKey.arrowDown || event.logicalKey == LogicalKeyboardKey.arrowUp) { _isKeyPressed = false; + widget.scrollController.animateScroll( + offset: 100.0 * _scrollDirection, + duration: const Duration(milliseconds: 300), + ); _scrollDirection = 0; } } diff --git a/pubspec.yaml b/pubspec.yaml index 474f55d9..b1f599ee 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,7 +8,7 @@ msix_config: display_name: אוצריא publisher_display_name: sivan22 identity_name: sivan22.Otzaria - msix_version: 0.1.8.0 + msix_version: 0.1.8.2 logo_path: assets/icon/icon.png publisher: CN=sivan22, O=sivan22, C=IL certificate_path: C:\dev\sivan22.pfx @@ -33,7 +33,7 @@ msix_config: # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 0.1.8-dev.1 +version: 0.1.8-dev.2 environment: sdk: ">=3.2.6 <4.0.0"