From 23f18ab27613c69e38097d26c67dbbf8f554b9a4 Mon Sep 17 00:00:00 2001 From: zarzet Date: Mon, 27 Jul 2026 01:08:32 +0700 Subject: [PATCH] fix(queue): give completion-bridge cells swipe navigation into the library list --- lib/screens/queue_tab_collection_items.dart | 24 +++++++++++++++----- lib/screens/queue_tab_filter_widgets.dart | 25 +++++++++++++++++++++ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/lib/screens/queue_tab_collection_items.dart b/lib/screens/queue_tab_collection_items.dart index 97fd4d5f..6ccf87a4 100644 --- a/lib/screens/queue_tab_collection_items.dart +++ b/lib/screens/queue_tab_collection_items.dart @@ -149,8 +149,10 @@ extension _QueueTabCollectionItemWidgets on _QueueTabState { BuildContext context, DownloadItem item, ColorScheme colorScheme, - DownloadHistoryItem? historyItem, - ) { + DownloadHistoryItem? historyItem, { + List? navigationItems, + int? navigationIndex, + }) { final track = item.track; final radius = BorderRadius.circular(8); final unifiedItem = historyItem == null @@ -178,7 +180,11 @@ extension _QueueTabCollectionItemWidgets on _QueueTabState { label: context.l10n.a11yTrackByArtist(trackName, artistName), child: GestureDetector( onTap: () => historyItem != null - ? _navigateToHistoryMetadataScreen(historyItem) + ? _navigateToHistoryMetadataScreen( + historyItem, + navigationItems: navigationItems, + navigationIndex: navigationIndex, + ) : _navigateToMetadataScreen(item), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -232,8 +238,10 @@ extension _QueueTabCollectionItemWidgets on _QueueTabState { BuildContext context, DownloadItem item, ColorScheme colorScheme, - DownloadHistoryItem? historyItem, - ) { + DownloadHistoryItem? historyItem, { + List? navigationItems, + int? navigationIndex, + }) { final track = item.track; final coverSize = _queueCoverSize(); final radius = BorderRadius.circular(8); @@ -269,7 +277,11 @@ extension _QueueTabCollectionItemWidgets on _QueueTabState { clipBehavior: Clip.antiAlias, child: InkWell( onTap: () => historyItem != null - ? _navigateToHistoryMetadataScreen(historyItem) + ? _navigateToHistoryMetadataScreen( + historyItem, + navigationItems: navigationItems, + navigationIndex: navigationIndex, + ) : _navigateToMetadataScreen(item), child: Padding( padding: const EdgeInsets.all(12), diff --git a/lib/screens/queue_tab_filter_widgets.dart b/lib/screens/queue_tab_filter_widgets.dart index eff362f2..ad6abded 100644 --- a/lib/screens/queue_tab_filter_widgets.dart +++ b/lib/screens/queue_tab_filter_widgets.dart @@ -173,6 +173,27 @@ extension _QueueTabFilterWidgets on _QueueTabState { } } + // Completion-bridge tracks are hidden from filteredUnifiedItems, so weave + // them into the front of the swipe-navigation list (matching their pinned + // lead-zone position) — otherwise a just-downloaded track opens with no + // swipe navigation at all until its row lands in the library query. + final bridgeNavigationIndexById = {}; + if (bridgeIds.isNotEmpty) { + final bridgeHistoryItems = []; + for (final id in bridgeIds) { + final historyItem = bridgeHistoryById[id]; + if (historyItem == null) continue; + bridgeNavigationIndexById[id] = bridgeHistoryItems.length; + bridgeHistoryItems.add(historyItem); + } + if (bridgeHistoryItems.isNotEmpty) { + downloadedNavigationItems.insertAll(0, bridgeHistoryItems); + downloadedNavigationIndexByUnifiedId.updateAll( + (_, index) => index + bridgeHistoryItems.length, + ); + } + } + final leadCount = activeDownloadIds.length + bridgeIds.length; final collectionEntries = filterMode == 'all' ? _getVisibleCollectionEntries(collectionState) @@ -197,6 +218,8 @@ extension _QueueTabFilterWidgets on _QueueTabState { _completionBridge[bridgeId]!, colorScheme, bridgeHistoryById[bridgeId], + navigationItems: downloadedNavigationItems, + navigationIndex: bridgeNavigationIndexById[bridgeId], ), ); } @@ -219,6 +242,8 @@ extension _QueueTabFilterWidgets on _QueueTabState { _completionBridge[bridgeId]!, colorScheme, bridgeHistoryById[bridgeId], + navigationItems: downloadedNavigationItems, + navigationIndex: bridgeNavigationIndexById[bridgeId], ), ); }