shift-command-D will update the current bookmark.

This commit is contained in:
Kelvin Sherlock 2022-03-18 15:23:56 -04:00
parent 781d8ada60
commit 4e05ff7e8c
4 changed files with 71 additions and 37 deletions

View File

@ -16,6 +16,7 @@
<customObject id="rSq-qV-SGy" customClass="BookmarkManager"> <customObject id="rSq-qV-SGy" customClass="BookmarkManager">
<connections> <connections>
<outlet property="menu" destination="ha0-nx-PIl" id="Ozd-ID-egK"/> <outlet property="menu" destination="ha0-nx-PIl" id="Ozd-ID-egK"/>
<outlet property="updateMenuItem" destination="30b-vT-HIa" id="AgZ-LE-no6"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate"> <customObject id="Voe-Tx-rLC" customClass="AppDelegate">
@ -416,6 +417,11 @@
<action selector="addBookmark:" target="-1" id="cqp-ko-BfQ"/> <action selector="addBookmark:" target="-1" id="cqp-ko-BfQ"/>
</connections> </connections>
</menuItem> </menuItem>
<menuItem title="Update Bookmark" keyEquivalent="D" id="30b-vT-HIa">
<connections>
<action selector="updateBookmark:" target="-1" id="Au0-Sp-cUD"/>
</connections>
</menuItem>
<menuItem title="Set Default" hidden="YES" id="vbR-vS-lqO"> <menuItem title="Set Default" hidden="YES" id="vbR-vS-lqO">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections> <connections>

View File

@ -10,6 +10,7 @@
#import <CoreData/CoreData.h> #import <CoreData/CoreData.h>
@class NSMenu; @class NSMenu;
@class NSMenuItem;
@class Bookmark; @class Bookmark;
@class DiskImage; @class DiskImage;
@ -18,8 +19,11 @@ NS_ASSUME_NONNULL_BEGIN
@interface BookmarkManager : NSObject @interface BookmarkManager : NSObject
@property (weak) IBOutlet NSMenu *menu; @property (weak) IBOutlet NSMenu *menu;
@property (weak) IBOutlet NSMenuItem *updateMenuItem;
@property (readonly) NSManagedObjectContext *managedObjectContext; @property (readonly) NSManagedObjectContext *managedObjectContext;
@property (nullable) Bookmark *currentBookmark;
+(instancetype)sharedManager; +(instancetype)sharedManager;
-(NSString *)uniqueBookmarkName: (NSString *)name; -(NSString *)uniqueBookmarkName: (NSString *)name;
@ -28,13 +32,13 @@ NS_ASSUME_NONNULL_BEGIN
//-(NSError *)saveDefault: (NSDictionary *)bookmark; //-(NSError *)saveDefault: (NSDictionary *)bookmark;
-(Bookmark *)defaultBookmark;
-(NSDictionary *)loadDefault; -(NSDictionary *)loadDefault;
-(NSError *)setAutomatic: (Bookmark *)bookmark; -(NSError *)setAutomatic: (Bookmark *)bookmark;
-(BOOL)addDiskImage: (NSObject *)pathOrURL; -(BOOL)addDiskImage: (NSObject *)pathOrURL;
//-(void)convertLegacyBookmarks; //-(void)convertLegacyBookmarks;
@end @end

View File

