diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib index a0b26a9..074fecf 100644 --- a/English.lproj/MainMenu.nib/classes.nib +++ b/English.lproj/MainMenu.nib/classes.nib @@ -2,9 +2,10 @@ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { - ACTIONS = {playNewPitch = id; }; + ACTIONS = {playNewPitch = id; selectLilypondPath = id; }; CLASS = VLAppController; LANGUAGE = ObjC; + OUTLETS = {lilypondPath = id; }; SUPERCLASS = NSObject; } ); diff --git a/English.lproj/MainMenu.nib/info.nib b/English.lproj/MainMenu.nib/info.nib index 52deefc..4d563ef 100644 --- a/English.lproj/MainMenu.nib/info.nib +++ b/English.lproj/MainMenu.nib/info.nib @@ -13,8 +13,8 @@ 452.0 IBOpenObjects - 217 29 + 217 IBSystem Version 9A283 diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index 58f9805..8a1fe5f 100644 Binary files a/English.lproj/MainMenu.nib/keyedobjects.nib and b/English.lproj/MainMenu.nib/keyedobjects.nib differ diff --git a/Resources/UserDefaults.plist b/Resources/UserDefaults.plist index 19a993a..e2d5525 100644 --- a/Resources/UserDefaults.plist +++ b/Resources/UserDefaults.plist @@ -4,6 +4,8 @@ VLHighPitch 75 + VLLilypondPath + /sw/bin/lilypond VLLowPitch 57 diff --git a/Sources/VLAppController.h b/Sources/VLAppController.h index 508d698..8af7a90 100644 --- a/Sources/VLAppController.h +++ b/Sources/VLAppController.h @@ -9,9 +9,17 @@ #import @interface VLAppController : NSObject { + IBOutlet id lilypondPath; + NSString * toolPath; + NSString * appPath; } - (IBAction) playNewPitch:(id)sender; - +- (IBAction) selectLilypondPath:(id)sender; + @end + +// Local Variables: +// mode:ObjC +// End: diff --git a/Sources/VLAppController.mm b/Sources/VLAppController.mm index 0b1f88c..238a44a 100644 --- a/Sources/VLAppController.mm +++ b/Sources/VLAppController.mm @@ -53,6 +53,110 @@ [self setupTransformers]; } +- (id)init +{ + if (self = [super init]) { + toolPath = nil; + appPath = nil; + } +} + +- (NSString*)getLineFromCommand:(NSString*)command +{ + char line[1000]; + FILE * output = popen([command UTF8String], "r"); + if (fgets(line, 1000, output)) { + fprintf(stderr, "Line %s", line); + size_t len = strlen(line); + if (len && line[len-1]=='\n') { + line[len-1] = 0; + return [NSString stringWithUTF8String:line]; + } + } else + NSLog(@"Failed command: %@ (%d)\n", command, errno); + pclose(output); + return nil; +} + +- (NSString *)lilypondVersion:(NSString *)path +{ + NSString * cmd = + [NSString stringWithFormat: + @"%@ --version | awk '{ print $3 }'", + path]; + return [self getLineFromCommand:cmd]; +} + +- (void)awakeFromNib +{ + [lilypondPath setAutoenablesItems:NO]; + + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + NSFileManager * fileManager = [NSFileManager defaultManager]; + NSString * lilyPath = [defaults stringForKey:@"VLLilypondPath"]; + NSRange app = [lilyPath rangeOfString:@".app"]; + bool wantTool = app.location == NSNotFound; + + if ([fileManager isExecutableFileAtPath:lilyPath]) { + // + // Path still valid, figure out what it is + // + if (wantTool) + toolPath = lilyPath; + else + appPath = lilyPath; + } + if (!appPath) + appPath = + [[[NSWorkspace sharedWorkspace] + absolutePathForAppBundleWithIdentifier:@"org.lilypond.lilypond"] + stringByAppendingPathComponent:@"Contents/Resources/bin/lilypond"]; + if (!toolPath) + toolPath = [self getLineFromCommand:@"bash -l which lilypond"]; + + NSString * appVersion = nil; + NSString * toolVersion = nil; + + if (appPath) { + appVersion = [self lilypondVersion:appPath]; + if (!appVersion) + appPath = nil; + } + if (toolPath) { + toolVersion = [self lilypondVersion:toolPath]; + if (!toolVersion) + toolPath = nil; + } + + NSMenuItem * toolItem = [lilypondPath itemAtIndex:0]; + NSMenuItem * appItem = [lilypondPath itemAtIndex:1]; + + if (toolPath) { + [toolItem setTitle: + [NSString stringWithFormat:@"%@ (%@)", toolPath, toolVersion]]; + } else { + [toolItem setTitle:@"lilypond tool not installed"]; + [toolItem setEnabled:NO]; + } + if (appPath) { + NSRange r = [appPath rangeOfString:@"/Contents/Resources"]; + [appItem setTitle: + [NSString stringWithFormat:@"%@ (%@)", + [appPath substringToIndex:r.location], appVersion]]; + } else { + [appItem setTitle:@"Lilypond.app not installed"]; + [appItem setEnabled:NO]; + } + if (!toolPath && appPath) { + wantTool = false; + [defaults setObject:appPath forKey:@"VLLilypondPath"]; + } else if (toolPath && !appPath) { + wantTool = true; + [defaults setObject:toolPath forKey:@"VLLilypondPath"]; + } + [lilypondPath selectItemWithTag:wantTool ? 0 : 1]; +} + - (IBAction) playNewPitch:(id)sender { VLNote note(VLFraction(1,4), [sender intValue]); @@ -60,4 +164,20 @@ VLSoundOut::Instance()->PlayNote(note); } +- (IBAction) selectLilypondPath:(id)sender +{ + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + + switch ([sender tag]) { + case 0: + [defaults setObject:toolPath forKey:@"VLLilypondPath"]; + break; + case 1: + [defaults setObject:toolPath forKey:@"VLLilypondPath"]; + break; + default: + break; + } +} + @end