Browse Source

Fix Swift concurrency warnings in scanner and editor views.

Align scanner overlay and scan editor view isolation with MainActor, and remove redundant fallback font conversions so the macOS build is warning-free for app source files.

Co-authored-by: Cursor <cursoragent@cursor.com>
Hussain Afzal 2 weeks ago
parent
commit
51fb2b8e73

+ 2 - 2
smart_printer/DrawPrintView.swift

@@ -45,10 +45,10 @@ enum CanvasTextFontStyle: String, CaseIterable {
             return .systemFont(ofSize: size, weight: .bold)
             return .systemFont(ofSize: size, weight: .bold)
         case .italic:
         case .italic:
             let base = AppTheme.regularFont(size: size)
             let base = AppTheme.regularFont(size: size)
-            return NSFontManager.shared.convert(base, toHaveTrait: .italicFontMask) ?? base
+            return NSFontManager.shared.convert(base, toHaveTrait: .italicFontMask)
         case .boldItalic:
         case .boldItalic:
             let bold = NSFont.systemFont(ofSize: size, weight: .bold)
             let bold = NSFont.systemFont(ofSize: size, weight: .bold)
-            return NSFontManager.shared.convert(bold, toHaveTrait: .italicFontMask) ?? bold
+            return NSFontManager.shared.convert(bold, toHaveTrait: .italicFontMask)
         case .serif:
         case .serif:
             return NSFont(name: "Times New Roman", size: size)
             return NSFont(name: "Times New Roman", size: size)
                 ?? NSFont(name: "Times-Roman", size: size)
                 ?? NSFont(name: "Times-Roman", size: size)

+ 2 - 0
smart_printer/ScanFileView.swift

@@ -822,6 +822,7 @@ private final class ScanPageThumbnailView: NSControl, AppearanceRefreshable {
 // MARK: - Editable Scan Content
 // MARK: - Editable Scan Content
 
 
 /// Shows the imported scan image above editable OCR text.
 /// Shows the imported scan image above editable OCR text.
+@MainActor
 final class EditableScanContentView: NSView, AppearanceRefreshable {
 final class EditableScanContentView: NSView, AppearanceRefreshable {
     var onRecognitionComplete: (() -> Void)?
     var onRecognitionComplete: (() -> Void)?
 
 
@@ -892,6 +893,7 @@ final class EditableScanContentView: NSView, AppearanceRefreshable {
         thumbnailViews.forEach { $0.refreshAppearance() }
         thumbnailViews.forEach { $0.refreshAppearance() }
     }
     }
 
 
+    @MainActor
     func loadDocument(pages: [ScanPage]) {
     func loadDocument(pages: [ScanPage]) {
         if pages.allSatisfy({ !$0.text.isEmpty }) {
         if pages.allSatisfy({ !$0.text.isEmpty }) {
             let parsed = pages.map(ScanDocumentBuilder.parsedPage(from:))
             let parsed = pages.map(ScanDocumentBuilder.parsedPage(from:))

+ 14 - 10
smart_printer/ScannerOverlayView.swift

@@ -3,6 +3,7 @@ import ImageCaptureCore
 
 
 // MARK: - Scanner View
 // MARK: - Scanner View
 
 
+@MainActor
 final class ScannerOverlayView: NSView, AppearanceRefreshable {
 final class ScannerOverlayView: NSView, AppearanceRefreshable {
     var onScanComplete: ((NSImage) -> Void)?
     var onScanComplete: ((NSImage) -> Void)?
     var onDismiss: (() -> Void)?
     var onDismiss: (() -> Void)?
@@ -42,8 +43,8 @@ final class ScannerOverlayView: NSView, AppearanceRefreshable {
     private let savePDFButton = ScannerSecondaryButton(title: "Save as PDF", symbolName: "square.and.arrow.down")
     private let savePDFButton = ScannerSecondaryButton(title: "Save as PDF", symbolName: "square.and.arrow.down")
     private let printButton = ScannerSecondaryButton(title: "Print", symbolName: "printer.fill")
     private let printButton = ScannerSecondaryButton(title: "Print", symbolName: "printer.fill")
 
 
-    init(scanner: ScannerService = .shared) {
-        self.scanner = scanner
+    init(scanner: ScannerService? = nil) {
+        self.scanner = scanner ?? .shared
         super.init(frame: .zero)
         super.init(frame: .zero)
         translatesAutoresizingMaskIntoConstraints = false
         translatesAutoresizingMaskIntoConstraints = false
         setup()
         setup()
@@ -51,7 +52,7 @@ final class ScannerOverlayView: NSView, AppearanceRefreshable {
         refreshAppearance()
         refreshAppearance()
         rebuildDeviceLists()
         rebuildDeviceLists()
         updateSelectionUI()
         updateSelectionUI()
-        updateStateUI(scanner.state)
+        updateStateUI(self.scanner.state)
         NotificationCenter.default.addObserver(
         NotificationCenter.default.addObserver(
             self,
             self,
             selector: #selector(appearanceDidChange),
             selector: #selector(appearanceDidChange),
@@ -111,19 +112,22 @@ final class ScannerOverlayView: NSView, AppearanceRefreshable {
     }
     }
 
 
     func dismiss(animated: Bool = true) {
     func dismiss(animated: Bool = true) {
-        let remove = { [weak self] in
-            self?.teardown()
-            self?.removeFromSuperview()
-            self?.onDismiss?()
-        }
         guard animated else {
         guard animated else {
-            remove()
+            teardown()
+            removeFromSuperview()
+            onDismiss?()
             return
             return
         }
         }
         NSAnimationContext.runAnimationGroup({ context in
         NSAnimationContext.runAnimationGroup({ context in
             context.duration = 0.15
             context.duration = 0.15
             animator().alphaValue = 0
             animator().alphaValue = 0
-        }, completionHandler: remove)
+        }, completionHandler: { [weak self] in
+            MainActor.assumeIsolated {
+                self?.teardown()
+                self?.removeFromSuperview()
+                self?.onDismiss?()
+            }
+        })
     }
     }
 
 
     func refreshAppearance() {
     func refreshAppearance() {