Skip to content

Commit 817778f

Browse files
authored
Merge branch 'main' into show-file-info-in-status-bar
2 parents 7627aa6 + 60e4b4f commit 817778f

File tree

7 files changed

+206
-43
lines changed

7 files changed

+206
-43
lines changed

β€Ž.all-contributorsrcβ€Ž

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,15 @@
722722
"contributions": [
723723
"bug"
724724
]
725+
},
726+
{
727+
"login": "danielzsh",
728+
"name": "Daniel Zhu",
729+
"avatar_url": "https://avatars.githubusercontent.com/u/65467530?v=4",
730+
"profile": "http://danielz.xyz",
731+
"contributions": [
732+
"bug"
733+
]
725734
}
726735
],
727736
"contributorsPerLine": 7,

β€ŽCodeEdit.xcodeproj/project.pbxprojβ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
04BC1CDE2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BC1CDD2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift */; };
2929
04C3255B2801F86400C8DA2D /* ProjectNavigatorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FEC6D27FE4B4A00E57D53 /* ProjectNavigatorViewController.swift */; };
3030
04C3255C2801F86900C8DA2D /* ProjectNavigatorMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FEC7127FE4EEF00E57D53 /* ProjectNavigatorMenu.swift */; };
31+
0FD96BCE2BEF42530025A697 /* CodeEditWindowController+Toolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FD96BCD2BEF42530025A697 /* CodeEditWindowController+Toolbar.swift */; };
3132
201169D72837B2E300F92B46 /* SourceControlNavigatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201169D62837B2E300F92B46 /* SourceControlNavigatorView.swift */; };
3233
201169DB2837B34000F92B46 /* SourceControlNavigatorChangedFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201169DA2837B34000F92B46 /* SourceControlNavigatorChangedFileView.swift */; };
3334
201169DD2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201169DC2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift */; };
@@ -591,6 +592,7 @@
591592
04BA7C232AE2E7CD00584E1C /* SourceControlNavigatorSyncView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorSyncView.swift; sourceTree = "<group>"; };
592593
04BA7C262AE2E9F100584E1C /* GitClient+Push.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Push.swift"; sourceTree = "<group>"; };
593594
04BC1CDD2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorFileTabCloseButton.swift; sourceTree = "<group>"; };
595+
0FD96BCD2BEF42530025A697 /* CodeEditWindowController+Toolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CodeEditWindowController+Toolbar.swift"; sourceTree = "<group>"; };
594596
201169D62837B2E300F92B46 /* SourceControlNavigatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorView.swift; sourceTree = "<group>"; };
595597
201169DA2837B34000F92B46 /* SourceControlNavigatorChangedFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorChangedFileView.swift; sourceTree = "<group>"; };
596598
201169DC2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorToolbarBottom.swift; sourceTree = "<group>"; };
@@ -1501,6 +1503,7 @@
15011503
04660F6927E51E5C00477777 /* CodeEditWindowController.swift */,
15021504
B6152B7F2ADAE421004C6012 /* CodeEditWindowControllerExtensions.swift */,
15031505
4E7F066529602E7B00BB3C12 /* CodeEditSplitViewController.swift */,
1506+
0FD96BCD2BEF42530025A697 /* CodeEditWindowController+Toolbar.swift */,
15041507
);
15051508
path = Controllers;
15061509
sourceTree = "<group>";
@@ -3406,6 +3409,7 @@
34063409
587B9E8D29301D8F00AC7927 /* GitHubAccount.swift in Sources */,
34073410
201169E72837B5CA00F92B46 /* SourceControlManager.swift in Sources */,
34083411
58822528292C280D00E83CDE /* StatusBarEncodingSelector.swift in Sources */,
3412+
0FD96BCE2BEF42530025A697 /* CodeEditWindowController+Toolbar.swift in Sources */,
34093413
6C7F37FE2A3EA6FA00217B83 /* View+focusedValue.swift in Sources */,
34103414
B6C4F2A12B3CA37500B2B140 /* SourceControlNavigatorHistoryView.swift in Sources */,
34113415
6CBE1CFB2B71DAA6003AC32E /* Loopable.swift in Sources */,
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
//
2+
// CodeEditWindowController+Toolbar.swift
3+
// CodeEdit
4+
//
5+
// Created by Daniel Zhu on 5/10/24.
6+
//
7+
8+
import AppKit
9+
import SwiftUI
10+
11+
extension CodeEditWindowController {
12+
internal func setupToolbar() {
13+
let toolbar = NSToolbar(identifier: UUID().uuidString)
14+
toolbar.delegate = self
15+
toolbar.displayMode = .labelOnly
16+
toolbar.showsBaselineSeparator = false
17+
self.window?.titleVisibility = toolbarCollapsed ? .visible : .hidden
18+
self.window?.toolbarStyle = .unifiedCompact
19+
if Settings[\.general].tabBarStyle == .native {
20+
// Set titlebar background as transparent by default in order to
21+
// style the toolbar background in native tab bar style.
22+
self.window?.titlebarSeparatorStyle = .none
23+
} else {
24+
// In Xcode tab bar style, we use default toolbar background with
25+
// line separator.
26+
self.window?.titlebarSeparatorStyle = .automatic
27+
}
28+
self.window?.toolbar = toolbar
29+
}
30+
31+
func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
32+
[
33+
.toggleFirstSidebarItem,
34+
.sidebarTrackingSeparator,
35+
.branchPicker,
36+
.flexibleSpace,
37+
.itemListTrackingSeparator,
38+
.flexibleSpace,
39+
.toggleLastSidebarItem
40+
]
41+
}
42+
43+
func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
44+
[
45+
.toggleFirstSidebarItem,
46+
.sidebarTrackingSeparator,
47+
.flexibleSpace,
48+
.itemListTrackingSeparator,
49+
.toggleLastSidebarItem,
50+
.branchPicker
51+
]
52+
}
53+
54+
func toggleToolbar() {
55+
toolbarCollapsed.toggle()
56+
updateToolbarVisibility()
57+
}
58+
59+
private func updateToolbarVisibility() {
60+
if toolbarCollapsed {
61+
window?.titleVisibility = .visible
62+
window?.title = workspace?.workspaceFileManager?.folderUrl.lastPathComponent ?? "Empty"
63+
window?.toolbar = nil
64+
} else {
65+
window?.titleVisibility = .hidden
66+
setupToolbar()
67+
}
68+
}
69+
70+
func toolbar(
71+
_ toolbar: NSToolbar,
72+
itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier,
73+
willBeInsertedIntoToolbar flag: Bool
74+
) -> NSToolbarItem? {
75+
switch itemIdentifier {
76+
case .itemListTrackingSeparator:
77+
guard let splitViewController else { return nil }
78+
79+
return NSTrackingSeparatorToolbarItem(
80+
identifier: .itemListTrackingSeparator,
81+
splitView: splitViewController.splitView,
82+
dividerIndex: 1
83+
)
84+
case .toggleFirstSidebarItem:
85+
let toolbarItem = NSToolbarItem(itemIdentifier: NSToolbarItem.Identifier.toggleFirstSidebarItem)
86+
toolbarItem.label = "Navigator Sidebar"
87+
toolbarItem.paletteLabel = " Navigator Sidebar"
88+
toolbarItem.toolTip = "Hide or show the Navigator"
89+
toolbarItem.isBordered = true
90+
toolbarItem.target = self
91+
toolbarItem.action = #selector(self.toggleFirstPanel)
92+
toolbarItem.image = NSImage(
93+
systemSymbolName: "sidebar.leading",
94+
accessibilityDescription: nil
95+
)?.withSymbolConfiguration(.init(scale: .large))
96+
97+
return toolbarItem
98+
case .toggleLastSidebarItem:
99+
let toolbarItem = NSToolbarItem(itemIdentifier: NSToolbarItem.Identifier.toggleLastSidebarItem)
100+
toolbarItem.label = "Inspector Sidebar"
101+
toolbarItem.paletteLabel = "Inspector Sidebar"
102+
toolbarItem.toolTip = "Hide or show the Inspectors"
103+
toolbarItem.isBordered = true
104+
toolbarItem.target = self
105+
toolbarItem.action = #selector(self.toggleLastPanel)
106+
toolbarItem.image = NSImage(
107+
systemSymbolName: "sidebar.trailing",
108+
accessibilityDescription: nil
109+
)?.withSymbolConfiguration(.init(scale: .large))
110+
111+
return toolbarItem
112+
case .branchPicker:
113+
let toolbarItem = NSToolbarItem(itemIdentifier: .branchPicker)
114+
let view = NSHostingView(
115+
rootView: ToolbarBranchPicker(
116+
workspaceFileManager: workspace?.workspaceFileManager
117+
)
118+
)
119+
toolbarItem.view = view
120+
121+
return toolbarItem
122+
123+
default:
124+
return NSToolbarItem(itemIdentifier: itemIdentifier)
125+
}
126+
}
127+
}

