minor fixes
This commit is contained in:
parent
e99e648753
commit
5632570452
10 changed files with 63 additions and 28 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -42,4 +42,16 @@ class MimeTypes {
|
|||
// 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> 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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -226,10 +226,13 @@ class _ScaleOverlayState extends State<ScaleOverlay> {
|
|||
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,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
|
@ -99,6 +99,7 @@ class _ThumbnailRasterImageState extends State<ThumbnailRasterImage> {
|
|||
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<ThumbnailRasterImage> {
|
|||
);
|
||||
},
|
||||
errorBuilder: (context, error, stackTrace) => ErrorThumbnail(
|
||||
entry: entry,
|
||||
extent: extent,
|
||||
tooltip: error.toString(),
|
||||
),
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
18
test/utils/time_utils_test.dart
Normal file
18
test/utils/time_utils_test.dart
Normal 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);
|
||||
});
|
||||
}
|
Loading…
Reference in a new issue