From d3e0dd93757195214ed0c836e7da3960d73422b9 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 2 Aug 2020 16:42:44 +0900 Subject: [PATCH] collection: replaced sort/group menu items by selection dialogs --- lib/widgets/album/app_bar.dart | 109 +++++------------- .../group_collection_dialog.dart | 61 ++++++++++ .../sort_collection_dialog.dart | 60 ++++++++++ lib/widgets/common/icons.dart | 1 + 4 files changed, 154 insertions(+), 77 deletions(-) create mode 100644 lib/widgets/common/action_delegates/group_collection_dialog.dart create mode 100644 lib/widgets/common/action_delegates/sort_collection_dialog.dart diff --git a/lib/widgets/album/app_bar.dart b/lib/widgets/album/app_bar.dart index 0ce2ccf64..2ac5de3c6 100644 --- a/lib/widgets/album/app_bar.dart +++ b/lib/widgets/album/app_bar.dart @@ -6,7 +6,9 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/utils/durations.dart'; import 'package:aves/widgets/album/filter_bar.dart'; import 'package:aves/widgets/album/search/search_delegate.dart'; +import 'package:aves/widgets/common/action_delegates/group_collection_dialog.dart'; import 'package:aves/widgets/common/action_delegates/selection_action_delegate.dart'; +import 'package:aves/widgets/common/action_delegates/sort_collection_dialog.dart'; import 'package:aves/widgets/common/app_bar_subtitle.dart'; import 'package:aves/widgets/common/data_providers/media_store_collection_provider.dart'; import 'package:aves/widgets/common/entry_actions.dart'; @@ -185,8 +187,15 @@ class _CollectionAppBarState extends State with SingleTickerPr itemBuilder: (context) { final hasSelection = collection.selection.isNotEmpty; return [ - ..._buildSortMenuItems(), - ..._buildGroupMenuItems(), + PopupMenuItem( + value: CollectionAction.sort, + child: MenuRow(text: 'Sort...', icon: AIcons.sort), + ), + if (collection.sortFactor == SortFactor.date) + PopupMenuItem( + value: CollectionAction.group, + child: MenuRow(text: 'Group...', icon: AIcons.group), + ), if (collection.isBrowsing) ...[ if (AvesApp.mode == AppMode.main) if (kDebugMode) @@ -204,6 +213,7 @@ class _CollectionAppBarState extends State with SingleTickerPr ), ], if (collection.isSelecting) ...[ + PopupMenuDivider(), PopupMenuItem( value: CollectionAction.copy, enabled: hasSelection, @@ -238,48 +248,6 @@ class _CollectionAppBarState extends State with SingleTickerPr ]; } - List> _buildSortMenuItems() { - return [ - PopupMenuItem( - value: CollectionAction.sortByDate, - child: MenuRow(text: 'Sort by date', checked: collection.sortFactor == SortFactor.date), - ), - PopupMenuItem( - value: CollectionAction.sortBySize, - child: MenuRow(text: 'Sort by size', checked: collection.sortFactor == SortFactor.size), - ), - PopupMenuItem( - value: CollectionAction.sortByName, - child: MenuRow(text: 'Sort by name', checked: collection.sortFactor == SortFactor.name), - ), - PopupMenuDivider(), - ]; - } - - List> _buildGroupMenuItems() { - return collection.sortFactor == SortFactor.date - ? [ - PopupMenuItem( - value: CollectionAction.groupByAlbum, - child: MenuRow(text: 'Group by album', checked: collection.groupFactor == GroupFactor.album), - ), - PopupMenuItem( - value: CollectionAction.groupByMonth, - child: MenuRow(text: 'Group by month', checked: collection.groupFactor == GroupFactor.month), - ), - PopupMenuItem( - value: CollectionAction.groupByDay, - child: MenuRow(text: 'Group by day', checked: collection.groupFactor == GroupFactor.day), - ), - PopupMenuItem( - value: CollectionAction.groupByNone, - child: MenuRow(text: 'Do not group', checked: collection.groupFactor == GroupFactor.none), - ), - PopupMenuDivider(), - ] - : []; - } - void _onActivityChange() { if (collection.isSelecting) { _browseToSelectAnimation.forward(); @@ -321,33 +289,25 @@ class _CollectionAppBarState extends State with SingleTickerPr case CollectionAction.stats: unawaited(_goToStats()); break; - case CollectionAction.groupByAlbum: - settings.collectionGroupFactor = GroupFactor.album; - collection.group(GroupFactor.album); + case CollectionAction.group: + final factor = await showDialog( + context: context, + builder: (context) => GroupCollectionDialog(), + ); + if (factor != null) { + settings.collectionGroupFactor = factor; + collection.group(factor); + } break; - case CollectionAction.groupByMonth: - settings.collectionGroupFactor = GroupFactor.month; - collection.group(GroupFactor.month); - break; - case CollectionAction.groupByDay: - settings.collectionGroupFactor = GroupFactor.day; - collection.group(GroupFactor.day); - break; - case CollectionAction.groupByNone: - settings.collectionGroupFactor = GroupFactor.none; - collection.group(GroupFactor.none); - break; - case CollectionAction.sortByDate: - settings.collectionSortFactor = SortFactor.date; - collection.sort(SortFactor.date); - break; - case CollectionAction.sortBySize: - settings.collectionSortFactor = SortFactor.size; - collection.sort(SortFactor.size); - break; - case CollectionAction.sortByName: - settings.collectionSortFactor = SortFactor.name; - collection.sort(SortFactor.name); + case CollectionAction.sort: + final factor = await showDialog( + context: context, + builder: (context) => SortCollectionDialog(), + ); + if (factor != null) { + settings.collectionSortFactor = factor; + collection.sort(factor); + } break; } } @@ -373,18 +333,13 @@ class _CollectionAppBarState extends State with SingleTickerPr enum CollectionAction { copy, + group, move, refresh, refreshMetadata, select, selectAll, selectNone, + sort, stats, - groupByAlbum, - groupByMonth, - groupByDay, - groupByNone, - sortByDate, - sortBySize, - sortByName, } diff --git a/lib/widgets/common/action_delegates/group_collection_dialog.dart b/lib/widgets/common/action_delegates/group_collection_dialog.dart new file mode 100644 index 000000000..744242af3 --- /dev/null +++ b/lib/widgets/common/action_delegates/group_collection_dialog.dart @@ -0,0 +1,61 @@ +import 'package:aves/model/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/utils/constants.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +class GroupCollectionDialog extends StatefulWidget { + @override + _GroupCollectionDialogState createState() => _GroupCollectionDialogState(); +} + +class _GroupCollectionDialogState extends State { + GroupFactor _selectedGroup; + + @override + void initState() { + super.initState(); + _selectedGroup = settings.collectionGroupFactor; + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text('Group'), + content: ListView( + shrinkWrap: true, + children: [ + _buildRadioListTile(GroupFactor.album, 'By album'), + _buildRadioListTile(GroupFactor.month, 'By month'), + _buildRadioListTile(GroupFactor.day, 'By day'), + _buildRadioListTile(GroupFactor.none, 'Do not group'), + ], + ), + contentPadding: EdgeInsets.only(top: 20), + actions: [ + FlatButton( + onPressed: () => Navigator.pop(context), + child: Text('Cancel'.toUpperCase()), + ), + FlatButton( + onPressed: () => Navigator.pop(context, _selectedGroup), + child: Text('Apply'.toUpperCase()), + ), + ], + actionsPadding: Constants.dialogActionsPadding, + shape: Constants.dialogShape, + ); + } + + Widget _buildRadioListTile(GroupFactor group, String title) => RadioListTile( + value: group, + groupValue: _selectedGroup, + onChanged: (group) => setState(() => _selectedGroup = group), + title: Text( + title, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ); +} diff --git a/lib/widgets/common/action_delegates/sort_collection_dialog.dart b/lib/widgets/common/action_delegates/sort_collection_dialog.dart new file mode 100644 index 000000000..b00143c0a --- /dev/null +++ b/lib/widgets/common/action_delegates/sort_collection_dialog.dart @@ -0,0 +1,60 @@ +import 'package:aves/model/settings.dart'; +import 'package:aves/model/source/collection_lens.dart'; +import 'package:aves/utils/constants.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +class SortCollectionDialog extends StatefulWidget { + @override + _SortCollectionDialogState createState() => _SortCollectionDialogState(); +} + +class _SortCollectionDialogState extends State { + SortFactor _selectedSort; + + @override + void initState() { + super.initState(); + _selectedSort = settings.collectionSortFactor; + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text('Sort'), + content: ListView( + shrinkWrap: true, + children: [ + _buildRadioListTile(SortFactor.date, 'By date'), + _buildRadioListTile(SortFactor.size, 'By size'), + _buildRadioListTile(SortFactor.name, 'By album & file name'), + ], + ), + contentPadding: EdgeInsets.only(top: 20), + actions: [ + FlatButton( + onPressed: () => Navigator.pop(context), + child: Text('Cancel'.toUpperCase()), + ), + FlatButton( + onPressed: () => Navigator.pop(context, _selectedSort), + child: Text('Apply'.toUpperCase()), + ), + ], + actionsPadding: Constants.dialogActionsPadding, + shape: Constants.dialogShape, + ); + } + + Widget _buildRadioListTile(SortFactor sort, String title) => RadioListTile( + value: sort, + groupValue: _selectedSort, + onChanged: (sort) => setState(() => _selectedSort = sort), + title: Text( + title, + softWrap: false, + overflow: TextOverflow.fade, + maxLines: 1, + ), + ); +} diff --git a/lib/widgets/common/icons.dart b/lib/widgets/common/icons.dart index ef354b4bf..1c10cdcaf 100644 --- a/lib/widgets/common/icons.dart +++ b/lib/widgets/common/icons.dart @@ -32,6 +32,7 @@ class AIcons { static const IconData favourite = OMIcons.favoriteBorder; static const IconData favouriteActive = OMIcons.favorite; static const IconData goUp = OMIcons.arrowUpward; + static const IconData group = OMIcons.groupWork; static const IconData info = OMIcons.info; static const IconData openInNew = OMIcons.openInNew; static const IconData print = OMIcons.print;