mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Merge branch 'main' into localize_strings
# Conflicts: # Shared/Timer/AccountRefreshTimer.swift
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user