From 4052f85e10517f98b04e96a376ee25c3e7d138f2 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 25 Nov 2017 21:27:35 -0800 Subject: [PATCH] Add avatar and featuredImage to TimelineCellData. --- Evergreen.xcodeproj/project.pbxproj | 2 +- .../Timeline/Cell/TimelineCellData.swift | 11 +++- .../Timeline/TimelineViewController.swift | 57 ++++++++++++++++++- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/Evergreen.xcodeproj/project.pbxproj b/Evergreen.xcodeproj/project.pbxproj index cab6f3f40..6c76994be 100644 --- a/Evergreen.xcodeproj/project.pbxproj +++ b/Evergreen.xcodeproj/project.pbxproj @@ -654,10 +654,10 @@ children = ( 849A97621ED9EB96007D329B /* SidebarViewController.swift */, 849A97601ED9EB96007D329B /* SidebarOutlineView.swift */, - 845A29251FC928C7007B49E3 /* Cell */, 849A97611ED9EB96007D329B /* SidebarTreeControllerDelegate.swift */, 849A97631ED9EB96007D329B /* UnreadCountView.swift */, 845F52EC1FB2B9FC00C10BF0 /* FeedPasteboardWriter.swift */, + 845A29251FC928C7007B49E3 /* Cell */, ); path = Sidebar; sourceTree = ""; diff --git a/Evergreen/MainWindow/Timeline/Cell/TimelineCellData.swift b/Evergreen/MainWindow/Timeline/Cell/TimelineCellData.swift index ced5867fe..f06a64f2d 100644 --- a/Evergreen/MainWindow/Timeline/Cell/TimelineCellData.swift +++ b/Evergreen/MainWindow/Timeline/Cell/TimelineCellData.swift @@ -24,9 +24,11 @@ struct TimelineCellData { let attributedFeedName: NSAttributedString let showFeedName: Bool let favicon: NSImage? + let avatar: NSImage? // feed or user avatar + let featuredImage: NSImage? // image from within the article let read: Bool - init(article: Article, appearance: TimelineCellAppearance, showFeedName: Bool) { + init(article: Article, appearance: TimelineCellAppearance, showFeedName: Bool, favicon: NSImage?, avatar: NSImage?, featuredImage: NSImage?) { self.title = timelineTruncatedTitle(article) self.text = timelineTruncatedSummary(article) @@ -65,7 +67,10 @@ struct TimelineCellData { self.showFeedName = showFeedName - self.favicon = nil + self.favicon = favicon + self.avatar = avatar + self.featuredImage = featuredImage + self.read = article.status.read } @@ -80,6 +85,8 @@ struct TimelineCellData { self.attributedFeedName = NSAttributedString(string: "") self.showFeedName = false self.favicon = nil + self.avatar = nil + self.featuredImage = nil self.read = true } diff --git a/Evergreen/MainWindow/Timeline/TimelineViewController.swift b/Evergreen/MainWindow/Timeline/TimelineViewController.swift index 9ace0b11b..02a4a1e49 100644 --- a/Evergreen/MainWindow/Timeline/TimelineViewController.swift +++ b/Evergreen/MainWindow/Timeline/TimelineViewController.swift @@ -319,7 +319,7 @@ class TimelineViewController: NSViewController, KeyboardDelegate, UndoableComman let status = ArticleStatus(articleID: prototypeID, read: false, starred: false, userDeleted: false, dateArrived: Date()) let prototypeArticle = Article(accountID: prototypeID, articleID: prototypeID, feedID: prototypeID, uniqueID: prototypeID, title: longTitle, contentHTML: nil, contentText: nil, url: nil, externalURL: nil, summary: nil, imageURL: nil, bannerImageURL: nil, datePublished: nil, dateModified: nil, authors: nil, tags: nil, attachments: nil, status: status) - let prototypeCellData = TimelineCellData(article: prototypeArticle, appearance: cellAppearance, showFeedName: false) + let prototypeCellData = TimelineCellData(article: prototypeArticle, appearance: cellAppearance, showFeedName: false, favicon: nil, avatar: nil, featuredImage: nil) let height = timelineCellHeight(100, cellData: prototypeCellData, appearance: cellAppearance) return height } @@ -410,7 +410,60 @@ extension TimelineViewController: NSTableViewDelegate { private func configureTimelineCell(_ cell: TimelineTableCellView, article: Article) { cell.objectValue = article - cell.cellData = TimelineCellData(article: article, appearance: cellAppearance, showFeedName: showFeedNames) + + let favicon = faviconFor(article) + let avatar = avatarFor(article) + let featuredImage = featuredImageFor(article) + + cell.cellData = TimelineCellData(article: article, appearance: cellAppearance, showFeedName: showFeedNames, favicon: favicon, avatar: avatar, featuredImage: featuredImage) + } + + private func faviconFor(_ article: Article) -> NSImage? { + + guard let feed = article.feed else { + return nil + } + return appDelegate.faviconDownloader.favicon(for: feed) + } + + private func avatarFor(_ article: Article) -> NSImage? { + + if let authors = article.authors { + for author in authors { + if let image = avatarForAuthor(author) { + return image + } + } + } + + guard let feed = article.feed else { + return nil + } + + // TODO: make Feed know about its authors. + // https://github.com/brentsimmons/Evergreen/issues/212 + + if let iconURL = feed.iconURL { + return appDelegate.imageDownloader.image(for: iconURL) + } + + return nil + } + + private func avatarForAuthor(_ author: Author) -> NSImage? { + + if let url = author.avatarURL { + return appDelegate.imageDownloader.image(for: url) + } + return nil + } + + private func featuredImageFor(_ article: Article) -> NSImage? { + + if let url = article.imageURL { + return appDelegate.imageDownloader.image(for: url) + } + return nil } private func makeTimelineCellEmpty(_ cell: TimelineTableCellView) {