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

@@ -703,35 +703,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
Browser.open("https://netnewswire.com/", inBackground: false)
}
@IBAction func openReleaseNotes(_ sender: Any?) {
Browser.open(URL.releaseNotes.absoluteString, inBackground: false)
}
@IBAction func openHowToSupport(_ sender: Any?) {
Browser.open("https://github.com/brentsimmons/NetNewsWire/blob/main/Technotes/HowToSupportNetNewsWire.markdown", inBackground: false)
}
@IBAction func openRepository(_ sender: Any?) {
Browser.open("https://github.com/brentsimmons/NetNewsWire", inBackground: false)
}
@IBAction func openBugTracker(_ sender: Any?) {
Browser.open("https://github.com/brentsimmons/NetNewsWire/issues", inBackground: false)
}
@IBAction func openSlackGroup(_ sender: Any?) {
Browser.open("https://netnewswire.com/slack", inBackground: false)
}
@IBAction func openTechnotes(_ sender: Any?) {
Browser.open("https://github.com/brentsimmons/NetNewsWire/tree/main/Technotes", inBackground: false)
}
@IBAction func showHelp(_ sender: Any?) {
Browser.open("https://netnewswire.com/help/mac/6.1/en/", inBackground: false)

View File

@@ -646,48 +646,12 @@
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="rK6-cL-4Vj"/>
<menuItem title="Website" id="q2Z-9K-GBd">
<menuItem title="NetNewsWire Website" id="q2Z-9K-GBd">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="openWebsite:" target="Ady-hI-5gd" id="rmL-lt-p8g"/>
</connections>
</menuItem>
<menuItem title="Release Notes" id="b5s-xg-B1w" userLabel="Release Notes">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="openReleaseNotes:" target="Ady-hI-5gd" id="7LS-uW-Yp0"/>
</connections>
</menuItem>
<menuItem title="How To Support NetNewsWire" id="kfC-NQ-g3E">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="openHowToSupport:" target="Ady-hI-5gd" id="SIw-Ug-A4D"/>
</connections>
</menuItem>
<menuItem title="GitHub Repository" id="QfD-Xw-sdF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="openRepository:" target="Ady-hI-5gd" id="7xZ-V2-iPD"/>
</connections>
</menuItem>
<menuItem title="Bug Tracker" id="mE2-pM-rQF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="openBugTracker:" target="Ady-hI-5gd" id="fZQ-ng-gIm"/>
</connections>
</menuItem>
<menuItem title="Technotes" id="Ou5-Cc-iCb">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="openTechnotes:" target="Ady-hI-5gd" id="M7A-Qg-mH8"/>
</connections>
</menuItem>
<menuItem title="Slack Group" id="4eb-qF-n9S">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="openSlackGroup:" target="Ady-hI-5gd" id="YX2-gA-pgV"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>

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