From 28d9775203cf034d23c2abb8279b83d87ea281a0 Mon Sep 17 00:00:00 2001 From: ashilkn Date: Thu, 4 Jul 2024 16:55:38 +0530 Subject: [PATCH] [mob][photos] Fix unexpected selections on vertical drag gestures + remove bugs Now the feature works without any unexpected behaviour --- mobile/lib/states/pointer_provider.dart | 20 ++++++++++++++++++- .../component/gallery_file_widget.dart | 4 ++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/mobile/lib/states/pointer_provider.dart b/mobile/lib/states/pointer_provider.dart index 95248690db..b9d97197e3 100644 --- a/mobile/lib/states/pointer_provider.dart +++ b/mobile/lib/states/pointer_provider.dart @@ -15,6 +15,7 @@ class PointerProvider extends StatefulWidget { class _PointerProviderState extends State { late Pointer pointer; + bool _isFingerOnScreenSinceLongPress = false; @override void dispose() { @@ -36,15 +37,32 @@ class _PointerProviderState extends State { pointer.onTapStreamController.add(pointer.pointerPosition); }, onLongPress: () { + _isFingerOnScreenSinceLongPress = true; pointer.onLongPressStreamController.add(pointer.pointerPosition); }, + onHorizontalDragUpdate: (details) { + pointer.moveOffsetStreamController.add(details.localPosition); + }, child: Listener( onPointerMove: (event) { pointer.pointerPosition = event.localPosition; + + //onHorizontalDragUpdate is not called when dragging after + //long press without lifting finger. This is for handling only + //this case. + if (_isFingerOnScreenSinceLongPress && + (event.localDelta.dx.abs() > 0 && + event.localDelta.dy.abs() > 0)) { + pointer.moveOffsetStreamController.add(event.localPosition); + } }, onPointerDown: (event) { pointer.pointerPosition = event.localPosition; }, + onPointerUp: (event) { + _isFingerOnScreenSinceLongPress = false; + pointer.upOffsetStreamController.add(event.localPosition); + }, child: widget.child, ), ); @@ -59,7 +77,7 @@ class Pointer extends InheritedWidget { //This is a List instead of just and Offset is so that it can be final //and still be mutable. Need to have this as final to keep Pointer immutable - //which is a recommended for inherited widgets. + //which is recommended for inherited widgets. final _pointerPosition = List.generate(1, (_) => Offset.zero, growable: false); diff --git a/mobile/lib/ui/viewer/gallery/component/gallery_file_widget.dart b/mobile/lib/ui/viewer/gallery/component/gallery_file_widget.dart index 2fc59d8293..83012e0773 100644 --- a/mobile/lib/ui/viewer/gallery/component/gallery_file_widget.dart +++ b/mobile/lib/ui/viewer/gallery/component/gallery_file_widget.dart @@ -99,6 +99,7 @@ class _GalleryFileWidgetState extends State { .stream .listen((offset) { if (bbox.contains(offset)) { + _pointerInsideBbox = true; widget.limitSelectionToOne ? _onTapWithSelectionLimit(widget.file) : _onTapNoSelectionLimit(context, widget.file); @@ -110,6 +111,7 @@ class _GalleryFileWidgetState extends State { .stream .listen((offset) { if (bbox.contains(offset)) { + _pointerInsideBbox = true; widget.limitSelectionToOne ? _onLongPressWithSelectionLimit(context, widget.file) : _onLongPressNoSelectionLimit(context, widget.file); @@ -254,7 +256,6 @@ class _GalleryFileWidgetState extends State { GalleryContextState.of(context)!.inSelectionMode; if (shouldToggleSelection) { _toggleFileSelection(file); - _pointerInsideBbox = true; } else { if (AppLifecycleService.instance.mediaExtensionAction.action == IntentAction.pick) { @@ -273,7 +274,6 @@ class _GalleryFileWidgetState extends State { IntentAction.main) { HapticFeedback.lightImpact(); _toggleFileSelection(file); - _pointerInsideBbox = true; } }