Add unread counts to Sidebar

This commit is contained in:
Maurice Parker
2020-06-29 16:58:10 -05:00
parent 29b5f426fd
commit 61ad0fbfa4
7 changed files with 99 additions and 5 deletions

View File

@@ -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()

View File

@@ -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) {

View 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)
}
}
}
}

View File

@@ -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 })
}
}

View File

@@ -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)
}
}
}

View 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)
}
}