NS_ASSUME_NONNULL

This commit is contained in:
relikd
2020-01-17 12:19:08 +01:00
parent 4c9362b42e
commit 47a0e76cb3
37 changed files with 137 additions and 17 deletions

View File

@@ -27,8 +27,6 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@@ -38,8 +36,8 @@
ReferencedContainer = "container:baRSS.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -49,7 +47,7 @@
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
stopOnEveryMainThreadCheckerIssue = "YES"
migratedStopOnEveryIssue = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
@@ -83,8 +81,6 @@
isEnabled = "NO">
</EnvironmentVariable>
</EnvironmentVariables>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View File

@@ -24,6 +24,8 @@
#import "Feed+CoreDataClass.h"
@class RSParsedFeed;
NS_ASSUME_NONNULL_BEGIN
@interface Feed (Ext)
@property (readonly) BOOL hasIcon;
@property (nonnull, readonly) NSImage* iconImage16;
@@ -38,3 +40,5 @@
// Article properties
- (NSArray<FeedArticle*>*)sortedArticles;
@end
NS_ASSUME_NONNULL_END

View File

@@ -24,7 +24,11 @@
#import "FeedArticle+CoreDataClass.h"
@class RSParsedArticle;
NS_ASSUME_NONNULL_BEGIN
@interface FeedArticle (Ext)
+ (instancetype)newArticle:(RSParsedArticle*)entry inContext:(NSManagedObjectContext*)moc;
- (NSMenuItem*)newMenuItem;
@end
NS_ASSUME_NONNULL_END

View File

