mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-30 18:35:00 -04:00 
			
		
		
		
	feat(mobile): pinch to zoom on asset grid (#2905)
This commit is contained in:
		
							parent
							
								
									2c924e4c1c
								
							
						
					
					
						commit
						7f44d508dc
					
				| @ -1,3 +1,6 @@ | ||||
| import 'dart:math'; | ||||
| 
 | ||||
| import 'package:flutter/gestures.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_hooks/flutter_hooks.dart'; | ||||
| import 'package:hooks_riverpod/hooks_riverpod.dart'; | ||||
| @ -51,6 +54,12 @@ class ImmichAssetGrid extends HookConsumerWidget { | ||||
|     final enableHeroAnimations = useState(false); | ||||
|     final transitionDuration = ModalRoute.of(context)?.transitionDuration; | ||||
| 
 | ||||
|     final perRow = useState( | ||||
|       assetsPerRow ?? settings.getSetting(AppSettingsEnum.tilesPerRow)!, | ||||
|     ); | ||||
|     final scaleFactor = useState(7.0 - perRow.value); | ||||
|     final baseScaleFactor = useState(7.0 - perRow.value); | ||||
| 
 | ||||
|     useEffect( | ||||
|       () { | ||||
|         // Wait for transition to complete, then re-enable | ||||
| @ -80,22 +89,43 @@ class ImmichAssetGrid extends HookConsumerWidget { | ||||
|         onWillPop: onWillPop, | ||||
|         child: HeroMode( | ||||
|           enabled: enableHeroAnimations.value, | ||||
|           child: ImmichAssetGridView( | ||||
|             onRefresh: onRefresh, | ||||
|             assetsPerRow: assetsPerRow ?? | ||||
|                 settings.getSetting(AppSettingsEnum.tilesPerRow), | ||||
|             listener: listener, | ||||
|             showStorageIndicator: showStorageIndicator ?? | ||||
|                 settings.getSetting(AppSettingsEnum.storageIndicator), | ||||
|             renderList: renderList, | ||||
|             margin: margin, | ||||
|             selectionActive: selectionActive, | ||||
|             preselectedAssets: preselectedAssets, | ||||
|             canDeselect: canDeselect, | ||||
|             dynamicLayout: dynamicLayout ?? | ||||
|                 settings.getSetting(AppSettingsEnum.dynamicLayout), | ||||
|             showMultiSelectIndicator: showMultiSelectIndicator, | ||||
|             visibleItemsListener: visibleItemsListener, | ||||
|           child: RawGestureDetector( | ||||
|             gestures: { | ||||
|               CustomScaleGestureRecognizer: | ||||
|                   GestureRecognizerFactoryWithHandlers< | ||||
|                           CustomScaleGestureRecognizer>( | ||||
|                       () => CustomScaleGestureRecognizer(), | ||||
|                       (CustomScaleGestureRecognizer scale) { | ||||
|                 scale.onStart = (details) { | ||||
|                   baseScaleFactor.value = scaleFactor.value; | ||||
|                 }; | ||||
| 
 | ||||
|                 scale.onUpdate = (details) { | ||||
|                   scaleFactor.value = | ||||
|                       max(min(5.0, baseScaleFactor.value * details.scale), 1.0); | ||||
|                   if (7 - scaleFactor.value.toInt() != perRow.value) { | ||||
|                     perRow.value = 7 - scaleFactor.value.toInt(); | ||||
|                   } | ||||
|                 }; | ||||
|                 scale.onEnd = (details) {}; | ||||
|               }) | ||||
|             }, | ||||
|             child: ImmichAssetGridView( | ||||
|               onRefresh: onRefresh, | ||||
|               assetsPerRow: perRow.value, | ||||
|               listener: listener, | ||||
|               showStorageIndicator: showStorageIndicator ?? | ||||
|                   settings.getSetting(AppSettingsEnum.storageIndicator), | ||||
|               renderList: renderList, | ||||
|               margin: margin, | ||||
|               selectionActive: selectionActive, | ||||
|               preselectedAssets: preselectedAssets, | ||||
|               canDeselect: canDeselect, | ||||
|               dynamicLayout: dynamicLayout ?? | ||||
|                   settings.getSetting(AppSettingsEnum.dynamicLayout), | ||||
|               showMultiSelectIndicator: showMultiSelectIndicator, | ||||
|               visibleItemsListener: visibleItemsListener, | ||||
|             ), | ||||
|           ), | ||||
|         ), | ||||
|       ); | ||||
| @ -113,3 +143,11 @@ class ImmichAssetGrid extends HookConsumerWidget { | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /// accepts a gesture even though it should reject it (because child won) | ||||
| class CustomScaleGestureRecognizer extends ScaleGestureRecognizer { | ||||
|   @override | ||||
|   void rejectGesture(int pointer) { | ||||
|     acceptGesture(pointer); | ||||
|   } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user