@ -28,6 +28,8 @@
NSArrayController *_items; NSArrayController *_items;
NSUInteger _newMenuGeneration; NSUInteger _newMenuGeneration;
NSUInteger _currentMenuGeneration; NSUInteger _currentMenuGeneration;
Bookmark *_currentBookmark;
} }
@end @end
@ -235,7 +237,8 @@ static BookmarkManager *singleton = nil;
} }
-(NSDictionary *)loadDefault { -(Bookmark *)defaultBookmark {
NSFetchRequest *req; NSFetchRequest *req;
NSError *error; NSError *error;
NSArray *array; NSArray *array;
@ -245,10 +248,12 @@ static BookmarkManager *singleton = nil;
[req setPredicate: [NSPredicate predicateWithFormat: @"automatic == TRUE"]]; [req setPredicate: [NSPredicate predicateWithFormat: @"automatic == TRUE"]];
array = [_moc executeFetchRequest: req error: &error]; array = [_moc executeFetchRequest: req error: &error];
b = [array firstObject]; return [array firstObject];
}
return [b dictionary];
-(NSDictionary *)loadDefault {
Bookmark *b = [self defaultBookmark];
return [b dictionary];
} }
/* save as .Default */ /* 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 { -(void)menuNeedsUpdate:(NSMenu *)menu {
if (_currentMenuGeneration == _newMenuGeneration) return; if (_currentMenuGeneration == _newMenuGeneration) return;
_currentMenuGeneration = _newMenuGeneration; _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]; NSArray *menus = [menu itemArray];
for (NSMenuItem *item in [menus reverseObjectEnumerator]) { for (NSMenuItem *item in [menus reverseObjectEnumerator]) {
if ([item tag] == 0xdeadbeef) [_menu removeItem: item]; if ([item tag] == 0xdeadbeef) [_menu removeItem: item];
} }
NSArray *array = [_items arrangedObjects]; NSArray *array = [_items arrangedObjects];
for (Bookmark *b in array) { for (Bookmark *b in array) {

View File

@ -29,6 +29,7 @@ static NSString *kContextMachine = @"kContextMachine";
BOOL _loadingBookmark; BOOL _loadingBookmark;
NSString *_machine; NSString *_machine;
NSDictionary *_machineDescription; NSDictionary *_machineDescription;
BookmarkManager *_manager;
} }
@property (strong) IBOutlet MediaViewController *mediaController; @property (strong) IBOutlet MediaViewController *mediaController;
@property (strong) IBOutlet SlotViewController *slotController; @property (strong) IBOutlet SlotViewController *slotController;
@ -189,6 +190,8 @@ static int EffectsIndex(NSString *str) {
-(void)windowWillLoad { -(void)windowWillLoad {
_manager = [BookmarkManager sharedManager];
// if this calls [self window], it will recurse. that is bad. // if this calls [self window], it will recurse. that is bad.
//[self defaultLoad: nil]; //[self defaultLoad: nil];
[self reset]; [self reset];
@ -731,6 +734,7 @@ static NSString *ShellQuote(NSString *s) {
-(IBAction)resetAll:(id)sender { -(IBAction)resetAll:(id)sender {
[_manager setCurrentBookmark: nil];
[self reset]; [self reset];
[self resetSoftware]; [self resetSoftware];
[_slotController resetSlots: sender]; [_slotController resetSlots: sender];
@ -779,37 +783,40 @@ static NSString *ShellQuote(NSString *s) {
-(IBAction)defaultSave:(id)sender { -(IBAction)defaultSave:(id)sender {
#if 0 #if 0
BookmarkManager *bm = [BookmarkManager sharedManager];
NSDictionary *d = [self makeBookmark]; NSDictionary *d = [self makeBookmark];
[bm saveDefault: d]; [_manager saveDefault: d];
#endif #endif
} }
-(IBAction)defaultLoad:(id)sender { -(IBAction)defaultLoad:(id)sender {
BookmarkManager *bm = [BookmarkManager sharedManager]; Bookmark *b = [_manager defaultBookmark];
NSDictionary *d = [bm loadDefault]; if (!b) {
if (!d) {
[self resetAll: sender]; [self resetAll: sender];
[self setMachine: nil]; [self setMachine: nil];
[_machineViewController reset]; [_machineViewController reset];
[_slotController setMachine: nil]; [_slotController setMachine: nil];
return; 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 { -(IBAction)addBookmark:(id)sender {
if (!_machine) return; if (!_machine) return;
BookmarkManager *bm = [BookmarkManager sharedManager];
NSString *name = nil; NSString *name = nil;
if (_machineDescription) name = [_machineDescription objectForKey:@"description"]; if (_machineDescription) name = [_machineDescription objectForKey:@"description"];
if (!name) name = _machine; if (!name) name = _machine;
@ -819,7 +826,7 @@ static NSString *ShellQuote(NSString *s) {
name = [name stringByAppendingFormat: @" - %@", [_software title]]; name = [name stringByAppendingFormat: @" - %@", [_software title]];
} }
name = [bm uniqueBookmarkName: name]; name = [_manager uniqueBookmarkName: name];
[self setBookmarkName: name]; [self setBookmarkName: name];
[self setBookmarkDefault: NO]; [self setBookmarkDefault: NO];
@ -836,10 +843,9 @@ static NSString *ShellQuote(NSString *s) {
-(IBAction)bookmarkSave:(id)sender { -(IBAction)bookmarkSave:(id)sender {
BookmarkManager *bm = [BookmarkManager sharedManager];
#if 0 #if 0
if (![bm validateName: _bookmarkName]) { if (![_manager validateName: _bookmarkName]) {
[_bookmarkTextField selectText: nil]; [_bookmarkTextField selectText: nil];
NSBeep(); NSBeep();
return; return;
@ -849,7 +855,7 @@ static NSString *ShellQuote(NSString *s) {
NSDictionary *d = [self makeBookmark]; NSDictionary *d = [self makeBookmark];
NSError *e; NSError *e;
if (( e = [bm saveBookmark: d name: _bookmarkName automatic: _bookmarkDefault])) { if (( e = [_manager saveBookmark: d name: _bookmarkName automatic: _bookmarkDefault])) {
// probably a duplicate name... // probably a duplicate name...
[_bookmarkTextField selectText: nil]; [_bookmarkTextField selectText: nil];
[_bookmarkErrorField setStringValue: [e localizedDescription]]; [_bookmarkErrorField setStringValue: [e localizedDescription]];
@ -866,31 +872,24 @@ static NSString *ShellQuote(NSString *s) {
-(void)bookmarkNotification: (NSNotification *)notification { -(void)bookmarkNotification: (NSNotification *)notification {
Bookmark *b = [notification object]; Bookmark *b = [notification object];
NSDictionary *d = [b dictionary]; [self loadBookmark: b];
[self loadBookmark: d];
} }
-(IBAction)bookmarkMenu:(id)sender { -(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. // represented object is a Bookmark.
NSDictionary *d = [(Bookmark *)[sender representedObject] dictionary]; Bookmark *b = [sender representedObject];
[self loadBookmark: d]; [self loadBookmark: b];
} }
-(void)loadBookmark: (NSDictionary *)d { -(void)loadBookmark: (Bookmark *)b {
Class StringClass = [NSString class]; Class StringClass = [NSString class];
Class NumberClass = [NSNumber class]; Class NumberClass = [NSNumber class];
NSDictionary *d = [b dictionary];
[_manager setCurrentBookmark: b];
NSString *machine = [d objectForKey: @"machine"]; NSString *machine = [d objectForKey: @"machine"];
if (!machine) return; if (!machine) return;