Skip to content

Commit 1ad9f08

Browse files
Implement linked scrolling toggling
1 parent 1ad8072 commit 1ad9f08

4 files changed

Lines changed: 42 additions & 33 deletions

File tree

lib/ui/views/reader/reader_view.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class ReaderView extends StackedView<ReaderViewModel> {
8181
child: ReaderAreaPopup(
8282
readerArea: Area.secondary,
8383
onToggleSecondaryArea: viewModel.onToggleSecondaryArea,
84+
onToggleLinkedScrolling: viewModel.onToggleLinkedScrolling,
8485
),
8586
),
8687
if (viewModel.isPrimaryReaderAreaPopupActive)
@@ -89,6 +90,7 @@ class ReaderView extends StackedView<ReaderViewModel> {
8990
child: ReaderAreaPopup(
9091
readerArea: Area.primary,
9192
onToggleSecondaryArea: viewModel.onToggleSecondaryArea,
93+
onToggleLinkedScrolling: viewModel.onToggleLinkedScrolling,
9294
),
9395
),
9496
],

lib/ui/views/reader/reader_viewmodel.dart

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import '../../../app/app.locator.dart';
1212
import '../../../app/app.router.dart';
1313
import '../../../common/enums.dart';
1414
import '../../../common/themes.dart';
15+
import '../../../common/toast.dart';
1516
import '../../../services/bibles_service.dart';
1617
import '../../../services/reader_service.dart';
1718
import '../../../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
}

lib/ui/views/reader/widgets/reader_area_popup/reader_area_popup.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ class ReaderAreaPopup extends StackedView<ReaderAreaPopupModel> {
1212
super.key,
1313
required this.readerArea,
1414
required this.onToggleSecondaryArea,
15+
required this.onToggleLinkedScrolling,
1516
});
1617

1718
final Area readerArea;
1819
final Function() onToggleSecondaryArea;
20+
final Function() onToggleLinkedScrolling;
1921

2022
@override
2123
Widget builder(
@@ -115,7 +117,7 @@ class ReaderAreaPopup extends StackedView<ReaderAreaPopupModel> {
115117
),
116118
),
117119
InkWell(
118-
onTap: viewModel.onTapLinkUnlinkReaderAreas,
120+
onTap: onToggleLinkedScrolling,
119121
child: Padding(
120122
padding: const EdgeInsets.all(8.0),
121123
child: PhosphorIcon(

lib/ui/views/reader/widgets/reader_area_popup/reader_area_popup_model.dart

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import 'package:stacked_services/stacked_services.dart';
44
import '../../../../../app/app.locator.dart';
55
import '../../../../../app/app.router.dart';
66
import '../../../../../common/enums.dart';
7-
import '../../../../../common/toast.dart';
87
import '../../../../../services/settings_service.dart';
98

109
class ReaderAreaPopupModel extends ReactiveViewModel {
@@ -17,11 +16,6 @@ class ReaderAreaPopupModel extends ReactiveViewModel {
1716
bool get showSecondaryArea => _settingsService.showSecondaryArea;
1817
bool get linkReaderAreaScrolling => _settingsService.linkReaderAreaScrolling;
1918

20-
void onTapLinkUnlinkReaderAreas() {
21-
showToastMsg(linkReaderAreaScrolling == true ? 'Scrolling is linked' : 'Scrolling is unlinked');
22-
rebuildUi();
23-
}
24-
2519
void onChangePrimaryBibleVersion() {
2620
_navigationService.clearStackAndShow(
2721
Routes.biblesView,

0 commit comments

Comments
 (0)