exif_item_widgets.dart 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import "package:exif/exif.dart";
  2. import "package:flutter/material.dart";
  3. import "package:photos/generated/l10n.dart";
  4. import "package:photos/models/file.dart";
  5. import "package:photos/theme/colors.dart";
  6. import "package:photos/theme/ente_theme.dart";
  7. import "package:photos/ui/components/buttons/inline_button_widget.dart";
  8. import "package:photos/ui/components/info_item_widget.dart";
  9. import "package:photos/ui/viewer/file/exif_info_dialog.dart";
  10. import "package:photos/utils/toast_util.dart";
  11. class BasicExifItemWidget extends StatelessWidget {
  12. final Map<String, dynamic> exifData;
  13. const BasicExifItemWidget(this.exifData, {super.key});
  14. @override
  15. Widget build(BuildContext context) {
  16. final subtitleTextTheme = getEnteTextTheme(context).smallMuted;
  17. return InfoItemWidget(
  18. key: const ValueKey("Basic EXIF"),
  19. leadingIcon: Icons.camera_outlined,
  20. title: exifData["takenOnDevice"] ?? "--",
  21. subtitleSection: Future.value([
  22. if (exifData["fNumber"] != null)
  23. Text(
  24. 'ƒ/' + exifData["fNumber"].toString(),
  25. style: subtitleTextTheme,
  26. ),
  27. if (exifData["exposureTime"] != null)
  28. Text(
  29. exifData["exposureTime"],
  30. style: subtitleTextTheme,
  31. ),
  32. if (exifData["focalLength"] != null)
  33. Text(
  34. exifData["focalLength"].toString() + "mm",
  35. style: subtitleTextTheme,
  36. ),
  37. if (exifData["ISO"] != null)
  38. Text(
  39. "ISO" + exifData["ISO"].toString(),
  40. style: subtitleTextTheme,
  41. ),
  42. ]),
  43. );
  44. }
  45. }
  46. class AllExifItemWidget extends StatelessWidget {
  47. final File file;
  48. final Map<String, IfdTag>? exif;
  49. const AllExifItemWidget(
  50. this.file,
  51. this.exif, {
  52. super.key,
  53. });
  54. @override
  55. Widget build(BuildContext context) {
  56. return InfoItemWidget(
  57. leadingIcon: Icons.text_snippet_outlined,
  58. title: S.of(context).exif,
  59. subtitleSection: _exifButton(context, file, exif),
  60. );
  61. }
  62. Future<List<InlineButtonWidget>> _exifButton(
  63. BuildContext context,
  64. File file,
  65. Map<String, IfdTag>? exif,
  66. ) {
  67. late final String label;
  68. late final VoidCallback? onTap;
  69. if (exif == null) {
  70. label = S.of(context).loadingExifData;
  71. onTap = null;
  72. } else if (exif.isNotEmpty) {
  73. label = S.of(context).viewAllExifData;
  74. onTap = () => showDialog(
  75. context: context,
  76. builder: (BuildContext context) {
  77. return ExifInfoDialog(file);
  78. },
  79. barrierColor: backdropFaintDark,
  80. );
  81. } else {
  82. label = S.of(context).noExifData;
  83. onTap =
  84. () => showShortToast(context, S.of(context).thisImageHasNoExifData);
  85. }
  86. return Future.value([
  87. InlineButtonWidget(
  88. label,
  89. onTap,
  90. )
  91. ]);
  92. }
  93. }