Просмотр исходного кода

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 недель назад
Родитель
Сommit
51fb2b8e73

+ 2 - 2
smart_printer/DrawPrintView.swift

@@ -45,10 +45,10 @@ enum CanvasTextFontStyle: String, CaseIterable {
             return .systemFont(ofSize: size, weight: .bold)
         case .italic:
             let base = AppTheme.regularFont(size: size)
-            return NSFontManager.shared.convert(base, toHaveTrait: .italicFontMask) ?? base
+            return NSFontManager.shared.convert(base, toHaveTrait: .italicFontMask)
         case .boldItalic:
             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:
             return NSFont(name: "Times New 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
 
 /// Shows the imported scan image above editable OCR text.
+@MainActor
 final class EditableScanContentView: NSView, AppearanceRefreshable {
     var onRecognitionComplete: (() -> Void)?
 
@@ -892,6 +893,7 @@ final class EditableScanContentView: NSView, AppearanceRefreshable {
         thumbnailViews.forEach { $0.refreshAppearance() }
     }
 
+    @MainActor
     func loadDocument(pages: [ScanPage]) {
         if pages.allSatisfy({ !$0.text.isEmpty }) {
             let parsed = pages.map(ScanDocumentBuilder.parsedPage(from:))

+ 14 - 10
smart_printer/ScannerOverlayView.swift

@@ -3,6 +3,7 @@ import ImageCaptureCore
 
 // MARK: - Scanner View
 
+@MainActor
 final class ScannerOverlayView: NSView, AppearanceRefreshable {
     var onScanComplete: ((NSImage) -> 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 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)
         translatesAutoresizingMaskIntoConstraints = false
         setup()
@@ -51,7 +52,7 @@ final class ScannerOverlayView: NSView, AppearanceRefreshable {
         refreshAppearance()
         rebuildDeviceLists()
         updateSelectionUI()
-        updateStateUI(scanner.state)
+        updateStateUI(self.scanner.state)
         NotificationCenter.default.addObserver(
             self,
             selector: #selector(appearanceDidChange),
@@ -111,19 +112,22 @@ final class ScannerOverlayView: NSView, AppearanceRefreshable {
     }
 
     func dismiss(animated: Bool = true) {
-        let remove = { [weak self] in
-            self?.teardown()
-            self?.removeFromSuperview()
-            self?.onDismiss?()
-        }
         guard animated else {
-            remove()
+            teardown()
+            removeFromSuperview()
+            onDismiss?()
             return
         }
         NSAnimationContext.runAnimationGroup({ context in
             context.duration = 0.15
             animator().alphaValue = 0
-        }, completionHandler: remove)
+        }, completionHandler: { [weak self] in
+            MainActor.assumeIsolated {
+                self?.teardown()
+                self?.removeFromSuperview()
+                self?.onDismiss?()
+            }
+        })
     }
 
     func refreshAppearance() {