diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index 64898c9f8..161419cf4 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -168,6 +168,7 @@ 8E9A30160BA792DC0091081B /* NSFileHandle+CreateFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E9A30140BA792DC0091081B /* NSFileHandle+CreateFile.m */; }; 99EAACA80DD1BB7A00423C38 /* APL.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 566D321B0D538550004466A5 /* APL.bundle */; }; B09E96630D74A7BC0064F138 /* stop_current.png in Resources */ = {isa = PBXBuildFile; fileRef = B09E96620D74A7BC0064F138 /* stop_current.png */; }; + F6F96719102C709000D2C9B4 /* NSString+FinderCompare.m in Sources */ = {isa = PBXBuildFile; fileRef = F6F96718102C709000D2C9B4 /* NSString+FinderCompare.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -768,6 +769,8 @@ 8E9A30140BA792DC0091081B /* NSFileHandle+CreateFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileHandle+CreateFile.m"; sourceTree = ""; }; B09E94300D747F7B0064F138 /* WMA.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = WMA.xcodeproj; path = Plugins/WMA/WMA.xcodeproj; sourceTree = ""; }; B09E96620D74A7BC0064F138 /* stop_current.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = stop_current.png; path = Images/stop_current.png; sourceTree = ""; }; + F6F96718102C709000D2C9B4 /* NSString+FinderCompare.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+FinderCompare.m"; sourceTree = ""; }; + F6F9671A102C70C800D2C9B4 /* NSString+FinderCompare.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+FinderCompare.h"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -936,6 +939,8 @@ 178456110F631E31007E8021 /* SideViewController.m */, 172A12A70F59AF8A0078EF0C /* NSString+CogSort.h */, 172A12A80F59AF8A0078EF0C /* NSString+CogSort.m */, + F6F9671A102C70C800D2C9B4 /* NSString+FinderCompare.h */, + F6F96718102C709000D2C9B4 /* NSString+FinderCompare.m */, 8E9A30130BA792DC0091081B /* NSFileHandle+CreateFile.h */, 8E9A30140BA792DC0091081B /* NSFileHandle+CreateFile.m */, 07E18DF10D62B38400BB0E11 /* NSArray+ShuffleUtils.h */, @@ -1936,6 +1941,7 @@ 171CB3DC0F63670D0047EF0A /* PreferencesWindow.m in Sources */, 1778D3CA0F645BF00037E7A0 /* MissingAlbumArtTransformer.m in Sources */, 17FAEBAC0F662985007C8707 /* ToolTipTextField.m in Sources */, + F6F96719102C709000D2C9B4 /* NSString+FinderCompare.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/English.lproj/FileTree.xib b/English.lproj/FileTree.xib index 18f7c3d72..f416eb02f 100644 --- a/English.lproj/FileTree.xib +++ b/English.lproj/FileTree.xib @@ -2,13 +2,14 @@ 1050 - 9G55 + 9L30 677 - 949.43 + 949.54 353.00 YES - + + YES @@ -231,6 +232,78 @@ FileTreeController + + Menu + + YES + + + Add to Playlist + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + 1 + + + + Set as Playlist + + 1048576 + 2147483647 + + + 2 + + + + YES + YES + + + 2147483647 + + + + + + Show in Finder + + 1048576 + 2147483647 + + + 3 + + + + YES + YES + + + 2147483647 + + + + + + Set as Root + + 1048576 + 2147483647 + + + 4 + + + @@ -287,26 +360,6 @@ 88 - - - value: values.fileTreeRootURL - - - - - - value: values.fileTreeRootURL - value - values.fileTreeRootURL - - NSValueTransformerName - StringToURLTransformer - - 2 - - - 89 - fontSize: values.fontSize @@ -371,6 +424,90 @@ 106 + + + value: values.fileTreeRootURL + + + + + + value: values.fileTreeRootURL + value + values.fileTreeRootURL + + NSValueTransformerName + StringToURLTransformer + + 2 + + + 108 + + + + pathControl + + + + 109 + + + + menu + + + + 121 + + + + addToPlaylist: + + + + 122 + + + + showEntryInFinder: + + + + 123 + + + + setAsRoot: + + + + 125 + + + + setAsPlaylist: + + + + 130 + + + + dataSource + + + + 137 + + + + delegate + + + + 139 + @@ -422,8 +559,8 @@ YES - + File Tree View @@ -491,6 +628,51 @@ + + 110 + + + YES + + + + + + + + + ContextualMenu + + + 112 + + + + + 119 + + + + + 124 + + + + + 126 + + + + + 128 + + + + + 129 + + + @@ -500,6 +682,17 @@ -1.IBPluginDependency -2.IBPluginDependency -3.IBPluginDependency + 110.IBEditorWindowLastContentRect + 110.IBPluginDependency + 110.ImportedFromIB2 + 110.editorWindowContentRectSynchronizationRect + 112.IBPluginDependency + 112.ImportedFromIB2 + 119.IBPluginDependency + 124.IBPluginDependency + 126.IBPluginDependency + 128.IBPluginDependency + 129.IBPluginDependency 27.IBPluginDependency 31.IBPluginDependency 55.IBEditorWindowLastContentRect @@ -529,12 +722,23 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{554, 263}, {307, 399}} - com.apple.InterfaceBuilder.CocoaPlugin + {{310, 530}, {169, 103}} com.apple.InterfaceBuilder.CocoaPlugin + {{482, 640}, {187, 133}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{582, 558}, {307, 399}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -574,7 +778,7 @@ - 106 + 139 @@ -611,19 +815,34 @@ FileTreeController NSObject - addToPlaylist: - id + YES + + YES + addToPlaylist: + setAsPlaylist: + setAsRoot: + showEntryInFinder: + + + YES + id + id + id + id + YES YES controller + dataSource outlineView YES SideViewController + FileTreeDataSource NSOutlineView @@ -640,11 +859,13 @@ YES outlineView + pathControl watcher YES NSOutlineView + NSPathControl PathWatcher @@ -673,8 +894,17 @@ FileTreeViewController SideViewController - playlistLoader - PlaylistLoader + YES + + YES + playbackController + playlistLoader + + + YES + PlaybackController + PlaylistLoader + IBProjectSource @@ -847,6 +1077,10 @@ PlaylistLoader NSObject + + clear: + id + playlistController PlaylistController diff --git a/English.lproj/MainMenu.xib b/English.lproj/MainMenu.xib index 591917272..ee82a5959 100644 --- a/English.lproj/MainMenu.xib +++ b/English.lproj/MainMenu.xib @@ -2,16 +2,16 @@ 1050 - 9G55 + 9J61 677 - 949.43 + 949.46 353.00 YES + - YES @@ -891,44 +891,78 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - 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 -OQA + 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 +K54smy2VLpEvjDCGMYIyezN4NHA1bjZmN2I4WjlUOk47SDxDPT0+Oj80QDJBK0IoQyNEIUUdRhpHFUgP +SQpKAUr6S+5M5U3YTs1PwFC0UadSmFOMVH1VcFZiV1VYSVk9WjJbJlwdXRReDV8GYAFg+2H4YvVj9GTz +ZfNm9Gf1aPhp+Wr9a/9tA24GbwpwDXESchVzGnQedSF2JXcneCp5K3oseyx8LX0qfip/JYAjgR2CF4MP +hAeE/oXzhuqH34jWicuKwYu1jKqNn46Uj4mQfZFzkmaTW5RPlUOWOJcsmCGZFpoLmwCb9pzrneGe1p/N +oMOhuqKyo6mkoaWZppKnjKiGqYCqe6t3rHStcq5wr2+wbrFvsnCzc7R2tXu2gLeFuIu5kbqYu5+8p72v +vri/wcDLwdTC38PqxPXGAccOyBrJJ8o0y0PMUM1gzm7PftCO0Z7Sr9PA1NHV5Nb12AjZG9ov20LcV91q +3n/fk+Cp4b3i0+Po5P7mFOcr6EHpWepw64nsoe277tTv7/EK8iXzQvRf9Xz2m/e6+Nr5/Psd/EH9Zf6K +AAAAPgEbAk0C8wPTBLcFmAaXB30IhAllCloLSgw8DTUOJw8nEBgRGhIQExEUCRUHFgQXAhgCGP4aABr6 +G/4c+B37HvQf8yDwIfEi8CPvJO4l6ibrJ+Uo5ingKuAr2izYLdQu0S/NMMkxxjLAM740uDW4NrA3rjin +OaM6njuaPJY9kj6QP4tAikGEQoNDf0R+RXxGfEd5SHZJc0puS2tMZU1iTllPU1BKUUJSOVMvVCZVG1YS +VwVX+ljsWeBa0lvEXLZdpl6ZX4dgeGFoYlljSmQ6ZSxmHGcPaABo8mnkatZryWy6ba5un2+ScIRxd3Jq +c1x0T3VBdjV3JngaeQx5/3rye+N8133Ifrt/rICfgZCCgoN0hGWFV4ZGhzeIJ4kXigeK9ovmjNSNxY6z +j6KQkZGBknGTX5RQlT+WMJcgmBGZA5n0muab2JzMnb+es5+ooJ2hlKKKo4Oke6V1pnCnbKhpqWeqZ6to +rGutb650r3ywhrGRsp6zrrS/tdG25rf8uRS6LbtIvGS9gr6hv8HA4sIFwyjETMVxxpfHvsjkygzLM8xc +zYTOrc/U0P3SJNNL1HLVmNa91+HZBdon20ncaN2I3qbfxeDj4gHjIOQ+5V3me+eZ6Lfp1erz7BDtLe5L +72fwhPGg8rzz1/Tz9g33KPhB+Vv6c/uN/KP9u/7R/+gAAAA+ARsCTQLzA9QEtwWZBpgHfgiFCWYKWwtL +DD0NNg4oDygQGhEcEhETEhQLFQgWBhcEGAQZABoDGv0cARz6Hf0e9x/2IPMh9CLzI/Ik8iXuJu4n6Sjq +KeMq4yveLNwt2C7VL9IwzTHKMsUzwzS9Nbw2tTezOKw5qDqjO588nD2XPpU/kECQQYpCiUOFRIVFg0aC +R4BIfEl6SnVLckxrTWdOXk9YUE9RR1I+UzRUK1UfVhdXCVf+WPBZ5VrXW8lcvF2sXqBfj2CBYXJiZWNY +ZEplP2YxZydoGWkOagJq92vsbOFt127Kb8FwtXGrcp9zlHSKdX12c3dleFp5TXpBezN8Jn0Yfgl+/H/q +gNuByYK5g6eElIWChm6HW4hFiTGKHIsFi/CM2Y3Ejq2Pl5CAkWqSVJM9lCeVEJX7luWXz5i7maaakpt+ +nGudWZ5HnzagJaEWogii+qPupOOl2abQp8mow6nAqr2rvay+rcKuyK/RsNyx6rL6tA21IrY5t1K4bbmK +uqi7ybzrvg+/NcBcwYXCr8PaxQbGM8dgyI/JvsrtzB3NTc59z6vQ29IJ0zfUZNWQ1rvX5NkM2jLbWNx6 +3Zzevd/e4P7iH+NA5GHlgeah58Ho4eoA6x/sPu1c7nrvl/C18dDy7fQH9SL2O/dV+Gz5hfqa+7H8xf3a +/uz//wAAbmRpbgAAAAAAAAMGAACjwAAAVIAAAEzAAACZgAAAJxcAABF7AABQQAAAVEAAAgQ3AAHtwgAB +5+oAAwB4AAIAAAADAA4AHwA2AFUAewCoANwBFwFaAaQB9gJQArIDHQOPBAoEjgUbBbEGUAb4B6oIZQkp +CfcKzwuwDJoNjQ6KD48QnhG5EuEUFxVYFqYYABllGtQcTB3NH1Ug5CJ6JBcluydnKRwq2SygLnAwSjIv +NCA2HjgpOkI8aj6jQO1DRkWrSB1KnE0nT79SY1UUV9Bal11pYEZjLWYeaRlsHG8ocjt1VXh1e5x+x4H3 +hS6Ibou1jwSSWpW5mR+cjKACo3+nBKqRriWxwbVkuRC8w8B9xEHIDcviz7/TpNeR24TffuN+54Trj++e +87L3yfvj//8AAAADAA4AHwA2AFUAewCoANwBFwFaAaQB9gJQArIDHQOPBAoEjgUbBbEGUAb4B6oIZQkp +CfcKzwuwDJoNjQ6KD48QnRG3EtwUDBVJFpIX5xlIGrYcMR25H04g8CKcJFQmFifjKbsrni2NL4cxjTOf +Nbw35TobPF0+rEEHQ3BF6EhtSwBNoFBNUwZVy1ibW3VeWmFIZD5nPGpBbUtwWnNtdoJ5mXyvf8SC2IXs +iQCMFo8tkkeVY5iEm6ie0qIDpTqoeavBrxSycrXeuVe84MB6xCDH0MuJz0zTGtby2tXew+K95sPq1u72 +8yP3Xfun//8AAAADAA4AHwA2AFUAewCoANwBFwFaAaQB9gJQArIDHQOPBAoEjgUbBbEGUAb4B6oIZQkp +CfcKzwuwDJoNjQ6KD48QnRG3EtwUDRVKFpMX6RlKGrkcMx27H08g7yKZJEwmCifTKaUrgy1sL2AxYDNt +NYc3rTniPCU+eEDaQ0xFzkhgSwJNslBwUztWFFj4W+he4mHlZPBoAmsabjZxVXR0d5R6sX3KgN2D7Ib5 +igWNEZAckyiWNZlFnFifcKKNpbGo3qwUr1WyorX+uWq858B5xBfHwMtyzy/S9tbJ2qjek+KL5pHqpu7K +8v33QvuX//8AAGRlc2MAAAAAAAAAGjIyMDlXQSAxMC81NS8yLjIgMjAwOTA1MjUAAAAAAAAAABoAMgAy +ADAAOQBXAEEAIAAxADAALwA1ADUALwAyAC4AMgAgADIAMAAwADkAMAA1ADIANQAAAAAaMjIwOVdBIDEw +LzU1LzIuMiAyMDA5MDUyNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRl +eHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMDkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AABtbW9kAAAAAAAAEKwAAPARMDg4TMYC6wAAAAAAAAAAAAAAAAAAAAAAA NSCalibratedRGBColorSpace 8 @@ -5887,6 +5921,14 @@ OQA 2451 + + + playbackController + + + + 2452 + @@ -8516,7 +8558,7 @@ OQA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{823, 609}, {142, 63}} + {{809, 609}, {142, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -8607,7 +8649,7 @@ OQA com.apple.InterfaceBuilder.CocoaPlugin - {{524, 599}, {299, 293}} + {{524, 599}, {285, 293}} com.apple.InterfaceBuilder.CocoaPlugin {{376, 543}, {299, 293}} @@ -8635,7 +8677,7 @@ OQA - 2451 + 2452 @@ -8841,8 +8883,17 @@ OQA FileTreeViewController SideViewController - playlistLoader - PlaylistLoader + YES + + YES + playbackController + playlistLoader + + + YES + PlaybackController + PlaylistLoader + IBProjectSource diff --git a/FileTree/DirectoryNode.m b/FileTree/DirectoryNode.m index 5ee47ce52..86b7ec7e5 100644 --- a/FileTree/DirectoryNode.m +++ b/FileTree/DirectoryNode.m @@ -20,7 +20,7 @@ - (void)updatePath { - NSArray *contents = [[[NSFileManager defaultManager] directoryContentsAtPath:[url path]] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; + NSArray *contents = [[[NSFileManager defaultManager] directoryContentsAtPath:[url path]] sortedArrayUsingSelector:@selector(finderCompare:)]; NSMutableArray *fullPaths = [[NSMutableArray alloc] init]; for (NSString *s in contents) diff --git a/FileTree/FileTreeController.h b/FileTree/FileTreeController.h index 02f99c3c6..90deb12de 100644 --- a/FileTree/FileTreeController.h +++ b/FileTree/FileTreeController.h @@ -7,13 +7,18 @@ // #import +#import "FileTreeDataSource.h" @class SideViewController; @interface FileTreeController : NSObject { IBOutlet SideViewController *controller; IBOutlet NSOutlineView *outlineView; + IBOutlet FileTreeDataSource *dataSource; } - (IBAction)addToPlaylist:(id)sender; +- (IBAction)setAsPlaylist:(id)sender; +- (IBAction)showEntryInFinder:(id)sender; +- (IBAction)setAsRoot:(id)sender; @end diff --git a/FileTree/FileTreeController.m b/FileTree/FileTreeController.m index e5cf05d06..baf030bcd 100644 --- a/FileTree/FileTreeController.m +++ b/FileTree/FileTreeController.m @@ -28,5 +28,39 @@ [urls release]; } +- (IBAction)setAsPlaylist:(id)sender +{ + [controller clear:sender]; + [self addToPlaylist:sender]; +} + +- (IBAction)playPauseResume:(NSObject *)id +{ + [controller playPauseResume:id]; +} + +- (IBAction)showEntryInFinder:(id)sender +{ + unsigned int index; + NSWorkspace* ws = [NSWorkspace sharedWorkspace]; + NSIndexSet *selectedIndexes = [outlineView selectedRowIndexes]; + + for (index = [selectedIndexes firstIndex]; + index != NSNotFound; index = [selectedIndexes indexGreaterThanIndex: index]) + { + NSURL *url = [[outlineView itemAtRow:index] URL]; + [ws selectFile:[url path] inFileViewerRootedAtPath:[url path]]; + } +} + +- (IBAction)setAsRoot:(id)sender +{ + unsigned int index = [[outlineView selectedRowIndexes] firstIndex]; + + if (index != NSNotFound) + { + [dataSource changeURL:[[outlineView itemAtRow:index] URL]]; + } +} @end diff --git a/FileTree/FileTreeDataSource.h b/FileTree/FileTreeDataSource.h index 9834cc053..5ea9597ac 100644 --- a/FileTree/FileTreeDataSource.h +++ b/FileTree/FileTreeDataSource.h @@ -13,13 +13,15 @@ @interface FileTreeDataSource : NSObject { PathNode *rootNode; - + + IBOutlet NSPathControl *pathControl; IBOutlet PathWatcher *watcher; IBOutlet NSOutlineView *outlineView; } - (NSURL *)rootURL; - (void)setRootURL:(NSURL *)rootURL; +- (void)changeURL:(NSURL *)rootURL; - (void)reloadPathNode:(PathNode *)item; diff --git a/FileTree/FileTreeDataSource.m b/FileTree/FileTreeDataSource.m index dccf1a1b7..e99933efe 100644 --- a/FileTree/FileTreeDataSource.m +++ b/FileTree/FileTreeDataSource.m @@ -30,6 +30,8 @@ [self setRootURL: [NSURL URLWithString:[[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileTreeRootURL"]]]; + [pathControl setTarget:self]; + [pathControl setAction:@selector(pathControlAction:)]; } - (void) observeValueForKeyPath:(NSString *)keyPath @@ -37,11 +39,27 @@ change:(NSDictionary *)change context:(void *)context { + NSLog([[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileTreeRootURL"]); if ([keyPath isEqualToString:@"values.fileTreeRootURL"]) { [self setRootURL:[NSURL URLWithString:[[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileTreeRootURL"]]]; } } +- (void)changeURL:(NSURL *)url +{ + if (url != nil) + { + [[[NSUserDefaultsController sharedUserDefaultsController] defaults] setObject:[url absoluteString] forKey:@"fileTreeRootURL"]; + } +} + +- (void)pathControlAction:(id)sender +{ + if ([pathControl clickedPathComponentCell] != nil && [[pathControl clickedPathComponentCell] URL] != nil) + { + [self changeURL:[[pathControl clickedPathComponentCell] URL]]; + } +} - (NSURL *)rootURL { @@ -131,13 +149,17 @@ - (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray*)items toPasteboard:(NSPasteboard*)pboard { //Get selected paths NSMutableArray *urls = [NSMutableArray arrayWithCapacity:[items count]]; + NSMutableArray *paths = [NSMutableArray arrayWithCapacity:[items count]]; for (id p in items) { [urls addObject:[p URL]]; + [paths addObject:[[p URL] path]]; } - NSLog(@"URLS: %@", urls); - [pboard declareTypes:[NSArray arrayWithObjects:CogUrlsPboardType,nil] owner:nil]; //add it to pboard + NSLog(@"Paths: %@", paths); + [pboard declareTypes:[NSArray arrayWithObjects:CogUrlsPboardType,nil] owner:nil]; //add it to pboard [pboard setData:[NSArchiver archivedDataWithRootObject:urls] forType:CogUrlsPboardType]; + [pboard addTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:self]; + [pboard setPropertyList:paths forType:NSFilenamesPboardType]; return YES; } diff --git a/FileTree/FileTreeOutlineView.m b/FileTree/FileTreeOutlineView.m index 43be2fdcb..52ccbab1c 100644 --- a/FileTree/FileTreeOutlineView.m +++ b/FileTree/FileTreeOutlineView.m @@ -8,11 +8,13 @@ #import "FileTreeOutlineView.h" #import "FileTreeViewController.h" +#import "PlaybackController.h" @implementation FileTreeOutlineView - (void)awakeFromNib { + [[self menu] setAutoenablesItems:NO]; [self setDoubleAction:@selector(addToPlaylist:)]; [self setTarget:[self delegate]]; } @@ -33,6 +35,11 @@ return; } + else if (modifiers == 0 && c == ' ') + { + [[self delegate] playPauseResume:self]; + return; + } } [super keyDown:e]; @@ -40,4 +47,50 @@ return; } +// enables right-click selection for "Show in Finder" contextual menu +-(NSMenu*)menuForEvent:(NSEvent*)event +{ + //Find which row is under the cursor + [[self window] makeFirstResponder:self]; + BOOL isDir; + NSPoint menuPoint = [self convertPoint:[event locationInWindow] fromView:nil]; + NSInteger iRow = [self rowAtPoint:menuPoint]; + NSMenu* contextMenu = [self menu]; + + /* Update the file tree selection before showing menu + Preserves the selection if the row under the mouse is selected (to allow for + multiple items to be selected), otherwise selects the row under the mouse */ + BOOL currentRowIsSelected = [[self selectedRowIndexes] containsIndex:iRow]; + + if (iRow == -1) + { + [self deselectAll:self]; + } + else if (!currentRowIsSelected) + { + [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; +} + @end diff --git a/FileTree/FileTreeViewController.h b/FileTree/FileTreeViewController.h index e0dce9eca..c7bc651f5 100644 --- a/FileTree/FileTreeViewController.h +++ b/FileTree/FileTreeViewController.h @@ -10,8 +10,10 @@ #import "SideViewController.h" @class PlaylistLoader; +@class PlaybackController; @interface FileTreeViewController : SideViewController { IBOutlet PlaylistLoader *playlistLoader; + IBOutlet PlaybackController *playbackController; } @end diff --git a/FileTree/FileTreeViewController.m b/FileTree/FileTreeViewController.m index a47f5f267..7f60047cb 100644 --- a/FileTree/FileTreeViewController.m +++ b/FileTree/FileTreeViewController.m @@ -16,12 +16,20 @@ return [super initWithNibName:@"FileTree" bundle:[NSBundle mainBundle]]; } - - (void)addToPlaylist:(NSArray *)urls { [playlistLoader willInsertURLs:urls origin:URLOriginExternal]; [playlistLoader didInsertURLs:[playlistLoader addURLs:urls sort:YES] origin:URLOriginExternal]; } +- (void)clear:(id)sender +{ + [playlistLoader clear:sender]; +} + +- (void)playPauseResume:(NSObject *)id +{ + [playbackController playPauseResume:id]; +} @end diff --git a/FileTree/PathNode.h b/FileTree/PathNode.h index 943a965e1..6b6a142f4 100644 --- a/FileTree/PathNode.h +++ b/FileTree/PathNode.h @@ -33,6 +33,8 @@ - (void)setSubpaths:(NSArray *)s; - (NSString *)display; +- (void)setDisplay:(NSString *)s; + - (NSImage *)icon; - (BOOL)isLeaf; diff --git a/FileTree/PathNode.m b/FileTree/PathNode.m index 4a6045723..1f2312d43 100644 --- a/FileTree/PathNode.m +++ b/FileTree/PathNode.m @@ -33,13 +33,13 @@ NSURL *resolveAliases(NSURL *url) if (resolvedUrl != NULL) { - NSLog(@"Resolved..."); + //NSLog(@"Resolved..."); return [(NSURL *)resolvedUrl autorelease]; } } } - NSLog(@"Not resolved"); + //NSLog(@"Not resolved"); return url; } @@ -56,7 +56,6 @@ NSURL *resolveAliases(NSURL *url) return self; } - - (void)setURL:(NSURL *)u { [u retain]; @@ -66,7 +65,7 @@ NSURL *resolveAliases(NSURL *url) url = u; [display release]; - display = [[NSFileManager defaultManager] displayNameAtPath:[url path]]; + display = [[NSFileManager defaultManager] displayNameAtPath:[u path]]; [display retain]; [icon release]; @@ -99,12 +98,13 @@ NSURL *resolveAliases(NSURL *url) } NSURL *u = [NSURL fileURLWithPath:s]; + NSString *displayName = [[NSFileManager defaultManager] displayNameAtPath:[u path]]; PathNode *newNode; - NSLog(@"Before: %@", u); + //NSLog(@"Before: %@", u); u = resolveAliases(u); - NSLog(@"After: %@", u); + //NSLog(@"After: %@", u); if ([[s pathExtension] caseInsensitiveCompare:@"savedSearch"] == NSOrderedSame) { @@ -135,7 +135,8 @@ NSURL *resolveAliases(NSURL *url) newNode = [[FileNode alloc] initWithDataSource:dataSource url:u]; } } - + + [newNode setDisplay:displayName]; [newSubpaths addObject:newNode]; [newNode release]; @@ -169,6 +170,13 @@ NSURL *resolveAliases(NSURL *url) return YES; } +- (void)setDisplay:(NSString *)s +{ + [display release]; + display = s; + [display retain]; +} + - (NSString *)display { return display; diff --git a/Playlist/PlaylistLoader.h b/Playlist/PlaylistLoader.h index 67c15d277..310684f1e 100755 --- a/Playlist/PlaylistLoader.h +++ b/Playlist/PlaylistLoader.h @@ -24,6 +24,11 @@ typedef enum { NSOperationQueue *queue; } +- (void)initDefaults; + +// Clear playlist +- (void)clear:(id)sender; + // Load arrays of urls... - (NSArray*)addURLs:(NSArray *)urls sort:(BOOL)sort; - (NSArray*)addURL:(NSURL *)url; diff --git a/Playlist/PlaylistLoader.m b/Playlist/PlaylistLoader.m index f965fd364..214941d39 100755 --- a/Playlist/PlaylistLoader.m +++ b/Playlist/PlaylistLoader.m @@ -26,6 +26,8 @@ self = [super init]; if (self) { + [self initDefaults]; + queue = [[NSOperationQueue alloc] init]; [queue setMaxConcurrentOperationCount:1]; } @@ -33,6 +35,15 @@ return self; } +- (void)initDefaults +{ + NSDictionary *defaultsDictionary = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:YES], @"readCueSheetsInFolders", + nil]; + + [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDictionary]; +} + - (void)dealloc { [queue release]; @@ -151,7 +162,11 @@ BOOL isDir; if ( [manager fileExistsAtPath:absoluteSubpath isDirectory:&isDir] && isDir == NO) { - [urls addObject:[NSURL fileURLWithPath:absoluteSubpath]]; + if ([[absoluteSubpath pathExtension] caseInsensitiveCompare:@"cue"] != NSOrderedSame || + [[NSUserDefaults standardUserDefaults] boolForKey:@"readCueSheetsInFolders"]) + { + [urls addObject:[NSURL fileURLWithPath:absoluteSubpath]]; + } } } @@ -203,7 +218,8 @@ NSArray *sortedURLs; if (sort == YES) { - sortedURLs = [expandedURLs sortedArrayUsingSelector:@selector(compareTrackNumbers:)]; + sortedURLs = [expandedURLs sortedArrayUsingSelector:@selector(finderCompare:)]; +// sortedURLs = [expandedURLs sortedArrayUsingSelector:@selector(compareTrackNumbers:)]; } else { @@ -360,6 +376,11 @@ } } +- (void)clear:(id)sender +{ + [playlistController clear:sender]; +} + - (NSArray*)addURLs:(NSArray *)urls sort:(BOOL)sort { return [self insertURLs:urls atIndex:[[playlistController content] count] sort:sort]; diff --git a/Preferences/General/English.lproj/Preferences.xib b/Preferences/General/English.lproj/Preferences.xib index 52971a996..e792fd979 100644 --- a/Preferences/General/English.lproj/Preferences.xib +++ b/Preferences/General/English.lproj/Preferences.xib @@ -1,23 +1,32 @@ - + 1050 - 9D34 - 667 - 949.33 - 352.00 + 9L30 + 677 + 949.54 + 353.00 YES - - - + + + YES com.apple.InterfaceBuilder.CocoaPlugin + + YES + + YES + + + YES + + YES @@ -42,6 +51,7 @@ 256 {{91, 70}, {82, 19}} + YES -2075001280 @@ -79,6 +89,7 @@ 256 {{175, 62}, {64, 32}} + YES 67239424 @@ -106,6 +117,7 @@ 256 {{45, 72}, {39, 17}} + YES 67239424 @@ -135,6 +147,7 @@ 256 {{17, 47}, {69, 17}} + YES 67239424 @@ -151,6 +164,7 @@ 256 {{40, 22}, {44, 17}} + YES 67239424 @@ -167,6 +181,7 @@ 256 {{91, 45}, {82, 19}} + YES -2075001280 @@ -184,6 +199,7 @@ 256 {{91, 20}, {82, 19}} + YES -2075001280 @@ -201,6 +217,7 @@ 256 {{175, 37}, {64, 32}} + YES 67239424 @@ -224,6 +241,7 @@ 256 {{175, 12}, {64, 32}} + YES 67239424 @@ -245,13 +263,14 @@ {432, 109} + NSView NSResponder - + 256 YES @@ -306,6 +325,7 @@ {432, 74} + NSView @@ -441,6 +461,12 @@ NSResponder + + YES + parseCueOnAdd + readCueInDir + readCueSheetsInFolders + YES @@ -636,7 +662,7 @@ 268 - {{157, 56}, {257, 26}} + {{157, 78}, {257, 26}} YES @@ -701,7 +727,7 @@ 268 - {{157, 23}, {257, 26}} + {{157, 45}, {257, 26}} YES @@ -766,7 +792,7 @@ 268 - {{17, 63}, {129, 17}} + {{17, 85}, {129, 17}} YES @@ -782,7 +808,7 @@ 268 - {{17, 20}, {138, 35}} + {{17, 42}, {138, 35}} YES @@ -795,8 +821,30 @@ + + + 268 + {{18, 18}, {395, 18}} + + YES + + -2080244224 + 0 + Read cue sheets when adding folders to playlist. + + + 1211912703 + 130 + + + + + 200 + 25 + + - {431, 100} + {432, 122} NSView @@ -1349,6 +1397,22 @@ 309 + + + value: values.readCueSheetsInFolders + + + + + + value: values.readCueSheetsInFolders + value + values.readCueSheetsInFolders + 2 + + + 328 + @@ -1793,6 +1857,7 @@ + PlaylistView @@ -1919,6 +1984,20 @@ + + 310 + + + YES + + + + + + 311 + + + @@ -1953,6 +2032,24 @@ 16.ImportedFromIB2 17.IBPluginDependency 17.ImportedFromIB2 + 196.IBPluginDependency + 197.IBPluginDependency + 198.IBPluginDependency + 199.IBPluginDependency + 200.IBPluginDependency + 201.IBPluginDependency + 202.IBPluginDependency + 203.IBPluginDependency + 204.IBPluginDependency + 205.IBPluginDependency + 206.IBPluginDependency + 207.IBPluginDependency + 208.IBPluginDependency + 209.IBPluginDependency + 210.IBPluginDependency + 211.IBPluginDependency + 212.IBPluginDependency + 213.IBPluginDependency 231.IBEditorWindowLastContentRect 231.IBPluginDependency 231.editorWindowContentRectSynchronizationRect @@ -1993,6 +2090,9 @@ 29.ImportedFromIB2 30.IBPluginDependency 30.ImportedFromIB2 + 310.IBPluginDependency + 311.IBPluginDependency + 43.IBEditorWindowLastContentRect 43.IBPluginDependency 43.ImportedFromIB2 44.IBPluginDependency @@ -2069,7 +2169,25 @@ com.apple.InterfaceBuilder.CocoaPlugin - {{449, 587}, {431, 100}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{488, 692}, {432, 122}} com.apple.InterfaceBuilder.CocoaPlugin {{376, 821}, {431, 100}} com.apple.InterfaceBuilder.CocoaPlugin @@ -2110,6 +2228,9 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{468, 859}, {432, 74}} + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -2176,7 +2297,7 @@ - 309 + 328 @@ -2221,6 +2342,18 @@ + + GeneralPreferencePane + NSObject + + view + NSView + + + IBProjectSource + GeneralPreferencePane.h + + HotKeyControl NDHotKeyControl @@ -2239,7 +2372,7 @@ HotKeyPane - PreferencePane + GeneralPreferencePane YES @@ -2279,7 +2412,7 @@ HotKeyPane - PreferencePane + GeneralPreferencePane IBUserSource @@ -2301,6 +2434,13 @@ + + NSButton + + IBUserSource + + + NSObject @@ -2317,7 +2457,7 @@ OutputPane - PreferencePane + GeneralPreferencePane takeDeviceID: id @@ -2333,7 +2473,7 @@ OutputPane - PreferencePane + GeneralPreferencePane IBUserSource @@ -2363,35 +2503,6 @@ PlaylistBehaviorArrayController.h - - PrefPaneController - NSObject - - YES - - YES - hotKeyPane - outputPane - playlistView - remoteView - scrobblerView - updatesView - - - YES - HotKeyPane - OutputPane - NSView - NSView - NSView - NSView - - - - IBProjectSource - PrefPaneController.h - - PrefPaneController NSObject @@ -2404,18 +2515,6 @@ - - PreferencePane - NSObject - - view - NSView - - - IBProjectSource - PreferencePane.h - - PreferencePane NSObject diff --git a/Utils/NSString+FinderCompare.h b/Utils/NSString+FinderCompare.h new file mode 100644 index 000000000..7153f3970 --- /dev/null +++ b/Utils/NSString+FinderCompare.h @@ -0,0 +1,18 @@ +/* + * NSString+FinderCompare.h + */ + +#import +#include + +@interface NSString (FinderCompare) + +- (NSComparisonResult)finderCompare:(NSString *)aString; + +@end + +@interface NSURL (FinderCompare) + +- (NSComparisonResult)finderCompare:(NSURL *)aURL; + +@end \ No newline at end of file diff --git a/Utils/NSString+FinderCompare.m b/Utils/NSString+FinderCompare.m new file mode 100644 index 000000000..ea09b22b0 --- /dev/null +++ b/Utils/NSString+FinderCompare.m @@ -0,0 +1,46 @@ +// +// FinderCompare.m +// Created by Pablo Gomez Basanta on 23/7/05. +// From: http://neop.gbtopia.com/?p=27 +// +// Based on: +// http://developer.apple.com/qa/qa2004/qa1159.html +// + +#import "NSString+FinderCompare.h" + + + +@implementation NSString (FinderCompare) + +- (NSComparisonResult)finderCompare:(NSString *)aString +{ + SInt32 compareResult; + + CFIndex lhsLen = [self length];; + CFIndex rhsLen = [aString length]; + + UniChar *lhsBuf = malloc(lhsLen * sizeof(UniChar)); + UniChar *rhsBuf = malloc(rhsLen * sizeof(UniChar)); + + [self getCharacters:lhsBuf]; + [aString getCharacters:rhsBuf]; + + (void) UCCompareTextDefault(kUCCollateComposeInsensitiveMask | kUCCollateWidthInsensitiveMask | kUCCollateCaseInsensitiveMask | kUCCollateDigitsOverrideMask | kUCCollateDigitsAsNumberMask| kUCCollatePunctuationSignificantMask,lhsBuf,lhsLen,rhsBuf,rhsLen,NULL,&compareResult); + + free(lhsBuf); + free(rhsBuf); + + return (CFComparisonResult) compareResult; +} + +@end + +@implementation NSURL (FinderCompare) + +- (NSComparisonResult)finderCompare:(NSURL *)aURL +{ + return [[self absoluteString] finderCompare:[aURL absoluteString]]; +} + +@end