Skip to content

Commit 905eebd

Browse files
committed
Keybindings to open/close preview
1 parent 3a78f05 commit 905eebd

File tree

2 files changed

+111
-12
lines changed

2 files changed

+111
-12
lines changed

CodeEdit.xcodeproj/project.pbxproj

Lines changed: 80 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -675,10 +675,25 @@
675675
DEAD_CODE_STRIPPING = YES;
676676
DEVELOPMENT_ASSET_PATHS = "\"CodeEdit/Preview Content\"";
677677
DEVELOPMENT_TEAM = "";
678-
ENABLE_APP_SANDBOX = NO;
678+
ENABLE_APP_SANDBOX = YES;
679+
ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite;
680+
ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite;
681+
ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite;
682+
ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite;
679683
ENABLE_HARDENED_RUNTIME = YES;
684+
ENABLE_INCOMING_NETWORK_CONNECTIONS = YES;
685+
ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES;
680686
ENABLE_PREVIEWS = YES;
687+
ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;
688+
ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;
689+
ENABLE_RESOURCE_ACCESS_CALENDARS = NO;
690+
ENABLE_RESOURCE_ACCESS_CAMERA = NO;
691+
ENABLE_RESOURCE_ACCESS_CONTACTS = NO;
692+
ENABLE_RESOURCE_ACCESS_LOCATION = NO;
681693
ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO;
694+
ENABLE_RESOURCE_ACCESS_PRINTING = NO;
695+
ENABLE_RESOURCE_ACCESS_USB = NO;
696+
ENABLE_USER_SELECTED_FILES = readwrite;
682697
GENERATE_INFOPLIST_FILE = NO;
683698
INFOPLIST_FILE = CodeEdit/Info.plist;
684699
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
@@ -882,10 +897,25 @@
882897
DEAD_CODE_STRIPPING = YES;
883898
DEVELOPMENT_ASSET_PATHS = "\"CodeEdit/Preview Content\"";
884899
DEVELOPMENT_TEAM = "";
885-
ENABLE_APP_SANDBOX = NO;
900+
ENABLE_APP_SANDBOX = YES;
901+
ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite;
902+
ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite;
903+
ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite;
904+
ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite;
886905
ENABLE_HARDENED_RUNTIME = YES;
906+
ENABLE_INCOMING_NETWORK_CONNECTIONS = YES;
907+
ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES;
887908
ENABLE_PREVIEWS = YES;
909+
ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;
910+
ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;
911+
ENABLE_RESOURCE_ACCESS_CALENDARS = NO;
912+
ENABLE_RESOURCE_ACCESS_CAMERA = NO;
913+
ENABLE_RESOURCE_ACCESS_CONTACTS = NO;
914+
ENABLE_RESOURCE_ACCESS_LOCATION = NO;
888915
ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO;
916+
ENABLE_RESOURCE_ACCESS_PRINTING = NO;
917+
ENABLE_RESOURCE_ACCESS_USB = NO;
918+
ENABLE_USER_SELECTED_FILES = readwrite;
889919
GENERATE_INFOPLIST_FILE = NO;
890920
INFOPLIST_FILE = CodeEdit/Info.plist;
891921
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
@@ -1161,10 +1191,25 @@
11611191
DEAD_CODE_STRIPPING = YES;
11621192
DEVELOPMENT_ASSET_PATHS = "\"CodeEdit/Preview Content\"";
11631193
DEVELOPMENT_TEAM = "";
1164-
ENABLE_APP_SANDBOX = NO;
1194+
ENABLE_APP_SANDBOX = YES;
1195+
ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite;
1196+
ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite;
1197+
ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite;
1198+
ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite;
11651199
ENABLE_HARDENED_RUNTIME = YES;
1200+
ENABLE_INCOMING_NETWORK_CONNECTIONS = YES;
1201+
ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES;
11661202
ENABLE_PREVIEWS = YES;
1203+
ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;
1204+
ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;
1205+
ENABLE_RESOURCE_ACCESS_CALENDARS = NO;
1206+
ENABLE_RESOURCE_ACCESS_CAMERA = NO;
1207+
ENABLE_RESOURCE_ACCESS_CONTACTS = NO;
1208+
ENABLE_RESOURCE_ACCESS_LOCATION = NO;
11671209
ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO;
1210+
ENABLE_RESOURCE_ACCESS_PRINTING = NO;
1211+
ENABLE_RESOURCE_ACCESS_USB = NO;
1212+
ENABLE_USER_SELECTED_FILES = readwrite;
11681213
GENERATE_INFOPLIST_FILE = NO;
11691214
INFOPLIST_FILE = CodeEdit/Info.plist;
11701215
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
@@ -1440,10 +1485,25 @@
14401485
DEAD_CODE_STRIPPING = YES;
14411486
DEVELOPMENT_ASSET_PATHS = "\"CodeEdit/Preview Content\"";
14421487
DEVELOPMENT_TEAM = "";
1443-
ENABLE_APP_SANDBOX = NO;
1488+
ENABLE_APP_SANDBOX = YES;
1489+
ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite;
1490+
ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite;
1491+
ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite;
1492+
ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite;
14441493
ENABLE_HARDENED_RUNTIME = YES;
1494+
ENABLE_INCOMING_NETWORK_CONNECTIONS = YES;
1495+
ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES;
14451496
ENABLE_PREVIEWS = YES;
1497+
ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;
1498+
ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;
1499+
ENABLE_RESOURCE_ACCESS_CALENDARS = NO;
1500+
ENABLE_RESOURCE_ACCESS_CAMERA = NO;
1501+
ENABLE_RESOURCE_ACCESS_CONTACTS = NO;
1502+
ENABLE_RESOURCE_ACCESS_LOCATION = NO;
14461503
ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO;
1504+
ENABLE_RESOURCE_ACCESS_PRINTING = NO;
1505+
ENABLE_RESOURCE_ACCESS_USB = NO;
1506+
ENABLE_USER_SELECTED_FILES = readwrite;
14471507
GENERATE_INFOPLIST_FILE = NO;
14481508
INFOPLIST_FILE = CodeEdit/Info.plist;
14491509
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
@@ -1490,10 +1550,25 @@
14901550
DEAD_CODE_STRIPPING = YES;
14911551
DEVELOPMENT_ASSET_PATHS = "\"CodeEdit/Preview Content\"";
14921552
DEVELOPMENT_TEAM = "";
1493-
ENABLE_APP_SANDBOX = NO;
1553+
ENABLE_APP_SANDBOX = YES;
1554+
ENABLE_FILE_ACCESS_DOWNLOADS_FOLDER = readwrite;
1555+
ENABLE_FILE_ACCESS_MOVIES_FOLDER = readwrite;
1556+
ENABLE_FILE_ACCESS_MUSIC_FOLDER = readwrite;
1557+
ENABLE_FILE_ACCESS_PICTURE_FOLDER = readwrite;
14941558
ENABLE_HARDENED_RUNTIME = YES;
1559+
ENABLE_INCOMING_NETWORK_CONNECTIONS = YES;
1560+
ENABLE_OUTGOING_NETWORK_CONNECTIONS = YES;
14951561
ENABLE_PREVIEWS = YES;
1562+
ENABLE_RESOURCE_ACCESS_AUDIO_INPUT = NO;
1563+
ENABLE_RESOURCE_ACCESS_BLUETOOTH = NO;
1564+
ENABLE_RESOURCE_ACCESS_CALENDARS = NO;
1565+
ENABLE_RESOURCE_ACCESS_CAMERA = NO;
1566+
ENABLE_RESOURCE_ACCESS_CONTACTS = NO;
1567+
ENABLE_RESOURCE_ACCESS_LOCATION = NO;
14961568
ENABLE_RESOURCE_ACCESS_PHOTO_LIBRARY = NO;
1569+
ENABLE_RESOURCE_ACCESS_PRINTING = NO;
1570+
ENABLE_RESOURCE_ACCESS_USB = NO;
1571+
ENABLE_USER_SELECTED_FILES = readwrite;
14971572
GENERATE_INFOPLIST_FILE = NO;
14981573
INFOPLIST_FILE = CodeEdit/Info.plist;
14991574
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";