β€ŽCodeEdit/Features/Documents/Controllers/CodeEditWindowController.swiftβ€Ž

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,9 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs
2929

3030
internal var cancellables = [AnyCancellable]()
3131

32-
init(window: NSWindow, workspace: WorkspaceDocument) {
32+
init(window: NSWindow?, workspace: WorkspaceDocument?) {
3333
super.init(window: window)
34+
guard let workspace else { return }
3435
self.workspace = workspace
3536
self.workspaceSettings = CEWorkspaceSettings(workspaceDocument: workspace)
3637
setupSplitView(with: workspace)
@@ -46,7 +47,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs
4647
self?.navigatorCollapsed = item.isCollapsed
4748
}),
4849
splitViewController.splitViewItems.last!.observe(\.isCollapsed, changeHandler: { [weak self] item, _ in
49-
self?.navigatorCollapsed = item.isCollapsed
50+
self?.inspectorCollapsed = item.isCollapsed
5051
})
5152
]
5253

β€ŽCodeEdit/Features/Editor/Models/Editor.swiftβ€Ž

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,11 @@ final class Editor: ObservableObject, Identifiable {
195195
if let index {
196196
tabs.insert(item, at: index)
197197
} else {
198-
tabs.append(item)
198+
if let selectedTab, let currentIndex = tabs.firstIndex(of: selectedTab) {
199+
tabs.insert(item, at: tabs.index(after: currentIndex))
200+
} else {
201+
tabs.append(item)
202+
}
199203
}
200204
selectedTab = item
201205
if !fromHistory {

β€ŽCodeEdit/Features/WindowCommands/ViewCommands.swiftβ€Ž

Lines changed: 55 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct ViewCommands: Commands {
1717
@AppSettings(\.general.dimEditorsWithoutFocus)
1818
var dimEditorsWithoutFocus
1919

20-
@State var windowController: CodeEditWindowController?
20+
@State private var windowController: CodeEditWindowController?
2121

2222
private let documentController: CodeEditDocumentController = CodeEditDocumentController()
2323

@@ -27,20 +27,7 @@ struct ViewCommands: Commands {
2727
@FocusedBinding(\.inspectorVisibility)
2828
var inspectorVisibility
2929

30-
var navigatorCollapsed: Bool {
31-
windowController?.navigatorCollapsed ?? false
32-
}
33-
34-
var inspectorCollapsed: Bool {
35-
windowController?.navigatorCollapsed ?? false
36-
}
37-
38-
var toolbarCollapsed: Bool {
39-
windowController?.toolbarCollapsed ?? false
40-
}
41-
4230
var body: some Commands {
43-
4431
CommandGroup(after: .toolbar) {
4532
Button("Show Command Palette") {
4633
NSApp.sendAction(#selector(CodeEditWindowController.openCommandPalette(_:)), to: nil, from: nil)
@@ -85,32 +72,13 @@ struct ViewCommands: Commands {
8572

8673
Divider()
8774

88-
Button("\(navigatorCollapsed ? "Show" : "Hide") Navigator") {
89-
windowController?.toggleFirstPanel()
90-
}
91-
.disabled(windowController == nil)
92-
.keyboardShortcut("0", modifiers: [.command])
93-
.onReceive(NSApp.publisher(for: \.keyWindow)) { window in
94-
windowController = window?.windowController as? CodeEditWindowController
95-
}
96-
97-
Button("\(inspectorCollapsed ? "Show" : "Hide") Inspector") {
98-
windowController?.toggleLastPanel()
99-
}
100-
.disabled(windowController == nil)
101-
.keyboardShortcut("i", modifiers: [.control, .command])
102-
103-
Button("\(inspectorCollapsed ? "Show" : "Hide") Utility Area") {
104-
CommandManager.shared.executeCommand("open.drawer")
105-
}
106-
.disabled(windowController == nil)
107-
.keyboardShortcut("y", modifiers: [.shift, .command])
108-
109-
Button("\(navigatorCollapsed ? "Show" : "Hide") Toolbar") {
110-
windowController?.toggleToolbar()
111-
}
112-
.disabled(windowController == nil)
113-
.keyboardShortcut("t", modifiers: [.option, .command])
75+
HideCommands(
76+
windowController: windowController ?? CodeEditWindowController(window: nil, workspace: nil),
77+
utilityAreaModel: windowController?.workspace?.utilityAreaModel ?? UtilityAreaViewModel()
78+
)
79+
.onReceive(NSApp.publisher(for: \.keyWindow)) { window in
80+
windowController = window?.windowController as? CodeEditWindowController
81+
}
11482

11583
Divider()
11684

@@ -130,6 +98,53 @@ struct ViewCommands: Commands {
13098
}
13199
}
132100

101+
struct HideCommands: View {
102+
@ObservedObject var windowController: CodeEditWindowController
103+
@ObservedObject var utilityAreaModel: UtilityAreaViewModel
104+
105+
var navigatorCollapsed: Bool {
106+
windowController.navigatorCollapsed
107+
}
108+
109+
var inspectorCollapsed: Bool {
110+
windowController.inspectorCollapsed
111+
}
112+
113+
var utilityAreaCollapsed: Bool {
114+
utilityAreaModel.isCollapsed
115+
}
116+
117+
var toolbarCollapsed: Bool {
118+
windowController.toolbarCollapsed
119+
}
120+
121+
var body: some View {
122+
Button("\(navigatorCollapsed ? "Show" : "Hide") Navigator") {
123+
windowController.toggleFirstPanel()
124+
}
125+
.disabled(windowController.window == nil)
126+
.keyboardShortcut("0", modifiers: [.command])
127+
128+
Button("\(inspectorCollapsed ? "Show" : "Hide") Inspector") {
129+
windowController.toggleLastPanel()
130+
}
131+
.disabled(windowController.window == nil)
132+
.keyboardShortcut("i", modifiers: [.control, .command])
133+
134+
Button("\(utilityAreaCollapsed ? "Show" : "Hide") Utility Area") {
135+
CommandManager.shared.executeCommand("open.drawer")
136+
}
137+
.disabled(windowController.window == nil)
138+
.keyboardShortcut("y", modifiers: [.shift, .command])
139+
140+
Button("\(toolbarCollapsed ? "Show" : "Hide") Toolbar") {
141+
windowController.toggleToolbar()
142+
}
143+
.disabled(windowController.window == nil)
144+
.keyboardShortcut("t", modifiers: [.option, .command])
145+
}
146+
}
147+
133148
extension ViewCommands {
134149
struct NavigatorCommands: View {
135150
@ObservedObject var model: NavigatorSidebarViewModel

β€ŽREADME.mdβ€Ž

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,9 @@ For issues we want to focus on that are most relevant at any given time, please
184184
<td align="center" valign="top" width="14.28%"><a href="http://knotbin.xyz"><img src="https://avatars.githubusercontent.com/u/118622417?v=4?s=100" width="100px;" alt="Roscoe Rubin-Rottenberg"/><br /><sub><b>Roscoe Rubin-Rottenberg</b></sub></a><br /><a href="https://github.com/CodeEditApp/CodeEdit/commits?author=knotbin" title="Code">πŸ’»</a></td>
185185
<td align="center" valign="top" width="14.28%"><a href="https://github.com/plbstl"><img src="https://avatars.githubusercontent.com/u/49006567?v=4?s=100" width="100px;" alt="Paul Ebose"/><br /><sub><b>Paul Ebose</b></sub></a><br /><a href="https://github.com/CodeEditApp/CodeEdit/issues?q=author%3Aplbstl" title="Bug reports">πŸ›</a></td>
186186
</tr>
187+
<tr>
188+
<td align="center" valign="top" width="14.28%"><a href="http://danielz.xyz"><img src="https://avatars.githubusercontent.com/u/65467530?v=4?s=100" width="100px;" alt="Daniel Zhu"/><br /><sub><b>Daniel Zhu</b></sub></a><br /><a href="https://github.com/CodeEditApp/CodeEdit/issues?q=author%3Adanielzsh" title="Bug reports">πŸ›</a></td>
189+
</tr>
187190
</tbody>
188191
</table>
189192

0 commit comments

Comments
Β (0)