Skip to content

Commit 45f8d44

Browse files
Merge pull request #970 from thecoolwinter/resize-inspector
Add ability to resize the inspector sidebar.
2 parents d97e2aa + 0436868 commit 45f8d44

File tree

4 files changed

+54
-12
lines changed

4 files changed

+54
-12
lines changed

CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,51 @@ final class CodeEditSplitViewController: NSSplitViewController {
5151
constrainSplitPosition proposedPosition: CGFloat,
5252
ofSubviewAt dividerIndex: Int
5353
) -> CGFloat {
54-
if (CGFloat.minSnapWidth...CGFloat.maxSnapWidth).contains(proposedPosition) {
55-
isSnapped = true
56-
return .snapWidth
57-
} else {
58-
isSnapped = false
59-
return proposedPosition
54+
if dividerIndex == 0 {
55+
// Navigator
56+
if (CGFloat.minSnapWidth...CGFloat.maxSnapWidth).contains(proposedPosition) {
57+
isSnapped = true
58+
return .snapWidth
59+
} else {
60+
isSnapped = false
61+
if proposedPosition <= CodeEditWindowController.minSidebarWidth / 2 {
62+
splitViewItems.first?.isCollapsed = true
63+
return 0
64+
}
65+
return max(CodeEditWindowController.minSidebarWidth, proposedPosition)
66+
}
67+
} else if dividerIndex == 1 {
68+
let proposedWidth = view.frame.width - proposedPosition
69+
if proposedWidth <= CodeEditWindowController.minSidebarWidth / 2 {
70+
splitViewItems.last?.isCollapsed = true
71+
removeToolbarItemIfNeeded()
72+
return proposedPosition
73+
}
74+
splitViewItems.last?.isCollapsed = false
75+
insertToolbarItemIfNeeded()
76+
return min(view.frame.width - CodeEditWindowController.minSidebarWidth, proposedPosition)
77+
}
78+
return proposedPosition
79+
}
80+
81+
/// Quick fix for list tracking separator needing to be added again after closing,
82+
/// then opening the inspector with a drag.
83+
private func insertToolbarItemIfNeeded() {
84+
guard !(
85+
view.window?.toolbar?.items.contains(where: { $0.itemIdentifier == .itemListTrackingSeparator }) ?? true
86+
) else {
87+
return
88+
}
89+
view.window?.toolbar?.insertItem(withItemIdentifier: .itemListTrackingSeparator, at: 4)
90+
}
91+
92+
/// Quick fix for list tracking separator needing to be removed after closing the inspector with a drag
93+
private func removeToolbarItemIfNeeded() {
94+
guard let index = view.window?.toolbar?.items.firstIndex(
95+
where: { $0.itemIdentifier == .itemListTrackingSeparator }
96+
) else {
97+
return
6098
}
99+
view.window?.toolbar?.removeItem(at: index)
61100
}
62101
}

CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import Cocoa
99
import SwiftUI
1010

1111
final class CodeEditWindowController: NSWindowController, NSToolbarDelegate {
12+
static let minSidebarWidth: CGFloat = 242
13+
1214
private var prefs: AppPreferencesModel = .shared
1315

1416
var workspace: WorkspaceDocument?
@@ -73,7 +75,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate {
7375
sidebarWithViewController: NSHostingController(rootView: navigatorView)
7476
)
7577
navigator.titlebarSeparatorStyle = .none
76-
navigator.minimumThickness = 242
78+
navigator.minimumThickness = Self.minSidebarWidth
7779
navigator.collapseBehavior = .useConstraints
7880
splitVC.addSplitViewItem(navigator)
7981

@@ -92,9 +94,9 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate {
9294
viewController: NSHostingController(rootView: inspectorView)
9395
)
9496
inspector.titlebarSeparatorStyle = .none
95-
inspector.minimumThickness = 260
96-
inspector.maximumThickness = 260
97+
inspector.minimumThickness = Self.minSidebarWidth
9798
inspector.isCollapsed = true
99+
inspector.canCollapse = true
98100
inspector.collapseBehavior = .useConstraints
99101
splitVC.addSplitViewItem(inspector)
100102

@@ -288,7 +290,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate {
288290
}
289291
}
290292

291-
private extension NSToolbarItem.Identifier {
293+
extension NSToolbarItem.Identifier {
292294
static let toggleFirstSidebarItem: NSToolbarItem.Identifier = NSToolbarItem.Identifier("ToggleFirstSidebarItem")
293295
static let toggleLastSidebarItem: NSToolbarItem.Identifier = NSToolbarItem.Identifier("ToggleLastSidebarItem")
294296
static let itemListTrackingSeparator = NSToolbarItem.Identifier("ItemListTrackingSeparator")

CodeEdit/Features/InspectorSidebar/InspectorSidebarView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ struct InspectorSidebarView: View {
4646
}
4747
}
4848
.frame(
49-
minWidth: 250,
49+
minWidth: CodeEditWindowController.minSidebarWidth,
5050
idealWidth: 260,
5151
minHeight: 0,
5252
maxHeight: .infinity,

CodeEditTests/Features/Documents/DocumentsUnitTests.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ final class DocumentsUnitTests: XCTestCase {
4646

4747
func testSplitViewControllerStopSnappedWhenWidthIsLowerAppropriateRange() {
4848
// Given
49-
let position = (0..<260).randomElement() ?? .zero
49+
// 242 is the minimum width of the sidebar
50+
let position = (242..<260).randomElement() ?? .zero
5051

5152
// When
5253
let result = splitViewController.splitView(

0 commit comments

Comments
 (0)