소스 검색

Fix clicks on the print contacts overlay reaching home page cards.

Hide underlying content while the overlay is open and block hit-testing so feature cards underneath no longer activate.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 1 개월 전
부모
커밋
bae0ac0278
2개의 변경된 파일44개의 추가작업 그리고 12개의 파일을 삭제
  1. 19 12
      smart_printer/PrintContactsView.swift
  2. 25 0
      smart_printer/ViewController.swift

+ 19 - 12
smart_printer/PrintContactsView.swift

@@ -165,6 +165,8 @@ enum PrintContactsService {
 final class PrintContactsOverlayView: NSView, AppearanceRefreshable {
     var onDismiss: (() -> Void)?
 
+    override var mouseDownCanMoveWindow: Bool { false }
+
     private let backButton = PrintContactsToolbarButton(symbolName: "chevron.left", accessibilityLabel: "Back")
     private let sortButton = PrintContactsSortButton()
     private let searchContainer = NSView()
@@ -229,22 +231,27 @@ final class PrintContactsOverlayView: NSView, AppearanceRefreshable {
     }
 
     func present(in parent: NSView) {
-        guard superview == nil else { return }
-        parent.addSubview(self)
-        NSLayoutConstraint.activate([
-            leadingAnchor.constraint(equalTo: parent.leadingAnchor),
-            trailingAnchor.constraint(equalTo: parent.trailingAnchor),
-            topAnchor.constraint(equalTo: parent.topAnchor),
-            bottomAnchor.constraint(equalTo: parent.bottomAnchor),
-        ])
-        alphaValue = 0
-        NSAnimationContext.runAnimationGroup { context in
-            context.duration = 0.2
-            animator().alphaValue = 1
+        if superview == nil {
+            parent.addSubview(self)
+            NSLayoutConstraint.activate([
+                leadingAnchor.constraint(equalTo: parent.leadingAnchor),
+                trailingAnchor.constraint(equalTo: parent.trailingAnchor),
+                topAnchor.constraint(equalTo: parent.topAnchor),
+                bottomAnchor.constraint(equalTo: parent.bottomAnchor),
+            ])
+            alphaValue = 1
+        } else {
+            parent.addSubview(self, positioned: .above, relativeTo: nil)
         }
         window?.makeFirstResponder(searchField)
     }
 
+    override func hitTest(_ point: NSPoint) -> NSView? {
+        let hit = super.hitTest(point)
+        if hit != nil { return hit }
+        return bounds.contains(point) ? self : nil
+    }
+
     func dismiss(animated: Bool = true) {
         let remove = { [weak self] in
             self?.removeFromSuperview()

+ 25 - 0
smart_printer/ViewController.swift

@@ -167,12 +167,18 @@ class ViewController: NSViewController {
         scanFileOverlay?.dismiss(animated: false)
         dismissScannerOverlay()
 
+        contentContainer.isHidden = true
+
         if let overlay = printContactsOverlay {
             overlay.present(in: mainContentView)
             return
         }
 
         let overlay = PrintContactsOverlayView()
+        overlay.onDismiss = { [weak self] in
+            self?.printContactsOverlay = nil
+            self?.restoreContentAfterOverlay()
+        }
         printContactsOverlay = overlay
         overlay.present(in: mainContentView)
     }
@@ -362,8 +368,27 @@ class ViewController: NSViewController {
         dismissScannerOverlay()
     }
 
+    private func hasActiveFeatureOverlay() -> Bool {
+        [
+            photoPreviewOverlay,
+            filePreviewOverlay,
+            printTextOverlay,
+            printContactsOverlay,
+            drawPrintOverlay,
+            ocrFileOverlay,
+            scanFileOverlay,
+            scannerOverlay,
+        ].contains { $0?.superview != nil }
+    }
+
+    private func restoreContentAfterOverlay() {
+        guard !hasActiveFeatureOverlay() else { return }
+        contentContainer.isHidden = false
+    }
+
     private func showDestination(_ destination: SidebarDestination) {
         dismissFeatureOverlays()
+        contentContainer.isHidden = false
 
         homeContentView.isHidden = destination != .home
         scanContentView.isHidden = destination != .scan