NetNewsWire/Evergreen/MainWindow/Timeline/Cell/TimelineTableCellView.swift

259 lines
5.7 KiB
Swift

//
// TimelineTableCellView.swift
// Evergreen
//
// Created by Brent Simmons on 8/31/15.
// Copyright © 2015 Ranchero Software, LLC. All rights reserved.
//
import Foundation
import RSTextDrawing
class TimelineTableCellView: NSTableCellView {
let titleView = RSMultiLineView(frame: NSZeroRect)
let unreadIndicatorView = UnreadIndicatorView(frame: NSZeroRect)
let dateView = RSSingleLineView(frame: NSZeroRect)
let feedNameView = RSSingleLineView(frame: NSZeroRect)
let avatarImageView: NSImageView = {
let imageView = NSImageView(frame: NSRect.zero)
imageView.imageScaling = .scaleProportionallyDown
imageView.animates = false
imageView.imageAlignment = .alignCenter
imageView.image = appDelegate.genericFeedImage
return imageView
}()
// let faviconImageView: NSImageView = {
// let imageView = NSImageView(frame: NSRect(x: 0, y: 0, width: 16, height: 16))
// imageView.imageScaling = .scaleProportionallyDown
// imageView.animates = false
// imageView.imageAlignment = .alignCenter
// return imageView
// }()
var cellAppearance: TimelineCellAppearance! {
didSet {
needsLayout = true
}
}
var cellData: TimelineCellData! {
didSet {
updateSubviews()
}
}
override var isFlipped: Bool {
return true
}
override var isOpaque: Bool {
return true
}
override var wantsUpdateLayer: Bool {
return true
}
var isEmphasized = false {
didSet {
dateView.emphasized = isEmphasized
feedNameView.emphasized = isEmphasized
titleView.emphasized = isEmphasized
unreadIndicatorView.isEmphasized = isEmphasized
needsDisplay = true
}
}
var isSelected = false {
didSet {
dateView.selected = isSelected
feedNameView.selected = isSelected
titleView.selected = isSelected
unreadIndicatorView.isSelected = isSelected
needsDisplay = true
}
}
private func addSubviewAtInit(_ view: NSView, hidden: Bool) {
addSubview(view)
view.translatesAutoresizingMaskIntoConstraints = false
view.isHidden = hidden
}
private func commonInit() {
addSubviewAtInit(titleView, hidden: false)
addSubviewAtInit(unreadIndicatorView, hidden: true)
addSubviewAtInit(dateView, hidden: false)
addSubviewAtInit(feedNameView, hidden: true)
addSubviewAtInit(avatarImageView, hidden: false)
// addSubviewAtInit(faviconImageView, hidden: true)
}
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
override func setFrameSize(_ newSize: NSSize) {
if newSize == self.frame.size {
return
}
super.setFrameSize(newSize)
needsLayout = true
}
override func viewDidMoveToSuperview() {
updateSubviews()
updateAppearance()
}
private func updatedLayoutRects() -> TimelineCellLayout {
return timelineCellLayout(NSWidth(bounds), cellData: cellData, appearance: cellAppearance)
}
override func layout() {
resizeSubviews(withOldSize: NSZeroSize)
}
override func resizeSubviews(withOldSize oldSize: NSSize) {
let layoutRects = updatedLayoutRects()
titleView.rs_setFrameIfNotEqual(layoutRects.titleRect)
unreadIndicatorView.rs_setFrameIfNotEqual(layoutRects.unreadIndicatorRect)
dateView.rs_setFrameIfNotEqual(layoutRects.dateRect)
feedNameView.rs_setFrameIfNotEqual(layoutRects.feedNameRect)
avatarImageView.rs_setFrameIfNotEqual(layoutRects.avatarImageRect)
// faviconImageView.rs_setFrameIfNotEqual(layoutRects.faviconRect)
}
override func updateLayer() {
let color: NSColor
if isSelected {
color = isEmphasized ? NSColor.alternateSelectedControlColor : NSColor.secondarySelectedControlColor
}
else {
color = NSColor.white
}
if layer?.backgroundColor != color.cgColor {
layer?.backgroundColor = color.cgColor
}
}
private func updateTitleView() {
titleView.attributedStringValue = cellData.attributedTitle
needsLayout = true
}
private func updateDateView() {
dateView.attributedStringValue = cellData.attributedDateString
needsLayout = true
}
private func updateFeedNameView() {
if cellData.showFeedName {
if feedNameView.isHidden {
feedNameView.isHidden = false
}
feedNameView.attributedStringValue = cellData.attributedFeedName
}
else {
if !feedNameView.isHidden {
feedNameView.isHidden = true
}
}
}
private func updateUnreadIndicator() {
if unreadIndicatorView.isHidden != cellData.read {
unreadIndicatorView.isHidden = cellData.read
}
}
private func updateAvatar() {
if !cellData.showAvatar {
avatarImageView.image = nil
avatarImageView.isHidden = true
return
}
avatarImageView.isHidden = false
if let image = cellData.avatar {
if avatarImageView.image !== image {
avatarImageView.image = image
}
}
else {
avatarImageView.image = nil
}
avatarImageView.wantsLayer = true
avatarImageView.layer?.cornerRadius = cellAppearance.avatarCornerRadius
if avatarImageView.image == nil {
avatarImageView.layer?.backgroundColor = NSColor(calibratedWhite: 0.0, alpha: 0.05).cgColor
}
else {
avatarImageView.layer?.backgroundColor = NSColor.clear.cgColor
}
}
private func updateFavicon() {
// if let favicon = cellData.showFeedName ? cellData.favicon : nil {
// faviconImageView.image = favicon
// faviconImageView.isHidden = false
// }
// else {
// faviconImageView.image = nil
// faviconImageView.isHidden = true
// }
}
private func updateSubviews() {
updateTitleView()
updateDateView()
updateFeedNameView()
updateUnreadIndicator()
updateAvatar()
// updateFavicon()
}
private func updateAppearance() {
if let rowView = superview as? NSTableRowView {
isEmphasized = rowView.isEmphasized
isSelected = rowView.isSelected
}
else {
isEmphasized = false
isSelected = false
}
}
}