Skip to content

Commit fb82633

Browse files
committed
Photos.app clipboard integration
1 parent d48beef commit fb82633

File tree

14 files changed

+345
-122
lines changed

14 files changed

+345
-122
lines changed

.vscode/tasks.json

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,27 @@
1414
}
1515
},
1616
{
17-
"label": "Swift",
17+
"label": "Swift: Run File",
1818
"type": "shell",
1919
"command": "swift ${file}",
2020
"group": {
2121
"kind": "build",
22-
"isDefault": true
22+
"isDefault": false
2323
},
2424
"presentation": {
2525
"reveal": "always"
2626
},
2727
"problemMatcher": "$swiftc",
28+
},
29+
{
30+
"label": "Xcode: Build & Run",
31+
"type": "shell",
32+
"command": "osascript -e 'tell application \"Xcode\" to run the first workspace document'",
33+
"problemMatcher": [],
34+
"presentation": {
35+
"reveal": "silent",
36+
"panel": "shared"
37+
}
2838
}
2939
]
3040
}

Clop.xcodeproj/project.pbxproj

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,7 @@
11511151
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
11521152
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
11531153
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
1154+
AUTOMATION_APPLE_EVENTS = NO;
11541155
CODE_SIGN_ENTITLEMENTS = Clop/Clop.entitlements;
11551156
CODE_SIGN_IDENTITY = "Apple Development";
11561157
CODE_SIGN_STYLE = Automatic;
@@ -1162,6 +1163,12 @@
11621163
ENABLE_HARDENED_RUNTIME = YES;
11631164
ENABLE_NS_ASSERTIONS = YES;
11641165
ENABLE_PREVIEWS = YES;
1166+
ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;
1167+
ENABLE_RESOURCE_ACCESS_CALENDARS = NO;
1168+
ENABLE_RESOURCE_ACCESS_CAMERA = NO;
1169+
ENABLE_RESOURCE_ACCESS_CONTACTS = NO;
1170+
ENABLE_RESOURCE_ACCESS_LOCATION = NO;
1171+
ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = YES;
11651172
GENERATE_INFOPLIST_FILE = YES;
11661173
INFOPLIST_FILE = Clop/Info.plist;
11671174
INFOPLIST_KEY_CFBundleDisplayName = Clop;
@@ -1182,6 +1189,12 @@
11821189
PRODUCT_BUNDLE_IDENTIFIER = com.lowtechguys.Clop;
11831190
PRODUCT_NAME = "$(TARGET_NAME)";
11841191
PROVISIONING_PROFILE_SPECIFIER = "";
1192+
RUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO;
1193+
RUNTIME_EXCEPTION_ALLOW_JIT = NO;
1194+
RUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO;
1195+
RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO;
1196+
RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO;
1197+
RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO;
11851198
SWIFT_DISABLE_SAFETY_CHECKS = NO;
11861199
SWIFT_EMIT_LOC_STRINGS = YES;
11871200
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -1195,6 +1208,7 @@
11951208
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
11961209
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
11971210
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
1211+
AUTOMATION_APPLE_EVENTS = NO;
11981212
CODE_SIGN_ENTITLEMENTS = Clop/Clop.entitlements;
11991213
CODE_SIGN_IDENTITY = "Apple Development";
12001214
CODE_SIGN_STYLE = Automatic;
@@ -1205,6 +1219,12 @@
12051219
DEVELOPMENT_TEAM = RDDXV84A73;
12061220
ENABLE_HARDENED_RUNTIME = YES;
12071221
ENABLE_PREVIEWS = YES;
1222+
ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;
1223+
ENABLE_RESOURCE_ACCESS_CALENDARS = NO;
1224+
ENABLE_RESOURCE_ACCESS_CAMERA = NO;
1225+
ENABLE_RESOURCE_ACCESS_CONTACTS = NO;
1226+
ENABLE_RESOURCE_ACCESS_LOCATION = NO;
1227+
ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = YES;
12081228
GENERATE_INFOPLIST_FILE = YES;
12091229
INFOPLIST_FILE = Clop/Info.plist;
12101230
INFOPLIST_KEY_CFBundleDisplayName = Clop;
@@ -1226,6 +1246,12 @@
12261246
PRODUCT_BUNDLE_IDENTIFIER = com.lowtechguys.Clop;
12271247
PRODUCT_NAME = "$(TARGET_NAME)";
12281248
PROVISIONING_PROFILE_SPECIFIER = "";
1249+
RUNTIME_EXCEPTION_ALLOW_DYLD_ENVIRONMENT_VARIABLES = NO;
1250+
RUNTIME_EXCEPTION_ALLOW_JIT = NO;
1251+
RUNTIME_EXCEPTION_ALLOW_UNSIGNED_EXECUTABLE_MEMORY = NO;
1252+
RUNTIME_EXCEPTION_DEBUGGING_TOOL = NO;
1253+
RUNTIME_EXCEPTION_DISABLE_EXECUTABLE_PAGE_PROTECTION = NO;
1254+
RUNTIME_EXCEPTION_DISABLE_LIBRARY_VALIDATION = NO;
12291255
SWIFT_DISABLE_SAFETY_CHECKS = NO;
12301256
SWIFT_EMIT_LOC_STRINGS = YES;
12311257
SWIFT_VERSION = 5.0;

