Merge branch 'main' into localize_strings

# Conflicts:
#	Shared/Timer/AccountRefreshTimer.swift
This commit is contained in:
Stuart Breckenridge
2023-01-04 15:17:14 +08:00
22 changed files with 593 additions and 142 deletions

View File

@@ -84,6 +84,56 @@ extension SidebarViewController {
runCommand(markReadCommand)
}
@objc func markObjectsReadOlderThanOneDayFromContextualMenu(_ sender: Any?) {
return markObjectsReadBetweenDatesFromContextualMenu(before: Calendar.current.date(byAdding: .day, value: -1, to: Date()), after: nil, sender: sender)
}
@objc func markObjectsReadOlderThanTwoDaysFromContextualMenu(_ sender: Any?) {
return markObjectsReadBetweenDatesFromContextualMenu(before: Calendar.current.date(byAdding: .day, value: -2, to: Date()), after: nil, sender: sender)
}
@objc func markObjectsReadOlderThanThreeDaysFromContextualMenu(_ sender: Any?) {
return markObjectsReadBetweenDatesFromContextualMenu(before: Calendar.current.date(byAdding: .day, value: -3, to: Date()), after: nil, sender: sender)
}
@objc func markObjectsReadOlderThanOneWeekFromContextualMenu(_ sender: Any?) {
return markObjectsReadBetweenDatesFromContextualMenu(before: Calendar.current.date(byAdding: .weekOfYear, value: -1, to: Date()), after: nil, sender: sender)
}
@objc func markObjectsReadOlderThanTwoWeeksFromContextualMenu(_ sender: Any?) {
return markObjectsReadBetweenDatesFromContextualMenu(before: Calendar.current.date(byAdding: .weekOfYear, value: -2, to: Date()), after: nil, sender: sender)
}
@objc func markObjectsReadOlderThanOneMonthFromContextualMenu(_ sender: Any?) {
return markObjectsReadBetweenDatesFromContextualMenu(before: Calendar.current.date(byAdding: .month, value: -1, to: Date()), after: nil, sender: sender)
}
@objc func markObjectsReadOlderThanOneYearFromContextualMenu(_ sender: Any?) {
return markObjectsReadBetweenDatesFromContextualMenu(before: Calendar.current.date(byAdding: .year, value: -1, to: Date()), after: nil, sender: sender)
}
func markObjectsReadBetweenDatesFromContextualMenu(before: Date?, after: Date?, sender: Any?) {
guard let menuItem = sender as? NSMenuItem, let objects = menuItem.representedObject as? [Any] else {
return
}
var markableArticles = unreadArticlesBetween(for: objects, before: before, after: after)
if let directlyMarkedAsUnreadArticles = delegate?.directlyMarkedAsUnreadArticles {
markableArticles = markableArticles.subtracting(directlyMarkedAsUnreadArticles)
}
guard let undoManager = undoManager,
let markReadCommand = MarkStatusCommand(initialArticles: markableArticles,
markingRead: true,
directlyMarked: false,
undoManager: undoManager) else {
return
}
runCommand(markReadCommand)
}
@objc func deleteFromContextualMenu(_ sender: Any?) {
guard let menuItem = sender as? NSMenuItem, let objects = menuItem.representedObject as? [AnyObject] else {
return
@@ -220,6 +270,12 @@ private extension SidebarViewController {
if webFeed.unreadCount > 0 {
menu.addItem(markAllReadMenuItem([webFeed]))
let catchUpMenuItem = NSMenuItem(title: NSLocalizedString("Mark as Read Older Than", comment: "Command Submenu"), action: nil, keyEquivalent: "")
let catchUpSubMenu = catchUpSubMenu([webFeed])
menu.addItem(catchUpMenuItem)
menu.setSubmenu(catchUpSubMenu, for: catchUpMenuItem)
menu.addItem(NSMenuItem.separator())
}
@@ -276,6 +332,11 @@ private extension SidebarViewController {
if folder.unreadCount > 0 {
menu.addItem(markAllReadMenuItem([folder]))
let catchUpMenuItem = NSMenuItem(title: NSLocalizedString("Mark as Read Older Than", comment: "Command Submenu"), action: nil, keyEquivalent: "")
let catchUpSubMenu = catchUpSubMenu([folder])
menu.addItem(catchUpMenuItem)
menu.setSubmenu(catchUpSubMenu, for: catchUpMenuItem)
menu.addItem(NSMenuItem.separator())
}
@@ -291,6 +352,18 @@ private extension SidebarViewController {
if smartFeed.unreadCount > 0 {
menu.addItem(markAllReadMenuItem([smartFeed]))
// Doesn't make sense to mark articles newer than a day with catch up with first option being older than a day
if let maybeSmartFeed = smartFeed as? SmartFeed {
if maybeSmartFeed.delegate is TodayFeedDelegate {
return menu
}
}
let catchUpMenuItem = NSMenuItem(title: NSLocalizedString("Mark as Read Older Than", comment: "Command Submenu"), action: nil, keyEquivalent: "")
let catchUpSubMenu = catchUpSubMenu([smartFeed])
menu.addItem(catchUpMenuItem)
menu.setSubmenu(catchUpSubMenu, for: catchUpMenuItem)
}
return menu.numberOfItems > 0 ? menu : nil
}
@@ -301,6 +374,11 @@ private extension SidebarViewController {
if anyObjectInArrayHasNonZeroUnreadCount(objects) {
menu.addItem(markAllReadMenuItem(objects))
let catchUpMenuItem = NSMenuItem(title: NSLocalizedString("Mark as Read Older Than", comment: "Command Submenu"), action: nil, keyEquivalent: "")
let catchUpSubMenu = catchUpSubMenu(objects)
menu.addItem(catchUpMenuItem)
menu.setSubmenu(catchUpSubMenu, for: catchUpMenuItem)
}
if allObjectsAreFeedsAndOrFolders(objects) {
@@ -316,6 +394,20 @@ private extension SidebarViewController {
return menuItem(NSLocalizedString("button.title.mark-all-as-read.titlecase", comment: "Mark All as Read"), #selector(markObjectsReadFromContextualMenu(_:)), objects)
}
func catchUpSubMenu(_ objects: [Any]) -> NSMenu {
let menu = NSMenu(title: "Catch up to articles older than...")
menu.addItem(menuItem(NSLocalizedString("1 day", comment: "Command"), #selector(markObjectsReadOlderThanOneDayFromContextualMenu(_:)), objects))
menu.addItem(menuItem(NSLocalizedString("2 days", comment: "Command"), #selector(markObjectsReadOlderThanTwoDaysFromContextualMenu(_:)), objects))
menu.addItem(menuItem(NSLocalizedString("3 days", comment: "Command"), #selector(markObjectsReadOlderThanThreeDaysFromContextualMenu(_:)), objects))
menu.addItem(menuItem(NSLocalizedString("1 week", comment: "Command"), #selector(markObjectsReadOlderThanOneWeekFromContextualMenu(_:)), objects))
menu.addItem(menuItem(NSLocalizedString("2 weeks", comment: "Command"), #selector(markObjectsReadOlderThanTwoWeeksFromContextualMenu(_:)), objects))
menu.addItem(menuItem(NSLocalizedString("1 month", comment: "Command"), #selector(markObjectsReadOlderThanOneMonthFromContextualMenu(_:)), objects))
menu.addItem(menuItem(NSLocalizedString("1 year", comment: "Command"), #selector(markObjectsReadOlderThanOneYearFromContextualMenu(_:)), objects))
return menu
}
func deleteMenuItem(_ objects: [Any]) -> NSMenuItem {
return menuItem(NSLocalizedString("button.title.delete", comment: "Delete"), #selector(deleteFromContextualMenu(_:)), objects)
@@ -373,5 +465,18 @@ private extension SidebarViewController {
}
return articles
}
func unreadArticlesBetween(for objects: [Any], before: Date?, after: Date?) -> Set<Article> {
var articles = Set<Article>()
for object in objects {
if let articleFetcher = object as? ArticleFetcher {
if let unreadArticles = try? articleFetcher.fetchUnreadArticlesBetween(before: before, after: after) {
articles.formUnion(unreadArticles)
}
}
}
return articles
}
}