selected_files.dart 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import 'package:collection/collection.dart' show IterableExtension;
  2. import 'package:flutter/foundation.dart';
  3. import 'package:photos/core/event_bus.dart';
  4. import 'package:photos/events/clear_selections_event.dart';
  5. import 'package:photos/models/file.dart';
  6. import 'package:photos/models/selected_file_breakup.dart';
  7. class SelectedFiles extends ChangeNotifier {
  8. final files = <File>{};
  9. final lastSelections = <File>{};
  10. void toggleSelection(File file) {
  11. // To handle the cases, where the file might have changed due to upload
  12. // or any other update, using file.generatedID to track if this file was already
  13. // selected or not
  14. final File? alreadySelected = files.firstWhereOrNull(
  15. (element) => element.generatedID == file.generatedID,
  16. );
  17. if (alreadySelected != null) {
  18. files.remove(alreadySelected);
  19. } else {
  20. files.add(file);
  21. }
  22. lastSelections.clear();
  23. lastSelections.add(file);
  24. notifyListeners();
  25. }
  26. void selectAll(Set<File> selectedFiles) {
  27. files.addAll(selectedFiles);
  28. lastSelections.clear();
  29. lastSelections.addAll(selectedFiles);
  30. notifyListeners();
  31. }
  32. void unSelectAll(Set<File> selectedFiles) {
  33. files.removeAll(selectedFiles);
  34. lastSelections.clear();
  35. notifyListeners();
  36. }
  37. bool isFileSelected(File file) {
  38. final File? alreadySelected = files.firstWhereOrNull(
  39. (element) => element.generatedID == file.generatedID,
  40. );
  41. return alreadySelected != null;
  42. }
  43. bool isPartOfLastSelected(File file) {
  44. final File? matchedFile = lastSelections.firstWhereOrNull(
  45. (element) => element.generatedID == file.generatedID,
  46. );
  47. return matchedFile != null;
  48. }
  49. SelectedFileSplit split(int currentUseID) {
  50. final List<File> ownedByCurrentUser = [],
  51. ownedByOtherUsers = [],
  52. pendingUploads = [];
  53. for (var f in files) {
  54. if (f.ownerID == null || f.uploadedFileID == null) {
  55. pendingUploads.add(f);
  56. } else if (f.ownerID == currentUseID) {
  57. ownedByCurrentUser.add(f);
  58. } else {
  59. ownedByOtherUsers.add(f);
  60. }
  61. }
  62. return SelectedFileSplit(
  63. pendingUploads: pendingUploads,
  64. ownedByCurrentUser: ownedByCurrentUser,
  65. ownedByOtherUsers: ownedByOtherUsers,
  66. );
  67. }
  68. void clearAll() {
  69. Bus.instance.fire(ClearSelectionsEvent());
  70. lastSelections.addAll(files);
  71. files.clear();
  72. notifyListeners();
  73. }
  74. }