Menu - Preferences Sync. There is still a bug with unread count ...
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user