Skip to content

Commit 6f873b4

Browse files
authored
Merge pull request #597 from TableProApp/fix/sheet-panels
fix: convert all file open/save panels to sheet presentation
2 parents 07642d7 + 0a4fc87 commit 6f873b4

File tree

10 files changed

+61
-39
lines changed

10 files changed

+61
-39
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2020
- Add schema versioning to SQLite databases (query history, favorites) for future migrations
2121
- Use semantic selected-text color instead of hardcoded white in selected rows
2222
- Use proper CommandGroup for full-screen shortcut instead of event monitor
23+
- Use sheet presentation for all file open/save panels instead of free-floating dialogs
2324

2425
### Added
2526

TablePro/ViewModels/WelcomeViewModel.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,8 +377,11 @@ final class WelcomeViewModel {
377377
panel.allowedContentTypes = [.tableproConnectionShare]
378378
panel.allowsMultipleSelection = false
379379
panel.canChooseDirectories = false
380-
guard panel.runModal() == .OK, let url = panel.url else { return }
381-
activeSheet = .importFile(url)
380+
guard let window = NSApp.keyWindow else { return }
381+
panel.beginSheetModal(for: window) { response in
382+
guard response == .OK, let url = panel.url else { return }
383+
self.activeSheet = .importFile(url)
384+
}
382385
}
383386

