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.
 
 
 
 
 

166 lines
6.0 KiB

// Copyright © 2015 Abhishek Banthia
import Cocoa
class TimezoneCellView: NSTableCellView {
@IBOutlet var customName: NSTextField!
@IBOutlet var relativeDate: NSTextField!
@IBOutlet var time: NSTextField!
@IBOutlet var sunriseSetTime: NSTextField!
@IBOutlet var noteLabel: NSTextField!
@IBOutlet var extraOptions: NSButton!
@IBOutlet var sunriseImage: NSImageView!
@IBOutlet var currentLocationIndicator: NSImageView!
var rowNumber: NSInteger = -1
var isPopoverDisplayed: Bool = false
override func awakeFromNib() {
if ProcessInfo.processInfo.arguments.contains(CLUITestingLaunchArgument) {
extraOptions.isHidden = false
return
}
sunriseSetTime.alignment = .right
canDrawSubviewsIntoLayer = true
extraOptions.setAccessibility("extraOptionButton")
customName.setAccessibility("CustomNameLabelForCell")
noteLabel.setAccessibility("NoteLabel")
currentLocationIndicator.toolTip = "This row will be updated automatically if Clocker detects a system-level timezone change!"
}
func setTextColor(color: NSColor) {
[relativeDate, customName, time, sunriseSetTime].forEach { $0?.textColor = color }
noteLabel.textColor = .gray
}
func setupLayout() {
guard let relativeFont = relativeDate.font,
let sunriseFont = sunriseSetTime.font
else {
assertionFailure("Unable to convert to NSString")
return
}
let relativeDateString = relativeDate.stringValue as NSString
let sunriseString = sunriseSetTime.stringValue as NSString
let width = relativeDateString.size(withAttributes: [NSAttributedString.Key.font: relativeFont]).width
let sunriseWidth = sunriseString.size(withAttributes: [NSAttributedString.Key.font: sunriseFont]).width
for constraint in relativeDate.constraints where constraint.identifier == "width" {
constraint.constant = width + 8
}
for constraint in sunriseSetTime.constraints where constraint.identifier == "width" {
constraint.constant = sunriseWidth + 3
}
setupTheme()
}
private func setupTheme() {
let themer = Themer.shared()
setTextColor(color: themer.mainTextColor())
extraOptions.image = themer.extraOptionsImage()
extraOptions.alternateImage = themer.extraOptionsHighlightedImage()
currentLocationIndicator.image = themer.currentLocationImage()
setupTextSize()
}
private func setupTextSize() {
guard let userFontSize = DataStore.shared().retrieve(key: CLUserFontSizePreference) as? NSNumber else {
assertionFailure("User Font Size is in unexpected format")
return
}
guard let customFont = customName.font,
let timeFont = time.font else {
assertionFailure("User Font Size is in unexpectedly nil")
return
}
let newFontSize = CGFloat(13 + (userFontSize.intValue * 2))
let newTimeFontSize = CGFloat(13 + (userFontSize.intValue * 3))
let fontManager = NSFontManager.shared
let customPlaceFont = fontManager.convert(customFont, toSize: newFontSize)
let customTimeFont = fontManager.convert(timeFont, toSize: newTimeFontSize)
customName.font = customPlaceFont
time.font = customTimeFont
let timeString = time.stringValue as NSString
let timeHeight = timeString.size(withAttributes: [NSAttributedString.Key.font: customTimeFont]).height
let timeWidth = timeString.size(withAttributes: [NSAttributedString.Key.font: customTimeFont]).width
for constraint in time.constraints {
if constraint.identifier == "height" {
constraint.constant = timeHeight
} else {
constraint.constant = timeWidth
}
}
}
@IBAction func showExtraOptions(_ sender: NSButton) {
let isWindowFloating = DataStore.shared().shouldDisplay(ViewType.showAppInForeground)
var searchView = superview
while searchView != nil && searchView is PanelTableView == false {
searchView = searchView?.superview
}
guard let panelTableView = searchView as? PanelTableView,
let enclosingScroller = panelTableView.enclosingScrollView
else {
assertionFailure("Unable to find panel table view in hierarchy")
return
}
let visibleRect = enclosingScroller.contentView.visibleRect
let range = panelTableView.rows(in: visibleRect)
let count = range.length
let currentRow = labs(rowNumber + 1 - count)
let y = CGFloat(currentRow * 68 + 34)
let relativeRect = CGRect(x: 0,
y: y,
width: frame.size.width,
height: frame.size.height)
if isWindowFloating == false {
guard let panel = PanelController.panel() else { return }
isPopoverDisplayed = panel.showNotesPopover(forRow: rowNumber,
relativeTo: bounds,
andButton: sender)
} else {
let floatingPanel = FloatingWindowController.shared()
isPopoverDisplayed = floatingPanel.showNotesPopover(forRow: rowNumber,
relativeTo: superview?.convert(bounds, to: nil) ?? relativeRect,
andButton: sender)
}
Logger.log(object: [:], for: "Open Extra Options")
}
override func mouseDown(with _: NSEvent) {
window?.endEditing(for: nil)
}
override func rightMouseDown(with event: NSEvent) {
super.rightMouseDown(with: event)
showExtraOptions(extraOptions)
Logger.log(object: [:], for: "Right Click Open Options")
}
}