diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift index 73f6550f2c..26c9955440 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift @@ -14,6 +14,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs @Published var navigatorCollapsed = false @Published var inspectorCollapsed = false + @Published var toolbarCollapsed = false var observers: [NSKeyValueObservation] = [] @@ -31,9 +32,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs init(window: NSWindow, workspace: WorkspaceDocument) { super.init(window: window) self.workspace = workspace - self.workspaceSettings = CEWorkspaceSettings( - workspaceDocument: workspace - ) + self.workspaceSettings = CEWorkspaceSettings(workspaceDocument: workspace) setupSplitView(with: workspace) let view = CodeEditSplitView(controller: splitViewController).ignoresSafeArea() @@ -55,9 +54,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs registerCommands() } - deinit { - cancellables.forEach({ $0.cancel() }) - } + deinit { cancellables.forEach({ $0.cancel() }) } @available(*, unavailable) required init?(coder: NSCoder) { @@ -126,7 +123,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs toolbar.delegate = self toolbar.displayMode = .labelOnly toolbar.showsBaselineSeparator = false - self.window?.titleVisibility = .hidden + self.window?.titleVisibility = toolbarCollapsed ? .visible : .hidden self.window?.toolbarStyle = .unifiedCompact if Settings[\.general].tabBarStyle == .native { // Set titlebar background as transparent by default in order to @@ -165,6 +162,22 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs ] } + func toggleToolbar() { + toolbarCollapsed.toggle() + updateToolbarVisibility() + } + + private func updateToolbarVisibility() { + if toolbarCollapsed { + window?.titleVisibility = .visible + window?.title = workspace?.workspaceFileManager?.folderUrl.lastPathComponent ?? "Empty" + window?.toolbar = nil + } else { + window?.titleVisibility = .hidden + setupToolbar() + } + } + func toolbar( _ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, @@ -172,9 +185,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs ) -> NSToolbarItem? { switch itemIdentifier { case .itemListTrackingSeparator: - guard let splitViewController else { - return nil - } + guard let splitViewController else { return nil } return NSTrackingSeparatorToolbarItem( identifier: .itemListTrackingSeparator, @@ -219,6 +230,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs toolbarItem.view = view return toolbarItem + default: return NSToolbarItem(itemIdentifier: itemIdentifier) } diff --git a/CodeEdit/Features/WindowCommands/ViewCommands.swift b/CodeEdit/Features/WindowCommands/ViewCommands.swift index cd46e5e4b2..8113439f78 100644 --- a/CodeEdit/Features/WindowCommands/ViewCommands.swift +++ b/CodeEdit/Features/WindowCommands/ViewCommands.swift @@ -36,7 +36,12 @@ struct ViewCommands: Commands { windowController?.navigatorCollapsed ?? false } + var toolbarCollapsed: Bool { + windowController?.toolbarCollapsed ?? false + } + var body: some Commands { + CommandGroup(after: .toolbar) { Button("Show Command Palette") { NSApp.sendAction(#selector(CodeEditWindowController.openCommandPalette(_:)), to: nil, from: nil) @@ -102,6 +107,12 @@ struct ViewCommands: Commands { .disabled(windowController == nil) .keyboardShortcut("y", modifiers: [.shift, .command]) + Button("\(navigatorCollapsed ? "Show" : "Hide") Toolbar") { + windowController?.toggleToolbar() + } + .disabled(windowController == nil) + .keyboardShortcut("t", modifiers: [.option, .command]) + Divider() Button("\(showEditorPathBar ? "Hide" : "Show") Path Bar") {