2022-09-23 06:16:16 +00:00
|
|
|
import 'package:collection/collection.dart' show IterableExtension;
|
2020-07-15 20:29:29 +00:00
|
|
|
import 'package:flutter/foundation.dart';
|
2022-11-18 11:56:39 +00:00
|
|
|
import 'package:photos/core/event_bus.dart';
|
2022-11-19 11:36:16 +00:00
|
|
|
import 'package:photos/events/clear_selections_event.dart';
|
2020-07-15 20:29:29 +00:00
|
|
|
import 'package:photos/models/file.dart';
|
|
|
|
|
|
|
|
class SelectedFiles extends ChangeNotifier {
|
2021-07-22 18:41:58 +00:00
|
|
|
final files = <File>{};
|
|
|
|
final lastSelections = <File>{};
|
2020-07-15 20:29:29 +00:00
|
|
|
|
|
|
|
void toggleSelection(File file) {
|
2022-06-29 09:41:20 +00:00
|
|
|
// To handle the cases, where the file might have changed due to upload
|
|
|
|
// or any other update, using file.generatedID to track if this file was already
|
|
|
|
// selected or not
|
2022-09-23 06:16:16 +00:00
|
|
|
final File? alreadySelected = files.firstWhereOrNull(
|
2022-06-29 09:41:20 +00:00
|
|
|
(element) => element.generatedID == file.generatedID,
|
|
|
|
);
|
|
|
|
if (alreadySelected != null) {
|
|
|
|
files.remove(alreadySelected);
|
2020-07-15 20:29:29 +00:00
|
|
|
} else {
|
|
|
|
files.add(file);
|
|
|
|
}
|
2021-05-02 11:19:05 +00:00
|
|
|
lastSelections.clear();
|
2022-06-29 09:43:22 +00:00
|
|
|
lastSelections.add(file);
|
2022-11-14 04:34:22 +00:00
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
|
|
|
|
void selectAll(Set<File> selectedFiles) {
|
|
|
|
files.addAll(selectedFiles);
|
|
|
|
lastSelections.clear();
|
|
|
|
lastSelections.addAll(selectedFiles);
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
|
|
|
|
void unSelectAll(Set<File> selectedFiles) {
|
|
|
|
files.removeAll(selectedFiles);
|
|
|
|
lastSelections.clear();
|
2020-07-15 20:29:29 +00:00
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
|
2022-06-29 09:41:20 +00:00
|
|
|
bool isFileSelected(File file) {
|
2022-09-23 06:16:16 +00:00
|
|
|
final File? alreadySelected = files.firstWhereOrNull(
|
2022-06-29 09:41:20 +00:00
|
|
|
(element) => element.generatedID == file.generatedID,
|
|
|
|
);
|
|
|
|
return alreadySelected != null;
|
|
|
|
}
|
|
|
|
|
2022-11-14 12:53:03 +00:00
|
|
|
bool isPartOfLastSelected(File file) {
|
|
|
|
final File? matchedFile = lastSelections.firstWhereOrNull(
|
2022-06-29 09:41:20 +00:00
|
|
|
(element) => element.generatedID == file.generatedID,
|
|
|
|
);
|
2022-11-14 12:53:03 +00:00
|
|
|
return matchedFile != null;
|
2022-06-29 09:41:20 +00:00
|
|
|
}
|
|
|
|
|
2020-07-15 20:29:29 +00:00
|
|
|
void clearAll() {
|
2022-11-19 11:36:16 +00:00
|
|
|
Bus.instance.fire(ClearSelectionsEvent());
|
2021-05-02 11:19:05 +00:00
|
|
|
lastSelections.addAll(files);
|
2020-07-15 20:29:29 +00:00
|
|
|
files.clear();
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
}
|