@@ -76,6 +76,19 @@ extension SidebarViewController {
7676 runCommand ( markReadCommand)
7777 }
7878
79+ @objc func markObjectsReadExceptStarredFromContextualMenu( _ sender: Any ? ) {
80+
81+ guard let menuItem = sender as? NSMenuItem , let objects = menuItem. representedObject as? [ Any ] else {
82+ return
83+ }
84+
85+ let articles = unreadUnstarredArticles ( for: objects)
86+ guard let undoManager = undoManager, let markReadCommand = MarkStatusCommand ( initialArticles: Array ( articles) , markingRead: true , undoManager: undoManager) else {
87+ return
88+ }
89+ runCommand ( markReadCommand)
90+ }
91+
7992 @objc func deleteFromContextualMenu( _ sender: Any ? ) {
8093 guard let menuItem = sender as? NSMenuItem , let objects = menuItem. representedObject as? [ AnyObject ] else {
8194 return
@@ -212,6 +225,9 @@ private extension SidebarViewController {
212225
213226 if feed. unreadCount > 0 {
214227 menu. addItem ( markAllReadMenuItem ( [ feed] ) )
228+ if anyObjectHasUnreadUnstarredArticles ( [ feed] ) {
229+ menu. addItem ( markAllAsReadExceptStarredMenuItem ( [ feed] ) )
230+ }
215231 menu. addItem ( NSMenuItem . separator ( ) )
216232 }
217233
@@ -264,6 +280,9 @@ private extension SidebarViewController {
264280
265281 if folder. unreadCount > 0 {
266282 menu. addItem ( markAllReadMenuItem ( [ folder] ) )
283+ if anyObjectHasUnreadUnstarredArticles ( [ folder] ) {
284+ menu. addItem ( markAllAsReadExceptStarredMenuItem ( [ folder] ) )
285+ }
267286 menu. addItem ( NSMenuItem . separator ( ) )
268287 }
269288
@@ -279,6 +298,9 @@ private extension SidebarViewController {
279298
280299 if smartFeed. unreadCount > 0 {
281300 menu. addItem ( markAllReadMenuItem ( [ smartFeed] ) )
301+ if anyObjectHasUnreadUnstarredArticles ( [ smartFeed] ) {
302+ menu. addItem ( markAllAsReadExceptStarredMenuItem ( [ smartFeed] ) )
303+ }
282304 }
283305 return menu. numberOfItems > 0 ? menu : nil
284306 }
@@ -289,6 +311,9 @@ private extension SidebarViewController {
289311
290312 if anyObjectInArrayHasNonZeroUnreadCount ( objects) {
291313 menu. addItem ( markAllReadMenuItem ( objects) )
314+ if anyObjectHasUnreadUnstarredArticles ( objects) {
315+ menu. addItem ( markAllAsReadExceptStarredMenuItem ( objects) )
316+ }
292317 }
293318
294319 if allObjectsAreFeedsAndOrFolders ( objects) {
@@ -304,6 +329,11 @@ private extension SidebarViewController {
304329 return menuItem ( NSLocalizedString ( " Mark All as Read " , comment: " Command " ) , #selector( markObjectsReadFromContextualMenu ( _: ) ) , objects, image: Assets . Images. markAllAsReadMenu)
305330 }
306331
332+ func markAllAsReadExceptStarredMenuItem( _ objects: [ Any ] ) -> NSMenuItem {
333+
334+ return menuItem ( NSLocalizedString ( " Mark Unstarred as Read " , comment: " Command " ) , #selector( markObjectsReadExceptStarredFromContextualMenu ( _: ) ) , objects, image: Assets . Images. markAllAsReadMenu)
335+ }
336+
307337 func deleteMenuItem( _ objects: [ Any ] ) -> NSMenuItem {
308338
309339 return menuItem ( NSLocalizedString ( " Delete " , comment: " Command " ) , #selector( deleteFromContextualMenu ( _: ) ) , objects, image: Assets . Images. delete)
@@ -364,4 +394,32 @@ private extension SidebarViewController {
364394 }
365395 return articles
366396 }
397+
398+ func unreadUnstarredArticles( for objects: [ Any ] ) -> Set < Article > {
399+
400+ var articles = Set < Article > ( )
401+ for object in objects {
402+ if let articleFetcher = object as? ArticleFetcher {
403+ if let unreadArticles = try ? articleFetcher. fetchUnreadArticles ( ) {
404+ let unstarred = unreadArticles. filter { !$0. status. starred }
405+ articles. formUnion ( unstarred)
406+ }
407+ }
408+ }
409+ return articles
410+ }
411+
412+ func anyObjectHasUnreadUnstarredArticles( _ objects: [ Any ] ) -> Bool {
413+
414+ for object in objects {
415+ if let articleFetcher = object as? ArticleFetcher {
416+ if let unreadArticles = try ? articleFetcher. fetchUnreadArticles ( ) {
417+ if unreadArticles. contains ( where: { !$0. status. starred } ) {
418+ return true
419+ }
420+ }
421+ }
422+ }
423+ return false
424+ }
367425}
0 commit comments