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/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,
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 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;
|
||||||
|
|
Loading…
Reference in a new issue