1
0
mirror of https://github.com/Toxblh/MTMR.git synced 2026-01-11 17:38:38 +00:00
This commit is contained in:
Toxblh 2019-01-24 00:04:14 +03:00
parent 59581ffdc8
commit acc248a579
2 changed files with 64 additions and 67 deletions

View File

@ -50,7 +50,11 @@ class AppDelegate: NSObject, NSApplicationDelegate {
return frontmostId return frontmostId
} }
if frontmostApplicationIdentifier != nil {
isBlockedApp = blacklistAppIdentifiers.index(of: frontmostApplicationIdentifier!) != nil isBlockedApp = blacklistAppIdentifiers.index(of: frontmostApplicationIdentifier!) != nil
} else {
isBlockedApp = false
}
createMenu() createMenu()
} }

View File

@ -17,7 +17,6 @@ let appSupportDirectory = NSSearchPathForDirectoriesInDomains(.applicationSuppor
let standardConfigPath = appSupportDirectory.appending("/items.json") let standardConfigPath = appSupportDirectory.appending("/items.json")
extension ItemType { extension ItemType {
var identifierBase: String { var identifierBase: String {
switch self { switch self {
case .staticButton(title: _): case .staticButton(title: _):
@ -52,7 +51,6 @@ extension ItemType {
return PomodoroBarItem.identifier return PomodoroBarItem.identifier
} }
} }
} }
extension NSTouchBarItem.Identifier { extension NSTouchBarItem.Identifier {
@ -60,7 +58,6 @@ extension NSTouchBarItem.Identifier {
} }
class TouchBarController: NSObject, NSTouchBarDelegate { class TouchBarController: NSObject, NSTouchBarDelegate {
static let shared = TouchBarController() static let shared = TouchBarController()
var touchBar: NSTouchBar! var touchBar: NSTouchBar!
@ -87,25 +84,23 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
var blacklistAppIdentifiers: [String] = [] var blacklistAppIdentifiers: [String] = []
var frontmostApplicationIdentifier: String? { var frontmostApplicationIdentifier: String? {
get {
guard let frontmostId = NSWorkspace.shared.frontmostApplication?.bundleIdentifier else { return nil } guard let frontmostId = NSWorkspace.shared.frontmostApplication?.bundleIdentifier else { return nil }
return frontmostId return frontmostId
} }
}
private override init() { private override init() {
super.init() super.init()
SupportedTypesHolder.sharedInstance.register(typename: "exitTouchbar", item: .staticButton(title: "exit"), action: .custom(closure: { [weak self] in self?.dismissTouchBar() }), longAction: .none) SupportedTypesHolder.sharedInstance.register(typename: "exitTouchbar", item: .staticButton(title: "exit"), action: .custom(closure: { [weak self] in self?.dismissTouchBar() }), longAction: .none)
SupportedTypesHolder.sharedInstance.register(typename: "close") { _ in SupportedTypesHolder.sharedInstance.register(typename: "close") { _ in
return (item: .staticButton(title: ""), action: .custom(closure: { [weak self] in (item: .staticButton(title: ""), action: .custom(closure: { [weak self] in
guard let `self` = self else { return } guard let `self` = self else { return }
self.reloadPreset(path: self.lastPresetPath) self.reloadPreset(path: self.lastPresetPath)
}), longAction: .none, parameters: [.width: .width(30), .image: .image(source: (NSImage(named: NSImage.stopProgressFreestandingTemplateName))!)]) }), longAction: .none, parameters: [.width: .width(30), .image: .image(source: (NSImage(named: NSImage.stopProgressFreestandingTemplateName))!)])
} }
if let blackListed = UserDefaults.standard.stringArray(forKey: "com.toxblh.mtmr.blackListedApps") { if let blackListed = UserDefaults.standard.stringArray(forKey: "com.toxblh.mtmr.blackListedApps") {
self.blacklistAppIdentifiers = blackListed blacklistAppIdentifiers = blackListed
} }
NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(activeApplicationChanged), name: NSWorkspace.didLaunchApplicationNotification, object: nil) NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(activeApplicationChanged), name: NSWorkspace.didLaunchApplicationNotification, object: nil)
@ -119,37 +114,37 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
if let oldBar = self.touchBar { if let oldBar = self.touchBar {
minimizeSystemModal(oldBar) minimizeSystemModal(oldBar)
} }
self.touchBar = NSTouchBar() touchBar = NSTouchBar()
self.jsonItems = newJsonItems jsonItems = newJsonItems
self.itemDefinitions = [:] itemDefinitions = [:]
self.items = [:] items = [:]
self.leftIdentifiers = [] leftIdentifiers = []
self.centerItems = [] centerItems = []
self.rightIdentifiers = [] rightIdentifiers = []
loadItemDefinitions(jsonItems: self.jsonItems) loadItemDefinitions(jsonItems: jsonItems)
createItems() createItems()
centerItems = centerIdentifiers.compactMap({ (identifier) -> NSTouchBarItem? in centerItems = centerIdentifiers.compactMap({ (identifier) -> NSTouchBarItem? in
return items[identifier] items[identifier]
}) })
self.centerScrollArea = NSTouchBarItem.Identifier("com.toxblh.mtmr.scrollArea.".appending(UUID().uuidString)) centerScrollArea = NSTouchBarItem.Identifier("com.toxblh.mtmr.scrollArea.".appending(UUID().uuidString))
self.scrollArea = ScrollViewItem(identifier: centerScrollArea, items: centerItems) scrollArea = ScrollViewItem(identifier: centerScrollArea, items: centerItems)
touchBar.delegate = self touchBar.delegate = self
touchBar.defaultItemIdentifiers = [] touchBar.defaultItemIdentifiers = []
touchBar.defaultItemIdentifiers = self.leftIdentifiers + [centerScrollArea] + self.rightIdentifiers touchBar.defaultItemIdentifiers = leftIdentifiers + [centerScrollArea] + rightIdentifiers
self.updateActiveApp() updateActiveApp()
} }
@objc func activeApplicationChanged(_ n: Notification) { @objc func activeApplicationChanged(_: Notification) {
updateActiveApp() updateActiveApp()
} }
func updateActiveApp() { func updateActiveApp() {
if self.blacklistAppIdentifiers.index(of: self.frontmostApplicationIdentifier!) != nil { if frontmostApplicationIdentifier != nil && blacklistAppIdentifiers.index(of: frontmostApplicationIdentifier!) != nil {
dismissTouchBar() dismissTouchBar()
} else { } else {
presentTouchBar() presentTouchBar()
@ -194,8 +189,8 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
} }
func createItems() { func createItems() {
for (identifier, definition) in self.itemDefinitions { for (identifier, definition) in itemDefinitions {
self.items[identifier] = self.createItem(forIdentifier: identifier, definition: definition) items[identifier] = createItem(forIdentifier: identifier, definition: definition)
} }
} }
@ -212,7 +207,7 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
} }
@objc private func presentTouchBar() { @objc private func presentTouchBar() {
if self.showControlStripState { if showControlStripState {
updateControlStripPresence() updateControlStripPresence()
presentSystemModal(touchBar, systemTrayItemIdentifier: .controlStripItem) presentSystemModal(touchBar, systemTrayItemIdentifier: .controlStripItem)
} else { } else {
@ -230,9 +225,9 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
presentTouchBar() presentTouchBar()
} }
func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItem.Identifier) -> NSTouchBarItem? { func touchBar(_: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItem.Identifier) -> NSTouchBarItem? {
if identifier == centerScrollArea { if identifier == centerScrollArea {
return self.scrollArea return scrollArea
} }
guard let item = self.items[identifier], guard let item = self.items[identifier],
@ -244,46 +239,45 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
} }
func createItem(forIdentifier identifier: NSTouchBarItem.Identifier, definition item: BarItemDefinition) -> NSTouchBarItem? { func createItem(forIdentifier identifier: NSTouchBarItem.Identifier, definition item: BarItemDefinition) -> NSTouchBarItem? {
var barItem: NSTouchBarItem! var barItem: NSTouchBarItem!
switch item.type { switch item.type {
case .staticButton(title: let title): case let .staticButton(title: title):
barItem = CustomButtonTouchBarItem(identifier: identifier, title: title) barItem = CustomButtonTouchBarItem(identifier: identifier, title: title)
case .appleScriptTitledButton(source: let source, refreshInterval: let interval): case let .appleScriptTitledButton(source: source, refreshInterval: interval):
barItem = AppleScriptTouchBarItem(identifier: identifier, source: source, interval: interval) barItem = AppleScriptTouchBarItem(identifier: identifier, source: source, interval: interval)
case .timeButton(formatTemplate: let template, timeZone: let timeZone): case let .timeButton(formatTemplate: template, timeZone: timeZone):
barItem = TimeTouchBarItem(identifier: identifier, formatTemplate: template, timeZone: timeZone) barItem = TimeTouchBarItem(identifier: identifier, formatTemplate: template, timeZone: timeZone)
case .battery(): case .battery():
barItem = BatteryBarItem(identifier: identifier) barItem = BatteryBarItem(identifier: identifier)
case .dock: case .dock:
barItem = AppScrubberTouchBarItem(identifier: identifier) barItem = AppScrubberTouchBarItem(identifier: identifier)
case .volume: case .volume:
if case .image(let source)? = item.additionalParameters[.image] { if case let .image(source)? = item.additionalParameters[.image] {
barItem = VolumeViewController(identifier: identifier, image: source.image) barItem = VolumeViewController(identifier: identifier, image: source.image)
} else { } else {
barItem = VolumeViewController(identifier: identifier) barItem = VolumeViewController(identifier: identifier)
} }
case .brightness(refreshInterval: let interval): case let .brightness(refreshInterval: interval):
if case .image(let source)? = item.additionalParameters[.image] { if case let .image(source)? = item.additionalParameters[.image] {
barItem = BrightnessViewController(identifier: identifier, refreshInterval: interval, image: source.image) barItem = BrightnessViewController(identifier: identifier, refreshInterval: interval, image: source.image)
} else { } else {
barItem = BrightnessViewController(identifier: identifier, refreshInterval: interval) barItem = BrightnessViewController(identifier: identifier, refreshInterval: interval)
} }
case .weather(interval: let interval, units: let units, api_key: let api_key, icon_type: let icon_type): case let .weather(interval: interval, units: units, api_key: api_key, icon_type: icon_type):
barItem = WeatherBarItem(identifier: identifier, interval: interval, units: units, api_key: api_key, icon_type: icon_type) barItem = WeatherBarItem(identifier: identifier, interval: interval, units: units, api_key: api_key, icon_type: icon_type)
case .currency(interval: let interval, from: let from, to: let to, full: let full): case let .currency(interval: interval, from: from, to: to, full: full):
barItem = CurrencyBarItem(identifier: identifier, interval: interval, from: from, to: to, full: full) barItem = CurrencyBarItem(identifier: identifier, interval: interval, from: from, to: to, full: full)
case .inputsource(): case .inputsource():
barItem = InputSourceBarItem(identifier: identifier) barItem = InputSourceBarItem(identifier: identifier)
case .music(interval: let interval): case let .music(interval: interval):
barItem = MusicBarItem(identifier: identifier, interval: interval) barItem = MusicBarItem(identifier: identifier, interval: interval)
case .groupBar(items: let items): case let .groupBar(items: items):
barItem = GroupBarItem(identifier: identifier, items: items) barItem = GroupBarItem(identifier: identifier, items: items)
case .nightShift(): case .nightShift():
barItem = NightShiftBarItem(identifier: identifier) barItem = NightShiftBarItem(identifier: identifier)
case .dnd(): case .dnd():
barItem = DnDBarItem(identifier: identifier) barItem = DnDBarItem(identifier: identifier)
case .pomodoro(workTime: let workTime, restTime: let restTime): case let .pomodoro(workTime: workTime, restTime: restTime):
barItem = PomodoroBarItem(identifier: identifier, workTime: workTime, restTime: restTime) barItem = PomodoroBarItem(identifier: identifier, workTime: workTime, restTime: restTime)
} }
@ -293,19 +287,19 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
if let longAction = self.longAction(forItem: item), let item = barItem as? CustomButtonTouchBarItem { if let longAction = self.longAction(forItem: item), let item = barItem as? CustomButtonTouchBarItem {
item.longTapClosure = longAction item.longTapClosure = longAction
} }
if case .bordered(let bordered)? = item.additionalParameters[.bordered], let item = barItem as? CustomButtonTouchBarItem { if case let .bordered(bordered)? = item.additionalParameters[.bordered], let item = barItem as? CustomButtonTouchBarItem {
item.isBordered = bordered item.isBordered = bordered
} }
if case .background(let color)? = item.additionalParameters[.background], let item = barItem as? CustomButtonTouchBarItem { if case let .background(color)? = item.additionalParameters[.background], let item = barItem as? CustomButtonTouchBarItem {
item.backgroundColor = color item.backgroundColor = color
} }
if case .width(let value)? = item.additionalParameters[.width], let widthBarItem = barItem as? CanSetWidth { if case let .width(value)? = item.additionalParameters[.width], let widthBarItem = barItem as? CanSetWidth {
widthBarItem.setWidth(value: value) widthBarItem.setWidth(value: value)
} }
if case .image(let source)? = item.additionalParameters[.image], let item = barItem as? CustomButtonTouchBarItem { if case let .image(source)? = item.additionalParameters[.image], let item = barItem as? CustomButtonTouchBarItem {
item.image = source.image item.image = source.image
} }
if case .title(let value)? = item.additionalParameters[.title] { if case let .title(value)? = item.additionalParameters[.title] {
if let item = barItem as? GroupBarItem { if let item = barItem as? GroupBarItem {
item.collapsedRepresentationLabel = value item.collapsedRepresentationLabel = value
} else if let item = barItem as? CustomButtonTouchBarItem { } else if let item = barItem as? CustomButtonTouchBarItem {
@ -315,13 +309,13 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
return barItem return barItem
} }
func action(forItem item: BarItemDefinition) -> (()->())? { func action(forItem item: BarItemDefinition) -> (() -> Void)? {
switch item.action { switch item.action {
case .hidKey(keycode: let keycode): case let .hidKey(keycode: keycode):
return { HIDPostAuxKey(keycode) } return { HIDPostAuxKey(keycode) }
case .keyPress(keycode: let keycode): case let .keyPress(keycode: keycode):
return { GenericKeyPress(keyCode: CGKeyCode(keycode)).send() } return { GenericKeyPress(keyCode: CGKeyCode(keycode)).send() }
case .appleScript(source: let source): case let .appleScript(source: source):
guard let appleScript = source.appleScript else { guard let appleScript = source.appleScript else {
print("cannot create apple script for item \(item)") print("cannot create apple script for item \(item)")
return {} return {}
@ -335,14 +329,14 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
} }
} }
} }
case .shellScript(executable: let executable, parameters: let parameters): case let .shellScript(executable: executable, parameters: parameters):
return { return {
let task = Process() let task = Process()
task.launchPath = executable task.launchPath = executable
task.arguments = parameters task.arguments = parameters
task.launch() task.launch()
} }
case .openUrl(url: let url): case let .openUrl(url: url):
return { return {
if let url = URL(string: url), NSWorkspace.shared.open(url) { if let url = URL(string: url), NSWorkspace.shared.open(url) {
#if DEBUG #if DEBUG
@ -352,21 +346,20 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
print("error", url) print("error", url)
} }
} }
case .custom(closure: let closure): case let .custom(closure: closure):
return closure return closure
case .none: case .none:
return nil return nil
} }
} }
func longAction(forItem item: BarItemDefinition) -> (() -> Void)? {
func longAction(forItem item: BarItemDefinition) -> (()->())? {
switch item.longAction { switch item.longAction {
case .hidKey(keycode: let keycode): case let .hidKey(keycode: keycode):
return { HIDPostAuxKey(keycode) } return { HIDPostAuxKey(keycode) }
case .keyPress(keycode: let keycode): case let .keyPress(keycode: keycode):
return { GenericKeyPress(keyCode: CGKeyCode(keycode)).send() } return { GenericKeyPress(keyCode: CGKeyCode(keycode)).send() }
case .appleScript(source: let source): case let .appleScript(source: source):
guard let appleScript = source.appleScript else { guard let appleScript = source.appleScript else {
print("cannot create apple script for item \(item)") print("cannot create apple script for item \(item)")
return {} return {}
@ -378,14 +371,14 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
print("error \(error) when handling \(item) ") print("error \(error) when handling \(item) ")
} }
} }
case .shellScript(executable: let executable, parameters: let parameters): case let .shellScript(executable: executable, parameters: parameters):
return { return {
let task = Process() let task = Process()
task.launchPath = executable task.launchPath = executable
task.arguments = parameters task.arguments = parameters
task.launch() task.launch()
} }
case .openUrl(url: let url): case let .openUrl(url: url):
return { return {
if let url = URL(string: url), NSWorkspace.shared.open(url) { if let url = URL(string: url), NSWorkspace.shared.open(url) {
#if DEBUG #if DEBUG
@ -395,7 +388,7 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
print("error", url) print("error", url)
} }
} }
case .custom(closure: let closure): case let .custom(closure: closure):
return closure return closure
case .none: case .none:
return nil return nil
@ -409,13 +402,13 @@ protocol CanSetWidth {
extension NSCustomTouchBarItem: CanSetWidth { extension NSCustomTouchBarItem: CanSetWidth {
func setWidth(value: CGFloat) { func setWidth(value: CGFloat) {
self.view.widthAnchor.constraint(equalToConstant: value).isActive = true view.widthAnchor.constraint(equalToConstant: value).isActive = true
} }
} }
extension BarItemDefinition { extension BarItemDefinition {
var align: Align { var align: Align {
if case .align(let result)? = self.additionalParameters[.align] { if case let .align(result)? = additionalParameters[.align] {
return result return result
} }
return .center return .center