From c5e6658e5bd6fd9b904d78a4ed6675b62002ed0f Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 9 Mar 2023 20:12:19 -0600 Subject: [PATCH] Fix mark as read on scroll --- .../Timeline/TimelineViewController.swift | 44 ++++--------------- 1 file changed, 9 insertions(+), 35 deletions(-) diff --git a/Mac/MainWindow/Timeline/TimelineViewController.swift b/Mac/MainWindow/Timeline/TimelineViewController.swift index b7e55b9f4..8f6c57f04 100644 --- a/Mac/MainWindow/Timeline/TimelineViewController.swift +++ b/Mac/MainWindow/Timeline/TimelineViewController.swift @@ -141,11 +141,6 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner, Unr var undoableCommands = [UndoableCommand]() - var articlesWithManuallyChangedReadStatus: Set
= Set() - private var firstVisibleRowIndexWhenDraggingBegan: Int = 0 - - private var isScrolling = false - private var fetchSerialNumber = 0 private let fetchRequestQueue = FetchRequestQueue() private var exceptionArticleFetcher: ArticleFetcher? @@ -231,6 +226,7 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner, Unr NotificationCenter.default.addObserver(self, selector: #selector(userDefaultsDidChange(_:)), name: UserDefaults.didChangeNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(markStatusCommandDidDirectMarking(_:)), name: .MarkStatusCommandDidDirectMarking, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(markStatusCommandDidUndoDirectMarking(_:)), name: .MarkStatusCommandDidUndoDirectMarking, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(scrollViewDidScroll), name: NSScrollView.didLiveScrollNotification, object: tableView.enclosingScrollView) didRegisterForNotifications = true } } @@ -341,44 +337,22 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner, Unr } } - @objc func scrollViewDidScroll(notification: Notification){ - if isScrolling { - scrollPositionQueue.add(self, #selector(scrollPositionDidChange)) - } - } - - @objc func scrollViewWillStartLiveScroll(notification: Notification){ - isScrolling = true - firstVisibleRowIndexWhenDraggingBegan = tableView.rows(in: tableView.visibleRect).location - } - - @objc func scrollViewDidEndLiveScroll(notification: Notification){ - isScrolling = false - } - - @objc func scrollPositionDidChange(){ - if !AppDefaults.shared.markArticlesAsReadOnScroll { - return - } + @objc func scrollViewDidScroll(notification: Notification) { + guard AppDefaults.shared.markArticlesAsReadOnScroll else { return } - // Mark articles scrolled out of sight at the top as read let firstVisibleRowIndex = tableView.rows(in: tableView.visibleRect).location - let unreadArticlesScrolledAway = articles.articlesBetween( - upperPosition: firstVisibleRowIndexWhenDraggingBegan, lowerPosition: firstVisibleRowIndex).filter { !$0.status.read && !articlesWithManuallyChangedReadStatus.contains($0) } - - if unreadArticlesScrolledAway.isEmpty { return } - - guard let undoManager = undoManager, let markReadCommand = MarkStatusCommand(initialArticles: unreadArticlesScrolledAway, markingRead: true, directlyMarked: false, undoManager: undoManager) else { + guard let article = articles.articleAtRow(firstVisibleRowIndex - 1), + article.status.read == false, + !directlyMarkedAsUnreadArticles.contains(article), + let undoManager = undoManager, + let markReadCommand = MarkStatusCommand(initialArticles: [article], markingRead: true, directlyMarked: false, undoManager: undoManager) else { return } + runCommand(markReadCommand) } - func resetMarkAsReadOnScroll() { - articlesWithManuallyChangedReadStatus.removeAll() - } - @IBAction func toggleStatusOfSelectedArticles(_ sender: Any?) { guard !selectedArticles.isEmpty else { return