@@ -12,6 +12,7 @@ import '../../../app/app.locator.dart';
1212import '../../../app/app.router.dart' ;
1313import '../../../common/enums.dart' ;
1414import '../../../common/themes.dart' ;
15+ import '../../../common/toast.dart' ;
1516import '../../../services/bibles_service.dart' ;
1617import '../../../services/reader_service.dart' ;
1718import '../../../services/settings_service.dart' ;
@@ -48,14 +49,13 @@ class ReaderViewModel extends ReactiveViewModel {
4849 await _biblesService.reloadBiblesJson ();
4950
5051 String primaryAreaHTML = _readerService.getReaderBookHTML (Area .primary, viewBy, primaryAreaBible, bookCode);
51- String secondaryAreaHTML = '' ;
52- if (showSecondaryArea == true ) {
53- secondaryAreaHTML = _readerService.getReaderBookHTML (Area .secondary, viewBy, secondaryAreaBible, bookCode);
54- }
52+ String secondaryAreaHTML = _readerService.getReaderBookHTML (Area .secondary, viewBy, secondaryAreaBible, bookCode);
53+
5554 await initilizeReaderWebview (
5655 primaryAreaHTML,
5756 secondaryAreaHTML,
5857 showSecondaryArea,
58+ linkReaderAreaScrolling,
5959 );
6060 rebuildUi ();
6161 }
@@ -102,7 +102,8 @@ class ReaderViewModel extends ReactiveViewModel {
102102 }
103103
104104 /// Initilizes the webview html with everything except for the reader area contents.
105- Future <void > initilizeReaderWebview (String primaryAreaHTML, String secondaryAreaHTML, bool showSecondaryArea) async {
105+ Future <void > initilizeReaderWebview (
106+ String primaryAreaHTML, String secondaryAreaHTML, bool showSecondaryArea, bool linkReaderAreaScrolling) async {
106107 // Load font
107108 ByteData fontData = await rootBundle.load ('assets/fonts/Merriweather/Merriweather-Regular.ttf' );
108109 String fontUri = getFontUri (fontData, 'font/truetype' ).toString ();
@@ -338,9 +339,11 @@ class ReaderViewModel extends ReactiveViewModel {
338339 </div>
339340
340341 <script>
342+ var elements = null;
343+ var handleScroll = null;
341344 document.addEventListener("DOMContentLoaded", () => {
342345 const container = document.getElementById("container");
343- const elements = [...container.querySelectorAll(".scrollable")];
346+ elements = [...container.querySelectorAll(".scrollable")];
344347
345348 const syncScroll = (scrolledEle, ele) => {
346349 const scrolledPercent = scrolledEle.scrollTop / (scrolledEle.scrollHeight - scrolledEle.clientHeight);
@@ -356,7 +359,7 @@ class ReaderViewModel extends ReactiveViewModel {
356359 });
357360 };
358361
359- const handleScroll = (e) => {
362+ handleScroll = (e) => {
360363 const scrolledEle = e.target;
361364 elements.filter((item) => item !== scrolledEle).forEach((ele) => {
362365 ele.removeEventListener("scroll", handleScroll);
@@ -366,10 +369,12 @@ class ReaderViewModel extends ReactiveViewModel {
366369 });
367370 });
368371 };
369-
370- elements.forEach((ele) => {
371- ele.addEventListener("scroll", handleScroll);
372- });
372+
373+ ${linkReaderAreaScrolling == true ? """
374+ elements.forEach((ele) => {
375+ ele.addEventListener("scroll", handleScroll);
376+ });
377+ """ : "" }
373378
374379 document.getElementById("$id ").scrollIntoView();
375380 });
@@ -395,30 +400,29 @@ class ReaderViewModel extends ReactiveViewModel {
395400 } else {
396401 areaId = 'secondaryReader' ;
397402 }
398- await webviewController.runJavaScript ("""
399- document.addEventListener("DOMContentLoaded", () => {
400- document.getElementById('$areaId ').innerHTML = '$htmlContent ';
401- });
402- """ );
403-
403+ await webviewController.runJavaScript ('document.getElementById("$areaId ").innerHTML = "$htmlContent ";' );
404404 rebuildUi ();
405405 }
406406
407407 Future <void > jumpToHTMLId (String id) async {
408- await webviewController.runJavaScript ("""
409- document.getElementById('$id ').scrollIntoView();
410- """ );
408+ await webviewController.runJavaScript ('document.getElementById("$id ").scrollIntoView();' );
411409 }
412410
413411 Future <void > toggleSecondaryAreaHTML (bool showSecondaryArea) async {
414412 if (showSecondaryArea == false ) {
415- await webviewController.runJavaScript ("""
416- document.getElementById('container').classList.add('hidden');
417- """ );
413+ await webviewController.runJavaScript ('document.getElementById("container").classList.add("hidden");' );
418414 } else {
419- await webviewController.runJavaScript ("""
420- document.getElementById('container').classList.remove('hidden');
421- """ );
415+ await webviewController.runJavaScript ('document.getElementById("container").classList.remove("hidden");' );
416+ }
417+ }
418+
419+ Future <void > toggleLinkedScrollingHTML (bool linkScrolling) async {
420+ if (linkScrolling == true ) {
421+ await webviewController
422+ .runJavaScript ('elements.forEach((ele) => {ele.addEventListener("scroll", handleScroll);});' );
423+ } else {
424+ await webviewController
425+ .runJavaScript ('elements.forEach((ele) => {ele.removeEventListener("scroll", handleScroll);});' );
422426 }
423427 }
424428
@@ -493,6 +497,13 @@ class ReaderViewModel extends ReactiveViewModel {
493497 rebuildUi ();
494498 }
495499
500+ void onToggleLinkedScrolling () async {
501+ _settingsService.setLinkReaderAreaScrolling (! linkReaderAreaScrolling);
502+ await toggleLinkedScrollingHTML (linkReaderAreaScrolling);
503+ showToastMsg (linkReaderAreaScrolling == true ? 'Scrolling is linked' : 'Scrolling is unlinked' );
504+ rebuildUi ();
505+ }
506+
496507 @override
497508 List <ListenableServiceMixin > get listenableServices => [_settingsService, _biblesService];
498509}
0 commit comments