@@ -16,7 +16,7 @@ struct CapturePreviewStrip: View {
1616 CapturePreviewThumbnail (
1717 capture: capture,
1818 isSelected: capture. id == selectedID
19- )
19+ ) { dragItemProvider ( for : capture ) }
2020 }
2121 . buttonStyle ( . plain)
2222 }
@@ -44,6 +44,7 @@ struct CapturePreviewStrip: View {
4444private struct CapturePreviewThumbnail : View {
4545 let capture : CaptureMedia
4646 let isSelected : Bool
47+ var dragItemProvider : ( ) -> NSItemProvider
4748
4849 private let height : CGFloat = 80
4950
@@ -59,6 +60,7 @@ private struct CapturePreviewThumbnail: View {
5960 . frame ( width: targetWidth, height: height)
6061 . clipShape ( RoundedRectangle ( cornerRadius: 4 , style: . continuous) )
6162 . anchorPreference ( key: PreviewSelectionBoundsKey . self, value: . bounds) { isSelected ? $0 : nil }
63+ . onDrag { dragItemProvider ( ) }
6264 }
6365
6466 @ViewBuilder private var thumbnail : some View {
@@ -103,6 +105,33 @@ private struct CapturePreviewThumbnail: View {
103105 }
104106}
105107
108+ private extension CapturePreviewStrip {
109+ func makeTempDragFile( for capture: CaptureMedia ) -> URL ? {
110+ guard let kind = capture. media. saveKind, let url = capture. media. url else { return nil }
111+
112+ do {
113+ let fileStore = AppServices . shared. fileStore
114+ let fileURL = fileStore. makeDragDestination (
115+ capturedAt: capture. media. capturedAt,
116+ kind: kind
117+ )
118+ if !FileManager. default. fileExists ( atPath: fileURL. path) {
119+ try FileManager . default. copyItem ( at: url, to: fileURL)
120+ }
121+ return fileURL
122+ } catch {
123+ return nil
124+ }
125+ }
126+
127+ func dragItemProvider( for capture: CaptureMedia ) -> NSItemProvider {
128+ if let url = makeTempDragFile ( for: capture) {
129+ return NSItemProvider ( object: url as NSURL )
130+ }
131+ return NSItemProvider ( )
132+ }
133+ }
134+
106135private struct PreviewSelectionBoundsKey : PreferenceKey {
107136 static let defaultValue : Anchor < CGRect > ? = nil
108137
0 commit comments