Open multiple documents per markdown file
This commit is contained in:
@@ -1,10 +1,84 @@
|
||||
import SwiftUI
|
||||
import UniformTypeIdentifiers
|
||||
import AppKit
|
||||
|
||||
@main
|
||||
struct MarkdownViewerApp: App {
|
||||
var body: some Scene {
|
||||
WindowGroup {
|
||||
ContentView()
|
||||
Settings {
|
||||
EmptyView()
|
||||
}
|
||||
.commands {
|
||||
CommandGroup(replacing: .newItem) {
|
||||
Button("Open Markdown File...") {
|
||||
openMarkdownFile()
|
||||
}
|
||||
.keyboardShortcut("o", modifiers: .command)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func openMarkdownFile() {
|
||||
let panel = NSOpenPanel()
|
||||
panel.allowsMultipleSelection = true
|
||||
panel.canChooseDirectories = false
|
||||
panel.canChooseFiles = true
|
||||
panel.allowedContentTypes = [UTType.plainText, UTType(filenameExtension: "md")!]
|
||||
|
||||
if panel.runModal() == .OK {
|
||||
for url in panel.urls {
|
||||
openNewWindow(for: url)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func openNewWindow(for url: URL) {
|
||||
do {
|
||||
let content = try String(contentsOf: url, encoding: .utf8)
|
||||
let newWindow = NSWindow(
|
||||
contentRect: NSRect(x: 0, y: 0, width: 800, height: 600),
|
||||
styleMask: [.titled, .closable, .resizable, .miniaturizable],
|
||||
backing: .buffered,
|
||||
defer: false
|
||||
)
|
||||
|
||||
newWindow.title = url.lastPathComponent
|
||||
newWindow.contentView = NSHostingView(
|
||||
rootView: MarkdownDocumentView(
|
||||
content: content,
|
||||
fileName: url.lastPathComponent
|
||||
)
|
||||
)
|
||||
newWindow.center()
|
||||
newWindow.makeKeyAndOrderFront(nil)
|
||||
|
||||
} catch {
|
||||
print("Error reading file: \(error)")
|
||||
// Show error in a new window
|
||||
let newWindow = NSWindow(
|
||||
contentRect: NSRect(x: 0, y: 0, width: 400, height: 200),
|
||||
styleMask: [.titled, .closable],
|
||||
backing: .buffered,
|
||||
defer: false
|
||||
)
|
||||
|
||||
newWindow.title = "Error"
|
||||
newWindow.contentView = NSHostingView(
|
||||
rootView: VStack {
|
||||
Image(systemName: "exclamationmark.triangle")
|
||||
.font(.system(size: 40))
|
||||
.foregroundColor(.red)
|
||||
Text("Error loading file")
|
||||
.font(.headline)
|
||||
Text(error.localizedDescription)
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
.multilineTextAlignment(.center)
|
||||
}
|
||||
.padding()
|
||||
)
|
||||
newWindow.center()
|
||||
newWindow.makeKeyAndOrderFront(nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user