mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Add unread counts to Sidebar
This commit is contained in:
@@ -18,7 +18,7 @@ struct SceneNavigationView: View {
|
||||
NavigationView {
|
||||
#if os(macOS)
|
||||
RegularSidebarContainerView()
|
||||
.frame(minWidth: 100, idealWidth: 150, maxWidth: 200, maxHeight: .infinity)
|
||||
.frame(minWidth: 100, idealWidth: 150, maxHeight: .infinity)
|
||||
#else
|
||||
if horizontalSizeClass == .compact {
|
||||
CompactSidebarContainerView()
|
||||
|
||||
@@ -47,6 +47,9 @@ struct SidebarItem: Identifiable {
|
||||
self.id = .feed(feed.feedID!)
|
||||
self.represented = feed
|
||||
self.unreadCount = unreadCount
|
||||
if let container = feed as? Container, container.hasAtLeastOneWebFeed() {
|
||||
self.children = [SidebarItem]()
|
||||
}
|
||||
}
|
||||
|
||||
mutating func addChild(_ sidebarItem: SidebarItem) {
|
||||
|
||||
25
Multiplatform/Shared/Sidebar/SidebarItemView.swift
Normal file
25
Multiplatform/Shared/Sidebar/SidebarItemView.swift
Normal file
@@ -0,0 +1,25 @@
|
||||
//
|
||||
// SidebarItemView.swift
|
||||
// NetNewsWire
|
||||
//
|
||||
// Created by Maurice Parker on 6/29/20.
|
||||
// Copyright © 2020 Ranchero Software. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct SidebarItemView: View {
|
||||
|
||||
var sidebarItem: SidebarItem
|
||||
|
||||
var body: some View {
|
||||
HStack {
|
||||
Text(verbatim: sidebarItem.nameForDisplay)
|
||||
Spacer()
|
||||
if sidebarItem.unreadCount > 0 {
|
||||
UnreadCountView(count: sidebarItem.unreadCount)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -7,6 +7,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import RSCore
|
||||
import Account
|
||||
|
||||
protocol SidebarModelDelegate: class {
|
||||
@@ -20,6 +21,12 @@ class SidebarModel: ObservableObject {
|
||||
|
||||
@Published var sidebarItems = [SidebarItem]()
|
||||
|
||||
init() {
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidInitialize(_:)), name: .UnreadCountDidInitialize, object: nil)
|
||||
}
|
||||
|
||||
// MARK: API
|
||||
|
||||
func rebuildSidebarItems() {
|
||||
guard let delegate = delegate else { return }
|
||||
var items = [SidebarItem]()
|
||||
@@ -33,13 +40,13 @@ class SidebarModel: ObservableObject {
|
||||
for account in AccountManager.shared.sortedActiveAccounts {
|
||||
var accountItem = SidebarItem(account)
|
||||
|
||||
for webFeed in account.topLevelWebFeeds {
|
||||
for webFeed in sort(account.topLevelWebFeeds) {
|
||||
accountItem.addChild(SidebarItem(webFeed, unreadCount: delegate.unreadCount(for: webFeed)))
|
||||
}
|
||||
|
||||
for folder in account.folders ?? Set<Folder>() {
|
||||
for folder in sort(account.folders ?? Set<Folder>()) {
|
||||
var folderItem = SidebarItem(folder, unreadCount: delegate.unreadCount(for: folder))
|
||||
for webFeed in folder.topLevelWebFeeds {
|
||||
for webFeed in sort(folder.topLevelWebFeeds) {
|
||||
folderItem.addChild(SidebarItem(webFeed, unreadCount: delegate.unreadCount(for: webFeed)))
|
||||
}
|
||||
accountItem.addChild(folderItem)
|
||||
@@ -52,3 +59,23 @@ class SidebarModel: ObservableObject {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: Private
|
||||
private extension SidebarModel {
|
||||
|
||||
@objc func unreadCountDidInitialize(_ notification: Notification) {
|
||||
guard notification.object is AccountManager else {
|
||||
return
|
||||
}
|
||||
rebuildSidebarItems()
|
||||
}
|
||||
|
||||
func sort(_ folders: Set<Folder>) -> [Folder] {
|
||||
return folders.sorted(by: { $0.nameForDisplay.localizedStandardCompare($1.nameForDisplay) == .orderedAscending })
|
||||
}
|
||||
|
||||
func sort(_ feeds: Set<WebFeed>) -> [Feed] {
|
||||
return feeds.sorted(by: { $0.nameForDisplay.localizedStandardCompare($1.nameForDisplay) == .orderedAscending })
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ struct SidebarView: View {
|
||||
var body: some View {
|
||||
List {
|
||||
OutlineGroup(sidebarModel.sidebarItems, children: \.children) { sidebarItem in
|
||||
Text(sidebarItem.nameForDisplay)
|
||||
SidebarItemView(sidebarItem: sidebarItem)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
27
Multiplatform/Shared/Sidebar/UnreadCountView.swift
Normal file
27
Multiplatform/Shared/Sidebar/UnreadCountView.swift
Normal file
@@ -0,0 +1,27 @@
|
||||
//
|
||||
// UnreadCountView.swift
|
||||
// NetNewsWire
|
||||
//
|
||||
// Created by Maurice Parker on 6/29/20.
|
||||
// Copyright © 2020 Ranchero Software. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct UnreadCountView: View {
|
||||
|
||||
var count: Int
|
||||
|
||||
var body: some View {
|
||||
Text(verbatim: String(count))
|
||||
.padding(.horizontal, 7)
|
||||
.background(SwiftUI.Color.gray.opacity(0.5))
|
||||
.cornerRadius(8)
|
||||
}
|
||||
}
|
||||
|
||||
struct UnreadCountView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
UnreadCountView(count: 123)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user