From ea5dbb5b8ee5dd9419b4c619a45f7c6ebf29077d Mon Sep 17 00:00:00 2001 From: Jason McGhee Date: Fri, 29 Dec 2023 16:36:13 -0800 Subject: [PATCH] [rem-21]: Add option to disable cmd-scroll --- rem/SettingsManager.swift | 5 ++++- rem/TimelineView.swift | 13 +++++++++++-- rem/remApp.swift | 3 ++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/rem/SettingsManager.swift b/rem/SettingsManager.swift index 71d11f8..60abf7b 100644 --- a/rem/SettingsManager.swift +++ b/rem/SettingsManager.swift @@ -11,6 +11,7 @@ import SwiftUI // The settings structure struct AppSettings: Codable { var saveEverythingCopiedToClipboard: Bool + var enableCmdScrollShortcut: Bool } // The settings manager handles saving and loading the settings @@ -26,7 +27,7 @@ class SettingsManager: ObservableObject { self.settings = decodedSettings } else { // Default settings - self.settings = AppSettings(saveEverythingCopiedToClipboard: false) + self.settings = AppSettings(saveEverythingCopiedToClipboard: false, enableCmdScrollShortcut: true) } } @@ -48,6 +49,8 @@ struct SettingsView: View { Form { Toggle("Remember everything copied to clipboard", isOn: $settingsManager.settings.saveEverythingCopiedToClipboard) .onChange(of: settingsManager.settings.saveEverythingCopiedToClipboard) { settingsManager.saveSettings() } + Toggle("Allow opening / closing timeline with CMD + Scroll", isOn: $settingsManager.settings.enableCmdScrollShortcut) + .onChange(of: settingsManager.settings.enableCmdScrollShortcut) { settingsManager.saveSettings() } } } .padding() diff --git a/rem/TimelineView.swift b/rem/TimelineView.swift index a09b56a..4fc74af 100644 --- a/rem/TimelineView.swift +++ b/rem/TimelineView.swift @@ -14,12 +14,14 @@ struct TimelineView: View { let overlayView = ImageAnalysisOverlayView() private let imageAnalyzer = ImageAnalyzer() + var settingsManager: SettingsManager var onClose: () -> Void // Closure to handle thumbnail click private var fps: Int32 = 25 - init(viewModel: TimelineViewModel, onClose: @escaping () -> Void) { + init(viewModel: TimelineViewModel, settingsManager: SettingsManager, onClose: @escaping () -> Void) { self.viewModel = viewModel + self.settingsManager = settingsManager self.onClose = onClose _frame = State(initialValue: NSScreen.main?.visibleFrame ?? NSRect.zero) _customHostingView = State(initialValue: nil) @@ -30,7 +32,7 @@ struct TimelineView: View { let index = viewModel.currentFrameIndex if let image = DatabaseManager.shared.getImage(index: index) { let nsImage = NSImage(cgImage: image, size: NSSize(width: image.width, height: image.width)) - CustomHostingControllerRepresentable(onClose: onClose, image: nsImage, analysis: $imageAnalysis, frame: frame) + CustomHostingControllerRepresentable(settingsManager: settingsManager, onClose: onClose, image: nsImage, analysis: $imageAnalysis, frame: frame) .frame(width: frame.width, height: frame.height) .ignoresSafeArea(.all) .onChange(of: viewModel.currentFrameIndex) { @@ -169,6 +171,7 @@ class CustomHostingView: NSHostingView { } struct CustomHostingControllerRepresentable: NSViewControllerRepresentable { + var settingsManager: SettingsManager var onClose: () -> Void // Closure to handle thumbnail click var image: NSImage @Binding var analysis: ImageAnalysis? @@ -177,6 +180,7 @@ struct CustomHostingControllerRepresentable: NSViewControllerRepresentable { func makeNSViewController(context: Context) -> CustomHostingViewController { let viewController = CustomHostingViewController() viewController.onClose = onClose + viewController.settingsManager = settingsManager viewController.updateImage(image, frame: frame) return viewController } @@ -185,10 +189,12 @@ struct CustomHostingControllerRepresentable: NSViewControllerRepresentable { nsViewController.updateImage(image, frame: frame) nsViewController.updateAnalysis(analysis) nsViewController.onClose = onClose + nsViewController.settingsManager = settingsManager } } class CustomHostingViewController: NSViewController { + var settingsManager: SettingsManager? var onClose: (() -> Void)? // Closure to handle thumbnail click var customHostingView: CustomHostingView? var interceptingView: CustomInterceptingView? @@ -200,6 +206,7 @@ class CustomHostingViewController: NSViewController { override func loadView() { let _interceptingView = CustomInterceptingView() _interceptingView.onClose = onClose + _interceptingView.settingsManager = settingsManager self.view = _interceptingView // Basic NSView as a container if customHostingView == nil { customHostingView = CustomHostingView(image: NSImage(), frame: self.view.bounds) @@ -227,6 +234,7 @@ class CustomHostingViewController: NSViewController { } class CustomInterceptingView: NSView { + var settingsManager: SettingsManager? var onClose: (() -> Void)? // Closure to handle thumbnail click weak var customHostingView: CustomHostingView? @@ -258,6 +266,7 @@ class CustomInterceptingView: NSView { } override func scrollWheel(with event: NSEvent) { + guard settingsManager?.settings.enableCmdScrollShortcut ?? false else { return } if event.modifierFlags.contains(.command) && event.scrollingDeltaY > 0 { self.exit() } diff --git a/rem/remApp.swift b/rem/remApp.swift index 2b4680e..c1f581e 100644 --- a/rem/remApp.swift +++ b/rem/remApp.swift @@ -239,6 +239,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { } private func handleGlobalScrollEvent(_ event: NSEvent) { + guard settingsManager.settings.enableCmdScrollShortcut else { return} guard event.modifierFlags.contains(.command) else { return } if event.scrollingDeltaY < 0 && !self.isTimelineOpen() { // Check if scroll up @@ -579,7 +580,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { timelineViewWindow?.collectionBehavior = [.fullScreenAuxiliary, .canJoinAllSpaces, .participatesInCycle] timelineViewWindow?.ignoresMouseEvents = false - timelineView = TimelineView(viewModel: TimelineViewModel(), onClose: { + timelineView = TimelineView(viewModel: TimelineViewModel(), settingsManager: settingsManager, onClose: { DispatchQueue.main.async { [weak self] in self?.closeTimelineView() }