tab swipe to close

This commit is contained in:
Fabian Freund
2025-08-11 16:39:27 +02:00
parent e432a56cd0
commit 33700bf509
@@ -258,6 +258,7 @@ class SingleTabPreview extends HookConsumerWidget {
final String tabId; final String tabId;
final String? activeTabId; final String? activeTabId;
final String? sourceSearchQuery; final String? sourceSearchQuery;
final double deleteThreshold;
final void Function() onClose; final void Function() onClose;
@@ -266,6 +267,7 @@ class SingleTabPreview extends HookConsumerWidget {
required this.activeTabId, required this.activeTabId,
required this.onClose, required this.onClose,
required this.sourceSearchQuery, required this.sourceSearchQuery,
this.deleteThreshold = 100,
}) : super(key: ValueKey(tabId)); }) : super(key: ValueKey(tabId));
@override @override
@@ -276,7 +278,32 @@ class SingleTabPreview extends HookConsumerWidget {
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
return TabPreview( final dragStartPosition = useRef(Offset.zero);
final draggedDistance = useState(0.0);
return GestureDetector(
onHorizontalDragStart: (details) {
dragStartPosition.value = details.globalPosition;
draggedDistance.value = 0.0;
},
onHorizontalDragUpdate: (details) {
final cappedDistance = math.min(
(dragStartPosition.value - details.globalPosition).dx.abs(),
deleteThreshold,
);
draggedDistance.value = cappedDistance;
},
onHorizontalDragEnd: (details) async {
if (draggedDistance.value >= deleteThreshold) {
await ref.read(tabRepositoryProvider.notifier).closeTab(tab.id);
}
draggedDistance.value = 0.0;
},
child: Opacity(
opacity: 1.0 - draggedDistance.value / deleteThreshold,
child: TabPreview(
tab: tab, tab: tab,
isActive: tabId == activeTabId, isActive: tabId == activeTabId,
onTap: () async { onTap: () async {
@@ -316,6 +343,8 @@ class SingleTabPreview extends HookConsumerWidget {
onDelete: () async { onDelete: () async {
await ref.read(tabRepositoryProvider.notifier).closeTab(tab.id); await ref.read(tabRepositoryProvider.notifier).closeTab(tab.id);
}, },
),
),
); );
} }
} }