diff --git a/CodeEdit/Features/AppPreferences/Sections/GeneralPreferences/GeneralPreferencesView.swift b/CodeEdit/Features/AppPreferences/Sections/GeneralPreferences/GeneralPreferencesView.swift index f199c89f38..5ef88fba71 100644 --- a/CodeEdit/Features/AppPreferences/Sections/GeneralPreferences/GeneralPreferencesView.swift +++ b/CodeEdit/Features/AppPreferences/Sections/GeneralPreferences/GeneralPreferencesView.swift @@ -55,6 +55,7 @@ struct GeneralPreferencesView: View { updaterSection } } + .frame(minHeight: 650) } } diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift b/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift index f7472878df..34ea2118b5 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditSplitViewController.swift @@ -51,12 +51,51 @@ final class CodeEditSplitViewController: NSSplitViewController { constrainSplitPosition proposedPosition: CGFloat, ofSubviewAt dividerIndex: Int ) -> CGFloat { - if (CGFloat.minSnapWidth...CGFloat.maxSnapWidth).contains(proposedPosition) { - isSnapped = true - return .snapWidth - } else { - isSnapped = false - return proposedPosition + if dividerIndex == 0 { + // Navigator + if (CGFloat.minSnapWidth...CGFloat.maxSnapWidth).contains(proposedPosition) { + isSnapped = true + return .snapWidth + } else { + isSnapped = false + if proposedPosition <= CodeEditWindowController.minSidebarWidth / 2 { + splitViewItems.first?.isCollapsed = true + return 0 + } + return max(CodeEditWindowController.minSidebarWidth, proposedPosition) + } + } else if dividerIndex == 1 { + let proposedWidth = view.frame.width - proposedPosition + if proposedWidth <= CodeEditWindowController.minSidebarWidth / 2 { + splitViewItems.last?.isCollapsed = true + removeToolbarItemIfNeeded() + return proposedPosition + } + splitViewItems.last?.isCollapsed = false + insertToolbarItemIfNeeded() + return min(view.frame.width - CodeEditWindowController.minSidebarWidth, proposedPosition) + } + return proposedPosition + } + + /// Quick fix for list tracking separator needing to be added again after closing, + /// then opening the inspector with a drag. + private func insertToolbarItemIfNeeded() { + guard !( + view.window?.toolbar?.items.contains(where: { $0.itemIdentifier == .itemListTrackingSeparator }) ?? true + ) else { + return + } + view.window?.toolbar?.insertItem(withItemIdentifier: .itemListTrackingSeparator, at: 4) + } + + /// Quick fix for list tracking separator needing to be removed after closing the inspector with a drag + private func removeToolbarItemIfNeeded() { + guard let index = view.window?.toolbar?.items.firstIndex( + where: { $0.itemIdentifier == .itemListTrackingSeparator } + ) else { + return } + view.window?.toolbar?.removeItem(at: index) } } diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift index 58a8830927..ae5859673d 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift @@ -9,6 +9,8 @@ import Cocoa import SwiftUI final class CodeEditWindowController: NSWindowController, NSToolbarDelegate { + static let minSidebarWidth: CGFloat = 242 + private var prefs: AppPreferencesModel = .shared var workspace: WorkspaceDocument? @@ -73,7 +75,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate { sidebarWithViewController: NSHostingController(rootView: navigatorView) ) navigator.titlebarSeparatorStyle = .none - navigator.minimumThickness = 242 + navigator.minimumThickness = Self.minSidebarWidth navigator.collapseBehavior = .useConstraints splitVC.addSplitViewItem(navigator) @@ -92,9 +94,9 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate { viewController: NSHostingController(rootView: inspectorView) ) inspector.titlebarSeparatorStyle = .none - inspector.minimumThickness = 260 - inspector.maximumThickness = 260 + inspector.minimumThickness = Self.minSidebarWidth inspector.isCollapsed = true + inspector.canCollapse = true inspector.collapseBehavior = .useConstraints splitVC.addSplitViewItem(inspector) @@ -288,7 +290,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate { } } -private extension NSToolbarItem.Identifier { +extension NSToolbarItem.Identifier { static let toggleFirstSidebarItem: NSToolbarItem.Identifier = NSToolbarItem.Identifier("ToggleFirstSidebarItem") static let toggleLastSidebarItem: NSToolbarItem.Identifier = NSToolbarItem.Identifier("ToggleLastSidebarItem") static let itemListTrackingSeparator = NSToolbarItem.Identifier("ItemListTrackingSeparator") diff --git a/CodeEdit/Features/InspectorSidebar/InspectorSidebarView.swift b/CodeEdit/Features/InspectorSidebar/InspectorSidebarView.swift index 9682c24f27..8ac356c360 100644 --- a/CodeEdit/Features/InspectorSidebar/InspectorSidebarView.swift +++ b/CodeEdit/Features/InspectorSidebar/InspectorSidebarView.swift @@ -46,7 +46,7 @@ struct InspectorSidebarView: View { } } .frame( - minWidth: 250, + minWidth: CodeEditWindowController.minSidebarWidth, idealWidth: 260, minHeight: 0, maxHeight: .infinity, diff --git a/CodeEditTests/Features/Documents/DocumentsUnitTests.swift b/CodeEditTests/Features/Documents/DocumentsUnitTests.swift index 3903560823..73ef89c2c2 100644 --- a/CodeEditTests/Features/Documents/DocumentsUnitTests.swift +++ b/CodeEditTests/Features/Documents/DocumentsUnitTests.swift @@ -46,7 +46,8 @@ final class DocumentsUnitTests: XCTestCase { func testSplitViewControllerStopSnappedWhenWidthIsLowerAppropriateRange() { // Given - let position = (0..<260).randomElement() ?? .zero + // 242 is the minimum width of the sidebar + let position = (242..<260).randomElement() ?? .zero // When let result = splitViewController.splitView(