mirror of
https://github.com/venera-app/venera.git
synced 2025-09-27 07:47:24 +00:00
Improve reader gesture. Close #185
This commit is contained in:
@@ -24,6 +24,8 @@ class _ReaderGestureDetectorState extends State<_ReaderGestureDetector> {
|
|||||||
|
|
||||||
int fingers = 0;
|
int fingers = 0;
|
||||||
|
|
||||||
|
late _ReaderState reader;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
_tapGestureRecognizer = TapGestureRecognizer()
|
_tapGestureRecognizer = TapGestureRecognizer()
|
||||||
@@ -33,6 +35,7 @@ class _ReaderGestureDetectorState extends State<_ReaderGestureDetector> {
|
|||||||
};
|
};
|
||||||
super.initState();
|
super.initState();
|
||||||
context.readerScaffold._gestureDetectorState = this;
|
context.readerScaffold._gestureDetectorState = this;
|
||||||
|
reader = context.reader;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -166,7 +169,9 @@ class _ReaderGestureDetectorState extends State<_ReaderGestureDetector> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void onTap(Offset location) {
|
void onTap(Offset location) {
|
||||||
if (context.readerScaffold.isOpen) {
|
if (reader._imageViewController!.handleOnTap(location)) {
|
||||||
|
return;
|
||||||
|
} else if (context.readerScaffold.isOpen) {
|
||||||
context.readerScaffold.openOrClose();
|
context.readerScaffold.openOrClose();
|
||||||
} else {
|
} else {
|
||||||
if (appdata.settings['enableTapToTurnPages']) {
|
if (appdata.settings['enableTapToTurnPages']) {
|
||||||
|
@@ -335,6 +335,11 @@ class _GalleryModeState extends State<_GalleryMode>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool handleOnTap(Offset location) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const Set<PointerDeviceKind> _kTouchLikeDeviceTypes = <PointerDeviceKind>{
|
const Set<PointerDeviceKind> _kTouchLikeDeviceTypes = <PointerDeviceKind>{
|
||||||
@@ -366,6 +371,18 @@ class _ContinuousModeState extends State<_ContinuousMode>
|
|||||||
var fingers = 0;
|
var fingers = 0;
|
||||||
bool disableScroll = false;
|
bool disableScroll = false;
|
||||||
|
|
||||||
|
/// Whether the user was scrolling the page.
|
||||||
|
/// The gesture detector has a delay to detect tap event.
|
||||||
|
/// To handle the tap event, we need to know if the user was scrolling before the delay.
|
||||||
|
bool delayedIsScrolling = false;
|
||||||
|
|
||||||
|
void delayedSetIsScrolling(bool value) {
|
||||||
|
Future.delayed(
|
||||||
|
const Duration(milliseconds: 300),
|
||||||
|
() => delayedIsScrolling = value,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
reader = context.reader;
|
reader = context.reader;
|
||||||
@@ -374,6 +391,12 @@ class _ContinuousModeState extends State<_ContinuousMode>
|
|||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
itemPositionsListener.itemPositions.removeListener(onPositionChanged);
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
void onPositionChanged() {
|
void onPositionChanged() {
|
||||||
var page = itemPositionsListener.itemPositions.value.first.index;
|
var page = itemPositionsListener.itemPositions.value.first.index;
|
||||||
page = page.clamp(1, reader.maxPage);
|
page = page.clamp(1, reader.maxPage);
|
||||||
@@ -516,8 +539,14 @@ class _ContinuousModeState extends State<_ContinuousMode>
|
|||||||
child: widget,
|
child: widget,
|
||||||
);
|
);
|
||||||
|
|
||||||
widget = NotificationListener<ScrollUpdateNotification>(
|
widget = NotificationListener<ScrollNotification>(
|
||||||
onNotification: (notification) {
|
onNotification: (notification) {
|
||||||
|
if (notification is ScrollStartNotification) {
|
||||||
|
delayedSetIsScrolling(true);
|
||||||
|
} else if (notification is ScrollEndNotification) {
|
||||||
|
delayedSetIsScrolling(false);
|
||||||
|
}
|
||||||
|
|
||||||
var length = reader.maxChapter;
|
var length = reader.maxChapter;
|
||||||
if (!scrollController.hasClients) return false;
|
if (!scrollController.hasClients) return false;
|
||||||
if (scrollController.position.pixels <=
|
if (scrollController.position.pixels <=
|
||||||
@@ -592,7 +621,7 @@ class _ContinuousModeState extends State<_ContinuousMode>
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void handleLongPressDown(Offset location) {
|
void handleLongPressDown(Offset location) {
|
||||||
if (!appdata.settings['enableLongPressToZoom']) {
|
if (!appdata.settings['enableLongPressToZoom'] || delayedIsScrolling) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
double target = photoViewController.getInitialScale!.call()! * 1.75;
|
double target = photoViewController.getInitialScale!.call()! * 1.75;
|
||||||
@@ -667,6 +696,16 @@ class _ContinuousModeState extends State<_ContinuousMode>
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool handleOnTap(Offset location) {
|
||||||
|
if (delayedIsScrolling) {
|
||||||
|
print('isScrolling');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
print('isNotScrolling');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageProvider _createImageProviderFromKey(
|
ImageProvider _createImageProviderFromKey(
|
||||||
|
@@ -430,4 +430,7 @@ abstract interface class _ImageViewController {
|
|||||||
void handleLongPressUp(Offset location);
|
void handleLongPressUp(Offset location);
|
||||||
|
|
||||||
void handleKeyEvent(KeyEvent event);
|
void handleKeyEvent(KeyEvent event);
|
||||||
|
|
||||||
|
/// Returns true if the event is handled.
|
||||||
|
bool handleOnTap(Offset location);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user