gallery_app_bar_widget.dart 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:myapp/db/db_helper.dart';
  4. import 'package:myapp/models/photo.dart';
  5. import 'package:myapp/photo_loader.dart';
  6. import 'package:photo_manager/photo_manager.dart';
  7. import 'package:provider/provider.dart';
  8. import 'package:myapp/utils/share_util.dart';
  9. class GalleryAppBarWidget extends StatefulWidget
  10. implements PreferredSizeWidget {
  11. final String title;
  12. final Set<Photo> selectedPhotos;
  13. final Function() onSelectionClear;
  14. final Function(List<Photo>) onPhotosDeleted;
  15. GalleryAppBarWidget(this.title, this.selectedPhotos,
  16. {this.onSelectionClear, this.onPhotosDeleted});
  17. @override
  18. _GalleryAppBarWidgetState createState() => _GalleryAppBarWidgetState();
  19. @override
  20. Size get preferredSize => Size.fromHeight(60.0);
  21. }
  22. class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
  23. PhotoLoader get photoLoader => Provider.of<PhotoLoader>(context);
  24. @override
  25. Widget build(BuildContext context) {
  26. if (widget.selectedPhotos.isEmpty) {
  27. return AppBar(title: Text(widget.title));
  28. }
  29. return AppBar(
  30. leading: IconButton(
  31. icon: Icon(Icons.close),
  32. onPressed: () {
  33. _clearSelectedPhotos();
  34. },
  35. ),
  36. title: Text(widget.selectedPhotos.length.toString()),
  37. actions: _getActions(context),
  38. );
  39. }
  40. List<Widget> _getActions(BuildContext context) {
  41. List<Widget> actions = List<Widget>();
  42. if (widget.selectedPhotos.isNotEmpty) {
  43. actions.add(IconButton(
  44. icon: Icon(Icons.delete),
  45. onPressed: () {
  46. _showDeletePhotosSheet(context);
  47. },
  48. ));
  49. actions.add(IconButton(
  50. icon: Icon(Icons.share),
  51. onPressed: () {
  52. _shareSelectedPhotos(context);
  53. },
  54. ));
  55. }
  56. return actions;
  57. }
  58. void _shareSelectedPhotos(BuildContext context) {
  59. shareMultiple(widget.selectedPhotos.toList());
  60. }
  61. void _showDeletePhotosSheet(BuildContext context) {
  62. final action = CupertinoActionSheet(
  63. actions: <Widget>[
  64. CupertinoActionSheetAction(
  65. child: Text("Delete on device"),
  66. isDestructiveAction: true,
  67. onPressed: () async {
  68. await _deleteSelectedPhotos(context, false);
  69. },
  70. ),
  71. CupertinoActionSheetAction(
  72. child: Text("Delete everywhere [WiP]"),
  73. isDestructiveAction: true,
  74. onPressed: () async {
  75. await _deleteSelectedPhotos(context, true);
  76. },
  77. )
  78. ],
  79. cancelButton: CupertinoActionSheetAction(
  80. child: Text("Cancel"),
  81. onPressed: () {
  82. Navigator.of(context, rootNavigator: true).pop();
  83. },
  84. ),
  85. );
  86. showCupertinoModalPopup(context: context, builder: (_) => action);
  87. }
  88. Future _deleteSelectedPhotos(
  89. BuildContext context, bool deleteEverywhere) async {
  90. await PhotoManager.editor
  91. .deleteWithIds(widget.selectedPhotos.map((p) => p.localId).toList());
  92. for (Photo photo in widget.selectedPhotos) {
  93. deleteEverywhere
  94. ? await DatabaseHelper.instance.markPhotoForDeletion(photo)
  95. : await DatabaseHelper.instance.deletePhoto(photo);
  96. }
  97. Navigator.of(context, rootNavigator: true).pop();
  98. photoLoader.reloadPhotos();
  99. if (widget.onPhotosDeleted != null) {
  100. widget.onPhotosDeleted(widget.selectedPhotos.toList());
  101. }
  102. _clearSelectedPhotos();
  103. }
  104. void _clearSelectedPhotos() {
  105. setState(() {
  106. widget.selectedPhotos.clear();
  107. });
  108. if (widget.onSelectionClear != null) {
  109. widget.onSelectionClear();
  110. }
  111. }
  112. }