mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Add feed icons
This commit is contained in:
58
Multiplatform/Shared/Images/FeedImageLoader.swift
Normal file
58
Multiplatform/Shared/Images/FeedImageLoader.swift
Normal 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)
|
||||
}
|
||||
|
||||
}
|
||||
37
Multiplatform/Shared/Images/IconImageView.swift
Normal file
37
Multiplatform/Shared/Images/IconImageView.swift
Normal 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))
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user