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/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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -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(),
|
||||||
),
|
),
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
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