locations_single_photo_controller.dart 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import 'package:clean/base/base_controller.dart';
  2. import 'package:clean/data/bean/photos_type.dart';
  3. import 'package:clean/module/image_picker/image_picker_util.dart';
  4. import 'package:clean/module/locations_photo/locations_photo_controller.dart';
  5. import 'package:clean/module/people_photo/photo_group.dart';
  6. import 'package:clean/module/photo_preview/photo_preview_view.dart';
  7. import 'package:get/get.dart';
  8. import 'package:wechat_assets_picker/wechat_assets_picker.dart';
  9. class LocationsSinglePhotoController extends BaseController {
  10. late final PhotoGroup photoGroup;
  11. final RxInt selectedFileCount = 0.obs;
  12. final RxList<PhotoGroup> photoGroups = <PhotoGroup>[].obs;
  13. final RxDouble selectedFilesSize = 0.0.obs;
  14. @override
  15. void onInit() {
  16. // TODO: implement onInit
  17. super.onInit();
  18. _getArgs();
  19. loadLocationsSinglePhoto();
  20. restoreSelections();
  21. }
  22. void clickImage(String location, int imageIndex) {
  23. final group = getGroupByLocation(location);
  24. final image = group.images[imageIndex];
  25. PhotoPreviewPage.start(PhotosType.locationPhotos, image.id);
  26. }
  27. void toggleImageSelection(String groupTitle, int imageIndex) {
  28. final group = getGroupByLocation(groupTitle);
  29. final image = group.images[imageIndex];
  30. final selected = !group.selectedImages[imageIndex];
  31. group.selectedImages[imageIndex] = selected;
  32. _updateSelectedScreenshotsPhotosIds(image.id, selected);
  33. group.isSelected.value = group.selectedImages.every((selected) => selected);
  34. updateSelectedFilesSize();
  35. selectedFileCount.value = ImagePickerUtil.selectedLocationPhotosIds.length;
  36. }
  37. Future<void> updateSelectedFilesSize() async {
  38. double totalSize = 0;
  39. for (var id in ImagePickerUtil.selectedLocationPhotosIds) {
  40. final entity = await AssetEntity.fromId(id);
  41. if (entity != null) {
  42. final file = await entity.file;
  43. if (file != null) {
  44. totalSize += await file.length();
  45. }
  46. }
  47. }
  48. selectedFilesSize.value = totalSize / 1024; // Convert to KB
  49. }
  50. void _updateSelectedScreenshotsPhotosIds(String photoId, bool isSelected) {
  51. if (isSelected) {
  52. ImagePickerUtil.selectedLocationPhotosIds.add(photoId);
  53. } else {
  54. ImagePickerUtil.selectedLocationPhotosIds.remove(photoId);
  55. }
  56. }
  57. // 获取参数
  58. void _getArgs() {
  59. photoGroup = parameters?['PhotoGroup'];
  60. }
  61. void loadLocationsSinglePhoto() {
  62. photoGroups.clear();
  63. photoGroups.add(photoGroup);
  64. }
  65. void restoreSelections() async {
  66. final selectedIds = ImagePickerUtil.selectedLocationPhotosIds.toSet();
  67. for (var group in photoGroups) {
  68. for (int i = 0; i < group.images.length; i++) {
  69. group.selectedImages[i] = selectedIds.contains(group.images[i].id);
  70. }
  71. group.isSelected.value = group.selectedImages.every((selected) => selected);
  72. }
  73. await updateSelectedFilesSize();
  74. selectedFileCount.value = selectedIds.length;
  75. }
  76. void toggleGroupSelection(String location) {
  77. final group = getGroupByLocation(location);
  78. final newValue = !group.isSelected.value;
  79. group.toggleSelectAll(newValue);
  80. for (var image in group.images) {
  81. _updateSelectedScreenshotsPhotosIds(image.id, newValue);
  82. }
  83. updateSelectedFilesSize();
  84. selectedFileCount.value = ImagePickerUtil.selectedLocationPhotosIds.length;
  85. }
  86. // 通过标题获取照片组
  87. PhotoGroup _getGroupByTitle(String groupTitle) {
  88. return photoGroups.firstWhere((g) => g.title == groupTitle);
  89. }
  90. // 通过位置获取照片组
  91. PhotoGroup getGroupByLocation(String? location) {
  92. return photoGroups.firstWhere((group) => group.location == location);
  93. }
  94. }