384387
func showImportResultAlert(count: Int) {

TablePro/Views/Connection/ConnectionExportOptionsSheet.swift

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -104,24 +104,27 @@ struct ConnectionExportOptionsSheet: View {
104104
: "Connections.tablepro"
105105
panel.nameFieldStringValue = defaultName
106106
panel.canCreateDirectories = true
107-
guard panel.runModal() == .OK, let url = panel.url else { return }
108-
109-
do {
110-
if shouldEncrypt {
111-
try ConnectionExportService.exportConnectionsEncrypted(
112-
capturedConnections,
113-
to: url,
114-
passphrase: capturedPassphrase
107+
guard let window = NSApp.keyWindow else { return }
108+
panel.beginSheetModal(for: window) { response in
109+
guard response == .OK, let url = panel.url else { return }
110+
111+
do {
112+
if shouldEncrypt {
113+
try ConnectionExportService.exportConnectionsEncrypted(
114+
capturedConnections,
115+
to: url,
116+
passphrase: capturedPassphrase
117+
)
118+
} else {
119+
try ConnectionExportService.exportConnections(capturedConnections, to: url)
120+
}
121+
} catch {
122+
AlertHelper.showErrorSheet(
123+
title: String(localized: "Export Failed"),
124+
message: error.localizedDescription,
125+
window: window
115126
)
116-
} else {
117-
try ConnectionExportService.exportConnections(capturedConnections, to: url)
118127
}
119-
} catch {
120-
AlertHelper.showErrorSheet(
121-
title: String(localized: "Export Failed"),
122-
message: error.localizedDescription,
123-
window: NSApp.keyWindow
124-
)
125128
}
126129
}
127130
}

TablePro/Views/Export/ExportDialog.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,9 @@ struct ExportDialog: View {
714714
savePanel.message = String(format: String(localized: "Export %d table(s) to %@"), exportableCount, formatName)
715715
}
716716

717-
savePanel.begin { response in
717+
guard let keyWindow = NSApp.keyWindow else { return }
718+
let window = keyWindow.sheetParent ?? keyWindow
719+
savePanel.beginSheetModal(for: window) { response in
718720
guard response == .OK, let url = savePanel.url else { return }
719721

720722
Task {

TablePro/Views/Import/ImportDialog.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -294,11 +294,13 @@ struct ImportDialog: View {
294294
panel.allowsMultipleSelection = false
295295
panel.message = "Select file to import"
296296

297-
panel.begin { response in
297+
guard let keyWindow = NSApp.keyWindow else { return }
298+
let window = keyWindow.sheetParent ?? keyWindow
299+
panel.beginSheetModal(for: window) { response in
298300
guard response == .OK, let url = panel.url else { return }
299301

300-
loadFileTask = Task {
301-
await loadFile(url)
302+
self.loadFileTask = Task {
303+
await self.loadFile(url)
302304
}
303305
}
304306
}

TablePro/Views/Main/Extensions/MainContentCoordinator+SidebarActions.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,8 @@ extension MainContentCoordinator {
133133
panel.allowsMultipleSelection = false
134134
panel.message = "Select SQL file to import"
135135

136-
panel.begin { [weak self] response in
136+
guard let window = contentWindow else { return }
137+
panel.beginSheetModal(for: window) { [weak self] response in
137138
guard response == .OK, let url = panel.url else { return }
138139
self?.importFileURL = url
139140
self?.activeSheet = .importDialog

TablePro/Views/Settings/Appearance/ThemeListView.swift

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -173,26 +173,32 @@ internal struct ThemeListView: View {
173173
}
174174

175175
private func exportActiveTheme() {
176+
guard let window = NSApp.keyWindow else { return }
176177
let panel = NSSavePanel()
177178
panel.allowedContentTypes = [.json]
178179
panel.nameFieldStringValue = engine.activeTheme.name + ".json"
179180
panel.canCreateDirectories = true
180-
guard panel.runModal() == .OK, let url = panel.url else { return }
181-
try? engine.exportTheme(engine.activeTheme, to: url)
181+
panel.beginSheetModal(for: window) { response in
182+
guard response == .OK, let url = panel.url else { return }
183+
try? engine.exportTheme(engine.activeTheme, to: url)
184+
}
182185
}
183186

184187
private func importTheme() {
188+
guard let window = NSApp.keyWindow else { return }
185189
let panel = NSOpenPanel()
186190
panel.allowedContentTypes = [.json]
187191
panel.allowsMultipleSelection = false
188192
panel.canChooseDirectories = false
189-
guard panel.runModal() == .OK, let url = panel.url else { return }
190-
do {
191-
let imported = try engine.importTheme(from: url)
192-
selectedThemeId = imported.id
193-
} catch {
194-
errorMessage = error.localizedDescription
195-
showError = true
193+
panel.beginSheetModal(for: window) { response in
194+
guard response == .OK, let url = panel.url else { return }
195+
do {
196+
let imported = try self.engine.importTheme(from: url)
197+
self.selectedThemeId = imported.id
198+
} catch {
199+
self.errorMessage = error.localizedDescription
200+
self.showError = true
201+
}
196202
}
197203
}
198204
}

TablePro/Views/Settings/LinkedFoldersSection.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,16 @@ struct LinkedFoldersSection: View {
101101
panel.allowsMultipleSelection = false
102102
panel.message = String(localized: "Choose a folder to watch for .tablepro connection files")
103103

104-
panel.begin { response in
104+
guard let window = NSApp.keyWindow else { return }
105+
panel.beginSheetModal(for: window) { response in
105106
guard response == .OK, let url = panel.url else { return }
106107
let path = PathPortability.contractHome(url.path)
107108

108-
guard !folders.contains(where: { $0.path == path }) else { return }
109+
guard !self.folders.contains(where: { $0.path == path }) else { return }
109110

110111
let folder = LinkedFolder(path: path)
111112
LinkedFolderStorage.shared.addFolder(folder)
112-
folders = LinkedFolderStorage.shared.loadFolders()
113+
self.folders = LinkedFolderStorage.shared.loadFolders()
113114
LinkedFolderWatcher.shared.reload()
114115
}
115116
}

TablePro/Views/Settings/Plugins/InstalledPluginsView.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -297,9 +297,11 @@ struct InstalledPluginsView: View {
297297
panel.canChooseDirectories = false
298298
panel.treatsFilePackagesAsDirectories = false
299299

300-
guard panel.runModal() == .OK, let url = panel.url else { return }
301-
302-
installPlugin(from: url)
300+
guard let window = NSApp.keyWindow else { return }
301+
panel.beginSheetModal(for: window) { response in
302+
guard response == .OK, let url = panel.url else { return }
303+
self.installPlugin(from: url)
304+
}
303305
}
304306

305307
private func installPlugin(from url: URL) {

TablePro/Views/Structure/TableStructureView.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -979,7 +979,8 @@ struct TableStructureView: View {
979979
}
980980
savePanel.nameFieldStringValue = "\(tableName).sql"
981981

982-
savePanel.begin { response in
982+
guard let window = NSApp.keyWindow else { return }
983+
savePanel.beginSheetModal(for: window) { response in
983984
guard response == .OK, let url = savePanel.url else { return }
984985
do {
985986
try ddlStatement.write(to: url, atomically: true, encoding: .utf8)

0 commit comments

Comments
 (0)