Skip to content

Commit 07370b7

Browse files
committed
refactor(inspector): grow the window via NSSplitViewItem.collapseBehavior instead of custom min-size code
1 parent 3539993 commit 07370b7

4 files changed

Lines changed: 13 additions & 240 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4848
- Find Next (Cmd+G) and Find Previous (Cmd+Shift+G) now work in the editor.
4949
- Pagination buttons no longer fire their page shortcut twice.
5050
- Running a PostgreSQL script with a `DO $$ ... $$` block or a dollar-quoted function body no longer fails with an unterminated dollar-quoted string error. (#1559)
51-
- Toggling the right inspector in a narrow editor window now updates the window minimum width from the visible split panes, so the inspector no longer squeezes content or overflows.
51+
- Toggling the right inspector in a narrow editor window now grows the window to fit, so the inspector no longer squeezes content or overflows.
5252
- AWS IAM connections no longer ask for a password on connect or reconnect. IAM supplies the credentials, so the prompt was never needed. The same now holds for any auth mode that replaces the password, such as a Postgres password file.
5353
- Oracle connection failures show the listener's actual reason (such as an unknown service name) instead of a generic "server closed the connection" message. (#483)
5454

TablePro/Core/Services/Infrastructure/MainSplitViewController.swift

Lines changed: 11 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
191191
sidebarSplitItem.canCollapse = true
192192
sidebarSplitItem.minimumThickness = 280
193193
sidebarSplitItem.maximumThickness = 600
194+
sidebarSplitItem.collapseBehavior = .preferResizingSplitViewWithFixedSiblings
194195
addSplitViewItem(sidebarSplitItem)
195196

196197
detailHosting = NSHostingController(rootView: AnyView(buildDetailView()))
@@ -212,6 +213,7 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
212213
inspectorSplitItem.canCollapse = true
213214
inspectorSplitItem.minimumThickness = 270
214215
inspectorSplitItem.maximumThickness = 400
216+
inspectorSplitItem.collapseBehavior = .preferResizingSplitViewWithFixedSiblings
215217
addSplitViewItem(inspectorSplitItem)
216218

217219
if currentSession?.driver == nil {
@@ -225,97 +227,18 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
225227
inspectorSplitItem.isCollapsed = !inspectorPresented
226228
}
227229

228-
override func splitViewDidResizeSubviews(_ notification: Notification) {
229-
super.splitViewDidResizeSubviews(notification)
230-
recomputeWindowMinimumSize()
231-
}
232-
233230
private func materializeInspectorIfNeeded() {
234231
guard !hasMaterializedInspector, let inspectorHosting else { return }
235232
hasMaterializedInspector = true
236233
inspectorHosting.rootView = AnyView(buildInspectorView())
237234
}
238235

239-
internal struct PaneMinimum {
240-
internal let minimumThickness: CGFloat
241-
internal let isCollapsed: Bool
242-
}
243-
244-
internal static func resolvedContentMinSize(
245-
base: NSSize,
246-
panes: [PaneMinimum],
247-
dividerThickness: CGFloat
248-
) -> NSSize {
249-
let visiblePanes = panes.filter { !$0.isCollapsed }
250-
let paneWidth = visiblePanes.reduce(CGFloat.zero) { partialResult, pane in
251-
partialResult + max(CGFloat.zero, pane.minimumThickness)
252-
}
253-
let dividerCount = max(visiblePanes.count - 1, 0)
254-
let resolvedWidth = max(base.width, paneWidth + (CGFloat(dividerCount) * dividerThickness))
255-
return NSSize(width: resolvedWidth, height: base.height)
256-
}
257-
258-
private func recomputeWindowMinimumSize(
259-
sidebarCollapsed: Bool? = nil,
260-
inspectorCollapsed: Bool? = nil
261-
) {
262-
guard let window = view.window else { return }
263-
264-
let resolvedMinSize = Self.resolvedContentMinSize(
265-
base: NSSize(width: Self.baseContentMinWidth, height: Self.baseContentMinHeight),
266-
panes: [
267-
PaneMinimum(
268-
minimumThickness: sidebarSplitItem?.minimumThickness ?? .zero,
269-
isCollapsed: sidebarCollapsed ?? (sidebarSplitItem?.isCollapsed ?? true)
270-
),
271-
PaneMinimum(
272-
minimumThickness: detailSplitItem?.minimumThickness ?? .zero,
273-
isCollapsed: detailSplitItem?.isCollapsed ?? false
274-
),
275-
PaneMinimum(
276-
minimumThickness: inspectorSplitItem?.minimumThickness ?? .zero,
277-
isCollapsed: inspectorCollapsed ?? (inspectorSplitItem?.isCollapsed ?? true)
278-
)
279-
],
280-
dividerThickness: splitView.dividerThickness
281-
)
282-
283-
if window.contentMinSize != resolvedMinSize {
284-
window.contentMinSize = resolvedMinSize
285-
}
286-
287-
let currentContentSize = window.contentRect(forFrameRect: window.frame).size
288-
guard currentContentSize.width < resolvedMinSize.width || currentContentSize.height < resolvedMinSize.height else { return }
289-
window.setContentSize(NSSize(
290-
width: max(currentContentSize.width, resolvedMinSize.width),
291-
height: max(currentContentSize.height, resolvedMinSize.height)
292-
))
293-
}
294-
295-
private func setCollapsed(
296-
_ isCollapsed: Bool,
297-
for splitItem: NSSplitViewItem?,
298-
prepareWindowMinimumSize: (() -> Void)? = nil
299-
) {
300-
guard let splitItem else { return }
301-
302-
if splitItem.isCollapsed == isCollapsed {
303-
recomputeWindowMinimumSize()
304-
return
305-
}
306-
307-
prepareWindowMinimumSize?()
308-
309-
guard view.window?.isVisible == true else {
310-
splitItem.isCollapsed = isCollapsed
311-
recomputeWindowMinimumSize()
312-
return
313-
}
314-
315-
NSAnimationContext.runAnimationGroup { _ in
236+
private func setCollapsed(_ isCollapsed: Bool, for splitItem: NSSplitViewItem?) {
237+
guard let splitItem, splitItem.isCollapsed != isCollapsed else { return }
238+
if view.window?.isVisible == true {
316239
splitItem.animator().isCollapsed = isCollapsed
317-
} completionHandler: { [weak self] in
318-
self?.recomputeWindowMinimumSize()
240+
} else {
241+
splitItem.isCollapsed = isCollapsed
319242
}
320243
}
321244

@@ -340,7 +263,6 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
340263
}
341264

342265
installObservers()
343-
recomputeWindowMinimumSize()
344266
window.recalculateKeyViewLoop()
345267
}
346268

@@ -435,10 +357,7 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
435357
}
436358

