2017-05-27 19:43:27 +02:00
|
|
|
//
|
|
|
|
// StatusBarView.swift
|
|
|
|
// Evergreen
|
|
|
|
//
|
|
|
|
// Created by Brent Simmons on 9/17/16.
|
2017-05-29 22:17:58 +02:00
|
|
|
// Copyright © 2016 Ranchero Software, LLC. All rights reserved.
|
2017-05-27 19:43:27 +02:00
|
|
|
//
|
|
|
|
|
|
|
|
import Cocoa
|
|
|
|
import RSCore
|
2017-09-17 21:22:15 +02:00
|
|
|
import Data
|
2017-05-27 19:43:27 +02:00
|
|
|
import RSWeb
|
|
|
|
|
|
|
|
final class StatusBarView: NSView {
|
|
|
|
|
|
|
|
@IBOutlet var progressIndicator: NSProgressIndicator!
|
|
|
|
@IBOutlet var progressLabel: NSTextField!
|
|
|
|
@IBOutlet var urlLabel: NSTextField!
|
|
|
|
|
|
|
|
fileprivate var isAnimatingProgress = false
|
|
|
|
fileprivate var article: Article? {
|
|
|
|
didSet {
|
|
|
|
updateURLLabel()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override var isFlipped: Bool {
|
|
|
|
get {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override func awakeFromNib() {
|
|
|
|
|
|
|
|
let progressLabelFontSize = progressLabel.font?.pointSize ?? 13.0
|
|
|
|
progressLabel.font = NSFont.monospacedDigitSystemFont(ofSize: progressLabelFontSize, weight: NSFontWeightRegular)
|
|
|
|
progressLabel.stringValue = ""
|
|
|
|
|
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(progressDidChange(_:)), name: .AccountRefreshProgressDidChange, object: nil)
|
|
|
|
|
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(timelineSelectionDidChange(_:)), name: .TimelineSelectionDidChange, object: nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
// MARK: Notifications
|
|
|
|
|
2017-09-17 21:34:10 +02:00
|
|
|
@objc dynamic func progressDidChange(_ notification: Notification) {
|
2017-05-27 19:43:27 +02:00
|
|
|
|
|
|
|
guard let progress = notification.userInfo?[progressKey] as? DownloadProgress else {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
updateProgressIndicator(progress)
|
|
|
|
updateProgressLabel(progress)
|
|
|
|
}
|
|
|
|
|
|
|
|
// MARK: Notifications
|
|
|
|
|
2017-09-17 21:34:10 +02:00
|
|
|
@objc dynamic func timelineSelectionDidChange(_ note: Notification) {
|
2017-05-27 19:43:27 +02:00
|
|
|
|
|
|
|
let timelineView = note.userInfo?[viewKey] as! NSView
|
|
|
|
|
|
|
|
if timelineView.window! === self.window {
|
|
|
|
article = note.userInfo?[articleKey] as? Article
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MARK: Drawing
|
|
|
|
|
|
|
|
private let lineColor = NSColor(calibratedWhite: 0.57, alpha: 1.0)
|
|
|
|
|
|
|
|
override func draw(_ dirtyRect: NSRect) {
|
|
|
|
|
|
|
|
let path = NSBezierPath()
|
|
|
|
path.lineWidth = 1.0
|
|
|
|
path.move(to: NSPoint(x: NSMinX(bounds), y: NSMinY(bounds) + 0.5))
|
|
|
|
path.line(to: NSPoint(x: NSMaxX(bounds), y: NSMinY(bounds) + 0.5))
|
|
|
|
lineColor.set()
|
|
|
|
path.stroke()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private extension StatusBarView {
|
|
|
|
|
|
|
|
// MARK: URL Label
|
|
|
|
|
|
|
|
func updateURLLabel() {
|
|
|
|
|
|
|
|
needsLayout = true
|
|
|
|
|
|
|
|
guard let article = article else {
|
|
|
|
urlLabel.stringValue = ""
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
let s = preferredLink(for: article)
|
|
|
|
if let s = s {
|
|
|
|
urlLabel.stringValue = (s as NSString).rs_stringByStrippingHTTPOrHTTPSScheme()
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
urlLabel.stringValue = ""
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MARK: Progress
|
|
|
|
|
|
|
|
func stopProgressIfNeeded() {
|
|
|
|
|
|
|
|
if !isAnimatingProgress {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
progressIndicator.stopAnimation(self)
|
|
|
|
isAnimatingProgress = false
|
|
|
|
progressIndicator.needsDisplay = true
|
|
|
|
}
|
|
|
|
|
|
|
|
func startProgressIfNeeded() {
|
|
|
|
|
|
|
|
if isAnimatingProgress {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
isAnimatingProgress = true
|
|
|
|
progressIndicator.startAnimation(self)
|
|
|
|
}
|
|
|
|
|
|
|
|
func updateProgressIndicator(_ progress: DownloadProgress) {
|
|
|
|
|
|
|
|
if progress.isComplete {
|
|
|
|
stopProgressIfNeeded()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
startProgressIfNeeded()
|
|
|
|
|
|
|
|
let maxValue = Double(progress.numberOfTasks)
|
|
|
|
if progressIndicator.maxValue != maxValue {
|
|
|
|
progressIndicator.maxValue = maxValue
|
|
|
|
}
|
|
|
|
|
|
|
|
let doubleValue = Double(progress.numberCompleted)
|
|
|
|
if progressIndicator.doubleValue != doubleValue {
|
|
|
|
progressIndicator.doubleValue = doubleValue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func updateProgressLabel(_ progress: DownloadProgress) {
|
|
|
|
|
|
|
|
if progress.isComplete {
|
|
|
|
progressLabel.stringValue = ""
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
let numberOfTasks = progress.numberOfTasks
|
|
|
|
let numberCompleted = progress.numberCompleted
|
|
|
|
|
|
|
|
let formatString = NSLocalizedString("%@ of %@", comment: "Status bar progress")
|
|
|
|
let s = NSString(format: formatString as NSString, NSNumber(value: numberCompleted), NSNumber(value: numberOfTasks))
|
|
|
|
|
|
|
|
progressLabel.stringValue = s as String
|
|
|
|
}
|
|
|
|
}
|