NetNewsWire/Evergreen/MainWindow/Sidebar/SidebarCell.swift
2017-05-27 10:43:27 -07:00

126 lines
2.5 KiB
Swift

//
// SidebarCell.swift
// Evergreen
//
// Created by Brent Simmons on 8/1/15.
// Copyright © 2015 Ranchero Software, LLC. All rights reserved.
//
import Foundation
import DB5
private var textSizeCache = [String: NSSize]()
class SidebarCell : NSTableCellView {
var image: NSImage?
private let unreadCountView = UnreadCountView(frame: NSZeroRect)
var unreadCount: Int {
get {
return unreadCountView.unreadCount
}
set {
if unreadCountView.unreadCount != newValue {
unreadCountView.unreadCount = newValue
}
}
}
var name: String {
get {
if let s = textField?.stringValue {
return s
}
return ""
}
set {
if textField?.stringValue != newValue {
textField?.stringValue = newValue
needsDisplay = true
needsLayout = true
}
}
}
override var isFlipped: Bool {
get {
return true
}
}
private func commonInit() {
unreadCountView.translatesAutoresizingMaskIntoConstraints = false
addSubview(unreadCountView)
}
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
override func layout() {
resizeSubviews(withOldSize: NSZeroSize)
}
private let kTextFieldOriginX: CGFloat = 4.0
private let kTextFieldMarginRight: CGFloat = 4.0
private let kUnreadCountMarginLeft: CGFloat = 4.0
private let kUnreadCountMarginRight: CGFloat = 4.0
override func resizeSubviews(withOldSize oldSize: NSSize) {
var r = textField!.frame
r.origin.x = kTextFieldOriginX
r.size.width = NSWidth(bounds) - (kTextFieldOriginX + kTextFieldMarginRight);
let unreadCountSize = unreadCountView.intrinsicContentSize
if unreadCountSize.width > 0.1 {
r.size.width = NSWidth(bounds) - (kTextFieldOriginX + kUnreadCountMarginLeft + unreadCountSize.width + kUnreadCountMarginRight)
}
let size = textField!.intrinsicContentSize
r.size.height = size.height
r = rs_rectCenteredVertically(r)
r.origin.y -= 1.0
textField?.rs_setFrameIfNotEqual(r)
layoutUnreadCountView(unreadCountSize)
}
private func layoutUnreadCountView(_ size: NSSize) {
if size == NSZeroSize {
if !unreadCountView.isHidden {
unreadCountView.isHidden = true
}
return
}
if unreadCountView.isHidden {
unreadCountView.isHidden = false
}
var r = NSZeroRect
r.size = size
r.origin.x = NSMaxX(textField!.frame) + kUnreadCountMarginLeft
r = rs_rectCenteredVertically(r)
unreadCountView.rs_setFrameIfNotEqual(r)
}
}