diff --git a/Ample/Base.lproj/MainMenu.xib b/Ample/Base.lproj/MainMenu.xib index bf8d1b2..1ef203a 100644 --- a/Ample/Base.lproj/MainMenu.xib +++ b/Ample/Base.lproj/MainMenu.xib @@ -16,6 +16,7 @@ + @@ -416,6 +417,11 @@ + + + + + diff --git a/Ample/BookmarkManager.h b/Ample/BookmarkManager.h index 066a310..e41989a 100644 --- a/Ample/BookmarkManager.h +++ b/Ample/BookmarkManager.h @@ -10,6 +10,7 @@ #import @class NSMenu; +@class NSMenuItem; @class Bookmark; @class DiskImage; @@ -18,8 +19,11 @@ NS_ASSUME_NONNULL_BEGIN @interface BookmarkManager : NSObject @property (weak) IBOutlet NSMenu *menu; +@property (weak) IBOutlet NSMenuItem *updateMenuItem; @property (readonly) NSManagedObjectContext *managedObjectContext; +@property (nullable) Bookmark *currentBookmark; + +(instancetype)sharedManager; -(NSString *)uniqueBookmarkName: (NSString *)name; @@ -28,13 +32,13 @@ NS_ASSUME_NONNULL_BEGIN //-(NSError *)saveDefault: (NSDictionary *)bookmark; +-(Bookmark *)defaultBookmark; -(NSDictionary *)loadDefault; -(NSError *)setAutomatic: (Bookmark *)bookmark; -(BOOL)addDiskImage: (NSObject *)pathOrURL; - //-(void)convertLegacyBookmarks; @end diff --git a/Ample/BookmarkManager.m b/Ample/BookmarkManager.m index cdba613..c8a426a 100644 --- a/Ample/BookmarkManager.m +++ b/Ample/BookmarkManager.m @@ -28,6 +28,8 @@ NSArrayController *_items; NSUInteger _newMenuGeneration; NSUInteger _currentMenuGeneration; + + Bookmark *_currentBookmark; } @end @@ -235,7 +237,8 @@ static BookmarkManager *singleton = nil; } --(NSDictionary *)loadDefault { +-(Bookmark *)defaultBookmark { + NSFetchRequest *req; NSError *error; NSArray *array; @@ -245,10 +248,12 @@ static BookmarkManager *singleton = nil; [req setPredicate: [NSPredicate predicateWithFormat: @"automatic == TRUE"]]; array = [_moc executeFetchRequest: req error: &error]; - b = [array firstObject]; - - return [b dictionary]; + return [array firstObject]; +} +-(NSDictionary *)loadDefault { + Bookmark *b = [self defaultBookmark]; + return [b dictionary]; } /* save as .Default */ @@ -557,17 +562,37 @@ static NSString *kMenuContext = @""; { } +-(Bookmark *)currentBookmark { + return _currentBookmark; +} +-(void)setCurrentBookmark:(Bookmark *)currentBookmark { + if (currentBookmark == _currentBookmark) return; + _currentBookmark = currentBookmark; + _newMenuGeneration++; +} + -(void)menuNeedsUpdate:(NSMenu *)menu { if (_currentMenuGeneration == _newMenuGeneration) return; _currentMenuGeneration = _newMenuGeneration; + + if (_currentBookmark && _updateMenuItem) { + NSString *title = [NSString stringWithFormat: @"Update “%@”", [_currentBookmark name]]; + [_updateMenuItem setHidden: NO]; + [_updateMenuItem setTitle: title]; + [_updateMenuItem setRepresentedObject: _currentBookmark]; + } else { + [_updateMenuItem setHidden: YES]; + [_updateMenuItem setRepresentedObject: nil]; + } + NSArray *menus = [menu itemArray]; for (NSMenuItem *item in [menus reverseObjectEnumerator]) { if ([item tag] == 0xdeadbeef) [_menu removeItem: item]; } - + NSArray *array = [_items arrangedObjects]; for (Bookmark *b in array) { diff --git a/Ample/LaunchWindowController.m b/Ample/LaunchWindowController.m index 767a0e6..d38f78e 100644 --- a/Ample/LaunchWindowController.m +++ b/Ample/LaunchWindowController.m @@ -29,6 +29,7 @@ static NSString *kContextMachine = @"kContextMachine"; BOOL _loadingBookmark; NSString *_machine; NSDictionary *_machineDescription; + BookmarkManager *_manager; } @property (strong) IBOutlet MediaViewController *mediaController; @property (strong) IBOutlet SlotViewController *slotController; @@ -189,6 +190,8 @@ static int EffectsIndex(NSString *str) { -(void)windowWillLoad { + _manager = [BookmarkManager sharedManager]; + // if this calls [self window], it will recurse. that is bad. //[self defaultLoad: nil]; [self reset]; @@ -731,6 +734,7 @@ static NSString *ShellQuote(NSString *s) { -(IBAction)resetAll:(id)sender { + [_manager setCurrentBookmark: nil]; [self reset]; [self resetSoftware]; [_slotController resetSlots: sender]; @@ -779,37 +783,40 @@ static NSString *ShellQuote(NSString *s) { -(IBAction)defaultSave:(id)sender { - #if 0 - - BookmarkManager *bm = [BookmarkManager sharedManager]; - +#if 0 NSDictionary *d = [self makeBookmark]; - [bm saveDefault: d]; + [_manager saveDefault: d]; #endif } -(IBAction)defaultLoad:(id)sender { - BookmarkManager *bm = [BookmarkManager sharedManager]; + Bookmark *b = [_manager defaultBookmark]; - NSDictionary *d = [bm loadDefault]; - if (!d) { + if (!b) { [self resetAll: sender]; [self setMachine: nil]; [_machineViewController reset]; [_slotController setMachine: nil]; return; } - [self loadBookmark: d]; + [self loadBookmark: b]; +} + +-(IBAction)updateBookmark: (id)sender { + + Bookmark *b = [sender representedObject]; + if (!b) return; + + NSDictionary *d = [self makeBookmark]; + [b setDictionary: d]; } -(IBAction)addBookmark:(id)sender { if (!_machine) return; - BookmarkManager *bm = [BookmarkManager sharedManager]; - NSString *name = nil; if (_machineDescription) name = [_machineDescription objectForKey:@"description"]; if (!name) name = _machine; @@ -819,7 +826,7 @@ static NSString *ShellQuote(NSString *s) { name = [name stringByAppendingFormat: @" - %@", [_software title]]; } - name = [bm uniqueBookmarkName: name]; + name = [_manager uniqueBookmarkName: name]; [self setBookmarkName: name]; [self setBookmarkDefault: NO]; @@ -836,10 +843,9 @@ static NSString *ShellQuote(NSString *s) { -(IBAction)bookmarkSave:(id)sender { - BookmarkManager *bm = [BookmarkManager sharedManager]; #if 0 - if (![bm validateName: _bookmarkName]) { + if (![_manager validateName: _bookmarkName]) { [_bookmarkTextField selectText: nil]; NSBeep(); return; @@ -849,7 +855,7 @@ static NSString *ShellQuote(NSString *s) { NSDictionary *d = [self makeBookmark]; NSError *e; - if (( e = [bm saveBookmark: d name: _bookmarkName automatic: _bookmarkDefault])) { + if (( e = [_manager saveBookmark: d name: _bookmarkName automatic: _bookmarkDefault])) { // probably a duplicate name... [_bookmarkTextField selectText: nil]; [_bookmarkErrorField setStringValue: [e localizedDescription]]; @@ -866,31 +872,24 @@ static NSString *ShellQuote(NSString *s) { -(void)bookmarkNotification: (NSNotification *)notification { Bookmark *b = [notification object]; - NSDictionary *d = [b dictionary]; - - [self loadBookmark: d]; + [self loadBookmark: b]; } -(IBAction)bookmarkMenu:(id)sender { - -#if 0 - NSURL *url = [sender representedObject]; - if (!url) return; - - NSDictionary *d = [NSDictionary dictionaryWithContentsOfURL: url]; - if (!d) return; // oops... - -#endif + // represented object is a Bookmark. - NSDictionary *d = [(Bookmark *)[sender representedObject] dictionary]; - [self loadBookmark: d]; + Bookmark *b = [sender representedObject]; + [self loadBookmark: b]; } --(void)loadBookmark: (NSDictionary *)d { +-(void)loadBookmark: (Bookmark *)b { Class StringClass = [NSString class]; Class NumberClass = [NSNumber class]; - + + NSDictionary *d = [b dictionary]; + + [_manager setCurrentBookmark: b]; NSString *machine = [d objectForKey: @"machine"]; if (!machine) return;