collection: replaced sort/group menu items by selection dialogs
This commit is contained in:
parent
93ebd25f70
commit
d3e0dd9375
4 changed files with 154 additions and 77 deletions
|
@ -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<CollectionAppBar> 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<CollectionAppBar> with SingleTickerPr
|
|||
),
|
||||
],
|
||||
if (collection.isSelecting) ...[
|
||||
PopupMenuDivider(),
|
||||
PopupMenuItem(
|
||||
value: CollectionAction.copy,
|
||||
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() {
|
||||
if (collection.isSelecting) {
|
||||
_browseToSelectAnimation.forward();
|
||||
|
@ -321,33 +289,25 @@ class _CollectionAppBarState extends State<CollectionAppBar> 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<GroupFactor>(
|
||||
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<SortFactor>(
|
||||
context: context,
|
||||
builder: (context) => SortCollectionDialog(),
|
||||
);
|
||||
if (factor != null) {
|
||||
settings.collectionSortFactor = factor;
|
||||
collection.sort(factor);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -373,18 +333,13 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
|
|||
|
||||
enum CollectionAction {
|
||||
copy,
|
||||
group,
|
||||
move,
|
||||
refresh,
|
||||
refreshMetadata,
|
||||
select,
|
||||
selectAll,
|
||||
selectNone,
|
||||
sort,
|
||||
stats,
|
||||
groupByAlbum,
|
||||
groupByMonth,
|
||||
groupByDay,
|
||||
groupByNone,
|
||||
sortByDate,
|
||||
sortBySize,
|
||||
sortByName,
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
);
|
||||
}
|
|
@ -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,
|
||||
),
|
||||
);
|
||||
}
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue