optional confirmation dialogs: move to bin, delete

This commit is contained in:
Thibault Deckers 2022-02-18 17:55:51 +09:00
parent 14e00d78b4
commit 208bf981fb
16 changed files with 263 additions and 84 deletions

View file

@ -56,6 +56,7 @@
"resetButtonTooltip": "Reset", "resetButtonTooltip": "Reset",
"doubleBackExitMessage": "Tap “back” again to exit.", "doubleBackExitMessage": "Tap “back” again to exit.",
"doNotAskAgain": "Do not ask again",
"sourceStateLoading": "Loading", "sourceStateLoading": "Loading",
"sourceStateCataloguing": "Cataloguing", "sourceStateCataloguing": "Cataloguing",
@ -569,6 +570,11 @@
"settingsKeepScreenOnTitle": "Keep Screen On", "settingsKeepScreenOnTitle": "Keep Screen On",
"settingsDoubleBackExit": "Tap “back” twice to exit", "settingsDoubleBackExit": "Tap “back” twice to exit",
"settingsConfirmationDialogTile": "Confirmation dialogs",
"settingsConfirmationDialogTitle": "Confirmation Dialogs",
"settingsConfirmationDialogDeleteItems": "Ask before deleting items forever",
"settingsConfirmationDialogMoveToBinItems": "Ask before moving items to the recycle bin",
"settingsNavigationDrawerTile": "Navigation menu", "settingsNavigationDrawerTile": "Navigation menu",
"settingsNavigationDrawerEditorTitle": "Navigation Menu", "settingsNavigationDrawerEditorTitle": "Navigation Menu",
"settingsNavigationDrawerBanner": "Touch and hold to move and reorder menu items.", "settingsNavigationDrawerBanner": "Touch and hold to move and reorder menu items.",

View file

