Fix mark as read on scroll

This commit is contained in:
Maurice Parker
2023-03-09 20:12:19 -06:00
parent 986260b101
commit c5e6658e5b

View File

@@ -141,11 +141,6 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner, Unr
var undoableCommands = [UndoableCommand]()
var articlesWithManuallyChangedReadStatus: Set<Article> = 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