From 0916ed1f6b6f53c897c702be73d62defb54f1039 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 22 Nov 2020 19:04:08 +0900 Subject: [PATCH] fixed delay for actions triggered by popup menu --- lib/widgets/collection/app_bar.dart | 10 +++---- .../entry_action_delegate.dart | 28 ++++++++----------- .../common/chip_action_delegate.dart | 16 ++++------- .../common/chip_set_action_delegate.dart | 12 ++------ .../filter_grids/common/filter_grid_page.dart | 10 +++++-- lib/widgets/fullscreen/overlay/top.dart | 9 ++++-- 6 files changed, 39 insertions(+), 46 deletions(-) diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index 7642e7cf3..937e2b771 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -258,7 +258,10 @@ class _CollectionAppBarState extends State with SingleTickerPr ] ]; }, - onSelected: _onCollectionActionSelected, + onSelected: (action) { + // wait for the popup menu to hide before proceeding with the action + Future.delayed(Durations.popupMenuAnimation * timeDilation, () => _onCollectionActionSelected(action)); + }, ); }, ), @@ -278,10 +281,7 @@ class _CollectionAppBarState extends State with SingleTickerPr widget.appBarHeightNotifier.value = kToolbarHeight + (hasFilters ? FilterBar.preferredHeight : 0); } - void _onCollectionActionSelected(CollectionAction action) async { - // wait for the popup menu to hide before proceeding with the action - await Future.delayed(Durations.popupMenuAnimation * timeDilation); - + Future _onCollectionActionSelected(CollectionAction action) async { switch (action) { case CollectionAction.copy: case CollectionAction.move: diff --git a/lib/widgets/common/action_delegates/entry_action_delegate.dart b/lib/widgets/common/action_delegates/entry_action_delegate.dart index ec4ccd357..72f24b886 100644 --- a/lib/widgets/common/action_delegates/entry_action_delegate.dart +++ b/lib/widgets/common/action_delegates/entry_action_delegate.dart @@ -2,7 +2,6 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/services/android_app_service.dart'; import 'package:aves/services/image_file_service.dart'; -import 'package:aves/utils/durations.dart'; import 'package:aves/widgets/common/action_delegates/feedback.dart'; import 'package:aves/widgets/common/action_delegates/permission_aware.dart'; import 'package:aves/widgets/common/action_delegates/rename_entry_dialog.dart'; @@ -31,49 +30,46 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin { bool get hasCollection => collection != null; - void onActionSelected(BuildContext context, ImageEntry entry, EntryAction action) async { - // wait for the popup menu to hide before proceeding with the action - await Future.delayed(Durations.popupMenuAnimation * timeDilation); - + void onActionSelected(BuildContext context, ImageEntry entry, EntryAction action) { switch (action) { case EntryAction.toggleFavourite: entry.toggleFavourite(); break; case EntryAction.delete: - unawaited(_showDeleteDialog(context, entry)); + _showDeleteDialog(context, entry); break; case EntryAction.edit: - unawaited(AndroidAppService.edit(entry.uri, entry.mimeType)); + AndroidAppService.edit(entry.uri, entry.mimeType); break; case EntryAction.info: showInfo(); break; case EntryAction.rename: - unawaited(_showRenameDialog(context, entry)); + _showRenameDialog(context, entry); break; case EntryAction.open: - unawaited(AndroidAppService.open(entry.uri, entry.mimeTypeAnySubtype)); + AndroidAppService.open(entry.uri, entry.mimeTypeAnySubtype); break; case EntryAction.openMap: - unawaited(AndroidAppService.openMap(entry.geoUri)); + AndroidAppService.openMap(entry.geoUri); break; case EntryAction.print: - unawaited(_print(entry)); + _print(entry); break; case EntryAction.rotateCCW: - unawaited(_rotate(context, entry, clockwise: false)); + _rotate(context, entry, clockwise: false); break; case EntryAction.rotateCW: - unawaited(_rotate(context, entry, clockwise: true)); + _rotate(context, entry, clockwise: true); break; case EntryAction.flip: - unawaited(_flip(context, entry)); + _flip(context, entry); break; case EntryAction.setAs: - unawaited(AndroidAppService.setAs(entry.uri, entry.mimeType)); + AndroidAppService.setAs(entry.uri, entry.mimeType); break; case EntryAction.share: - unawaited(AndroidAppService.share({entry})); + AndroidAppService.share({entry}); break; case EntryAction.viewSource: _goToSourceViewer(context, entry); diff --git a/lib/widgets/filter_grids/common/chip_action_delegate.dart b/lib/widgets/filter_grids/common/chip_action_delegate.dart index 5b842db7b..8b8ab2b47 100644 --- a/lib/widgets/filter_grids/common/chip_action_delegate.dart +++ b/lib/widgets/filter_grids/common/chip_action_delegate.dart @@ -3,7 +3,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/services/image_file_service.dart'; -import 'package:aves/utils/durations.dart'; import 'package:aves/widgets/common/action_delegates/feedback.dart'; import 'package:aves/widgets/common/action_delegates/permission_aware.dart'; import 'package:aves/widgets/common/action_delegates/rename_album_dialog.dart'; @@ -11,16 +10,11 @@ import 'package:aves/widgets/common/action_delegates/size_aware.dart'; import 'package:aves/widgets/common/aves_dialog.dart'; import 'package:aves/widgets/filter_grids/common/chip_actions.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; import 'package:intl/intl.dart'; import 'package:path/path.dart' as path; -import 'package:pedantic/pedantic.dart'; class ChipActionDelegate { - Future onActionSelected(BuildContext context, CollectionFilter filter, ChipAction action) async { - // wait for the popup menu to hide before proceeding with the action - await Future.delayed(Durations.popupMenuAnimation * timeDilation); - + void onActionSelected(BuildContext context, CollectionFilter filter, ChipAction action) { switch (action) { case ChipAction.pin: settings.pinnedFilters = settings.pinnedFilters..add(filter); @@ -42,14 +36,14 @@ class AlbumChipActionDelegate extends ChipActionDelegate with FeedbackMixin, Per }); @override - Future onActionSelected(BuildContext context, CollectionFilter filter, ChipAction action) async { - await super.onActionSelected(context, filter, action); + void onActionSelected(BuildContext context, CollectionFilter filter, ChipAction action) { + super.onActionSelected(context, filter, action); switch (action) { case ChipAction.delete: - unawaited(_showDeleteDialog(context, filter as AlbumFilter)); + _showDeleteDialog(context, filter as AlbumFilter); break; case ChipAction.rename: - unawaited(_showRenameDialog(context, filter as AlbumFilter)); + _showRenameDialog(context, filter as AlbumFilter); break; default: break; diff --git a/lib/widgets/filter_grids/common/chip_set_action_delegate.dart b/lib/widgets/filter_grids/common/chip_set_action_delegate.dart index 39efb54a6..6f507e17d 100644 --- a/lib/widgets/filter_grids/common/chip_set_action_delegate.dart +++ b/lib/widgets/filter_grids/common/chip_set_action_delegate.dart @@ -2,13 +2,10 @@ import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/enums.dart'; -import 'package:aves/utils/durations.dart'; import 'package:aves/widgets/common/aves_selection_dialog.dart'; import 'package:aves/widgets/filter_grids/common/chip_actions.dart'; import 'package:aves/widgets/stats/stats.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; -import 'package:pedantic/pedantic.dart'; abstract class ChipSetActionDelegate { CollectionSource get source; @@ -17,16 +14,13 @@ abstract class ChipSetActionDelegate { set sortFactor(ChipSortFactor factor); - Future onActionSelected(BuildContext context, ChipSetAction action) async { - // wait for the popup menu to hide before proceeding with the action - await Future.delayed(Durations.popupMenuAnimation * timeDilation); - + void onActionSelected(BuildContext context, ChipSetAction action) { switch (action) { case ChipSetAction.sort: - await _showSortDialog(context); + _showSortDialog(context); break; case ChipSetAction.refresh: - unawaited(source.refresh()); + source.refresh(); break; case ChipSetAction.stats: _goToStats(context); diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index 3ecf62bf7..04a3fd5c0 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -27,8 +27,8 @@ import 'package:collection/collection.dart'; import 'package:draggable_scrollbar/draggable_scrollbar.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:provider/provider.dart'; class FilterNavigationPage extends StatelessWidget { @@ -107,7 +107,8 @@ class FilterNavigationPage extends StatelessWidget { .toList(), ); if (selectedAction != null) { - unawaited(chipActionDelegate.onActionSelected(context, filter, selectedAction)); + // wait for the popup menu to hide before proceeding with the action + Future.delayed(Durations.popupMenuAnimation * timeDilation, () => chipActionDelegate.onActionSelected(context, filter, selectedAction)); } } @@ -134,7 +135,10 @@ class FilterNavigationPage extends StatelessWidget { ), ]; }, - onSelected: (action) => chipSetActionDelegate.onActionSelected(context, action), + onSelected: (action) { + // wait for the popup menu to hide before proceeding with the action + Future.delayed(Durations.popupMenuAnimation * timeDilation, () => chipSetActionDelegate.onActionSelected(context, action)); + }, ), ]; } diff --git a/lib/widgets/fullscreen/overlay/top.dart b/lib/widgets/fullscreen/overlay/top.dart index db02ebf4b..0d4c03aa5 100644 --- a/lib/widgets/fullscreen/overlay/top.dart +++ b/lib/widgets/fullscreen/overlay/top.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:aves/model/favourite_repo.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/settings/settings.dart'; +import 'package:aves/utils/durations.dart'; import 'package:aves/widgets/common/entry_actions.dart'; import 'package:aves/widgets/common/fx/sweeper.dart'; import 'package:aves/widgets/common/icons.dart'; @@ -12,6 +13,7 @@ import 'package:aves/widgets/fullscreen/overlay/common.dart'; import 'package:aves/widgets/fullscreen/overlay/minimap.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; @@ -168,7 +170,10 @@ class _TopOverlayRow extends StatelessWidget { _buildPopupMenuItem(EntryAction.debug), ] ], - onSelected: onActionSelected, + onSelected: (action) { + // wait for the popup menu to hide before proceeding with the action + Future.delayed(Durations.popupMenuAnimation * timeDilation, () => onActionSelected(action)); + }, ), ), ], @@ -177,7 +182,7 @@ class _TopOverlayRow extends StatelessWidget { Widget _buildOverlayButton(EntryAction action) { Widget child; - void onPressed() => onActionSelected?.call(action); + void onPressed() => onActionSelected(action); switch (action) { case EntryAction.toggleFavourite: child = _FavouriteToggler(