Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Alternative Windowing System #1329

Merged
merged 15 commits into from
Jun 20, 2023
49 changes: 45 additions & 4 deletions CodeEdit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,10 @@
6C578D8929CD36E400DC73B2 /* Commands+ForEach.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C578D8829CD36E400DC73B2 /* Commands+ForEach.swift */; };
6C578D8C29CD372700DC73B2 /* ExtensionCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C578D8B29CD372700DC73B2 /* ExtensionCommands.swift */; };
6C5B63DE29C76213005454BA /* WindowCodeFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C5B63DD29C76213005454BA /* WindowCodeFileView.swift */; };
6C5BE51C2A3D542B002DA0FC /* FeatureFlagsSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C5BE51B2A3D542B002DA0FC /* FeatureFlagsSettingsView.swift */; };
6C5BE51E2A3D545F002DA0FC /* FeatureFlagsSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C5BE51D2A3D545F002DA0FC /* FeatureFlagsSettings.swift */; };
6C5BE5222A3D5666002DA0FC /* WindowManagement in Frameworks */ = {isa = PBXBuildFile; productRef = 6C5BE5212A3D5666002DA0FC /* WindowManagement */; };
6C5C891B2A3F736500A94FE1 /* FocusedValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C5C891A2A3F736500A94FE1 /* FocusedValues.swift */; };
6C5FDF7A29E6160000BC08C0 /* AppSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C5FDF7929E6160000BC08C0 /* AppSettings.swift */; };
6C66C31329D05CDC00DE9ED2 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = 6C66C31229D05CDC00DE9ED2 /* GRDB */; };
6C6BD6EF29CD12E900235D17 /* ExtensionManagerWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C6BD6EE29CD12E900235D17 /* ExtensionManagerWindow.swift */; };
Expand All @@ -296,6 +300,8 @@
6C6BD70129CD172700235D17 /* ExtensionsListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C6BD70029CD172700235D17 /* ExtensionsListView.swift */; };
6C6BD70429CD17B600235D17 /* ExtensionsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C6BD70329CD17B600235D17 /* ExtensionsManager.swift */; };
6C7256D729A3D7D000C2D3E0 /* SplitViewControllerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C7256D629A3D7D000C2D3E0 /* SplitViewControllerView.swift */; };
6C7F37FE2A3EA6FA00217B83 /* View+focusedValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C7F37FD2A3EA6FA00217B83 /* View+focusedValue.swift */; };
6C7F38012A3EA71400217B83 /* WindowSplitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C7F38002A3EA71400217B83 /* WindowSplitView.swift */; };
6C81916729B3E80700B75C92 /* ModifierKeysObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C81916629B3E80700B75C92 /* ModifierKeysObserver.swift */; };
6C81916B29B41DD300B75C92 /* DequeModule in Frameworks */ = {isa = PBXBuildFile; productRef = 6C81916A29B41DD300B75C92 /* DequeModule */; };
6C82D6B329BFD88700495C54 /* NavigateCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C82D6B229BFD88700495C54 /* NavigateCommands.swift */; };
Expand All @@ -319,7 +325,6 @@
6CD03B6A29FC773F001BD1D0 /* SettingsInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CD03B6929FC773F001BD1D0 /* SettingsInjector.swift */; };
6CDA84AD284C1BA000C1CC3A /* TabBarContextMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CDA84AC284C1BA000C1CC3A /* TabBarContextMenu.swift */; };
6CDEFC9629E22C2700B7C684 /* Introspect in Frameworks */ = {isa = PBXBuildFile; productRef = 6CDEFC9529E22C2700B7C684 /* Introspect */; };
6CE60BDD2A226A870075D21E /* Scene+Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CE60BDC2A226A870075D21E /* Scene+Environment.swift */; };
6CE622692A2A174A0013085C /* InspectorTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CE622682A2A174A0013085C /* InspectorTab.swift */; };
6CE6226B2A2A1C730013085C /* DebugAreaTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CE6226A2A2A1C730013085C /* DebugAreaTab.swift */; };
6CE6226E2A2A1CDE0013085C /* NavigatorTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CE6226D2A2A1CDE0013085C /* NavigatorTab.swift */; };
Expand Down Expand Up @@ -739,6 +744,9 @@
6C578D8B29CD372700DC73B2 /* ExtensionCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionCommands.swift; sourceTree = "<group>"; };
6C5AB9D629C1496E003B5F96 /* SceneID.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneID.swift; sourceTree = "<group>"; };
6C5B63DD29C76213005454BA /* WindowCodeFileView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WindowCodeFileView.swift; sourceTree = "<group>"; };
6C5BE51B2A3D542B002DA0FC /* FeatureFlagsSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureFlagsSettingsView.swift; sourceTree = "<group>"; };
6C5BE51D2A3D545F002DA0FC /* FeatureFlagsSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureFlagsSettings.swift; sourceTree = "<group>"; };
6C5C891A2A3F736500A94FE1 /* FocusedValues.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocusedValues.swift; sourceTree = "<group>"; };
6C5FDF7929E6160000BC08C0 /* AppSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSettings.swift; sourceTree = "<group>"; };
6C6BD6EE29CD12E900235D17 /* ExtensionManagerWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionManagerWindow.swift; sourceTree = "<group>"; };
6C6BD6F029CD13FA00235D17 /* ExtensionDiscovery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDiscovery.swift; sourceTree = "<group>"; };
Expand All @@ -747,6 +755,8 @@
6C6BD70029CD172700235D17 /* ExtensionsListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionsListView.swift; sourceTree = "<group>"; };
6C6BD70329CD17B600235D17 /* ExtensionsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionsManager.swift; sourceTree = "<group>"; };
6C7256D629A3D7D000C2D3E0 /* SplitViewControllerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitViewControllerView.swift; sourceTree = "<group>"; };
6C7F37FD2A3EA6FA00217B83 /* View+focusedValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+focusedValue.swift"; sourceTree = "<group>"; };
6C7F38002A3EA71400217B83 /* WindowSplitView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowSplitView.swift; sourceTree = "<group>"; };
6C81916629B3E80700B75C92 /* ModifierKeysObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModifierKeysObserver.swift; sourceTree = "<group>"; };
6C82D6B229BFD88700495C54 /* NavigateCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigateCommands.swift; sourceTree = "<group>"; };
6C82D6B529BFDB5100495C54 /* SourceControlCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlCommands.swift; sourceTree = "<group>"; };
Expand All @@ -763,7 +773,6 @@
6CD0375E2A3504540071C4DA /* FuzzySearch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FuzzySearch.swift; sourceTree = "<group>"; };
6CD03B6929FC773F001BD1D0 /* SettingsInjector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsInjector.swift; sourceTree = "<group>"; };
6CDA84AC284C1BA000C1CC3A /* TabBarContextMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarContextMenu.swift; sourceTree = "<group>"; };
6CE60BDC2A226A870075D21E /* Scene+Environment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Scene+Environment.swift"; sourceTree = "<group>"; };
6CE622682A2A174A0013085C /* InspectorTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectorTab.swift; sourceTree = "<group>"; };
6CE6226A2A2A1C730013085C /* DebugAreaTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebugAreaTab.swift; sourceTree = "<group>"; };
6CE6226D2A2A1CDE0013085C /* NavigatorTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigatorTab.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -863,6 +872,7 @@
buildActionMask = 2147483647;
files = (
6C0F3A3C2A1D0D5000223D19 /* CodeEditKit in Frameworks */,
6C5BE5222A3D5666002DA0FC /* WindowManagement in Frameworks */,
6C66C31329D05CDC00DE9ED2 /* GRDB in Frameworks */,
58F2EB1E292FB954004A9BDE /* Sparkle in Frameworks */,
6C2149412A1BB9AB00748382 /* LogStream in Frameworks */,
Expand Down Expand Up @@ -1250,6 +1260,7 @@
isa = PBXGroup;
children = (
5882251A292C280D00E83CDE /* View+isHovering.swift */,
6C7F37FD2A3EA6FA00217B83 /* View+focusedValue.swift */,
);
path = View;
sourceTree = "<group>";
Expand Down Expand Up @@ -1933,6 +1944,7 @@
58D01C85293167DC00C5B6B4 /* Utils */ = {
isa = PBXGroup;
children = (
6C5C891A2A3F736500A94FE1 /* FocusedValues.swift */,
587B9D54292FC27A00AC7927 /* FolderMonitor.swift */,
6C48D8EF2972DAC300D6D205 /* Environment */,
58D01C87293167DC00C5B6B4 /* Extensions */,
Expand Down Expand Up @@ -2083,6 +2095,15 @@
path = Environment;
sourceTree = "<group>";
};
6C5BE51A2A3D5419002DA0FC /* FeatureFlags */ = {
isa = PBXGroup;
children = (
6C5BE51B2A3D542B002DA0FC /* FeatureFlagsSettingsView.swift */,
6C5BE51D2A3D545F002DA0FC /* FeatureFlagsSettings.swift */,
);
path = FeatureFlags;
sourceTree = "<group>";
};
6C6BD6ED29CD123000235D17 /* Extensions */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -2154,6 +2175,7 @@
B61DA9DD29D929BF00BF4A43 /* Pages */ = {
isa = PBXGroup;
children = (
6C5BE51A2A3D5419002DA0FC /* FeatureFlags */,
B6CF632629E5417C0085880A /* Keybindings */,
B6E41C6E29DD15540088F9F4 /* AccountsSettings */,
B6EA1FF329DA37D3001BF195 /* TextEditingSettings */,
Expand Down Expand Up @@ -2244,7 +2266,7 @@
B658FB3327DA9E1000EA4DBD /* Assets.xcassets */,
B658FB3827DA9E1000EA4DBD /* CodeEdit.entitlements */,
B66A4E4B29C9179B004573B4 /* CodeEditApp.swift */,
6CE60BDC2A226A870075D21E /* Scene+Environment.swift */,
6C7F38002A3EA71400217B83 /* WindowSplitView.swift */,
04660F6027E3A68A00477777 /* Info.plist */,
B66A4E5529C918A0004573B4 /* SceneID.swift */,
B658FB3127DA9E0F00EA4DBD /* WorkspaceView.swift */,
Expand Down Expand Up @@ -2487,6 +2509,7 @@
6CDEFC9529E22C2700B7C684 /* Introspect */,
6CC81CEB2A16BB8F00487975 /* CodeEditTextView */,
6C0F3A3B2A1D0D5000223D19 /* CodeEditKit */,
6C5BE5212A3D5666002DA0FC /* WindowManagement */,
);
productName = CodeEdit;
productReference = B658FB2C27DA9E0F00EA4DBD /* CodeEdit.app */;
Expand Down Expand Up @@ -2582,6 +2605,7 @@
6CDEFC9429E22C2700B7C684 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */,
6CC81CEA2A16BB8F00487975 /* XCRemoteSwiftPackageReference "CodeEditTextView" */,
6C0F3A3A2A1D0D5000223D19 /* XCRemoteSwiftPackageReference "CodeEditKit" */,
6C5BE5202A3D5666002DA0FC /* XCRemoteSwiftPackageReference "SwiftUI-WindowManagement" */,
);
productRefGroup = B658FB2D27DA9E0F00EA4DBD /* Products */;
projectDirPath = "";
Expand Down Expand Up @@ -2752,6 +2776,7 @@
587B9E5E29301D8F00AC7927 /* GitLabCommitRouter.swift in Sources */,
58F2EB0D292FB2B0004A9BDE /* ThemeSettings.swift in Sources */,
85CD0C5F2A10CC3200E531FD /* URL+isImage.swift in Sources */,
6C5BE51E2A3D545F002DA0FC /* FeatureFlagsSettings.swift in Sources */,
587B9D9F29300ABD00AC7927 /* SegmentedControl.swift in Sources */,
6C7256D729A3D7D000C2D3E0 /* SplitViewControllerView.swift in Sources */,
B6EA1FE529DA33DB001BF195 /* ThemeModel.swift in Sources */,
Expand Down Expand Up @@ -2803,6 +2828,7 @@
587B9E8D29301D8F00AC7927 /* GitHubAccount.swift in Sources */,
201169E72837B5CA00F92B46 /* SourceControlModel.swift in Sources */,
58822528292C280D00E83CDE /* StatusBarEncodingSelector.swift in Sources */,
6C7F37FE2A3EA6FA00217B83 /* View+focusedValue.swift in Sources */,
B6C6A43029771F7100A3D28F /* TabBarItemBackground.swift in Sources */,
6C578D8129CD294800DC73B2 /* ExtensionActivatorView.swift in Sources */,
B6F0517D29D9E4B100D72287 /* TerminalSettingsView.swift in Sources */,
Expand All @@ -2824,11 +2850,13 @@
587B9E6629301D8F00AC7927 /* GitLabProjectHook.swift in Sources */,
587B9E9329301D8F00AC7927 /* BitBucketOAuthConfiguration.swift in Sources */,
6C18620A298BF5A800C663EA /* RecentProjectsListView.swift in Sources */,
6C7F38012A3EA71400217B83 /* WindowSplitView.swift in Sources */,
58F2EB0A292FB2B0004A9BDE /* SettingsData.swift in Sources */,
20EBB503280C327C00F3A5DA /* HistoryInspectorView.swift in Sources */,
B6EA1FE729DA341D001BF195 /* Theme.swift in Sources */,
587B9E7529301D8F00AC7927 /* String+QueryParameters.swift in Sources */,
58798219292D92370085B254 /* SearchModeModel.swift in Sources */,
6C5C891B2A3F736500A94FE1 /* FocusedValues.swift in Sources */,
B62AEDD72A27B3D0009A9F52 /* DebugAreaTabViewModel.swift in Sources */,
B66A4E4F29C917B8004573B4 /* WelcomeWindow.swift in Sources */,
58D01C9D293167DC00C5B6B4 /* KeychainSwiftAccessOptions.swift in Sources */,
Expand Down Expand Up @@ -2901,6 +2929,7 @@
285FEC7027FE4B9800E57D53 /* ProjectNavigatorTableViewCell.swift in Sources */,
6CB9144B29BEC7F100BC47F2 /* (null) in Sources */,
587B9E7429301D8F00AC7927 /* URL+URLParameters.swift in Sources */,
6C5BE51C2A3D542B002DA0FC /* FeatureFlagsSettingsView.swift in Sources */,
581BFB6B2926431000D251EC /* RecentProjectItem.swift in Sources */,
587FB99029C1246400B519DD /* TabBarItemView.swift in Sources */,
587B9DA429300ABD00AC7927 /* OverlayPanel.swift in Sources */,
Expand All @@ -2922,7 +2951,6 @@
587B9E7E29301D8F00AC7927 /* GitHubGistRouter.swift in Sources */,
6CAAF69229BCC71C00A1F48A /* (null) in Sources */,
581BFB682926431000D251EC /* WelcomeView.swift in Sources */,
6CE60BDD2A226A870075D21E /* Scene+Environment.swift in Sources */,
6CFF967829BEBCF600182D6F /* MainCommands.swift in Sources */,
587B9E7129301D8F00AC7927 /* GitURLSession.swift in Sources */,
5882252C292C280D00E83CDE /* DebugAreaView.swift in Sources */,
Expand Down Expand Up @@ -3990,6 +4018,14 @@
minimumVersion = 1.0.0;
};
};
6C5BE5202A3D5666002DA0FC /* XCRemoteSwiftPackageReference "SwiftUI-WindowManagement" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/Wouter01/SwiftUI-WindowManagement";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 2.1.0;
};
};
6C66C31129D05CC800DE9ED2 /* XCRemoteSwiftPackageReference "GRDB.swift" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/groue/GRDB.swift.git";
Expand Down Expand Up @@ -4060,6 +4096,11 @@
package = 6C21493F2A1BB9AB00748382 /* XCRemoteSwiftPackageReference "LogStream" */;
productName = LogStream;
};
6C5BE5212A3D5666002DA0FC /* WindowManagement */ = {
isa = XCSwiftPackageProductDependency;
package = 6C5BE5202A3D5666002DA0FC /* XCRemoteSwiftPackageReference "SwiftUI-WindowManagement" */;
productName = WindowManagement;
};
6C66C31229D05CDC00DE9ED2 /* GRDB */ = {
isa = XCSwiftPackageProductDependency;
package = 6C66C31129D05CC800DE9ED2 /* XCRemoteSwiftPackageReference "GRDB.swift" */;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,15 @@
"version" : "0.6.1"
}
},
{
"identity" : "swiftui-windowmanagement",
"kind" : "remoteSourceControl",
"location" : "https://github.com/Wouter01/SwiftUI-WindowManagement",
"state" : {
"revision" : "03642ad06a3aa51e8284eb22146a208269cdc1ca",
"version" : "2.1.0"
}
},
{
"identity" : "textformation",
"kind" : "remoteSourceControl",
Expand Down
20 changes: 17 additions & 3 deletions CodeEdit/CodeEditApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,15 @@
//

import SwiftUI
import WindowManagement

@main
struct CodeEditApp: App {
@NSApplicationDelegateAdaptor var appdelegate: AppDelegate
@ObservedObject var settings = Settings.shared

@Environment(\.openWindow) var openWindow
matthijseikelenboom marked this conversation as resolved.
Show resolved Hide resolved

let updater: SoftwareUpdater = SoftwareUpdater()

init() {
Expand All @@ -30,9 +34,19 @@ struct CodeEditApp: App {
AboutWindow()

SettingsWindow()
.commands {
CodeEditCommands()
}

NSDocumentGroup(for: WorkspaceDocument.self) { workspace in
WindowSplitView(workspace: workspace)
} defaultAction: {
openWindow(id: SceneID.welcome.rawValue)
}
.register(.document(WorkspaceDocument.self)) // Required to make transition modifier work
.transition(.documentWindow)
.windowToolbarStyle(.unifiedCompact(showsTitle: false))
.enableOpenWindow() // Required for opening windows through NSApp
.commands {
CodeEditCommands()
}
}
.environment(\.settings, settings.preferences) // Add settings to each window environment
}
Expand Down
14 changes: 14 additions & 0 deletions CodeEdit/Features/DebugArea/ViewModels/DebugAreaViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ class DebugAreaViewModel: ObservableObject {
@Published
var cursorLocation: CursorLocation = .init(line: 1, column: 1) // Implementation needed!!

@Published
var terminals: [DebugAreaTerminal] = []

@Published
var selectedTerminals: Set<DebugAreaTerminal.ID> = []

/// Indicates whether debugger is collapse or not
@Published
var isCollapsed: Bool = false
Expand Down Expand Up @@ -58,6 +64,14 @@ class DebugAreaViewModel: ObservableObject {
/// The minimum height of the drawer
private(set) var minHeight: Double = 100

func removeTerminals(_ ids: Set<UUID>) {
terminals.removeAll(where: { terminal in
ids.contains(terminal.id)
})

selectedTerminals = [terminals.last?.id ?? UUID()]
}

init() {
// !!!: Lots of things in this class can be removed, such as maxHeight, as they are defined in the UI.
}
Expand Down
12 changes: 0 additions & 12 deletions CodeEdit/Features/DebugArea/Views/DebugAreaTerminalTab.swift
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,6 @@ struct DebugAreaTerminalTab: View {
TextField("Name", text: terminalTitle)
.focused($isFocused)
.padding(.leading, -8)
.background {
if isSelected {
Button("Kill Terminal") {
removeTerminals(selectedIDs)
}
.keyboardShortcut(.delete, modifiers: [.command])
.frame(width: 0, height: 0)
.clipped()
.opacity(0)
}
}
} icon: {
Image(systemName: "terminal")
}
Expand All @@ -60,7 +49,6 @@ struct DebugAreaTerminalTab: View {
Button("Kill Terminal") {
if isSelected { removeTerminals([terminal.id]) }
}
.keyboardShortcut(.delete, modifiers: [.command])
}
}
}
Loading