Merged changes from master.
commit
d969f5a6a7
|
@ -63,4 +63,26 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-(BOOL)validateMenuItem:(NSMenuItem*)menuItem
|
||||||
|
{
|
||||||
|
SEL action = [menuItem action];
|
||||||
|
|
||||||
|
if ([outlineView numberOfSelectedRows] == 0)
|
||||||
|
return NO;
|
||||||
|
|
||||||
|
if (action == @selector(setAsRoot:))
|
||||||
|
{
|
||||||
|
BOOL isDir;
|
||||||
|
NSInteger row = [outlineView selectedRow];
|
||||||
|
|
||||||
|
if ([outlineView numberOfSelectedRows] > 1)
|
||||||
|
return NO;
|
||||||
|
|
||||||
|
// Only let directories be Set as Root
|
||||||
|
[[NSFileManager defaultManager] fileExistsAtPath:[[[outlineView itemAtRow:row] URL] path] isDirectory:&isDir];
|
||||||
|
return isDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
|
|
||||||
- (void)awakeFromNib
|
- (void)awakeFromNib
|
||||||
{
|
{
|
||||||
[[self menu] setAutoenablesItems:NO];
|
|
||||||
[self setDoubleAction:@selector(addToPlaylist:)];
|
[self setDoubleAction:@selector(addToPlaylist:)];
|
||||||
[self setTarget:[self delegate]];
|
[self setTarget:[self delegate]];
|
||||||
}
|
}
|
||||||
|
@ -52,7 +51,6 @@
|
||||||
{
|
{
|
||||||
//Find which row is under the cursor
|
//Find which row is under the cursor
|
||||||
[[self window] makeFirstResponder:self];
|
[[self window] makeFirstResponder:self];
|
||||||
BOOL isDir;
|
|
||||||
NSPoint menuPoint = [self convertPoint:[event locationInWindow] fromView:nil];
|
NSPoint menuPoint = [self convertPoint:[event locationInWindow] fromView:nil];
|
||||||
NSInteger iRow = [self rowAtPoint:menuPoint];
|
NSInteger iRow = [self rowAtPoint:menuPoint];
|
||||||
NSMenu* contextMenu = [self menu];
|
NSMenu* contextMenu = [self menu];
|
||||||
|
@ -71,25 +69,6 @@
|
||||||
[self selectRow:iRow byExtendingSelection:NO];
|
[self selectRow:iRow byExtendingSelection:NO];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([self numberOfSelectedRows] > 0)
|
|
||||||
{
|
|
||||||
[[contextMenu itemWithTag:1] setEnabled:YES]; // Add to Playlist
|
|
||||||
[[contextMenu itemWithTag:2] setEnabled:YES]; // Set as Playlist
|
|
||||||
[[contextMenu itemWithTag:3] setEnabled:YES]; // Show in Finder
|
|
||||||
|
|
||||||
// Only let directories be Set as Root
|
|
||||||
[[NSFileManager defaultManager] fileExistsAtPath:[[[self itemAtRow:iRow] URL] path] isDirectory:&isDir];
|
|
||||||
[[contextMenu itemWithTag:4] setEnabled:(isDir? YES : NO)];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//No rows are selected, so the menu should be displayed with all items disabled
|
|
||||||
int i;
|
|
||||||
for (i=0;i<[contextMenu numberOfItems];i++) {
|
|
||||||
[[contextMenu itemAtIndex:i] setEnabled:NO];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return contextMenu;
|
return contextMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,4 +15,7 @@
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (BOOL)isCoverFile:(NSString *)fileName;
|
||||||
|
+ (NSArray *)coverNames;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -85,6 +85,55 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nil == image) {
|
||||||
|
// Try to load image from external file
|
||||||
|
|
||||||
|
// If we find an appropriately-named image in this directory, it will
|
||||||
|
// be tagged with the first image cache tag. Subsequent directory entries
|
||||||
|
// may have a different tag, but an image search would result in the same
|
||||||
|
// artwork.
|
||||||
|
|
||||||
|
static NSString *lastImagePath = nil;
|
||||||
|
static NSString *lastCacheTag = nil;
|
||||||
|
|
||||||
|
NSString *path = [[url path] stringByDeletingLastPathComponent];
|
||||||
|
|
||||||
|
if ([path isEqualToString:lastImagePath]) {
|
||||||
|
// Use whatever image may have been stored with the initial tag for the path
|
||||||
|
// (might be nil but no point scanning again)
|
||||||
|
|
||||||
|
image = [NSImage imageNamed:lastCacheTag];
|
||||||
|
} else {
|
||||||
|
// Book-keeping...
|
||||||
|
|
||||||
|
if (nil != lastImagePath)
|
||||||
|
[lastImagePath release];
|
||||||
|
|
||||||
|
lastImagePath = [path retain];
|
||||||
|
|
||||||
|
if (nil != lastCacheTag)
|
||||||
|
[lastCacheTag release];
|
||||||
|
|
||||||
|
lastCacheTag = [imageCacheTag retain];
|
||||||
|
|
||||||
|
// Gather list of candidate image files
|
||||||
|
|
||||||
|
NSArray *fileNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];
|
||||||
|
NSArray *imageFileNames = [fileNames pathsMatchingExtensions:[NSImage imageFileTypes]];
|
||||||
|
|
||||||
|
NSEnumerator *imageEnumerator = [imageFileNames objectEnumerator];
|
||||||
|
NSString *fileName;
|
||||||
|
|
||||||
|
while (fileName = [imageEnumerator nextObject]) {
|
||||||
|
if ([TagLibMetadataReader isCoverFile:fileName]) {
|
||||||
|
image = [[[NSImage alloc] initByReferencingFile:[path stringByAppendingPathComponent:fileName]] autorelease];
|
||||||
|
[image setName:imageCacheTag];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (nil != image) {
|
if (nil != image) {
|
||||||
[dict setObject:image forKey:@"albumArt"];
|
[dict setObject:image forKey:@"albumArt"];
|
||||||
}
|
}
|
||||||
|
@ -93,6 +142,25 @@
|
||||||
return [dict autorelease];
|
return [dict autorelease];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (BOOL)isCoverFile:(NSString *)fileName
|
||||||
|
{
|
||||||
|
NSEnumerator *coverEnumerator = [[TagLibMetadataReader coverNames] objectEnumerator];
|
||||||
|
NSString *coverFileName;
|
||||||
|
|
||||||
|
while (coverFileName = [coverEnumerator nextObject]) {
|
||||||
|
if ([[[[fileName lastPathComponent] stringByDeletingPathExtension] lowercaseString] hasSuffix:coverFileName]) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSArray *)coverNames
|
||||||
|
{
|
||||||
|
return [NSArray arrayWithObjects:@"cover", @"folder", @"album", @"front", nil];
|
||||||
|
}
|
||||||
|
|
||||||
+ (NSArray *)fileTypes
|
+ (NSArray *)fileTypes
|
||||||
{
|
{
|
||||||
//May be a way to get a list of supported formats
|
//May be a way to get a list of supported formats
|
||||||
|
|
Loading…
Reference in New Issue