Skip to content

Commit 6391036

Browse files
committed
fix: move suppression flag to connection handlers, fix sidebar width, add tests
1 parent e50d669 commit 6391036

5 files changed

Lines changed: 65 additions & 33 deletions

File tree

TablePro/AppDelegate+ConnectionHandler.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ extension AppDelegate {
7070
openNewConnectionWindow(for: connection)
7171

7272
Task { @MainActor in
73+
defer { self.endFileOpenSuppression() }
7374
do {
7475
try await DatabaseManager.shared.connectToSession(connection)
7576
for window in NSApp.windows where self.isWelcomeWindow(window) {
@@ -116,6 +117,7 @@ extension AppDelegate {
116117
openNewConnectionWindow(for: connection)
117118

118119
Task { @MainActor in
120+
defer { self.endFileOpenSuppression() }
119121
do {
120122
try await DatabaseManager.shared.connectToSession(connection)
121123
for window in NSApp.windows where self.isWelcomeWindow(window) {
@@ -161,6 +163,7 @@ extension AppDelegate {
161163
openNewConnectionWindow(for: connection)
162164

163165
Task { @MainActor in
166+
defer { self.endFileOpenSuppression() }
164167
do {
165168
try await DatabaseManager.shared.connectToSession(connection)
166169
for window in NSApp.windows where self.isWelcomeWindow(window) {
@@ -206,6 +209,7 @@ extension AppDelegate {
206209
openNewConnectionWindow(for: connection)
207210

208211
Task { @MainActor in
212+
defer { self.endFileOpenSuppression() }
209213
do {
210214
try await DatabaseManager.shared.connectToSession(connection)
211215
for window in NSApp.windows where self.isWelcomeWindow(window) {
@@ -252,7 +256,7 @@ extension AppDelegate {
252256
case .genericDatabaseFile(let url, let dbType): self.handleGenericDatabaseFile(url, type: dbType)
253257
}
254258
}
255-
self.scheduleWelcomeWindowSuppression()
259+
// Flag management is handled by endFileOpenSuppression() in each handler
256260
}
257261
}
258262

TablePro/AppDelegate+FileOpen.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ extension AppDelegate {
5353
suppressWelcomeWindow()
5454
Task { @MainActor in
5555
for url in databaseURLs { self.handleDatabaseURL(url) }
56-
self.scheduleWelcomeWindowSuppression()
56+
// Flag management is handled by endFileOpenSuppression() in each handler
5757
}
5858
}
5959

@@ -72,7 +72,7 @@ extension AppDelegate {
7272
self.handleGenericDatabaseFile(url, type: dbType)
7373
}
7474
}
75-
self.scheduleWelcomeWindowSuppression()
75+
// Flag management is handled by endFileOpenSuppression() in each handler
7676
}
7777
}
7878

@@ -87,7 +87,7 @@ extension AppDelegate {
8787
window.close()
8888
}
8989
NotificationCenter.default.post(name: .openSQLFiles, object: sqlFiles)
90-
scheduleWelcomeWindowSuppression()
90+
endFileOpenSuppression()
9191
} else {
9292
queuedFileURLs.append(contentsOf: sqlFiles)
9393
openWelcomeWindow()

TablePro/AppDelegate+WindowConfig.swift

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -190,20 +190,13 @@ extension AppDelegate {
190190

191191
// MARK: - Welcome Window Suppression
192192

193-
func scheduleWelcomeWindowSuppression() {
194-
// The actual welcome window closing is event-driven:
195-
// - windowDidBecomeKey closes welcome when a main window appears
196-
// - Connection handlers close welcome on success, reopen on failure
197-
// This method just manages the suppression counter after a brief delay
198-
// to allow those event-driven handlers to fire.
199-
Task { @MainActor [weak self] in
200-
try? await Task.sleep(for: .milliseconds(500))
201-
guard let self else { return }
202-
self.closeWelcomeWindowIfMainExists()
203-
self.fileOpenSuppressionCount = max(0, self.fileOpenSuppressionCount - 1)
204-
if self.fileOpenSuppressionCount == 0 {
205-
self.isHandlingFileOpen = false
206-
}
193+
/// Called by connection handlers when the file-open connection attempt finishes
194+
/// (success or failure). Decrements the suppression counter and resets the flag
195+
/// when all outstanding file opens have completed.
196+
func endFileOpenSuppression() {
197+
fileOpenSuppressionCount = max(0, fileOpenSuppressionCount - 1)
198+
if fileOpenSuppressionCount == 0 {
199+
isHandlingFileOpen = false
207200
}
208201
}
209202

TablePro/ContentView.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,10 @@ struct ContentView: View {
197197
placement: .sidebar,
198198
prompt: sidebarSearchPrompt(for: currentSession.connection.id)
199199
)
200+
.navigationSplitViewColumnWidth(min: 200, ideal: 250, max: 600)
200201
} else {
201202
Color.clear
203+
.navigationSplitViewColumnWidth(min: 200, ideal: 250, max: 600)
202204
}
203205
} detail: {
204206
// MARK: - Detail (Main workspace with optional right sidebar)
@@ -250,7 +252,6 @@ struct ContentView: View {
250252
.frame(maxWidth: .infinity, maxHeight: .infinity)
251253
}
252254
}
253-
.navigationSplitViewColumnWidth(min: 200, ideal: 250, max: 600)
254255
.navigationTitle(windowTitle)
255256
.navigationSubtitle(currentSession?.connection.name ?? "")
256257
}

TableProTests/Core/Services/WelcomeWindowSuppressionTests.swift

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -218,35 +218,69 @@ struct WelcomeWindowSuppressionTests {
218218
#expect(delegate.isHandlingFileOpen == true)
219219
}
220220

221-
@Test("fileOpenSuppressionCount decrement to zero resets isHandlingFileOpen")
222-
func countZeroResetsFlag() {
221+
@Test("endFileOpenSuppression — decrement to zero resets isHandlingFileOpen")
222+
func endSuppressionResetsFlag() {
223223
let delegate = makeAppDelegate()
224224
delegate.isHandlingFileOpen = true
225225
delegate.fileOpenSuppressionCount = 1
226226

227-
// Simulate what scheduleWelcomeWindowSuppression does at the end
228-
delegate.fileOpenSuppressionCount = max(0, delegate.fileOpenSuppressionCount - 1)
229-
if delegate.fileOpenSuppressionCount == 0 {
230-
delegate.isHandlingFileOpen = false
231-
}
227+
delegate.endFileOpenSuppression()
232228

233229
#expect(delegate.fileOpenSuppressionCount == 0)
234230
#expect(delegate.isHandlingFileOpen == false)
235231
}
236232

237-
@Test("fileOpenSuppressionCount decrement keeps flag true while count > 0")
238-
func countPositiveKeepsFlag() {
233+
@Test("endFileOpenSuppression — keeps flag true while count > 0")
234+
func endSuppressionKeepsFlagWhilePositive() {
239235
let delegate = makeAppDelegate()
240236
delegate.isHandlingFileOpen = true
241237
delegate.fileOpenSuppressionCount = 2
242238

243-
// Simulate one decrement
244-
delegate.fileOpenSuppressionCount = max(0, delegate.fileOpenSuppressionCount - 1)
245-
if delegate.fileOpenSuppressionCount == 0 {
246-
delegate.isHandlingFileOpen = false
247-
}
239+
delegate.endFileOpenSuppression()
248240

249241
#expect(delegate.fileOpenSuppressionCount == 1)
250242
#expect(delegate.isHandlingFileOpen == true)
251243
}
244+
245+
// MARK: - Main Window Becomes Key
246+
247+
@Test("windowDidBecomeKey — main window appearing closes welcome during file open")
248+
func windowDidBecomeKeyMainWindowClosesWelcome() {
249+
let delegate = makeAppDelegate()
250+
delegate.isHandlingFileOpen = true
251+
252+
let welcome = makeWindow(identifier: "welcome")
253+
welcome.orderFront(nil)
254+
defer { welcome.close() }
255+
256+
let mainWin = makeWindow(identifier: "main")
257+
mainWin.orderFront(nil)
258+
defer { mainWin.close() }
259+
260+
// Simulate main window becoming key — should close welcome
261+
let notification = Notification(name: NSWindow.didBecomeKeyNotification, object: mainWin)
262+
delegate.windowDidBecomeKey(notification)
263+
264+
#expect(!welcome.isVisible)
265+
}
266+
267+
@Test("windowDidBecomeKey — main window does not close welcome when not handling file open")
268+
func windowDidBecomeKeyMainWindowNoEffectWhenNotHandling() {
269+
let delegate = makeAppDelegate()
270+
delegate.isHandlingFileOpen = false
271+
272+
let welcome = makeWindow(identifier: "welcome")
273+
welcome.orderFront(nil)
274+
defer { welcome.close() }
275+
276+
let mainWin = makeWindow(identifier: "main")
277+
mainWin.orderFront(nil)
278+
defer { mainWin.close() }
279+
280+
let notification = Notification(name: NSWindow.didBecomeKeyNotification, object: mainWin)
281+
delegate.windowDidBecomeKey(notification)
282+
283+
// Welcome should remain visible — no suppression active
284+
#expect(welcome.isVisible)
285+
}
252286
}

0 commit comments

Comments
 (0)