collection: replaced sort/group menu items by selection dialogs

This commit is contained in:
Thibault Deckers 2020-08-02 16:42:44 +09:00
parent 93ebd25f70
commit d3e0dd9375
4 changed files with 154 additions and 77 deletions

View file

@ -6,7 +6,9 @@ import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/utils/durations.dart'; import 'package:aves/utils/durations.dart';
import 'package:aves/widgets/album/filter_bar.dart'; import 'package:aves/widgets/album/filter_bar.dart';
import 'package:aves/widgets/album/search/search_delegate.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/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/app_bar_subtitle.dart';
import 'package:aves/widgets/common/data_providers/media_store_collection_provider.dart'; import 'package:aves/widgets/common/data_providers/media_store_collection_provider.dart';
import 'package:aves/widgets/common/entry_actions.dart'; import 'package:aves/widgets/common/entry_actions.dart';
@ -185,8 +187,15 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
itemBuilder: (context) { itemBuilder: (context) {
final hasSelection = collection.selection.isNotEmpty; final hasSelection = collection.selection.isNotEmpty;
return [ return [
..._buildSortMenuItems(), PopupMenuItem(
..._buildGroupMenuItems(), 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 (collection.isBrowsing) ...[
if (AvesApp.mode == AppMode.main) if (AvesApp.mode == AppMode.main)
if (kDebugMode) if (kDebugMode)
@ -204,6 +213,7 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
), ),
], ],
if (collection.isSelecting) ...[ if (collection.isSelecting) ...[
PopupMenuDivider(),
PopupMenuItem( PopupMenuItem(
value: CollectionAction.copy, value: CollectionAction.copy,
enabled: hasSelection, enabled: hasSelection,
@ -238,48 +248,6 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
]; ];
} }
List<PopupMenuEntry<CollectionAction>> _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<PopupMenuEntry<CollectionAction>> _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() { void _onActivityChange() {
if (collection.isSelecting) { if (collection.isSelecting) {
_browseToSelectAnimation.forward(); _browseToSelectAnimation.forward();
@ -321,33 +289,25 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
case CollectionAction.stats: case CollectionAction.stats:
unawaited(_goToStats()); unawaited(_goToStats());
break; break;
case CollectionAction.groupByAlbum: case CollectionAction.group:
settings.collectionGroupFactor = GroupFactor.album; final factor = await showDialog<GroupFactor>(
collection.group(GroupFactor.album); context: context,
builder: (context) => GroupCollectionDialog(),
);
if (factor != null) {
settings.collectionGroupFactor = factor;
collection.group(factor);
}
break; break;
case CollectionAction.groupByMonth: case CollectionAction.sort:
settings.collectionGroupFactor = GroupFactor.month; final factor = await showDialog<SortFactor>(
collection.group(GroupFactor.month); context: context,
break; builder: (context) => SortCollectionDialog(),
case CollectionAction.groupByDay: );
settings.collectionGroupFactor = GroupFactor.day; if (factor != null) {
collection.group(GroupFactor.day); settings.collectionSortFactor = factor;
break; collection.sort(factor);
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);
break; break;
} }
} }
@ -373,18 +333,13 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
enum CollectionAction { enum CollectionAction {
copy, copy,
group,
move, move,
refresh, refresh,
refreshMetadata, refreshMetadata,
select, select,
selectAll, selectAll,
selectNone, selectNone,
sort,
stats, stats,
groupByAlbum,
groupByMonth,
groupByDay,
groupByNone,
sortByDate,
sortBySize,
sortByName,
} }

View file

@ -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<GroupCollectionDialog> {
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<GroupFactor>(
value: group,
groupValue: _selectedGroup,
onChanged: (group) => setState(() => _selectedGroup = group),
title: Text(
title,
softWrap: false,
overflow: TextOverflow.fade,
maxLines: 1,
),
);
}

View file

@ -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<SortCollectionDialog> {
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<SortFactor>(
value: sort,
groupValue: _selectedSort,
onChanged: (sort) => setState(() => _selectedSort = sort),
title: Text(
title,
softWrap: false,
overflow: TextOverflow.fade,
maxLines: 1,
),
);
}

View file

@ -32,6 +32,7 @@ class AIcons {
static const IconData favourite = OMIcons.favoriteBorder; static const IconData favourite = OMIcons.favoriteBorder;
static const IconData favouriteActive = OMIcons.favorite; static const IconData favouriteActive = OMIcons.favorite;
static const IconData goUp = OMIcons.arrowUpward; static const IconData goUp = OMIcons.arrowUpward;
static const IconData group = OMIcons.groupWork;
static const IconData info = OMIcons.info; static const IconData info = OMIcons.info;
static const IconData openInNew = OMIcons.openInNew; static const IconData openInNew = OMIcons.openInNew;
static const IconData print = OMIcons.print; static const IconData print = OMIcons.print;