// Copyright (C) 2024 Rubén Beltrán del Río // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see https://map.tranquil.systems. import AppKit import Sparkle import SwiftUI @main struct MapApp: App { private let updaterController: SPUStandardUpdaterController = SPUStandardUpdaterController( startingUpdater: true, updaterDelegate: nil, userDriverDelegate: nil) var body: some Scene { DocumentGroup(newDocument: MapDocument(text: nil)) { file in MapEditor(document: file.$document, url: file.fileURL) .focusedSceneValue(\.document, file.$document) .focusedSceneValue(\.fileURL, file.fileURL) } .windowToolbarStyle(.unifiedCompact) .commands { MapCommands() UpdateCommands(updaterController: updaterController) } Settings { PreferencesWindow() } } } struct LazyMapEditor: View { @Binding var document: MapDocument var url: URL? @FocusedBinding(\.document) var focusedDocument: MapDocument? @FocusedValue(\.fileURL) var focusedFileURL: URL? @State private var shouldRender = false @State private var renderTask: Task? var isActiveDocument: Bool { guard let focusedDocument else { return false } // Use URL for identification if available, otherwise fall back to text comparison if let documentURL = url, let focusedURL = focusedFileURL { return documentURL == focusedURL } // For new documents without URLs, use text comparison as fallback return focusedDocument.text == document.text } var body: some View { if isActiveDocument { MapEditor(document: $document, url: url) } else { Rectangle() .fill(Color(NSColor.windowBackgroundColor)) .overlay( VStack(spacing: 16) { Text("document.inactive") .font(.title2) .foregroundColor(.secondary) if let url = url { Text(url.lastPathComponent) .font(.caption) .foregroundColor(.secondary) } } ) } } }