import Cocoa import Quartz import SwiftUI import WmapParser class PreviewViewController: NSViewController, QLPreviewingController { override var nibName: NSNib.Name? { return NSNib.Name("PreviewViewController") } override func loadView() { super.loadView() } func preparePreviewOfFile(at url: URL) async throws { // Read the .wmap file content let content = try String(contentsOf: url, encoding: .utf8) // Get the user's preview style preference from shared UserDefaults let sharedDefaults = UserDefaults(suiteName: "group.systems.tranquil.Map") ?? UserDefaults.standard let previewStyleString = sharedDefaults.string(forKey: "quickLookPreviewStyle") ?? QuickLookPreviewStyle.map.rawValue let previewStyle = QuickLookPreviewStyle(rawValue: previewStyleString) ?? .map await MainActor.run { // Clear any existing subviews and force cleanup for subview in view.subviews { if let hostingView = subview as? NSHostingView { hostingView.rootView = AnyView(EmptyView()) } subview.removeFromSuperview() } // Force memory cleanup autoreleasepool { let previewContent: AnyView switch previewStyle { case .plainText: previewContent = AnyView(createPlainTextView(content: content)) case .highlightedText: previewContent = AnyView( createHighlightedTextView(content: content)) case .map: let parsedMap = WmapParser.parse(content) previewContent = AnyView(MapPreviewView(parsedMap: parsedMap)) } let hostingView = NSHostingView(rootView: previewContent) hostingView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(hostingView) NSLayoutConstraint.activate([ hostingView.topAnchor.constraint(equalTo: view.topAnchor), hostingView.leadingAnchor.constraint(equalTo: view.leadingAnchor), hostingView.trailingAnchor.constraint(equalTo: view.trailingAnchor), hostingView.bottomAnchor.constraint(equalTo: view.bottomAnchor), ]) view.needsLayout = true view.layoutSubtreeIfNeeded() } // autoreleasepool } } private func createPlainTextView(content: String) -> some View { ScrollView([.horizontal, .vertical]) { Text(content) .font(.monospaced(.body)()) .multilineTextAlignment(.leading) .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) .padding() } .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.white) } private func createHighlightedTextView(content: String) -> some View { QuickLookTextEditor(content: content) .frame(maxWidth: .infinity, maxHeight: .infinity) .background(Color.white) } deinit { // Cleanup when view controller is deallocated for subview in view.subviews { if let hostingView = subview as? NSHostingView { hostingView.rootView = AnyView(EmptyView()) } subview.removeFromSuperview() } } }