@@ -29,6 +29,7 @@ typedef NS_ENUM(int16_t, FeedGroupType) {
GROUP = 0, FEED = 1, SEPARATOR = 2
};
NS_ASSUME_NONNULL_BEGIN
@interface FeedGroup (Ext)
/// Overwrites @c type attribute with enum. Use one of: @c GROUP, @c FEED, @c SEPARATOR.
@@ -39,7 +40,7 @@ typedef NS_ENUM(int16_t, FeedGroupType) {
+ (instancetype)newGroup:(FeedGroupType)type inContext:(NSManagedObjectContext*)context;
+ (instancetype)appendToRoot:(FeedGroupType)type inContext:(NSManagedObjectContext*)moc;
- (void)setParent:(FeedGroup *)parent andSortIndex:(int32_t)sortIndex;
- (void)setParent:(nullable FeedGroup *)parent andSortIndex:(int32_t)sortIndex;
- (void)setSortIndexIfChanged:(int32_t)sortIndex;
- (void)setNameIfChanged:(nullable NSString*)name;
- (NSMenuItem*)newMenuItem;
@@ -50,3 +51,5 @@ typedef NS_ENUM(int16_t, FeedGroupType) {
// Printing
- (NSString*)readableDescription;
@end
NS_ASSUME_NONNULL_END

View File

@@ -78,7 +78,7 @@
}
/// Set @c parent and @c sortIndex. Also if type is @c FEED calculate and set @c indexPath string.
- (void)setParent:(FeedGroup *)parent andSortIndex:(int32_t)sortIndex {
- (void)setParent:(nullable FeedGroup *)parent andSortIndex:(int32_t)sortIndex {
self.parent = parent;
self.sortIndex = sortIndex;
if (self.type == FEED)

View File

@@ -25,6 +25,8 @@
static int32_t const kDefaultFeedRefreshInterval = 30 * 60;
NS_ASSUME_NONNULL_BEGIN
@interface FeedMeta (Ext)
+ (instancetype)newMetaInContext:(NSManagedObjectContext*)moc;
// HTTP response
@@ -35,3 +37,5 @@ static int32_t const kDefaultFeedRefreshInterval = 30 * 60;
- (void)setRefreshIfChanged:(int32_t)refresh;
- (void)scheduleNow:(NSTimeInterval)future;
@end
NS_ASSUME_NONNULL_END

View File

@@ -22,6 +22,8 @@
@import Cocoa;
NS_ASSUME_NONNULL_BEGIN
@interface NSFetchRequest<ResultType> (Ext)
// Perform core data request and fetch data
- (NSArray<ResultType>*)fetchAllRows:(NSManagedObjectContext*)moc;
@@ -37,3 +39,5 @@
- (instancetype)sortDESC:(NSString*)key; // add .sortDescriptors -> ascending:NO
- (instancetype)addFunctionExpression:(NSString*)fn onKeyPath:(NSString*)keyPath name:(NSString*)name type:(NSAttributeType)type; // add .propertiesToFetch -> (expressionForFunction:@[expressionForKeyPath:])
@end
NS_ASSUME_NONNULL_END

View File

@@ -23,6 +23,8 @@
@import Cocoa;
#import "DBv1+CoreDataModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface StoreCoordinator : NSObject
// Managing contexts
+ (NSManagedObjectContext*)getMainContext;
@@ -44,7 +46,7 @@
+ (NSArray<NSDictionary*>*)countAggregatedUnread;
// Get List Of Elements
+ (NSArray<FeedGroup*>*)sortedFeedGroupsWithParent:(id)parent inContext:(nullable NSManagedObjectContext*)moc;
+ (NSArray<FeedGroup*>*)sortedFeedGroupsWithParent:(nullable id)parent inContext:(nullable NSManagedObjectContext*)moc;
+ (Feed*)feedWithIndexPath:(nonnull NSString*)path inContext:(nullable NSManagedObjectContext*)moc;
+ (NSString*)urlForFeedWithIndexPath:(nonnull NSString*)path;
@@ -55,3 +57,5 @@
+ (void)cleanupAndShowAlert:(BOOL)flag;
+ (NSUInteger)cleanupFavicons;
@end
NS_ASSUME_NONNULL_END

View File

@@ -144,7 +144,7 @@
@param moc If @c nil perform requests on main context (ok for reading).
@return Sorted list of @c FeedGroup items where @c FeedGroup.parent @c = @c parent.
*/
+ (NSArray<FeedGroup*>*)sortedFeedGroupsWithParent:(id)parent inContext:(nullable NSManagedObjectContext*)moc {
+ (NSArray<FeedGroup*>*)sortedFeedGroupsWithParent:(nullable id)parent inContext:(nullable NSManagedObjectContext*)moc {
return [[[[FeedGroup fetchRequest] where:@"parent = %@", parent] sortASC:@"sortIndex"] fetchAllRows:moc ? moc : [self getMainContext]];
}

View File

@@ -24,9 +24,13 @@
#define ENV_LOG_YOUTUBE 1
NS_ASSUME_NONNULL_BEGIN
// TODO: Make plugins extensible? community extensions.
@interface YouTubePlugin : NSObject
+ (NSString*)feedURL:(NSURL*)url;
+ (NSString*)videoImage:(NSString*)videoid;
+ (NSString*)videoImageHQ:(NSString*)videoid;
@end
NS_ASSUME_NONNULL_END

View File

@@ -24,6 +24,8 @@
@class Feed, RSHTMLMetadata, FeedDownload;
@protocol FaviconDownloadDelegate;
NS_ASSUME_NONNULL_BEGIN
@interface FaviconDownload : NSObject
/// @c img and @c path are @c nil if image is not valid or couldn't be downloaded.
typedef void(^FaviconDownloadBlock)(NSImage * _Nullable img, NSURL * _Nullable path);
@@ -45,3 +47,5 @@ typedef void(^FaviconDownloadBlock)(NSImage * _Nullable img, NSURL * _Nullable p
/// Called after image download. Called on error, but not if download is cancled.
- (void)faviconDownload:(FaviconDownload*)sender didFinish:(nullable NSURL*)path;
@end
NS_ASSUME_NONNULL_END

View File

@@ -24,6 +24,8 @@
@class RSParsedFeed, RSHTMLMetadataFeedLink, Feed, FaviconDownload;
@protocol FeedDownloadDelegate;
NS_ASSUME_NONNULL_BEGIN
/**
All properties will be parsed and stored in local variables.
This will avoid unnecessary core data operations if user decides to cancel the edit.
@@ -61,3 +63,5 @@ typedef void (^FeedDownloadBlock)(FeedDownload *sender);
/// Called after xml data is loaded and parsed. Called on error, but not if download is cancled.
- (void)feedDownloadDidFinish:(FeedDownload*)sender;
@end
NS_ASSUME_NONNULL_END

View File

@@ -28,6 +28,8 @@ typedef NS_OPTIONS(NSUInteger, OpmlFileExportOptions) {
OpmlFileExportOptionFullBackup = 1 << 2,
};
NS_ASSUME_NONNULL_BEGIN
#pragma mark - Protocols
@protocol OpmlFileImportDelegate <NSObject>
@@ -61,3 +63,5 @@ typedef NS_OPTIONS(NSUInteger, OpmlFileExportOptions) {
- (void)showExportDialog:(NSWindow*)window;
- (nullable NSError*)writeOPMLFile:(NSURL*)url withOptions:(OpmlFileExportOptions)opt;
@end
NS_ASSUME_NONNULL_END

View File

@@ -24,6 +24,8 @@
@class Feed;
NS_ASSUME_NONNULL_BEGIN
@interface UpdateScheduler : NSObject
@property (class, readonly) NSUInteger feedsInQueue;
@property (class, readonly) NSDate *dateScheduled;
@@ -46,3 +48,5 @@
+ (void)registerNetworkChangeNotification;
+ (void)unregisterNetworkChangeNotification;
@end
NS_ASSUME_NONNULL_END

View File

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

View File

@@ -32,6 +32,8 @@ typedef NS_ENUM(int32_t, TimeUnitType) {
TimeUnitYears = 365 * 24 * 60 * 60
};
NS_ASSUME_NONNULL_BEGIN
@interface NSDate (Ext)
+ (NSString*)timeStringISO8601;
+ (NSString*)dayStringISO8601;
@@ -57,3 +59,5 @@ typedef NS_ENUM(int32_t, TimeUnitType) {
@interface NSDate (Statistics)
+ (NSDictionary*)refreshIntervalStatistics:(NSArray<NSDate*> *)list;
@end
NS_ASSUME_NONNULL_END

View File

@@ -25,6 +25,8 @@
/// Log error message and prepend calling class and calling method.
#define NSLogCaller(desc) { NSLog(@"%@:%@ %@", [self class], NSStringFromSelector(_cmd), desc); }
NS_ASSUME_NONNULL_BEGIN
@interface NSError (Ext)
// Generators
+ (instancetype)statusCode:(NSInteger)code reason:(nullable NSString*)reason;
@@ -35,3 +37,5 @@
- (BOOL)inCaseLog:(nullable const char*)title;
- (BOOL)inCasePresent:(NSApplication*)app;
@end
NS_ASSUME_NONNULL_END

View File

@@ -22,6 +22,8 @@
@import Cocoa;
NS_ASSUME_NONNULL_BEGIN
@interface NSString (PlainHTML)
+ (NSString*)plainTextFromHTMLData:(NSData*)data;
- (nonnull NSString*)htmlToPlainText;
@@ -30,3 +32,5 @@
@interface NSString (HexColor)
- (nullable NSColor*)hexColor;
@end
NS_ASSUME_NONNULL_END

View File

@@ -24,6 +24,8 @@
#define ENV_LOG_FILES 0
NS_ASSUME_NONNULL_BEGIN
@interface NSURL (Ext)
// Generators
+ (NSURL*)applicationSupportURL;
@@ -38,3 +40,5 @@
- (void)remove;
- (void)moveTo:(NSURL*)destination;
@end
NS_ASSUME_NONNULL_END

View File

@@ -24,8 +24,12 @@
#define ENV_LOG_DOWNLOAD 1
NS_ASSUME_NONNULL_BEGIN
@interface NSURLRequest (Ext)
+ (instancetype)withURL:(NSString*)urlStr;
- (NSURLSessionDataTask*)dataTask:(nonnull void(^)(NSData * _Nullable data, NSError * _Nullable error, NSHTTPURLResponse *response))block;
- (NSURLSessionDownloadTask*)downloadTask:(void(^)(NSURL * _Nullable path, NSError * _Nullable error))block;
@end
NS_ASSUME_NONNULL_END

View File

@@ -40,6 +40,8 @@
/// Static variable to calculate origin center coordinate in its @c superview. The value of this var isn't used.
static CGFloat const CENTER = -0.015625;
NS_ASSUME_NONNULL_BEGIN
/// Calculate @c origin.y going down from the top border of its @c superview
static inline CGFloat YFromTop(NSView *view) { return NSHeight(view.superview.frame) - NSMinY(view.frame) - view.alignmentRectInsets.bottom; }
/// @c MAX()
@@ -65,7 +67,7 @@ static inline CGFloat NSMaxWidth(NSView *a, NSView *b) { return Max(NSWidth(a.fr
+ (NSButton*)inlineButton:(NSString*)text;
+ (NSPopUpButton*)popupButton:(CGFloat)w;
// UI: Others
+ (NSImageView*)imageView:(NSImageName)name size:(CGFloat)size;
+ (NSImageView*)imageView:(nullable NSImageName)name size:(CGFloat)size;
+ (NSButton*)checkbox:(BOOL)flag;
+ (NSProgressIndicator*)activitySpinner;
+ (NSView*)radioGroup:(NSArray<NSString*>*)entries target:(id)target action:(nonnull SEL)action;
@@ -91,7 +93,7 @@ static inline CGFloat NSMaxWidth(NSView *a, NSView *b) { return Max(NSWidth(a.fr
@interface NSControl (Ext)
- (instancetype)action:(SEL)selector target:(id)target;
- (instancetype)action:(SEL)selector target:(nullable id)target;
- (instancetype)large;
- (instancetype)small;
- (instancetype)tiny;
@@ -106,3 +108,5 @@ static inline CGFloat NSMaxWidth(NSView *a, NSView *b) { return Max(NSWidth(a.fr
- (instancetype)selectable;
- (instancetype)multiline:(NSSize)size;
@end
NS_ASSUME_NONNULL_END

View File

@@ -122,7 +122,7 @@
/// Create @c ImageView with square @c size
+ (NSImageView*)imageView:(NSImageName)name size:(CGFloat)size {
+ (NSImageView*)imageView:(nullable NSImageName)name size:(CGFloat)size {
NSImageView *imgView = [[NSImageView alloc] initWithFrame: NSMakeRect(0, 0, size, size)];
if (name) imgView.image = [NSImage imageNamed:name];
return imgView;
@@ -328,7 +328,7 @@ static inline void SetFrameWidth(NSView *view, CGFloat w) {
@implementation NSControl (Ext)
/// Set @c target and @c action simultaneously
- (instancetype)action:(SEL)selector target:(id)target {
- (instancetype)action:(SEL)selector target:(nullable id)target {
self.action = selector;
self.target = target;
return self;

View File

@@ -22,6 +22,10 @@
@import Cocoa;
NS_ASSUME_NONNULL_BEGIN
@interface SettingsAppearance : NSViewController
- (void)didSelectCheckbox:(NSButton*)sender;
@end
NS_ASSUME_NONNULL_END

View File

@@ -24,6 +24,8 @@
#import "ModalSheet.h"
@class FeedGroup, ModalSheet;
NS_ASSUME_NONNULL_BEGIN
@interface ModalEditDialog : NSViewController
+ (instancetype)modalWith:(FeedGroup*)group;
- (ModalSheet*)getModalSheet;
@@ -38,3 +40,4 @@
@interface ModalGroupEdit : ModalEditDialog
@end
NS_ASSUME_NONNULL_END

View File

@@ -23,6 +23,8 @@
@import Cocoa;
@class ModalFeedEdit;
NS_ASSUME_NONNULL_BEGIN
@interface ModalFeedEditView : NSView
@property (strong) IBOutlet NSTextField *url;
@property (strong) IBOutlet NSProgressIndicator *spinnerURL;
@@ -43,3 +45,5 @@
- (instancetype)initWithFrame:(NSRect)frameRect NS_UNAVAILABLE;
- (nullable instancetype)initWithCoder:(NSCoder *)decoder NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END

View File

@@ -22,6 +22,8 @@
@import Cocoa;
NS_ASSUME_NONNULL_BEGIN
@protocol RefreshIntervalButtonDelegate <NSObject>
@required
/// @c sender.tag is refresh interval in seconds
@@ -34,3 +36,5 @@
- (instancetype)initWithFrame:(NSRect)frameRect NS_UNAVAILABLE;
- (nullable instancetype)initWithCoder:(NSCoder *)decoder NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END

View File

@@ -23,7 +23,11 @@
#import "SettingsFeeds.h"
#import "OpmlFile.h"
NS_ASSUME_NONNULL_BEGIN
@interface SettingsFeeds (DragDrop) <NSOutlineViewDataSource, NSFilePromiseProviderDelegate, NSPasteboardTypeOwner, OpmlFileImportDelegate, OpmlFileExportDelegate>
- (void)prepareOutlineViewForDragDrop:(NSOutlineView*)outline;
- (void)importOpmlFiles:(NSArray<NSURL*>*)files;
@end
NS_ASSUME_NONNULL_END

View File

@@ -22,10 +22,12 @@
@import Cocoa;
NS_ASSUME_NONNULL_BEGIN
/** Manages the NSOutlineView and Feed creation and editing */
@interface SettingsFeeds : NSViewController <NSOutlineViewDelegate>
@property (strong) NSTreeController *dataStore;
@property (strong) NSArray<NSTreeNode*> *currentlyDraggedNodes;
@property (strong, nullable) NSArray<NSTreeNode*> *currentlyDraggedNodes;
- (void)editSelectedItem;
- (void)doubleClickOutlineView:(NSOutlineView*)sender;
@@ -40,3 +42,5 @@
- (BOOL)endCoreDataChangeUndoEmpty:(BOOL)undoEmpty forceUndo:(BOOL)force;
- (void)restoreOrderingAndIndexPathStr:(NSArray<NSTreeNode*>*)parentsList;
@end
NS_ASSUME_NONNULL_END

View File

@@ -23,6 +23,8 @@
@import Cocoa;
@class SettingsFeeds;
NS_ASSUME_NONNULL_BEGIN
@interface SettingsFeedsView : NSView
@property (strong) IBOutlet NSOutlineView *outline;
@property (strong) IBOutlet NSTextField *status;
@@ -45,3 +47,5 @@ extern NSUserInterfaceItemIdentifier const CustomCellRefresh;
@interface SeparatorColumnCell : NSTableCellView
extern NSUserInterfaceItemIdentifier const CustomCellSeparator;
@end
NS_ASSUME_NONNULL_END

View File

@@ -22,7 +22,11 @@
@import Cocoa;
NS_ASSUME_NONNULL_BEGIN
@interface SettingsGeneral : NSViewController
- (void)changeHttpApplication:(NSPopUpButton *)sender;
- (void)clickHowToDefaults:(NSButton *)sender;
@end
NS_ASSUME_NONNULL_END

View File

@@ -23,6 +23,8 @@
@import Cocoa;
@class SettingsGeneral;
NS_ASSUME_NONNULL_BEGIN
@interface SettingsGeneralView : NSView
@property (strong) IBOutlet NSPopUpButton* popupHttpApplication;
@property (strong) IBOutlet NSTextField *defaultReader;
@@ -32,3 +34,4 @@
- (nullable instancetype)initWithCoder:(NSCoder *)decoder NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END

View File

@@ -22,6 +22,8 @@
@import Cocoa;
NS_ASSUME_NONNULL_BEGIN
@interface ModalSheet : NSPanel
@property (readonly) BOOL didTapCancel;
@@ -31,3 +33,5 @@
- (void)setDoneEnabled:(BOOL)accept;
- (void)extendContentViewBy:(CGFloat)dy;
@end
NS_ASSUME_NONNULL_END

View File

@@ -23,7 +23,11 @@
@import Cocoa;
@class SettingsFeeds;
NS_ASSUME_NONNULL_BEGIN
@interface Preferences : NSWindow <NSWindowDelegate>
+ (instancetype)window;
- (__kindof NSViewController*)selectTab:(NSUInteger)index;
@end
NS_ASSUME_NONNULL_END

View File

@@ -23,7 +23,11 @@
@import Cocoa;
@class BarStatusItem;
NS_ASSUME_NONNULL_BEGIN
@interface BarMenu : NSObject <NSMenuDelegate>
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithStatusItem:(BarStatusItem*)statusItem NS_DESIGNATED_INITIALIZER;
@end
NS_ASSUME_NONNULL_END

View File

@@ -22,6 +22,8 @@
@import Cocoa;
NS_ASSUME_NONNULL_BEGIN
@interface BarStatusItem : NSObject
@property (weak, readonly) NSMenu *mainMenu;
@@ -32,3 +34,4 @@
- (void)showWelcomeMessage;
@end
NS_ASSUME_NONNULL_END

View File

@@ -22,6 +22,8 @@
@import Cocoa;
NS_ASSUME_NONNULL_BEGIN
@interface UnreadTotal : NSObject
@property (nonatomic, assign) NSUInteger unread;
@property (nonatomic, assign) NSUInteger total;
@@ -39,3 +41,5 @@
- (UnreadTotal*)objectForKeyedSubscript:(NSString*)key;
- (void)setObject:(UnreadTotal*)obj forKeyedSubscript:(NSString*)key;
@end
NS_ASSUME_NONNULL_END

View File

@@ -23,6 +23,8 @@
@import Cocoa;
@class FeedGroup;
NS_ASSUME_NONNULL_BEGIN
@interface NSMenu (Ext)
@property (nonnull, copy, readonly) NSString *titleIndexPath;
@property (nullable, readonly) NSMenuItem* parentItem;
@@ -42,3 +44,5 @@
- (instancetype)alternateWithTitle:(NSString*)title;
- (void)setTitleCount:(NSUInteger)count;
@end
NS_ASSUME_NONNULL_END