mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2025-02-09 08:39:00 +01:00
Add feed icons
This commit is contained in:
parent
61ad0fbfa4
commit
835b04c53d
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 SwiftUI
|
||||||
|
import Account
|
||||||
|
|
||||||
struct SidebarItemView: View {
|
struct SidebarItemView: View {
|
||||||
|
|
||||||
|
@StateObject var feedImageLoader = FeedImageLoader()
|
||||||
var sidebarItem: SidebarItem
|
var sidebarItem: SidebarItem
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
HStack {
|
HStack {
|
||||||
|
if let image = feedImageLoader.image {
|
||||||
|
IconImageView(iconImage: image)
|
||||||
|
}
|
||||||
Text(verbatim: sidebarItem.nameForDisplay)
|
Text(verbatim: sidebarItem.nameForDisplay)
|
||||||
Spacer()
|
Spacer()
|
||||||
if sidebarItem.unreadCount > 0 {
|
if sidebarItem.unreadCount > 0 {
|
||||||
UnreadCountView(count: sidebarItem.unreadCount)
|
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 {
|
var body: some View {
|
||||||
Text(verbatim: String(count))
|
Text(verbatim: String(count))
|
||||||
|
.font(.footnote)
|
||||||
.padding(.horizontal, 7)
|
.padding(.horizontal, 7)
|
||||||
|
.padding(.vertical, 1)
|
||||||
.background(SwiftUI.Color.gray.opacity(0.5))
|
.background(SwiftUI.Color.gray.opacity(0.5))
|
||||||
.cornerRadius(8)
|
.cornerRadius(8)
|
||||||
}
|
}
|
||||||
|
@ -212,6 +212,10 @@
|
|||||||
51919FAD24AA8CCA00541E64 /* UnreadCountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51919FAB24AA8CCA00541E64 /* UnreadCountView.swift */; };
|
51919FAD24AA8CCA00541E64 /* UnreadCountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51919FAB24AA8CCA00541E64 /* UnreadCountView.swift */; };
|
||||||
51919FAF24AA8EFA00541E64 /* SidebarItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51919FAE24AA8EFA00541E64 /* SidebarItemView.swift */; };
|
51919FAF24AA8EFA00541E64 /* SidebarItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51919FAE24AA8EFA00541E64 /* SidebarItemView.swift */; };
|
||||||
51919FB024AA8EFA00541E64 /* SidebarItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51919FAE24AA8EFA00541E64 /* SidebarItemView.swift */; };
|
51919FB024AA8EFA00541E64 /* SidebarItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51919FAE24AA8EFA00541E64 /* SidebarItemView.swift */; };
|
||||||
|
51919FB324AAB97900541E64 /* FeedImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51919FB224AAB97900541E64 /* FeedImageLoader.swift */; };
|
||||||
|
51919FB424AAB97900541E64 /* FeedImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51919FB224AAB97900541E64 /* FeedImageLoader.swift */; };
|
||||||
|
51919FB624AABCA100541E64 /* IconImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51919FB524AABCA100541E64 /* IconImageView.swift */; };
|
||||||
|
51919FB724AABCA100541E64 /* IconImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51919FB524AABCA100541E64 /* IconImageView.swift */; };
|
||||||
51934CCB230F599B006127BE /* InteractiveNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51934CC1230F5963006127BE /* InteractiveNavigationController.swift */; };
|
51934CCB230F599B006127BE /* InteractiveNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51934CC1230F5963006127BE /* InteractiveNavigationController.swift */; };
|
||||||
51934CCE2310792F006127BE /* ActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51934CCD2310792F006127BE /* ActivityManager.swift */; };
|
51934CCE2310792F006127BE /* ActivityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51934CCD2310792F006127BE /* ActivityManager.swift */; };
|
||||||
51938DF2231AFC660055A1A0 /* SearchTimelineFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51938DF1231AFC660055A1A0 /* SearchTimelineFeedDelegate.swift */; };
|
51938DF2231AFC660055A1A0 /* SearchTimelineFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51938DF1231AFC660055A1A0 /* SearchTimelineFeedDelegate.swift */; };
|
||||||
@ -1803,6 +1807,8 @@
|
|||||||
51919FA524AA64B000541E64 /* SidebarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarView.swift; sourceTree = "<group>"; };
|
51919FA524AA64B000541E64 /* SidebarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarView.swift; sourceTree = "<group>"; };
|
||||||
51919FAB24AA8CCA00541E64 /* UnreadCountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnreadCountView.swift; sourceTree = "<group>"; };
|
51919FAB24AA8CCA00541E64 /* UnreadCountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnreadCountView.swift; sourceTree = "<group>"; };
|
||||||
51919FAE24AA8EFA00541E64 /* SidebarItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarItemView.swift; sourceTree = "<group>"; };
|
51919FAE24AA8EFA00541E64 /* SidebarItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarItemView.swift; sourceTree = "<group>"; };
|
||||||
|
51919FB224AAB97900541E64 /* FeedImageLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedImageLoader.swift; sourceTree = "<group>"; };
|
||||||
|
51919FB524AABCA100541E64 /* IconImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconImageView.swift; sourceTree = "<group>"; };
|
||||||
51934CC1230F5963006127BE /* InteractiveNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InteractiveNavigationController.swift; sourceTree = "<group>"; };
|
51934CC1230F5963006127BE /* InteractiveNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InteractiveNavigationController.swift; sourceTree = "<group>"; };
|
||||||
51934CCD2310792F006127BE /* ActivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityManager.swift; sourceTree = "<group>"; };
|
51934CCD2310792F006127BE /* ActivityManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityManager.swift; sourceTree = "<group>"; };
|
||||||
51938DF1231AFC660055A1A0 /* SearchTimelineFeedDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchTimelineFeedDelegate.swift; sourceTree = "<group>"; };
|
51938DF1231AFC660055A1A0 /* SearchTimelineFeedDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchTimelineFeedDelegate.swift; sourceTree = "<group>"; };
|
||||||
@ -2571,6 +2577,15 @@
|
|||||||
path = NNW3;
|
path = NNW3;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
51919FB124AAB95300541E64 /* Images */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
51919FB224AAB97900541E64 /* FeedImageLoader.swift */,
|
||||||
|
51919FB524AABCA100541E64 /* IconImageView.swift */,
|
||||||
|
);
|
||||||
|
path = Images;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
51934CCC231078DC006127BE /* Activity */ = {
|
51934CCC231078DC006127BE /* Activity */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@ -2635,6 +2650,7 @@
|
|||||||
51E4992824A866F000B667CB /* AppDefaults.swift */,
|
51E4992824A866F000B667CB /* AppDefaults.swift */,
|
||||||
51E4995824A873F900B667CB /* ErrorHandler.swift */,
|
51E4995824A873F900B667CB /* ErrorHandler.swift */,
|
||||||
51C0513824A77DF800194D5E /* Assets.xcassets */,
|
51C0513824A77DF800194D5E /* Assets.xcassets */,
|
||||||
|
51919FB124AAB95300541E64 /* Images */,
|
||||||
51E499FB24A9135A00B667CB /* Sidebar */,
|
51E499FB24A9135A00B667CB /* Sidebar */,
|
||||||
);
|
);
|
||||||
path = Shared;
|
path = Shared;
|
||||||
@ -4688,6 +4704,7 @@
|
|||||||
51E4994224A8713C00B667CB /* ArticleStatusSyncTimer.swift in Sources */,
|
51E4994224A8713C00B667CB /* ArticleStatusSyncTimer.swift in Sources */,
|
||||||
51E498F624A8085D00B667CB /* SearchFeedDelegate.swift in Sources */,
|
51E498F624A8085D00B667CB /* SearchFeedDelegate.swift in Sources */,
|
||||||
51E498F224A8085D00B667CB /* SmartFeedsController.swift in Sources */,
|
51E498F224A8085D00B667CB /* SmartFeedsController.swift in Sources */,
|
||||||
|
51919FB624AABCA100541E64 /* IconImageView.swift in Sources */,
|
||||||
51919FA624AA64B000541E64 /* SidebarView.swift in Sources */,
|
51919FA624AA64B000541E64 /* SidebarView.swift in Sources */,
|
||||||
51E4997024A8764C00B667CB /* ActivityManager.swift in Sources */,
|
51E4997024A8764C00B667CB /* ActivityManager.swift in Sources */,
|
||||||
51E4990F24A808CC00B667CB /* HTMLMetadataDownloader.swift in Sources */,
|
51E4990F24A808CC00B667CB /* HTMLMetadataDownloader.swift in Sources */,
|
||||||
@ -4700,6 +4717,7 @@
|
|||||||
51E4997124A8764C00B667CB /* ActivityType.swift in Sources */,
|
51E4997124A8764C00B667CB /* ActivityType.swift in Sources */,
|
||||||
51E4991E24A8094300B667CB /* RSImage-AppIcons.swift in Sources */,
|
51E4991E24A8094300B667CB /* RSImage-AppIcons.swift in Sources */,
|
||||||
51E499D824A912C200B667CB /* SceneModel.swift in Sources */,
|
51E499D824A912C200B667CB /* SceneModel.swift in Sources */,
|
||||||
|
51919FB324AAB97900541E64 /* FeedImageLoader.swift in Sources */,
|
||||||
51E4991324A808FB00B667CB /* AddWebFeedDefaultContainer.swift in Sources */,
|
51E4991324A808FB00B667CB /* AddWebFeedDefaultContainer.swift in Sources */,
|
||||||
51E4993C24A8709900B667CB /* AppDelegate.swift in Sources */,
|
51E4993C24A8709900B667CB /* AppDelegate.swift in Sources */,
|
||||||
51E498F924A8085D00B667CB /* SmartFeed.swift in Sources */,
|
51E498F924A8085D00B667CB /* SmartFeed.swift in Sources */,
|
||||||
@ -4727,6 +4745,7 @@
|
|||||||
51E4993A24A8708800B667CB /* AppDelegate.swift in Sources */,
|
51E4993A24A8708800B667CB /* AppDelegate.swift in Sources */,
|
||||||
51E498CE24A8085D00B667CB /* UnreadFeed.swift in Sources */,
|
51E498CE24A8085D00B667CB /* UnreadFeed.swift in Sources */,
|
||||||
51E498C724A8085D00B667CB /* StarredFeedDelegate.swift in Sources */,
|
51E498C724A8085D00B667CB /* StarredFeedDelegate.swift in Sources */,
|
||||||
|
51919FB724AABCA100541E64 /* IconImageView.swift in Sources */,
|
||||||
51E498FA24A808BA00B667CB /* SingleFaviconDownloader.swift in Sources */,
|
51E498FA24A808BA00B667CB /* SingleFaviconDownloader.swift in Sources */,
|
||||||
51E4993F24A8713B00B667CB /* ArticleStatusSyncTimer.swift in Sources */,
|
51E4993F24A8713B00B667CB /* ArticleStatusSyncTimer.swift in Sources */,
|
||||||
51E4993724A8680E00B667CB /* Reachability.swift in Sources */,
|
51E4993724A8680E00B667CB /* Reachability.swift in Sources */,
|
||||||
@ -4762,6 +4781,7 @@
|
|||||||
51E498FC24A808BA00B667CB /* FaviconURLFinder.swift in Sources */,
|
51E498FC24A808BA00B667CB /* FaviconURLFinder.swift in Sources */,
|
||||||
51E4991C24A8092000B667CB /* NSAttributedString+NetNewsWire.swift in Sources */,
|
51E4991C24A8092000B667CB /* NSAttributedString+NetNewsWire.swift in Sources */,
|
||||||
51E499D924A912C200B667CB /* SceneModel.swift in Sources */,
|
51E499D924A912C200B667CB /* SceneModel.swift in Sources */,
|
||||||
|
51919FB424AAB97900541E64 /* FeedImageLoader.swift in Sources */,
|
||||||
51E4994A24A8734C00B667CB /* ExtensionPointManager.swift in Sources */,
|
51E4994A24A8734C00B667CB /* ExtensionPointManager.swift in Sources */,
|
||||||
51E4996D24A8762D00B667CB /* ArticleExtractor.swift in Sources */,
|
51E4996D24A8762D00B667CB /* ArticleExtractor.swift in Sources */,
|
||||||
51E4994024A8713B00B667CB /* AccountRefreshTimer.swift in Sources */,
|
51E4994024A8713B00B667CB /* AccountRefreshTimer.swift in Sources */,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user