@ -16,12 +16,13 @@ class SettingsDefaults {
static const canUseAnalysisService = true; static const canUseAnalysisService = true;
static const isInstalledAppAccessAllowed = false; static const isInstalledAppAccessAllowed = false;
static const isErrorReportingAllowed = false; static const isErrorReportingAllowed = false;
static const tileLayout = TileLayout.grid;
// navigation
static const mustBackTwiceToExit = true; static const mustBackTwiceToExit = true;
static const keepScreenOn = KeepScreenOn.viewerOnly; static const keepScreenOn = KeepScreenOn.viewerOnly;
static const homePage = HomePageSetting.collection; static const homePage = HomePageSetting.collection;
static const tileLayout = TileLayout.grid; static const confirmationDialogs = ConfirmationDialog.values;
// drawer
static final drawerTypeBookmarks = [ static final drawerTypeBookmarks = [
null, null,
MimeFilter.video, MimeFilter.video,

View file

@ -0,0 +1,15 @@
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:flutter/widgets.dart';
import 'enums.dart';
extension ExtraConfirmationDialog on ConfirmationDialog {
String getName(BuildContext context) {
switch (this) {
case ConfirmationDialog.delete:
return context.l10n.settingsConfirmationDialogDeleteItems;
case ConfirmationDialog.moveToBin:
return context.l10n.settingsConfirmationDialogMoveToBinItems;
}
}
}

View file

@ -1,16 +1,18 @@
enum CoordinateFormat { dms, decimal }
enum AccessibilityAnimations { system, disabled, enabled } enum AccessibilityAnimations { system, disabled, enabled }
enum AccessibilityTimeout { system, appDefault, s10, s30, s60, s120 } enum AccessibilityTimeout { system, appDefault, s10, s30, s60, s120 }
enum EntryBackground { black, white, checkered } enum ConfirmationDialog { delete, moveToBin }
enum HomePageSetting { collection, albums } enum CoordinateFormat { dms, decimal }
enum EntryBackground { black, white, checkered }
// browse providers at https://leaflet-extras.github.io/leaflet-providers/preview/ // browse providers at https://leaflet-extras.github.io/leaflet-providers/preview/
enum EntryMapStyle { googleNormal, googleHybrid, googleTerrain, osmHot, stamenToner, stamenWatercolor } enum EntryMapStyle { googleNormal, googleHybrid, googleTerrain, osmHot, stamenToner, stamenWatercolor }
enum HomePageSetting { collection, albums }
enum KeepScreenOn { never, viewerOnly, always } enum KeepScreenOn { never, viewerOnly, always }
enum UnitSystem { metric, imperial } enum UnitSystem { metric, imperial }

View file

@ -42,15 +42,16 @@ class Settings extends ChangeNotifier {
static const isInstalledAppAccessAllowedKey = 'is_installed_app_access_allowed'; static const isInstalledAppAccessAllowedKey = 'is_installed_app_access_allowed';
static const isErrorReportingAllowedKey = 'is_crashlytics_enabled'; static const isErrorReportingAllowedKey = 'is_crashlytics_enabled';
static const localeKey = 'locale'; static const localeKey = 'locale';
static const mustBackTwiceToExitKey = 'must_back_twice_to_exit';
static const keepScreenOnKey = 'keep_screen_on';
static const homePageKey = 'home_page';
static const catalogTimeZoneKey = 'catalog_time_zone'; static const catalogTimeZoneKey = 'catalog_time_zone';
static const tileExtentPrefixKey = 'tile_extent_'; static const tileExtentPrefixKey = 'tile_extent_';
static const tileLayoutPrefixKey = 'tile_layout_'; static const tileLayoutPrefixKey = 'tile_layout_';
static const topEntryIdsKey = 'top_entry_ids'; static const topEntryIdsKey = 'top_entry_ids';
// drawer // navigation
static const mustBackTwiceToExitKey = 'must_back_twice_to_exit';
static const keepScreenOnKey = 'keep_screen_on';
static const homePageKey = 'home_page';
static const confirmationDialogsKey = 'confirmation_dialogs';
static const drawerTypeBookmarksKey = 'drawer_type_bookmarks'; static const drawerTypeBookmarksKey = 'drawer_type_bookmarks';
static const drawerAlbumBookmarksKey = 'drawer_album_bookmarks'; static const drawerAlbumBookmarksKey = 'drawer_album_bookmarks';
static const drawerPageBookmarksKey = 'drawer_page_bookmarks'; static const drawerPageBookmarksKey = 'drawer_page_bookmarks';
@ -236,18 +237,6 @@ class Settings extends ChangeNotifier {
return _appliedLocale!; return _appliedLocale!;
} }
bool get mustBackTwiceToExit => getBoolOrDefault(mustBackTwiceToExitKey, SettingsDefaults.mustBackTwiceToExit);
set mustBackTwiceToExit(bool newValue) => setAndNotify(mustBackTwiceToExitKey, newValue);
KeepScreenOn get keepScreenOn => getEnumOrDefault(keepScreenOnKey, SettingsDefaults.keepScreenOn, KeepScreenOn.values);
set keepScreenOn(KeepScreenOn newValue) => setAndNotify(keepScreenOnKey, newValue.toString());
HomePageSetting get homePage => getEnumOrDefault(homePageKey, SettingsDefaults.homePage, HomePageSetting.values);
set homePage(HomePageSetting newValue) => setAndNotify(homePageKey, newValue.toString());
String get catalogTimeZone => getString(catalogTimeZoneKey) ?? ''; String get catalogTimeZone => getString(catalogTimeZoneKey) ?? '';
set catalogTimeZone(String newValue) => setAndNotify(catalogTimeZoneKey, newValue); set catalogTimeZone(String newValue) => setAndNotify(catalogTimeZoneKey, newValue);
@ -264,7 +253,23 @@ class Settings extends ChangeNotifier {
set topEntryIds(List<int>? newValue) => setAndNotify(topEntryIdsKey, newValue?.map((id) => id.toString()).whereNotNull().toList()); set topEntryIds(List<int>? newValue) => setAndNotify(topEntryIdsKey, newValue?.map((id) => id.toString()).whereNotNull().toList());
// drawer // navigation
bool get mustBackTwiceToExit => getBoolOrDefault(mustBackTwiceToExitKey, SettingsDefaults.mustBackTwiceToExit);
set mustBackTwiceToExit(bool newValue) => setAndNotify(mustBackTwiceToExitKey, newValue);
KeepScreenOn get keepScreenOn => getEnumOrDefault(keepScreenOnKey, SettingsDefaults.keepScreenOn, KeepScreenOn.values);
set keepScreenOn(KeepScreenOn newValue) => setAndNotify(keepScreenOnKey, newValue.toString());
HomePageSetting get homePage => getEnumOrDefault(homePageKey, SettingsDefaults.homePage, HomePageSetting.values);
set homePage(HomePageSetting newValue) => setAndNotify(homePageKey, newValue.toString());
List<ConfirmationDialog> get confirmationDialogs => getEnumListOrDefault(confirmationDialogsKey, SettingsDefaults.confirmationDialogs, ConfirmationDialog.values);
set confirmationDialogs(List<ConfirmationDialog> newValue) => setAndNotify(confirmationDialogsKey, newValue.map((v) => v.toString()).toList());
List<CollectionFilter?> get drawerTypeBookmarks => List<CollectionFilter?> get drawerTypeBookmarks =>
(getStringList(drawerTypeBookmarksKey))?.map((v) { (getStringList(drawerTypeBookmarksKey))?.map((v) {
@ -662,6 +667,7 @@ class Settings extends ChangeNotifier {
debugPrint('failed to import key=$key, value=$value is not a string'); debugPrint('failed to import key=$key, value=$value is not a string');
} }
break; break;
case confirmationDialogsKey:
case drawerTypeBookmarksKey: case drawerTypeBookmarksKey:
case drawerAlbumBookmarksKey: case drawerAlbumBookmarksKey:
case drawerPageBookmarksKey: case drawerPageBookmarksKey:

View file

@ -10,6 +10,7 @@ import 'package:aves/model/favourites.dart';
import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/query.dart'; import 'package:aves/model/query.dart';
import 'package:aves/model/selection.dart'; import 'package:aves/model/selection.dart';
import 'package:aves/model/settings/enums/enums.dart';
import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/settings/settings.dart';
import 'package:aves/model/source/analysis_controller.dart'; import 'package:aves/model/source/analysis_controller.dart';
import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_lens.dart';
@ -24,6 +25,7 @@ import 'package:aves/widgets/common/action_mixins/permission_aware.dart';
import 'package:aves/widgets/common/action_mixins/size_aware.dart'; import 'package:aves/widgets/common/action_mixins/size_aware.dart';
import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/dialogs/add_shortcut_dialog.dart'; import 'package:aves/widgets/dialogs/add_shortcut_dialog.dart';
import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart';
import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart';
import 'package:aves/widgets/map/map_page.dart'; import 'package:aves/widgets/map/map_page.dart';
import 'package:aves/widgets/search/search_delegate.dart'; import 'package:aves/widgets/search/search_delegate.dart';
@ -262,25 +264,12 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware
final selectionDirs = entries.map((e) => e.directory).whereNotNull().toSet(); final selectionDirs = entries.map((e) => e.directory).whereNotNull().toSet();
final todoCount = entries.length; final todoCount = entries.length;
final confirmed = await showDialog<bool>( if (!(await showConfirmationDialog(
context: context, context: context,
builder: (context) { type: ConfirmationDialog.delete,
return AvesDialog( message: l10n.deleteEntriesConfirmationDialogMessage(todoCount),
content: Text(l10n.deleteEntriesConfirmationDialogMessage(todoCount)), confirmationButtonLabel: l10n.deleteButtonLabel,
actions: [ ))) return;
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(MaterialLocalizations.of(context).cancelButtonLabel),
),
TextButton(
onPressed: () => Navigator.pop(context, true),
child: Text(l10n.deleteButtonLabel),
),
],
);
},
);
if (confirmed == null || !confirmed) return;
if (!pureTrash && !await checkStoragePermissionForAlbums(context, selectionDirs, entries: entries)) return; if (!pureTrash && !await checkStoragePermissionForAlbums(context, selectionDirs, entries: entries)) return;

View file

@ -7,6 +7,7 @@ import 'package:aves/model/entry.dart';
import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/album.dart';
import 'package:aves/model/filters/trash.dart'; import 'package:aves/model/filters/trash.dart';
import 'package:aves/model/highlight.dart'; import 'package:aves/model/highlight.dart';
import 'package:aves/model/settings/enums/enums.dart';
import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/collection_source.dart';
import 'package:aves/services/common/image_op_events.dart'; import 'package:aves/services/common/image_op_events.dart';
@ -19,7 +20,7 @@ import 'package:aves/widgets/common/action_mixins/feedback.dart';
import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; import 'package:aves/widgets/common/action_mixins/permission_aware.dart';
import 'package:aves/widgets/common/action_mixins/size_aware.dart'; import 'package:aves/widgets/common/action_mixins/size_aware.dart';
import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart';
import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; import 'package:aves/widgets/dialogs/aves_selection_dialog.dart';
import 'package:aves/widgets/filter_grids/album_pick.dart'; import 'package:aves/widgets/filter_grids/album_pick.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
@ -41,25 +42,12 @@ mixin EntryStorageMixin on FeedbackMixin, PermissionAwareMixin, SizeAwareMixin {
final l10n = context.l10n; final l10n = context.l10n;
if (toBin) { if (toBin) {
final confirmed = await showDialog<bool>( if (!(await showConfirmationDialog(
context: context, context: context,
builder: (context) { type: ConfirmationDialog.moveToBin,
return AvesDialog( message: l10n.binEntriesConfirmationDialogMessage(todoCount),
content: Text(l10n.binEntriesConfirmationDialogMessage(todoCount)), confirmationButtonLabel: l10n.deleteButtonLabel,
actions: [ ))) return;
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(MaterialLocalizations.of(context).cancelButtonLabel),
),
TextButton(
onPressed: () => Navigator.pop(context, true),
child: Text(l10n.deleteButtonLabel),
),
],
);
},
);
if (confirmed == null || !confirmed) return;
} }
final source = context.read<CollectionSource>(); final source = context.read<CollectionSource>();

View file

@ -0,0 +1,79 @@
import 'package:aves/model/settings/enums/enums.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:flutter/material.dart';
import 'aves_dialog.dart';
Future<bool> showConfirmationDialog({
required BuildContext context,
required ConfirmationDialog type,
required String message,
required String confirmationButtonLabel,
}) async {
if (!settings.confirmationDialogs.contains(type)) return true;
final confirmed = await showDialog<bool>(
context: context,
builder: (context) => AvesConfirmationDialog(
type: type,
message: message,
confirmationButtonLabel: confirmationButtonLabel,
),
);
return confirmed == true;
}
class AvesConfirmationDialog extends StatefulWidget {
final ConfirmationDialog type;
final String message, confirmationButtonLabel;
const AvesConfirmationDialog({
Key? key,
required this.type,
required this.message,
required this.confirmationButtonLabel,
}) : super(key: key);
@override
_AvesConfirmationDialogState createState() => _AvesConfirmationDialogState();
}
class _AvesConfirmationDialogState extends State<AvesConfirmationDialog> {
final ValueNotifier<bool> _skipConfirmation = ValueNotifier(false);
@override
Widget build(BuildContext context) {
return AvesDialog(
scrollableContent: [
Padding(
padding: const EdgeInsets.all(16) + const EdgeInsets.only(top: 8),
child: Text(widget.message),
),
ValueListenableBuilder<bool>(
valueListenable: _skipConfirmation,
builder: (context, ask, child) => SwitchListTile(
value: ask,
onChanged: (v) => _skipConfirmation.value = v,
title: Text(context.l10n.doNotAskAgain),
),
),
],
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(MaterialLocalizations.of(context).cancelButtonLabel),
),
TextButton(
onPressed: () {
if (_skipConfirmation.value) {
settings.confirmationDialogs = settings.confirmationDialogs.toList()..remove(widget.type);
}
Navigator.pop(context, true);
},
child: Text(widget.confirmationButtonLabel),
),
],
);
}
}

View file

@ -97,7 +97,7 @@ class _QuickActionEditorBodyState<T extends Object> extends State<QuickActionEdi
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_quickActions = widget.load(); _quickActions = widget.load().toList();
} }
@override @override

View file

@ -0,0 +1,66 @@
import 'package:aves/model/settings/enums/confirmation_dialogs.dart';
import 'package:aves/model/settings/enums/enums.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class ConfirmationDialogTile extends StatelessWidget {
const ConfirmationDialogTile({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ListTile(
title: Text(context.l10n.settingsConfirmationDialogTile),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
settings: const RouteSettings(name: ConfirmationDialogPage.routeName),
builder: (context) => const ConfirmationDialogPage(),
),
);
},
);
}
}
class ConfirmationDialogPage extends StatelessWidget {
static const routeName = '/settings/navigation_confirmation';
const ConfirmationDialogPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(context.l10n.settingsConfirmationDialogTitle),
),
body: SafeArea(
child: Selector<Settings, List<ConfirmationDialog>>(
selector: (context, s) => s.confirmationDialogs,
builder: (context, current, child) => ListView(
children: [
ConfirmationDialog.moveToBin,
ConfirmationDialog.delete,
]
.map((dialog) => SwitchListTile(
value: current.contains(dialog),
onChanged: (v) {
final dialogs = current.toList();
if (v) {
dialogs.add(dialog);
} else {
dialogs.remove(dialog);
}
settings.confirmationDialogs = dialogs;
},
title: Text(dialog.getName(context)),
))
.toList(),
),
),
),
);
}
}

