@@ -10,6 +10,7 @@ import SwiftUI
1010/// Full-tab favorites view with folder hierarchy and bottom toolbar
1111struct FavoritesTabView : View {
1212 @State private var viewModel : FavoritesSidebarViewModel
13+ @State private var selectedFavoriteIds : Set < String > = [ ]
1314 @State private var folderToDelete : SQLFavoriteFolder ?
1415 @State private var showDeleteFolderAlert = false
1516 let searchText : String
@@ -67,7 +68,7 @@ struct FavoritesTabView: View {
6768 // MARK: - List
6869
6970 private func favoritesList( _ items: [ FavoriteTreeItem ] ) -> some View {
70- List {
71+ List ( selection : $selectedFavoriteIds ) {
7172 ForEach ( items) { item in
7273 FavoriteTreeItemRow (
7374 item: item,
@@ -78,10 +79,45 @@ struct FavoritesTabView: View {
7879 showDeleteFolderAlert = true
7980 }
8081 )
82+ . tag ( item. id)
8183 }
8284 }
8385 . listStyle ( . sidebar)
8486 . scrollContentBackground ( . hidden)
87+ . onDeleteCommand {
88+ deleteSelectedFavorites ( )
89+ }
90+ . contextMenu {
91+ if !selectedFavoriteIds. isEmpty {
92+ Button ( role: . destructive) {
93+ deleteSelectedFavorites ( )
94+ } label: {
95+ Label ( String ( localized: " Delete Selected " ) , systemImage: " trash " )
96+ }
97+ }
98+ }
99+ }
100+
101+ private func deleteSelectedFavorites( ) {
102+ let allFavorites = collectFavorites ( from: viewModel. treeItems)
103+ let toDelete = allFavorites. filter { selectedFavoriteIds. contains ( " fav- \( $0. id) " ) }
104+ for fav in toDelete {
105+ viewModel. deleteFavorite ( fav)
106+ }
107+ selectedFavoriteIds. removeAll ( )
108+ }
109+
110+ private func collectFavorites( from items: [ FavoriteTreeItem ] ) -> [ SQLFavorite ] {
111+ var result : [ SQLFavorite ] = [ ]
112+ for item in items {
113+ switch item {
114+ case . favorite( let fav) :
115+ result. append ( fav)
116+ case . folder( _, let children) :
117+ result. append ( contentsOf: collectFavorites ( from: children) )
118+ }
119+ }
120+ return result
85121 }
86122
87123 // MARK: - Empty States
0 commit comments