Skip to content

Commit fdd6ff7

Browse files
authored
Drag and drop from the capture preview strip (#26)
* Drag and drop from the capture preview strip * lints/formatting
1 parent 711e408 commit fdd6ff7

1 file changed

Lines changed: 30 additions & 1 deletion

File tree

Snap-O/CaptureWindow/CapturePreviewStrip.swift

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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 {
4444
private 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+
106135
private struct PreviewSelectionBoundsKey: PreferenceKey {
107136
static let defaultValue: Anchor<CGRect>? = nil
108137

0 commit comments

Comments
 (0)