This commit is contained in:
2025-02-21 13:14:28 +08:00
parent 8adf61b54f
commit fba49233c8

View File

@@ -40,9 +40,13 @@ import 'package:window_manager/window_manager.dart';
import 'package:battery_plus/battery_plus.dart'; import 'package:battery_plus/battery_plus.dart';
part 'scaffold.dart'; part 'scaffold.dart';
part 'images.dart'; part 'images.dart';
part 'gesture.dart'; part 'gesture.dart';
part 'comic_image.dart'; part 'comic_image.dart';
part 'loading.dart'; part 'loading.dart';
extension _ReaderContext on BuildContext { extension _ReaderContext on BuildContext {
@@ -94,7 +98,8 @@ class Reader extends StatefulWidget {
State<Reader> createState() => _ReaderState(); State<Reader> createState() => _ReaderState();
} }
class _ReaderState extends State<Reader> with _ReaderLocation, _ReaderWindow { class _ReaderState extends State<Reader>
with _ReaderLocation, _ReaderWindow, _VolumeListener, _ImagePerPageHandler {
@override @override
void update() { void update() {
setState(() {}); setState(() {});
@@ -111,37 +116,11 @@ class _ReaderState extends State<Reader> with _ReaderLocation, _ReaderWindow {
List<String>? images; List<String>? images;
@override
late ReaderMode mode; late ReaderMode mode;
int get imagesPerPage { @override
if (mode.isContinuous) return 1; bool get isPortrait => MediaQuery.of(context).orientation == Orientation.portrait;
if (isPortrait) {
return appdata.settings['readerScreenPicNumberForPortrait'] ?? 1;
} else {
return appdata.settings['readerScreenPicNumberForLandscape'] ?? 1;
}
}
late int _lastImagesPerPage;
bool get isPortrait =>
MediaQuery.of(context).orientation == Orientation.portrait;
void _checkImagesPerPageChange() {
int currentImagesPerPage = imagesPerPage;
if (_lastImagesPerPage != currentImagesPerPage) {
_adjustPageForImagesPerPageChange(
_lastImagesPerPage, currentImagesPerPage);
_lastImagesPerPage = currentImagesPerPage;
}
}
void _adjustPageForImagesPerPageChange(
int oldImagesPerPage, int newImagesPerPage) {
int previousImageIndex = (page - 1) * oldImagesPerPage;
int newPage = (previousImageIndex ~/ newImagesPerPage) + 1;
page = newPage;
}
History? history; History? history;
@@ -150,8 +129,6 @@ class _ReaderState extends State<Reader> with _ReaderLocation, _ReaderWindow {
var focusNode = FocusNode(); var focusNode = FocusNode();
VolumeListener? volumeListener;
@override @override
void initState() { void initState() {
page = widget.initialPage ?? 1; page = widget.initialPage ?? 1;
@@ -189,10 +166,7 @@ class _ReaderState extends State<Reader> with _ReaderLocation, _ReaderWindow {
@override @override
void didChangeDependencies() { void didChangeDependencies() {
super.didChangeDependencies(); super.didChangeDependencies();
_lastImagesPerPage = imagesPerPage; initImagesPerPage(widget.initialPage ?? 1);
if (imagesPerPage != 1) {
page = (widget.initialPage! / imagesPerPage).ceil();
}
} }
void setImageCacheSize() async { void setImageCacheSize() async {
@@ -291,6 +265,61 @@ class _ReaderState extends State<Reader> with _ReaderLocation, _ReaderWindow {
}); });
} }
} }
}
abstract mixin class _ImagePerPageHandler {
late int _lastImagesPerPage;
bool get isPortrait;
int get page;
set page(int value);
ReaderMode get mode;
void initImagesPerPage(int initialPage) {
_lastImagesPerPage = imagesPerPage;
if (imagesPerPage != 1) {
page = (initialPage / imagesPerPage).ceil();
}
}
/// The number of images displayed on one screen
int get imagesPerPage {
if (mode.isContinuous) return 1;
if (isPortrait) {
return appdata.settings['readerScreenPicNumberForPortrait'] ?? 1;
} else {
return appdata.settings['readerScreenPicNumberForLandscape'] ?? 1;
}
}
/// Check if the number of images per page has changed
void _checkImagesPerPageChange() {
int currentImagesPerPage = imagesPerPage;
if (_lastImagesPerPage != currentImagesPerPage) {
_adjustPageForImagesPerPageChange(
_lastImagesPerPage, currentImagesPerPage);
_lastImagesPerPage = currentImagesPerPage;
}
}
/// Adjust the page number when the number of images per page changes
void _adjustPageForImagesPerPageChange(
int oldImagesPerPage, int newImagesPerPage) {
int previousImageIndex = (page - 1) * oldImagesPerPage;
int newPage = (previousImageIndex ~/ newImagesPerPage) + 1;
page = newPage;
}
}
abstract mixin class _VolumeListener {
bool toNextPage();
bool toPrevPage();
VolumeListener? volumeListener;
void handleVolumeEvent() { void handleVolumeEvent() {
if (!App.isAndroid) { if (!App.isAndroid) {
@@ -301,12 +330,8 @@ class _ReaderState extends State<Reader> with _ReaderLocation, _ReaderWindow {
volumeListener?.cancel(); volumeListener?.cancel();
} }
volumeListener = VolumeListener( volumeListener = VolumeListener(
onDown: () { onDown: toNextPage,
toNextPage(); onUp: toPrevPage,
},
onUp: () {
toPrevPage();
},
)..listen(); )..listen();
} }