You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
4.7 KiB

// Copyright © 2015 Abhishek Banthia
import Cocoa
class FloatingWindowController: ParentPanelController {
private var repeater: Repeater?
static var sharedWindow: FloatingWindowController = FloatingWindowController(windowNibName: NSNib.Name.floatingWindowIdentifier)
override func windowDidLoad() {
super.windowDidLoad()
window?.standardWindowButton(.miniaturizeButton)?.isHidden = true
window?.standardWindowButton(.zoomButton)?.isHidden = true
}
@objc class func shared() -> FloatingWindowController {
return sharedWindow
}
override func awakeFromNib() {
super.awakeFromNib()
setup()
futureSlider.isContinuous = true
windowFrameAutosaveName = NSWindow.FrameAutosaveName("FloatingWindowAutoSave")
dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US")
NotificationCenter.default.addObserver(self,
selector: #selector(themeChanges),
name: Notification.Name.themeDidChange,
object: nil)
updateTheme()
updateDefaultPreferences()
mainTableView.registerForDraggedTypes([.dragSession])
reviewView.isHidden = !showReviewCell
reviewView.layer?.backgroundColor = Themer.shared().mainBackgroundColor().cgColor
mainTableView.setAccessibility("FloatingTableView")
}
@objc override func updatePanelColor() {
super.updatePanelColor()
updateTheme()
}
override func showNotesPopover(forRow row: Int, relativeTo positioningRect: NSRect, andButton target: NSButton!) -> Bool {
guard let popover = morePopover else {
return false
}
target.image = Themer.shared().extraOptionsHighlightedImage()
5 years ago
if popover.isShown, row == previousPopoverRow {
popover.close()
target.image = Themer.shared().extraOptionsImage()
previousPopoverRow = -1
return false
}
previousPopoverRow = row
super.showNotesPopover(forRow: row, relativeTo: positioningRect, andButton: target)
guard let contentView = window?.contentView else {
assertionFailure("Window was unexpectedly nil")
return false
}
popover.show(relativeTo: positioningRect,
of: contentView,
preferredEdge: .minX)
return true
}
private func updateTheme() {
let shared = Themer.shared()
if let panel = window {
panel.acceptsMouseMovedEvents = true
panel.level = .popUpMenu
panel.isOpaque = false
}
shutdownButton.image = shared.shutdownImage()
preferencesButton.image = shared.preferenceImage()
pinButton.image = shared.pinImage()
sharingButton.image = shared.sharingImage()
mainTableView.backgroundColor = shared.mainBackgroundColor()
window?.backgroundColor = shared.mainBackgroundColor()
}
@objc override func updateDefaultPreferences() {
super.updateDefaultPreferences()
updateTime()
mainTableView.backgroundColor = Themer.shared().mainBackgroundColor()
}
@objc override func updateTime() {
retrieveCalendarEvents()
super.updateTime()
}
@objc func themeChanges() {
updateTheme()
super.updatePanelColor()
mainTableView.reloadData()
}
private func setup() {
window?.contentView?.wantsLayer = true
window?.titlebarAppearsTransparent = true
window?.titleVisibility = .hidden
window?.contentView?.layer?.cornerRadius = 20
window?.contentView?.layer?.masksToBounds = true
window?.isOpaque = false
window?.backgroundColor = NSColor.clear
}
@objc func startWindowTimer() {
repeater = Repeater(interval: .seconds(1), mode: .infinite) { _ in
OperationQueue.main.addOperation {
self.updateTime()
}
}
repeater!.start()
super.dismissRowActions()
}
override func showWindow(_: Any?) {
super.showWindow(nil)
determineUpcomingViewVisibility()
}
}
extension NSView {
func setAccessibility(_ identifier: String) {
setAccessibilityEnabled(true)
setAccessibilityIdentifier(identifier)
}
}
extension FloatingWindowController: NSWindowDelegate {
func windowWillClose(_: Notification) {
futureSlider.integerValue = 0
setTimezoneDatasourceSlider(sliderValue: 0)
if let timer = repeater {
timer.pause()
repeater = nil
}
}
}