View file

@ -8,6 +8,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart';
import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; import 'package:aves/widgets/dialogs/aves_selection_dialog.dart';
import 'package:aves/widgets/settings/common/tile_leading.dart'; import 'package:aves/widgets/settings/common/tile_leading.dart';
import 'package:aves/widgets/settings/navigation/confirmation_dialogs.dart';
import 'package:aves/widgets/settings/navigation/drawer.dart'; import 'package:aves/widgets/settings/navigation/drawer.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -53,6 +54,7 @@ class NavigationSection extends StatelessWidget {
}, },
), ),
const NavigationDrawerTile(), const NavigationDrawerTile(),
const ConfirmationDialogTile(),
ListTile( ListTile(
title: Text(context.l10n.settingsKeepScreenOnTile), title: Text(context.l10n.settingsKeepScreenOnTile),
subtitle: Text(currentKeepScreenOn.getName(context)), subtitle: Text(currentKeepScreenOn.getName(context)),

View file

@ -42,7 +42,7 @@ class CollectionActionEditorPage extends StatelessWidget {
allAvailableActions: EntrySetActions.browsing, allAvailableActions: EntrySetActions.browsing,
actionIcon: (action) => action.getIcon(), actionIcon: (action) => action.getIcon(),
actionText: (context, action) => action.getText(context), actionText: (context, action) => action.getText(context),
load: () => settings.collectionBrowsingQuickActions.toList(), load: () => settings.collectionBrowsingQuickActions,
save: (actions) => settings.collectionBrowsingQuickActions = actions, save: (actions) => settings.collectionBrowsingQuickActions = actions,
), ),
), ),
@ -53,7 +53,7 @@ class CollectionActionEditorPage extends StatelessWidget {
allAvailableActions: EntrySetActions.selection, allAvailableActions: EntrySetActions.selection,
actionIcon: (action) => action.getIcon(), actionIcon: (action) => action.getIcon(),
actionText: (context, action) => action.getText(context), actionText: (context, action) => action.getText(context),
load: () => settings.collectionSelectionQuickActions.toList(), load: () => settings.collectionSelectionQuickActions,
save: (actions) => settings.collectionSelectionQuickActions = actions, save: (actions) => settings.collectionSelectionQuickActions = actions,
), ),
), ),

