mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Switch TimelineItems to use an OrderedDictionary
This commit is contained in:
@@ -30,7 +30,7 @@ class TimelineModel: ObservableObject, UndoableCommandRunner {
|
||||
@Published var selectedTimelineItemID: String? = nil // Don't use directly. Use selectedTimelineItemsPublisher
|
||||
@Published var isReadFiltered: Bool? = nil
|
||||
|
||||
var timelineItemsPublisher: AnyPublisher<[TimelineItem], Never>?
|
||||
var timelineItemsPublisher: AnyPublisher<OrderedDictionary<String, TimelineItem>, Never>?
|
||||
var selectedTimelineItemsPublisher: AnyPublisher<[TimelineItem], Never>?
|
||||
|
||||
var readFilterEnabledTable = [FeedIdentifier: Bool]()
|
||||
@@ -124,9 +124,9 @@ class TimelineModel: ObservableObject, UndoableCommandRunner {
|
||||
return self?.fetchArticles(feeds: feeds) ?? Set<Article>()
|
||||
}
|
||||
.combineLatest(sortDirectionPublisher, groupByPublisher)
|
||||
.compactMap { [weak self] articles, sortDirection, groupBy -> [TimelineItem] in
|
||||
.compactMap { [weak self] articles, sortDirection, groupBy in
|
||||
let sortedArticles = Array(articles).sortedByDate(sortDirection ? .orderedDescending : .orderedAscending, groupByFeed: groupBy)
|
||||
return self?.buildTimelineItems(articles: sortedArticles) ?? [TimelineItem]()
|
||||
return self?.buildTimelineItems(articles: sortedArticles) ?? OrderedDictionary<String, TimelineItem>()
|
||||
}
|
||||
.share(replay: 1)
|
||||
.eraseToAnyPublisher()
|
||||
@@ -284,10 +284,11 @@ private extension TimelineModel {
|
||||
return fetchedArticles
|
||||
}
|
||||
|
||||
func buildTimelineItems(articles: [Article]) -> [TimelineItem] {
|
||||
var items = [TimelineItem]()
|
||||
func buildTimelineItems(articles: [Article]) -> OrderedDictionary<String, TimelineItem> {
|
||||
var items = OrderedDictionary<String, TimelineItem>()
|
||||
for (index, article) in articles.enumerated() {
|
||||
items.append(TimelineItem(index: index, article: article))
|
||||
let item = TimelineItem(index: index, article: article)
|
||||
items[item.id] = item
|
||||
}
|
||||
return items
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import SwiftUI
|
||||
struct TimelineView: View {
|
||||
|
||||
@EnvironmentObject private var timelineModel: TimelineModel
|
||||
@State private var timelineItems = [TimelineItem]()
|
||||
@State private var timelineItems = OrderedDictionary<String, TimelineItem>()
|
||||
@State private var timelineItemFrames = [String: CGRect]()
|
||||
|
||||
@ViewBuilder var body: some View {
|
||||
@@ -38,10 +38,12 @@ struct TimelineView: View {
|
||||
.help(timelineModel.isReadFiltered ?? false ? "Show Read Articles" : "Filter Read Articles")
|
||||
}
|
||||
ScrollViewReader { scrollViewProxy in
|
||||
List(timelineItems, selection: $timelineModel.selectedTimelineItemIDs) { timelineItem in
|
||||
let selected = timelineModel.selectedTimelineItemIDs.contains(timelineItem.article.articleID)
|
||||
TimelineItemView(selected: selected, width: geometryReaderProxy.size.width, timelineItem: timelineItem)
|
||||
.background(TimelineItemFramePreferenceView(timelineItem: timelineItem))
|
||||
List(timelineItems.keys, id: \.self, selection: $timelineModel.selectedTimelineItemIDs) { timelineItemID in
|
||||
if let timelineItem = timelineItems[timelineItemID] {
|
||||
let selected = timelineModel.selectedTimelineItemIDs.contains(timelineItem.article.articleID)
|
||||
TimelineItemView(selected: selected, width: geometryReaderProxy.size.width, timelineItem: timelineItem)
|
||||
.background(TimelineItemFramePreferenceView(timelineItem: timelineItem))
|
||||
}
|
||||
}
|
||||
.onPreferenceChange(TimelineItemFramePreferenceKey.self) { preferences in
|
||||
for pref in preferences {
|
||||
|
||||
Reference in New Issue
Block a user