Menu - Preferences Sync. There is still a bug with unread count ...

This commit is contained in:
relikd
2018-08-19 04:04:36 +02:00
parent f2281b91c4
commit 733ce7af79
9 changed files with 126 additions and 87 deletions

View File

@@ -22,7 +22,14 @@
#import <Cocoa/Cocoa.h>
@class FeedConfig;
@protocol ModalEditDelegate <NSObject>
- (void)modalDidUpdateFeedConfig:(FeedConfig*)config;
@end
@protocol ModalFeedConfigEdit <NSObject>
@property (weak) id<ModalEditDelegate> delegate;
- (void)updateRepresentedObject; // must call [item.managedObjectContext refreshObject:item mergeChanges:YES];
@end

View File

@@ -44,6 +44,7 @@
@end
@implementation ModalFeedEdit
@synthesize delegate;
- (void)viewDidLoad {
[super viewDidLoad];
@@ -71,48 +72,47 @@
if (self.shouldSaveObject) {
if (self.objectNeedsSaving)
[self updateRepresentedObject];
NSUndoManager *um = [self feedConfigOrNil].managedObjectContext.undoManager;
FeedConfig *item = [self feedConfigOrNil];
NSUndoManager *um = item.managedObjectContext.undoManager;
[um endUndoGrouping];
if (!self.objectIsModified) {
[um disableUndoRegistration];
[um undoNestedGroup];
[um enableUndoRegistration];
} else {
[StoreCoordinator save];
[self.delegate modalDidUpdateFeedConfig:item];
}
}
}
- (void)updateRepresentedObject {
FeedConfig *item = [self feedConfigOrNil];
if (item) {
if (!self.shouldSaveObject) { // first call to this method
[item.managedObjectContext.undoManager beginUndoGrouping];
}
self.shouldSaveObject = YES;
self.objectNeedsSaving = NO; // after this method it is saved
// if's to prevent unnecessary undo groups if nothing has changed
if (![item.name isEqualToString: self.name.stringValue])
item.name = self.name.stringValue;
if (![item.url isEqualToString:self.url.stringValue])
item.url = self.url.stringValue;
if (item.refreshNum != self.refreshNum.intValue)
item.refreshNum = self.refreshNum.intValue;
if (item.refreshUnit != self.refreshUnit.indexOfSelectedItem)
item.refreshUnit = (int16_t)self.refreshUnit.indexOfSelectedItem;
if (self.feedResult) {
Feed *rss = [StoreCoordinator createFeedFromDictionary:self.feedResult];
if (item.feed)
[item.managedObjectContext deleteObject:(NSManagedObject*)item.feed];
item.feed = rss;
}
if ([item.managedObjectContext hasChanges]) {
self.objectIsModified = YES;
[item.managedObjectContext refreshObject:item mergeChanges:YES];
}
if (!item)
return;
if (!self.shouldSaveObject) // first call to this method
[item.managedObjectContext.undoManager beginUndoGrouping];
self.shouldSaveObject = YES;
self.objectNeedsSaving = NO; // after this method it is saved
// if's to prevent unnecessary undo groups if nothing has changed
if (![item.name isEqualToString: self.name.stringValue])
item.name = self.name.stringValue;
if (![item.url isEqualToString:self.url.stringValue])
item.url = self.url.stringValue;
if (item.refreshNum != self.refreshNum.intValue)
item.refreshNum = self.refreshNum.intValue;
if (item.refreshUnit != self.refreshUnit.indexOfSelectedItem)
item.refreshUnit = (int16_t)self.refreshUnit.indexOfSelectedItem;
if (self.feedResult) {
Feed *rss = [StoreCoordinator createFeedFromDictionary:self.feedResult inContext:item.managedObjectContext];
if (item.feed)
[item.managedObjectContext deleteObject:(NSManagedObject*)item.feed];
item.feed = rss;
}
if ([item.managedObjectContext hasChanges]) {
self.objectIsModified = YES;
[item.managedObjectContext refreshObject:item mergeChanges:YES];
}
}
@@ -151,7 +151,6 @@
});
}];
}
// http://feeds.feedburner.com/simpledesktops
}
- (void)setTitleFromFeed {
@@ -183,6 +182,7 @@
#pragma mark - ModalGroupEdit
@implementation ModalGroupEdit
@synthesize delegate;
- (void)viewDidLoad {
[super viewDidLoad];
if ([self.representedObject isKindOfClass:[FeedConfig class]]) {
@@ -203,6 +203,7 @@
if (![item.name isEqualToString: name]) {
item.name = name;
[item.managedObjectContext refreshObject:item mergeChanges:YES];
[self.delegate modalDidUpdateFeedConfig:item];
}
}
}

View File

@@ -22,12 +22,13 @@
#import "SettingsFeeds.h"
#import "AppHook.h"
#import "FeedConfig+Ext.h"
#import "BarMenu.h"
#import "ModalSheet.h"
#import "ModalFeedEdit.h"
#import "DrawImage.h"
#import "StoreCoordinator.h"
@interface SettingsFeeds ()
@interface SettingsFeeds () <ModalEditDelegate>
@property (weak) IBOutlet NSOutlineView *outlineView;
@property (weak) IBOutlet NSTreeController *dataStore;
@@ -43,10 +44,29 @@ static NSString *dragNodeType = @"baRSS-feed-drag";
- (void)viewDidLoad {
[super viewDidLoad];
self.dataStore.managedObjectContext = [(AppHook*)NSApp persistentContainer].viewContext;
self.undoManager = self.dataStore.managedObjectContext.undoManager;
[self.outlineView registerForDraggedTypes:[NSArray arrayWithObject:dragNodeType]];
[self.dataStore setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"sortIndex" ascending:YES]]];
NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[childContext setParentContext:[(AppHook*)NSApp persistentContainer].viewContext];
// childContext.automaticallyMergesChangesFromParent = YES;
NSUndoManager *um = [[NSUndoManager alloc] init];
um.groupsByEvent = NO;
um.levelsOfUndo = 30;
childContext.undoManager = um;
self.dataStore.managedObjectContext = childContext;
self.undoManager = self.dataStore.managedObjectContext.undoManager;
}
- (void)dealloc {
[self saveAndRebuildMenu];
}
- (void)saveAndRebuildMenu {
[StoreCoordinator saveContext:self.dataStore.managedObjectContext];
[StoreCoordinator saveContext:self.dataStore.managedObjectContext.parentContext];
[[(AppHook*)NSApp barMenu] rebuildMenu]; // updating individual items was way to complicated ...
}
- (IBAction)addFeed:(id)sender {
@@ -63,6 +83,7 @@ static NSString *dragNodeType = @"baRSS-feed-drag";
sp.name = @"---";
sp.typ = SEPARATOR;
[self.undoManager endUndoGrouping];
[self saveAndRebuildMenu];
}
- (IBAction)remove:(id)sender {
@@ -71,6 +92,7 @@ static NSString *dragNodeType = @"baRSS-feed-drag";
[self incrementIndicesBy:-1 forSubsequentNodes:path];
[self.dataStore remove:sender];
[self.undoManager endUndoGrouping];
[self saveAndRebuildMenu];
}
- (IBAction)doubleClickOutlineView:(NSOutlineView*)sender {
@@ -97,22 +119,28 @@ static NSString *dragNodeType = @"baRSS-feed-drag";
}
self.modalController = (group ? [ModalGroupEdit new] : [ModalFeedEdit new]);
self.modalController.representedObject = obj;
self.modalController.delegate = self;
[self.view.window beginSheet:[ModalSheet modalWithView:self.modalController.view] completionHandler:^(NSModalResponse returnCode) {
if (returnCode == NSModalResponseOK) {
[self.undoManager beginUndoGrouping];
if (!existingItem) { // create new item
[self.undoManager beginUndoGrouping];
FeedConfig *item = [self insertSortedItemAtSelection];
item.typ = (group ? GROUP : FEED);
self.modalController.representedObject = item;
}
[self.modalController updateRepresentedObject];
[self.undoManager endUndoGrouping];
if (!existingItem)
[self.undoManager endUndoGrouping];
}
self.modalController = nil;
}];
}
- (void)modalDidUpdateFeedConfig:(FeedConfig*)config {
[self saveAndRebuildMenu];
}
- (FeedConfig*)insertSortedItemAtSelection {
NSIndexPath *selectedIndex = [self.dataStore selectionIndexPath];
NSIndexPath *insertIndex = selectedIndex;
@@ -164,13 +192,15 @@ static NSString *dragNodeType = @"baRSS-feed-drag";
}
- (void)outlineView:(NSOutlineView *)outlineView draggingSession:(NSDraggingSession *)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation {
self.currentlyDraggedNodes = nil;
[self.undoManager endUndoGrouping];
if ([self.dataStore.managedObjectContext hasChanges]) {
NSError *err;
[self.dataStore.managedObjectContext save:&err];
if (err) NSLog(@"Error: %@", err);
if (self.dataStore.managedObjectContext.hasChanges) {
[self saveAndRebuildMenu];
} else {
[self.undoManager disableUndoRegistration];
[self.undoManager undoNestedGroup];
[self.undoManager enableUndoRegistration];
}
self.currentlyDraggedNodes = nil;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id <NSDraggingInfo>)info item:(id)item childIndex:(NSInteger)index {
@@ -290,11 +320,13 @@ static NSString *dragNodeType = @"baRSS-feed-drag";
- (void)undo:(id)sender {
[self.undoManager undo];
[self.dataStore rearrangeObjects]; // update ordering
[self saveAndRebuildMenu];
}
- (void)redo:(id)sender {
[self.undoManager redo];
[self.dataStore rearrangeObjects]; // update ordering
[self saveAndRebuildMenu];
}
- (void)enterPressed:(id)sender {