From 37c2e8523ce2dc6627aca61a9d0b9edd2bb0bed1 Mon Sep 17 00:00:00 2001 From: ad Date: Sat, 14 Apr 2018 13:04:46 +0300 Subject: [PATCH] * image can be set for slider --- MTMR/BrightnessViewController.swift | 13 +++--- MTMR/ItemsParsing.swift | 17 ++++++- MTMR/TouchBarController.swift | 14 ++++-- MTMR/VolumeViewController.swift | 71 ++++++++++++++++++++++------- 4 files changed, 88 insertions(+), 27 deletions(-) diff --git a/MTMR/BrightnessViewController.swift b/MTMR/BrightnessViewController.swift index ad9fab1..9c58898 100644 --- a/MTMR/BrightnessViewController.swift +++ b/MTMR/BrightnessViewController.swift @@ -4,16 +4,17 @@ import AVFoundation import CoreAudio class BrightnessViewController: NSCustomTouchBarItem { - private(set) var sliderItem: NSSlider! + private(set) var sliderItem: CustomSlider! init(identifier: NSTouchBarItem.Identifier, refreshInterval: Double, image: NSImage? = nil) { super.init(identifier: identifier) - let brightness:Double = Double(getBrightness()) - sliderItem = NSSlider(value: brightness*100.0, minValue: 0.0, maxValue: 100.0, target: self, action:#selector(BrightnessViewController.sliderValueChanged(_:))) - if (image != nil) { - sliderItem.cell = CustomSliderCell(knob: image!) - } + sliderItem = CustomSlider(knob: image!) + sliderItem.target = self + sliderItem.action = #selector(BrightnessViewController.sliderValueChanged(_:)) + sliderItem.minValue = 0.0 + sliderItem.maxValue = 100.0 + sliderItem.floatValue = getBrightness()*100 self.view = sliderItem diff --git a/MTMR/ItemsParsing.swift b/MTMR/ItemsParsing.swift index e1d7fe8..2755489 100644 --- a/MTMR/ItemsParsing.swift +++ b/MTMR/ItemsParsing.swift @@ -80,11 +80,24 @@ class SupportedTypesHolder { let item = ItemType.appleScriptTitledButton(source: Source(filePath: scriptPath), refreshInterval: interval ?? 1800.0) return (item: item, action: .none, parameters: [:]) }, + "volume": { decoder in + enum CodingKeys: String, CodingKey { case image } + let container = try decoder.container(keyedBy: CodingKeys.self) + if var img = try container.decodeIfPresent(Source.self, forKey: .image) { + return (item: .volume(), action: .none, parameters: [.image: .image(source: img)]) + } else { + return (item: .volume(), action: .none, parameters: [:]) + } + }, "brightness": { decoder in - enum CodingKeys: String, CodingKey { case refreshInterval } + enum CodingKeys: String, CodingKey { case refreshInterval; case image } 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: [:]) + if var img = try container.decodeIfPresent(Source.self, forKey: .image) { + return (item: .brightness(refreshInterval: interval ?? 0.5), action: .none, parameters: [.image: .image(source: img)]) + } else { + return (item: .brightness(refreshInterval: interval ?? 0.5), action: .none, parameters: [:]) + } }, "battery": { decoder in enum CodingKeys: String, CodingKey { case refreshInterval } diff --git a/MTMR/TouchBarController.swift b/MTMR/TouchBarController.swift index 2566a14..1647f52 100644 --- a/MTMR/TouchBarController.swift +++ b/MTMR/TouchBarController.swift @@ -96,7 +96,7 @@ class TouchBarController: NSObject, NSTouchBarDelegate { } } - func setupControlStripPresence() { + @objc func setupControlStripPresence() { DFRSystemModalShowsCloseBoxWhenFrontMost(false) let item = NSCustomTouchBarItem(identifier: .controlStripItem) item.view = NSButton(image: #imageLiteral(resourceName: "Strip"), target: self, action: #selector(presentTouchBar)) @@ -141,9 +141,17 @@ class TouchBarController: NSObject, NSTouchBarDelegate { case .timeButton(formatTemplate: let template): barItem = TimeTouchBarItem(identifier: identifier, formatTemplate: template) case .volume: - barItem = VolumeViewController(identifier: identifier) + if case .image(let source)? = item.additionalParameters[.image] { + barItem = VolumeViewController(identifier: identifier, image: source.image) + } else { + barItem = VolumeViewController(identifier: identifier) + } case .brightness(refreshInterval: let interval): - barItem = BrightnessViewController(identifier: identifier, refreshInterval: interval) + if case .image(let source)? = item.additionalParameters[.image] { + barItem = BrightnessViewController(identifier: identifier, refreshInterval: interval, image: source.image) + } else { + barItem = BrightnessViewController(identifier: identifier, refreshInterval: interval) + } } if case .width(let value)? = item.additionalParameters[.width], let widthBarItem = barItem as? CanSetWidth { widthBarItem.setWidth(value: value) diff --git a/MTMR/VolumeViewController.swift b/MTMR/VolumeViewController.swift index b73aeb7..4de0b7e 100644 --- a/MTMR/VolumeViewController.swift +++ b/MTMR/VolumeViewController.swift @@ -4,18 +4,10 @@ import AVFoundation import CoreAudio class VolumeViewController: NSCustomTouchBarItem { - private(set) var sliderItem: NSSlider! + private(set) var sliderItem: CustomSlider! init(identifier: NSTouchBarItem.Identifier, image: NSImage? = nil) { super.init(identifier: identifier) - let volume:Double = Double(getInputGain()) - sliderItem = NSSlider(value: volume*100, minValue: 0.0, maxValue: 100.0, target: self, action:#selector(VolumeViewController.sliderValueChanged(_:))) - - if (image != nil) { - sliderItem.cell = CustomSliderCell(knob: image!) - } - - self.view = sliderItem var forPropertyAddress = AudioObjectPropertyAddress( mSelector: kAudioHardwareServiceDeviceProperty_VirtualMasterVolume, @@ -25,6 +17,15 @@ class VolumeViewController: NSCustomTouchBarItem { addListenerBlock(listenerBlock: audioObjectPropertyListenerBlock, onAudioObjectID: defaultDeviceID, forPropertyAddress: &forPropertyAddress) + + sliderItem = CustomSlider(knob: image!) + sliderItem.target = self + sliderItem.action = #selector(VolumeViewController.sliderValueChanged(_:)) + sliderItem.minValue = 0.0 + sliderItem.maxValue = 100.0 + sliderItem.floatValue = getInputGain()*100 + + self.view = sliderItem } func addListenerBlock( listenerBlock: @escaping AudioObjectPropertyListenerBlock, onAudioObjectID: AudioObjectID, forPropertyAddress: UnsafePointer) { @@ -137,16 +138,13 @@ class CustomSliderCell: NSSliderCell { } _currentKnobRect = knobRect; - drawBar(inside: _barRect, flipped: true) + drawBar(inside: _barRect, flipped: false) self.controlView?.lockFocus() - - knobImage.size.width = knobRect.size.width - knobImage.size.height = knobRect.size.height let newOriginX:CGFloat = knobRect.origin.x * (_barRect.size.width - (knobImage.size.width - knobRect.size.width)) / _barRect.size.width; - knobImage.draw(at: NSPoint(x: newOriginX, y: knobRect.origin.y), from: NSRect(x: 0, y: 0, width: knobImage.size.width, height: knobImage.size.height), operation: NSCompositingOperation.sourceOver, fraction: 1) + knobImage.draw(at: NSPoint(x: newOriginX, y: knobRect.origin.y+3), from: NSRect(x: 0, y: 0, width: knobImage.size.width, height: knobImage.size.height), operation: NSCompositingOperation.sourceOver, fraction: 1) self.controlView?.unlockFocus() @@ -157,9 +155,10 @@ class CustomSliderCell: NSSliderCell { var rect = aRect rect.size.height = CGFloat(3) - let barRadius = CGFloat(2.5) + let barRadius = CGFloat(3) let value = CGFloat((self.doubleValue - self.minValue) / (self.maxValue - self.minValue)) - let finalWidth = CGFloat(value * (self.controlView!.frame.size.width - 8)) + let finalWidth = CGFloat(value * (self.controlView!.frame.size.width - 12)) + var leftRect = rect leftRect.size.width = finalWidth let bg = NSBezierPath(roundedRect: rect, xRadius: barRadius, yRadius: barRadius) @@ -170,3 +169,43 @@ class CustomSliderCell: NSSliderCell { active.fill() } } + +class CustomSlider:NSSlider { + + var currentValue:CGFloat = 0 + + override func setNeedsDisplay(_ invalidRect: NSRect) { + super.setNeedsDisplay(invalidRect) + } + + override func awakeFromNib() { + super.awakeFromNib() + if ((self.cell?.isKind(of: CustomSliderCell.self)) == false) { + let cell:CustomSliderCell = CustomSliderCell() + self.cell = cell + } + } + + convenience init(knob:NSImage) { + self.init() + self.cell = CustomSliderCell(knob: knob) + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + + override init(frame frameRect: NSRect) { + super.init(frame: frameRect) + } + + func knobImage() -> NSImage { + let cell = self.cell as! CustomSliderCell + return cell.knobImage + } + + func setKnobImage(image:NSImage) { + let cell = self.cell as! CustomSliderCell + cell.knobImage = image + } +}