diff --git a/DockPhobia.xcodeproj/project.pbxproj b/DockPhobia.xcodeproj/project.pbxproj index 3dcc331..f0de0a8 100644 --- a/DockPhobia.xcodeproj/project.pbxproj +++ b/DockPhobia.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ A966B4F42DE0842500C721A5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A966B4EE2DE0842400C721A5 /* AppDelegate.swift */; }; A966B4F52DE0842500C721A5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A966B4EF2DE0842400C721A5 /* Assets.xcassets */; }; A966B4F82DE0852900C721A5 /* MouseTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = A966B4F72DE0852900C721A5 /* MouseTracker.swift */; }; + A98C20C62DE614180008D61C /* DPSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98C20C52DE614180008D61C /* DPSettings.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -21,6 +22,7 @@ A966B4F02DE0842400C721A5 /* DockPhobia.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DockPhobia.entitlements; sourceTree = ""; }; A966B4F72DE0852900C721A5 /* MouseTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MouseTracker.swift; sourceTree = ""; }; A97798072DE485F200B6CB13 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; + A98C20C52DE614180008D61C /* DPSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DPSettings.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -72,6 +74,7 @@ children = ( A966B4EE2DE0842400C721A5 /* AppDelegate.swift */, A966B4F72DE0852900C721A5 /* MouseTracker.swift */, + A98C20C52DE614180008D61C /* DPSettings.swift */, A94BEC102DE23ECE00D4811D /* Views */, A94BEC0A2DE21F8100D4811D /* Resources */, A966B4F02DE0842400C721A5 /* DockPhobia.entitlements */, @@ -152,6 +155,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A98C20C62DE614180008D61C /* DPSettings.swift in Sources */, A966B4F82DE0852900C721A5 /* MouseTracker.swift in Sources */, A966B4F42DE0842500C721A5 /* AppDelegate.swift in Sources */, ); diff --git a/DockPhobia/.DS_Store b/DockPhobia/.DS_Store index e238db7..6fce90f 100644 Binary files a/DockPhobia/.DS_Store and b/DockPhobia/.DS_Store differ diff --git a/DockPhobia/AppDelegate.swift b/DockPhobia/AppDelegate.swift index 03df75e..1a5b378 100644 --- a/DockPhobia/AppDelegate.swift +++ b/DockPhobia/AppDelegate.swift @@ -12,25 +12,31 @@ class AppDelegate: NSObject, NSApplicationDelegate { public var statusItem: NSStatusItem! - var mouseTracker = MouseTracker() + var settings = DPSettingsModel() + var mouseTracker: MouseTracker + override init() { + self.mouseTracker = MouseTracker(settings: settings) + super.init() + } func applicationDidFinishLaunching(_ aNotification: Notification) { statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) if let button = statusItem.button { button.image = NSImage(named: "cursor.slash") } - setupMenus() + refreshMenus() } func applicationWillTerminate(_ aNotification: Notification) { - // Insert code here to tear down your application + settings.saveSettings() } func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { return true } + //MARK: menu bar stuff func setupMenus() { let menu = NSMenu() let start = NSMenuItem(title: describeStartButton(), action: #selector(didTapStart), keyEquivalent: "") @@ -43,6 +49,22 @@ class AppDelegate: NSObject, NSApplicationDelegate { ) menu.addItem(screen) + let dockMoves = NSMenuItem( + title: "Moved the Dock \(settings.settings.dockMoves) time\(settings.settings.dockMoves.plural)", + action: nil, + keyEquivalent: "" + ) + menu.addItem(dockMoves) + + menu.addItem(NSMenuItem.separator()) + + let checkfullscreenButton = NSMenuItem( + title: "Smaller deathzone in fullscreen", + action: #selector(checkFullscreenToggle), + keyEquivalent: "" + ) + checkfullscreenButton.state = NSControl.StateValue(rawValue: settings.settings.checkFullscreen ? 1 : 0) + menu.addItem(checkfullscreenButton) menu.addItem(NSMenuItem.separator()) menu.addItem( @@ -73,7 +95,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { menu.addItem(quit) statusItem.menu = menu } - func changeMenuIcon(running: Bool) { guard let button = statusItem.button else { return } switch running { @@ -83,7 +104,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { button.image = NSImage(named: "cursor.slash") } } - @objc func didTapStart() { if mouseTracker.running { mouseTracker.stop() @@ -92,17 +112,18 @@ class AppDelegate: NSObject, NSApplicationDelegate { mouseTracker.start() changeMenuIcon(running: true) } - setupMenus() + refreshMenus() } - @objc func quit() { NSApplication.shared.terminate(self) } - @objc func moveDockObjcLeft() { mouseTracker.moveDock(.left) } @objc func moveDockObjcRight() { mouseTracker.moveDock(.right) } @objc func moveDockObjcBottom() { mouseTracker.moveDock(.bottom) } - + @objc func checkFullscreenToggle() { + settings.settings.checkFullscreen.toggle() + refreshMenus() + } func describeStartButton() -> String { if mouseTracker.running { return "Stop tracking" @@ -111,3 +132,14 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } } + +func refreshMenus() { + guard let delegate = NSApp.delegate as? AppDelegate else { return } + delegate.setupMenus() +} + +extension Numeric { + var plural: String { + return self == 1 ? "" : "s" + } +} diff --git a/DockPhobia/DPSettings.swift b/DockPhobia/DPSettings.swift new file mode 100644 index 0000000..8f5afe4 --- /dev/null +++ b/DockPhobia/DPSettings.swift @@ -0,0 +1,40 @@ +// +// Persistence.swift +// DockPhobia +// +// Created by neon443 on 27/05/2025. +// + +import Foundation +import AppKit + +struct DPSettings: Codable { + var dockMoves: Int = 0 + var checkFullscreen: Bool = false +} + +class DPSettingsModel { + var settings = DPSettings() + + let userDefaults = UserDefaults.standard + + init() { + guard let data = userDefaults.data(forKey: "settings") else { return } + + let decoder = JSONDecoder() + + guard let decoded = try? decoder.decode(DPSettings.self, from: data) else { + return + } + self.settings = decoded + refreshMenus() + } + + func saveSettings() { + let encoder = JSONEncoder() + guard let encoded = try? encoder.encode(settings) else { + return + } + userDefaults.set(encoded, forKey: "settings") + } +} diff --git a/DockPhobia/MouseTracker.swift b/DockPhobia/MouseTracker.swift index ac3e145..a0a7f57 100644 --- a/DockPhobia/MouseTracker.swift +++ b/DockPhobia/MouseTracker.swift @@ -77,7 +77,9 @@ class MouseTracker { var dockHeight: CGFloat = 0 - init() { + var settings: DPSettingsModel + + init(settings: DPSettingsModel) { print(DockSide()) if let screen = NSScreen.main { let rect = screen.frame @@ -89,6 +91,9 @@ class MouseTracker { } else { fatalError("no screen wtf???") } + + self.settings = settings + self.currentDockSide = .left moveDock(.bottom) getDockSize() @@ -98,6 +103,11 @@ class MouseTracker { var location = NSEvent.mouseLocation location.y = screen.height - location.y + guard settings.settings.checkFullscreen else { + handleDockValue(dockIsAt: currentDockSide, location: location) + return + } + guard isFrontmostFullscreen() else { if location.x < 1 || location.x < screen.width-1 || @@ -106,8 +116,6 @@ class MouseTracker { } return } - - handleDockValue(dockIsAt: currentDockSide, location: location) } func handleDockValue(dockIsAt: DockSide, location: NSPoint) { @@ -180,6 +188,8 @@ class MouseTracker { applescript(scriptMove) // applescript(scriptShow) currentDockSide = toSide + settings.settings.dockMoves += 1 + refreshMenus() } func getDockSize() {