import "package:exif/exif.dart"; import "package:flutter/material.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/file.dart"; import "package:photos/theme/colors.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/info_item_widget.dart"; import "package:photos/ui/viewer/file/exif_info_dialog.dart"; import "package:photos/utils/toast_util.dart"; class BasicExifItemWidget extends StatelessWidget { final Map exifData; const BasicExifItemWidget(this.exifData, {super.key}); @override Widget build(BuildContext context) { final subtitleTextTheme = getEnteTextTheme(context).miniMuted; return InfoItemWidget( key: const ValueKey("Basic EXIF"), leadingIcon: Icons.camera_outlined, title: exifData["takenOnDevice"] ?? "--", subtitleSection: Future.value([ if (exifData["fNumber"] != null) Text( 'ƒ/' + exifData["fNumber"].toString(), style: subtitleTextTheme, ), if (exifData["exposureTime"] != null) Text( exifData["exposureTime"], style: subtitleTextTheme, ), if (exifData["focalLength"] != null) Text( exifData["focalLength"].toString() + "mm", style: subtitleTextTheme, ), if (exifData["ISO"] != null) Text( "ISO" + exifData["ISO"].toString(), style: subtitleTextTheme, ), ]), ); } } class AllExifItemWidget extends StatefulWidget { final File file; final Map? exif; const AllExifItemWidget( this.file, this.exif, { super.key, }); @override State createState() => _AllExifItemWidgetState(); } class _AllExifItemWidgetState extends State { VoidCallback? _onTap; @override void initState() { super.initState(); } @override Widget build(BuildContext context) { return InfoItemWidget( leadingIcon: Icons.text_snippet_outlined, title: S.of(context).exif, subtitleSection: _exifButton(context, widget.file, widget.exif), onTap: _onTap, ); } Future> _exifButton( BuildContext context, File file, Map? exif, ) async { late final String label; late final VoidCallback? onTap; if (exif == null) { label = S.of(context).loadingExifData; onTap = null; } else if (exif.isNotEmpty) { label = S.of(context).viewAllExifData; onTap = () => showDialog( context: context, builder: (BuildContext context) { return ExifInfoDialog(file); }, barrierColor: backdropFaintDark, ); } else { label = S.of(context).noExifData; onTap = () => showShortToast(context, S.of(context).thisImageHasNoExifData); } setState(() { _onTap = onTap; }); return Future.value([ Text(label, style: getEnteTextTheme(context).miniBoldMuted), ]); } }