ashilkn 2 éve
szülő
commit
d2daa0bf21

+ 1 - 123
lib/ui/components/bottom_action_bar/bottom_action_bar_widget.dart

@@ -1,16 +1,12 @@
 import 'dart:ui';
 
 import 'package:expandable/expandable.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:photos/models/selected_files.dart';
 import 'package:photos/theme/effects.dart';
 import 'package:photos/theme/ente_theme.dart';
 import 'package:photos/ui/components/bottom_action_bar/action_bar_widget.dart';
 import 'package:photos/ui/components/icon_button_widget.dart';
-import 'package:photos/utils/delete_file_util.dart';
-import 'package:photos/utils/share_util.dart';
-import 'package:photos/utils/toast_util.dart';
 
 class BottomActionBarWidget extends StatelessWidget {
   final String? text;
@@ -18,7 +14,6 @@ class BottomActionBarWidget extends StatelessWidget {
   final Widget expandedMenu;
   final SelectedFiles? selectedFiles;
   final VoidCallback? onCancel;
-  final GlobalKey shareButtonKey = GlobalKey();
 
   BottomActionBarWidget({
     required this.expandedMenu,
@@ -104,130 +99,13 @@ class BottomActionBarWidget extends StatelessWidget {
 
   List<Widget> _iconButtons(BuildContext context) {
     final iconButtonsWithExpansionIcon = <Widget?>[
-      IconButtonWidget(
-        icon: Icons.delete_outlined,
-        iconButtonType: IconButtonType.primary,
-        onTap: () => _showDeleteSheet(context),
-      ),
-      IconButtonWidget(
-        icon: Icons.ios_share_outlined,
-        iconButtonType: IconButtonType.primary,
-        onTap: () => _shareSelected(context),
-      ),
+      ...?iconButtons,
       ExpansionIconWidget(expandableController: _expandableController)
     ];
     iconButtonsWithExpansionIcon.removeWhere((element) => element == null);
     return iconButtonsWithExpansionIcon as List<Widget>;
   }
 
-  void _showDeleteSheet(BuildContext context) {
-    final count = selectedFiles!.files.length;
-    bool containsUploadedFile = false, containsLocalFile = false;
-    for (final file in selectedFiles!.files) {
-      if (file.uploadedFileID != null) {
-        containsUploadedFile = true;
-      }
-      if (file.localID != null) {
-        containsLocalFile = true;
-      }
-    }
-    final actions = <Widget>[];
-    if (containsUploadedFile && containsLocalFile) {
-      actions.add(
-        CupertinoActionSheetAction(
-          isDestructiveAction: true,
-          onPressed: () async {
-            Navigator.of(context, rootNavigator: true).pop();
-            await deleteFilesOnDeviceOnly(
-              context,
-              selectedFiles!.files.toList(),
-            );
-            _clearSelectedFiles();
-            showToast(context, "Files deleted from device");
-          },
-          child: const Text("Device"),
-        ),
-      );
-      actions.add(
-        CupertinoActionSheetAction(
-          isDestructiveAction: true,
-          onPressed: () async {
-            Navigator.of(context, rootNavigator: true).pop();
-            await deleteFilesFromRemoteOnly(
-              context,
-              selectedFiles!.files.toList(),
-            );
-            _clearSelectedFiles();
-            showShortToast(context, "Moved to trash");
-          },
-          child: const Text("ente"),
-        ),
-      );
-      actions.add(
-        CupertinoActionSheetAction(
-          isDestructiveAction: true,
-          onPressed: () async {
-            Navigator.of(context, rootNavigator: true).pop();
-            await deleteFilesFromEverywhere(
-              context,
-              selectedFiles!.files.toList(),
-            );
-            _clearSelectedFiles();
-          },
-          child: const Text("Everywhere"),
-        ),
-      );
-    } else {
-      actions.add(
-        CupertinoActionSheetAction(
-          isDestructiveAction: true,
-          onPressed: () async {
-            Navigator.of(context, rootNavigator: true).pop();
-            await deleteFilesFromEverywhere(
-              context,
-              selectedFiles!.files.toList(),
-            );
-            _clearSelectedFiles();
-          },
-          child: const Text("Delete"),
-        ),
-      );
-    }
-    final action = CupertinoActionSheet(
-      title: Text(
-        "Delete " +
-            count.toString() +
-            " file" +
-            (count == 1 ? "" : "s") +
-            (containsUploadedFile && containsLocalFile ? " from" : "?"),
-      ),
-      actions: actions,
-      cancelButton: CupertinoActionSheetAction(
-        child: const Text("Cancel"),
-        onPressed: () {
-          Navigator.of(context, rootNavigator: true).pop();
-        },
-      ),
-    );
-    showCupertinoModalPopup(
-      context: context,
-      builder: (_) => action,
-      barrierColor: Colors.black.withOpacity(0.75),
-    );
-  }
-
-  void _shareSelected(BuildContext context) {
-    share(
-      context,
-      selectedFiles!.files.toList(),
-      shareButtonKey: shareButtonKey,
-    );
-  }
-
-  void _clearSelectedFiles() {
-    selectedFiles!.clearAll();
-  }
-
   ExpandableThemeData _getExpandableTheme() {
     return const ExpandableThemeData(
       hasIcon: false,

+ 20 - 0
lib/ui/viewer/gallery/collection_page.dart

@@ -14,9 +14,12 @@ import 'package:photos/theme/ente_theme.dart';
 import 'package:photos/ui/components/blur_menu_item_widget.dart';
 import 'package:photos/ui/components/bottom_action_bar/bottom_action_bar_widget.dart';
 import 'package:photos/ui/components/bottom_action_bar/expanded_menu_widget.dart';
+import 'package:photos/ui/components/icon_button_widget.dart';
 import 'package:photos/ui/viewer/gallery/empty_state.dart';
 import 'package:photos/ui/viewer/gallery/gallery.dart';
 import 'package:photos/ui/viewer/gallery/gallery_app_bar_widget.dart';
+import 'package:photos/utils/delete_file_util.dart';
+import 'package:photos/utils/share_util.dart';
 
 class CollectionPage extends StatefulWidget {
   final CollectionWithThumbnail c;
@@ -38,6 +41,7 @@ class CollectionPage extends StatefulWidget {
 
 class _CollectionPageState extends State<CollectionPage> {
   final _selectedFiles = SelectedFiles();
+  final GlobalKey shareButtonKey = GlobalKey();
 
   final ValueNotifier<double> _bottomPosition = ValueNotifier(-150.0);
   @override
@@ -140,6 +144,22 @@ class _CollectionPageState extends State<CollectionPage> {
                       _selectedFiles.clearAll();
                     }
                   },
+                  iconButtons: [
+                    IconButtonWidget(
+                      icon: Icons.delete_outlined,
+                      iconButtonType: IconButtonType.primary,
+                      onTap: () => showDeleteSheet(context, _selectedFiles),
+                    ),
+                    IconButtonWidget(
+                      icon: Icons.ios_share_outlined,
+                      iconButtonType: IconButtonType.primary,
+                      onTap: () => shareSelected(
+                        context,
+                        shareButtonKey,
+                        _selectedFiles,
+                      ),
+                    ),
+                  ],
                 ),
               );
             },

+ 99 - 0
lib/utils/delete_file_util.dart

@@ -6,6 +6,7 @@ import 'dart:io';
 import 'dart:math';
 
 import 'package:device_info/device_info.dart';
+import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:logging/logging.dart';
 import 'package:photo_manager/photo_manager.dart';
@@ -16,6 +17,7 @@ import 'package:photos/events/collection_updated_event.dart';
 import 'package:photos/events/files_updated_event.dart';
 import 'package:photos/events/local_photos_updated_event.dart';
 import 'package:photos/models/file.dart';
+import 'package:photos/models/selected_files.dart';
 import 'package:photos/models/trash_item_request.dart';
 import 'package:photos/services/remote_sync_service.dart';
 import 'package:photos/services/sync_service.dart';
@@ -485,3 +487,100 @@ Future<bool> shouldProceedWithDeletion(BuildContext context) async {
   );
   return choice == DialogUserChoice.secondChoice;
 }
+
+void showDeleteSheet(BuildContext context, SelectedFiles selectedFiles) {
+  final count = selectedFiles.files.length;
+  bool containsUploadedFile = false, containsLocalFile = false;
+  for (final file in selectedFiles.files) {
+    if (file.uploadedFileID != null) {
+      containsUploadedFile = true;
+    }
+    if (file.localID != null) {
+      containsLocalFile = true;
+    }
+  }
+  final actions = <Widget>[];
+  if (containsUploadedFile && containsLocalFile) {
+    actions.add(
+      CupertinoActionSheetAction(
+        isDestructiveAction: true,
+        onPressed: () async {
+          Navigator.of(context, rootNavigator: true).pop();
+          await deleteFilesOnDeviceOnly(
+            context,
+            selectedFiles.files.toList(),
+          );
+          selectedFiles.clearAll();
+          showToast(context, "Files deleted from device");
+        },
+        child: const Text("Device"),
+      ),
+    );
+    actions.add(
+      CupertinoActionSheetAction(
+        isDestructiveAction: true,
+        onPressed: () async {
+          Navigator.of(context, rootNavigator: true).pop();
+          await deleteFilesFromRemoteOnly(
+            context,
+            selectedFiles.files.toList(),
+          );
+          selectedFiles.clearAll();
+
+          showShortToast(context, "Moved to trash");
+        },
+        child: const Text("ente"),
+      ),
+    );
+    actions.add(
+      CupertinoActionSheetAction(
+        isDestructiveAction: true,
+        onPressed: () async {
+          Navigator.of(context, rootNavigator: true).pop();
+          await deleteFilesFromEverywhere(
+            context,
+            selectedFiles.files.toList(),
+          );
+          selectedFiles.clearAll();
+        },
+        child: const Text("Everywhere"),
+      ),
+    );
+  } else {
+    actions.add(
+      CupertinoActionSheetAction(
+        isDestructiveAction: true,
+        onPressed: () async {
+          Navigator.of(context, rootNavigator: true).pop();
+          await deleteFilesFromEverywhere(
+            context,
+            selectedFiles.files.toList(),
+          );
+          selectedFiles.clearAll();
+        },
+        child: const Text("Delete"),
+      ),
+    );
+  }
+  final action = CupertinoActionSheet(
+    title: Text(
+      "Delete " +
+          count.toString() +
+          " file" +
+          (count == 1 ? "" : "s") +
+          (containsUploadedFile && containsLocalFile ? " from" : "?"),
+    ),
+    actions: actions,
+    cancelButton: CupertinoActionSheetAction(
+      child: const Text("Cancel"),
+      onPressed: () {
+        Navigator.of(context, rootNavigator: true).pop();
+      },
+    ),
+  );
+  showCupertinoModalPopup(
+    context: context,
+    builder: (_) => action,
+    barrierColor: Colors.black.withOpacity(0.75),
+  );
+}

+ 10 - 0
lib/utils/share_util.dart

@@ -10,6 +10,7 @@ import 'package:photos/core/configuration.dart';
 import 'package:photos/core/constants.dart';
 import 'package:photos/models/file.dart';
 import 'package:photos/models/file_type.dart';
+import 'package:photos/models/selected_files.dart';
 import 'package:photos/utils/date_time_util.dart';
 import 'package:photos/utils/dialog_util.dart';
 import 'package:photos/utils/exif_util.dart';
@@ -131,3 +132,12 @@ DateTime parseDateFromFileNam1e(String fileName) {
     );
   }
 }
+
+void shareSelected(BuildContext context, GlobalKey shareButtonKey,
+    SelectedFiles selectedFiles) {
+  share(
+    context,
+    selectedFiles.files.toList(),
+    shareButtonKey: shareButtonKey,
+  );
+}