From 563257045286204fa83b429b069b49d9d54bbe56 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sat, 14 Nov 2020 09:47:39 +0900 Subject: [PATCH] minor fixes --- lib/model/filters/mime.dart | 15 ++------------ lib/model/mime_types.dart | 12 +++++++++++ lib/utils/time_utils.dart | 6 +++--- lib/widgets/collection/grid/header_date.dart | 1 + lib/widgets/collection/grid/scaling.dart | 11 ++++++---- lib/widgets/collection/thumbnail/error.dart | 21 ++++++++++++++------ lib/widgets/collection/thumbnail/raster.dart | 2 ++ lib/widgets/fullscreen/overlay/bottom.dart | 2 +- lib/widgets/stats/stats.dart | 3 ++- test/utils/time_utils_test.dart | 18 +++++++++++++++++ 10 files changed, 63 insertions(+), 28 deletions(-) create mode 100644 test/utils/time_utils_test.dart diff --git a/lib/model/filters/mime.dart b/lib/model/filters/mime.dart index b1c642d27..891bd48d6 100644 --- a/lib/model/filters/mime.dart +++ b/lib/model/filters/mime.dart @@ -1,5 +1,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/mime_types.dart'; import 'package:aves/widgets/common/icons.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; @@ -34,7 +35,7 @@ class MimeFilter extends CollectionFilter { _label ??= lowMime.split('/')[0].toUpperCase(); } else { _filter = (entry) => entry.mimeType == lowMime; - _label = displayType(lowMime); + _label = MimeTypes.displayType(lowMime); } _icon ??= AIcons.vector; } @@ -50,18 +51,6 @@ class MimeFilter extends CollectionFilter { 'mime': mime, }; - static String displayType(String mime) { - final patterns = [ - RegExp('.*/'), // remove type, keep subtype - RegExp('(X-|VND.(WAP.)?)'), // noisy prefixes - '+XML', // noisy suffix - RegExp('ADOBE\\\.'), // for PSD - ]; - mime = mime.toUpperCase(); - patterns.forEach((pattern) => mime = mime.replaceFirst(pattern, '')); - return mime; - } - @override bool filter(ImageEntry entry) => _filter(entry); diff --git a/lib/model/mime_types.dart b/lib/model/mime_types.dart index 04e358477..0af76645f 100644 --- a/lib/model/mime_types.dart +++ b/lib/model/mime_types.dart @@ -42,4 +42,16 @@ class MimeTypes { // groups static const List rawImages = [arw, cr2, crw, dcr, dng, erf, k25, kdc, mrw, nef, nrw, orf, pef, raf, raw, rw2, sr2, srf, srw, x3f]; static const List undecodable = [crw, psd]; // TODO TLAD make it dynamic if it depends on OS/lib versions + + static String displayType(String mime) { + final patterns = [ + RegExp('.*/'), // remove type, keep subtype + RegExp('(X-|VND.(WAP.)?)'), // noisy prefixes + '+XML', // noisy suffix + RegExp('ADOBE\\\.'), // for PSD + ]; + mime = mime.toUpperCase(); + patterns.forEach((pattern) => mime = mime.replaceFirst(pattern, '')); + return mime; + } } diff --git a/lib/utils/time_utils.dart b/lib/utils/time_utils.dart index 7d65020c2..428a799b5 100644 --- a/lib/utils/time_utils.dart +++ b/lib/utils/time_utils.dart @@ -12,11 +12,11 @@ String formatDuration(Duration d) { } extension ExtraDateTime on DateTime { - bool isAtSameYearAs(DateTime other) => this != null && other != null && year == other.year; + bool isAtSameYearAs(DateTime other) => this?.year == other?.year; - bool isAtSameMonthAs(DateTime other) => isAtSameYearAs(other) && month == other.month; + bool isAtSameMonthAs(DateTime other) => isAtSameYearAs(other) && this?.month == other?.month; - bool isAtSameDayAs(DateTime other) => isAtSameMonthAs(other) && day == other.day; + bool isAtSameDayAs(DateTime other) => isAtSameMonthAs(other) && this?.day == other?.day; bool get isToday => isAtSameDayAs(DateTime.now()); diff --git a/lib/widgets/collection/grid/header_date.dart b/lib/widgets/collection/grid/header_date.dart index 9e136c796..d9dcc3533 100644 --- a/lib/widgets/collection/grid/header_date.dart +++ b/lib/widgets/collection/grid/header_date.dart @@ -56,6 +56,7 @@ class MonthSectionHeader extends StatelessWidget { static DateFormat ym = DateFormat.yMMMM(); static String _formatDate(DateTime date) { + if (date == null) return 'Unknown'; if (date.isThisMonth) return 'This month'; if (date.isThisYear) return m.format(date); return ym.format(date); diff --git a/lib/widgets/collection/grid/scaling.dart b/lib/widgets/collection/grid/scaling.dart index b3887ba50..6eaf09931 100644 --- a/lib/widgets/collection/grid/scaling.dart +++ b/lib/widgets/collection/grid/scaling.dart @@ -226,10 +226,13 @@ class _ScaleOverlayState extends State { Positioned( left: clampedCenter.dx - extent / 2, top: clampedCenter.dy - extent / 2, - child: DecoratedThumbnail( - entry: widget.imageEntry, - extent: extent, - showOverlay: false, + child: DefaultTextStyle( + style: TextStyle(), + child: DecoratedThumbnail( + entry: widget.imageEntry, + extent: extent, + showOverlay: false, + ), ), ), ], diff --git a/lib/widgets/collection/thumbnail/error.dart b/lib/widgets/collection/thumbnail/error.dart index ae0d2bdf5..3bfeb9b1c 100644 --- a/lib/widgets/collection/thumbnail/error.dart +++ b/lib/widgets/collection/thumbnail/error.dart @@ -1,11 +1,17 @@ -import 'package:aves/widgets/common/icons.dart'; +import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/mime_types.dart'; import 'package:flutter/material.dart'; class ErrorThumbnail extends StatelessWidget { + final ImageEntry entry; final double extent; final String tooltip; - const ErrorThumbnail({@required this.extent, @required this.tooltip}); + const ErrorThumbnail({ + @required this.entry, + @required this.extent, + @required this.tooltip, + }); @override Widget build(BuildContext context) { @@ -13,10 +19,13 @@ class ErrorThumbnail extends StatelessWidget { child: Tooltip( message: tooltip, preferBelow: false, - child: Icon( - AIcons.error, - size: extent / 2, - color: Colors.blueGrey, + child: Text( + MimeTypes.displayType(entry.mimeType), + style: TextStyle( + color: Colors.blueGrey, + fontSize: extent / 5, + ), + textAlign: TextAlign.center, ), ), ); diff --git a/lib/widgets/collection/thumbnail/raster.dart b/lib/widgets/collection/thumbnail/raster.dart index 5a632ed35..05d7ce36f 100644 --- a/lib/widgets/collection/thumbnail/raster.dart +++ b/lib/widgets/collection/thumbnail/raster.dart @@ -99,6 +99,7 @@ class _ThumbnailRasterImageState extends State { Widget build(BuildContext context) { if (!entry.canDecode) { return ErrorThumbnail( + entry: entry, extent: extent, tooltip: '${entry.mimeType} not supported', ); @@ -137,6 +138,7 @@ class _ThumbnailRasterImageState extends State { ); }, errorBuilder: (context, error, stackTrace) => ErrorThumbnail( + entry: entry, extent: extent, tooltip: error.toString(), ), diff --git a/lib/widgets/fullscreen/overlay/bottom.dart b/lib/widgets/fullscreen/overlay/bottom.dart index 4a3369206..af5d068c2 100644 --- a/lib/widgets/fullscreen/overlay/bottom.dart +++ b/lib/widgets/fullscreen/overlay/bottom.dart @@ -272,7 +272,7 @@ class _DateRow extends StatelessWidget { @override Widget build(BuildContext context) { final date = entry.bestDate; - final dateText = date != null ? '${DateFormat.yMMMd().format(date)} • ${DateFormat.Hm().format(date)}' : Constants.infoUnknown; + final dateText = date != null ? '${DateFormat.yMMMd().format(date)} • ${DateFormat.Hm().format(date)}' : Constants.overlayUnknown; return Row( children: [ DecoratedIcon(AIcons.date, shadows: [Constants.embossShadow], size: _iconSize), diff --git a/lib/widgets/stats/stats.dart b/lib/widgets/stats/stats.dart index 28aa0779e..93183f133 100644 --- a/lib/widgets/stats/stats.dart +++ b/lib/widgets/stats/stats.dart @@ -5,6 +5,7 @@ import 'package:aves/model/filters/location.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/filters/tag.dart'; import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/mime_types.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/utils/color_utils.dart'; @@ -260,7 +261,7 @@ class EntryByMimeDatum { EntryByMimeDatum({ @required this.mimeType, @required this.entryCount, - }) : displayText = MimeFilter.displayType(mimeType); + }) : displayText = MimeTypes.displayType(mimeType); Color get color => stringToColor(displayText); diff --git a/test/utils/time_utils_test.dart b/test/utils/time_utils_test.dart new file mode 100644 index 000000000..e5f171b23 --- /dev/null +++ b/test/utils/time_utils_test.dart @@ -0,0 +1,18 @@ +import 'package:test/test.dart'; +import 'package:aves/utils/time_utils.dart'; + +void main() { + test('Comparison extension functions', () { + expect(DateTime(1593, 7, 8).isAtSameYearAs(null), false); + expect(DateTime(1903, 9, 25).isAtSameYearAs(DateTime(1970, 2, 25)), false); + expect(DateTime(1929, 3, 22).isAtSameYearAs(DateTime(1929, 3, 22)), true); + + expect(DateTime(1593, 7, 8).isAtSameMonthAs(null), false); + expect(DateTime(1903, 9, 25).isAtSameMonthAs(DateTime(1970, 2, 25)), false); + expect(DateTime(1929, 3, 22).isAtSameMonthAs(DateTime(1929, 3, 22)), true); + + expect(DateTime(1593, 7, 8).isAtSameDayAs(null), false); + expect(DateTime(1903, 9, 25).isAtSameDayAs(DateTime(1970, 2, 25)), false); + expect(DateTime(1929, 3, 22).isAtSameDayAs(DateTime(1929, 3, 22)), true); + }); +}