437359
let collapseSidebar = newSession.driver == nil
438-
setCollapsed(collapseSidebar, for: sidebarSplitItem) { [weak self] in
439-
guard !collapseSidebar else { return }
440-
self?.recomputeWindowMinimumSize(sidebarCollapsed: false)
441-
}
360+
setCollapsed(collapseSidebar, for: sidebarSplitItem)
442361
rebuildPanes()
443362
}
444363

@@ -604,16 +523,12 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
604523

605524
func showInspector() {
606525
materializeInspectorIfNeeded()
607-
setCollapsed(false, for: inspectorSplitItem) { [weak self] in
608-
self?.recomputeWindowMinimumSize(inspectorCollapsed: false)
609-
}
526+
setCollapsed(false, for: inspectorSplitItem)
610527
UserDefaults.standard.set(true, forKey: Self.inspectorPresentedKey)
611528
}
612529

613530
func hideInspector() {
614-
setCollapsed(true, for: inspectorSplitItem) { [weak self] in
615-
self?.recomputeWindowMinimumSize(inspectorCollapsed: true)
616-
}
531+
setCollapsed(true, for: inspectorSplitItem)
617532
UserDefaults.standard.set(false, forKey: Self.inspectorPresentedKey)
618533
}
619534

@@ -640,9 +555,7 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
640555

641556
if sidebarSplitItem?.isCollapsed == true {
642557
sidebarState.selectedSidebarTab = tab
643-
setCollapsed(false, for: sidebarSplitItem) { [weak self] in
644-
self?.recomputeWindowMinimumSize(sidebarCollapsed: false)
645-
}
558+
setCollapsed(false, for: sidebarSplitItem)
646559
} else if sidebarState.selectedSidebarTab == tab {
647560
setCollapsed(true, for: sidebarSplitItem)
648561
} else {
@@ -652,7 +565,5 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
652565

653566
// MARK: - Constants
654567

655-
internal static let baseContentMinWidth: CGFloat = 720
656-
internal static let baseContentMinHeight: CGFloat = 480
657568
private static let inspectorPresentedKey = "com.TablePro.rightPanel.isPresented"
658569
}

TablePro/Core/Services/Infrastructure/TabWindowController.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ internal final class TabWindowController: NSWindowController, NSWindowDelegate {
5151
defer: false
5252
)
5353
window.identifier = NSUserInterfaceItemIdentifier("main")
54+
window.minSize = NSSize(width: 720, height: 480)
5455
window.isRestorable = AppSettingsStorage.shared.loadGeneral().startupBehavior == .reopenLast
5556
window.restorationClass = TabWindowRestoration.self
5657
window.toolbarStyle = .unified

TableProTests/Core/Services/Infrastructure/MainSplitViewControllerWindowMinimumSizeTests.swift

Lines changed: 0 additions & 139 deletions
This file was deleted.

0 commit comments

Comments
 (0)