View file

@ -37,7 +37,7 @@ class VideoActionEditorPage extends StatelessWidget {
allAvailableActions: VideoActions.all, allAvailableActions: VideoActions.all,
actionIcon: (action) => action.getIcon(), actionIcon: (action) => action.getIcon(),
actionText: (context, action) => action.getText(context), actionText: (context, action) => action.getText(context),
load: () => settings.videoQuickActions.toList(), load: () => settings.videoQuickActions,
save: (actions) => settings.videoQuickActions = actions, save: (actions) => settings.videoQuickActions = actions,
); );
} }

View file

@ -44,7 +44,7 @@ class ViewerActionEditorPage extends StatelessWidget {
allAvailableActions: allAvailableActions, allAvailableActions: allAvailableActions,
actionIcon: (action) => action.getIcon(), actionIcon: (action) => action.getIcon(),
actionText: (context, action) => action.getText(context), actionText: (context, action) => action.getText(context),
load: () => settings.viewerQuickActions.toList(), load: () => settings.viewerQuickActions,
save: (actions) => settings.viewerQuickActions = actions, save: (actions) => settings.viewerQuickActions = actions,
); );
} }

View file

@ -9,6 +9,7 @@ import 'package:aves/model/entry.dart';
import 'package:aves/model/entry_metadata_edition.dart'; import 'package:aves/model/entry_metadata_edition.dart';
import 'package:aves/model/filters/album.dart'; import 'package:aves/model/filters/album.dart';
import 'package:aves/model/highlight.dart'; import 'package:aves/model/highlight.dart';
import 'package:aves/model/settings/enums/enums.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/model/source/collection_source.dart'; import 'package:aves/model/source/collection_source.dart';
@ -24,6 +25,7 @@ import 'package:aves/widgets/common/action_mixins/permission_aware.dart';
import 'package:aves/widgets/common/action_mixins/size_aware.dart'; import 'package:aves/widgets/common/action_mixins/size_aware.dart';
import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/dialogs/add_shortcut_dialog.dart'; import 'package:aves/widgets/dialogs/add_shortcut_dialog.dart';
import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart';
import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart';
import 'package:aves/widgets/dialogs/entry_editors/rename_dialog.dart'; import 'package:aves/widgets/dialogs/entry_editors/rename_dialog.dart';
import 'package:aves/widgets/dialogs/export_entry_dialog.dart'; import 'package:aves/widgets/dialogs/export_entry_dialog.dart';
@ -173,25 +175,12 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix
} }
final l10n = context.l10n; final l10n = context.l10n;
final confirmed = await showDialog<bool>( if (!(await showConfirmationDialog(
context: context, context: context,
builder: (context) { type: ConfirmationDialog.delete,
return AvesDialog( message: l10n.deleteEntriesConfirmationDialogMessage(1),
content: Text(l10n.deleteEntriesConfirmationDialogMessage(1)), confirmationButtonLabel: l10n.deleteButtonLabel,
actions: [ ))) return;
TextButton(
onPressed: () => Navigator.pop(context),
child: Text(MaterialLocalizations.of(context).cancelButtonLabel),
),
TextButton(
onPressed: () => Navigator.pop(context, true),
child: Text(l10n.deleteButtonLabel),
),
],
);
},
);
if (confirmed == null || !confirmed) return;
if (!await checkStoragePermission(context, {entry})) return; if (!await checkStoragePermission(context, {entry})) return;

