|
@@ -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() {
|