Add option to save the collage

This commit is contained in:
vishnukvmd 2023-05-26 15:38:24 +05:30
parent acbd396e23
commit ca82d9ec1d
6 changed files with 85 additions and 3 deletions

View file

@ -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":

View file

@ -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(

View file

@ -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",

View file

@ -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();
}

View file

@ -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:

View file

@ -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