mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Fix mark as read on scroll
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user