tab swipe to close
This commit is contained in:
@@ -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);
|
||||||
},
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user