Clop.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Clop/ClopApp.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,10 @@ class AppDelegate: AppDelegateParent {
900900
if item.existingFilePath?.isPDF ?? false {
901901
return
902902
}
903+
if item.types.contains(.photosReferenceAsset) {
904+
optimiseClipboardPhotos()
905+
return
906+
}
903907
optimiseClipboardImage(item: item)
904908
}
905909
}
@@ -1516,8 +1520,6 @@ struct ClopApp: App {
15161520
(PRO?.productActivated ?? false) || (PRO?.onTrial ?? false)
15171521
}
15181522

1519-
import ObjectiveC.runtime
1520-
15211523
extension NSFilePromiseReceiver {
15221524
static let swizzleReceivePromisedFiles: String = {
15231525
let originalSelector = #selector(receivePromisedFiles(atDestination:options:operationQueue:reader:))

Clop/FloatingResult.swift

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,52 @@ extension View {
3434
struct FloatingResultList: View {
3535
var optimisers: [Optimiser]
3636

37+
@State var copiedText = "Copy all"
38+
@Default(.floatingResultsCorner) var floatingResultsCorner
39+
40+
var copyAllButton: some View {
41+
Button(copiedText) {
42+
let pasteboard = NSPasteboard.general
43+
pasteboard.clearContents()
44+
let urls = optimisers.compactMap(\.url)
45+
pasteboard.writeObjects(urls as [NSPasteboardWriting])
46+
copiedText = "Copied!"
47+
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
48+
copiedText = "Copy all"
49+
}
50+
}
51+
.buttonStyle(FlatButton(color: .inverted.opacity(0.9), textColor: .primary, radius: 7, verticalPadding: 2))
52+
.font(.medium(11))
53+
.focusable(false)
54+
}
55+
56+
var clearAllButton: some View {
57+
Button("Clear all") {
58+
for optimiser in optimisers {
59+
optimiser.remove(after: 100, withAnimation: true)
60+
}
61+
}
62+
.buttonStyle(FlatButton(color: .inverted.opacity(0.9), textColor: .primary, radius: 7, verticalPadding: 2))
63+
.font(.medium(11))
64+
.focusable(false)
65+
}
66+
3767
var body: some View {
38-
ForEach(optimisers) { optimiser in
39-
FloatingResult(optimiser: optimiser, linear: optimisers.count > 1)
40-
.gesture(TapGesture(count: 2).onEnded {
41-
if let url = optimiser.url {
42-
NSWorkspace.shared.open(url)
43-
}
44-
})
68+
VStack(alignment: floatingResultsCorner.isTrailing ? .leading : .trailing, spacing: 10) {
69+
ForEach(optimisers) { optimiser in
70+
FloatingResult(optimiser: optimiser, linear: optimisers.count > 1)
71+
.gesture(TapGesture(count: 2).onEnded {
72+
if let url = optimiser.url {
73+
NSWorkspace.shared.open(url)
74+
}
75+
})
76+
}
77+
if optimisers.count > 1 {
78+
HStack {
79+
copyAllButton
80+
clearAllButton
81+
}.padding(floatingResultsCorner.isTrailing ? .leading : .trailing, 18)
82+
}
4583
}
4684
}
4785
}

0 commit comments

Comments
 (0)