浏览代码

Exernalize multiselect state

Matthias Rupp 2 年之前
父节点
当前提交
3c807ae86e

+ 22 - 18
mobile/lib/modules/home/ui/asset_grid/immich_asset_grid.dart

@@ -23,7 +23,6 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
       ItemPositionsListener.create();
       ItemPositionsListener.create();
 
 
   bool _scrolling = false;
   bool _scrolling = false;
-  bool _multiselect = false;
   Set<String> _selectedAssets = HashSet();
   Set<String> _selectedAssets = HashSet();
 
 
   List<AssetResponseDto> get _assets {
   List<AssetResponseDto> get _assets {
@@ -46,8 +45,8 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
         .toSet();
         .toSet();
   }
   }
 
 
-  void _callSelectionListener() {
-    widget.listener?.call(_multiselect, _getSelectedAssets());
+  void _callSelectionListener(bool selectionActive) {
+    widget.listener?.call(selectionActive, _getSelectedAssets());
   }
   }
 
 
   void _selectAssets(List<AssetResponseDto> assets) {
   void _selectAssets(List<AssetResponseDto> assets) {
@@ -55,9 +54,7 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
       for (var e in assets) {
       for (var e in assets) {
         _selectedAssets.add(e.id);
         _selectedAssets.add(e.id);
       }
       }
-
-      _multiselect = true;
-      _callSelectionListener();
+      _callSelectionListener(true);
     });
     });
   }
   }
 
 
@@ -66,26 +63,20 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
       for (var e in assets) {
       for (var e in assets) {
         _selectedAssets.remove(e.id);
         _selectedAssets.remove(e.id);
       }
       }
-
-      if (_selectedAssets.isEmpty) {
-        _multiselect = false;
-      }
-
-      _callSelectionListener();
+      _callSelectionListener(_selectedAssets.isNotEmpty);
     });
     });
   }
   }
 
 
   void _deselectAll() {
   void _deselectAll() {
     setState(() {
     setState(() {
-      _multiselect = false;
       _selectedAssets.clear();
       _selectedAssets.clear();
     });
     });
 
 
-    _callSelectionListener();
+    _callSelectionListener(false);
   }
   }
 
 
   bool _allAssetsSelected(List<AssetResponseDto> assets) {
   bool _allAssetsSelected(List<AssetResponseDto> assets) {
-    return _multiselect &&
+    return widget.selectionActive &&
         assets.firstWhereOrNull((e) => !_selectedAssets.contains(e.id)) == null;
         assets.firstWhereOrNull((e) => !_selectedAssets.contains(e.id)) == null;
   }
   }
 
 
@@ -104,7 +95,7 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
     return ThumbnailImage(
     return ThumbnailImage(
       asset: asset,
       asset: asset,
       assetList: _assets,
       assetList: _assets,
-      multiselectEnabled: _multiselect,
+      multiselectEnabled: widget.selectionActive,
       isSelected: _selectedAssets.contains(asset.id),
       isSelected: _selectedAssets.contains(asset.id),
       onSelect: () => _selectAssets([asset]),
       onSelect: () => _selectAssets([asset]),
       onDeselect: () => _deselectAssets([asset]),
       onDeselect: () => _deselectAssets([asset]),
@@ -137,7 +128,7 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
       BuildContext context, String title, List<AssetResponseDto> assets) {
       BuildContext context, String title, List<AssetResponseDto> assets) {
     return DailyTitleText(
     return DailyTitleText(
       isoDate: title,
       isoDate: title,
-      multiselectEnabled: _multiselect,
+      multiselectEnabled: widget.selectionActive,
       onSelect: () => _selectAssets(assets),
       onSelect: () => _selectAssets(assets),
       onDeselect: () => _deselectAssets(assets),
       onDeselect: () => _deselectAssets(assets),
       selected: _allAssetsSelected(assets),
       selected: _allAssetsSelected(assets),
@@ -227,12 +218,23 @@ class ImmichAssetGridState extends State<ImmichAssetGrid> {
     );
     );
   }
   }
 
 
+
+  @override
+  void didUpdateWidget(ImmichAssetGrid oldWidget) {
+    super.didUpdateWidget(oldWidget);
+    if (!widget.selectionActive) {
+      setState(() {
+        _selectedAssets.clear();
+      });
+    }
+  }
+
   @override
   @override
   Widget build(BuildContext context) {
   Widget build(BuildContext context) {
     return Stack(
     return Stack(
       children: [
       children: [
         _buildAssetGrid(),
         _buildAssetGrid(),
-        if (_multiselect) _buildMultiSelectIndicator(),
+        if (widget.selectionActive) _buildMultiSelectIndicator(),
       ],
       ],
     );
     );
   }
   }
@@ -244,6 +246,7 @@ class ImmichAssetGrid extends StatefulWidget {
   final double margin;
   final double margin;
   final bool showStorageIndicator;
   final bool showStorageIndicator;
   final ImmichAssetGridSelectionListener? listener;
   final ImmichAssetGridSelectionListener? listener;
+  final bool selectionActive;
 
 
   ImmichAssetGrid({
   ImmichAssetGrid({
     super.key,
     super.key,
@@ -252,6 +255,7 @@ class ImmichAssetGrid extends StatefulWidget {
     required this.showStorageIndicator,
     required this.showStorageIndicator,
     this.listener,
     this.listener,
     this.margin = 5.0,
     this.margin = 5.0,
+    this.selectionActive = false
   });
   });
 
 
   @override
   @override

+ 3 - 0
mobile/lib/modules/home/views/home_page.dart

@@ -48,10 +48,12 @@ class HomePage extends HookConsumerWidget {
 
 
       void onShareAssets() {
       void onShareAssets() {
         ref.watch(shareServiceProvider).shareAssets(selection.value.toList());
         ref.watch(shareServiceProvider).shareAssets(selection.value.toList());
+        multiselectEnabled.value = false;
       }
       }
 
 
       void onDelete() {
       void onDelete() {
         ref.watch(assetProvider.notifier).deleteAssets(selection.value);
         ref.watch(assetProvider.notifier).deleteAssets(selection.value);
+        multiselectEnabled.value = false;
       }
       }
 
 
       return SafeArea(
       return SafeArea(
@@ -82,6 +84,7 @@ class HomePage extends HookConsumerWidget {
                 showStorageIndicator: appSettingService
                 showStorageIndicator: appSettingService
                     .getSetting(AppSettingsEnum.storageIndicator),
                     .getSetting(AppSettingsEnum.storageIndicator),
                 listener: selectionListener,
                 listener: selectionListener,
+                selectionActive: multiselectEnabled.value,
               ),
               ),
             ),
             ),
             if (multiselectEnabled.value) ...[
             if (multiselectEnabled.value) ...[