Handle lilypond path

This commit is contained in:
Matthias Neeracher 2006-10-26 08:21:18 +00:00
parent 32ef9e2386
commit 90f7099af9
6 changed files with 134 additions and 3 deletions

View File

@ -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;
}
);

View File

@ -13,8 +13,8 @@
<string>452.0</string>
<key>IBOpenObjects</key>
<array>
<integer>217</integer>
<integer>29</integer>
<integer>217</integer>
</array>
<key>IBSystem Version</key>
<string>9A283</string>

Binary file not shown.

View File

@ -4,6 +4,8 @@
<dict>
<key>VLHighPitch</key>
<integer>75</integer>
<key>VLLilypondPath</key>
<string>/sw/bin/lilypond</string>
<key>VLLowPitch</key>
<integer>57</integer>
</dict>

View File

@ -9,9 +9,17 @@
#import <Cocoa/Cocoa.h>
@interface VLAppController : NSObject {
IBOutlet id lilypondPath;
NSString * toolPath;
NSString * appPath;
}
- (IBAction) playNewPitch:(id)sender;
- (IBAction) selectLilypondPath:(id)sender;
@end
// Local Variables:
// mode:ObjC
// End:

View File

@ -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