NetNewsWire/Evergreen/MainWindow/Detail/DetailStatusBarView.swift

119 lines
2.6 KiB
Swift

//
// DetailStatusBarView.swift
// Evergreen
//
// Created by Brent Simmons on 12/16/17.
// Copyright © 2017 Ranchero Software. All rights reserved.
//
import AppKit
import DB5
import Data
final class DetailStatusBarView: NSView {
@IBOutlet var urlLabel: NSTextField!
private var didConfigureLayer = false
private var mouseoverLink: String? {
didSet {
updateLinkForDisplay()
}
}
private var linkForDisplay: String? {
didSet {
needsLayout = true
if let link = linkForDisplay {
urlLabel.stringValue = link
self.isHidden = false
}
else {
urlLabel.stringValue = ""
self.isHidden = true
}
}
}
override var isOpaque: Bool {
return false
}
override var isFlipped: Bool {
return true
}
override var wantsUpdateLayer: Bool {
return true
}
override func updateLayer() {
guard !didConfigureLayer else {
return
}
if let layer = layer {
let color = appDelegate.currentTheme.color(forKey: "MainWindow.Detail.statusBar.backgroundColor")
layer.backgroundColor = color.cgColor
layer.cornerRadius = 4.0
didConfigureLayer = true
}
}
override func awakeFromNib() {
NotificationCenter.default.addObserver(self, selector: #selector(timelineSelectionDidChange(_:)), name: .TimelineSelectionDidChange, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(mouseDidEnterLink(_:)), name: .MouseDidEnterLink, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(mouseDidExitLink(_:)), name: .MouseDidExitLink, object: nil)
alphaValue = 0.9
}
// MARK: - Notifications
@objc func mouseDidEnterLink(_ notification: Notification) {
guard let userInfo = notification.userInfo, let view = userInfo[UserInfoKey.view] as? NSView, window === view.window else {
return
}
guard let link = userInfo[UserInfoKey.url] as? String else {
return
}
mouseoverLink = link
}
@objc func mouseDidExitLink(_ notification: Notification) {
guard let view = notification.userInfo?[UserInfoKey.view] as? NSView, window === view.window else {
return
}
mouseoverLink = nil
}
@objc func timelineSelectionDidChange(_ notification: Notification) {
guard let view = notification.userInfo?[UserInfoKey.view] as? NSView, window === view.window else {
return
}
mouseoverLink = nil
}
}
private extension DetailStatusBarView {
// MARK: URL Label
func updateLinkForDisplay() {
if let mouseoverLink = mouseoverLink, !mouseoverLink.isEmpty {
linkForDisplay = (mouseoverLink as NSString).rs_stringByStrippingHTTPOrHTTPSScheme()
}
else {
linkForDisplay = nil
}
}
}