diff --git a/CHANGELOG.md b/CHANGELOG.md index a03713b8a..ef3628e5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -96,6 +96,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Find Next (Cmd+G) and Find Previous (Cmd+Shift+G) work in the editor. - Pagination buttons no longer fire their page shortcut twice. - PostgreSQL scripts with `DO $$ ... $$` blocks or dollar-quoted bodies no longer fail with an unterminated string error. (#1559) +- Toggling the right inspector in a narrow editor window now grows the window to fit, so the inspector no longer squeezes content or overflows. - AWS IAM connections no longer ask for a password; the same holds for any auth mode that replaces the password, such as a Postgres password file. - Oracle connection failures show the listener's actual reason instead of a generic message. (#483) - A connection password read from a command no longer fails when the command finishes quickly. diff --git a/TablePro/Core/Services/Infrastructure/MainSplitViewController.swift b/TablePro/Core/Services/Infrastructure/MainSplitViewController.swift index cbb3d0638..7074329c0 100644 --- a/TablePro/Core/Services/Infrastructure/MainSplitViewController.swift +++ b/TablePro/Core/Services/Infrastructure/MainSplitViewController.swift @@ -212,6 +212,7 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi inspectorSplitItem.canCollapse = true inspectorSplitItem.minimumThickness = 270 inspectorSplitItem.maximumThickness = 400 + inspectorSplitItem.collapseBehavior = .preferResizingSplitViewWithFixedSiblings addSplitViewItem(inspectorSplitItem) if currentSession?.driver == nil { @@ -225,17 +226,21 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi inspectorSplitItem.isCollapsed = !inspectorPresented } - override func splitViewDidResizeSubviews(_ notification: Notification) { - super.splitViewDidResizeSubviews(notification) - recomputeWindowMinSize() - } - private func materializeInspectorIfNeeded() { guard !hasMaterializedInspector, let inspectorHosting else { return } hasMaterializedInspector = true inspectorHosting.rootView = AnyView(buildInspectorView()) } + private func setCollapsed(_ isCollapsed: Bool, for splitItem: NSSplitViewItem?) { + guard let splitItem, splitItem.isCollapsed != isCollapsed else { return } + if view.window?.isVisible == true { + splitItem.animator().isCollapsed = isCollapsed + } else { + splitItem.isCollapsed = isCollapsed + } + } + override func viewWillAppear() { super.viewWillAppear() guard let window = view.window else { return } @@ -257,7 +262,6 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi } installObservers() - recomputeWindowMinSize() window.recalculateKeyViewLoop() } @@ -324,11 +328,7 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi sessionState = nil currentSession = nil sidebarContainer.updateSidebarState(nil, windowState: nil) - if view.window?.isVisible == true { - sidebarSplitItem.animator().isCollapsed = true - } else { - sidebarSplitItem.isCollapsed = true - } + setCollapsed(true, for: sidebarSplitItem) } return } @@ -356,11 +356,7 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi } let collapseSidebar = newSession.driver == nil - if view.window?.isVisible == true { - sidebarSplitItem.animator().isCollapsed = collapseSidebar - } else { - sidebarSplitItem.isCollapsed = collapseSidebar - } + setCollapsed(collapseSidebar, for: sidebarSplitItem) rebuildPanes() } @@ -526,15 +522,13 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi func showInspector() { materializeInspectorIfNeeded() - inspectorSplitItem?.animator().isCollapsed = false + setCollapsed(false, for: inspectorSplitItem) UserDefaults.standard.set(true, forKey: Self.inspectorPresentedKey) - recomputeWindowMinSize() } func hideInspector() { - inspectorSplitItem?.animator().isCollapsed = true + setCollapsed(true, for: inspectorSplitItem) UserDefaults.standard.set(false, forKey: Self.inspectorPresentedKey) - recomputeWindowMinSize() } @objc override func toggleInspector(_ sender: Any?) { @@ -560,58 +554,14 @@ internal final class MainSplitViewController: NSSplitViewController, InspectorVi if sidebarSplitItem?.isCollapsed == true { sidebarState.selectedSidebarTab = tab - sidebarSplitItem?.animator().isCollapsed = false + setCollapsed(false, for: sidebarSplitItem) } else if sidebarState.selectedSidebarTab == tab { - sidebarSplitItem?.animator().isCollapsed = true + setCollapsed(true, for: sidebarSplitItem) } else { sidebarState.selectedSidebarTab = tab } } - // MARK: - Dynamic Window Minimum Size - - private static let baseWindowMinWidth: CGFloat = 720 - private static let baseWindowMinHeight: CGFloat = 480 - - private func recomputeWindowMinSize() { - guard let window = view.window else { return } - let sidebarVisible = !(sidebarSplitItem?.isCollapsed ?? true) - let inspectorVisible = !(inspectorSplitItem?.isCollapsed ?? true) - - let detailMin: CGFloat = detailSplitItem?.minimumThickness ?? 400 - let sidebarMin: CGFloat = sidebarSplitItem?.minimumThickness ?? 280 - let inspectorMin: CGFloat = inspectorSplitItem?.minimumThickness ?? 270 - let dividerThickness = splitView.dividerThickness - - var width: CGFloat = detailMin - if sidebarVisible { - width += sidebarMin + dividerThickness - } - if inspectorVisible { - width += inspectorMin + dividerThickness - } - - let resolvedWidth = max(Self.baseWindowMinWidth, width) - let newMinSize = NSSize(width: resolvedWidth, height: Self.baseWindowMinHeight) - - guard window.minSize != newMinSize else { return } - window.minSize = newMinSize - - var frame = window.frame - var resized = false - if frame.size.width < resolvedWidth { - frame.size.width = resolvedWidth - resized = true - } - if frame.size.height < Self.baseWindowMinHeight { - frame.size.height = Self.baseWindowMinHeight - resized = true - } - if resized { - window.setFrame(frame, display: true, animate: false) - } - } - // MARK: - Constants private static let inspectorPresentedKey = "com.TablePro.rightPanel.isPresented"