Ver código fonte

Add option to save the collage

vishnukvmd 2 anos atrás
pai
commit
ca82d9ec1d

+ 3 - 0
lib/generated/intl/messages_en.dart

@@ -385,6 +385,8 @@ class MessageLookup extends MessageLookupByLibrary {
         "collaboratorsCanAddPhotosAndVideosToTheSharedAlbum":
             MessageLookupByLibrary.simpleMessage(
                 "Collaborators can add photos and videos to the shared album."),
+        "collageSaved":
+            MessageLookupByLibrary.simpleMessage("Collage saved to gallery"),
         "collectEventPhotos":
             MessageLookupByLibrary.simpleMessage("Collect event photos"),
         "collectPhotos": MessageLookupByLibrary.simpleMessage("Collect photos"),
@@ -988,6 +990,7 @@ class MessageLookup extends MessageLookupByLibrary {
         "rotateRight": MessageLookupByLibrary.simpleMessage("Rotate right"),
         "safelyStored": MessageLookupByLibrary.simpleMessage("Safely stored"),
         "save": MessageLookupByLibrary.simpleMessage("Save"),
+        "saveCollage": MessageLookupByLibrary.simpleMessage("Save collage"),
         "saveCopy": MessageLookupByLibrary.simpleMessage("Save copy"),
         "saveKey": MessageLookupByLibrary.simpleMessage("Save key"),
         "saveYourRecoveryKeyIfYouHaventAlready":

+ 20 - 0
lib/generated/l10n.dart

@@ -4865,6 +4865,26 @@ class S {
     );
   }
 
+  /// `Save collage`
+  String get saveCollage {
+    return Intl.message(
+      'Save collage',
+      name: 'saveCollage',
+      desc: '',
+      args: [],
+    );
+  }
+
+  /// `Collage saved to gallery`
+  String get collageSaved {
+    return Intl.message(
+      'Collage saved to gallery',
+      name: 'collageSaved',
+      desc: '',
+      args: [],
+    );
+  }
+
   /// `Add to ente`
   String get addToEnte {
     return Intl.message(

+ 2 - 0
lib/l10n/intl_en.arb

@@ -688,6 +688,8 @@
   "removeFromFavorite": "Remove from favorite",
   "shareLink": "Share link",
   "createCollage": "Create collage",
+  "saveCollage": "Save collage",
+  "collageSaved": "Collage saved to gallery",
   "addToEnte": "Add to ente",
   "addToAlbum": "Add to album",
   "delete": "Delete",

+ 51 - 3
lib/ui/tools/create_collage_page.dart

@@ -1,9 +1,18 @@
 import "package:flutter/material.dart";
 import "package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart";
 import "package:logging/logging.dart";
+import "package:photo_manager/photo_manager.dart";
+import "package:photos/core/event_bus.dart";
+import "package:photos/db/files_db.dart";
+import "package:photos/events/local_photos_updated_event.dart";
 import "package:photos/generated/l10n.dart";
 import "package:photos/models/file.dart";
+import "package:photos/services/sync_service.dart";
+import "package:photos/ui/viewer/file/detail_page.dart";
 import "package:photos/ui/viewer/file/zoomable_image.dart";
+import "package:photos/utils/navigation_util.dart";
+import "package:photos/utils/toast_util.dart";
+import "package:widgets_to_image/widgets_to_image.dart";
 
 class CreateCollagePage extends StatefulWidget {
   final List<File> files;
@@ -16,6 +25,7 @@ class CreateCollagePage extends StatefulWidget {
 
 class _CreateCollagePageState extends State<CreateCollagePage> {
   final _logger = Logger("CreateCollagePage");
+  final _widgetsToImageController = WidgetsToImageController();
   bool _isLayoutVertical = false;
 
   @override
@@ -35,9 +45,10 @@ class _CreateCollagePageState extends State<CreateCollagePage> {
   Widget _getBody() {
     return Column(
       children: [
-        _isLayoutVertical
-            ? VerticalSplit(widget.files[0], widget.files[1])
-            : HorizontalSplit(widget.files[0], widget.files[1]),
+        WidgetsToImage(
+          controller: _widgetsToImageController,
+          child: _getCollage(),
+        ),
         const SizedBox(
           height: 24,
         ),
@@ -61,11 +72,48 @@ class _CreateCollagePageState extends State<CreateCollagePage> {
               },
             )
           ],
+        ),
+        const SizedBox(
+          height: 24,
+        ),
+        TextButton(
+          onPressed: _onSaveClicked,
+          child: Text(S.of(context).saveCollage),
         )
       ],
     );
   }
 
+  Future<void> _onSaveClicked() async {
+    final bytes = await _widgetsToImageController.capture();
+    final fileName = "ente_collage_" +
+        DateTime.now().microsecondsSinceEpoch.toString() +
+        ".jpeg";
+    //Disabling notifications for assets changing to insert the file into
+    //files db before triggering a sync.
+    PhotoManager.stopChangeNotify();
+    final AssetEntity? newAsset =
+        await (PhotoManager.editor.saveImage(bytes!, title: fileName));
+    final newFile = await File.fromAsset('', newAsset!);
+    newFile.generatedID = await FilesDB.instance.insert(newFile);
+    Bus.instance
+        .fire(LocalPhotosUpdatedEvent([newFile], source: "collageSave"));
+    SyncService.instance.sync();
+    showShortToast(context, S.of(context).collageSaved);
+    replacePage(
+      context,
+      DetailPage(
+        DetailPageConfiguration([newFile], null, 0, "collage"),
+      ),
+    );
+  }
+
+  Widget _getCollage() {
+    return _isLayoutVertical
+        ? VerticalSplit(widget.files[0], widget.files[1])
+        : HorizontalSplit(widget.files[0], widget.files[1]);
+  }
+
   Widget _getGrid() {
     return const TestGrid();
   }

+ 8 - 0
pubspec.lock

@@ -2121,6 +2121,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.2.0"
+  widgets_to_image:
+    dependency: "direct main"
+    description:
+      name: widgets_to_image
+      sha256: e32c7b77267c01d319dc97333d4f3d894e9d81c8b3a408fd33862fa7775ee398
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.0.2"
   win32:
     dependency: transitive
     description:

+ 1 - 0
pubspec.yaml

@@ -130,6 +130,7 @@ dependencies:
   visibility_detector: ^0.3.3
   wakelock: ^0.6.1+2
   wallpaper_manager_flutter: ^0.0.2
+  widgets_to_image: ^0.0.2
 
 flutter_intl:
     enabled: true