diff --git a/Multiplatform/Shared/SceneModel.swift b/Multiplatform/Shared/SceneModel.swift index ab37e11f2..18226be92 100644 --- a/Multiplatform/Shared/SceneModel.swift +++ b/Multiplatform/Shared/SceneModel.swift @@ -52,7 +52,7 @@ final class SceneModel: ObservableObject { /// Goes to the next unread item found in Sidebar and Timeline order, top to bottom func goToNextUnread() { if !timelineModel.goToNextUnread() { -// timelineModel.isSelectNextUnread = true + timelineModel.selectNextUnreadSubject.send(true) sidebarModel.selectNextUnread.send() } } diff --git a/Multiplatform/Shared/Timeline/TimelineContainerView.swift b/Multiplatform/Shared/Timeline/TimelineContainerView.swift index 134e48983..1b8706b05 100644 --- a/Multiplatform/Shared/Timeline/TimelineContainerView.swift +++ b/Multiplatform/Shared/Timeline/TimelineContainerView.swift @@ -27,8 +27,15 @@ struct TimelineContainerView: View { .onReceive(sceneModel.timelineModel.readFilterAndFeedsPublisher!) { (_, filtered) in isReadFiltered = filtered } - .onReceive(sceneModel.timelineModel.timelineItemsPublisher!) { items in + .onReceive(sceneModel.timelineModel.timelineItemsSelectPublisher!) { (items, selectTimelineItemID) in timelineItems = items + if let selectID = selectTimelineItemID { + #if os(macOS) + sceneModel.timelineModel.selectedTimelineItemIDs = Set([selectID]) + #else + sceneModel.timelineModel.selectedTimelineItemID = selectID + #endif + } } .onReceive(sceneModel.timelineModel.articleStatusChangePublisher!) { articleIDs in articleIDs.forEach { articleID in diff --git a/Multiplatform/Shared/Timeline/TimelineModel.swift b/Multiplatform/Shared/Timeline/TimelineModel.swift index f64110563..8e52d6504 100644 --- a/Multiplatform/Shared/Timeline/TimelineModel.swift +++ b/Multiplatform/Shared/Timeline/TimelineModel.swift @@ -34,6 +34,7 @@ class TimelineModel: ObservableObject, UndoableCommandRunner { } var timelineItemsPublisher: AnyPublisher? + var timelineItemsSelectPublisher: AnyPublisher<(TimelineItems, String?), Never>? var selectedTimelineItemsPublisher: AnyPublisher<[TimelineItem], Never>? var selectedArticlesPublisher: AnyPublisher<[Article], Never>? var articleStatusChangePublisher: AnyPublisher, Never>? @@ -46,7 +47,8 @@ class TimelineModel: ObservableObject, UndoableCommandRunner { var toggleStarredStatusForSelectedArticlesSubject = PassthroughSubject() var openSelectedArticlesInBrowserSubject = PassthroughSubject() var changeReadFilterSubject = PassthroughSubject() - + var selectNextUnreadSubject = PassthroughSubject() + var readFilterEnabledTable = [FeedIdentifier: Bool]() var undoManager: UndoManager? @@ -76,20 +78,22 @@ class TimelineModel: ObservableObject, UndoableCommandRunner { @discardableResult func goToNextUnread() -> Bool { -// var startIndex: Int -// if let firstArticle = selectedArticles.first, let index = timelineItems.firstIndex(where: { $0.article == firstArticle }) { -// startIndex = index -// } else { -// startIndex = 0 -// } -// -// for i in startIndex.. (TimelineItems, String?) in + var selectTimelineItemID: String? = nil + if selectNextUnread { + selectTimelineItemID = timelineItems.items.first(where: { $0.article.status.read == false })?.id + } + return (timelineItems, selectTimelineItemID) + } + .share(replay: 1) + .eraseToAnyPublisher() + + timelineItemsSelectPublisher! + .sink { [weak self] _ in + self?.selectNextUnreadSubject.send(false) + } + .store(in: &cancellables) } func subscribeToArticleSelectionChanges() {