#404 widget: option to show most recent item instead of random items
This commit is contained in:
parent
cbfbc436ed
commit
0ee7d33f28
9 changed files with 114 additions and 14 deletions
|
@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file.
|
|||
- Video: subtitle vertical position option
|
||||
- Info: export metadata to text file
|
||||
- Accessibility: apply bold font system setting
|
||||
- Widget: option to show most recent item instead of random items
|
||||
- `libre` app flavor (no mobile service maps, no Crashlytics)
|
||||
|
||||
### Changed
|
||||
|
|
|
@ -219,6 +219,9 @@
|
|||
"wallpaperTargetLock": "Lock screen",
|
||||
"wallpaperTargetHomeLock": "Home and lock screens",
|
||||
|
||||
"widgetDisplayedItemRandom": "Random",
|
||||
"widgetDisplayedItemMostRecent": "Most recent",
|
||||
|
||||
"widgetOpenPageHome": "Open home",
|
||||
"widgetOpenPageCollection": "Open collection",
|
||||
"widgetOpenPageViewer": "Open viewer",
|
||||
|
@ -811,6 +814,7 @@
|
|||
"settingsWidgetPageTitle": "Photo Frame",
|
||||
"settingsWidgetShowOutline": "Outline",
|
||||
"settingsWidgetOpenPage": "When tapping on the widget",
|
||||
"settingsWidgetDisplayedItem": "Displayed item",
|
||||
|
||||
"settingsCollectionTile": "Collection",
|
||||
|
||||
|
|
|
@ -137,6 +137,7 @@ class SettingsDefaults {
|
|||
static const widgetOutline = false;
|
||||
static const widgetShape = WidgetShape.rrect;
|
||||
static const widgetOpenPage = WidgetOpenPage.viewer;
|
||||
static const widgetDisplayedItem = WidgetDisplayedItem.random;
|
||||
|
||||
// platform settings
|
||||
static const isRotationLocked = false;
|
||||
|
|
|
@ -32,6 +32,8 @@ enum VideoAutoPlayMode { disabled, playMuted, playWithSound }
|
|||
|
||||
enum ViewerTransition { slide, parallax, fade, zoomIn, none }
|
||||
|
||||
enum WidgetDisplayedItem { random, mostRecent }
|
||||
|
||||
enum WidgetOpenPage { home, collection, viewer }
|
||||
|
||||
enum WidgetShape { rrect, circle, heart }
|
||||
|
|
14
lib/model/settings/enums/widget_displayed_item.dart
Normal file
14
lib/model/settings/enums/widget_displayed_item.dart
Normal file
|
@ -0,0 +1,14 @@
|
|||
import 'package:aves/model/settings/enums/enums.dart';
|
||||
import 'package:aves/widgets/common/extensions/build_context.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
extension ExtraWidgetDisplayedItem on WidgetDisplayedItem {
|
||||
String getName(BuildContext context) {
|
||||
switch (this) {
|
||||
case WidgetDisplayedItem.random:
|
||||
return context.l10n.widgetDisplayedItemRandom;
|
||||
case WidgetDisplayedItem.mostRecent:
|
||||
return context.l10n.widgetDisplayedItemMostRecent;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -173,6 +173,7 @@ class Settings extends ChangeNotifier {
|
|||
static const widgetShapePrefixKey = '${_widgetKeyPrefix}shape_';
|
||||
static const widgetCollectionFiltersPrefixKey = '${_widgetKeyPrefix}collection_filters_';
|
||||
static const widgetOpenPagePrefixKey = '${_widgetKeyPrefix}open_page_';
|
||||
static const widgetDisplayedItemPrefixKey = '${_widgetKeyPrefix}displayed_item_';
|
||||
static const widgetUriPrefixKey = '${_widgetKeyPrefix}uri_';
|
||||
|
||||
// platform settings
|
||||
|
@ -732,6 +733,10 @@ class Settings extends ChangeNotifier {
|
|||
|
||||
void setWidgetOpenPage(int widgetId, WidgetOpenPage newValue) => setAndNotify('$widgetOpenPagePrefixKey$widgetId', newValue.toString());
|
||||
|
||||
WidgetDisplayedItem getWidgetDisplayedItem(int widgetId) => getEnumOrDefault('$widgetDisplayedItemPrefixKey$widgetId', SettingsDefaults.widgetDisplayedItem, WidgetDisplayedItem.values);
|
||||
|
||||
void setWidgetDisplayedItem(int widgetId, WidgetDisplayedItem newValue) => setAndNotify('$widgetDisplayedItemPrefixKey$widgetId', newValue.toString());
|
||||
|
||||
String? getWidgetUri(int widgetId) => getString('$widgetUriPrefixKey$widgetId');
|
||||
|
||||
void setWidgetUri(int widgetId, String? newValue) => setAndNotify('$widgetUriPrefixKey$widgetId', newValue);
|
||||
|
|
|
@ -2,6 +2,7 @@ import 'dart:async';
|
|||
|
||||
import 'package:aves/app_flavor.dart';
|
||||
import 'package:aves/model/entry.dart';
|
||||
import 'package:aves/model/settings/enums/enums.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/model/source/media_store_source.dart';
|
||||
|
@ -74,7 +75,14 @@ Future<AvesEntry?> _getWidgetEntry(int widgetId, bool reuseEntry) async {
|
|||
await readyCompleter.future;
|
||||
|
||||
final entries = CollectionLens(source: source, filters: filters).sortedEntries;
|
||||
switch (settings.getWidgetDisplayedItem(widgetId)) {
|
||||
case WidgetDisplayedItem.random:
|
||||
entries.shuffle();
|
||||
break;
|
||||
case WidgetDisplayedItem.mostRecent:
|
||||
entries.sort(AvesEntry.compareByDate);
|
||||
break;
|
||||
}
|
||||
final entry = entries.firstOrNull;
|
||||
if (entry != null) {
|
||||
settings.setWidgetUri(widgetId, entry.uri);
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:aves/model/filters/filters.dart';
|
||||
import 'package:aves/model/settings/enums/enums.dart';
|
||||
import 'package:aves/model/settings/enums/widget_displayed_item.dart';
|
||||
import 'package:aves/model/settings/enums/widget_open_action.dart';
|
||||
import 'package:aves/model/settings/enums/widget_shape.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
|
@ -36,6 +37,7 @@ class _HomeWidgetSettingsPageState extends State<HomeWidgetSettingsPage> {
|
|||
late WidgetShape _shape;
|
||||
late Color? _outline;
|
||||
late WidgetOpenPage _openPage;
|
||||
late WidgetDisplayedItem _displayedItem;
|
||||
late Set<CollectionFilter> _collectionFilters;
|
||||
|
||||
int get widgetId => widget.widgetId;
|
||||
|
@ -59,6 +61,7 @@ class _HomeWidgetSettingsPageState extends State<HomeWidgetSettingsPage> {
|
|||
_shape = settings.getWidgetShape(widgetId);
|
||||
_outline = settings.getWidgetOutline(widgetId);
|
||||
_openPage = settings.getWidgetOpenPage(widgetId);
|
||||
_displayedItem = settings.getWidgetDisplayedItem(widgetId);
|
||||
_collectionFilters = settings.getWidgetCollectionFilters(widgetId);
|
||||
}
|
||||
|
||||
|
@ -91,6 +94,13 @@ class _HomeWidgetSettingsPageState extends State<HomeWidgetSettingsPage> {
|
|||
onSelection: (v) => setState(() => _openPage = v),
|
||||
tileTitle: l10n.settingsWidgetOpenPage,
|
||||
),
|
||||
SettingsSelectionListTile<WidgetDisplayedItem>(
|
||||
values: WidgetDisplayedItem.values,
|
||||
getName: (context, v) => v.getName(context),
|
||||
selector: (context, s) => _displayedItem,
|
||||
onSelection: (v) => setState(() => _displayedItem = v),
|
||||
tileTitle: l10n.settingsWidgetDisplayedItem,
|
||||
),
|
||||
SettingsCollectionTile(
|
||||
filters: _collectionFilters,
|
||||
onSelection: (v) => setState(() => _collectionFilters = v),
|
||||
|
@ -148,11 +158,15 @@ class _HomeWidgetSettingsPageState extends State<HomeWidgetSettingsPage> {
|
|||
}
|
||||
|
||||
void _saveSettings() {
|
||||
final invalidateUri = _displayedItem != settings.getWidgetDisplayedItem(widgetId) || !const SetEquality().equals(_collectionFilters, settings.getWidgetCollectionFilters(widgetId));
|
||||
|
||||
settings.setWidgetShape(widgetId, _shape);
|
||||
settings.setWidgetOutline(widgetId, _outline);
|
||||
settings.setWidgetOpenPage(widgetId, _openPage);
|
||||
if (!const SetEquality().equals(_collectionFilters, settings.getWidgetCollectionFilters(widgetId))) {
|
||||
settings.setWidgetDisplayedItem(widgetId, _displayedItem);
|
||||
settings.setWidgetCollectionFilters(widgetId, _collectionFilters);
|
||||
|
||||
if (invalidateUri) {
|
||||
settings.setWidgetUri(widgetId, null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,16 +3,22 @@
|
|||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle"
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsWidgetDisplayedItem"
|
||||
],
|
||||
|
||||
"el": [
|
||||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsWidgetDisplayedItem",
|
||||
"tagEditorSectionPlaceholders"
|
||||
],
|
||||
|
||||
|
@ -20,8 +26,11 @@
|
|||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle"
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsWidgetDisplayedItem"
|
||||
],
|
||||
|
||||
"fa": [
|
||||
|
@ -179,6 +188,8 @@
|
|||
"wallpaperTargetHome",
|
||||
"wallpaperTargetLock",
|
||||
"wallpaperTargetHomeLock",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"widgetOpenPageHome",
|
||||
"widgetOpenPageCollection",
|
||||
"widgetOpenPageViewer",
|
||||
|
@ -549,6 +560,7 @@
|
|||
"settingsWidgetPageTitle",
|
||||
"settingsWidgetShowOutline",
|
||||
"settingsWidgetOpenPage",
|
||||
"settingsWidgetDisplayedItem",
|
||||
"settingsCollectionTile",
|
||||
"statsPageTitle",
|
||||
"statsWithGps",
|
||||
|
@ -615,8 +627,11 @@
|
|||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle"
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsWidgetDisplayedItem"
|
||||
],
|
||||
|
||||
"gl": [
|
||||
|
@ -641,6 +656,8 @@
|
|||
"wallpaperTargetHome",
|
||||
"wallpaperTargetLock",
|
||||
"wallpaperTargetHomeLock",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"widgetOpenPageHome",
|
||||
"widgetOpenPageCollection",
|
||||
"widgetOpenPageViewer",
|
||||
|
@ -1011,6 +1028,7 @@
|
|||
"settingsWidgetPageTitle",
|
||||
"settingsWidgetShowOutline",
|
||||
"settingsWidgetOpenPage",
|
||||
"settingsWidgetDisplayedItem",
|
||||
"settingsCollectionTile",
|
||||
"statsPageTitle",
|
||||
"statsWithGps",
|
||||
|
@ -1077,16 +1095,22 @@
|
|||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle"
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsWidgetDisplayedItem"
|
||||
],
|
||||
|
||||
"it": [
|
||||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle"
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsWidgetDisplayedItem"
|
||||
],
|
||||
|
||||
"ja": [
|
||||
|
@ -1094,16 +1118,22 @@
|
|||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle"
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsWidgetDisplayedItem"
|
||||
],
|
||||
|
||||
"ko": [
|
||||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle"
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsWidgetDisplayedItem"
|
||||
],
|
||||
|
||||
"nb": [
|
||||
|
@ -1120,6 +1150,8 @@
|
|||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"viewerTransitionFade",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"albumTierSpecial",
|
||||
"storageAccessDialogMessage",
|
||||
"restrictedAccessDialogMessage",
|
||||
|
@ -1212,6 +1244,7 @@
|
|||
"settingsThemeColorHighlights",
|
||||
"settingsDisplayRefreshRateModeTile",
|
||||
"settingsDisplayRefreshRateModeDialogTitle",
|
||||
"settingsWidgetDisplayedItem",
|
||||
"statsWithGps",
|
||||
"viewerErrorDoesNotExist",
|
||||
"mapAttributionStamen",
|
||||
|
@ -1228,8 +1261,11 @@
|
|||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle"
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsWidgetDisplayedItem"
|
||||
],
|
||||
|
||||
"pl": [
|
||||
|
@ -1294,6 +1330,8 @@
|
|||
"wallpaperTargetHome",
|
||||
"wallpaperTargetLock",
|
||||
"wallpaperTargetHomeLock",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"widgetOpenPageHome",
|
||||
"widgetOpenPageCollection",
|
||||
"widgetOpenPageViewer",
|
||||
|
@ -1664,6 +1702,7 @@
|
|||
"settingsWidgetPageTitle",
|
||||
"settingsWidgetShowOutline",
|
||||
"settingsWidgetOpenPage",
|
||||
"settingsWidgetDisplayedItem",
|
||||
"settingsCollectionTile",
|
||||
"statsPageTitle",
|
||||
"statsWithGps",
|
||||
|
@ -1730,34 +1769,46 @@
|
|||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle"
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsWidgetDisplayedItem"
|
||||
],
|
||||
|
||||
"ru": [
|
||||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle"
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsWidgetDisplayedItem"
|
||||
],
|
||||
|
||||
"tr": [
|
||||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle"
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsWidgetDisplayedItem"
|
||||
],
|
||||
|
||||
"zh": [
|
||||
"entryInfoActionExportMetadata",
|
||||
"subtitlePositionTop",
|
||||
"subtitlePositionBottom",
|
||||
"widgetDisplayedItemRandom",
|
||||
"widgetDisplayedItemMostRecent",
|
||||
"editEntryLocationDialogSetCustom",
|
||||
"settingsSubtitleThemeTextPositionTile",
|
||||
"settingsSubtitleThemeTextPositionDialogTitle",
|
||||
"settingsAllowMediaManagement",
|
||||
"settingsWidgetDisplayedItem",
|
||||
"tagEditorSectionPlaceholders",
|
||||
"tagPlaceholderCountry",
|
||||
"tagPlaceholderPlace"
|
||||
|
|
Loading…
Reference in a new issue