From 8b79b31ae52095af253cad088a86226ce76eeefa Mon Sep 17 00:00:00 2001 From: Marty Fuhry Date: Sun, 18 Feb 2024 11:02:22 -0500 Subject: [PATCH] Handle merge conflicts --- .../ui/asset_grid/immich_asset_grid_view.dart | 45 ++++++-- .../home/ui/asset_grid/thumbnail_image.dart | 107 ++++++++++-------- 2 files changed, 90 insertions(+), 62 deletions(-) diff --git a/mobile/lib/modules/home/ui/asset_grid/immich_asset_grid_view.dart b/mobile/lib/modules/home/ui/asset_grid/immich_asset_grid_view.dart index 6713b79aa6..5b649cc442 100644 --- a/mobile/lib/modules/home/ui/asset_grid/immich_asset_grid_view.dart +++ b/mobile/lib/modules/home/ui/asset_grid/immich_asset_grid_view.dart @@ -11,6 +11,7 @@ import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/collection_extensions.dart'; import 'package:immich_mobile/modules/asset_viewer/providers/scroll_notifier.provider.dart'; import 'package:immich_mobile/modules/home/ui/asset_grid/thumbnail_image.dart'; +import 'package:immich_mobile/modules/home/ui/asset_grid/thumbnail_placeholder.dart'; import 'package:immich_mobile/routing/router.dart'; import 'package:immich_mobile/shared/models/asset.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; @@ -588,6 +589,7 @@ class _AssetRow extends StatelessWidget { key: key, children: assets.mapIndexed((int index, Asset asset) { final bool last = index + 1 == assetsPerRow; + final isSelected = isSelectionActive && selectedAssets.contains(asset); return Container( width: width * widthDistribution[index], height: width, @@ -595,18 +597,37 @@ class _AssetRow extends StatelessWidget { bottom: margin, right: last ? 0.0 : margin, ), - child: ThumbnailImage( - asset: asset, - index: absoluteOffset + index, - loadAsset: renderList.loadAsset, - totalAssets: renderList.totalAssets, - multiselectEnabled: selectionActive, - isSelected: isSelectionActive && selectedAssets.contains(asset), - onSelect: () => onSelect?.call(asset), - onDeselect: () => onDeselect?.call(asset), - showStorageIndicator: showStorageIndicator, - heroOffset: heroOffset, - showStack: showStack, + child: GestureDetector( + onTap: () { + if (selectionActive) { + if (isSelected) { + onDeselect?.call(asset); + } else { + onSelect?.call(asset); + } + } else { + context.pushRoute( + GalleryViewerRoute( + renderList: renderList, + initialIndex: absoluteOffset + index, + heroOffset: heroOffset, + showStack: showStack, + ), + ); + } + }, + onLongPress: () { + onSelect?.call(asset); + HapticFeedback.heavyImpact(); + }, + child: ThumbnailImage( + asset: asset, + multiselectEnabled: selectionActive, + isSelected: isSelected, + showStorageIndicator: showStorageIndicator, + heroOffset: heroOffset, + showStack: showStack, + ), ), ); }).toList(), diff --git a/mobile/lib/modules/home/ui/asset_grid/thumbnail_image.dart b/mobile/lib/modules/home/ui/asset_grid/thumbnail_image.dart index c158378150..64a32b4295 100644 --- a/mobile/lib/modules/home/ui/asset_grid/thumbnail_image.dart +++ b/mobile/lib/modules/home/ui/asset_grid/thumbnail_image.dart @@ -5,16 +5,29 @@ import 'package:immich_mobile/shared/ui/immich_image.dart'; import 'package:immich_mobile/utils/storage_indicator.dart'; import 'package:isar/isar.dart'; +/// Shows the thumbnail images in the asset grid view class ThumbnailImage extends StatelessWidget { + + /// The asset to show the thumbnail image for final Asset asset; + + /// Whether to show the storage indicator icont over the image or not final bool showStorageIndicator; + + /// Whether to show the show stack icon over the image or not final bool showStack; + + /// Whether to show the checkmark indicating that this image is selected final bool isSelected; + + /// Can override [isSelected] and never show the selection indicator final bool multiselectEnabled; + + /// If we are allowed to deselect this image final bool canDeselect; + + /// The offset index to apply to this hero tag for animation final int heroOffset; - final Function()? onTap; - final Function()? onLongPress; const ThumbnailImage({ super.key, @@ -25,8 +38,6 @@ class ThumbnailImage extends StatelessWidget { this.multiselectEnabled = false, this.heroOffset = 0, this.canDeselect = true, - this.onTap, - this.onLongPress, }); @override @@ -153,56 +164,52 @@ class ThumbnailImage extends StatelessWidget { ); } - return GestureDetector( - onTap: onTap, - onLongPress: onLongPress, - child: Stack( - children: [ - AnimatedContainer( - duration: const Duration(milliseconds: 300), - curve: Curves.decelerate, - decoration: BoxDecoration( - border: multiselectEnabled && isSelected - ? Border.all( - color: canDeselect ? assetContainerColor : Colors.grey, - width: 8, - ) - : const Border(), - ), - child: buildImage(), + return Stack( + children: [ + AnimatedContainer( + duration: const Duration(milliseconds: 300), + curve: Curves.decelerate, + decoration: BoxDecoration( + border: multiselectEnabled && isSelected + ? Border.all( + color: canDeselect ? assetContainerColor : Colors.grey, + width: 8, + ) + : const Border(), ), - if (multiselectEnabled) - Padding( - padding: const EdgeInsets.all(3.0), - child: Align( - alignment: Alignment.topLeft, - child: buildSelectionIcon(asset), - ), + child: buildImage(), + ), + if (multiselectEnabled) + Padding( + padding: const EdgeInsets.all(3.0), + child: Align( + alignment: Alignment.topLeft, + child: buildSelectionIcon(asset), ), - if (showStorageIndicator) - Positioned( - right: 8, - bottom: 5, - child: Icon( - storageIcon(asset), - color: Colors.white, - size: 18, - ), + ), + if (showStorageIndicator) + Positioned( + right: 8, + bottom: 5, + child: Icon( + storageIcon(asset), + color: Colors.white, + size: 18, ), - if (asset.isFavorite) - const Positioned( - left: 8, - bottom: 5, - child: Icon( - Icons.favorite, - color: Colors.white, - size: 18, - ), + ), + if (asset.isFavorite) + const Positioned( + left: 8, + bottom: 5, + child: Icon( + Icons.favorite, + color: Colors.white, + size: 18, ), - if (!asset.isImage) buildVideoIcon(), - if (asset.stackChildrenCount > 0) buildStackIcon(), - ], - ), + ), + if (!asset.isImage) buildVideoIcon(), + if (asset.stackChildrenCount > 0) buildStackIcon(), + ], ); } }