@@ -76,9 +76,14 @@ final class RestoreImageSelectionController: ObservableObject {
7676 }
7777 }
7878
79+ private var inputCatalog : SoftwareCatalog ?
80+ private var guestType = VBGuestType . mac
81+
7982 func loadRestoreImageOptions( for guest: VBGuestType ) {
8083 logger. debug ( " Loading restore image options. " )
8184
85+ guestType = guest
86+
8287 deferredStartLoading ( )
8388
8489 Task {
@@ -99,13 +104,9 @@ final class RestoreImageSelectionController: ObservableObject {
99104 #endif
100105
101106 let catalog = try await api. fetchRestoreImages ( for: guest)
102- let platform : CatalogGuestPlatform = guest == . linux ? . linux : . mac
103- let resolved = ResolvedCatalog ( environment: . current. guest ( platform: platform) , catalog: catalog)
107+ inputCatalog = catalog
104108
105- await MainActor . run {
106- self . selectedGroup = resolved. groups. first
107- self . catalog = resolved
108- }
109+ await refreshResolvedCatalog ( with: catalog)
109110 } catch {
110111 logger. error ( " Loading restore images failed - \( error, privacy: . public) " )
111112
@@ -116,6 +117,47 @@ final class RestoreImageSelectionController: ObservableObject {
116117 }
117118 }
118119 }
120+
121+ private func refreshResolvedCatalog( with catalog: SoftwareCatalog ) async {
122+ logger. debug ( #function)
123+
124+ let platform : CatalogGuestPlatform = guestType == . linux ? . linux : . mac
125+ let resolved = ResolvedCatalog ( environment: . current. guest ( platform: platform) , catalog: catalog)
126+
127+ await MainActor . run {
128+ self . selectedGroup = resolved. groups. first ( where: { $0. id == selectedGroup? . id } ) ?? resolved. groups. first
129+ self . selectedRestoreImage = selectedGroup? . restoreImages. first ( where: { $0. id == self . selectedRestoreImage? . id } )
130+ self . catalog = resolved
131+ }
132+ }
133+
134+ func deleteLocalDownload( for image: ResolvedRestoreImage ) {
135+ logger. debug ( " Delete download requested for \( image. id) " )
136+
137+ /// Remove selection to force refresh of image browser.
138+ selectedRestoreImage = nil
139+
140+ do {
141+ let fileURL = try image. localFileURL. require ( " File not found. " )
142+ Task {
143+ do {
144+ try await NSWorkspace . shared. recycle ( [ fileURL] )
145+
146+ if let inputCatalog {
147+ await refreshResolvedCatalog ( with: inputCatalog)
148+ }
149+ } catch {
150+ logger. error ( " Recycle failed for \( fileURL. path) - \( error, privacy: . public) " )
151+
152+ NSApp . presentError ( error)
153+ }
154+ }
155+ } catch {
156+ logger. error ( " Delete download failed for \( image. id) - \( error, privacy: . public) " )
157+
158+ NSApp . presentError ( error)
159+ }
160+ }
119161}
120162
121163extension ChannelGroup {
0 commit comments