diff --git a/MTMR.xcodeproj/project.pbxproj b/MTMR.xcodeproj/project.pbxproj index 304bc2d..fac7ea6 100644 --- a/MTMR.xcodeproj/project.pbxproj +++ b/MTMR.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 368EDDE720812A1D00E10953 /* ScrollViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 368EDDE620812A1D00E10953 /* ScrollViewItem.swift */; }; 36C2ECD7207B6DAE003CDA33 /* TimeTouchBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C2ECD6207B6DAE003CDA33 /* TimeTouchBarItem.swift */; }; 36C2ECD9207B74B4003CDA33 /* AppleScriptTouchBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C2ECD8207B74B4003CDA33 /* AppleScriptTouchBarItem.swift */; }; 36C2ECDB207C3FE7003CDA33 /* ItemsParsing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C2ECDA207C3FE7003CDA33 /* ItemsParsing.swift */; }; @@ -49,6 +50,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 368EDDE620812A1D00E10953 /* ScrollViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollViewItem.swift; sourceTree = ""; }; 36BDC22F207CDA8600FCFEBE /* TECHNICAL_DEBT.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = TECHNICAL_DEBT.md; sourceTree = ""; }; 36C2ECD2207B3B1D003CDA33 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 36C2ECD6207B6DAE003CDA33 /* TimeTouchBarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeTouchBarItem.swift; sourceTree = ""; }; @@ -160,6 +162,7 @@ 36C2ECDF207CB1B0003CDA33 /* defaultPreset.json */, 6027D1B72080E52A004FFDC7 /* BrightnessViewController.swift */, 6027D1B82080E52A004FFDC7 /* VolumeViewController.swift */, + 368EDDE620812A1D00E10953 /* ScrollViewItem.swift */, ); path = MTMR; sourceTree = ""; @@ -329,6 +332,7 @@ B0A7E9AA205D6AA400EEF070 /* KeyPress.swift in Sources */, 36C2ECD7207B6DAE003CDA33 /* TimeTouchBarItem.swift in Sources */, 6027D1B92080E52A004FFDC7 /* BrightnessViewController.swift in Sources */, + 368EDDE720812A1D00E10953 /* ScrollViewItem.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MTMR/ItemsParsing.swift b/MTMR/ItemsParsing.swift index f1c5580..e1d7fe8 100644 --- a/MTMR/ItemsParsing.swift +++ b/MTMR/ItemsParsing.swift @@ -12,13 +12,13 @@ extension Data { struct BarItemDefinition: Decodable { let type: ItemType let action: ActionType - let additionalParameters: [GeneralParameter] + let additionalParameters: [GeneralParameters.CodingKeys: GeneralParameter] private enum CodingKeys: String, CodingKey { case type } - init(type: ItemType, action: ActionType, additionalParameters: [GeneralParameter]) { + init(type: ItemType, action: ActionType, additionalParameters: [GeneralParameters.CodingKeys:GeneralParameter]) { self.type = type self.action = action self.additionalParameters = additionalParameters @@ -28,10 +28,11 @@ struct BarItemDefinition: Decodable { let container = try decoder.container(keyedBy: CodingKeys.self) let type = try container.decode(String.self, forKey: .type) let parametersDecoder = SupportedTypesHolder.sharedInstance.lookup(by: type) - let additionalParameters = try GeneralParameters(from: decoder).parameters + var additionalParameters = try GeneralParameters(from: decoder).parameters if let result = try? parametersDecoder(decoder), case let (itemType, action, parameters) = result { - self.init(type: itemType, action: action, additionalParameters: additionalParameters + parameters) + parameters.forEach { additionalParameters[$0] = $1 } + self.init(type: itemType, action: action, additionalParameters: additionalParameters) } else { self.init(type: .staticButton(title: "unknown"), action: .none, additionalParameters: additionalParameters) } @@ -40,36 +41,36 @@ struct BarItemDefinition: Decodable { } class SupportedTypesHolder { - typealias ParametersDecoder = (Decoder) throws ->(item: ItemType, action: ActionType, parameters: [GeneralParameter]) + typealias ParametersDecoder = (Decoder) throws ->(item: ItemType, action: ActionType, parameters: [GeneralParameters.CodingKeys: GeneralParameter]) private var supportedTypes: [String: ParametersDecoder] = [ - "escape": { _ in return (item: .staticButton(title: "esc"), action: .keyPress(keycode: 53), parameters: []) }, + "escape": { _ in return (item: .staticButton(title: "esc"), action: .keyPress(keycode: 53), parameters: [.align: .align(.left)]) }, "brightnessUp": { _ in let imageParameter = GeneralParameter.image(source: #imageLiteral(resourceName: "brightnessUp")) - return (item: .staticButton(title: ""), action: .keyPress(keycode: 113), parameters: [imageParameter]) + return (item: .staticButton(title: ""), action: .keyPress(keycode: 113), parameters: [.image: imageParameter]) }, "brightnessDown": { _ in let imageParameter = GeneralParameter.image(source: #imageLiteral(resourceName: "brightnessDown")) - return (item: .staticButton(title: ""), action: .keyPress(keycode: 107), parameters: [imageParameter]) + return (item: .staticButton(title: ""), action: .keyPress(keycode: 107), parameters: [.image: imageParameter]) }, "volumeDown": { _ in let imageParameter = GeneralParameter.image(source: NSImage(named: .touchBarVolumeDownTemplate)!) - return (item: .staticButton(title: ""), action: .hidKey(keycode: NX_KEYTYPE_SOUND_DOWN), parameters: [imageParameter]) + return (item: .staticButton(title: ""), action: .hidKey(keycode: NX_KEYTYPE_SOUND_DOWN), parameters: [.image: imageParameter]) }, "volumeUp": { _ in let imageParameter = GeneralParameter.image(source: NSImage(named: .touchBarVolumeUpTemplate)!) - return (item: .staticButton(title: ""), action: .hidKey(keycode: NX_KEYTYPE_SOUND_UP), parameters: [imageParameter]) + return (item: .staticButton(title: ""), action: .hidKey(keycode: NX_KEYTYPE_SOUND_UP), parameters: [.image: imageParameter]) }, "previous": { _ in let imageParameter = GeneralParameter.image(source: NSImage(named: .touchBarRewindTemplate)!) - return (item: .staticButton(title: ""), action: .hidKey(keycode: NX_KEYTYPE_PREVIOUS), parameters: [imageParameter]) + return (item: .staticButton(title: ""), action: .hidKey(keycode: NX_KEYTYPE_PREVIOUS), parameters: [.image: imageParameter]) }, "play": { _ in let imageParameter = GeneralParameter.image(source: NSImage(named: .touchBarPlayPauseTemplate)!) - return (item: .staticButton(title: ""), action: .hidKey(keycode: NX_KEYTYPE_PLAY), parameters: [imageParameter]) + return (item: .staticButton(title: ""), action: .hidKey(keycode: NX_KEYTYPE_PLAY), parameters: [.image: imageParameter]) }, "next": { _ in let imageParameter = GeneralParameter.image(source: NSImage(named: .touchBarFastForwardTemplate)!) - return (item: .staticButton(title: ""), action: .hidKey(keycode: NX_KEYTYPE_NEXT), parameters: [imageParameter]) + return (item: .staticButton(title: ""), action: .hidKey(keycode: NX_KEYTYPE_NEXT), parameters: [.image: imageParameter]) }, "weather": { decoder in enum CodingKeys: String, CodingKey { case refreshInterval } @@ -77,13 +78,13 @@ class SupportedTypesHolder { let interval = try container.decodeIfPresent(Double.self, forKey: .refreshInterval) let scriptPath = Bundle.main.path(forResource: "Weather", ofType: "scpt")! let item = ItemType.appleScriptTitledButton(source: Source(filePath: scriptPath), refreshInterval: interval ?? 1800.0) - return (item: item, action: .none, parameters: []) + return (item: item, action: .none, parameters: [:]) }, "brightness": { decoder in enum CodingKeys: String, CodingKey { case refreshInterval } let container = try decoder.container(keyedBy: CodingKeys.self) let interval = try container.decodeIfPresent(Double.self, forKey: .refreshInterval) - return (item: .brightness(refreshInterval: interval ?? 0.5), action: .none, parameters: []) + return (item: .brightness(refreshInterval: interval ?? 0.5), action: .none, parameters: [:]) }, "battery": { decoder in enum CodingKeys: String, CodingKey { case refreshInterval } @@ -91,17 +92,17 @@ class SupportedTypesHolder { let interval = try container.decodeIfPresent(Double.self, forKey: .refreshInterval) let scriptPath = Bundle.main.path(forResource: "Battery", ofType: "scpt")! let item = ItemType.appleScriptTitledButton(source: Source(filePath: scriptPath), refreshInterval: interval ?? 1800.0) - return (item: item, action: .none, parameters: []) + return (item: item, action: .none, parameters: [:]) }, - "sleep": { _ in return (item: .staticButton(title: "☕️"), action: .shellScript(executable: "/usr/bin/pmset", parameters: ["sleepnow"]), parameters: []) }, - "displaySleep": { _ in return (item: .staticButton(title: "☕️"), action: .shellScript(executable: "/usr/bin/pmset", parameters: ["displaysleepnow"]), parameters: []) }, + "sleep": { _ in return (item: .staticButton(title: "☕️"), action: .shellScript(executable: "/usr/bin/pmset", parameters: ["sleepnow"]), parameters: [:]) }, + "displaySleep": { _ in return (item: .staticButton(title: "☕️"), action: .shellScript(executable: "/usr/bin/pmset", parameters: ["displaysleepnow"]), parameters: [:]) }, ] static let sharedInstance = SupportedTypesHolder() func lookup(by type: String) -> ParametersDecoder { return supportedTypes[type] ?? { decoder in - return (item: try ItemType(from: decoder), action: try ActionType(from: decoder), parameters: []) + return (item: try ItemType(from: decoder), action: try ActionType(from: decoder), parameters: [:]) } } @@ -111,7 +112,7 @@ class SupportedTypesHolder { func register(typename: String, item: ItemType, action: ActionType) { register(typename: typename) { _ in - return (item: item, action: action, parameters: []) + return (item: item, action: action, parameters: [:]) } } } @@ -120,7 +121,6 @@ enum ItemType: Decodable { case staticButton(title: String) case appleScriptTitledButton(source: SourceProtocol, refreshInterval: Double) case timeButton(formatTemplate: String) - case flexSpace() case volume() case brightness(refreshInterval: Double) @@ -137,7 +137,6 @@ enum ItemType: Decodable { case staticButton case appleScriptTitledButton case timeButton - case flexSpace case volume case brightness } @@ -156,8 +155,6 @@ enum ItemType: Decodable { case .timeButton: let template = try container.decodeIfPresent(String.self, forKey: .formatTemplate) ?? "HH:mm" self = .timeButton(formatTemplate: template) - case .flexSpace: - self = .flexSpace() case .volume: self = .volume() case .brightness: @@ -218,8 +215,6 @@ func ==(lhs: ItemType, rhs: ItemType) -> Bool { switch (lhs, rhs) { case let (.staticButton(a), .staticButton(b)): return a == b - case let (.flexSpace(a), .flexSpace(b)): - return a == b case let (.appleScriptTitledButton(a, b), .appleScriptTitledButton(c, d)): return a == c && b == d @@ -248,24 +243,28 @@ func ==(lhs: ActionType, rhs: ActionType) -> Bool { enum GeneralParameter { case width(_: CGFloat) case image(source: SourceProtocol) + case align(_: Align) } struct GeneralParameters: Decodable { - let parameters: [GeneralParameter] + let parameters: [GeneralParameters.CodingKeys: GeneralParameter] - fileprivate enum CodingKeys: String, CodingKey { + enum CodingKeys: String, CodingKey { case width case image + case align } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - var result: [GeneralParameter] = [] + var result: [GeneralParameters.CodingKeys: GeneralParameter] = [:] if let value = try container.decodeIfPresent(CGFloat.self, forKey: .width) { - result.append(.width(value)) + result[.width] = .width(value) } if let imageSource = try container.decodeIfPresent(Source.self, forKey: .image) { - result.append(.image(source: imageSource)) + result[.image] = .image(source: imageSource) } + let align = try container.decodeIfPresent(Align.self, forKey: .align) ?? .center + result[.align] = .align(align) parameters = result } } @@ -336,3 +335,9 @@ extension Data { return NSImage(data: self)?.resize(maxSize: NSSize(width: 24, height: 24)) } } + +enum Align: String, Decodable { + case left + case center + case right +} diff --git a/MTMR/ScrollViewItem.swift b/MTMR/ScrollViewItem.swift new file mode 100644 index 0000000..2ac11de --- /dev/null +++ b/MTMR/ScrollViewItem.swift @@ -0,0 +1,19 @@ +import Foundation + +class ScrollViewItem: NSCustomTouchBarItem { + + init(identifier: NSTouchBarItem.Identifier, items: [NSTouchBarItem]) { + super.init(identifier: identifier) + let views = items.flatMap { $0.view } + let stackView = NSStackView(views: views) + stackView.orientation = .horizontal + let scrollView = NSScrollView(frame: CGRect(origin: .zero, size: stackView.fittingSize)) + scrollView.documentView = stackView + self.view = scrollView + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/MTMR/TouchBarController.swift b/MTMR/TouchBarController.swift index 6f6aa14..9da3690 100644 --- a/MTMR/TouchBarController.swift +++ b/MTMR/TouchBarController.swift @@ -23,8 +23,6 @@ extension ItemType { return "com.toxblh.mtmr.appleScriptButton." case .timeButton(formatTemplate: _): return "com.toxblh.mtmr.timeButton." - case .flexSpace(): - return "NSTouchBarItem.Identifier.flexibleSpace" case .volume(): return "com.toxblh.mtmr.volume" case .brightness(refreshInterval: _): @@ -36,6 +34,7 @@ extension ItemType { extension NSTouchBarItem.Identifier { static let controlStripItem = NSTouchBarItem.Identifier("com.toxblh.mtmr.controlStrip") + static let centerScrollArea = NSTouchBarItem.Identifier("com.toxblh.mtmr.scrollArea") } class TouchBarController: NSObject, NSTouchBarDelegate { @@ -44,7 +43,11 @@ class TouchBarController: NSObject, NSTouchBarDelegate { let touchBar = NSTouchBar() - var items: [NSTouchBarItem.Identifier: BarItemDefinition] = [:] + var itemDefinitions: [NSTouchBarItem.Identifier: BarItemDefinition] = [:] + var items: [NSTouchBarItem.Identifier: NSTouchBarItem] = [:] + var leftIdentifiers: [NSTouchBarItem.Identifier] = [] + var centerItems: [NSTouchBarItem] = [] + var rightIdentifiers: [NSTouchBarItem.Identifier] = [] private override init() { super.init() @@ -52,13 +55,18 @@ class TouchBarController: NSObject, NSTouchBarDelegate { self?.dismissTouchBar() })) - loadItems() + loadItemDefinitions() + createItems() + centerItems = self.itemDefinitions.flatMap { (identifier, definition) -> NSTouchBarItem? in + return definition.align == .center ? items[identifier] : nil + } touchBar.delegate = self + touchBar.defaultItemIdentifiers = self.leftIdentifiers + [.centerScrollArea] + self.rightIdentifiers self.presentTouchBar() } - func loadItems() { + func loadItemDefinitions() { let appSupportDirectory = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first!.appending("/MTMR") let presetPath = appSupportDirectory.appending("/items.json") if !FileManager.default.fileExists(atPath: presetPath), @@ -67,18 +75,27 @@ class TouchBarController: NSObject, NSTouchBarDelegate { try? FileManager.default.copyItem(atPath: defaultPreset, toPath: presetPath) } let jsonData = presetPath.fileData - let jsonItems = jsonData?.barItemDefinitions() ?? [BarItemDefinition(type: .staticButton(title: "bad preset"), action: .none, additionalParameters: [])] + let jsonItems = jsonData?.barItemDefinitions() ?? [BarItemDefinition(type: .staticButton(title: "bad preset"), action: .none, additionalParameters: [:])] for item in jsonItems { let identifierString = item.type.identifierBase.appending(UUID().uuidString) - let identifier = item.type == ItemType.flexSpace() - ? NSTouchBarItem.Identifier.flexibleSpace - : NSTouchBarItem.Identifier(identifierString) - items[identifier] = item - touchBar.defaultItemIdentifiers += [identifier] + let identifier = NSTouchBarItem.Identifier(identifierString) + itemDefinitions[identifier] = item + if item.align == .left { + leftIdentifiers.append(identifier) + } + if item.align == .right { + rightIdentifiers.append(identifier) + } } } - + + func createItems() { + for (identifier, definition) in self.itemDefinitions { + self.items[identifier] = self.createItem(forIdentifier: identifier, definition: definition) + } + } + func setupControlStripPresence() { DFRSystemModalShowsCloseBoxWhenFrontMost(false) let item = NSCustomTouchBarItem(identifier: .controlStripItem) @@ -100,9 +117,19 @@ class TouchBarController: NSObject, NSTouchBarDelegate { } func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItem.Identifier) -> NSTouchBarItem? { - guard let item = self.items[identifier] else { + if identifier == .centerScrollArea { + return ScrollViewItem(identifier: identifier, items: centerItems) + } + + guard let item = self.items[identifier], + let definition = self.itemDefinitions[identifier], + definition.align != .center else { return nil } + return item + } + + func createItem(forIdentifier identifier: NSTouchBarItem.Identifier, definition item: BarItemDefinition) -> NSTouchBarItem? { let action = self.action(forItem: item) var barItem: NSTouchBarItem! @@ -113,24 +140,20 @@ class TouchBarController: NSObject, NSTouchBarDelegate { barItem = AppleScriptTouchBarItem(identifier: identifier, source: source, interval: interval, onTap: action) case .timeButton(formatTemplate: let template): barItem = TimeTouchBarItem(identifier: identifier, formatTemplate: template) - case .flexSpace: - barItem = nil case .volume: barItem = VolumeViewController(identifier: identifier) case .brightness(refreshInterval: let interval): barItem = BrightnessViewController(identifier: identifier, refreshInterval: interval) } - for parameter in item.additionalParameters { - if case .width(let value) = parameter, let widthBarItem = barItem as? CanSetWidth { - widthBarItem.setWidth(value: value) - } - if case .image(let source) = parameter, let item = barItem as? CustomButtonTouchBarItem { - let button = item.button! - button.image = source.image - button.imagePosition = .imageLeading - button.imageHugsTitle = true - button.bezelColor = .clear - } + if case .width(let value)? = item.additionalParameters[.width], let widthBarItem = barItem as? CanSetWidth { + widthBarItem.setWidth(value: value) + } + if case .image(let source)? = item.additionalParameters[.image], let item = barItem as? CustomButtonTouchBarItem { + let button = item.button! + button.image = source.image + button.imagePosition = .imageLeading + button.imageHugsTitle = true + button.bezelColor = .clear } return barItem } @@ -179,3 +202,11 @@ extension NSCustomTouchBarItem: CanSetWidth { } } +extension BarItemDefinition { + var align: Align { + if case .align(let result)? = self.additionalParameters[.align] { + return result + } + return .center + } +} diff --git a/MTMR/defaultPreset.json b/MTMR/defaultPreset.json index 9322ee9..aabb851 100644 --- a/MTMR/defaultPreset.json +++ b/MTMR/defaultPreset.json @@ -11,7 +11,6 @@ "keycode": 113, "width": 36, }, - { "type": "flexSpace" }, { "type": "volumeDown", "width": 44 }, { "type": "volumeUp", "width": 44 }, { "type": "previous" }, diff --git a/README.md b/README.md index 19952fc..9d933b5 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ My the idea is to create the program like a platform for plugins for customizati - [x] Status menu: "preferences", "quit" - [x] JSON or another approch for save preset, maybe in `~/Library/Application Support/MTMR/` - [x] Custom buttons size, actions by click -- [ ] Layout: [always left, NSSliderView for center, always right] +- [x] Layout: [always left, NSSliderView for center, always right] - [ ] Overwrite default values from item types (e.g. title for brightness) - [ ] System for autoupdate (maybe https://sparkle-project.org/) @@ -101,11 +101,6 @@ File for customize your preset for MTMR: `open ~/Library/Application Support/MTM "formatTemplate": "HH:mm" //optional ``` -- `flexSpace` – to easily split touch bar in two parts: left and right -```json - "type": "flexSpace" -``` - ## Actions: - `hidKey` ```json @@ -143,17 +138,24 @@ File for customize your preset for MTMR: `open ~/Library/Application Support/MTM "width": 34 ``` +- `align` can stick the time to the side. default is center +```js + "align": "left" //or "right" or "center" +``` + ## Example configuration: ```json [ { "type": "escape", "width": 110 }, - { "type": "exitTouchbar" }, + { "type": "exitTouchbar", "align": "left" }, { "type": "brightnessUp", + "align": "left", "width": 36 }, { "type": "staticButton", + "align": "left", "title": "🔆", "action": "keyPress", "keycode": 113, @@ -169,6 +171,7 @@ File for customize your preset for MTMR: `open ~/Library/Application Support/MTM }, { "type": "staticButton", + "align": "left", "image": { "base64" : "%base64Finder%"}, "action": "appleScript", "actionAppleScript": { @@ -183,18 +186,17 @@ File for customize your preset for MTMR: `open ~/Library/Application Support/MTM }, "refreshInterval": 1 }, - { "type": "flexSpace" }, - { "type": "previous", "width": 36 }, - { "type": "play", "width": 36 }, - { "type": "next", "width": 36 }, - { "type": "sleep", "width": 36 }, - { "type": "displaySleep" }, - { "type": "weather", "refreshInterval": 1800, "width": 70 }, - { "type": "volumeDown", "width": 36 }, - { "type": "volumeUp", "width": 36 }, - { "type": "battery", "refreshInterval": 60 }, - { "type": "appleScriptTitledButton", "refreshInterval": 1800, "source": { "filePath": "/Users/redetection/Library/Application Support/MTMR/Weather.scpt"} }, - { "type": "timeButton", "formatTemplate": "HH:mm", "width": 64 } + { "type": "previous", "width": 36, "align": "right" }, + { "type": "play", "width": 36, "align": "right" }, + { "type": "next", "width": 36, "align": "right" }, + { "type": "sleep", "width": 36 , "align": "right"}, + { "type": "displaySleep", "align": "right" }, + { "type": "weather", "refreshInterval": 1800, "width": 70, "align": "right" }, + { "type": "volumeDown", "width": 36 , "align": "right"}, + { "type": "volumeUp", "width": 36 , "align": "right"}, + { "type": "battery", "refreshInterval": 60 , "align": "right"}, + { "type": "appleScriptTitledButton", "refreshInterval": 1800, "source": { "filePath": "/Users/redetection/Library/Application Support/MTMR/Weather.scpt"} , "align": "right"}, + { "type": "timeButton", "formatTemplate": "HH:mm", "width": 64, "align": "right" } ] ``` @@ -203,26 +205,7 @@ File for customize your preset for MTMR: `open ~/Library/Application Support/MTM [@Toxblh preset](Resources/toxblh.json) -[@ReDetection preset](Resources/ReDetection.json): -```json -[ -{ "type": "escape", "width": 110 }, -{ "type": "exitTouchbar" }, -{ "type": "brightnessDown", "width": 40 }, -{ "type": "brightnessUp", "width": 40 }, -{ "type": "appleScriptTitledButton", "refreshInterval": 15, "source": { "inline": "if application \"Safari\" is running then\r\ttell application \"Safari\"\r\t\trepeat with t in tabs of windows\r\t\t\ttell t\r\t\t\t\tif URL starts with \"https:\/\/music.yandex.ru\" and name does not end with \"на Яндекс.Музыке\" then\r\t\t\t\t\treturn name of t as text\r\t\t\t\tend if\r\t\t\tend tell\r\t\tend repeat\r\tend tell\rend if\rreturn \"\"" }, -"action": "appleScript", "actionAppleScript": {"inline": "if application \"Safari\" is running then\r\ttell application \"Safari\"\r\t\trepeat with w in windows\r\t\t\trepeat with t in tabs of w\r\t\t\t\ttell t\r\t\t\t\t\tif URL starts with \"https:\/\/music.yandex.ru\" and name does not end with \"на Яндекс.Музыке\" then --последнее условие проверяет, запущена ли музыка\r\t\t\t\t\t\tactivate\r\t\t\t\t\t\tset index of w to 1\r\t\t\t\t\t\tdelay 0.1\r\t\t\t\t\t\tset current tab of w to t\r\t\t\t\t\tend if\r\t\t\t\tend tell\r\t\t\tend repeat\r\t\tend repeat\r\tend tell\rend if"}, -}, -{ "type": "appleScriptTitledButton", "source": { "inline": "tell application \"Reminders\"\r\tset activeReminders to name of (reminders of list \"Напоминания\" whose completed is false)\r\tif activeReminders is not {} then\r\t\treturn first item of activeReminders\r\telse\r\t\treturn \"\"\r\tend if\rend tell" }, "refreshInterval": 30}, -{ "type": "flexSpace" }, -{ "type": "appleScriptTitledButton", "source": { "inline": "if application \"iTunes\" is running then\r\ttell application \"iTunes\"\r\t\tif player state is not stopped then return \"\"\r\tend tell\rend if\rif application \"Safari\" is running then\r\ttell application \"Safari\"\r\t\trepeat with t in tabs of windows\r\t\t\ttell t\r\t\t\t\tif URL starts with \"https:\/\/music.yandex.ru\" and name does not end with \"на Яндекс.Музыке\" then\r\t\t\t\t\treturn \"\"\r\t\t\t\tend if\r\t\t\tend tell\r\t\tend repeat\r\tend tell\rend if\rreturn \"▶\"" }, "refreshInterval": 30, "width": 40}, -{ "type": "volumeDown", "width": 44 }, -{ "type": "volumeUp", "width": 44 }, -{ "type": "displaySleep" }, -{ "type": "appleScriptTitledButton", "refreshInterval": 1800, "source": { "filePath": "/Users/redetection/Library/Application Support/MTMR/Weather.scpt"} }, -{ "type": "timeButton" }, -] -``` +[@ReDetection preset](Resources/ReDetection.json) ## Credits diff --git a/Resources/ReDetection.json b/Resources/ReDetection.json index 7efec22..db5778c 100644 --- a/Resources/ReDetection.json +++ b/Resources/ReDetection.json @@ -1,48 +1,22 @@ -[ - { "type": "escape", "width": 110 }, - { "type": "exitTouchbar" }, - { "type": "brightnessDown", "width": 40 }, - { "type": "brightnessUp", "width": 40 }, - { - "type": "appleScriptTitledButton", - "refreshInterval": 15, - "source": { - "inline": - "if application \"Safari\" is running then\r\ttell application \"Safari\"\r\t\trepeat with t in tabs of windows\r\t\t\ttell t\r\t\t\t\tif URL starts with \"https://music.yandex.ru\" and name does not end with \"на Яндекс.Музыке\" then\r\t\t\t\t\treturn name of t as text\r\t\t\t\tend if\r\t\t\tend tell\r\t\tend repeat\r\tend tell\rend if\rreturn \"\"" - }, - "action": "appleScript", - "actionAppleScript": { - "inline": - "if application \"Safari\" is running then\r\ttell application \"Safari\"\r\t\trepeat with w in windows\r\t\t\trepeat with t in tabs of w\r\t\t\t\ttell t\r\t\t\t\t\tif URL starts with \"https://music.yandex.ru\" and name does not end with \"на Яндекс.Музыке\" then --последнее условие проверяет, запущена ли музыка\r\t\t\t\t\t\tactivate\r\t\t\t\t\t\tset index of w to 1\r\t\t\t\t\t\tdelay 0.1\r\t\t\t\t\t\tset current tab of w to t\r\t\t\t\t\tend if\r\t\t\t\tend tell\r\t\t\tend repeat\r\t\tend repeat\r\tend tell\rend if" - } + [ + { "type": "escape", "width": 110}, + { "type": "exitTouchbar", "width": 50, "align": "left" }, + { "type": "brightnessDown", "width": 40 , "align": "left" }, + { "type": "brightnessUp", "width": 40 , "align": "left" }, + { "type": "appleScriptTitledButton", "refreshInterval": 15, "source": { "inline": "if application \"Safari\" is running then\r\ttell application \"Safari\"\r\t\trepeat with t in tabs of windows\r\t\t\ttell t\r\t\t\t\tif URL starts with \"https:\/\/music.yandex.ru\" and name does not end with \"на Яндекс.Музыке\" then\r\t\t\t\t\treturn name of t as text\r\t\t\t\tend if\r\t\t\tend tell\r\t\tend repeat\r\tend tell\rend if\rreturn \"\"" }, + "action": "appleScript", "actionAppleScript": {"inline": "if application \"Safari\" is running then\r\ttell application \"Safari\"\r\t\trepeat with w in windows\r\t\t\trepeat with t in tabs of w\r\t\t\t\ttell t\r\t\t\t\t\tif URL starts with \"https:\/\/music.yandex.ru\" and name does not end with \"на Яндекс.Музыке\" then --последнее условие проверяет, запущена ли музыка\r\t\t\t\t\t\tactivate\r\t\t\t\t\t\tset index of w to 1\r\t\t\t\t\t\tdelay 0.1\r\t\t\t\t\t\tset current tab of w to t\r\t\t\t\t\tend if\r\t\t\t\tend tell\r\t\t\tend repeat\r\t\tend repeat\r\tend tell\rend if"}, + "image": {"base64": "iVBORw0KGgoAAAANSUhEUgAAAJgAAACVCAYAAACkXDP\/AAAMI2lDQ1BJQ0MgUHJvZmlsZQAASImVVwdUk8kWnr8kISGhBSIgJfQmSq9SQwsgIFWwEZJAQokhEFTsyKICa0FFBCu6KqLoWgBZbNjLomCvCyIqyrpYsKHyJgmg675y3j1nZr5z59473512ZgBQjeKIxZmoGgBZolxJdLA\/c1JiEpP0CKBAG6gBXUDmcHPEflFR4QDKcPt3eXcTILL2mq0s1j\/7\/6uo8\/g5XACQKIhTeDncLIgPAYC7cMWSXAAIvVBvMjNXDDERsgSaEkgQYlMZTlNgNxlOUeBwuU1sNAviZACUqByOJA0AFRkvZh43DcZRKYXYTsQTiiBuhtibK+DwIP4M8ZisrBkQq1pCbJnyXZy0v8VMGYnJ4aSNYEUuclEKEOaIMzmz\/8\/p+N+SlSkdHsMEFqpAEhIty1k2bxkzwmSYCvF5UUpEJMQaEF8X8uT2MvxEIA2JG7L\/wM1hwTkDDABQKo8TEAaxHsTG0ow4vyHszZHIfaE9mpQviE1QxEdFkhnRQ\/HRfFFmRPhQnFIBnz2Mq\/k5gTHDNqnCIDbEcA3RRmEuO3Yo5vk8YXwExCoQ38\/JiAkb8n2eL2BFjIwljZZxhmuOgayc4Vww01RJULTCHnMRCNkRQ\/rwXEFsiMIXm8blyDloQ5zOz5kUPsyHxw8IVPDBCviiuCGeWJk41z96yH67ODNqyB5r5mcGy\/TGELfm5MUM+\/blws2myAUH6ZzQKMW4uKY4NypWwQ1ngnDAAgGACaSwpIAZIB0IW3sbesFwTxDgAAlIA3xgO6QZ9kiQ94hgHQPywZ8Q8UHOiJ+\/vJcP8qD+y4hWUduCVHlvntwjAzyBOAvXxb1xTzwc1r6wOOBuuPuwH1N1eFRiIDGAGEIMIlpNFxZIfojLBFyYQSYsEhAGWz7MSsZBNMz9WxzCE0Ib4RHhBqGDcAfEg8fQTviPDL9FE47oJoAOGDVoKLuU77PDzSFrZ9wf94L8IXecgesCW9wJZuKH+8DcnKH226z9O+7SYdZkOzJKHkX2JVv+aKdireI84iPL7XueCl4pI5mwRnp+HI31XW482Ib9aIktxQ5i57CT2AWsGWsATOw41ohdxo7K8MjeeCzfG8OjRcv5ZMA4wmEbu1q7HrvPP4zNGRpfIl9\/kMuflSs7OKwZ4tkSYZogl+kHb2s+ky3ijh3DdLCzh7eo7O5XXC1vGPI7HWFc\/KYryAPAy2pwcLD5my7cHYBDjQBQer7pLM3hcTYE4PxSrlSSp9DhsooAKEAVnhQdYADvLkuYkQNwAZ7AFwSCUBAJYkEimAbnWQCyIOuZYC5YBIpACVgJ1oJKsBlsA7vAXnAANIBmcBKcBZfAVXAD3IN7pRu8AH3gHRhAEISE0BA6ooMYImaIDeKAuCHeSCASjkQjiUgykoaIECkyF1mMlCBlSCWyFalBfkWOICeRC0gbcgfpRHqQ18gnFEOpqCaqj5qj41A31A8NQ2PRqWgamo3mo4XocrQCrUb3oPXoSfQSegPtQF+g\/RjAlDEGZoTZYm4YC4vEkrBUTILNx4qxcqwaq8Oa4EpfwzqwXuwjTsTpOBO3hfs1BI\/DuXg2Ph8vxSvxXXg9fhq\/hnfiffhXAo2gR7AheBDYhEmENMJMQhGhnLCDcJhwBp6pbsI7IpHIIFoQXeFZTSSmE+cQS4kbifuIJ4htxC5iP4lE0iHZkLxIkSQOKZdURFpP2kM6TmondZM+KCkrGSo5KAUpJSmJlAqUypV2Kx1Tald6qjRAViObkT3IkWQeeTZ5BXk7uYl8hdxNHqCoUywoXpRYSjplEaWCUkc5Q7lPeaOsrGys7K48UVmovFC5Qnm\/8nnlTuWPVA2qNZVFnUKVUpdTd1JPUO9Q39BoNHOaLy2JlktbTquhnaI9pH1QoauMVWGr8FQWqFSp1Ku0q7xUJauaqfqpTlPNVy1XPah6RbVXjaxmrsZS46jNV6tSO6J2S61fna5urx6pnqVeqr5b\/YL6Mw2ShrlGoAZPo1Bjm8YpjS46Rjehs+hc+mL6dvoZercmUdNCk62ZrlmiuVezVbNPS0PLSStea5ZWldZRrQ4GxjBnsBmZjBWMA4ybjE+j9Ef5jeKPWjaqblT7qPfao7V9tfnaxdr7tG9of9Jh6gTqZOis0mnQeaCL61rrTtSdqbtJ94xu72jN0Z6juaOLRx8YfVcP1bPWi9abo7dN77Jev76BfrC+WH+9\/in9XgOGga9BusEag2MGPYZ0Q29DoeEaw+OGz5laTD9mJrOCeZrZZ6RnFGIkNdpq1Go0YGxhHGdcYLzP+IEJxcTNJNVkjUmLSZ+poekE07mmtaZ3zchmbmYCs3Vm58zem1uYJ5gvMW8wf2ahbcG2yLeotbhvSbP0scy2rLa8bkW0crPKsNpoddUatXa2FlhXWV+xQW1cbIQ2G23axhDGuI8Rjakec8uWautnm2dba9s5ljE2fGzB2IaxL8eZjksat2rcuXFf7ZztMu22292z17APtS+wb7J\/7WDtwHWocrjuSHMMclzg2Oj4ysnGie+0yem2M915gvMS5xbnLy6uLhKXOpceV1PXZNcNrrfcNN2i3ErdzrsT3P3dF7g3u3\/0cPHI9Tjg8ZenrWeG527PZ+MtxvPHbx\/f5WXsxfHa6tXhzfRO9t7i3eFj5MPxqfZ55Gviy\/Pd4fvUz8ov3W+P30t\/O3+J\/2H\/9ywP1jzWiQAsIDigOKA1UCMwLrAy8GGQcVBaUG1QX7Bz8JzgEyGEkLCQVSG32PpsLruG3RfqGjov9HQYNSwmrDLsUbh1uCS8aQI6IXTC6gn3I8wiRBENkSCSHbk68kGURVR21G8TiROjJlZNfBJtHz03+lwMPWZ6zO6Yd7H+sSti78VZxknjWuJV46fE18S\/TwhIKEvomDRu0rxJlxJ1E4WJjUmkpPikHUn9kwMnr53cPcV5StGUm1Mtps6aemGa7rTMaUenq07nTD+YTEhOSN6d\/JkTyanm9KewUzak9HFZ3HXcFzxf3hpeD9+LX8Z\/muqVWpb6LM0rbXVaj8BHUC7oFbKElcJX6SHpm9PfZ0Rm7MwYzEzI3JellJWcdUSkIcoQnZ5hMGPWjDaxjbhI3JHtkb02u08SJtmRg+RMzWnM1YSP7MtSS+lP0s4877yqvA8z42cenKU+SzTr8mzr2ctmP80Pyv9lDj6HO6dlrtHcRXM75\/nN2zofmZ8yv2WByYLCBd0LgxfuWkRZlLHo9wK7grKCt4sTFjcV6hcuLOz6Kfin2iKVIknRrSWeSzYvxZcKl7Yuc1y2ftnXYl7xxRK7kvKSz6Xc0os\/2\/9c8fPg8tTlrStcVmxaSVwpWnlzlc+qXWXqZfllXasnrK5fw1xTvObt2ulrL5Q7lW9eR1knXddREV7RuN50\/cr1nysFlTeq\/Kv2bdDbsGzD+428je2bfDfVbdbfXLL50xbhlttbg7fWV5tXl28jbsvb9mR7\/PZzv7j9UrNDd0fJji87RTs7dkXvOl3jWlOzW2\/3ilq0Vlrbs2fKnqt7A\/Y21tnWbd3H2FeyH+yX7n\/+a\/KvNw+EHWg56Haw7pDZoQ2H6YeL65H62fV9DYKGjsbExrYjoUdamjybDv829redzUbNVUe1jq44RjlWeGzweP7x\/hPiE70n0052tUxvuXdq0qnrpyeebj0Tdub82aCzp875nTt+3ut88wWPC0cuul1suORyqf6y8+XDvzv\/frjVpbX+iuuVxqvuV5vaxrcda\/dpP3kt4NrZ6+zrl25E3Gi7GXfz9q0ptzpu824\/u5N559XdvLsD9xbeJ9wvfqD2oPyh3sPqP6z+2Nfh0nG0M6Dz8qOYR\/e6uF0vHuc8\/txd+IT2pPyp4dOaZw7PmnuCeq4+n\/y8+4X4xUBv0Z\/qf254afny0F++f13um9TX\/UryavB16RudNzvfOr1t6Y\/qf\/gu693A++IPOh92fXT7eO5TwqenAzM\/kz5XfLH60vQ17Ov9wazBQTFHwpE\/BTBY0NRUAF7vBICWCAD9Knw\/TFb8zeSCKP6TcgT+E1b83+TiAkAdbGTPcNYJAPbDYg4LzRcA2XM81hegjo4jZUhyUh0dFLGo8IdD+DA4+EYfAFITAF8kg4MDGwcHv2yHZO8AcCJb8SeUiewPukUeo52RfR\/8IP8CirpwdYvsG68AAAAJcEhZcwAAFiUAABYlAUlSJPAAAB4aSURBVHgB7V0JcBzHde3umb2xWOIiQBKkeN+HKFIq6mAo2bJMSZR1lMjYcXypYquUSrlipZIq21UxGNtKnPJRtuOk7MQ5pMiOSFtWLMmJrNsiFZ7iDR0U7wPEQdzYnd2Z6c77Q0BcwQQIEDuzs9B0cYjZndnu379f\/\/79+\/dvxoIUcCDgQMCBgAMBBwIOBBwIOBBwIOBAwIGAAwEHRsoBPtIXg\/fGxgH15oEbmKbpbM6CA8ipi3Mux5ZjafxaLw0yS5\/K7p\/950eZYcy0W1rO6nNmdhg\/e2yvqJvSFLrlluNs48Ye3tAwLgEXSDCPsNv+6Q2vMNtawzIZJRYs6tYn1T0pypMHLMPYHj7bcc6cVtlTVjc7y26\/PQPpZnpEluvFBBLMdRbnFSAlk+k0l7t3pizGPscY+ncYTTB3oanbNb\/KMXN3uKnpaaXUu+MFZIEEy2t\/N28dCWbm1siOjrxi+tkfCjEuRB8e5BRjGW3SZDO0bPkWfdKU18XiZdtDs2a9iWck2fC4tFIgwYraXv14MXMMdwmQkgDSKuxzTUx2dpRnbXmDkqpTxKO94SXXHDMe\/\/fdkQVLd7LlyxvxbncpAC4AWFEBdonCFXR9I8OUkanA0woAjjGdM9neMtXM9pVZp08l5GP\/Us0m1bV3Pv54kzZ1ak\/Z6tU0K81dIreifxUMkR41waWHyCsoHIDjsZgKLV7SKqZN+7lWVbPXtMW25OFdzU2V0eykioUWa2y0\/DIrDQB2BW18JT8pGMBoYkCtJjTMBVQO97bQdVPMmZcOzZ7zBCTaG9FVf\/AKq6w8C6lmXwmthfxNALBCcnOYvAoHsMGF9AMulpBMiGamZA+z7Ha9trY3dPXVT4nJ9fvtpSveScyY0QrAeW5rC3Swwe1Vcp8xPaC5QroXyhqb5Fykt2UzOfvUiU555mQFe\/mlus72tpaOhoYTspK1V32xoduragYA84rTXpaDiYLV3Bxmzc33o9j7MVFQoqIiHVbZHyoj+b\/qxz9+nT\/4oCfGXEJ9kMY7B5TisqM9kdm5\/Uu5\/TvvNq6eX+9VlQOAecXpopZDw6hiXNoREY5Vs4wKAFbU9hjHhfNQKIZpwQSvqhhIMK847ZNyeDSaYsKe4hU5AcC84rRfyglHyjnX67wiJwCYV5z2STlc18sUUzVekRMAzCtO+6UcTYvCKaPcK3ICgHnFab+Uo2kRpbQyr8gJAOYVp31SDpaLwoJJcg3yJAUA84TNPipEaGHGedwrigKAecBpeD34xqkAlIRgc416UG2niABgXnHaJ+UILjTOWdgrcgKAecVpn5QDCaZJJQOA+aQ9CkWGb4bIQlVopPkE7joj5dTY3rskwMSkKSx21z3wt29j9rGjTJ5vZfaZU0yZLjqiwsrKsVY0tuqM\/NcfKIDBp4AztV6w3UcFq52ps7bWSN95LZKJGloinNCwKQy+x2Y4LAW58DFDU3ZKC9sdtiWjurRj2ZTBUnaOtc+yWCplbz50yN6wYfNIGguO9NB88hNcnRFKoEubMfsgg4+93dWlcdPUWFd3gmtaFbOsWpbNaiqXxZsjKSI\/86HvMeGQUqnCZTh0Uc6TcQ0wtWm9hlriOq2xMhliV03T2b5YLBtZHI10pCdkVXRKeIKaGOblZZqQcdOWlREerpJcweOd21HF+nJSZhJc9ClL9OXC1llhxZpUqrdDWkZmXX1Vrzp2T1\/zO0fN2plTLNY1VbIVP7EAJQegebzXBwMMYM6oM6e3hcqS94XWrstF164j00HSOndugXz38Fpr97b7rRPHJlhnTuuqL60zwSNMSgGXaGwxGpx9XkmXvVU5IXj6sq8V6IVxCTC1aZN2fM6ZZC765lQzfXKFUMl5EF63a5muqYp1aQzbqrOKQaowASd1rqTFbXi0k5AhkwKJGoDMkXdOWzrticm9nZU2Ls46Hd92WJRkpp2ZFZWTn8v2xPayhH4g0vzoXqWi5znfkC8lypzAJ\/mNxlkvnLR6+Jw52f6vaeNtn3r55bbTkdZt9YZ8JPOhW8qisWSVEmKV\/dZbD1gnjs+SZ09V262t+TmN7h4VgAzrGd2PrvztcQEwx87U9usyq+2pJWb63N2G+un0STafbPfyGPbeJMmwiK4PycTIF+pCeu8GOBo0eg28QnLIee3if86jAflBf7GNAjJFfpTLvhtZ3\/FeI320R5xRHdk31u2xtIod8ck37WLpY+tEKlkj04Sh\/qRUJeRkTWtra7Kmpua9Bue33AL4UxeAhFMKIGTn+w5ubzaPJnbqFamkLvRytXjZAhC21jp1coXq7krZLc3AKhE5QBluh0q2SnOu5W8vH+rNgnxf0gA7f7ihvDK9u8rcfedEEUnWMJldgvFwDZh\/FVSNOkE8d8BxgfX9twVh3EAmwCZlC+8E8lCwIA6xo4yzHujS5ZrKxOzWLQleEb+e6dkUy1N94F8aZpFoKqXULEjcA3zD+ySekz2AT1KQLgNXMwAXYu3tMbOtrdneuytudnb1YQdRBYul4ywSqlGWPVHYVlhl0v2D9CUAJy1ITEnA9SSVHMBUQ4NgCw8hzlYizuzu5aYM38VY751WtmOuJxwbQSG2YklMBVczaa62LGzgST92QUoi+El+4hUV9ZqV+0LrokV\/he8v2+gAHG3UoGsnXQCczjo6EszomW3sP\/Qxa+\/Oe2VLyxTryGFd2XYIvSvCJQZ7Zb+nFSrTQjm8Bb\/3JJUUwMBQzo5vnJYzqlaovqN\/z\/rOVmFUoGUPMNPfSUnEnxgEMJEom6hsuaFmxoxHUbf9ANColG+8T0NpF367p23L9sYEi3w3vGRlLHbbXZOlbawxDx18EFvXJttNZ5Kqt394zhnQD\/lxr7hVEgCj\/Qrs9HcnG2+s\/Q50jYX4BI9MDnApZxT0ilkFL8dq43bbUxWiev1j3DI+B6DsQOOPOsYEfkOiMdN\/EeBa2dath+1Y6onQjJlx+6p5KVFbMR+62h2iqmIfS8b3FLwuQ2Toa4CBUZztvTeV3WOu5PzV24Cm66DrTMT3nrmbDMG3wnxt92EeeVDItuhUpVfezfVkBer2DABzCeVp5EXi96S30cShB\/np2B8ZYS0tHdldW7tkWaI1VB47MfLcxvambwHm6FrvbqgyI\/YsZoj7lMw8gOEwMrbq+uvXSmZh5zjGrNbmSKjyxjuZqqtgp7+3FVS2F4pSgG1gVnoUedLlafIlwNB9eednUuXRtp7vQPrfCI7M9JQrXhdmZ5jZ9sICJeIpMWFVE6TOX49VinldhaHKc2PmPlRZI\/q+dcsDyWgityJstv0I9qWrYAYgqeXLjjCiCvW\/ZDxhYr0RRrO8uaKoFyy6Hkb6SjQD\/kEjsLkWPi0itY+EWPhnfNE\/5r09mtL8866v3HWMPevmJGPn1uh2x58ogaHxQtS\/kgfXSJsbqhdWP3O1Mttyv2Gcuq5v10cpmElJJ18AjIbEjj03T4iw3HUhYd3BmflJfBUZysBe0hy\/DPEAWZRJ4yNhYXw4LuTcs0\/f5Zl782VIu6LH\/pAOr6+PRmXXnxuSPQBQTb2imoyzH5k2\/womNfMmTsv+B6r2dKlWr6gAgzLL2YF1E7JW91exIPJpMLGyVBnpBt2Q7LcjPvAiY\/dtKpLteZHf8H9k6yqpVLQhksBl7lt7rWGafwpwfRKLeNWQXuReE6R+DoAfcSj\/s2Bc\/lYmklqbeeOOq0qNOUUDmLHnzmnM5ssRQPkGgKsOa8a+m9H6oTHBFCyDqYU6VzfpSs7v2HOPZ5FxClH\/ogBMHVoETyr7M7ayPws\/rDsKUZHxngfcUB+GkeOBmMperzaVjqT3HGBq113xnDHlXvTMz0P0XzvegVHg+sGB3\/6hOfdjS0sFZJ4CrHP\/H1WY8fhSOBU0QOzXBjrX6OAHvTWMdf+ptmV8ny34w+nq0HrPtp+NjtKLb3sGMPVygx5XxgzNztwIYM0HCb53sbnIJv\/cwbErDOm\/wrQyN\/WxvkqlnH0H\/iFwECWeAYxNb6lWVuYTdtb420E0BB9Hz4G4so1\/Chn6Db17ynxt2vEEYEo1CKP1yPfhxrwejkuB5Bo9oH7vF+BjTLHs10Py7EalNvnWvOM6wNTr18fSu3aug85FCn3Jr639XksX6QvHpqPUTBhjV2f3PPp5v+pjrgLM8URNTi\/XuL2GC3igQn8oUnuMrFi0FoNooAPP6G8JJHIXr3NcmuTkiv59oL4i292louZPxbMqdw1a62E\/1doBEPl8whXP2ehDwKILuzWcDWP0kUQEqdP0j7hEn+miwQiXX8zCUPqrlbTvzXHjN+ElE38L6s7j8k1yDWC0FJTececCXTO\/RS71vknk34mtFfI0jls5AdNlCzaYYT+ESuO4Y3IyJuBRAoJ4ElvQqvF3Ai44aZPflqjCVYH6xPBO1B\/1Aq8TPHPsxwaP3q127drCV66knUe+SK4BLHfwS\/M1PblCsc55dMpEMRMOvYMTsmK5\/fZFpz\/aTw0wvU+C5Q+LIFkBcHYa3eMMPhCW6BqQYACcNguBtpaDhQRCV5UNlDtMIrKwqbiMRyrvzUWeoFnlL4d53dNHrgCMpFd2zz0fgTv4GhwJXDS9S2Ww2\/8sJFQH\/gIk6gykFO1pppOxByTVkOwmhOEhDaMk9QYllQGo0HGyWZvp03A\/ESv15JlaJKmGkrmwO29imYxUh3\/zDJ9zB3WhoidXAMaaNsaYytyKpll9odt7W09Hx8JeaHUewHrLZrJJMvsEaCDAFCoBpHYTMjtnA8CQZjMh2mzBRA2aGk7exdDRpJVeTpAPRU9Uo5PTgaSFrPEVca7gAFMv36xbvZmVcKOfppTl\/co\/CZ4uxcy9NrNeh45l0BdXxJuR\/Qh524dxHbEZj0sWul5joWsBNtLRgDWvExehulz65KfC737xeyi76FKs4JpDeywWt3v3PwJwzfaauQgXwswXLZb7b4tZWyBZKKKDm+DKryCZNzBZMF+zWfYpk1nQ94rSvDJbL3v2PcQSYUxRip8KCrBDhxrCodTVdUxa09GwnkUydkAERd5Eo5pHMByeg+Sivuv15ALlkcS0oeuZbwHsBDKazwHkHOsXdLmfFFzHEBAlm6yn9V\/3yxu+hIICbGG8Mx5mxjywcgJ0EJpveZJoJigxS7T2QolvQiMXebOX6gI9RzFE74P+hwmGM1PFVAch5LxJUAWZYSxgs8s9gfRwlSoowMzO49O13LEvoyN7J70gIRTAZfwi58wYBwylw1Xai2c0XNqnQNemHJNtMHWUId5dqqDsHroaCi782Xc+39f5imdnEg1FTMFqrM7tw7H38clWLn2dl9LLwpCYfcVisgUaNaIU+SqBHqIr9zzihsHUIco9o09nVu9qHUHTir0QXjCAmZmX5ohIYo6X4JLHoG+9jWHxXWjYF2Nd+ghjUL5Al40VAwsrBjbC0nmY9Ei0poK19RR1X2XBlECZbZompDnNCwY6zQSJYGG5R9JSz6iianlB4aAyaDbblb9MMOi5Sx+tXKYy23OEAEaLYEVJBQMYz55cxVRulSe1oLaCrct6AwCD\/lUKycbkw+uksj1zmZk7i3IRxLU4qSBDJC0NqVzHdcrqRfwuDxK2n2ZfspjqRFmYQZZEok5BV0E4PsIa291X62bblBG+7cprBaru5hD6J10Fk4hD1Vb1KQyL0L0OY2i8xBrhUL\/zzfcejpRoD6yoqGnFrHuBANGBgwa8WRgZAJiCl0OQhucAOFSHRdGiWvTHLMFg8+LspE3Lu2POa3h24Sk4RrqMdahUxsXL1sjdFxRDkGEFU4XjPuluWUPkXhhQZI7De8ID7QLDozoHVebkELUJvv59DiisqDRuLJpFf+wA28i4oU7imF6co+NyIqMq6V8lqXu5zJuhsofKpzWfPlLCAEPNuMRhTR74RdOSC+lg4yah9RUthruYcIScCFcZBdK1R0\/o2KXO11BoOoeFbffHedUG6TWeAEZ9hTaauNhnpOKa3qOXuASjWOxu+3CiEWQL2qJoNunR997L\/oKA5bKpBWcLaFqqrWhu62OXYOBRWGgFyWfYBoEzIfl4Oa4vw75YQg8h93kcC+AuroFjKRRHYUZLd4jcvJnxHO8\/XdGttiXpBYdCx9fexeHELfKHzddFcDnlQgfDgZilC7D1qIXJdWzcHpaNY3\/Y7xk69ox8lAPxzGW+YWhB0G7L\/RFmCLYWpmALu\/LcTh4usbhdlfz8uct+v7CxChZyu5T8Gr3\/vjAAe3+ewaeRcoC43x+eYKQ\/GfV7HEdEe6EjD0FY6QDMfRk5BItc+pokFxkPXPbTd\/ZnQkd2qRaXzbYgADO90I8KQull+eHdCzSDJOOOy0OkdxW6dEljbrbNyHdCkiFYtIsJ\/Y\/TNpIxU+sijaPMmnYYebbLaJS0FfL1gjRZjoKLuJzIXoRj1C8EH3G5LC+yF2WI0oPL\/YTwAdLd\/j9cHcYMsPXrsdBhwfwJO+hwBY35GdpCq4AQK+oWhjHX4mIGBC4PAEa2Q5w87W7bXKzV792NGWBOjughiLPhbiWosyfxX4RuSj\/RkO8M+y5XBY2C7Uy6qxrMcFUYO8A2ogbVScSacT+Si5hMm1fHB8AEgtrR5XYSQthqQszlFc+hazF2gH0NKzidtSaMLa73En0G9sQjwuB4SALxxOhyO0k4U0WzdS47BQ1di7EDDHnHKuoNDPSuA4wjdCXF39Jqhq6Q758AUwK6JNWF05DvehIWmzipaGGcxg4w4pEeQw9xf4gkwyTH9nteM3ayXW\/XoQqA5ZPibTuRED2wgWGl2+7KUeCC4qQxtxTwpdj0ddip6I0jjZjMmb4YLYNzAAG34nDtiksFuNBJ9CU4CL7sijMZ1Q8xuTdT8uNFO8h0zABzarvxcUgwl2eR\/WylCM9ipmBaPcBVNCeUUbXxxZdBr4D00hdoiFrtUedAjHM2fboHlsqL1cy\/KwjAeEOD1PR4o9AijfmZu3VP0\/vwh7EVE5GeS0mIUecIrQHdtP7oAb40PbZX0+KnEavVdf14qLYuCMCczMNVjVxLeAIwCm3nKPtXYcjxYKo\/FPNG8z3RKyB1NQzxXi15Ka18Nw9VnxwNnYV+t2AACyVmN4pQyhOAkYcAhw6jz4LZgqb6fh8q0SG0esH0GegQkGJeSC8HKJGanbJs9vgAGKv80D6YjPcVugcMl5++HBGdF2lMm4RG83HScCK5fp3G9GUeTBvz+BBicns4vPBE3lee3xZMgrHkdZ3KaGnWuKAjD9xdNhpgE6jX5gkWvhV6DQWL9BvOQB8p9eG1mDXWgjiP8AXmS1jwD2Uyb7exSTTDL14qGMCgSNo2K2uRWvlz0DY8sxyTwk\/6jY4jXQTNzHwCMjJHCCxrha4BXXQ4g7fDOLZJlD+TlZHeYh\/GUDCAUR8xKpe0sbJZT6MHmd6IMBRKUgFeCeHlWKeciHtyQS5orZDnaBNoIiu9NgVOqytAF4DvQWgYh0oaO7DZNqsn5jxzNnx1erSkF\/r9gvZ3iuLS886DVeGe4\/tQUZxj6G1TU7Tp3AsICIxBWnZioHaCAnsGdbQNgARwiUkQWNC3QkuBdK\/sXQPIQGBr1PhwtDK1ms\/ajIDqxU0F7eskjpuPnOoR8RnfhD\/wMa+rRjO08B0hFr4nxMSCC43tKQ00LC4EDfeFmX4NkOY1uFBZRAo4Eiqb+ZXdHRVFl17E+4JKMMoQkotnDj5cr5uHHoewXiWlN+dbUNlOQvel4\/sUJJh9HIchHEQ8C0g26WJfFjiRScAMoU3HsDgLVnqyzUHnInOKlwnldWGX2tZIzapPsfqGDnz2UnxfsqoFlWBUAlUqtviuJpuJw5JpJy5ZqptfolHJUk72MW06Gp1cfKbiogVyclYsVKvTTmMc3ScmIu9pZOPCdRWVA8kJSVaoYkbFKi7egQhrZPVf6\/QDuIh2V+Y2nN9iZQ594d8QGPio4F1\/A6lWcCBflvFof1ELEwYuOnWDYovZb1jMRgAVlsVDLJ44y\/POIsplOrpDPYCDnzk1wWdn9grLvL4Udrg5UOSLFl7kPU7ArTjxzzxW9ypUlaItDb1HTf+NKwCjvKNs8g7DPI0uzRFGW9UPLtjLzxx+\/KHFkDDzwxgqMWR2Y\/g8iWETByRIUEenog3pC0JKewqAwsoBhy1Lw0V\/OWauAkfDOOd5e999BrMPeyL4fo3l9obmrznC2I8GPy\/aZ+qTriX15r1VtsHus+y+n7hWyGgzRnhXipBIp6IpMkFmIb3Iakff0Um4A34H\/VLK8dsKgU2kU9HQRwvVMIU4wAL4fJL6bC3xSbM397sJq5+lM319k1yTYE4N5bIeLXF8p9nddxxNRFLM3fJGwlaAgkwJnPQxSCbcObH2nbCcBDDy\/cRXjt2K9mIOHJGM7\/yYYBpCYCv+lgjX7ElZkxE97Vlfkek629qfvzUVS4mHUOu\/RKPBWZiaL0iF4AB0Qgq3\/aam6V\/XrOZf8ZW7PVtBGSn9rmsPFbe+0B2tn\/4DrvF90JLPj5Sw4L0RcECpI1Kq7af2pH\/tR3BRDTyTJurAZ2aZZvMXuZQPodtBmwnSWDiAhjOY0B+wtehr8WVPnh5LXm7+1nUJ9h7xi1echhHwJYR0fOK974KbK+MAp6mJ+Neciuw9pi8lw4tvk2cSjDjQs\/XeiTwsl2rc+Dk+VsIm6x3AfdsEoyMMCj3sLOqEiCbvCZedf4fPeIUOC\/Rt8hRgxAW177aEafP7EI7juwBYtW8541PCALBWwfmDYdX6jF\/1rnzWeS9Blv42HdLUk4LZ3wHctuQTE9xfhgOcvSa4\/HZYhZ4rBXBRbTwHGK2R8WW\/7bOkepEL8RKWNd64DFuDxxcaaoeS8kWLs5f4yqd94SkxkobxHGADRMWvfXGXtMRLOOjiZYzTOL82SJfiAPhCrOk2lXoBw+ML8eXP777Ue379znMdLJ8RzjFzB9ZNyOZyX4XF5M\/wjBZigvR+DnTDmPTTSJR\/gy96rv39j\/z\/qWgSjFhDDorsyWe7IjHz2xg5H4HXxUn\/s8xLCtUWLu2\/i0R7vsE2P0cHSJdcKqoEG+CW46S4\/fYpekjdyYRaJW312YFnH9S\/ulD\/gB74YlapHYlrniefj5JMRZVgAxwjxT++6n9OM8l32BZmlorthuIBtWPgjQ\/G3wv15bTcvttW4jXL1g6UMrio1XwhwfLhc+r162O1qdp5MpPeDOBhXw4Lg\/H+cYzJJ7aA96grOQma6FyHTZH444Q82Vgqpojh2OA7gBGxahPTzs9dX5cwux5BfKtVmD3NHa4S4+EZAAb9k28La7UPs3cePcc3OJ4SJV81XwKMuKo2rdfYjJ7ZNpMzlc5vs21FLj\/jcZaZg\/viLzTuXG+z5WVvc76Z3HDGRfKFDnYpTvINYPKzqw5rvZGd2Jn0O3gAbpVKncegTjrKeEg5Kdl5nCO2HSfuvZrT9B1s+efGFbiokXwrwfIRRLNM9u6Xq43uPT\/A2YdX49lUyLg4vsbIUlqJ5i3w5E\/jAOoz8OrfEU5d82U265uI4VX8LWZucLJk2scBWeP6BNT9KTmTL5PZzh+gf2CTWOl4ZKAO8FjinUKr+ArWY59nQjZv3Lw53dDgKPhutG\/R8ywZgA1wSh1aH2YilrSM1vm2iK\/gduZWLq01mIJRfB1fJmyhlEqL\/0Jo4X2WmdlqW1VvJ0T4PF\/5E9+5OBeagSUHsAEGYJlJ9DV+YanInLtVsNzNGHgmSSVnQKKVY7jxg1nDwnBoIL7OcZy108Gjlf+lQsn90bmf2Eb7RgfqMd7\/lizABhqG1jOPH98YgcFsvt2+7S9wos0KqGblGI6iOCKCorhGADjX64nybJSCfUkijcIM6FkdmJicUMnrvh+pqN\/Gqh8oeiilAZ55+dd1xntZGSpLHdmUyuZO1SretFrra\/y4lNa1aHhng5qbtGDCcYJz\/aCYsPyXsmzyqxExpZVVf+wDCap8Phd\/n2I+NYW4n9nYA2NZH2tMn+0zs89oYRWNhiI6y1WHWSwXY5aMYIetns31RTSh6TlL6XhKCZqSsxvyIhUaFuPhhGUpqXRBf4XUNAqtEjcVD1mhaCjDjBBclltymU5lRSeY2VajPV1zUjfYzQ\/ZzmL+xdw+kHfjToINbkXHJYhtRD0naay5O8xCJzXWe17rPdGhl1WERDqbFXEDRw7HY1Dj3n\/0MG38VhL7K6TAQTka\/mZVIoU94NGpCNuTlCxRZbFJawC4mx3DaACowdwPPgccCDgQcCDgQMCBgAMBBwIOBBwIOBBwIOBAwIGAAwEHAg4EHAg4EHAg4EDAgYAD\/ubA\/wORPcQEzzVDQgAAAABJRU5ErkJggg=="} + }, - { - "type": "appleScriptTitledButton", - "source": { - "inline": - "tell application \"Reminders\"\r\tset activeReminders to name of (reminders of list \"Напоминания\" whose completed is false)\r\tif activeReminders is not {} then\r\t\treturn first item of activeReminders\r\telse\r\t\treturn \"\"\r\tend if\rend tell" - }, - "refreshInterval": 30 + { "type": "appleScriptTitledButton", "source": { "inline": "tell application \"Reminders\"\r\tset activeReminders to name of (reminders of list \"Напоминания\" whose completed is false)\r\tif activeReminders is not {} then\r\t\treturn first item of activeReminders\r\telse\r\t\treturn \"\"\r\tend if\rend tell" }, "refreshInterval": 30, "action": "appleScript", "actionAppleScript": { "inline": "tell application \"Reminders\" to activate" }, + "image": {"base64" : ""} }, - { "type": "flexSpace" }, - { - "type": "appleScriptTitledButton", - "source": { - "inline": - "if application \"iTunes\" is running then\r\ttell application \"iTunes\"\r\t\tif player state is not stopped then return \"\"\r\tend tell\rend if\rif application \"Safari\" is running then\r\ttell application \"Safari\"\r\t\trepeat with t in tabs of windows\r\t\t\ttell t\r\t\t\t\tif URL starts with \"https://music.yandex.ru\" and name does not end with \"на Яндекс.Музыке\" then\r\t\t\t\t\treturn \"\"\r\t\t\t\tend if\r\t\t\tend tell\r\t\tend repeat\r\tend tell\rend if\rreturn \"▶\"" - }, - "refreshInterval": 30, - "width": 40 - }, - { "type": "volumeDown", "width": 44 }, - { "type": "volumeUp", "width": 44 }, - { "type": "displaySleep" }, - { - "type": "appleScriptTitledButton", - "refreshInterval": 1800, - "source": { - "filePath": "/Users/redetection/Library/Application Support/MTMR/Weather.scpt" - } - }, - { "type": "timeButton" } -] + { "type": "appleScriptTitledButton", "source": { "inline": "if application \"iTunes\" is running then\r\ttell application \"iTunes\"\r\t\tif player state is not stopped then return \"\"\r\tend tell\rend if\rif application \"Safari\" is running then\r\ttell application \"Safari\"\r\t\trepeat with t in tabs of windows\r\t\t\ttell t\r\t\t\t\tif URL starts with \"https:\/\/music.yandex.ru\" and name does not end with \"на Яндекс.Музыке\" then\r\t\t\t\t\treturn \"\"\r\t\t\t\tend if\r\t\t\tend tell\r\t\tend repeat\r\tend tell\rend if\rreturn \"▶\"" }, "refreshInterval": 30, "width": 40, "align": "right" }, + { "type": "volume", "width": 100, "align": "right" }, + { "type": "displaySleep", "width": 44, "align": "right" }, + { "type": "appleScriptTitledButton", "refreshInterval": 1800, "source": { "filePath": "/Users/redetection/Library/Application Support/MTMR/Weather.scpt"}, "align": "right" }, + + + { "type": "timeButton" , "align": "right"}, + ] + diff --git a/Resources/toxblh.json b/Resources/toxblh.json index 226086d..c77d3dc 100644 --- a/Resources/toxblh.json +++ b/Resources/toxblh.json @@ -1,52 +1,73 @@ [ + { "type": "escape", "width": 64, "align": "left" }, { - "type": "staticButton", - "title": "esc", - "action": "keyPress", - "keycode": 53, - "width": 64 - }, - { - "type": "staticImageButton", - "title": "Finder", - "image": - "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", - "action": "appleScript", - "actionAppleScript": { - "inline": - "tell application \"Finder\"\rmake new Finder window\rset target of front window to path to home folder as string\ractivate\rend tell" + "type": "exitTouchbar", + "image": { + "filePath": "/Users/toxblh/git/selfProjects/MTMR/Resources/logo.png" }, - "width": 36 - }, - { - "type": "staticButton", - "title": "🔅", - "action": "keyPress", - "keycode": 107, - "width": 36 - }, - { - "type": "staticButton", - "title": "🔆", - "action": "keyPress", - "keycode": 113, - "width": 36 - }, + "width": 36, "align": "left" }, + { "type": "brightnessDown", "width": 36, "align": "left" }, + { "type": "brightnessUp", "width": 36, "align": "left" }, { "type": "appleScriptTitledButton", "source": { "filePath": "/Users/toxblh/git/selfProjects/MTMR/MTMR/AppleScripts/iTunes.nowPlaying.scpt" }, - "refreshInterval": 1 + "action": "appleScript", + "actionAppleScript": { + "filePath": "/Users/toxblh/git/selfProjects/MTMR/MTMR/AppleScripts/iTunes.next.scpt" + }, + "refreshInterval": 1, + "image": { + "filePath": "/Users/toxblh/git/selfProjects/btt-touchbar-preset/icons/iTunes.png" + } }, - { "type": "flexSpace" }, - { "type": "play", "width": 36 }, - { "type": "next", "width": 36 }, - { "type": "sleep", "width": 36 }, - { "type": "weather", "refreshInterval": 1800, "width": 70 }, - { "type": "volumeDown", "width": 36 }, - { "type": "volumeUp", "width": 36 }, - { "type": "battery", "refreshInterval": 60 }, - { "type": "timeButton", "formatTemplate": "HH:mm", "width": 64 } + { + "type": "appleScriptTitledButton", + "source": { + "filePath": + "/Users/toxblh/git/selfProjects/MTMR/MTMR/AppleScripts/Spotify.nowPlaying.scpt" + }, + "action": "appleScript", + "actionAppleScript": { + "filePath": + "/Users/toxblh/git/selfProjects/MTMR/MTMR/AppleScripts/Spotify.next.scpt" + }, + "refreshInterval": 1, + "image": { + "filePath": "/Users/toxblh/git/selfProjects/btt-touchbar-preset/icons/Spotify.png" + } + }, + { + "type": "appleScriptTitledButton", + "source": { + "filePath": + "/Users/toxblh/git/selfProjects/MTMR/MTMR/AppleScripts/Vox.nowPlaying.scpt" + }, + "action": "appleScript", + "actionAppleScript": { + "filePath": "/Users/toxblh/git/selfProjects/MTMR/MTMR/AppleScripts/Vox.next.scpt" + }, + "refreshInterval": 1, + "image": { + "filePath": "/Users/toxblh/git/selfProjects/btt-touchbar-preset/icons/Vox.png" + } + }, + { + "type": "sleep", + "title": "", + "image": { + "base64": + "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" + }, + "width": 36, + "align": "right" + }, + { "type": "weather", "refreshInterval": 1800, "width": 70, "align": "right" }, + { "type": "volumeDown", "width": 36, "align": "right" }, + { "type": "volumeUp", "width": 36, "align": "right" }, + { "type": "play", "width": 36, "align": "right" }, + { "type": "battery", "refreshInterval": 60, "align": "right" }, + { "type": "timeButton", "formatTemplate": "HH:mm", "width": 64, "align": "right" } ]