diff --git a/lib/model/filters/album.dart b/lib/model/filters/album.dart index 77e0e5c11..5a1f454ca 100644 --- a/lib/model/filters/album.dart +++ b/lib/model/filters/album.dart @@ -41,8 +41,14 @@ class AlbumFilter extends CollectionFilter { String get tooltip => album; @override - Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) { - return IconUtils.getAlbumIcon(context: context, album: album, size: size) ?? (showGenericIcon ? Icon(AIcons.album, size: size) : null); + Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true, bool embossed = false}) { + return IconUtils.getAlbumIcon( + context: context, + album: album, + size: size, + embossed: embossed, + ) ?? + (showGenericIcon ? Icon(AIcons.album, size: size) : null); } @override diff --git a/lib/model/filters/favourite.dart b/lib/model/filters/favourite.dart index a5ba2998c..fb703e733 100644 --- a/lib/model/filters/favourite.dart +++ b/lib/model/filters/favourite.dart @@ -19,7 +19,7 @@ class FavouriteFilter extends CollectionFilter { String get label => 'Favourite'; @override - Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(AIcons.favourite, size: size); + Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true, bool embossed = false}) => Icon(AIcons.favourite, size: size); @override String get typeKey => type; diff --git a/lib/model/filters/filters.dart b/lib/model/filters/filters.dart index d1f8efe86..5e3b2b14c 100644 --- a/lib/model/filters/filters.dart +++ b/lib/model/filters/filters.dart @@ -57,7 +57,7 @@ abstract class CollectionFilter implements Comparable { String get tooltip => label; - Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}); + Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true, bool embossed = false}); Future color(BuildContext context) => SynchronousFuture(stringToColor(label)); diff --git a/lib/model/filters/location.dart b/lib/model/filters/location.dart index 50f77dd9b..74ea8d1e8 100644 --- a/lib/model/filters/location.dart +++ b/lib/model/filters/location.dart @@ -39,9 +39,11 @@ class LocationFilter extends CollectionFilter { String get label => _location; @override - Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) { + Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true, bool embossed = false}) { final flag = countryCodeToFlag(_countryCode); - if (flag != null) return Text(flag, style: TextStyle(fontSize: size)); + // as of Flutter v1.22.0-12.1.pre emoji shadows are rendered as colorful duplicates, + // not filled with the shadow color as expected, so we remove them + if (flag != null) return Text(flag, style: TextStyle(fontSize: size, shadows: [])); return Icon(AIcons.location, size: size); } diff --git a/lib/model/filters/mime.dart b/lib/model/filters/mime.dart index fdc948cca..82baeb3e8 100644 --- a/lib/model/filters/mime.dart +++ b/lib/model/filters/mime.dart @@ -60,7 +60,7 @@ class MimeFilter extends CollectionFilter { String get label => _label; @override - Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(_icon, size: size); + Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true, bool embossed = false}) => Icon(_icon, size: size); @override String get typeKey => type; diff --git a/lib/model/filters/query.dart b/lib/model/filters/query.dart index 5d89a5ca7..78937d159 100644 --- a/lib/model/filters/query.dart +++ b/lib/model/filters/query.dart @@ -53,7 +53,7 @@ class QueryFilter extends CollectionFilter { String get label => '$query'; @override - Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => Icon(AIcons.text, size: size); + Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true, bool embossed = false}) => Icon(AIcons.text, size: size); @override Future color(BuildContext context) => colorful ? super.color(context) : SynchronousFuture(Colors.white); diff --git a/lib/model/filters/tag.dart b/lib/model/filters/tag.dart index 4f7cd3e23..96bab615a 100644 --- a/lib/model/filters/tag.dart +++ b/lib/model/filters/tag.dart @@ -31,7 +31,7 @@ class TagFilter extends CollectionFilter { String get label => tag; @override - Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true}) => showGenericIcon ? Icon(AIcons.tag, size: size) : null; + Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true, bool embossed = false}) => showGenericIcon ? Icon(AIcons.tag, size: size) : null; @override String get typeKey => type; diff --git a/lib/utils/constants.dart b/lib/utils/constants.dart index e4a07b068..65479a6f6 100644 --- a/lib/utils/constants.dart +++ b/lib/utils/constants.dart @@ -12,6 +12,11 @@ class Constants { fontFamily: 'Concourse Caps', ); + static const embossShadow = Shadow( + color: Colors.black87, + offset: Offset(0.5, 1.0), + ); + static const List androidDependencies = [ Dependency( name: 'CWAC-Document', @@ -58,6 +63,12 @@ class Constants { licenseUrl: 'https://github.com/dart-lang/collection/blob/master/LICENSE', sourceUrl: 'https://github.com/dart-lang/collection', ), + Dependency( + name: 'Decorated Icon', + license: 'MIT', + licenseUrl: 'https://github.com/benPesso/flutter_decorated_icon/blob/master/LICENSE', + sourceUrl: 'https://github.com/benPesso/flutter_decorated_icon', + ), Dependency( name: 'Draggable Scrollbar', license: 'MIT', diff --git a/lib/widgets/common/aves_filter_chip.dart b/lib/widgets/common/aves_filter_chip.dart index 2c6ad8204..b6bb5ef03 100644 --- a/lib/widgets/common/aves_filter_chip.dart +++ b/lib/widgets/common/aves_filter_chip.dart @@ -1,4 +1,5 @@ import 'package:aves/model/filters/filters.dart'; +import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/icons.dart'; import 'package:flutter/material.dart'; @@ -79,7 +80,7 @@ class _AvesFilterChipState extends State { @override Widget build(BuildContext context) { final hasBackground = widget.background != null; - final leading = filter.iconBuilder(context, AvesFilterChip.iconSize, showGenericIcon: widget.showGenericIcon); + final leading = filter.iconBuilder(context, AvesFilterChip.iconSize, showGenericIcon: widget.showGenericIcon, embossed: hasBackground); final trailing = widget.removable ? Icon(AIcons.clear, size: AvesFilterChip.iconSize) : null; Widget content = Row( @@ -126,12 +127,7 @@ class _AvesFilterChipState extends State { color: Colors.black54, child: DefaultTextStyle( style: Theme.of(context).textTheme.bodyText2.copyWith( - shadows: [ - Shadow( - color: Colors.black87, - offset: Offset(0.5, 1.0), - ) - ], + shadows: [Constants.embossShadow], ), child: content, ), diff --git a/lib/widgets/common/icons.dart b/lib/widgets/common/icons.dart index 2a6b08c8c..a2907d8f5 100644 --- a/lib/widgets/common/icons.dart +++ b/lib/widgets/common/icons.dart @@ -2,7 +2,9 @@ import 'dart:ui'; import 'package:aves/model/image_entry.dart'; import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/image_providers/app_icon_image_provider.dart'; +import 'package:decorated_icon/decorated_icon.dart'; import 'package:flutter/material.dart'; class AIcons { @@ -162,15 +164,17 @@ class IconUtils { @required BuildContext context, @required String album, double size = 24, + bool embossed = false, }) { + Widget buildIcon(IconData icon) => embossed ? DecoratedIcon(icon, shadows: [Constants.embossShadow], size: size) : Icon(icon, size: size); switch (androidFileUtils.getAlbumType(album)) { case AlbumType.camera: - return Icon(AIcons.cameraAlbum, size: size); + return buildIcon(AIcons.cameraAlbum); case AlbumType.screenshots: case AlbumType.screenRecordings: - return Icon(AIcons.screenshotAlbum, size: size); + return buildIcon(AIcons.screenshotAlbum); case AlbumType.download: - return Icon(AIcons.downloadAlbum, size: size); + return buildIcon(AIcons.downloadAlbum); case AlbumType.app: return Image( image: AppIconImage( diff --git a/lib/widgets/filter_grids/common/decorated_filter_chip.dart b/lib/widgets/filter_grids/common/decorated_filter_chip.dart index 8103d2c68..4616f4da9 100644 --- a/lib/widgets/filter_grids/common/decorated_filter_chip.dart +++ b/lib/widgets/filter_grids/common/decorated_filter_chip.dart @@ -5,11 +5,13 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/utils/android_file_utils.dart'; +import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/collection/thumbnail/raster.dart'; import 'package:aves/widgets/collection/thumbnail/vector.dart'; import 'package:aves/widgets/common/aves_filter_chip.dart'; import 'package:aves/widgets/common/icons.dart'; import 'package:aves/widgets/filter_grids/common/filter_grid_page.dart'; +import 'package:decorated_icon/decorated_icon.dart'; import 'package:flutter/material.dart'; class DecoratedFilterChip extends StatelessWidget { @@ -65,19 +67,21 @@ class DecoratedFilterChip extends StatelessWidget { if (pinned) Padding( padding: EdgeInsets.only(right: 8), - child: Icon( + child: DecoratedIcon( AIcons.pin, - size: 16, color: FilterGridPage.detailColor, + shadows: [Constants.embossShadow], + size: 16, ), ), if (filter is AlbumFilter && androidFileUtils.isOnRemovableStorage(filter.album)) Padding( padding: EdgeInsets.only(right: 8), - child: Icon( + child: DecoratedIcon( AIcons.removableStorage, - size: 16, color: FilterGridPage.detailColor, + shadows: [Constants.embossShadow], + size: 16, ), ), count, diff --git a/lib/widgets/fullscreen/overlay/bottom.dart b/lib/widgets/fullscreen/overlay/bottom.dart index 51933c597..f9edab547 100644 --- a/lib/widgets/fullscreen/overlay/bottom.dart +++ b/lib/widgets/fullscreen/overlay/bottom.dart @@ -1,5 +1,4 @@ import 'dart:math'; -import 'dart:ui'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/image_metadata.dart'; @@ -10,6 +9,7 @@ import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/fx/blurred.dart'; import 'package:aves/widgets/common/icons.dart'; import 'package:aves/widgets/fullscreen/overlay/common.dart'; +import 'package:decorated_icon/decorated_icon.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -135,12 +135,7 @@ class _FullscreenBottomOverlayContent extends AnimatedWidget { Widget build(BuildContext context) { return DefaultTextStyle( style: Theme.of(context).textTheme.bodyText2.copyWith( - shadows: [ - Shadow( - color: Colors.black87, - offset: Offset(0.5, 1.0), - ) - ], + shadows: [Constants.embossShadow], ), softWrap: false, overflow: TextOverflow.fade, @@ -217,7 +212,7 @@ class _LocationRow extends AnimatedWidget { } return Row( children: [ - Icon(AIcons.location, size: _iconSize), + DecoratedIcon(AIcons.location, shadows: [Constants.embossShadow], size: _iconSize), SizedBox(width: _iconPadding), Expanded(child: Text(location, strutStyle: Constants.overflowStrutStyle)), ], @@ -237,7 +232,7 @@ class _DateRow extends StatelessWidget { final resolution = '${entry.width ?? '?'} × ${entry.height ?? '?'}'; return Row( children: [ - Icon(AIcons.date, size: _iconSize), + DecoratedIcon(AIcons.date, shadows: [Constants.embossShadow], size: _iconSize), SizedBox(width: _iconPadding), Expanded(flex: 3, child: Text(dateText, strutStyle: Constants.overflowStrutStyle)), if (!entry.isSvg) Expanded(flex: 2, child: Text(resolution, strutStyle: Constants.overflowStrutStyle)), @@ -255,7 +250,7 @@ class _ShootingRow extends StatelessWidget { Widget build(BuildContext context) { return Row( children: [ - Icon(AIcons.shooting, size: _iconSize), + DecoratedIcon(AIcons.shooting, shadows: [Constants.embossShadow], size: _iconSize), SizedBox(width: _iconPadding), Expanded(child: Text(details.aperture, strutStyle: Constants.overflowStrutStyle)), Expanded(child: Text(details.exposureTime, strutStyle: Constants.overflowStrutStyle)), diff --git a/pubspec.lock b/pubspec.lock index c03ddc8a6..c79564288 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -141,6 +141,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.5" + decorated_icon: + dependency: "direct main" + description: + name: decorated_icon + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" draggable_scrollbar: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 4aad73775..51e85aac4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -38,6 +38,7 @@ dependencies: sdk: flutter charts_flutter: collection: + decorated_icon: draggable_scrollbar: # path: ../flutter-draggable-scrollbar git: