✨ Apply texas's pathc to reblur content
This commit is contained in:
		| @@ -802,97 +802,119 @@ class _CloudFileListEntry extends HookConsumerWidget { | |||||||
|     this.onTap, |     this.onTap, | ||||||
|   }); |   }); | ||||||
|  |  | ||||||
| @override |   @override | ||||||
| Widget build(BuildContext context, WidgetRef ref) { |   Widget build(BuildContext context, WidgetRef ref) { | ||||||
|     final dataSaving = ref.watch( |     final dataSaving = ref.watch( | ||||||
|         appSettingsNotifierProvider.select((s) => s.dataSavingMode), |       appSettingsNotifierProvider.select((s) => s.dataSavingMode), | ||||||
|     ); |     ); | ||||||
|     final showMature = useState(false); |     final showMature = useState(false); | ||||||
|     final showDataSaving = useState(!dataSaving); |     final showDataSaving = useState(!dataSaving); | ||||||
|     final lockedByDS     = dataSaving && !showDataSaving.value; |     final lockedByDS = dataSaving && !showDataSaving.value; | ||||||
|     final lockedByMature = file.sensitiveMarks.isNotEmpty && !showMature.value; |     final lockedByMature = file.sensitiveMarks.isNotEmpty && !showMature.value; | ||||||
|     final meta = file.fileMeta is Map ? file.fileMeta as Map : const {}; |     final meta = file.fileMeta is Map ? file.fileMeta as Map : const {}; | ||||||
|     final ratio = (meta['ratio'] is num && (meta['ratio'] as num) != 0) |     final ratio = | ||||||
|       ? (meta['ratio'] as num).toDouble() |         (meta['ratio'] is num && (meta['ratio'] as num) != 0) | ||||||
|       : 1.0; |             ? (meta['ratio'] as num).toDouble() | ||||||
|  |             : 1.0; | ||||||
|  |  | ||||||
|     Widget bg = const SizedBox.shrink(); |     Widget bg = const SizedBox.shrink(); | ||||||
|     if (isImage) { |     if (isImage) { | ||||||
|         if (meta['blur'] is String) { |       if (meta['blur'] is String) { | ||||||
|             bg = BlurHash(hash: meta['blur'] as String); |         bg = BlurHash(hash: meta['blur'] as String); | ||||||
|         } else if (!lockedByDS && !lockedByMature) { |       } else if (!lockedByDS && !lockedByMature) { | ||||||
|             bg = ImageFiltered( |         bg = ImageFiltered( | ||||||
|                 imageFilter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), |           imageFilter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), | ||||||
|                 child: CloudFileWidget( |           child: CloudFileWidget( | ||||||
|                     item: file, |             item: file, | ||||||
|                     noBlurhash: true, |             noBlurhash: true, | ||||||
|                     useInternalGate: false, |             useInternalGate: false, | ||||||
|                 ), |           ), | ||||||
|             ); |         ); | ||||||
|         } else { |       } else { | ||||||
|             bg = const ColoredBox(color: Colors.black26); |         bg = const ColoredBox(color: Colors.black26); | ||||||
|         } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     final bool fullyUnlocked = !lockedByDS && !lockedByMature; |     final bool fullyUnlocked = !lockedByDS && !lockedByMature; | ||||||
|     Widget fg = fullyUnlocked |     Widget fg = | ||||||
|         ? (isImage |         fullyUnlocked | ||||||
|             ? CloudFileWidget( |             ? (isImage | ||||||
|                 item: file, |                 ? CloudFileWidget( | ||||||
|                 heroTag: heroTag, |                   item: file, | ||||||
|                 noBlurhash: true, |                   heroTag: heroTag, | ||||||
|                 fit: BoxFit.contain, |                   noBlurhash: true, | ||||||
|                 useInternalGate: false, |                   fit: BoxFit.contain, | ||||||
|             ) |                   useInternalGate: false, | ||||||
|             : CloudFileWidget( |                 ) | ||||||
|                 item: file, |                 : CloudFileWidget( | ||||||
|                 heroTag: heroTag, |                   item: file, | ||||||
|                 fit: BoxFit.contain, |                   heroTag: heroTag, | ||||||
|                 useInternalGate: false, |                   fit: BoxFit.contain, | ||||||
|             ) |                   useInternalGate: false, | ||||||
|         ) |                 )) | ||||||
|         : AspectRatio(aspectRatio: ratio, child: const SizedBox.shrink()); |             : AspectRatio(aspectRatio: ratio, child: const SizedBox.shrink()); | ||||||
|  |  | ||||||
|     Widget overlays; |     Widget overlays; | ||||||
|     if (lockedByDS) { |     if (lockedByDS) { | ||||||
|         overlays = _DataSavingOverlay(); |       overlays = _DataSavingOverlay(); | ||||||
|     } else if (lockedByMature) { |     } else if (file.sensitiveMarks.isNotEmpty) { | ||||||
|         overlays = _SensitiveOverlay(file: file); |       overlays = _SensitiveOverlay( | ||||||
|  |         file: file, | ||||||
|  |         isRevealed: showMature.value, | ||||||
|  |         onHide: () => showMature.value = false, | ||||||
|  |       ); | ||||||
|     } else { |     } else { | ||||||
|         overlays = const SizedBox.shrink(); |       overlays = const SizedBox.shrink(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     final content = Stack( |     final content = Stack( | ||||||
|         fit: StackFit.expand, |       fit: StackFit.expand, | ||||||
|         children: [ |       children: [if (isImage) Positioned.fill(child: bg), fg, overlays], | ||||||
|             if (isImage) Positioned.fill(child: bg), |  | ||||||
|             fg, |  | ||||||
|             overlays, |  | ||||||
|         ], |  | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
|     return InkWell( |     return InkWell( | ||||||
|         borderRadius: const BorderRadius.all(Radius.circular(16)), |       borderRadius: const BorderRadius.all(Radius.circular(16)), | ||||||
|         onTap: () { |       onTap: () { | ||||||
|             if (lockedByDS) { |         if (lockedByDS) { | ||||||
|                 showDataSaving.value = true; |           showDataSaving.value = true; | ||||||
|             } else if (lockedByMature) { |         } else if (lockedByMature) { | ||||||
|                 showMature.value = true; |           showMature.value = true; | ||||||
|             } else { |         } else { | ||||||
|                 onTap?.call(); |           onTap?.call(); | ||||||
|             } |         } | ||||||
|         }, |       }, | ||||||
|         child: content, |       child: content, | ||||||
|     ); |     ); | ||||||
| } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| class _SensitiveOverlay extends StatelessWidget { | class _SensitiveOverlay extends StatelessWidget { | ||||||
|   final SnCloudFile file; |   final SnCloudFile file; | ||||||
|   const _SensitiveOverlay({required this.file}); |   final VoidCallback? onHide; | ||||||
|  |   final bool isRevealed; | ||||||
|  |  | ||||||
|  |   const _SensitiveOverlay({ | ||||||
|  |     required this.file, | ||||||
|  |     this.onHide, | ||||||
|  |     this.isRevealed = false, | ||||||
|  |   }); | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   Widget build(BuildContext context) { |   Widget build(BuildContext context) { | ||||||
|  |     if (isRevealed) { | ||||||
|  |       return Positioned( | ||||||
|  |         top: 3, | ||||||
|  |         left: 4, | ||||||
|  |         child: IconButton( | ||||||
|  |           iconSize: 16, | ||||||
|  |           constraints: const BoxConstraints(), | ||||||
|  |           icon: const Icon(Icons.visibility_off, color: Colors.white), | ||||||
|  |           tooltip: 'Blur content', | ||||||
|  |           onPressed: onHide, | ||||||
|  |         ), | ||||||
|  |       ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     return BackdropFilter( |     return BackdropFilter( | ||||||
|       filter: ImageFilter.blur(sigmaX: 64, sigmaY: 64), |       filter: ImageFilter.blur(sigmaX: 64, sigmaY: 64), | ||||||
|       child: Container( |       child: Container( | ||||||
| @@ -928,6 +950,7 @@ class _DataSavingOverlay extends StatelessWidget { | |||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| class _OverlayCard extends StatelessWidget { | class _OverlayCard extends StatelessWidget { | ||||||
|   final IconData icon; |   final IconData icon; | ||||||
|   final String title; |   final String title; | ||||||
| @@ -956,15 +979,20 @@ class _OverlayCard extends StatelessWidget { | |||||||
|         children: [ |         children: [ | ||||||
|           Icon(icon, color: Colors.white, size: 24), |           Icon(icon, color: Colors.white, size: 24), | ||||||
|           const Gap(4), |           const Gap(4), | ||||||
|           Text(title, |           Text( | ||||||
|               style: const TextStyle( |             title, | ||||||
|                   color: Colors.white, fontWeight: FontWeight.w600), |             style: const TextStyle( | ||||||
|               textAlign: TextAlign.center), |               color: Colors.white, | ||||||
|           Text(subtitle, |               fontWeight: FontWeight.w600, | ||||||
|               style: const TextStyle(color: Colors.white, fontSize: 13)), |             ), | ||||||
|  |             textAlign: TextAlign.center, | ||||||
|  |           ), | ||||||
|  |           Text( | ||||||
|  |             subtitle, | ||||||
|  |             style: const TextStyle(color: Colors.white, fontSize: 13), | ||||||
|  |           ), | ||||||
|           const Gap(4), |           const Gap(4), | ||||||
|           Text(hint, |           Text(hint, style: const TextStyle(color: Colors.white, fontSize: 11)), | ||||||
|               style: const TextStyle(color: Colors.white, fontSize: 11)), |  | ||||||
|         ], |         ], | ||||||
|       ), |       ), | ||||||
|     ); |     ); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user