diff --git a/lib/widgets/collection/filter_bar.dart b/lib/widgets/collection/filter_bar.dart index cfe71641c..e447f934a 100644 --- a/lib/widgets/collection/filter_bar.dart +++ b/lib/widgets/collection/filter_bar.dart @@ -108,7 +108,7 @@ class _FilterBarState extends State { filter: filter, removable: true, heroType: HeroType.always, - onPressed: (filter) { + onTap: (filter) { _userRemovedFilter = filter; widget.onPressed(filter); }, diff --git a/lib/widgets/collection/search/expandable_filter_row.dart b/lib/widgets/collection/search/expandable_filter_row.dart index f3239c1f1..decf75f9f 100644 --- a/lib/widgets/collection/search/expandable_filter_row.dart +++ b/lib/widgets/collection/search/expandable_filter_row.dart @@ -10,14 +10,14 @@ class ExpandableFilterRow extends StatelessWidget { final Iterable filters; final ValueNotifier expandedNotifier; final HeroType Function(CollectionFilter filter) heroTypeBuilder; - final FilterCallback onPressed; + final FilterCallback onTap; const ExpandableFilterRow({ this.title, @required this.filters, this.expandedNotifier, this.heroTypeBuilder, - @required this.onPressed, + @required this.onTap, }); static const double horizontalPadding = 8; @@ -107,7 +107,7 @@ class ExpandableFilterRow extends StatelessWidget { key: Key(filter.key), filter: filter, heroType: heroTypeBuilder?.call(filter) ?? HeroType.onTap, - onPressed: onPressed, + onTap: onTap, ); } } diff --git a/lib/widgets/collection/search/search_delegate.dart b/lib/widgets/collection/search/search_delegate.dart index b63699f09..cbda818d6 100644 --- a/lib/widgets/collection/search/search_delegate.dart +++ b/lib/widgets/collection/search/search_delegate.dart @@ -138,7 +138,7 @@ class ImageSearchDelegate { filters: filters, expandedNotifier: expandedSectionNotifier, heroTypeBuilder: heroTypeBuilder, - onPressed: (filter) => _select(context, filter is QueryFilter ? QueryFilter(filter.query) : filter), + onTap: (filter) => _select(context, filter is QueryFilter ? QueryFilter(filter.query) : filter), ); } diff --git a/lib/widgets/common/action_delegates/selection_action_delegate.dart b/lib/widgets/common/action_delegates/selection_action_delegate.dart index 4f5fd8d9a..3b84c3525 100644 --- a/lib/widgets/common/action_delegates/selection_action_delegate.dart +++ b/lib/widgets/common/action_delegates/selection_action_delegate.dart @@ -96,7 +96,7 @@ class SelectionActionDelegate with FeedbackMixin, PermissionAwareMixin { icon: AIcons.album, text: 'No albums', ), - onPressed: (filter) => Navigator.pop(context, (filter as AlbumFilter)?.album), + onTap: (filter) => Navigator.pop(context, (filter as AlbumFilter)?.album), ); }, ), diff --git a/lib/widgets/common/aves_filter_chip.dart b/lib/widgets/common/aves_filter_chip.dart index 7c383ad48..2c6ad8204 100644 --- a/lib/widgets/common/aves_filter_chip.dart +++ b/lib/widgets/common/aves_filter_chip.dart @@ -3,6 +3,7 @@ import 'package:aves/widgets/common/icons.dart'; import 'package:flutter/material.dart'; typedef FilterCallback = void Function(CollectionFilter filter); +typedef OffsetFilterCallback = void Function(CollectionFilter filter, Offset tapPosition); enum HeroType { always, onTap, never } @@ -13,7 +14,8 @@ class AvesFilterChip extends StatefulWidget { final Widget background; final Widget details; final HeroType heroType; - final FilterCallback onPressed; + final FilterCallback onTap; + final OffsetFilterCallback onLongPress; static final BorderRadius borderRadius = BorderRadius.circular(32); static const double outlineWidth = 2; @@ -31,7 +33,8 @@ class AvesFilterChip extends StatefulWidget { this.background, this.details, this.heroType = HeroType.onTap, - @required this.onPressed, + @required this.onTap, + this.onLongPress, }) : super(key: key); @override @@ -42,6 +45,7 @@ class _AvesFilterChipState extends State { Future _colorFuture; Color _outlineColor; bool _tapped; + Offset _tapPosition; CollectionFilter get filter => widget.filter; @@ -160,12 +164,14 @@ class _AvesFilterChipState extends State { borderRadius: borderRadius, ), child: InkWell( - onTap: widget.onPressed != null + onTapDown: (details) => _tapPosition = details.globalPosition, + onTap: widget.onTap != null ? () { - WidgetsBinding.instance.addPostFrameCallback((_) => widget.onPressed(filter)); + WidgetsBinding.instance.addPostFrameCallback((_) => widget.onTap(filter)); setState(() => _tapped = true); } : null, + onLongPress: widget.onLongPress != null ? () => widget.onLongPress(filter, _tapPosition) : null, borderRadius: borderRadius, child: FutureBuilder( future: _colorFuture, diff --git a/lib/widgets/filter_grids/decorated_filter_chip.dart b/lib/widgets/filter_grids/decorated_filter_chip.dart index 210311562..6ed7ec8ae 100644 --- a/lib/widgets/filter_grids/decorated_filter_chip.dart +++ b/lib/widgets/filter_grids/decorated_filter_chip.dart @@ -16,14 +16,16 @@ class DecoratedFilterChip extends StatelessWidget { final CollectionSource source; final CollectionFilter filter; final ImageEntry entry; - final FilterCallback onPressed; + final FilterCallback onTap; + final OffsetFilterCallback onLongPress; const DecoratedFilterChip({ Key key, @required this.source, @required this.filter, @required this.entry, - @required this.onPressed, + @required this.onTap, + this.onLongPress, }) : super(key: key); @override @@ -45,7 +47,8 @@ class DecoratedFilterChip extends StatelessWidget { showGenericIcon: false, background: backgroundImage, details: _buildDetails(filter), - onPressed: onPressed, + onTap: onTap, + onLongPress: onLongPress, ); } diff --git a/lib/widgets/filter_grids/filter_grid_page.dart b/lib/widgets/filter_grids/filter_grid_page.dart index 1d35d2a1e..47ea99a23 100644 --- a/lib/widgets/filter_grids/filter_grid_page.dart +++ b/lib/widgets/filter_grids/filter_grid_page.dart @@ -32,6 +32,7 @@ class FilterNavigationPage extends StatelessWidget { final Map filterEntries; final CollectionFilter Function(String key) filterBuilder; final Widget Function() emptyBuilder; + final OffsetFilterCallback onLongPress; const FilterNavigationPage({ @required this.source, @@ -40,6 +41,7 @@ class FilterNavigationPage extends StatelessWidget { @required this.filterEntries, @required this.filterBuilder, @required this.emptyBuilder, + this.onLongPress, }); @override @@ -66,7 +68,7 @@ class FilterNavigationPage extends StatelessWidget { return sourceState != SourceState.loading && emptyBuilder != null ? emptyBuilder() : SizedBox.shrink(); }, ), - onPressed: (filter) => Navigator.pushAndRemoveUntil( + onTap: (filter) => Navigator.pushAndRemoveUntil( context, MaterialPageRoute( settings: RouteSettings(name: CollectionPage.routeName), @@ -79,6 +81,7 @@ class FilterNavigationPage extends StatelessWidget { ), settings.navRemoveRoutePredicate(CollectionPage.routeName), ), + onLongPress: onLongPress, ); } @@ -123,7 +126,8 @@ class FilterGridPage extends StatelessWidget { final Map filterEntries; final CollectionFilter Function(String key) filterBuilder; final Widget Function() emptyBuilder; - final FilterCallback onPressed; + final FilterCallback onTap; + final OffsetFilterCallback onLongPress; const FilterGridPage({ @required this.source, @@ -131,7 +135,8 @@ class FilterGridPage extends StatelessWidget { @required this.filterEntries, @required this.filterBuilder, @required this.emptyBuilder, - @required this.onPressed, + @required this.onTap, + this.onLongPress, }); List get filterKeys => filterEntries.keys.toList(); @@ -169,7 +174,8 @@ class FilterGridPage extends StatelessWidget { source: source, filter: filterBuilder(key), entry: filterEntries[key], - onPressed: onPressed, + onTap: onTap, + onLongPress: onLongPress, ); return AnimationConfiguration.staggeredGrid( position: i, diff --git a/lib/widgets/fullscreen/info/basic_section.dart b/lib/widgets/fullscreen/info/basic_section.dart index 0880e9867..82e1307c5 100644 --- a/lib/widgets/fullscreen/info/basic_section.dart +++ b/lib/widgets/fullscreen/info/basic_section.dart @@ -74,7 +74,7 @@ class BasicSection extends StatelessWidget { children: effectiveFilters .map((filter) => AvesFilterChip( filter: filter, - onPressed: onFilter, + onTap: onFilter, )) .toList(), ), diff --git a/lib/widgets/fullscreen/info/location_section.dart b/lib/widgets/fullscreen/info/location_section.dart index 665379805..8c53dc01f 100644 --- a/lib/widgets/fullscreen/info/location_section.dart +++ b/lib/widgets/fullscreen/info/location_section.dart @@ -119,7 +119,7 @@ class _LocationSectionState extends State { children: filters .map((filter) => AvesFilterChip( filter: filter, - onPressed: widget.onFilter, + onTap: widget.onFilter, )) .toList(), ), diff --git a/lib/widgets/stats/filter_table.dart b/lib/widgets/stats/filter_table.dart index ed946bae8..958f63a62 100644 --- a/lib/widgets/stats/filter_table.dart +++ b/lib/widgets/stats/filter_table.dart @@ -54,7 +54,7 @@ class FilterTable extends StatelessWidget { alignment: AlignmentDirectional.centerStart, child: AvesFilterChip( filter: filter, - onPressed: (filter) => _goToCollection(context, filter), + onTap: (filter) => _goToCollection(context, filter), ), ), if (showPercentIndicator)