similar_photo_controller.dart 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import 'dart:io';
  2. import 'package:clean/base/base_controller.dart';
  3. import 'package:clean/base/base_photo_controller.dart';
  4. import 'package:clean/data/bean/photos_type.dart';
  5. import 'package:clean/data/repositories/user_repository.dart';
  6. import 'package:clean/dialog/photo_delete_finish_dialog.dart';
  7. import 'package:clean/dialog/photo_deleting_dialog.dart';
  8. import 'package:clean/handler/event_handler.dart';
  9. import 'package:clean/module/image_picker/image_picker_util.dart';
  10. import 'package:clean/module/people_photo/photo_group.dart';
  11. import 'package:clean/module/photo_preview/photo_preview_view.dart';
  12. import 'package:clean/module/store/store_view.dart';
  13. import 'package:clean/utils/toast_util.dart';
  14. import 'package:flutter/Material.dart';
  15. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  16. import 'package:get/get.dart';
  17. import 'package:wechat_assets_picker/wechat_assets_picker.dart';
  18. import '../../data/consts/event_report_id.dart';
  19. import '../../utils/file_size_calculator_util.dart';
  20. import '../photo_preview/phtoto_selected_preview_view.dart';
  21. class SimilarPhotoController extends BasePhotoController {
  22. @override
  23. void loadPhotos() {
  24. photoGroups.clear();
  25. photoGroups.addAll(
  26. ImagePickerUtil.similarPhotos.where((group) => group.isNotEmpty).map(
  27. (group) {
  28. return PhotoGroup(
  29. isSelected: true,
  30. images: group,
  31. );
  32. },
  33. ),
  34. );
  35. for (var group in photoGroups) {
  36. for (int i = 0; i < group.images.length; i++) {
  37. group.selectedImages[i] = i == 0 ? false : true;
  38. updateSelectedPhotosIds(group.images[i].id, i != 0);
  39. }
  40. }
  41. ImagePickerUtil.selectedSimilarPhotosIds.assignAll(selectedPhotosIds);
  42. }
  43. // 点击删除单组选中的图片
  44. void clickSingleGroupDelete(List<AssetEntity> images) async {
  45. EventHandler.report(EventId.event_03007);
  46. if (userRepository.isVip()) {
  47. // 获取指定组
  48. final group = getGroupByImages(images);
  49. // 获取该组中所有选中的图片
  50. final selectedImages = group.images
  51. .where((image) => group.selectedImages[group.images.indexOf(image)])
  52. .toList();
  53. if (selectedImages.isEmpty) {
  54. ToastUtil.show('Please select the photo to delete');
  55. return;
  56. }
  57. photoDeletingDialog();
  58. try {
  59. // 执行删除操作
  60. final List<String> result = await PhotoManager.editor.deleteWithIds(
  61. selectedImages.map((e) => e.id).toList(),
  62. );
  63. // 检查删除成功的图片数量
  64. if (result.length == selectedImages.length) {
  65. int singleSelectSize = 0;
  66. FileSizeCalculatorUtil.calculateTotalSize(
  67. assetIds: result.toSet(),
  68. updateValue: (double totalSize) {
  69. singleSelectSize = (totalSize * 1024).toInt();
  70. });
  71. ImagePickerUtil.similarPhotosSize.value =
  72. (ImagePickerUtil.similarPhotosSize.value -
  73. singleSelectSize );
  74. // 先删除该组的图片,再更新selectedImages和selectedPhotosIds
  75. List<AssetEntity> imagesToRemove = [];
  76. List<int> indexesToRemove = [];
  77. for (var image in selectedImages) {
  78. // 找到图片在该组中的索引
  79. int index = group.images.indexOf(image);
  80. imagesToRemove.add(image);
  81. indexesToRemove.add(index);
  82. }
  83. // 从后往前删除,避免删除后索引错位
  84. for (int i = indexesToRemove.length - 1; i >= 0; i--) {
  85. int index = indexesToRemove[i];
  86. group.images.removeAt(index);
  87. group.selectedImages.removeAt(index);
  88. }
  89. // 如果当前组为空,则删除该组
  90. if (group.images.isEmpty) {
  91. photoGroups.remove(group);
  92. }
  93. // 更新选中的图片ID
  94. for (var image in imagesToRemove) {
  95. updateSelectedPhotosIds(image.id, false);
  96. }
  97. ImagePickerUtil.updatePhotoData(result.toSet());
  98. selectedFileCount.value = selectedPhotosIds.length;
  99. updateSelectedFilesSize();
  100. Future.delayed(Duration(seconds: 2), () {
  101. SmartDialog.dismiss(tag: 'photoDeletingDialog');
  102. photoDeleteFinishDialog();
  103. });
  104. ToastUtil.show("Delete success");
  105. } else {
  106. SmartDialog.dismiss(tag: 'photoDeletingDialog');
  107. ToastUtil.show("Delete failed");
  108. }
  109. } catch (e) {
  110. // 异常处理
  111. SmartDialog.dismiss(tag: 'photoDeletingDialog');
  112. ToastUtil.show("Error occurred during deletion: $e");
  113. }
  114. } else {
  115. StorePage.start();
  116. }
  117. }
  118. void clickJumpSelect() {
  119. if (selectedPhotosIds.isEmpty) {
  120. ToastUtil.show('Please select the picture');
  121. return;
  122. }
  123. debugPrint('SimilarPhotoController clickJumpSelected');
  124. EventHandler.report(EventId.event_04005);
  125. PhotoSelectedPreviewPage.start(PhotosType.similarPhotos, selectedPhotosIds);
  126. }
  127. @override
  128. void onReady() {
  129. // TODO: implement onReady
  130. super.onReady();
  131. EventHandler.report(EventId.event_03006);
  132. }
  133. @override
  134. PhotosType getPhotosType() => PhotosType.similarPhotos;
  135. }