feat: show only unread articles
This commit is contained in:
@@ -19,15 +19,18 @@
|
|||||||
/** default: @c YES */ static NSString* const Pref_globalOpenUnread = @"globalOpenUnread";
|
/** 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_globalMarkRead = @"globalMarkRead";
|
||||||
/** default: @c YES */ static NSString* const Pref_globalMarkUnread = @"globalMarkUnread";
|
/** 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_globalUnreadCount = @"globalUnreadCount";
|
||||||
/** default: @c YES */ static NSString* const Pref_groupOpenUnread = @"groupOpenUnread";
|
/** 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_groupMarkRead = @"groupMarkRead";
|
||||||
/** default: @c YES */ static NSString* const Pref_groupMarkUnread = @"groupMarkUnread";
|
/** 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 YES */ static NSString* const Pref_groupUnreadCount = @"groupUnreadCount";
|
||||||
/** default: @c NO */ static NSString* const Pref_groupUnreadIndicator = @"groupUnreadIndicator";
|
/** 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_feedOpenUnread = @"feedOpenUnread";
|
||||||
/** default: @c YES */ static NSString* const Pref_feedMarkRead = @"feedMarkRead";
|
/** default: @c YES */ static NSString* const Pref_feedMarkRead = @"feedMarkRead";
|
||||||
/** default: @c YES */ static NSString* const Pref_feedMarkUnread = @"feedMarkUnread";
|
/** 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_feedUnreadCount = @"feedUnreadCount";
|
||||||
/** default: @c YES */ static NSString* const Pref_feedUnreadIndicator = @"feedUnreadIndicator";
|
/** default: @c YES */ static NSString* const Pref_feedUnreadIndicator = @"feedUnreadIndicator";
|
||||||
/** default: @c NO */ static NSString* const Pref_feedTruncateTitle = @"feedTruncateTitle";
|
/** default: @c NO */ static NSString* const Pref_feedTruncateTitle = @"feedTruncateTitle";
|
||||||
|
|||||||
@@ -10,16 +10,21 @@ static inline void defaultsAppend(NSMutableDictionary *defs, id value, NSArray<N
|
|||||||
/// Helper method calls @c (standardUserDefaults)registerDefaults:
|
/// Helper method calls @c (standardUserDefaults)registerDefaults:
|
||||||
void UserPrefsInit(void) {
|
void UserPrefsInit(void) {
|
||||||
NSMutableDictionary *defs = [NSMutableDictionary dictionary];
|
NSMutableDictionary *defs = [NSMutableDictionary dictionary];
|
||||||
defaultsAppend(defs, @YES, @[Pref_globalTintMenuIcon,
|
defaultsAppend(defs, @YES, @[
|
||||||
|
Pref_globalTintMenuIcon,
|
||||||
Pref_globalUpdateAll,
|
Pref_globalUpdateAll,
|
||||||
Pref_globalOpenUnread, Pref_groupOpenUnread, Pref_feedOpenUnread,
|
Pref_globalOpenUnread, Pref_groupOpenUnread, Pref_feedOpenUnread,
|
||||||
Pref_globalMarkRead, Pref_groupMarkRead, Pref_feedMarkRead,
|
Pref_globalMarkRead, Pref_groupMarkRead, Pref_feedMarkRead,
|
||||||
Pref_globalMarkUnread, Pref_groupMarkUnread, Pref_feedMarkUnread,
|
Pref_globalMarkUnread, Pref_groupMarkUnread, Pref_feedMarkUnread,
|
||||||
Pref_globalUnreadCount, Pref_groupUnreadCount, Pref_feedUnreadCount,
|
Pref_globalUnreadCount, Pref_groupUnreadCount, Pref_feedUnreadCount,
|
||||||
Pref_feedUnreadIndicator]);
|
Pref_feedUnreadIndicator
|
||||||
defaultsAppend(defs, @NO, @[Pref_groupUnreadIndicator,
|
]);
|
||||||
|
defaultsAppend(defs, @NO, @[
|
||||||
|
Pref_globalUnreadOnly, Pref_groupUnreadOnly, Pref_feedUnreadOnly,
|
||||||
|
Pref_groupUnreadIndicator,
|
||||||
Pref_feedTruncateTitle,
|
Pref_feedTruncateTitle,
|
||||||
Pref_feedLimitArticles]);
|
Pref_feedLimitArticles
|
||||||
|
]);
|
||||||
// Display limits & truncation ( defaults write de.relikd.baRSS {KEY} -int 10 )
|
// Display limits & truncation ( defaults write de.relikd.baRSS {KEY} -int 10 )
|
||||||
[defs setObject:[NSNumber numberWithUnsignedInteger:10] forKey:Pref_openFewLinksLimit];
|
[defs setObject:[NSNumber numberWithUnsignedInteger:10] forKey:Pref_openFewLinksLimit];
|
||||||
[defs setObject:[NSNumber numberWithUnsignedInteger:60] forKey:Pref_shortArticleNamesLimit];
|
[defs setObject:[NSNumber numberWithUnsignedInteger:60] forKey:Pref_shortArticleNamesLimit];
|
||||||
|
|||||||
@@ -70,7 +70,7 @@
|
|||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>14644</string>
|
<string>14690</string>
|
||||||
<key>LSApplicationCategoryType</key>
|
<key>LSApplicationCategoryType</key>
|
||||||
<string>public.app-category.news</string>
|
<string>public.app-category.news</string>
|
||||||
<key>LSMinimumSystemVersion</key>
|
<key>LSMinimumSystemVersion</key>
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
[self entry:NSLocalizedString(@"Open all unread", nil) c1:Pref_globalOpenUnread c2:Pref_groupOpenUnread c3:Pref_feedOpenUnread];
|
[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 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(@"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(@"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(@"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]
|
[[self entry:NSLocalizedString(@"Truncate article title", nil) c1:nil c2:nil c3:Pref_feedTruncateTitle]
|
||||||
|
|||||||
@@ -64,15 +64,10 @@
|
|||||||
- (void)setFeedGroups:(NSArray<FeedGroup*>*)sortedList forMenu:(NSMenu*)menu {
|
- (void)setFeedGroups:(NSArray<FeedGroup*>*)sortedList forMenu:(NSMenu*)menu {
|
||||||
[menu insertDefaultHeader];
|
[menu insertDefaultHeader];
|
||||||
for (FeedGroup *fg in sortedList) {
|
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];
|
UnreadTotal *uct = self.unreadMap[menu.titleIndexPath];
|
||||||
[menu setHeaderHasUnread:(uct.unread > 0) hasRead:(uct.unread < uct.total)];
|
[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.
|
/// Generate items for @c FeedArticles menu.
|
||||||
@@ -81,8 +76,11 @@
|
|||||||
NSInteger mc = NSIntegerMax;
|
NSInteger mc = NSIntegerMax;
|
||||||
if (UserPrefsBool(Pref_feedLimitArticles))
|
if (UserPrefsBool(Pref_feedLimitArticles))
|
||||||
mc = UserPrefsInt(Pref_articlesInMenuLimit);
|
mc = UserPrefsInt(Pref_articlesInMenuLimit);
|
||||||
|
BOOL onlyUnread = UserPrefsBool(Pref_feedUnreadOnly);
|
||||||
|
|
||||||
for (FeedArticle *fa in sortedList) {
|
for (FeedArticle *fa in sortedList) {
|
||||||
|
if (onlyUnread && !fa.unread)
|
||||||
|
continue;
|
||||||
if (--mc < 0) // mc == 0 will first decrement to -1, then evaluate
|
if (--mc < 0) // mc == 0 will first decrement to -1, then evaluate
|
||||||
break;
|
break;
|
||||||
[menu addItem:[fa newMenuItem]];
|
[menu addItem:[fa newMenuItem]];
|
||||||
@@ -137,6 +135,7 @@
|
|||||||
[item setTitleCount:uct.unread];
|
[item setTitleCount:uct.unread];
|
||||||
item = item.parentItem;
|
item = item.parentItem;
|
||||||
}
|
}
|
||||||
|
// TODO: need to re-create groups if user chose to hide already read articles
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
@import Cocoa;
|
@import Cocoa;
|
||||||
@class FeedGroup;
|
@class FeedGroup, MapUnreadTotal;
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
@@ -10,7 +10,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
@property (readonly) BOOL isFeedMenu;
|
@property (readonly) BOOL isFeedMenu;
|
||||||
|
|
||||||
// Generator
|
// Generator
|
||||||
- (NSMenuItem*)insertFeedGroupItem:(FeedGroup*)fg;
|
- (nullable NSMenuItem*)insertFeedGroupItem:(FeedGroup*)fg withUnread:(MapUnreadTotal*)unreadMap;
|
||||||
- (void)insertDefaultHeader;
|
- (void)insertDefaultHeader;
|
||||||
// Update menu
|
// Update menu
|
||||||
- (void)setHeaderHasUnread:(BOOL)hasUnread hasRead:(BOOL)hasRead;
|
- (void)setHeaderHasUnread:(BOOL)hasUnread hasRead:(BOOL)hasRead;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#import "Feed+Ext.h"
|
#import "Feed+Ext.h"
|
||||||
#import "FeedGroup+Ext.h"
|
#import "FeedGroup+Ext.h"
|
||||||
#import "Constants.h"
|
#import "Constants.h"
|
||||||
|
#import "MapUnreadTotal.h"
|
||||||
|
|
||||||
typedef NS_ENUM(NSInteger, MenuItemTag) {
|
typedef NS_ENUM(NSInteger, MenuItemTag) {
|
||||||
/// Used in @c allowDisplayOfHeaderItem: to identify and enable items
|
/// Used in @c allowDisplayOfHeaderItem: to identify and enable items
|
||||||
@@ -45,7 +46,7 @@ typedef NS_ENUM(NSInteger, MenuItemTag) {
|
|||||||
#pragma mark - Generator -
|
#pragma mark - Generator -
|
||||||
|
|
||||||
/// Create new @c NSMenuItem with empty submenu and append it to the menu. @return Inserted item.
|
/// 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 = '-';
|
unichar chr = '-';
|
||||||
NSMenuItem *item = nil;
|
NSMenuItem *item = nil;
|
||||||
switch (fg.type) {
|
switch (fg.type) {
|
||||||
@@ -55,7 +56,17 @@ typedef NS_ENUM(NSInteger, MenuItemTag) {
|
|||||||
}
|
}
|
||||||
if (!item.isSeparatorItem) {
|
if (!item.isSeparatorItem) {
|
||||||
NSString *t = [NSString stringWithFormat:@"%c%@.%d", chr, [self.title substringFromIndex:1], fg.sortIndex];
|
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.submenu = [[NSMenu alloc] initWithTitle:t];
|
||||||
|
[item setTitleCount:unread];
|
||||||
}
|
}
|
||||||
[self addItem:item];
|
[self addItem:item];
|
||||||
return item;
|
return item;
|
||||||
|
|||||||
Reference in New Issue
Block a user