diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 1d5091084..8c5e1c808 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -33,6 +33,9 @@ class Settings extends ChangeNotifier { static const collectionGroupFactorKey = 'collection_group_factor'; static const collectionSortFactorKey = 'collection_sort_factor'; static const collectionTileExtentKey = 'collection_tile_extent'; + static const showThumbnailLocationKey = 'show_thumbnail_location'; + static const showThumbnailRawKey = 'show_thumbnail_raw'; + static const showThumbnailVideoDurationKey = 'show_thumbnail_video_duration'; // filter grids static const albumSortFactorKey = 'album_sort_factor'; @@ -108,6 +111,18 @@ class Settings extends ChangeNotifier { set collectionTileExtent(double newValue) => setAndNotify(collectionTileExtentKey, newValue); + bool get showThumbnailLocation => getBoolOrDefault(showThumbnailLocationKey, true); + + set showThumbnailLocation(bool newValue) => setAndNotify(showThumbnailLocationKey, newValue); + + bool get showThumbnailRaw => getBoolOrDefault(showThumbnailRawKey, true); + + set showThumbnailRaw(bool newValue) => setAndNotify(showThumbnailRawKey, newValue); + + bool get showThumbnailVideoDuration => getBoolOrDefault(showThumbnailVideoDurationKey, true); + + set showThumbnailVideoDuration(bool newValue) => setAndNotify(showThumbnailVideoDurationKey, newValue); + // filter grids ChipSortFactor get albumSortFactor => getEnumOrDefault(albumSortFactorKey, ChipSortFactor.name, ChipSortFactor.values); diff --git a/lib/widgets/collection/thumbnail/overlay.dart b/lib/widgets/collection/thumbnail/overlay.dart index a380e6d32..fb46bb6f2 100644 --- a/lib/widgets/collection/thumbnail/overlay.dart +++ b/lib/widgets/collection/thumbnail/overlay.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'package:aves/model/image_entry.dart'; +import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/utils/durations.dart'; @@ -8,6 +9,7 @@ import 'package:aves/widgets/common/fx/sweeper.dart'; import 'package:aves/widgets/common/icons.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:tuple/tuple.dart'; class ThumbnailEntryOverlay extends StatelessWidget { final ImageEntry entry; @@ -23,26 +25,32 @@ class ThumbnailEntryOverlay extends StatelessWidget { Widget build(BuildContext context) { final fontSize = min(14.0, (extent / 8)).roundToDouble(); final iconSize = fontSize * 2; - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (entry.hasGps) GpsIcon(iconSize: iconSize), - if (entry.isAnimated) - AnimatedImageIcon(iconSize: iconSize) - else if (entry.isVideo) - DefaultTextStyle( - style: TextStyle( - color: Colors.grey[200], - fontSize: fontSize, - ), - child: VideoIcon( - entry: entry, - iconSize: iconSize, - ), - ), - ], - ); + return Selector>( + selector: (context, s) => Tuple3(s.showThumbnailLocation, s.showThumbnailRaw, s.showThumbnailVideoDuration), + builder: (context, s, child) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (entry.hasGps && settings.showThumbnailLocation) GpsIcon(iconSize: iconSize), + if (entry.isRaw && settings.showThumbnailRaw) RawIcon(iconSize: iconSize), + if (entry.isAnimated) + AnimatedImageIcon(iconSize: iconSize) + else if (entry.isVideo) + DefaultTextStyle( + style: TextStyle( + color: Colors.grey[200], + fontSize: fontSize, + ), + child: VideoIcon( + entry: entry, + iconSize: iconSize, + showDuration: settings.showThumbnailVideoDuration, + ), + ), + ], + ); + }); } } diff --git a/lib/widgets/common/icons.dart b/lib/widgets/common/icons.dart index 017c1038d..40a200769 100644 --- a/lib/widgets/common/icons.dart +++ b/lib/widgets/common/icons.dart @@ -19,6 +19,7 @@ class AIcons { static const IconData disc = Icons.fiber_manual_record; static const IconData error = Icons.error_outline; static const IconData location = Icons.place_outlined; + static const IconData raw = Icons.camera_outlined; static const IconData shooting = Icons.camera_outlined; static const IconData removableStorage = Icons.sd_storage_outlined; static const IconData settings = Icons.settings_outlined; @@ -70,15 +71,21 @@ class AIcons { class VideoIcon extends StatelessWidget { final ImageEntry entry; final double iconSize; + final bool showDuration; - const VideoIcon({Key key, this.entry, this.iconSize}) : super(key: key); + const VideoIcon({ + Key key, + this.entry, + this.iconSize, + this.showDuration, + }) : super(key: key); @override Widget build(BuildContext context) { return OverlayIcon( icon: AIcons.play, size: iconSize, - text: entry.durationText, + text: showDuration ? entry.durationText : null, ); } } @@ -112,6 +119,20 @@ class GpsIcon extends StatelessWidget { } } +class RawIcon extends StatelessWidget { + final double iconSize; + + const RawIcon({Key key, this.iconSize}) : super(key: key); + + @override + Widget build(BuildContext context) { + return OverlayIcon( + icon: AIcons.raw, + size: iconSize, + ); + } +} + class OverlayIcon extends StatelessWidget { final IconData icon; final double size; diff --git a/lib/widgets/settings/settings_page.dart b/lib/widgets/settings/settings_page.dart index f7d85ab9d..f230ce8da 100644 --- a/lib/widgets/settings/settings_page.dart +++ b/lib/widgets/settings/settings_page.dart @@ -94,6 +94,22 @@ class SettingsPage extends StatelessWidget { } }, ), + SectionTitle('Thumbnails'), + SwitchListTile( + value: settings.showThumbnailLocation, + onChanged: (v) => settings.showThumbnailLocation = v, + title: Text('Show location icon'), + ), + SwitchListTile( + value: settings.showThumbnailRaw, + onChanged: (v) => settings.showThumbnailRaw = v, + title: Text('Show raw icon'), + ), + SwitchListTile( + value: settings.showThumbnailVideoDuration, + onChanged: (v) => settings.showThumbnailVideoDuration = v, + title: Text('Show video duration'), + ), SectionTitle('Privacy'), SwitchListTile( value: settings.isCrashlyticsEnabled,