selected_files.dart 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. class SelectedFiles extends ChangeNotifier {
  7. final files = <File>{};
  8. final lastSelections = <File>{};
  9. void toggleSelection(File file) {
  10. // To handle the cases, where the file might have changed due to upload
  11. // or any other update, using file.generatedID to track if this file was already
  12. // selected or not
  13. final File? alreadySelected = files.firstWhereOrNull(
  14. (element) => _isMatch(file, element),
  15. );
  16. if (alreadySelected != null) {
  17. files.remove(alreadySelected);
  18. } else {
  19. files.add(file);
  20. }
  21. lastSelections.clear();
  22. lastSelections.add(file);
  23. notifyListeners();
  24. }
  25. void selectAll(Set<File> selectedFiles) {
  26. files.addAll(selectedFiles);
  27. lastSelections.clear();
  28. lastSelections.addAll(selectedFiles);
  29. notifyListeners();
  30. }
  31. void unSelectAll(Set<File> selectedFiles, {bool skipNotify = false}) {
  32. files.removeWhere((file) => selectedFiles.contains(file));
  33. lastSelections.clear();
  34. if (!skipNotify) {
  35. notifyListeners();
  36. }
  37. }
  38. bool isFileSelected(File file) {
  39. final File? alreadySelected = files.firstWhereOrNull(
  40. (element) => _isMatch(file, element),
  41. );
  42. return alreadySelected != null;
  43. }
  44. bool isPartOfLastSelected(File file) {
  45. final File? matchedFile = lastSelections.firstWhereOrNull(
  46. (element) => _isMatch(file, element),
  47. );
  48. return matchedFile != null;
  49. }
  50. bool _isMatch(File first, File second) {
  51. if (first.generatedID != null && second.generatedID != null) {
  52. if (first.generatedID == second.generatedID) {
  53. return true;
  54. }
  55. } else if (first.uploadedFileID != null && second.uploadedFileID != null) {
  56. return first.uploadedFileID == second.uploadedFileID;
  57. }
  58. return false;
  59. }
  60. void clearAll() {
  61. Bus.instance.fire(ClearSelectionsEvent());
  62. lastSelections.addAll(files);
  63. files.clear();
  64. notifyListeners();
  65. }
  66. }