diff --git a/baRSS/Helper/UserPrefs.h b/baRSS/Helper/UserPrefs.h index 73b8b64..44d5f34 100644 --- a/baRSS/Helper/UserPrefs.h +++ b/baRSS/Helper/UserPrefs.h @@ -19,15 +19,18 @@ /** default: @c YES */ static NSString* const Pref_globalOpenUnread = @"globalOpenUnread"; /** default: @c YES */ static NSString* const Pref_globalMarkRead = @"globalMarkRead"; /** default: @c YES */ static NSString* const Pref_globalMarkUnread = @"globalMarkUnread"; +/** default: @c NO */ static NSString* const Pref_globalUnreadOnly = @"globalUnreadOnly"; /** default: @c YES */ static NSString* const Pref_globalUnreadCount = @"globalUnreadCount"; /** default: @c YES */ static NSString* const Pref_groupOpenUnread = @"groupOpenUnread"; /** default: @c YES */ static NSString* const Pref_groupMarkRead = @"groupMarkRead"; /** default: @c YES */ static NSString* const Pref_groupMarkUnread = @"groupMarkUnread"; +/** default: @c NO */ static NSString* const Pref_groupUnreadOnly = @"groupUnreadOnly"; /** default: @c YES */ static NSString* const Pref_groupUnreadCount = @"groupUnreadCount"; /** default: @c NO */ static NSString* const Pref_groupUnreadIndicator = @"groupUnreadIndicator"; /** default: @c YES */ static NSString* const Pref_feedOpenUnread = @"feedOpenUnread"; /** default: @c YES */ static NSString* const Pref_feedMarkRead = @"feedMarkRead"; /** default: @c YES */ static NSString* const Pref_feedMarkUnread = @"feedMarkUnread"; +/** default: @c NO */ static NSString* const Pref_feedUnreadOnly = @"feedUnreadOnly"; /** default: @c YES */ static NSString* const Pref_feedUnreadCount = @"feedUnreadCount"; /** default: @c YES */ static NSString* const Pref_feedUnreadIndicator = @"feedUnreadIndicator"; /** default: @c NO */ static NSString* const Pref_feedTruncateTitle = @"feedTruncateTitle"; diff --git a/baRSS/Helper/UserPrefs.m b/baRSS/Helper/UserPrefs.m index 4b20c73..a075e51 100644 --- a/baRSS/Helper/UserPrefs.m +++ b/baRSS/Helper/UserPrefs.m @@ -10,16 +10,21 @@ static inline void defaultsAppend(NSMutableDictionary *defs, id value, NSArray CFBundleVersion - 14644 + 14690 LSApplicationCategoryType public.app-category.news LSMinimumSystemVersion diff --git a/baRSS/Preferences/Appearance Tab/SettingsAppearanceView.m b/baRSS/Preferences/Appearance Tab/SettingsAppearanceView.m index 05e8014..773a52f 100644 --- a/baRSS/Preferences/Appearance Tab/SettingsAppearanceView.m +++ b/baRSS/Preferences/Appearance Tab/SettingsAppearanceView.m @@ -28,6 +28,7 @@ [self entry:NSLocalizedString(@"Open all unread", nil) c1:Pref_globalOpenUnread c2:Pref_groupOpenUnread c3:Pref_feedOpenUnread]; [self entry:NSLocalizedString(@"Mark all read", nil) c1:Pref_globalMarkRead c2:Pref_groupMarkRead c3:Pref_feedMarkRead]; [self entry:NSLocalizedString(@"Mark all unread", nil) c1:Pref_globalMarkUnread c2:Pref_groupMarkUnread c3:Pref_feedMarkUnread]; + [self entry:NSLocalizedString(@"Show only unread / hide read", nil) c1:Pref_globalUnreadOnly c2:Pref_groupUnreadOnly c3:Pref_feedUnreadOnly]; [self entry:NSLocalizedString(@"Number of unread articles", nil) c1:Pref_globalUnreadCount c2:Pref_groupUnreadCount c3:Pref_feedUnreadCount]; [self entry:NSLocalizedString(@"Indicator for unread articles", nil) c1:nil c2:Pref_groupUnreadIndicator c3:Pref_feedUnreadIndicator]; [[self entry:NSLocalizedString(@"Truncate article title", nil) c1:nil c2:nil c3:Pref_feedTruncateTitle] diff --git a/baRSS/Status Bar Menu/BarMenu.m b/baRSS/Status Bar Menu/BarMenu.m index a8c79ce..6d4cb7f 100644 --- a/baRSS/Status Bar Menu/BarMenu.m +++ b/baRSS/Status Bar Menu/BarMenu.m @@ -64,15 +64,10 @@ - (void)setFeedGroups:(NSArray*)sortedList forMenu:(NSMenu*)menu { [menu insertDefaultHeader]; for (FeedGroup *fg in sortedList) { - [menu insertFeedGroupItem:fg].submenu.delegate = self; + [menu insertFeedGroupItem:fg withUnread:self.unreadMap].submenu.delegate = self; } UnreadTotal *uct = self.unreadMap[menu.titleIndexPath]; [menu setHeaderHasUnread:(uct.unread > 0) hasRead:(uct.unread < uct.total)]; - // set unread counts - for (NSMenuItem *item in menu.itemArray) { - if (item.hasSubmenu) - [item setTitleCount:self.unreadMap[item.submenu.titleIndexPath].unread]; - } } /// Generate items for @c FeedArticles menu. @@ -81,8 +76,11 @@ NSInteger mc = NSIntegerMax; if (UserPrefsBool(Pref_feedLimitArticles)) mc = UserPrefsInt(Pref_articlesInMenuLimit); + BOOL onlyUnread = UserPrefsBool(Pref_feedUnreadOnly); for (FeedArticle *fa in sortedList) { + if (onlyUnread && !fa.unread) + continue; if (--mc < 0) // mc == 0 will first decrement to -1, then evaluate break; [menu addItem:[fa newMenuItem]]; @@ -137,6 +135,7 @@ [item setTitleCount:uct.unread]; item = item.parentItem; } + // TODO: need to re-create groups if user chose to hide already read articles } } diff --git a/baRSS/Status Bar Menu/NSMenu+Ext.h b/baRSS/Status Bar Menu/NSMenu+Ext.h index 6253b23..6e292a3 100644 --- a/baRSS/Status Bar Menu/NSMenu+Ext.h +++ b/baRSS/Status Bar Menu/NSMenu+Ext.h @@ -1,5 +1,5 @@ @import Cocoa; -@class FeedGroup; +@class FeedGroup, MapUnreadTotal; NS_ASSUME_NONNULL_BEGIN @@ -10,7 +10,7 @@ NS_ASSUME_NONNULL_BEGIN @property (readonly) BOOL isFeedMenu; // Generator -- (NSMenuItem*)insertFeedGroupItem:(FeedGroup*)fg; +- (nullable NSMenuItem*)insertFeedGroupItem:(FeedGroup*)fg withUnread:(MapUnreadTotal*)unreadMap; - (void)insertDefaultHeader; // Update menu - (void)setHeaderHasUnread:(BOOL)hasUnread hasRead:(BOOL)hasRead; diff --git a/baRSS/Status Bar Menu/NSMenu+Ext.m b/baRSS/Status Bar Menu/NSMenu+Ext.m index c6e2f07..c01fcb2 100644 --- a/baRSS/Status Bar Menu/NSMenu+Ext.m +++ b/baRSS/Status Bar Menu/NSMenu+Ext.m @@ -4,6 +4,7 @@ #import "Feed+Ext.h" #import "FeedGroup+Ext.h" #import "Constants.h" +#import "MapUnreadTotal.h" typedef NS_ENUM(NSInteger, MenuItemTag) { /// Used in @c allowDisplayOfHeaderItem: to identify and enable items @@ -45,7 +46,7 @@ typedef NS_ENUM(NSInteger, MenuItemTag) { #pragma mark - Generator - /// Create new @c NSMenuItem with empty submenu and append it to the menu. @return Inserted item. -- (NSMenuItem*)insertFeedGroupItem:(FeedGroup*)fg { +- (nullable NSMenuItem*)insertFeedGroupItem:(FeedGroup*)fg withUnread:(MapUnreadTotal*)unreadMap { unichar chr = '-'; NSMenuItem *item = nil; switch (fg.type) { @@ -55,7 +56,17 @@ typedef NS_ENUM(NSInteger, MenuItemTag) { } if (!item.isSeparatorItem) { NSString *t = [NSString stringWithFormat:@"%c%@.%d", chr, [self.title substringFromIndex:1], fg.sortIndex]; + NSUInteger unread = unreadMap[[t substringFromIndex:2]].unread; + + // Check user preferences to show only unread entries + if (unread == 0 && + ((fg.type == FEED && UserPrefsBool(Pref_groupUnreadOnly)) || + (fg.type == GROUP && UserPrefsBool(Pref_globalUnreadOnly)))) { + return nil; + } + item.submenu = [[NSMenu alloc] initWithTitle:t]; + [item setTitleCount:unread]; } [self addItem:item]; return item;