From 7252346444db846efac7070ef72c7d04e4f9fc77 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Mon, 15 Feb 2021 17:57:05 +0900 Subject: [PATCH] info: format XMP MWG Regions section --- .../viewer/info/metadata/xmp_ns/mwg.dart | 40 +++++++++++++++++++ .../viewer/info/metadata/xmp_tile.dart | 3 ++ 2 files changed, 43 insertions(+) create mode 100644 lib/widgets/viewer/info/metadata/xmp_ns/mwg.dart diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/mwg.dart b/lib/widgets/viewer/info/metadata/xmp_ns/mwg.dart new file mode 100644 index 000000000..63286f574 --- /dev/null +++ b/lib/widgets/viewer/info/metadata/xmp_ns/mwg.dart @@ -0,0 +1,40 @@ +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_structs.dart'; +import 'package:flutter/widgets.dart'; + +// cf www.metadataworkinggroup.org/pdf/mwg_guidance.pdf (down, as of 2021/02/15) +class XmpMgwRegionsNamespace extends XmpNamespace { + static const ns = 'mwg-rs'; + + static final dimensionsPattern = RegExp(r'mwg-rs:Regions/mwg-rs:AppliedToDimensions/(.*)'); + static final regionListPattern = RegExp(r'mwg-rs:Regions/mwg-rs:RegionList\[(\d+)\]/(.*)'); + + final dimensions = {}; + final regionList = >{}; + + XmpMgwRegionsNamespace() : super(ns); + + @override + String get displayTitle => 'Regions'; + + @override + bool extractData(XmpProp prop) { + final hasStructs = extractStruct(prop, dimensionsPattern, dimensions); + final hasIndexedStructs = extractIndexedStruct(prop, regionListPattern, regionList); + return hasStructs || hasIndexedStructs; + } + + @override + List buildFromExtractedData() => [ + if (dimensions.isNotEmpty) + XmpStructCard( + title: 'Applied To Dimensions', + struct: dimensions, + ), + if (regionList.isNotEmpty) + XmpStructArrayCard( + title: 'Region', + structByIndex: regionList, + ), + ]; +} diff --git a/lib/widgets/viewer/info/metadata/xmp_tile.dart b/lib/widgets/viewer/info/metadata/xmp_tile.dart index 731d49867..94ccc00f7 100644 --- a/lib/widgets/viewer/info/metadata/xmp_tile.dart +++ b/lib/widgets/viewer/info/metadata/xmp_tile.dart @@ -12,6 +12,7 @@ import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_ns/exif.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_ns/google.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_ns/iptc.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/mwg.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_ns/photoshop.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_ns/tiff.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_ns/xmp.dart'; @@ -60,6 +61,8 @@ class _XmpDirTileState extends State with FeedbackMixin { return XmpGImageNamespace(); case XmpIptcCoreNamespace.ns: return XmpIptcCoreNamespace(); + case XmpMgwRegionsNamespace.ns: + return XmpMgwRegionsNamespace(); case XmpMMNamespace.ns: return XmpMMNamespace(); case XmpNoteNamespace.ns: