From afc26a3fcee39da7b75c405f027a2b63da15c97e Mon Sep 17 00:00:00 2001 From: "Michael J. Rubinsky" Date: Mon, 15 Dec 2008 16:00:35 -0500 Subject: [PATCH] Don't require a user to click a connect button. Automatically connect when a server is selected via the server combobox. --- iPhoto2Ansel/AnselExportController.h | 2 - iPhoto2Ansel/AnselExportController.m | 73 +++++++++++++-------- iPhoto2Ansel/English.lproj/Panel.nib/classes.nib | 2 + iPhoto2Ansel/English.lproj/Panel.nib/info.nib | 2 +- .../English.lproj/Panel.nib/keyedobjects.nib | Bin 18029 -> 17588 bytes 5 files changed, 48 insertions(+), 31 deletions(-) diff --git a/iPhoto2Ansel/AnselExportController.h b/iPhoto2Ansel/AnselExportController.h index 30105d3f3..29662e994 100644 --- a/iPhoto2Ansel/AnselExportController.h +++ b/iPhoto2Ansel/AnselExportController.h @@ -39,7 +39,6 @@ extern NSString * const TURAnselServerPasswordKey; IBOutlet NSTextField *connectedLabel; IBOutlet NSProgressIndicator *spinner; IBOutlet NSImageView *defaultImageView; - IBOutlet NSButton *beginButton; IBOutlet NSButton *newGalleryButton; IBOutlet NSButton *newServerButton; @@ -79,7 +78,6 @@ extern NSString * const TURAnselServerPasswordKey; - (NSWindow *)window; // Actions -- (IBAction) doConnect: (id)sender; - (IBAction) showNewGallery: (id)sender; - (IBAction) doAddServer: (id)sender; - (IBAction) doCancelAddServer: (id)sender; diff --git a/iPhoto2Ansel/AnselExportController.m b/iPhoto2Ansel/AnselExportController.m index 9c82bc13e..81b23992f 100644 --- a/iPhoto2Ansel/AnselExportController.m +++ b/iPhoto2Ansel/AnselExportController.m @@ -13,7 +13,9 @@ #import "ImageResizer.h"; @interface AnselExportController (PrivateAPI) +- (void)doConnect; - (void)connect; +- (void)disconnect; - (void)postProgressStatus:(NSString *)status; - (void)privatePerformExport; - (void)runExport; @@ -89,31 +91,7 @@ NSString * const TURAnselServerPasswordKey = @"password"; } #pragma mark Actions -// Start the connection process. --(void)doConnect: (id)sender -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSDictionary *p = [[NSDictionary alloc] initWithObjects: [NSArray arrayWithObjects: - [currentServer objectForKey:TURAnselServerEndpointKey], - [currentServer objectForKey:TURAnselServerUsernameKey], - [currentServer objectForKey:TURAnselServerPasswordKey]] - forKeys: [NSArray arrayWithObjects:@"endpoint", @"username", @"password", nil]]; - // Create our controller - anselController = [[TURAnsel alloc] initWithConnectionParameters:p]; - [anselController setDelegate:self]; - - // Set up the galleryCombo - [galleryCombo setUsesDataSource:YES]; - [galleryCombo setDataSource:anselController]; - [galleryCombo setDelegate:self]; - [spinner startAnimation:self]; - // Detach to a new thread and do the actual login/retrieval of gallery list - [NSApplication detachDrawingThread: @selector(connect) - toTarget: self - withObject: nil]; - [p release]; - [pool release]; -} + // Put up the newGallerySheet NSPanel - (IBAction)showNewGallery: (id)sender @@ -153,6 +131,9 @@ NSString * const TURAnselServerPasswordKey = @"password"; // Save it to the userdefaults NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs setObject:anselServers forKey:TURAnselServersKey]; + + // ...and try to connect. + [self doConnect]; } - (IBAction)doCancelAddServer: (id)sender @@ -290,6 +271,42 @@ NSString * const TURAnselServerPasswordKey = @"password"; [galleryCombo setEnabled: YES]; } } + +// Make sure we clean up from any previous connection +-(void)disconnect +{ + [galleryCombo setDelegate: nil]; + [anselController release]; + + //TODO: update status/use notifications? +} + +// Start the connection process. +-(void)doConnect +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSDictionary *p = [[NSDictionary alloc] initWithObjects: [NSArray arrayWithObjects: + [currentServer objectForKey:TURAnselServerEndpointKey], + [currentServer objectForKey:TURAnselServerUsernameKey], + [currentServer objectForKey:TURAnselServerPasswordKey]] + forKeys: [NSArray arrayWithObjects:@"endpoint", @"username", @"password", nil]]; + // Create our controller + anselController = [[TURAnsel alloc] initWithConnectionParameters:p]; + [anselController setDelegate:self]; + + // Set up the galleryCombo + [galleryCombo setUsesDataSource:YES]; + [galleryCombo setDataSource:anselController]; + [galleryCombo setDelegate:self]; + [spinner startAnimation:self]; + // Detach to a new thread and do the actual login/retrieval of gallery list + [NSApplication detachDrawingThread: @selector(connect) + toTarget: self + withObject: nil]; + [p release]; + [pool release]; +} + // Runs in a new thread. - (void)connect { @@ -492,9 +509,10 @@ NSString * const TURAnselServerPasswordKey = @"password"; [theImage release]; [self canExport]; } else if ([notification object] == mServers) { - NSLog(@"Changed server selection"); + [self disconnect]; [currentServer release]; - currentServer = [anselServers objectAtIndex: [mServers indexOfSelectedItem]]; + currentServer = [anselServers objectAtIndex: [mServers indexOfSelectedItem]]; + [self doConnect]; } } @@ -511,7 +529,6 @@ NSString * const TURAnselServerPasswordKey = @"password"; { // Make sure we have a server configured, or throw up the dialog. if (![anselServers count]) { - NSLog(@"No servers!!"); [NSApp beginSheet: newServerSheet modalForWindow: [self window] modalDelegate: nil diff --git a/iPhoto2Ansel/English.lproj/Panel.nib/classes.nib b/iPhoto2Ansel/English.lproj/Panel.nib/classes.nib index e68e9eb3d..3765e66b2 100644 --- a/iPhoto2Ansel/English.lproj/Panel.nib/classes.nib +++ b/iPhoto2Ansel/English.lproj/Panel.nib/classes.nib @@ -75,6 +75,8 @@ NSButton newGallerySheet NSWindow + newServerButton + NSButton newServerSheet NSWindow password diff --git a/iPhoto2Ansel/English.lproj/Panel.nib/info.nib b/iPhoto2Ansel/English.lproj/Panel.nib/info.nib index 9003e369c..eff0405ba 100644 --- a/iPhoto2Ansel/English.lproj/Panel.nib/info.nib +++ b/iPhoto2Ansel/English.lproj/Panel.nib/info.nib @@ -10,8 +10,8 @@ 5 IBOpenObjects - 388 7 + 388 IBSystem Version 9F33 diff --git a/iPhoto2Ansel/English.lproj/Panel.nib/keyedobjects.nib b/iPhoto2Ansel/English.lproj/Panel.nib/keyedobjects.nib index 72e41a5687a40a7251f92516839585673955393f..349c9cbc7323684c66a8f59d306a5f5a8964e7e6 100644 GIT binary patch literal 17588 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 YbY64*EN{X=on877K9v90e>(5}KNTmjod5s; literal 18029 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 -- 2.11.0