import 'package:clean/base/base_controller.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:wechat_assets_picker/wechat_assets_picker.dart'; import '../../dialog/photo_delete_finish_dialog.dart'; import '../../dialog/photo_deleting_dialog.dart'; import '../../utils/file_size_calculator_util.dart'; import '../../utils/toast_util.dart'; import '../data/bean/photos_type.dart'; import '../data/consts/event_report_id.dart'; import '../data/repositories/user_repository.dart'; import '../handler/event_handler.dart'; import '../module/calendar/preview/calendar_preview_view.dart'; import '../module/image_picker/image_picker_util.dart'; import '../module/people_photo/photo_group.dart'; import '../module/store/store_view.dart'; // 单个组 abstract class BasePhotosController extends BaseController { final Rx photoGroup = PhotoGroup(isSelected: false, images: []).obs; late final PhotosType photosType; @override void onInit() { super.onInit(); } void clickBack() { print('BasePhotosController $runtimeType clickBack'); Get.back(); } // 切换图片组选中状态 void toggleGroupSelection() { photoGroup.value.toggleSelectAll(!photoGroup.value.isSelected.value); updateSelectedFilesSize(); } // 删除选中的图片 Future clickDelete() async { EventHandler.report(EventId.event_03008, params: {EventId.type: photosType.name}); debugPrint('BasePhotosController $runtimeType clickDelete ${photosType.name}'); if (!userRepository.isVip()) { StorePage.start(); return; } if (photoGroup.value.selectedPhotosIds.isNotEmpty) { photoDeletingDialog(); final List result = await PhotoManager.editor.deleteWithIds( photoGroup.value.selectedPhotosIds.toList(), ); if (result.length == photoGroup.value.selectedPhotosIds.length) { debugPrint( "BasePhotosController $runtimeType delete ${photoGroup.value.selectedPhotosIds}"); ImagePickerUtil.updatePhotoData(photoGroup.value.selectedPhotosIds); cleanSelections(); ToastUtil.show('Delete success'); Future.delayed(Duration(seconds: 2), () { SmartDialog.dismiss(tag: 'photoDeletingDialog'); photoDeleteFinishDialog(); }); } else { SmartDialog.dismiss(tag: 'photoDeletingDialog'); ToastUtil.show("Delete failed"); } } } // 删除成功后清理选中图片 void cleanSelections() { photoGroup.update((group) { group?.images.removeWhere( (element) => group.selectedPhotosIds.contains(element.id)); group?.selectedPhotosIds.clear(); }); if (photoGroup.value.images.isNotEmpty) { updateSelectedFilesSize(); } } // 更新选中图片的总大小 Future updateSelectedFilesSize() async { if (photoGroup.value.selectedCount == 0) { photoGroup.value.selectedTotalSize.value = 0; return; } FileSizeCalculatorUtil.calculateTotalSize( assetIds: photoGroup.value.selectedPhotosIds, updateValue: (double totalSize) { photoGroup.value.selectedTotalSize.value = totalSize; }, ); } // 更新选中的照片 ID void updateSelectedPhotosIds(String photoId, bool isSelected) { if (isSelected) { if (!photoGroup.value.selectedPhotosIds.contains(photoId)) { photoGroup.value.selectedPhotosIds.add(photoId); } } else { photoGroup.value.selectedPhotosIds.remove(photoId); } photoGroup.value.isSelected.value = photoGroup.value.selectedPhotosIds.length == photoGroup.value.images.length; } // 点击图片 void clickImage(int imageIndex) { print("BasePhotosController $runtimeType clickImage"); CalendarPreviewPage.start( photoGroup: photoGroup.value, currentImageId: photoGroup.value.images[imageIndex].id, ); } // 选中/取消选中图片 Future toggleImageSelection(int imageIndex) async { print("BasePhotosController $runtimeType toggleImageSelection"); final image = photoGroup.value.images[imageIndex]; photoGroup.value.toggleSelectImage(image.id); updateSelectedFilesSize(); } // 计算已选图片大小(格式化) String get selectedFilesSizeString { final double sizeInKB = photoGroup.value.selectedTotalSize.value; if (sizeInKB >= 1024 * 1024) { return "${(sizeInKB / (1024 * 1024)).toStringAsFixed(2)}GB"; } else if (sizeInKB >= 1024) { return "${(sizeInKB / 1024).toStringAsFixed(2)}MB"; } else { return "${sizeInKB.toStringAsFixed(2)}KB"; } } }