feat: show only unread articles

This commit is contained in:
relikd
2022-10-01 17:27:34 +02:00
parent a342104219
commit 364811642a
7 changed files with 39 additions and 20 deletions

View File

@@ -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";

View File

@@ -10,16 +10,21 @@ static inline void defaultsAppend(NSMutableDictionary *defs, id value, NSArray<N
/// Helper method calls @c (standardUserDefaults)registerDefaults:
void UserPrefsInit(void) {
NSMutableDictionary *defs = [NSMutableDictionary dictionary];
defaultsAppend(defs, @YES, @[Pref_globalTintMenuIcon,
defaultsAppend(defs, @YES, @[
Pref_globalTintMenuIcon,
Pref_globalUpdateAll,
Pref_globalOpenUnread, Pref_groupOpenUnread, Pref_feedOpenUnread,
Pref_globalMarkRead, Pref_groupMarkRead, Pref_feedMarkRead,
Pref_globalMarkUnread, Pref_groupMarkUnread, Pref_feedMarkUnread,
Pref_globalUnreadCount, Pref_groupUnreadCount, Pref_feedUnreadCount,
Pref_feedUnreadIndicator]);
defaultsAppend(defs, @NO, @[Pref_groupUnreadIndicator,
Pref_feedUnreadIndicator
]);
defaultsAppend(defs, @NO, @[
Pref_globalUnreadOnly, Pref_groupUnreadOnly, Pref_feedUnreadOnly,
Pref_groupUnreadIndicator,
Pref_feedTruncateTitle,
Pref_feedLimitArticles]);
Pref_feedLimitArticles
]);
// Display limits & truncation ( defaults write de.relikd.baRSS {KEY} -int 10 )
[defs setObject:[NSNumber numberWithUnsignedInteger:10] forKey:Pref_openFewLinksLimit];
[defs setObject:[NSNumber numberWithUnsignedInteger:60] forKey:Pref_shortArticleNamesLimit];

View File

@@ -70,7 +70,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>14644</string>
<string>14690</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.news</string>
<key>LSMinimumSystemVersion</key>

View File

@@ -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]

View File

@@ -64,15 +64,10 @@
- (void)setFeedGroups:(NSArray<FeedGroup*>*)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
}
}

View File

@@ -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;

View File

@@ -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;