110 lines
3 KiB
Dart
110 lines
3 KiB
Dart
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<String, dynamic> 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 EnteFile file;
|
|
final Map<String, IfdTag>? exif;
|
|
const AllExifItemWidget(
|
|
this.file,
|
|
this.exif, {
|
|
super.key,
|
|
});
|
|
|
|
@override
|
|
State<AllExifItemWidget> createState() => _AllExifItemWidgetState();
|
|
}
|
|
|
|
class _AllExifItemWidgetState extends State<AllExifItemWidget> {
|
|
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<List<Widget>> _exifButton(
|
|
BuildContext context,
|
|
EnteFile file,
|
|
Map<String, IfdTag>? 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),
|
|
]);
|
|
}
|
|
}
|