Add feed icons

This commit is contained in:
Maurice Parker
2020-06-29 20:09:11 -05:00
parent 61ad0fbfa4
commit 835b04c53d
5 changed files with 127 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
//
// FeedImageLoader.swift
// NetNewsWire
//
// Created by Maurice Parker on 6/29/20.
// Copyright © 2020 Ranchero Software. All rights reserved.
//
import SwiftUI
import Account
final class FeedImageLoader: ObservableObject {
private var feed: Feed?
@Published var image: IconImage?
init() {
NotificationCenter.default.addObserver(self, selector: #selector(faviconDidBecomeAvailable(_:)), name: .FaviconDidBecomeAvailable, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(webFeedIconDidBecomeAvailable(_:)), name: .WebFeedIconDidBecomeAvailable, object: nil)
}
func loadImage(for feed: Feed) {
self.feed = feed
if let webFeed = feed as? WebFeed {
if let feedIconImage = appDelegate.webFeedIconDownloader.icon(for: webFeed) {
image = feedIconImage
return
}
if let faviconImage = appDelegate.faviconDownloader.faviconAsIcon(for: webFeed) {
image = faviconImage
return
}
}
if let smallIconProvider = feed as? SmallIconProvider {
image = smallIconProvider.smallIcon
}
}
}
private extension FeedImageLoader {
@objc func faviconDidBecomeAvailable(_ note: Notification) {
guard let feed = feed else { return }
loadImage(for: feed)
}
@objc func webFeedIconDidBecomeAvailable(_ note: Notification) {
guard let feed = feed as? WebFeed, let noteFeed = note.userInfo?[UserInfoKey.webFeed] as? WebFeed, feed == noteFeed else {
return
}
loadImage(for: feed)
}
}

View File

@@ -0,0 +1,37 @@
//
// IconImageView.swift
// NetNewsWire
//
// Created by Maurice Parker on 6/29/20.
// Copyright © 2020 Ranchero Software. All rights reserved.
//
import SwiftUI
struct IconImageView: View {
var iconImage: IconImage
var body: some View {
#if os(macOS)
return Image(nsImage: iconImage.image)
.resizable()
.scaledToFit()
.frame(width: 20, height: 20, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
.cornerRadius(4)
#endif
#if os(iOS)
return Image(uiImage: iconImage.image)
.resizable()
.scaledToFit()
.frame(width: 20, height: 20, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
.cornerRadius(4)
#endif
}
}
struct IconImageView_Previews: PreviewProvider {
static var previews: some View {
IconImageView(iconImage: IconImage(AppAssets.faviconTemplateImage))
}
}

View File

@@ -7,19 +7,29 @@
//
import SwiftUI
import Account
struct SidebarItemView: View {
@StateObject var feedImageLoader = FeedImageLoader()
var sidebarItem: SidebarItem
var body: some View {
HStack {
if let image = feedImageLoader.image {
IconImageView(iconImage: image)
}
Text(verbatim: sidebarItem.nameForDisplay)
Spacer()
if sidebarItem.unreadCount > 0 {
UnreadCountView(count: sidebarItem.unreadCount)
}
}
.onAppear {
if let feed = sidebarItem.represented as? Feed {
feedImageLoader.loadImage(for: feed)
}
}
}
}

View File

@@ -14,7 +14,9 @@ struct UnreadCountView: View {
var body: some View {
Text(verbatim: String(count))
.font(.footnote)
.padding(.horizontal, 7)
.padding(.vertical, 1)
.background(SwiftUI.Color.gray.opacity(0.5))
.cornerRadius(8)
}