CodeEdit/Features/Editor/Views/EditorAreaFileView.swift

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,10 @@ struct EditorAreaFileView: View {
453453
private let minPreviewWidth: CGFloat = 200
454454
private let maxPreviewWidth: CGFloat = 1400
455455

456+
// Key event monitor for toggling preview via keyboard shortcut
457+
// Shortcut: Command + Option + P
458+
@State private var keyEventMonitor: Any?
459+
456460
private func bindContent() {
457461
NotificationCenter.default.publisher(
458462
for: .CodeFileDocumentContentDidChange,
@@ -737,7 +741,7 @@ struct EditorAreaFileView: View {
737741
.clipShape(Circle())
738742
}
739743
.buttonStyle(.plain)
740-
.help("Show Preview")
744+
.help("Show Preview (⌘⌥P)")
741745
Spacer()
742746
}
743747
.frame(maxWidth: .infinity, maxHeight: .infinity)
@@ -764,7 +768,7 @@ struct EditorAreaFileView: View {
764768
.clipShape(Circle())
765769
}
766770
.buttonStyle(.plain)
767-
.help("Show Preview")
771+
.help("Show Preview (⌘⌥P)")
768772
.padding(.top, edgeInsets.top + 8)
769773
.padding(.trailing, 8)
770774
.zIndex(10)
@@ -825,7 +829,7 @@ struct EditorAreaFileView: View {
825829
.clipShape(Circle())
826830
}
827831
.buttonStyle(.plain)
828-
.help("Hide Preview")
832+
.help("Hide Preview (⌘⌥P)")
829833
.padding(.top, edgeInsets.top + 8)
830834
.padding(.trailing, 8)
831835
.zIndex(10)
@@ -879,7 +883,7 @@ struct EditorAreaFileView: View {
879883
.clipShape(Circle())
880884
}
881885
.buttonStyle(.plain)
882-
.help("Hide Preview")
886+
.help("Hide Preview (⌘⌥P)")
883887
.padding(.top, edgeInsets.top + 8)
884888
.padding(.trailing, 8)
885889
.zIndex(10)
@@ -902,7 +906,7 @@ struct EditorAreaFileView: View {
902906
.clipShape(Circle())
903907
}
904908
.buttonStyle(.plain)
905-
.help("Show Preview")
909+
.help("Show Preview (⌘⌥P)")
906910
Spacer()
907911
}
908912
.frame(maxWidth: .infinity, maxHeight: .infinity)
@@ -929,7 +933,7 @@ struct EditorAreaFileView: View {
929933
.clipShape(Circle())
930934
}
931935
.buttonStyle(.plain)
932-
.help("Show Preview")
936+
.help("Show Preview (⌘⌥P)")
933937
.padding(.top, edgeInsets.top + 8)
934938
.padding(.trailing, 8)
935939
.zIndex(10)
@@ -976,7 +980,7 @@ struct EditorAreaFileView: View {
976980
.clipShape(Circle())
977981
}
978982
.buttonStyle(.plain)
979-
.help("Hide Preview")
983+
.help("Hide Preview (⌘⌥P)")
980984
.padding(.top, edgeInsets.top + 8)
981985
.padding(.trailing, 8)
982986
.zIndex(10)
@@ -1025,13 +1029,33 @@ struct EditorAreaFileView: View {
10251029
}
10261030
}
10271031
startFileWatchIfNeeded()
1032+
1033+
// Install key event monitor for toggling preview (⌘ + ⌥ + P)
1034+
keyEventMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in
1035+
let chars = event.charactersIgnoringModifiers?.lowercased()
1036+
let flags = event.modifierFlags.intersection(.deviceIndependentFlagsMask)
1037+
if chars == "p" && flags.contains(.command) && flags.contains(.option) {
1038+
DispatchQueue.main.async {
1039+
withAnimation(.easeInOut(duration: 0.18)) {
1040+
showPreviewPane.toggle()
1041+
}
1042+
}
1043+
// swallow the event so other handlers don't also process it
1044+
return nil
1045+
}
1046+
return event
1047+
}
10281048
}
10291049
.onChange(of: codeFile.fileURL) { _ in
10301050
stopFileWatch()
10311051
startFileWatchIfNeeded()
10321052
}
10331053
.onDisappear {
10341054
stopFileWatch()
1055+
if let monitor = keyEventMonitor {
1056+
NSEvent.removeMonitor(monitor)
1057+
keyEventMonitor = nil
1058+
}
10351059
}
10361060
}
10371061

0 commit comments

Comments
 (0)