diff --git a/MTMR.xcodeproj/project.pbxproj b/MTMR.xcodeproj/project.pbxproj index 4251a02..8830654 100644 --- a/MTMR.xcodeproj/project.pbxproj +++ b/MTMR.xcodeproj/project.pbxproj @@ -61,6 +61,7 @@ B0B17439207D6B590004B740 /* Vox.nowPlaying.scpt in Resources */ = {isa = PBXBuildFile; fileRef = B0B1742F207D6B590004B740 /* Vox.nowPlaying.scpt */; }; B0B1743A207D6B590004B740 /* iTunes.nowPlaying.scpt in Resources */ = {isa = PBXBuildFile; fileRef = B0B17430207D6B590004B740 /* iTunes.nowPlaying.scpt */; }; B0F3112520C9E35F0076BB88 /* SupportNSTouchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0F3112420C9E35F0076BB88 /* SupportNSTouchBar.swift */; }; + B0F54A7A2295AC7D00B4C509 /* DarkModeBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0F54A792295AC7D00B4C509 /* DarkModeBarItem.swift */; }; B0F8771A207AC1EA00D6E430 /* TouchBarSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = B0F87719207AC1EA00D6E430 /* TouchBarSupport.m */; }; /* End PBXBuildFile section */ @@ -142,6 +143,7 @@ B0B1742F207D6B590004B740 /* Vox.nowPlaying.scpt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Vox.nowPlaying.scpt; sourceTree = ""; }; B0B17430207D6B590004B740 /* iTunes.nowPlaying.scpt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = iTunes.nowPlaying.scpt; sourceTree = ""; }; B0F3112420C9E35F0076BB88 /* SupportNSTouchBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SupportNSTouchBar.swift; sourceTree = ""; }; + B0F54A792295AC7D00B4C509 /* DarkModeBarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DarkModeBarItem.swift; sourceTree = ""; }; B0F87719207AC1EA00D6E430 /* TouchBarSupport.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TouchBarSupport.m; sourceTree = ""; }; B0F8771B207AC92700D6E430 /* TouchBarSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TouchBarSupport.h; sourceTree = ""; }; /* End PBXFileReference section */ @@ -293,6 +295,7 @@ 6027D1B82080E52A004FFDC7 /* VolumeViewController.swift */, 607EEA4A2087835F009DA5F0 /* WeatherBarItem.swift */, B08126F0217BE19000A98970 /* WidgetProtocol.swift */, + B0F54A792295AC7D00B4C509 /* DarkModeBarItem.swift */, ); path = Widgets; sourceTree = ""; @@ -446,6 +449,7 @@ B0008E552080286C003AD4DD /* SupportHelpers.swift in Sources */, 6042B6A72083E03A00C525C8 /* AppScrubberTouchBarItem.swift in Sources */, B082B253205C7D8000BC04DC /* AppDelegate.swift in Sources */, + B0F54A7A2295AC7D00B4C509 /* DarkModeBarItem.swift in Sources */, B08126EF217BD0B900A98970 /* PomodoroBarItem.swift in Sources */, B081732C213739FE005D4908 /* DnDBarItem.swift in Sources */, 60C44AFD20A373A100C0EC91 /* MusicBarItem.swift in Sources */, diff --git a/MTMR/Assets.xcassets/dark-mode-off.imageset/Contents.json b/MTMR/Assets.xcassets/dark-mode-off.imageset/Contents.json new file mode 100644 index 0000000..f185c89 --- /dev/null +++ b/MTMR/Assets.xcassets/dark-mode-off.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "sun-icon-256.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/MTMR/Assets.xcassets/dark-mode-off.imageset/sun-icon-256.png b/MTMR/Assets.xcassets/dark-mode-off.imageset/sun-icon-256.png new file mode 100644 index 0000000..ddec2cd Binary files /dev/null and b/MTMR/Assets.xcassets/dark-mode-off.imageset/sun-icon-256.png differ diff --git a/MTMR/Assets.xcassets/dark-mode-on.imageset/39857.png b/MTMR/Assets.xcassets/dark-mode-on.imageset/39857.png new file mode 100644 index 0000000..4c127cc Binary files /dev/null and b/MTMR/Assets.xcassets/dark-mode-on.imageset/39857.png differ diff --git a/MTMR/Assets.xcassets/dark-mode-on.imageset/Contents.json b/MTMR/Assets.xcassets/dark-mode-on.imageset/Contents.json new file mode 100644 index 0000000..2fb03c0 --- /dev/null +++ b/MTMR/Assets.xcassets/dark-mode-on.imageset/Contents.json @@ -0,0 +1,24 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "39857.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/MTMR/Info.plist b/MTMR/Info.plist index 1180dfc..0ac05db 100644 --- a/MTMR/Info.plist +++ b/MTMR/Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.20.1 + 0.21 CFBundleVersion - 185 + 207 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/MTMR/ItemsParsing.swift b/MTMR/ItemsParsing.swift index 8fa1413..fabc858 100644 --- a/MTMR/ItemsParsing.swift +++ b/MTMR/ItemsParsing.swift @@ -339,6 +339,7 @@ enum ItemType: Decodable { case dnd() case pomodoro(workTime: Double, restTime: Double) case network(flip: Bool) + case darkMode() private enum CodingKeys: String, CodingKey { case type @@ -379,6 +380,7 @@ enum ItemType: Decodable { case dnd case pomodoro case network + case darkMode } init(from decoder: Decoder) throws { @@ -447,10 +449,13 @@ enum ItemType: Decodable { let workTime = try container.decodeIfPresent(Double.self, forKey: .workTime) ?? 1500.0 let restTime = try container.decodeIfPresent(Double.self, forKey: .restTime) ?? 600.0 self = .pomodoro(workTime: workTime, restTime: restTime) - + case .network: let flip = try container.decodeIfPresent(Bool.self, forKey: .flip) ?? false self = .network(flip: flip) + + case .darkMode: + self = .darkMode() } } } diff --git a/MTMR/TouchBarController.swift b/MTMR/TouchBarController.swift index a23ebe8..eab726f 100644 --- a/MTMR/TouchBarController.swift +++ b/MTMR/TouchBarController.swift @@ -51,6 +51,8 @@ extension ItemType { return PomodoroBarItem.identifier case .network(flip: _): return NetworkBarItem.identifier + case .darkMode(items: _): + return DarkModeBarItem.identifier } } } @@ -283,6 +285,8 @@ class TouchBarController: NSObject, NSTouchBarDelegate { barItem = PomodoroBarItem(identifier: identifier, workTime: workTime, restTime: restTime) case let .network(flip: flip): barItem = NetworkBarItem(identifier: identifier, flip: flip) + case .darkMode(): + barItem = DarkModeBarItem(identifier: identifier) } if let action = self.action(forItem: item), let item = barItem as? CustomButtonTouchBarItem { diff --git a/MTMR/Widgets/DarkModeBarItem.swift b/MTMR/Widgets/DarkModeBarItem.swift new file mode 100644 index 0000000..60fecb6 --- /dev/null +++ b/MTMR/Widgets/DarkModeBarItem.swift @@ -0,0 +1,57 @@ +import Foundation + +class DarkModeBarItem: CustomButtonTouchBarItem, Widget { + static var name: String = "darkmode" + static var identifier: String = "com.toxblh.mtmr.darkmode" + + private var timer: Timer! + + init(identifier: NSTouchBarItem.Identifier) { + super.init(identifier: identifier, title: "") + isBordered = false + setWidth(value: 24) + + tapClosure = { [weak self] in self?.DarkModeToggle() } + + timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(refresh), userInfo: nil, repeats: true) + + refresh() + } + + required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func DarkModeToggle() { + DarkMode.isEnabled = !DarkMode.isEnabled + refresh() + } + + @objc func refresh() { + image = DarkMode.isEnabled ? #imageLiteral(resourceName: "dark-mode-on") : #imageLiteral(resourceName: "dark-mode-off") + } +} + + +struct DarkMode { + private static let prefix = "tell application \"System Events\" to tell appearance preferences to" + + static var isEnabled: Bool { + get { + return UserDefaults.standard.string(forKey: "AppleInterfaceStyle") == "Dark" + } + set { + toggle(force: newValue) + } + } + + static func toggle(force: Bool? = nil) { + let value = force.map(String.init) ?? "not dark mode" + runAppleScript("\(prefix) set dark mode to \(value)") + } +} + +func runAppleScript(_ source: String) -> String? { + return NSAppleScript(source: source)?.executeAndReturnError(nil).stringValue +} + diff --git a/README.md b/README.md index 43341e8..b0b10c2 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ Re-tick or check a tick for access 🍏→ System Preferences → Security and P - dock (half-long click to open app, full-long click to kill app) - nightShift - dnd (Don't disturb) +- darkMode - pomodoro - network