Skip to content

Commit dacabe2

Browse files
committed
refactor(inspector): extract testable window-minimum application and simplify pane collapse
1 parent 3539993 commit dacabe2

2 files changed

Lines changed: 70 additions & 24 deletions

File tree

TablePro/Core/Services/Infrastructure/MainSplitViewController.swift

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -280,31 +280,31 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
280280
dividerThickness: splitView.dividerThickness
281281
)
282282

283-
if window.contentMinSize != resolvedMinSize {
284-
window.contentMinSize = resolvedMinSize
283+
Self.applyContentMinimum(resolvedMinSize, to: window)
284+
}
285+
286+
internal static func applyContentMinimum(_ minimumSize: NSSize, to window: NSWindow) {
287+
if window.contentMinSize != minimumSize {
288+
window.contentMinSize = minimumSize
285289
}
286290

287291
let currentContentSize = window.contentRect(forFrameRect: window.frame).size
288-
guard currentContentSize.width < resolvedMinSize.width || currentContentSize.height < resolvedMinSize.height else { return }
292+
guard currentContentSize.width < minimumSize.width || currentContentSize.height < minimumSize.height else { return }
289293
window.setContentSize(NSSize(
290-
width: max(currentContentSize.width, resolvedMinSize.width),
291-
height: max(currentContentSize.height, resolvedMinSize.height)
294+
width: max(currentContentSize.width, minimumSize.width),
295+
height: max(currentContentSize.height, minimumSize.height)
292296
))
293297
}
294298

295-
private func setCollapsed(
296-
_ isCollapsed: Bool,
297-
for splitItem: NSSplitViewItem?,
298-
prepareWindowMinimumSize: (() -> Void)? = nil
299-
) {
299+
private func setCollapsed(_ isCollapsed: Bool, for splitItem: NSSplitViewItem?) {
300300
guard let splitItem else { return }
301301

302302
if splitItem.isCollapsed == isCollapsed {
303303
recomputeWindowMinimumSize()
304304
return
305305
}
306306

307-
prepareWindowMinimumSize?()
307+
prepareWindowMinimum(forTogglingPane: splitItem, toCollapsed: isCollapsed)
308308

309309
guard view.window?.isVisible == true else {
310310
splitItem.isCollapsed = isCollapsed
@@ -319,6 +319,16 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
319319
}
320320
}
321321

322+
private func prepareWindowMinimum(forTogglingPane splitItem: NSSplitViewItem, toCollapsed isCollapsed: Bool) {
323+
if splitItem === sidebarSplitItem {
324+
recomputeWindowMinimumSize(sidebarCollapsed: isCollapsed)
325+
} else if splitItem === inspectorSplitItem {
326+
recomputeWindowMinimumSize(inspectorCollapsed: isCollapsed)
327+
} else {
328+
recomputeWindowMinimumSize()
329+
}
330+
}
331+
322332
override func viewWillAppear() {
323333
super.viewWillAppear()
324334
guard let window = view.window else { return }
@@ -435,10 +445,7 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
435445
}
436446

437447
let collapseSidebar = newSession.driver == nil
438-
setCollapsed(collapseSidebar, for: sidebarSplitItem) { [weak self] in
439-
guard !collapseSidebar else { return }
440-
self?.recomputeWindowMinimumSize(sidebarCollapsed: false)
441-
}
448+
setCollapsed(collapseSidebar, for: sidebarSplitItem)
442449
rebuildPanes()
443450
}
444451

@@ -604,16 +611,12 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
604611

605612
func showInspector() {
606613
materializeInspectorIfNeeded()
607-
setCollapsed(false, for: inspectorSplitItem) { [weak self] in
608-
self?.recomputeWindowMinimumSize(inspectorCollapsed: false)
609-
}
614+
setCollapsed(false, for: inspectorSplitItem)
610615
UserDefaults.standard.set(true, forKey: Self.inspectorPresentedKey)
611616
}
612617

613618
func hideInspector() {
614-
setCollapsed(true, for: inspectorSplitItem) { [weak self] in
615-
self?.recomputeWindowMinimumSize(inspectorCollapsed: true)
616-
}
619+
setCollapsed(true, for: inspectorSplitItem)
617620
UserDefaults.standard.set(false, forKey: Self.inspectorPresentedKey)
618621
}
619622

@@ -640,9 +643,7 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi
640643

641644
if sidebarSplitItem?.isCollapsed == true {
642645
sidebarState.selectedSidebarTab = tab
643-
setCollapsed(false, for: sidebarSplitItem) { [weak self] in
644-
self?.recomputeWindowMinimumSize(sidebarCollapsed: false)
645-
}
646+
setCollapsed(false, for: sidebarSplitItem)
646647
} else if sidebarState.selectedSidebarTab == tab {
647648
setCollapsed(true, for: sidebarSplitItem)
648649
} else {

TableProTests/Core/Services/Infrastructure/MainSplitViewControllerWindowMinimumSizeTests.swift

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,4 +136,49 @@ struct MainSplitViewControllerWindowMinimumSizeTests {
136136
#expect(allPanesVisible.width == 954)
137137
#expect(allPanesVisible.height == MainSplitViewController.baseContentMinHeight)
138138
}
139+
140+
// MARK: - Applying the floor to a window
141+
142+
private func makeWindow(width: CGFloat, height: CGFloat) -> NSWindow {
143+
NSWindow(
144+
contentRect: NSRect(x: 0, y: 0, width: width, height: height),
145+
styleMask: [.titled, .resizable],
146+
backing: .buffered,
147+
defer: true
148+
)
149+
}
150+
151+
@Test("applyContentMinimum sets the window content minimum size")
152+
func applyContentMinimumSetsFloor() {
153+
let window = makeWindow(width: 900, height: 600)
154+
MainSplitViewController.applyContentMinimum(NSSize(width: 800, height: 500), to: window)
155+
#expect(window.contentMinSize == NSSize(width: 800, height: 500))
156+
}
157+
158+
@Test("applyContentMinimum grows a window whose content is below the floor")
159+
func applyContentMinimumGrowsWhenTooSmall() {
160+
let window = makeWindow(width: 600, height: 400)
161+
MainSplitViewController.applyContentMinimum(NSSize(width: 800, height: 500), to: window)
162+
let content = window.contentRect(forFrameRect: window.frame).size
163+
#expect(content.width == 800)
164+
#expect(content.height == 500)
165+
}
166+
167+
@Test("applyContentMinimum never shrinks a window already above the floor")
168+
func applyContentMinimumDoesNotShrink() {
169+
let window = makeWindow(width: 1_000, height: 700)
170+
MainSplitViewController.applyContentMinimum(NSSize(width: 800, height: 500), to: window)
171+
let content = window.contentRect(forFrameRect: window.frame).size
172+
#expect(content.width == 1_000)
173+
#expect(content.height == 700)
174+
}
175+
176+
@Test("applyContentMinimum grows only the deficient dimension")
177+
func applyContentMinimumGrowsOnlyDeficientDimension() {
178+
let window = makeWindow(width: 1_000, height: 400)
179+
MainSplitViewController.applyContentMinimum(NSSize(width: 800, height: 500), to: window)
180+
let content = window.contentRect(forFrameRect: window.frame).size
181+
#expect(content.width == 1_000)
182+
#expect(content.height == 500)
183+
}
139184
}

0 commit comments

Comments
 (0)