Switch TimelineItems to use an OrderedDictionary

This commit is contained in:
Maurice Parker
2020-07-25 10:31:22 -05:00
parent 882ebbea3e
commit e88e4f65a5
4 changed files with 90 additions and 11 deletions

View File

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

View File

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