View file

@ -1,47 +1,83 @@
{ {
"de": [ "de": [
"timeDays", "timeDays",
"doNotAskAgain",
"entryActionConvert", "entryActionConvert",
"entryActionRestore", "entryActionRestore",
"filterBinLabel", "filterBinLabel",
"binEntriesConfirmationDialogMessage", "binEntriesConfirmationDialogMessage",
"collectionActionEmptyBin", "collectionActionEmptyBin",
"binPageTitle", "binPageTitle",
"settingsConfirmationDialogTile",
"settingsConfirmationDialogTitle",
"settingsConfirmationDialogDeleteItems",
"settingsConfirmationDialogMoveToBinItems",
"settingsEnableBin", "settingsEnableBin",
"settingsEnableBinSubtitle" "settingsEnableBinSubtitle"
], ],
"es": [ "es": [
"timeDays", "timeDays",
"doNotAskAgain",
"entryActionRestore", "entryActionRestore",
"filterBinLabel", "filterBinLabel",
"binEntriesConfirmationDialogMessage", "binEntriesConfirmationDialogMessage",
"collectionActionEmptyBin", "collectionActionEmptyBin",
"binPageTitle", "binPageTitle",
"settingsConfirmationDialogTile",
"settingsConfirmationDialogTitle",
"settingsConfirmationDialogDeleteItems",
"settingsConfirmationDialogMoveToBinItems",
"settingsEnableBin", "settingsEnableBin",
"settingsEnableBinSubtitle" "settingsEnableBinSubtitle"
], ],
"fr": [
"doNotAskAgain",
"settingsConfirmationDialogTile",
"settingsConfirmationDialogTitle",
"settingsConfirmationDialogDeleteItems",
"settingsConfirmationDialogMoveToBinItems"
],
"ko": [
"doNotAskAgain",
"settingsConfirmationDialogTile",
"settingsConfirmationDialogTitle",
"settingsConfirmationDialogDeleteItems",
"settingsConfirmationDialogMoveToBinItems"
],
"pt": [ "pt": [
"timeDays", "timeDays",
"doNotAskAgain",
"entryActionConvert", "entryActionConvert",
"entryActionRestore", "entryActionRestore",
"filterBinLabel", "filterBinLabel",
"binEntriesConfirmationDialogMessage", "binEntriesConfirmationDialogMessage",
"collectionActionEmptyBin", "collectionActionEmptyBin",
"binPageTitle", "binPageTitle",
"settingsConfirmationDialogTile",
"settingsConfirmationDialogTitle",
"settingsConfirmationDialogDeleteItems",
"settingsConfirmationDialogMoveToBinItems",
"settingsEnableBin", "settingsEnableBin",
"settingsEnableBinSubtitle" "settingsEnableBinSubtitle"
], ],
"ru": [ "ru": [
"timeDays", "timeDays",
"doNotAskAgain",
"entryActionConvert", "entryActionConvert",
"entryActionRestore", "entryActionRestore",
"filterBinLabel", "filterBinLabel",
"binEntriesConfirmationDialogMessage", "binEntriesConfirmationDialogMessage",
"collectionActionEmptyBin", "collectionActionEmptyBin",
"binPageTitle", "binPageTitle",
"settingsConfirmationDialogTile",
"settingsConfirmationDialogTitle",
"settingsConfirmationDialogDeleteItems",
"settingsConfirmationDialogMoveToBinItems",
"settingsEnableBin", "settingsEnableBin",
"settingsEnableBinSubtitle" "settingsEnableBinSubtitle"
] ]