minor fixes

This commit is contained in:
Thibault Deckers 2020-11-14 09:47:39 +09:00
parent e99e648753
commit 5632570452
10 changed files with 63 additions and 28 deletions

View file

@ -1,5 +1,6 @@
import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/image_entry.dart'; import 'package:aves/model/image_entry.dart';
import 'package:aves/model/mime_types.dart';
import 'package:aves/widgets/common/icons.dart'; import 'package:aves/widgets/common/icons.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
@ -34,7 +35,7 @@ class MimeFilter extends CollectionFilter {
_label ??= lowMime.split('/')[0].toUpperCase(); _label ??= lowMime.split('/')[0].toUpperCase();
} else { } else {
_filter = (entry) => entry.mimeType == lowMime; _filter = (entry) => entry.mimeType == lowMime;
_label = displayType(lowMime); _label = MimeTypes.displayType(lowMime);
} }
_icon ??= AIcons.vector; _icon ??= AIcons.vector;
} }
@ -50,18 +51,6 @@ class MimeFilter extends CollectionFilter {
'mime': mime, '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 @override
bool filter(ImageEntry entry) => _filter(entry); bool filter(ImageEntry entry) => _filter(entry);

View file

@ -42,4 +42,16 @@ class MimeTypes {
// groups // groups
static const List<String> rawImages = [arw, cr2, crw, dcr, dng, erf, k25, kdc, mrw, nef, nrw, orf, pef, raf, raw, rw2, sr2, srf, srw, x3f]; static const List<String> rawImages = [arw, cr2, crw, dcr, dng, erf, k25, kdc, mrw, nef, nrw, orf, pef, raf, raw, rw2, sr2, srf, srw, x3f];
static const List<String> undecodable = [crw, psd]; // TODO TLAD make it dynamic if it depends on OS/lib versions static const List<String> 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;
}
} }

View file

@ -12,11 +12,11 @@ String formatDuration(Duration d) {
} }
extension ExtraDateTime on DateTime { 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()); bool get isToday => isAtSameDayAs(DateTime.now());

View file

@ -56,6 +56,7 @@ class MonthSectionHeader extends StatelessWidget {
static DateFormat ym = DateFormat.yMMMM(); static DateFormat ym = DateFormat.yMMMM();
static String _formatDate(DateTime date) { static String _formatDate(DateTime date) {
if (date == null) return 'Unknown';
if (date.isThisMonth) return 'This month'; if (date.isThisMonth) return 'This month';
if (date.isThisYear) return m.format(date); if (date.isThisYear) return m.format(date);
return ym.format(date); return ym.format(date);

View file

@ -226,10 +226,13 @@ class _ScaleOverlayState extends State<ScaleOverlay> {
Positioned( Positioned(
left: clampedCenter.dx - extent / 2, left: clampedCenter.dx - extent / 2,
top: clampedCenter.dy - extent / 2, top: clampedCenter.dy - extent / 2,
child: DecoratedThumbnail( child: DefaultTextStyle(
entry: widget.imageEntry, style: TextStyle(),
extent: extent, child: DecoratedThumbnail(
showOverlay: false, entry: widget.imageEntry,
extent: extent,
showOverlay: false,
),
), ),
), ),
], ],

View file

@ -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'; import 'package:flutter/material.dart';
class ErrorThumbnail extends StatelessWidget { class ErrorThumbnail extends StatelessWidget {
final ImageEntry entry;
final double extent; final double extent;
final String tooltip; final String tooltip;
const ErrorThumbnail({@required this.extent, @required this.tooltip}); const ErrorThumbnail({
@required this.entry,
@required this.extent,
@required this.tooltip,
});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -13,10 +19,13 @@ class ErrorThumbnail extends StatelessWidget {
child: Tooltip( child: Tooltip(
message: tooltip, message: tooltip,
preferBelow: false, preferBelow: false,
child: Icon( child: Text(
AIcons.error, MimeTypes.displayType(entry.mimeType),
size: extent / 2, style: TextStyle(
color: Colors.blueGrey, color: Colors.blueGrey,
fontSize: extent / 5,
),
textAlign: TextAlign.center,
), ),
), ),
); );

View file

@ -99,6 +99,7 @@ class _ThumbnailRasterImageState extends State<ThumbnailRasterImage> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (!entry.canDecode) { if (!entry.canDecode) {
return ErrorThumbnail( return ErrorThumbnail(
entry: entry,
extent: extent, extent: extent,
tooltip: '${entry.mimeType} not supported', tooltip: '${entry.mimeType} not supported',
); );
@ -137,6 +138,7 @@ class _ThumbnailRasterImageState extends State<ThumbnailRasterImage> {
); );
}, },
errorBuilder: (context, error, stackTrace) => ErrorThumbnail( errorBuilder: (context, error, stackTrace) => ErrorThumbnail(
entry: entry,
extent: extent, extent: extent,
tooltip: error.toString(), tooltip: error.toString(),
), ),

View file

@ -272,7 +272,7 @@ class _DateRow extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final date = entry.bestDate; 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( return Row(
children: [ children: [
DecoratedIcon(AIcons.date, shadows: [Constants.embossShadow], size: _iconSize), DecoratedIcon(AIcons.date, shadows: [Constants.embossShadow], size: _iconSize),

View file

@ -5,6 +5,7 @@ import 'package:aves/model/filters/location.dart';
import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/filters/mime.dart';
import 'package:aves/model/filters/tag.dart'; import 'package:aves/model/filters/tag.dart';
import 'package:aves/model/image_entry.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/settings/settings.dart';
import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/utils/color_utils.dart'; import 'package:aves/utils/color_utils.dart';
@ -260,7 +261,7 @@ class EntryByMimeDatum {
EntryByMimeDatum({ EntryByMimeDatum({
@required this.mimeType, @required this.mimeType,
@required this.entryCount, @required this.entryCount,
}) : displayText = MimeFilter.displayType(mimeType); }) : displayText = MimeTypes.displayType(mimeType);
Color get color => stringToColor(displayText); Color get color => stringToColor(displayText);

View file

@ -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);
});
}