info: improved XMP darktable namespace display

This commit is contained in:
Thibault Deckers 2021-09-06 09:42:47 +09:00
parent 4d377173b6
commit f16645dd34
2 changed files with 32 additions and 2 deletions

View file

@ -4,6 +4,7 @@ import 'package:aves/utils/constants.dart';
import 'package:aves/utils/string_utils.dart'; import 'package:aves/utils/string_utils.dart';
import 'package:aves/widgets/common/identity/highlight_title.dart'; import 'package:aves/widgets/common/identity/highlight_title.dart';
import 'package:aves/widgets/viewer/info/common.dart'; import 'package:aves/widgets/viewer/info/common.dart';
import 'package:aves/widgets/viewer/info/metadata/xmp_ns/darktable.dart';
import 'package:aves/widgets/viewer/info/metadata/xmp_ns/exif.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/google.dart';
import 'package:aves/widgets/viewer/info/metadata/xmp_ns/iptc.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_ns/iptc.dart';
@ -30,6 +31,8 @@ class XmpNamespace extends Equatable {
switch (namespace) { switch (namespace) {
case XmpBasicNamespace.ns: case XmpBasicNamespace.ns:
return XmpBasicNamespace(rawProps); return XmpBasicNamespace(rawProps);
case XmpDarktableNamespace.ns:
return XmpDarktableNamespace(rawProps);
case XmpExifNamespace.ns: case XmpExifNamespace.ns:
return XmpExifNamespace(rawProps); return XmpExifNamespace(rawProps);
case XmpGAudioNamespace.ns: case XmpGAudioNamespace.ns:
@ -136,8 +139,10 @@ class XmpProp {
return propPath.splitMapJoin(XMP.structFieldSeparator, return propPath.splitMapJoin(XMP.structFieldSeparator,
onMatch: (match) => ' ${match.group(0)} ', onMatch: (match) => ' ${match.group(0)} ',
onNonMatch: (s) { onNonMatch: (s) {
// strip namespace & format // strip namespace
return s.split(XMP.propNamespaceSeparator).last.toSentenceCase(); final key = s.split(XMP.propNamespaceSeparator).last;
// format
return key.replaceAll('_', ' ').toSentenceCase();
}); });
} }

View file

@ -0,0 +1,25 @@
import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart';
import 'package:aves/widgets/viewer/info/metadata/xmp_structs.dart';
import 'package:flutter/material.dart';
class XmpDarktableNamespace extends XmpNamespace {
static const ns = 'darktable';
static final historyPattern = RegExp(r'darktable:history\[(\d+)\]/(.*)');
final history = <int, Map<String, String>>{};
XmpDarktableNamespace(Map<String, String> rawProps) : super(ns, rawProps);
@override
bool extractData(XmpProp prop) => extractIndexedStruct(prop, historyPattern, history);
@override
List<Widget> buildFromExtractedData() => [
if (history.isNotEmpty)
XmpStructArrayCard(
title: 'History',
structByIndex: history,
),
];
}