support long press gesture

This commit is contained in:
Fabian Freund
2025-10-02 11:46:59 +02:00
parent a3681ad3c6
commit 20f077d254
2 changed files with 46 additions and 20 deletions
@@ -44,6 +44,7 @@ class ContainerChips extends HookConsumerWidget {
final bool Function(ContainerDataWithCount)? containerFilter; final bool Function(ContainerDataWithCount)? containerFilter;
final void Function(ContainerDataWithCount?)? onSelected; final void Function(ContainerDataWithCount?)? onSelected;
final void Function(ContainerDataWithCount)? onDeleted; final void Function(ContainerDataWithCount)? onDeleted;
final void Function(ContainerDataWithCount)? onLongPress;
final ValueListenable<TextEditingValue>? searchTextListenable; final ValueListenable<TextEditingValue>? searchTextListenable;
@@ -51,6 +52,7 @@ class ContainerChips extends HookConsumerWidget {
required this.selectedContainer, required this.selectedContainer,
required this.onSelected, required this.onSelected,
required this.onDeleted, required this.onDeleted,
this.onLongPress,
this.containerFilter, this.containerFilter,
this.searchTextListenable, this.searchTextListenable,
this.displayMenu = true, this.displayMenu = true,
@@ -197,6 +199,7 @@ class ContainerChips extends HookConsumerWidget {
selectedItem: selectedContainer, selectedItem: selectedContainer,
onSelected: onSelected, onSelected: onSelected,
onDeleted: onDeleted, onDeleted: onDeleted,
onLongPress: onLongPress,
), ),
), ),
if (displayMenu) if (displayMenu)
@@ -19,6 +19,7 @@
*/ */
import 'package:fading_scroll/fading_scroll.dart'; import 'package:fading_scroll/fading_scroll.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:nullability/nullability.dart';
class _BadgeWrapper extends StatelessWidget { class _BadgeWrapper extends StatelessWidget {
final Widget child; final Widget child;
@@ -39,6 +40,20 @@ class _BadgeWrapper extends StatelessWidget {
} }
} }
class _GestureWrapper extends StatelessWidget {
final Widget child;
final GestureLongPressCallback? onLongPress;
const _GestureWrapper({required this.child, this.onLongPress});
@override
Widget build(BuildContext context) {
return onLongPress != null
? InkWell(onLongPress: onLongPress, child: child)
: child;
}
}
class SelectableChips<T extends S, S, K> extends StatelessWidget { class SelectableChips<T extends S, S, K> extends StatelessWidget {
final List<T> availableItems; final List<T> availableItems;
final List<Widget> prefixListItems; final List<Widget> prefixListItems;
@@ -56,6 +71,7 @@ class SelectableChips<T extends S, S, K> extends StatelessWidget {
final void Function(T item)? onSelected; final void Function(T item)? onSelected;
final void Function(T item)? onDeleted; final void Function(T item)? onDeleted;
final void Function(T item)? onLongPress;
const SelectableChips({ const SelectableChips({
required this.itemId, required this.itemId,
@@ -71,6 +87,7 @@ class SelectableChips<T extends S, S, K> extends StatelessWidget {
this.deleteIcon = true, this.deleteIcon = true,
this.onSelected, this.onSelected,
this.onDeleted, this.onDeleted,
this.onLongPress,
super.key, super.key,
}); });
@@ -110,6 +127,11 @@ class SelectableChips<T extends S, S, K> extends StatelessWidget {
padding: const EdgeInsets.only(right: 8.0, top: 4.0), padding: const EdgeInsets.only(right: 8.0, top: 4.0),
child: _BadgeWrapper( child: _BadgeWrapper(
count: itemBadgeCount?.call(item), count: itemBadgeCount?.call(item),
child: _GestureWrapper(
onLongPress: onLongPress.mapNotNull(
(callback) =>
() => callback(item),
),
child: FilterChip( child: FilterChip(
selected: selected:
selectedItem != null && selectedItem != null &&
@@ -132,6 +154,7 @@ class SelectableChips<T extends S, S, K> extends StatelessWidget {
tooltip: itemTooltip?.call(item), tooltip: itemTooltip?.call(item),
), ),
), ),
),
); );
return (itemWrap != null) ? itemWrap!(child, item) : child; return (itemWrap != null) ? itemWrap!(child, item) : child;