From f028fa22f1616c3bb862d03e2d8182ff29e629b3 Mon Sep 17 00:00:00 2001 From: vspader Date: Sat, 2 Sep 2006 16:09:20 +0000 Subject: [PATCH] Added file drawer and hotkeys. --- AppController.h | 13 +- AppController.m | 147 +++++- Cog.xcodeproj/project.pbxproj | 308 +++++++---- Credits.html | 2 +- English.lproj/MainMenu.nib/classes.nib | 15 +- English.lproj/MainMenu.nib/info.nib | 11 +- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 61254 -> 66201 bytes FileDrawer/DirectoryNode.h | 20 + FileDrawer/DirectoryNode.m | 94 ++++ FileDrawer/FileIconCell.h | 16 + FileDrawer/FileIconCell.m | 26 + FileDrawer/FileNode.h | 17 + FileDrawer/FileNode.m | 18 + FileDrawer/FileOutlineView.h | 16 + FileDrawer/FileOutlineView.m | 31 ++ FileDrawer/FileTreeController.h | 25 + FileDrawer/FileTreeController.m | 145 ++++++ FileDrawer/FileTreeWatcher.h | 19 + FileDrawer/FileTreeWatcher.m | 55 ++ FileDrawer/ImageTextCell.h | 20 + FileDrawer/ImageTextCell.m | 83 +++ FileDrawer/PathIcon.h | 19 + FileDrawer/PathIcon.m | 38 ++ FileDrawer/PathNode.h | 23 + FileDrawer/PathNode.m | 50 ++ .../UKKQueue/UKFNSubscribeFileWatcher.h | 49 ++ .../UKKQueue/UKFNSubscribeFileWatcher.m | 201 ++++++++ FileDrawer/UKKQueue/UKFileWatcher.h | 62 +++ FileDrawer/UKKQueue/UKFileWatcher.m | 38 ++ FileDrawer/UKKQueue/UKKQueue Readme.txt | 32 ++ FileDrawer/UKKQueue/UKKQueue.h | 122 +++++ FileDrawer/UKKQueue/UKKQueue.m | 480 ++++++++++++++++++ FileDrawer/UKKQueue/UKMainThreadProxy.h | 56 ++ FileDrawer/UKKQueue/UKMainThreadProxy.m | 151 ++++++ Icons/add_blue.png | Bin 0 -> 4838 bytes Icons/add_gray.png | Bin 0 -> 4852 bytes Icons/file_blue.png | Bin 0 -> 2246 bytes Icons/file_gray.png | Bin 0 -> 2056 bytes Icons/info_blue.png | Bin 2312 -> 4848 bytes Icons/info_gray.png | Bin 2068 -> 4838 bytes Icons/loop_blue_1.png | Bin 2649 -> 0 bytes Icons/loop_blue_2.png | Bin 2710 -> 0 bytes Icons/loop_gray.png | Bin 2113 -> 0 bytes Icons/minus_blue.png | Bin 1954 -> 0 bytes Icons/minus_gray.png | Bin 1685 -> 0 bytes Icons/next_blue.png | Bin 2320 -> 2328 bytes Icons/next_gray.png | Bin 2051 -> 2231 bytes Icons/pause_blue.png | Bin 2951 -> 2947 bytes Icons/pause_gray.png | Bin 2464 -> 2837 bytes Icons/play_blue.png | Bin 3051 -> 3141 bytes Icons/play_gray.png | Bin 2631 -> 3021 bytes Icons/playlist_blue.png | Bin 2475 -> 0 bytes Icons/playlist_gray.png | Bin 2374 -> 0 bytes Icons/plus_blue.png | Bin 2229 -> 0 bytes Icons/plus_gray.png | Bin 1901 -> 0 bytes Icons/prev_blue.png | Bin 0 -> 2388 bytes Icons/prev_gray.png | Bin 0 -> 2256 bytes Icons/previous_blue.png | Bin 2315 -> 0 bytes Icons/previous_gray.png | Bin 2010 -> 0 bytes Icons/random_blue.png | Bin 2245 -> 0 bytes Icons/random_gray.png | Bin 1954 -> 0 bytes Icons/remove_blue.png | Bin 0 -> 4751 bytes Icons/remove_gray.png | Bin 0 -> 4717 bytes Icons/repeat_off.png | Bin 0 -> 4900 bytes Icons/repeat_on.png | Bin 0 -> 5152 bytes Icons/shuffle_off.png | Bin 0 -> 4785 bytes Icons/shuffle_on.png | Bin 0 -> 4844 bytes Playlist/PlaylistController.m | 4 +- Sound/BufferChain.m | 2 +- Sound/SoundFile/CoreAudioFile.h | 2 +- Sound/SoundFile/CoreAudioFile.m | 4 +- Sound/SoundFile/MADFile.h | 6 + Sound/SoundFile/MADFile.m | 86 +++- 73 files changed, 2364 insertions(+), 142 deletions(-) create mode 100644 FileDrawer/DirectoryNode.h create mode 100644 FileDrawer/DirectoryNode.m create mode 100644 FileDrawer/FileIconCell.h create mode 100644 FileDrawer/FileIconCell.m create mode 100644 FileDrawer/FileNode.h create mode 100644 FileDrawer/FileNode.m create mode 100644 FileDrawer/FileOutlineView.h create mode 100644 FileDrawer/FileOutlineView.m create mode 100644 FileDrawer/FileTreeController.h create mode 100644 FileDrawer/FileTreeController.m create mode 100644 FileDrawer/FileTreeWatcher.h create mode 100644 FileDrawer/FileTreeWatcher.m create mode 100644 FileDrawer/ImageTextCell.h create mode 100644 FileDrawer/ImageTextCell.m create mode 100644 FileDrawer/PathIcon.h create mode 100644 FileDrawer/PathIcon.m create mode 100644 FileDrawer/PathNode.h create mode 100644 FileDrawer/PathNode.m create mode 100644 FileDrawer/UKKQueue/UKFNSubscribeFileWatcher.h create mode 100644 FileDrawer/UKKQueue/UKFNSubscribeFileWatcher.m create mode 100644 FileDrawer/UKKQueue/UKFileWatcher.h create mode 100644 FileDrawer/UKKQueue/UKFileWatcher.m create mode 100644 FileDrawer/UKKQueue/UKKQueue Readme.txt create mode 100644 FileDrawer/UKKQueue/UKKQueue.h create mode 100644 FileDrawer/UKKQueue/UKKQueue.m create mode 100644 FileDrawer/UKKQueue/UKMainThreadProxy.h create mode 100644 FileDrawer/UKKQueue/UKMainThreadProxy.m create mode 100644 Icons/add_blue.png create mode 100644 Icons/add_gray.png create mode 100644 Icons/file_blue.png create mode 100644 Icons/file_gray.png delete mode 100644 Icons/loop_blue_1.png delete mode 100644 Icons/loop_blue_2.png delete mode 100644 Icons/loop_gray.png delete mode 100644 Icons/minus_blue.png delete mode 100644 Icons/minus_gray.png delete mode 100644 Icons/playlist_blue.png delete mode 100644 Icons/playlist_gray.png delete mode 100644 Icons/plus_blue.png delete mode 100644 Icons/plus_gray.png create mode 100644 Icons/prev_blue.png create mode 100644 Icons/prev_gray.png delete mode 100644 Icons/previous_blue.png delete mode 100644 Icons/previous_gray.png delete mode 100644 Icons/random_blue.png delete mode 100644 Icons/random_gray.png create mode 100644 Icons/remove_blue.png create mode 100644 Icons/remove_gray.png create mode 100644 Icons/repeat_off.png create mode 100644 Icons/repeat_on.png create mode 100644 Icons/shuffle_off.png create mode 100644 Icons/shuffle_on.png diff --git a/AppController.h b/AppController.h index 055c31295..94b3fad25 100644 --- a/AppController.h +++ b/AppController.h @@ -3,6 +3,7 @@ #import #import "PlaylistController.h" +#import "FileTreeController.h" @interface AppController : NSObject { @@ -16,23 +17,30 @@ IBOutlet NSButton *addButton; IBOutlet NSButton *remButton; IBOutlet NSButton *infoButton; + IBOutlet NSButton *fileButton; IBOutlet NSButton *shuffleButton; IBOutlet NSButton *repeatButton; IBOutlet NSDrawer *infoDrawer; + IBOutlet NSDrawer *fileDrawer; + + IBOutlet FileTreeController *fileTreeController; } -- (IBAction)addFiles:(id)sender; +- (IBAction)openFiles:(id)sender; - (IBAction)delEntries:(id)sender; - (IBAction)savePlaylist:(id)sender; - (IBAction)savePlaylistAs:(id)sender; - (IBAction)loadPlaylist:(id)sender; +- (IBAction)addFiles:(id)sender; + - (void)openPanelDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (IBAction)donate:(id)sender; - (IBAction)toggleInfoDrawer:(id)sender; +- (IBAction)toggleFileDrawer:(id)sender; - (void)drawerDidOpen:(NSNotification *)notification; - (void)drawerDidClose:(NSNotification *)notification; @@ -41,4 +49,7 @@ - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename; - (void)application:(NSApplication *)theApplication openFiles:(NSArray *)filenames; +- (void)registerHotKeys; +OSStatus handleHotKey(EventHandlerCallRef nextHandler,EventRef theEvent,void *userData); + @end diff --git a/AppController.m b/AppController.m index c603a2551..c165f86c7 100644 --- a/AppController.m +++ b/AppController.m @@ -2,7 +2,7 @@ @implementation AppController -- (IBAction)addFiles:(id)sender +- (IBAction)openFiles:(id)sender { NSOpenPanel *p; @@ -11,24 +11,24 @@ [p setCanChooseDirectories:YES]; [p setAllowsMultipleSelection:YES]; - // [p beginSheetForDirectory:nil file:nil types:[listController acceptableFileTypes] modalForWindow:mainWindow modalDelegate:self didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:NULL]; - // [p beginForDirectory:nil file:nil types:[playlistController acceptableFileTypes] modelessDelegate:self didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:nil]; + [p beginSheetForDirectory:nil file:nil types:[playlistController acceptableFileTypes] modalForWindow:mainWindow modalDelegate:self didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:NULL]; + [p beginForDirectory:nil file:nil types:[playlistController acceptableFileTypes] modelessDelegate:self didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:nil]; - if ([p runModalForTypes:[playlistController acceptableFileTypes]] == NSOKButton) +/* if ([p runModalForTypes:[playlistController acceptableFileTypes]] == NSOKButton) { - [playlistController addPaths:[p filenames] sort:NO]; + [playlistController addPaths:[p filenames] sort:YES]; } - +*/ } - (void)openPanelDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo { if (returnCode == NSOKButton) { - [playlistController addPaths:[panel filenames] sort:NO]; + [playlistController addPaths:[panel filenames] sort:YES]; } - [panel release]; +// [panel release]; } - (IBAction)delEntries:(id)sender @@ -36,6 +36,21 @@ [playlistController remove:self]; } +- (IBAction)addFiles:(id)sender +{ + NSMutableArray *paths = [[NSMutableArray alloc] init]; + NSArray *nodes = [fileTreeController selectedObjects]; + NSEnumerator *e = [nodes objectEnumerator]; + + id n; + while (n = [e nextObject]) { + [paths addObject:[n path]]; + } + + [playlistController addPaths:paths sort:YES]; + [paths release]; +} + - (PlaylistEntry *)currentEntry { return [playlistController currentEntry]; @@ -49,6 +64,8 @@ - (void)awakeFromNib { + [self initDefaults]; + // DBLog(@"AWAKe"); [playButton setToolTip:NSLocalizedString(@"PlayButtonTooltip", @"")]; [stopButton setToolTip:NSLocalizedString(@"StopButtonTooltip", @"")]; @@ -60,6 +77,8 @@ [shuffleButton setToolTip:NSLocalizedString(@"ShuffleButtonTooltip", @"")]; [repeatButton setToolTip:NSLocalizedString(@"RepeatButtonTooltip", @"")]; + [self registerHotKeys]; + NSString *filename = @"~/Library/Application Support/Cog/Default.playlist"; [playlistController loadPlaylist:[filename stringByExpandingTildeInPath]]; } @@ -156,14 +175,27 @@ [infoDrawer toggle:self]; } +- (IBAction)toggleFileDrawer:(id)sender +{ + [mainWindow makeKeyAndOrderFront:self]; + + [fileDrawer toggle:self]; +} + - (void)drawerDidOpen:(NSNotification *)notification { - [infoButton setState:NSOnState]; + if ([notification object] == infoDrawer) + [infoButton setState:NSOnState]; + else if ([notification object] == fileDrawer) + [fileButton setState:NSOnState]; } - (void)drawerDidClose:(NSNotification *)notification { - [infoButton setState:NSOffState]; + if ([notification object] == infoDrawer) + [infoButton setState:NSOffState]; + else if ([notification object] == fileDrawer) + [fileButton setState:NSOffState]; } - (IBAction)donate:(id)sender @@ -171,4 +203,99 @@ [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://sourceforge.net/project/project_donations.php?group_id=140003"]]; } +- (void)initDefaults +{ + NSMutableDictionary *userDefaultsValuesDict = [NSMutableDictionary dictionary]; + [userDefaultsValuesDict setObject:[NSNumber numberWithInt:35] forKey:@"hotkeyCodePlay"]; + [userDefaultsValuesDict setObject:[NSNumber numberWithInt:controlKey+cmdKey] forKey:@"hotkeyModifiersPlay"]; + + [userDefaultsValuesDict setObject:[NSNumber numberWithInt:45] forKey:@"hotkeyCodeNext"]; + [userDefaultsValuesDict setObject:[NSNumber numberWithInt:controlKey+cmdKey] forKey:@"hotkeyModifiersNext"]; + + [userDefaultsValuesDict setObject:[NSNumber numberWithInt:15] forKey:@"hotkeyCodePrevious"]; + [userDefaultsValuesDict setObject:[NSNumber numberWithInt:controlKey+cmdKey] forKey:@"hotkeyModifiersPrevious"]; + + //Register and sync defaults + [[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValuesDict]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +//Register the Hotkeys. Added by Chris Henderson, 21 May 2006 +//See http://www.dbachrach.com/blog/2005/11/program-global-hotkeys-in-cocoa-easily.html +- (void)registerHotKeys +{ + EventHotKeyRef gMyHotKeyRef; + EventHotKeyID gMyHotKeyID; + EventTypeSpec eventType; + eventType.eventClass=kEventClassKeyboard; + eventType.eventKind=kEventHotKeyPressed; + InstallApplicationEventHandler(&handleHotKey,1,&eventType,self,NULL); + //Play + gMyHotKeyID.signature='htk1'; + gMyHotKeyID.id=1; + if([[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyCodePlay"]!=-999) + { + RegisterEventHotKey([[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyCodePlay"], [[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyModifiersPlay"], gMyHotKeyID, GetApplicationEventTarget(), 0, &gMyHotKeyRef); + } + //Previous + gMyHotKeyID.signature='htk2'; + gMyHotKeyID.id=2; + if([[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyCodePrevious"]!=-999) + { + NSLog(@"REGISTERING: %i", [[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyCodePrevious"]); + RegisterEventHotKey([[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyCodePrevious"], [[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyModifiersPrevious"], gMyHotKeyID, GetApplicationEventTarget(), 0, &gMyHotKeyRef); + } + //Next + gMyHotKeyID.signature='htk3'; + gMyHotKeyID.id=3; + if([[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyCodeNext"]!=-999) + { + RegisterEventHotKey([[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyCodeNext"], [[NSUserDefaults standardUserDefaults] integerForKey:@"hotkeyModifiersNext"], gMyHotKeyID, GetApplicationEventTarget(), 0, &gMyHotKeyRef); + } +} + +//Handle the Hotkeys. Added by Chris Henderson, 21 May 2006 +OSStatus handleHotKey(EventHandlerCallRef nextHandler,EventRef theEvent,void *userData) +{ + EventHotKeyID hkID; + GetEventParameter(theEvent,kEventParamDirectObject,typeEventHotKeyID,NULL,sizeof(hkID),NULL,&hkID); + int i = hkID.id; + + NSLog(@"Handling: %i", i); + switch (i) + { + case 1: [userData clickPlay]; + break; + case 2: [userData clickPrev]; + break; + case 3: [userData clickNext]; + break; + } + return noErr; +} + + +- (void)clickPlay +{ + [playButton performClick:nil]; +} + +- (void)clickPrev +{ + NSLog(@"PREV"); + [prevButton performClick:nil]; +} + +- (void)clickNext +{ + NSLog(@"NEXT"); + [nextButton performClick:nil]; +} + +- (void)clickStop +{ + [stopButton performClick:nil]; +} + + @end diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index e0db5a769..075bd283e 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -19,6 +19,8 @@ 8E1849C90A43DB730084C69D /* MADFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E1849C70A43DB730084C69D /* MADFile.m */; }; 8E4C7F090A0509FC003BE25F /* DragScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E4C7F070A0509FC003BE25F /* DragScrollView.m */; }; 8E4CAB5B0A32251B00214C1D /* ShnFile.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8E4CAB5A0A32251B00214C1D /* ShnFile.mm */; }; + 8E4E7C1A0AA1ED4500D11405 /* file_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E4E7C180AA1ED4500D11405 /* file_blue.png */; }; + 8E4E7C1B0AA1ED4500D11405 /* file_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E4E7C190AA1ED4500D11405 /* file_gray.png */; }; 8E53E8610A44C11B007E5BCE /* ID3Tag.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E53E8600A44C11B007E5BCE /* ID3Tag.framework */; }; 8E53E8690A44C121007E5BCE /* ID3Tag.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E53E8600A44C11B007E5BCE /* ID3Tag.framework */; }; 8E6A8E2C0A0D8A68002ABE9C /* CoreAudioFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E6A8E280A0D8A68002ABE9C /* CoreAudioFile.m */; }; @@ -55,8 +57,6 @@ 8E75758B09F31D5A0080F1EE /* DBLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E75756409F31D5A0080F1EE /* DBLog.m */; }; 8E75758C09F31D5A0080F1EE /* Semaphore.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E75756609F31D5A0080F1EE /* Semaphore.m */; }; 8E75758D09F31D5A0080F1EE /* VirtualRingBuffer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E75756809F31D5A0080F1EE /* VirtualRingBuffer.m */; }; - 8E7575BC09F31D800080F1EE /* volume_high.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7575A409F31D800080F1EE /* volume_high.png */; }; - 8E7575BD09F31D800080F1EE /* volume_low.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7575A509F31D800080F1EE /* volume_low.png */; }; 8E7575BE09F31D800080F1EE /* wheel.icns in Resources */ = {isa = PBXBuildFile; fileRef = 8E7575A609F31D800080F1EE /* wheel.icns */; }; 8E7575CB09F31DCA0080F1EE /* Changelog in Resources */ = {isa = PBXBuildFile; fileRef = 8E7575C309F31DCA0080F1EE /* Changelog */; }; 8E7575CC09F31DCA0080F1EE /* Cog.scriptSuite in Resources */ = {isa = PBXBuildFile; fileRef = 8E7575C409F31DCA0080F1EE /* Cog.scriptSuite */; }; @@ -85,30 +85,56 @@ 8E757B5709F326710080F1EE /* OggFLAC.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E75773809F31F1F0080F1EE /* OggFLAC.framework */; }; 8E757C7C09F32F070080F1EE /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E757C7A09F32F070080F1EE /* AudioToolbox.framework */; }; 8E757C7D09F32F070080F1EE /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E757C7B09F32F070080F1EE /* AudioUnit.framework */; }; + 8E7A0F1A0A8FEB4A00F27EE8 /* add_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F060A8FEB4A00F27EE8 /* add_blue.png */; }; + 8E7A0F1B0A8FEB4A00F27EE8 /* add_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F070A8FEB4A00F27EE8 /* add_gray.png */; }; + 8E7A0F1C0A8FEB4A00F27EE8 /* info_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F080A8FEB4A00F27EE8 /* info_blue.png */; }; + 8E7A0F1D0A8FEB4A00F27EE8 /* info_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F090A8FEB4A00F27EE8 /* info_gray.png */; }; + 8E7A0F1E0A8FEB4A00F27EE8 /* next_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F0A0A8FEB4A00F27EE8 /* next_blue.png */; }; + 8E7A0F1F0A8FEB4A00F27EE8 /* next_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F0B0A8FEB4A00F27EE8 /* next_gray.png */; }; + 8E7A0F200A8FEB4A00F27EE8 /* pause_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F0C0A8FEB4A00F27EE8 /* pause_blue.png */; }; + 8E7A0F210A8FEB4A00F27EE8 /* pause_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F0D0A8FEB4A00F27EE8 /* pause_gray.png */; }; + 8E7A0F220A8FEB4A00F27EE8 /* play_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F0E0A8FEB4A00F27EE8 /* play_blue.png */; }; + 8E7A0F230A8FEB4A00F27EE8 /* play_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F0F0A8FEB4A00F27EE8 /* play_gray.png */; }; + 8E7A0F240A8FEB4A00F27EE8 /* prev_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F100A8FEB4A00F27EE8 /* prev_blue.png */; }; + 8E7A0F250A8FEB4A00F27EE8 /* prev_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F110A8FEB4A00F27EE8 /* prev_gray.png */; }; + 8E7A0F260A8FEB4A00F27EE8 /* remove_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F120A8FEB4A00F27EE8 /* remove_blue.png */; }; + 8E7A0F270A8FEB4A00F27EE8 /* remove_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F130A8FEB4A00F27EE8 /* remove_gray.png */; }; + 8E7A0F280A8FEB4A00F27EE8 /* repeat_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F140A8FEB4A00F27EE8 /* repeat_off.png */; }; + 8E7A0F290A8FEB4A00F27EE8 /* repeat_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F150A8FEB4A00F27EE8 /* repeat_on.png */; }; + 8E7A0F2A0A8FEB4A00F27EE8 /* shuffle_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F160A8FEB4A00F27EE8 /* shuffle_off.png */; }; + 8E7A0F2B0A8FEB4A00F27EE8 /* shuffle_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F170A8FEB4A00F27EE8 /* shuffle_on.png */; }; + 8E7A0F2C0A8FEB4A00F27EE8 /* volume_high.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F180A8FEB4A00F27EE8 /* volume_high.png */; }; + 8E7A0F2D0A8FEB4A00F27EE8 /* volume_low.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E7A0F190A8FEB4A00F27EE8 /* volume_low.png */; }; 8EA917300A336CC30087CDE2 /* Shorten.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8EA9172F0A336CC30087CDE2 /* Shorten.framework */; }; 8EB450080A2BB8B300AA711F /* Cog Help in Resources */ = {isa = PBXBuildFile; fileRef = 8EB44FF90A2BB8B300AA711F /* Cog Help */; }; 8EB971790A44B74A009803E3 /* MAD.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E1849C40A43DB5C0084C69D /* MAD.framework */; }; - 8EC077AA0A4C950E00E8961C /* info_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077950A4C950E00E8961C /* info_blue.png */; }; - 8EC077AB0A4C950E00E8961C /* info_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077960A4C950E00E8961C /* info_gray.png */; }; - 8EC077AC0A4C950E00E8961C /* loop_blue_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077970A4C950E00E8961C /* loop_blue_1.png */; }; - 8EC077AD0A4C950E00E8961C /* loop_blue_2.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077980A4C950E00E8961C /* loop_blue_2.png */; }; - 8EC077AE0A4C950E00E8961C /* loop_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077990A4C950E00E8961C /* loop_gray.png */; }; - 8EC077AF0A4C950E00E8961C /* minus_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC0779A0A4C950E00E8961C /* minus_blue.png */; }; - 8EC077B00A4C950E00E8961C /* minus_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC0779B0A4C950E00E8961C /* minus_gray.png */; }; - 8EC077B10A4C950E00E8961C /* next_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC0779C0A4C950E00E8961C /* next_blue.png */; }; - 8EC077B20A4C950E00E8961C /* next_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC0779D0A4C950E00E8961C /* next_gray.png */; }; - 8EC077B30A4C950E00E8961C /* pause_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC0779E0A4C950E00E8961C /* pause_blue.png */; }; - 8EC077B40A4C950E00E8961C /* pause_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC0779F0A4C950E00E8961C /* pause_gray.png */; }; - 8EC077B50A4C950E00E8961C /* play_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077A00A4C950E00E8961C /* play_blue.png */; }; - 8EC077B60A4C950E00E8961C /* play_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077A10A4C950E00E8961C /* play_gray.png */; }; - 8EC077B70A4C950E00E8961C /* playlist_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077A20A4C950E00E8961C /* playlist_blue.png */; }; - 8EC077B80A4C950E00E8961C /* playlist_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077A30A4C950E00E8961C /* playlist_gray.png */; }; - 8EC077B90A4C950E00E8961C /* plus_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077A40A4C950E00E8961C /* plus_blue.png */; }; - 8EC077BA0A4C950E00E8961C /* plus_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077A50A4C950E00E8961C /* plus_gray.png */; }; - 8EC077BB0A4C950E00E8961C /* previous_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077A60A4C950E00E8961C /* previous_blue.png */; }; - 8EC077BC0A4C950E00E8961C /* previous_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077A70A4C950E00E8961C /* previous_gray.png */; }; - 8EC077BD0A4C950E00E8961C /* random_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077A80A4C950E00E8961C /* random_blue.png */; }; - 8EC077BE0A4C950E00E8961C /* random_gray.png in Resources */ = {isa = PBXBuildFile; fileRef = 8EC077A90A4C950E00E8961C /* random_gray.png */; }; + 8EFFCD5E0AA093AF00C458A5 /* DirectoryNode.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD420AA093AF00C458A5 /* DirectoryNode.h */; }; + 8EFFCD5F0AA093AF00C458A5 /* DirectoryNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD430AA093AF00C458A5 /* DirectoryNode.m */; }; + 8EFFCD600AA093AF00C458A5 /* FileIconCell.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD440AA093AF00C458A5 /* FileIconCell.h */; }; + 8EFFCD610AA093AF00C458A5 /* FileIconCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD450AA093AF00C458A5 /* FileIconCell.m */; }; + 8EFFCD620AA093AF00C458A5 /* FileNode.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD460AA093AF00C458A5 /* FileNode.h */; }; + 8EFFCD630AA093AF00C458A5 /* FileNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD470AA093AF00C458A5 /* FileNode.m */; }; + 8EFFCD640AA093AF00C458A5 /* FileOutlineView.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD480AA093AF00C458A5 /* FileOutlineView.h */; }; + 8EFFCD650AA093AF00C458A5 /* FileOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD490AA093AF00C458A5 /* FileOutlineView.m */; }; + 8EFFCD660AA093AF00C458A5 /* FileTreeController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD4A0AA093AF00C458A5 /* FileTreeController.h */; }; + 8EFFCD670AA093AF00C458A5 /* FileTreeController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD4B0AA093AF00C458A5 /* FileTreeController.m */; }; + 8EFFCD680AA093AF00C458A5 /* FileTreeWatcher.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD4C0AA093AF00C458A5 /* FileTreeWatcher.h */; }; + 8EFFCD690AA093AF00C458A5 /* FileTreeWatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD4D0AA093AF00C458A5 /* FileTreeWatcher.m */; }; + 8EFFCD6A0AA093AF00C458A5 /* ImageTextCell.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD4E0AA093AF00C458A5 /* ImageTextCell.h */; }; + 8EFFCD6B0AA093AF00C458A5 /* ImageTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD4F0AA093AF00C458A5 /* ImageTextCell.m */; }; + 8EFFCD6C0AA093AF00C458A5 /* PathIcon.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD500AA093AF00C458A5 /* PathIcon.h */; }; + 8EFFCD6D0AA093AF00C458A5 /* PathIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD510AA093AF00C458A5 /* PathIcon.m */; }; + 8EFFCD6E0AA093AF00C458A5 /* PathNode.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD520AA093AF00C458A5 /* PathNode.h */; }; + 8EFFCD6F0AA093AF00C458A5 /* PathNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD530AA093AF00C458A5 /* PathNode.m */; }; + 8EFFCD700AA093AF00C458A5 /* UKFileWatcher.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD550AA093AF00C458A5 /* UKFileWatcher.h */; }; + 8EFFCD710AA093AF00C458A5 /* UKFileWatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD560AA093AF00C458A5 /* UKFileWatcher.m */; }; + 8EFFCD720AA093AF00C458A5 /* UKFNSubscribeFileWatcher.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD570AA093AF00C458A5 /* UKFNSubscribeFileWatcher.h */; }; + 8EFFCD730AA093AF00C458A5 /* UKFNSubscribeFileWatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD580AA093AF00C458A5 /* UKFNSubscribeFileWatcher.m */; }; + 8EFFCD740AA093AF00C458A5 /* UKKQueue Readme.txt in Resources */ = {isa = PBXBuildFile; fileRef = 8EFFCD590AA093AF00C458A5 /* UKKQueue Readme.txt */; }; + 8EFFCD750AA093AF00C458A5 /* UKKQueue.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD5A0AA093AF00C458A5 /* UKKQueue.h */; }; + 8EFFCD760AA093AF00C458A5 /* UKKQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD5B0AA093AF00C458A5 /* UKKQueue.m */; }; + 8EFFCD770AA093AF00C458A5 /* UKMainThreadProxy.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EFFCD5C0AA093AF00C458A5 /* UKMainThreadProxy.h */; }; + 8EFFCD780AA093AF00C458A5 /* UKMainThreadProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD5D0AA093AF00C458A5 /* UKMainThreadProxy.m */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -131,6 +157,19 @@ 8E757B5709F326710080F1EE /* OggFLAC.framework in CopyFiles */, 8E1296DA0A2BA9CE00443124 /* PlaylistHeaderView.h in CopyFiles */, 8E1849C80A43DB730084C69D /* MADFile.h in CopyFiles */, + 8EFFCD5E0AA093AF00C458A5 /* DirectoryNode.h in CopyFiles */, + 8EFFCD600AA093AF00C458A5 /* FileIconCell.h in CopyFiles */, + 8EFFCD620AA093AF00C458A5 /* FileNode.h in CopyFiles */, + 8EFFCD640AA093AF00C458A5 /* FileOutlineView.h in CopyFiles */, + 8EFFCD660AA093AF00C458A5 /* FileTreeController.h in CopyFiles */, + 8EFFCD680AA093AF00C458A5 /* FileTreeWatcher.h in CopyFiles */, + 8EFFCD6A0AA093AF00C458A5 /* ImageTextCell.h in CopyFiles */, + 8EFFCD6C0AA093AF00C458A5 /* PathIcon.h in CopyFiles */, + 8EFFCD6E0AA093AF00C458A5 /* PathNode.h in CopyFiles */, + 8EFFCD700AA093AF00C458A5 /* UKFileWatcher.h in CopyFiles */, + 8EFFCD720AA093AF00C458A5 /* UKFNSubscribeFileWatcher.h in CopyFiles */, + 8EFFCD750AA093AF00C458A5 /* UKKQueue.h in CopyFiles */, + 8EFFCD770AA093AF00C458A5 /* UKMainThreadProxy.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -164,6 +203,8 @@ 8E4C7F060A0509FC003BE25F /* DragScrollView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DragScrollView.h; sourceTree = ""; }; 8E4C7F070A0509FC003BE25F /* DragScrollView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = DragScrollView.m; sourceTree = ""; }; 8E4CAB5A0A32251B00214C1D /* ShnFile.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = ShnFile.mm; sourceTree = ""; }; + 8E4E7C180AA1ED4500D11405 /* file_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_blue.png; sourceTree = ""; }; + 8E4E7C190AA1ED4500D11405 /* file_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = file_gray.png; sourceTree = ""; }; 8E53E8600A44C11B007E5BCE /* ID3Tag.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ID3Tag.framework; path = Libraries/ID3Tag/build/Release/ID3Tag.framework; sourceTree = ""; }; 8E643DF20A2B585600844A28 /* GameFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GameFile.h; sourceTree = ""; }; 8E643DF30A2B585600844A28 /* GameFile.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GameFile.mm; sourceTree = ""; }; @@ -218,8 +259,6 @@ 8E75754809F31D5A0080F1EE /* FlacFile.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = FlacFile.m; sourceTree = ""; }; 8E75754909F31D5A0080F1EE /* MonkeysFile.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MonkeysFile.h; sourceTree = ""; }; 8E75754A09F31D5A0080F1EE /* MonkeysFile.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = MonkeysFile.mm; sourceTree = ""; }; - 8E75754B09F31D5A0080F1EE /* MPEGFile.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MPEGFile.h; sourceTree = ""; }; - 8E75754C09F31D5A0080F1EE /* MPEGFile.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = MPEGFile.mm; sourceTree = ""; }; 8E75754D09F31D5A0080F1EE /* MusepackFile.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MusepackFile.h; sourceTree = ""; }; 8E75754E09F31D5A0080F1EE /* MusepackFile.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MusepackFile.m; sourceTree = ""; }; 8E75754F09F31D5A0080F1EE /* ShnFile.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ShnFile.h; sourceTree = ""; }; @@ -243,8 +282,6 @@ 8E75756609F31D5A0080F1EE /* Semaphore.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = Semaphore.m; sourceTree = ""; }; 8E75756709F31D5A0080F1EE /* VirtualRingBuffer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = VirtualRingBuffer.h; sourceTree = ""; }; 8E75756809F31D5A0080F1EE /* VirtualRingBuffer.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = VirtualRingBuffer.m; sourceTree = ""; }; - 8E7575A409F31D800080F1EE /* volume_high.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = volume_high.png; sourceTree = ""; }; - 8E7575A509F31D800080F1EE /* volume_low.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = volume_low.png; sourceTree = ""; }; 8E7575A609F31D800080F1EE /* wheel.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = wheel.icns; sourceTree = ""; }; 8E7575C309F31DCA0080F1EE /* Changelog */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = Changelog; sourceTree = ""; }; 8E7575C409F31DCA0080F1EE /* Cog.scriptSuite */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.xml; path = Cog.scriptSuite; sourceTree = ""; }; @@ -266,29 +303,55 @@ 8E75775309F31F750080F1EE /* WavPack.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WavPack.framework; path = Libraries/WavPack/build/Release/WavPack.framework; sourceTree = ""; }; 8E757C7A09F32F070080F1EE /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = ""; }; 8E757C7B09F32F070080F1EE /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = /System/Library/Frameworks/AudioUnit.framework; sourceTree = ""; }; + 8E7A0F060A8FEB4A00F27EE8 /* add_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add_blue.png; sourceTree = ""; }; + 8E7A0F070A8FEB4A00F27EE8 /* add_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add_gray.png; sourceTree = ""; }; + 8E7A0F080A8FEB4A00F27EE8 /* info_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = info_blue.png; sourceTree = ""; }; + 8E7A0F090A8FEB4A00F27EE8 /* info_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = info_gray.png; sourceTree = ""; }; + 8E7A0F0A0A8FEB4A00F27EE8 /* next_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = next_blue.png; sourceTree = ""; }; + 8E7A0F0B0A8FEB4A00F27EE8 /* next_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = next_gray.png; sourceTree = ""; }; + 8E7A0F0C0A8FEB4A00F27EE8 /* pause_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_blue.png; sourceTree = ""; }; + 8E7A0F0D0A8FEB4A00F27EE8 /* pause_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_gray.png; sourceTree = ""; }; + 8E7A0F0E0A8FEB4A00F27EE8 /* play_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = play_blue.png; sourceTree = ""; }; + 8E7A0F0F0A8FEB4A00F27EE8 /* play_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = play_gray.png; sourceTree = ""; }; + 8E7A0F100A8FEB4A00F27EE8 /* prev_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = prev_blue.png; sourceTree = ""; }; + 8E7A0F110A8FEB4A00F27EE8 /* prev_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = prev_gray.png; sourceTree = ""; }; + 8E7A0F120A8FEB4A00F27EE8 /* remove_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = remove_blue.png; sourceTree = ""; }; + 8E7A0F130A8FEB4A00F27EE8 /* remove_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = remove_gray.png; sourceTree = ""; }; + 8E7A0F140A8FEB4A00F27EE8 /* repeat_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = repeat_off.png; sourceTree = ""; }; + 8E7A0F150A8FEB4A00F27EE8 /* repeat_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = repeat_on.png; sourceTree = ""; }; + 8E7A0F160A8FEB4A00F27EE8 /* shuffle_off.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = shuffle_off.png; sourceTree = ""; }; + 8E7A0F170A8FEB4A00F27EE8 /* shuffle_on.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = shuffle_on.png; sourceTree = ""; }; + 8E7A0F180A8FEB4A00F27EE8 /* volume_high.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = volume_high.png; sourceTree = ""; }; + 8E7A0F190A8FEB4A00F27EE8 /* volume_low.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = volume_low.png; sourceTree = ""; }; 8EA9172F0A336CC30087CDE2 /* Shorten.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Shorten.framework; path = Libraries/Shorten/build/Release/Shorten.framework; sourceTree = ""; }; 8EB44FF90A2BB8B300AA711F /* Cog Help */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "Cog Help"; sourceTree = ""; }; - 8EC077950A4C950E00E8961C /* info_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = info_blue.png; sourceTree = ""; }; - 8EC077960A4C950E00E8961C /* info_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = info_gray.png; sourceTree = ""; }; - 8EC077970A4C950E00E8961C /* loop_blue_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = loop_blue_1.png; sourceTree = ""; }; - 8EC077980A4C950E00E8961C /* loop_blue_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = loop_blue_2.png; sourceTree = ""; }; - 8EC077990A4C950E00E8961C /* loop_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = loop_gray.png; sourceTree = ""; }; - 8EC0779A0A4C950E00E8961C /* minus_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = minus_blue.png; sourceTree = ""; }; - 8EC0779B0A4C950E00E8961C /* minus_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = minus_gray.png; sourceTree = ""; }; - 8EC0779C0A4C950E00E8961C /* next_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = next_blue.png; sourceTree = ""; }; - 8EC0779D0A4C950E00E8961C /* next_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = next_gray.png; sourceTree = ""; }; - 8EC0779E0A4C950E00E8961C /* pause_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_blue.png; sourceTree = ""; }; - 8EC0779F0A4C950E00E8961C /* pause_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pause_gray.png; sourceTree = ""; }; - 8EC077A00A4C950E00E8961C /* play_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = play_blue.png; sourceTree = ""; }; - 8EC077A10A4C950E00E8961C /* play_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = play_gray.png; sourceTree = ""; }; - 8EC077A20A4C950E00E8961C /* playlist_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = playlist_blue.png; sourceTree = ""; }; - 8EC077A30A4C950E00E8961C /* playlist_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = playlist_gray.png; sourceTree = ""; }; - 8EC077A40A4C950E00E8961C /* plus_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = plus_blue.png; sourceTree = ""; }; - 8EC077A50A4C950E00E8961C /* plus_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = plus_gray.png; sourceTree = ""; }; - 8EC077A60A4C950E00E8961C /* previous_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = previous_blue.png; sourceTree = ""; }; - 8EC077A70A4C950E00E8961C /* previous_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = previous_gray.png; sourceTree = ""; }; - 8EC077A80A4C950E00E8961C /* random_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = random_blue.png; sourceTree = ""; }; - 8EC077A90A4C950E00E8961C /* random_gray.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = random_gray.png; sourceTree = ""; }; + 8EFFCD420AA093AF00C458A5 /* DirectoryNode.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DirectoryNode.h; sourceTree = ""; }; + 8EFFCD430AA093AF00C458A5 /* DirectoryNode.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = DirectoryNode.m; sourceTree = ""; }; + 8EFFCD440AA093AF00C458A5 /* FileIconCell.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FileIconCell.h; sourceTree = ""; }; + 8EFFCD450AA093AF00C458A5 /* FileIconCell.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = FileIconCell.m; sourceTree = ""; }; + 8EFFCD460AA093AF00C458A5 /* FileNode.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FileNode.h; sourceTree = ""; }; + 8EFFCD470AA093AF00C458A5 /* FileNode.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = FileNode.m; sourceTree = ""; }; + 8EFFCD480AA093AF00C458A5 /* FileOutlineView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FileOutlineView.h; sourceTree = ""; }; + 8EFFCD490AA093AF00C458A5 /* FileOutlineView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = FileOutlineView.m; sourceTree = ""; }; + 8EFFCD4A0AA093AF00C458A5 /* FileTreeController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FileTreeController.h; sourceTree = ""; }; + 8EFFCD4B0AA093AF00C458A5 /* FileTreeController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = FileTreeController.m; sourceTree = ""; }; + 8EFFCD4C0AA093AF00C458A5 /* FileTreeWatcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FileTreeWatcher.h; sourceTree = ""; }; + 8EFFCD4D0AA093AF00C458A5 /* FileTreeWatcher.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = FileTreeWatcher.m; sourceTree = ""; }; + 8EFFCD4E0AA093AF00C458A5 /* ImageTextCell.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ImageTextCell.h; sourceTree = ""; }; + 8EFFCD4F0AA093AF00C458A5 /* ImageTextCell.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ImageTextCell.m; sourceTree = ""; }; + 8EFFCD500AA093AF00C458A5 /* PathIcon.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PathIcon.h; sourceTree = ""; }; + 8EFFCD510AA093AF00C458A5 /* PathIcon.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PathIcon.m; sourceTree = ""; }; + 8EFFCD520AA093AF00C458A5 /* PathNode.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PathNode.h; sourceTree = ""; }; + 8EFFCD530AA093AF00C458A5 /* PathNode.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PathNode.m; sourceTree = ""; }; + 8EFFCD550AA093AF00C458A5 /* UKFileWatcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = UKFileWatcher.h; sourceTree = ""; }; + 8EFFCD560AA093AF00C458A5 /* UKFileWatcher.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = UKFileWatcher.m; sourceTree = ""; }; + 8EFFCD570AA093AF00C458A5 /* UKFNSubscribeFileWatcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = UKFNSubscribeFileWatcher.h; sourceTree = ""; }; + 8EFFCD580AA093AF00C458A5 /* UKFNSubscribeFileWatcher.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = UKFNSubscribeFileWatcher.m; sourceTree = ""; }; + 8EFFCD590AA093AF00C458A5 /* UKKQueue Readme.txt */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = "UKKQueue Readme.txt"; sourceTree = ""; }; + 8EFFCD5A0AA093AF00C458A5 /* UKKQueue.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = UKKQueue.h; sourceTree = ""; }; + 8EFFCD5B0AA093AF00C458A5 /* UKKQueue.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = UKKQueue.m; sourceTree = ""; }; + 8EFFCD5C0AA093AF00C458A5 /* UKMainThreadProxy.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = UKMainThreadProxy.h; sourceTree = ""; }; + 8EFFCD5D0AA093AF00C458A5 /* UKMainThreadProxy.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = UKMainThreadProxy.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -319,6 +382,7 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( + 8EFFCD410AA093AF00C458A5 /* FileDrawer */, 8E75752309F31D5A0080F1EE /* Feedback */, 8E75755D09F31D5A0080F1EE /* Updates */, 8E75756209F31D5A0080F1EE /* Utils */, @@ -495,8 +559,6 @@ 8E75754809F31D5A0080F1EE /* FlacFile.m */, 8E75754909F31D5A0080F1EE /* MonkeysFile.h */, 8E75754A09F31D5A0080F1EE /* MonkeysFile.mm */, - 8E75754B09F31D5A0080F1EE /* MPEGFile.h */, - 8E75754C09F31D5A0080F1EE /* MPEGFile.mm */, 8E75754D09F31D5A0080F1EE /* MusepackFile.h */, 8E75754E09F31D5A0080F1EE /* MusepackFile.m */, 8E75754F09F31D5A0080F1EE /* ShnFile.h */, @@ -546,29 +608,28 @@ 8E75758E09F31D800080F1EE /* Icons */ = { isa = PBXGroup; children = ( - 8EC077950A4C950E00E8961C /* info_blue.png */, - 8EC077960A4C950E00E8961C /* info_gray.png */, - 8EC077970A4C950E00E8961C /* loop_blue_1.png */, - 8EC077980A4C950E00E8961C /* loop_blue_2.png */, - 8EC077990A4C950E00E8961C /* loop_gray.png */, - 8EC0779A0A4C950E00E8961C /* minus_blue.png */, - 8EC0779B0A4C950E00E8961C /* minus_gray.png */, - 8EC0779C0A4C950E00E8961C /* next_blue.png */, - 8EC0779D0A4C950E00E8961C /* next_gray.png */, - 8EC0779E0A4C950E00E8961C /* pause_blue.png */, - 8EC0779F0A4C950E00E8961C /* pause_gray.png */, - 8EC077A00A4C950E00E8961C /* play_blue.png */, - 8EC077A10A4C950E00E8961C /* play_gray.png */, - 8EC077A20A4C950E00E8961C /* playlist_blue.png */, - 8EC077A30A4C950E00E8961C /* playlist_gray.png */, - 8EC077A40A4C950E00E8961C /* plus_blue.png */, - 8EC077A50A4C950E00E8961C /* plus_gray.png */, - 8EC077A60A4C950E00E8961C /* previous_blue.png */, - 8EC077A70A4C950E00E8961C /* previous_gray.png */, - 8EC077A80A4C950E00E8961C /* random_blue.png */, - 8EC077A90A4C950E00E8961C /* random_gray.png */, - 8E7575A409F31D800080F1EE /* volume_high.png */, - 8E7575A509F31D800080F1EE /* volume_low.png */, + 8E7A0F060A8FEB4A00F27EE8 /* add_blue.png */, + 8E7A0F070A8FEB4A00F27EE8 /* add_gray.png */, + 8E4E7C180AA1ED4500D11405 /* file_blue.png */, + 8E4E7C190AA1ED4500D11405 /* file_gray.png */, + 8E7A0F080A8FEB4A00F27EE8 /* info_blue.png */, + 8E7A0F090A8FEB4A00F27EE8 /* info_gray.png */, + 8E7A0F0A0A8FEB4A00F27EE8 /* next_blue.png */, + 8E7A0F0B0A8FEB4A00F27EE8 /* next_gray.png */, + 8E7A0F0C0A8FEB4A00F27EE8 /* pause_blue.png */, + 8E7A0F0D0A8FEB4A00F27EE8 /* pause_gray.png */, + 8E7A0F0E0A8FEB4A00F27EE8 /* play_blue.png */, + 8E7A0F0F0A8FEB4A00F27EE8 /* play_gray.png */, + 8E7A0F100A8FEB4A00F27EE8 /* prev_blue.png */, + 8E7A0F110A8FEB4A00F27EE8 /* prev_gray.png */, + 8E7A0F120A8FEB4A00F27EE8 /* remove_blue.png */, + 8E7A0F130A8FEB4A00F27EE8 /* remove_gray.png */, + 8E7A0F140A8FEB4A00F27EE8 /* repeat_off.png */, + 8E7A0F150A8FEB4A00F27EE8 /* repeat_on.png */, + 8E7A0F160A8FEB4A00F27EE8 /* shuffle_off.png */, + 8E7A0F170A8FEB4A00F27EE8 /* shuffle_on.png */, + 8E7A0F180A8FEB4A00F27EE8 /* volume_high.png */, + 8E7A0F190A8FEB4A00F27EE8 /* volume_low.png */, 8E7575A609F31D800080F1EE /* wheel.icns */, ); path = Icons; @@ -592,6 +653,48 @@ name = "Codec Frameworks"; sourceTree = ""; }; + 8EFFCD410AA093AF00C458A5 /* FileDrawer */ = { + isa = PBXGroup; + children = ( + 8EFFCD440AA093AF00C458A5 /* FileIconCell.h */, + 8EFFCD450AA093AF00C458A5 /* FileIconCell.m */, + 8EFFCD4E0AA093AF00C458A5 /* ImageTextCell.h */, + 8EFFCD4F0AA093AF00C458A5 /* ImageTextCell.m */, + 8EFFCD500AA093AF00C458A5 /* PathIcon.h */, + 8EFFCD510AA093AF00C458A5 /* PathIcon.m */, + 8EFFCD480AA093AF00C458A5 /* FileOutlineView.h */, + 8EFFCD490AA093AF00C458A5 /* FileOutlineView.m */, + 8EFFCD4A0AA093AF00C458A5 /* FileTreeController.h */, + 8EFFCD4B0AA093AF00C458A5 /* FileTreeController.m */, + 8EFFCD4C0AA093AF00C458A5 /* FileTreeWatcher.h */, + 8EFFCD4D0AA093AF00C458A5 /* FileTreeWatcher.m */, + 8EFFCD420AA093AF00C458A5 /* DirectoryNode.h */, + 8EFFCD430AA093AF00C458A5 /* DirectoryNode.m */, + 8EFFCD460AA093AF00C458A5 /* FileNode.h */, + 8EFFCD470AA093AF00C458A5 /* FileNode.m */, + 8EFFCD520AA093AF00C458A5 /* PathNode.h */, + 8EFFCD530AA093AF00C458A5 /* PathNode.m */, + 8EFFCD540AA093AF00C458A5 /* UKKQueue */, + ); + path = FileDrawer; + sourceTree = ""; + }; + 8EFFCD540AA093AF00C458A5 /* UKKQueue */ = { + isa = PBXGroup; + children = ( + 8EFFCD550AA093AF00C458A5 /* UKFileWatcher.h */, + 8EFFCD560AA093AF00C458A5 /* UKFileWatcher.m */, + 8EFFCD570AA093AF00C458A5 /* UKFNSubscribeFileWatcher.h */, + 8EFFCD580AA093AF00C458A5 /* UKFNSubscribeFileWatcher.m */, + 8EFFCD590AA093AF00C458A5 /* UKKQueue Readme.txt */, + 8EFFCD5A0AA093AF00C458A5 /* UKKQueue.h */, + 8EFFCD5B0AA093AF00C458A5 /* UKKQueue.m */, + 8EFFCD5C0AA093AF00C458A5 /* UKMainThreadProxy.h */, + 8EFFCD5D0AA093AF00C458A5 /* UKMainThreadProxy.m */, + ); + path = UKKQueue; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -638,8 +741,6 @@ 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */, 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, 8E75758709F31D5A0080F1EE /* SOUNDTODO in Resources */, - 8E7575BC09F31D800080F1EE /* volume_high.png in Resources */, - 8E7575BD09F31D800080F1EE /* volume_low.png in Resources */, 8E7575BE09F31D800080F1EE /* wheel.icns in Resources */, 8E7575CB09F31DCA0080F1EE /* Changelog in Resources */, 8E7575CC09F31DCA0080F1EE /* Cog.scriptSuite in Resources */, @@ -651,27 +752,29 @@ 8E7575D209F31DCA0080F1EE /* TODO in Resources */, 8E7575DB09F31E930080F1EE /* Localizable.strings in Resources */, 8EB450080A2BB8B300AA711F /* Cog Help in Resources */, - 8EC077AA0A4C950E00E8961C /* info_blue.png in Resources */, - 8EC077AB0A4C950E00E8961C /* info_gray.png in Resources */, - 8EC077AC0A4C950E00E8961C /* loop_blue_1.png in Resources */, - 8EC077AD0A4C950E00E8961C /* loop_blue_2.png in Resources */, - 8EC077AE0A4C950E00E8961C /* loop_gray.png in Resources */, - 8EC077AF0A4C950E00E8961C /* minus_blue.png in Resources */, - 8EC077B00A4C950E00E8961C /* minus_gray.png in Resources */, - 8EC077B10A4C950E00E8961C /* next_blue.png in Resources */, - 8EC077B20A4C950E00E8961C /* next_gray.png in Resources */, - 8EC077B30A4C950E00E8961C /* pause_blue.png in Resources */, - 8EC077B40A4C950E00E8961C /* pause_gray.png in Resources */, - 8EC077B50A4C950E00E8961C /* play_blue.png in Resources */, - 8EC077B60A4C950E00E8961C /* play_gray.png in Resources */, - 8EC077B70A4C950E00E8961C /* playlist_blue.png in Resources */, - 8EC077B80A4C950E00E8961C /* playlist_gray.png in Resources */, - 8EC077B90A4C950E00E8961C /* plus_blue.png in Resources */, - 8EC077BA0A4C950E00E8961C /* plus_gray.png in Resources */, - 8EC077BB0A4C950E00E8961C /* previous_blue.png in Resources */, - 8EC077BC0A4C950E00E8961C /* previous_gray.png in Resources */, - 8EC077BD0A4C950E00E8961C /* random_blue.png in Resources */, - 8EC077BE0A4C950E00E8961C /* random_gray.png in Resources */, + 8E7A0F1A0A8FEB4A00F27EE8 /* add_blue.png in Resources */, + 8E7A0F1B0A8FEB4A00F27EE8 /* add_gray.png in Resources */, + 8E7A0F1C0A8FEB4A00F27EE8 /* info_blue.png in Resources */, + 8E7A0F1D0A8FEB4A00F27EE8 /* info_gray.png in Resources */, + 8E7A0F1E0A8FEB4A00F27EE8 /* next_blue.png in Resources */, + 8E7A0F1F0A8FEB4A00F27EE8 /* next_gray.png in Resources */, + 8E7A0F200A8FEB4A00F27EE8 /* pause_blue.png in Resources */, + 8E7A0F210A8FEB4A00F27EE8 /* pause_gray.png in Resources */, + 8E7A0F220A8FEB4A00F27EE8 /* play_blue.png in Resources */, + 8E7A0F230A8FEB4A00F27EE8 /* play_gray.png in Resources */, + 8E7A0F240A8FEB4A00F27EE8 /* prev_blue.png in Resources */, + 8E7A0F250A8FEB4A00F27EE8 /* prev_gray.png in Resources */, + 8E7A0F260A8FEB4A00F27EE8 /* remove_blue.png in Resources */, + 8E7A0F270A8FEB4A00F27EE8 /* remove_gray.png in Resources */, + 8E7A0F280A8FEB4A00F27EE8 /* repeat_off.png in Resources */, + 8E7A0F290A8FEB4A00F27EE8 /* repeat_on.png in Resources */, + 8E7A0F2A0A8FEB4A00F27EE8 /* shuffle_off.png in Resources */, + 8E7A0F2B0A8FEB4A00F27EE8 /* shuffle_on.png in Resources */, + 8E7A0F2C0A8FEB4A00F27EE8 /* volume_high.png in Resources */, + 8E7A0F2D0A8FEB4A00F27EE8 /* volume_low.png in Resources */, + 8EFFCD740AA093AF00C458A5 /* UKKQueue Readme.txt in Resources */, + 8E4E7C1A0AA1ED4500D11405 /* file_blue.png in Resources */, + 8E4E7C1B0AA1ED4500D11405 /* file_gray.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -720,6 +823,19 @@ 8E1296DB0A2BA9CE00443124 /* PlaylistHeaderView.m in Sources */, 8E4CAB5B0A32251B00214C1D /* ShnFile.mm in Sources */, 8E1849C90A43DB730084C69D /* MADFile.m in Sources */, + 8EFFCD5F0AA093AF00C458A5 /* DirectoryNode.m in Sources */, + 8EFFCD610AA093AF00C458A5 /* FileIconCell.m in Sources */, + 8EFFCD630AA093AF00C458A5 /* FileNode.m in Sources */, + 8EFFCD650AA093AF00C458A5 /* FileOutlineView.m in Sources */, + 8EFFCD670AA093AF00C458A5 /* FileTreeController.m in Sources */, + 8EFFCD690AA093AF00C458A5 /* FileTreeWatcher.m in Sources */, + 8EFFCD6B0AA093AF00C458A5 /* ImageTextCell.m in Sources */, + 8EFFCD6D0AA093AF00C458A5 /* PathIcon.m in Sources */, + 8EFFCD6F0AA093AF00C458A5 /* PathNode.m in Sources */, + 8EFFCD710AA093AF00C458A5 /* UKFileWatcher.m in Sources */, + 8EFFCD730AA093AF00C458A5 /* UKFNSubscribeFileWatcher.m in Sources */, + 8EFFCD760AA093AF00C458A5 /* UKKQueue.m in Sources */, + 8EFFCD780AA093AF00C458A5 /* UKMainThreadProxy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Credits.html b/Credits.html index 71d5575a3..8696aad95 100644 --- a/Credits.html +++ b/Credits.html @@ -2,6 +2,6 @@ Cog is dedicated to snacos, the ungodly combination of snacks and tacos.

-This program has been made possible through donations from users like you. +This program has been made possible through contributions from users like you. diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib index da24304ce..5b3e6ca70 100644 --- a/English.lproj/MainMenu.nib/classes.nib +++ b/English.lproj/MainMenu.nib/classes.nib @@ -6,16 +6,19 @@ delEntries = id; donate = id; loadPlaylist = id; + openFiles = id; savePlaylist = id; savePlaylistAs = id; - shufflePlaylist = id; - sortByPath = id; + toggleFileDrawer = id; toggleInfoDrawer = id; }; CLASS = AppController; LANGUAGE = ObjC; OUTLETS = { addButton = NSButton; + fileButton = NSButton; + fileDrawer = NSDrawer; + fileTreeController = FileTreeController; infoButton = NSButton; infoDrawer = NSDrawer; mainWindow = NSPanel; @@ -51,10 +54,18 @@ }; SUPERCLASS = NSObject; }, + {CLASS = FileOutlineView; LANGUAGE = ObjC; SUPERCLASS = NSOutlineView; }, + { + CLASS = FileTreeController; + LANGUAGE = ObjC; + OUTLETS = {playlistController = PlaylistController; }; + SUPERCLASS = NSTreeController; + }, {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = InfoController; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = InfoView; LANGUAGE = ObjC; SUPERCLASS = NSScrollView; }, {CLASS = NSSegmentedControl; LANGUAGE = ObjC; SUPERCLASS = NSControl; }, + {CLASS = PathNode; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { ACTIONS = { changeVolume = id; diff --git a/English.lproj/MainMenu.nib/info.nib b/English.lproj/MainMenu.nib/info.nib index 16c529569..9679d38a3 100644 --- a/English.lproj/MainMenu.nib/info.nib +++ b/English.lproj/MainMenu.nib/info.nib @@ -3,11 +3,13 @@ IBDocumentLocation - 19 323 617 240 0 0 1024 746 + 71 108 639 388 0 0 1024 746 IBEditorPositions 1063 0 228 136 49 0 0 1024 746 + 1156 + 233 341 241 366 0 0 1024 746 29 65 680 383 44 0 0 1024 746 463 @@ -30,12 +32,11 @@ 3 IBOpenObjects - 21 - 1063 - 513 + 463 29 + 21 IBSystem Version - 8I127 + 8J135 diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index 3de216a97274ba95dea0f345e706efa69c0de5a4..bd689c6967c2a9a57c411f500f2f4b7f29ffc355 100644 GIT binary patch literal 66201 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 diff --git a/FileDrawer/DirectoryNode.h b/FileDrawer/DirectoryNode.h new file mode 100644 index 000000000..e1c127176 --- /dev/null +++ b/FileDrawer/DirectoryNode.h @@ -0,0 +1,20 @@ +// +// DirectoryNode.h +// Cog +// +// Created by Vincent Spader on 8/20/2006. +// Copyright 2006 Vincent Spader. All rights reserved. +// + +#import +#import "PathNode.h" + +@interface DirectoryNode : PathNode +{ + NSMutableArray *subpaths; + id controller; +} + +- (NSArray *)subpaths; + +@end diff --git a/FileDrawer/DirectoryNode.m b/FileDrawer/DirectoryNode.m new file mode 100644 index 000000000..1a9c075a5 --- /dev/null +++ b/FileDrawer/DirectoryNode.m @@ -0,0 +1,94 @@ +// +// DirectoryNode.m +// Cog +// +// Created by Vincent Spader on 8/20/2006. +// Copyright 2006 Vincent Spader. All rights reserved. +// + +#import "DirectoryNode.h" +#import "FileNode.h" + +@implementation DirectoryNode + +-(id)initWithPath:(NSString *)p controller:(id) c +{ + self = [super initWithPath:p]; + if (self) + { + controller = [c retain]; + } + + return self; +} + +- (void)dealloc { + [controller release]; + [super dealloc]; +} + +- (BOOL)isLeaf +{ + return NO; +} + +- (NSArray *)subpaths +{ + if (subpaths == nil) + { + subpaths = [[NSMutableArray alloc] init]; + NSArray *contents = [[NSFileManager defaultManager] directoryContentsAtPath:path]; + NSEnumerator *e = [contents objectEnumerator]; + NSString *s; + while ((s = [e nextObject])) + { + if ([s characterAtIndex:0] == '.') + { + continue; + } + + BOOL isDir; + PathNode *newNode; + NSString *newSubpath = [path stringByAppendingPathComponent: s]; + + [[NSFileManager defaultManager] fileExistsAtPath:newSubpath isDirectory:&isDir]; + + if (!isDir && ![[controller acceptableFileTypes] containsObject:[s pathExtension]]) + { + continue; + } + + if (isDir) + newNode = [[DirectoryNode alloc] initWithPath: newSubpath controller:controller]; + else + newNode = [[FileNode alloc] initWithPath: newSubpath]; + + [subpaths addObject:newNode]; + + [newNode release]; + } + [[controller watcher] addPath:[self path]]; + } + +// NSLog(@"subpaths; %@", subpaths); + return subpaths; +} + +- (void)setSubpaths:(id)s +{ + [s retain]; + [subpaths release]; + subpaths = s; +} + +- (unsigned int)countOfSubpaths +{ + return [[self subpaths] count]; +} + +- (PathNode *)objectInSubpathsAtIndex:(unsigned int)index +{ + return [[self subpaths] objectAtIndex:index]; +} + +@end diff --git a/FileDrawer/FileIconCell.h b/FileDrawer/FileIconCell.h new file mode 100644 index 000000000..499dc6f87 --- /dev/null +++ b/FileDrawer/FileIconCell.h @@ -0,0 +1,16 @@ +// +// FileIconTextCell.h +// Cog +// +// Created by Zaphod Beeblebrox on 8/20/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import +#import "ImageTextCell.h" + +@interface FileIconCell : ImageTextCell { + +} + +@end diff --git a/FileDrawer/FileIconCell.m b/FileDrawer/FileIconCell.m new file mode 100644 index 000000000..799875bdf --- /dev/null +++ b/FileDrawer/FileIconCell.m @@ -0,0 +1,26 @@ +// +// FileIconTextCell.m +// Cog +// +// Created by Zaphod Beeblebrox on 8/20/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import "FileIconCell.h" + + +@implementation FileIconCell + +- (void)setObjectValue:(id)o +{ + if ([o respondsToSelector:@selector(icon)]) { + [super setObjectValue:[[o path] lastPathComponent]]; + [super setImage: [o icon]]; + } + else { + [super setObjectValue:o]; + } +} + + +@end diff --git a/FileDrawer/FileNode.h b/FileDrawer/FileNode.h new file mode 100644 index 000000000..18e2e34fb --- /dev/null +++ b/FileDrawer/FileNode.h @@ -0,0 +1,17 @@ +// +// FileNode.h +// Cog +// +// Created by Vincent Spader on 8/20/2006. +// Copyright 2006 Vincent Spader. All rights reserved. +// + +#import +#import "PathNode.h" + +@interface FileNode : PathNode +{ + +} + +@end diff --git a/FileDrawer/FileNode.m b/FileDrawer/FileNode.m new file mode 100644 index 000000000..3b4c79cb7 --- /dev/null +++ b/FileDrawer/FileNode.m @@ -0,0 +1,18 @@ +// +// FileNode.m +// Cog +// +// Created by Vincent Spader on 8/20/2006. +// Copyright 2006 Vincent Spader. All rights reserved. +// + +#import "FileNode.h" + +@implementation FileNode + +- (BOOL)isLeaf +{ + return YES; +} + +@end diff --git a/FileDrawer/FileOutlineView.h b/FileDrawer/FileOutlineView.h new file mode 100644 index 000000000..fd2cbb295 --- /dev/null +++ b/FileDrawer/FileOutlineView.h @@ -0,0 +1,16 @@ +// +// FileOutlineView.h +// Cog +// +// Created by Zaphod Beeblebrox on 8/20/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import + + +@interface FileOutlineView : NSOutlineView { + +} + +@end diff --git a/FileDrawer/FileOutlineView.m b/FileDrawer/FileOutlineView.m new file mode 100644 index 000000000..046f72dfd --- /dev/null +++ b/FileDrawer/FileOutlineView.m @@ -0,0 +1,31 @@ +// +// FileOutlineView.m +// BindTest +// +// Created by Zaphod Beeblebrox on 8/20/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import "FileOutlineView.h" +#import "FileIconCell.h" + +@implementation FileOutlineView + +- (void) awakeFromNib +{ + NSLog(@"FILE OUTLINE VIEW"); + + NSEnumerator *e = [[self tableColumns] objectEnumerator]; + id c; + while ((c = [e nextObject])) + { +// id headerCell = [[ImageTextCell alloc] init]; + id dataCell = [[FileIconCell alloc] init]; + + [dataCell setLineBreakMode:NSLineBreakByTruncatingTail]; +// [c setHeaderCell: headerCell]; + [c setDataCell: dataCell]; + } +} + +@end diff --git a/FileDrawer/FileTreeController.h b/FileDrawer/FileTreeController.h new file mode 100644 index 000000000..ae3ed0771 --- /dev/null +++ b/FileDrawer/FileTreeController.h @@ -0,0 +1,25 @@ +// +// FileTreeController.h +// Cog +// +// Created by Vincent Spader on 8/20/2006. +// Copyright 2006 Vincent Spader. All rights reserved. +// + +#import +#import "FileTreeWatcher.h" +#import "PlaylistController.h" + +@interface FileTreeController : NSTreeController +{ + IBOutlet PlaylistController *playlistController; + + NSString *rootPath; + + FileTreeWatcher *watcher; +} + +- (id)rootPath; +- (void)setRootPath:(id)r; + +@end diff --git a/FileDrawer/FileTreeController.m b/FileDrawer/FileTreeController.m new file mode 100644 index 000000000..a9bbd000c --- /dev/null +++ b/FileDrawer/FileTreeController.m @@ -0,0 +1,145 @@ +// +// FileTreeController.m +// Cog +// +// Created by Vincent Spader on 8/20/2006. +// Copyright 2006 Vincent Spader. All rights reserved. +// + +#import "FileTreeController.h" +#import "DirectoryNode.h" +#import "ImageTextCell.h" + +@implementation FileTreeController + +- (void)awakeFromNib +{ + watcher = [[FileTreeWatcher alloc] init]; + [watcher setDelegate:self]; + + [self setRootPath: @"/Users/xugg/Music"]; +} + +- (void)dealloc +{ + [rootPath release]; + [super dealloc]; +} + +- (id)rootPath +{ + return rootPath; +} + +- (void)setRootPath:(id)r +{ + [r retain]; + [rootPath release]; + rootPath = r; + + [self refreshRoot]; +} + +- (void) refreshRoot +{ + DirectoryNode *base = [[DirectoryNode alloc] initWithPath:rootPath controller:self]; + [self setContent: [base subpaths]]; + [base release]; +} + +- (void)refreshPath:(NSString *)path +{ + if ([path compare:rootPath] == NSOrderedSame) { + [self refreshRoot]; + + return; + } + + NSArray *pathComponents = [path pathComponents]; + NSArray *rootComponents = [rootPath pathComponents]; + int i = 0; + while (i < [rootComponents count] && i < [pathComponents count] && + NSOrderedSame == [[rootComponents objectAtIndex: i] compare:[pathComponents objectAtIndex: i]]) + { + i++; + } + + + id p; + NSEnumerator *e = [[self content] objectEnumerator]; + while ((p = [e nextObject])) + { + id c = [pathComponents objectAtIndex:i]; + if (NSOrderedSame == [[[p path] lastPathComponent] compare:c]) { + if (i == [pathComponents count] - 1) { + [p setSubpaths:nil]; +// [self rearrangeObjects]; + } + else { + e = [[c subpaths] objectEnumerator]; + i++; + } + } + } +} + +- (NSArray *)acceptableFileTypes +{ + return [playlistController acceptableFileTypes]; +} + +- (FileTreeWatcher *)watcher +{ + return watcher; +} + +// Required Protocol Bullshit (RPB) +- (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item +{ + return nil; +} + +- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item +{ + return NO; +} + +- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item +{ + return 0; +} +- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item +{ + return nil; +} +//End of RPB + +- (BOOL)outlineView:(NSOutlineView *)olv writeItems:(NSArray*)items toPasteboard:(NSPasteboard*)pboard { + //Get selected paths + NSLog(@"Items: %@", items); + NSMutableArray *paths = [NSMutableArray arrayWithCapacity:[items count]]; + id p; + NSEnumerator *e = [items objectEnumerator]; + + while (p = [e nextObject]) { + int i; + PathNode *n = nil; + NSIndexPath *ip = [p indexPath]; + NSLog(@"Content: %@", n); + for (i = 0; i < [ip length]; i++) + { + NSArray *a = (n == nil) ? [self content] : [n subpaths]; + n = [a objectAtIndex:[ip indexAtPosition:i]]; + } + NSLog(@"Path: %@", n); + [paths addObject:[n path]]; + } + + [pboard declareTypes:[NSArray arrayWithObjects:NSFilenamesPboardType,nil] owner:nil]; //add it to pboard + [pboard setPropertyList:paths forType:NSFilenamesPboardType]; + + return YES; +} + + +@end diff --git a/FileDrawer/FileTreeWatcher.h b/FileDrawer/FileTreeWatcher.h new file mode 100644 index 000000000..317113621 --- /dev/null +++ b/FileDrawer/FileTreeWatcher.h @@ -0,0 +1,19 @@ +// +// FileTreeDelegate.h +// BindTest +// +// Created by Zaphod Beeblebrox on 8/20/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import +#import "UKKQueue/UKKQueue.h" + +@interface FileTreeWatcher : NSObject { + UKKQueue *kqueue; + id delegate; + + NSMutableArray *watchedPaths; +} + +@end diff --git a/FileDrawer/FileTreeWatcher.m b/FileDrawer/FileTreeWatcher.m new file mode 100644 index 000000000..c900202a5 --- /dev/null +++ b/FileDrawer/FileTreeWatcher.m @@ -0,0 +1,55 @@ +// +// FileTreeDelegate.m +// BindTest +// +// Created by Zaphod Beeblebrox on 8/20/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import "FileTreeWatcher.h" + +@implementation FileTreeWatcher + +- (id)init +{ + self = [super init]; + if (self) + { + kqueue = [[UKKQueue alloc] init]; + [kqueue setDelegate:self]; + + watchedPaths = [[NSMutableArray alloc] init]; + } + + return self; +} + +- (void)dealloc +{ + [delegate release]; + [super dealloc]; +} + + +- (void)addPath: (NSString *)path +{ + if ([watchedPaths containsObject:path] == NO) { + [watchedPaths addObject:path]; + + [kqueue addPath: path]; + } +} + +-(void) setDelegate: (id)d +{ + delegate = [d retain]; +} + + +-(void) watcher: (id)kq receivedNotification: (NSString*)nm forPath: (NSString*)fpath +{ + NSLog(@"CHANGED! %@", fpath); + [delegate refreshPath: fpath]; +} + +@end diff --git a/FileDrawer/ImageTextCell.h b/FileDrawer/ImageTextCell.h new file mode 100644 index 000000000..49d8ed7b7 --- /dev/null +++ b/FileDrawer/ImageTextCell.h @@ -0,0 +1,20 @@ +// +// ImageAndTextCell.h +// +// Copyright (c) 2001-2002, Apple. All rights reserved. +// + +#import + +@interface ImageTextCell : NSTextFieldCell { +@private + NSImage *image; +} + +- (void)setImage:(NSImage *)anImage; +- (NSImage *)image; + +- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView; +- (NSSize)cellSize; + +@end \ No newline at end of file diff --git a/FileDrawer/ImageTextCell.m b/FileDrawer/ImageTextCell.m new file mode 100644 index 000000000..965c512df --- /dev/null +++ b/FileDrawer/ImageTextCell.m @@ -0,0 +1,83 @@ +#import "ImageTextCell.h" + +@implementation ImageTextCell + +- (void)dealloc { + [image release]; + image = nil; + [super dealloc]; +} + +- copyWithZone:(NSZone *)zone { + ImageTextCell *cell = (ImageTextCell *)[super copyWithZone:zone]; + cell->image = [image retain]; + return cell; +} + +- (void)setImage:(NSImage *)anImage { + if (anImage != image) { + [image release]; + image = [anImage retain]; + } +} + +- (NSImage *)image { + return image; +} + +- (NSRect)imageFrameForCellFrame:(NSRect)cellFrame { + if (image != nil) { + NSRect imageFrame; + imageFrame.size = [image size]; + imageFrame.origin = cellFrame.origin; + imageFrame.origin.x += 3; + imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); + return imageFrame; + } + else + return NSZeroRect; +} + +- (void)editWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject event:(NSEvent *)theEvent { + NSRect textFrame, imageFrame; + NSDivideRect (aRect, &imageFrame, &textFrame, 3 + [image size].width, NSMinXEdge); + [super editWithFrame: textFrame inView: controlView editor:textObj delegate:anObject event: theEvent]; +} + +- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(int)selStart length:(int)selLength { + NSRect textFrame, imageFrame; + NSDivideRect (aRect, &imageFrame, &textFrame, 3 + [image size].width, NSMinXEdge); + [super selectWithFrame: textFrame inView: controlView editor:textObj delegate:anObject start:selStart length:selLength]; +} + +- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { + if (image != nil) { + NSSize imageSize; + NSRect imageFrame; + + imageSize = [image size]; + NSDivideRect(cellFrame, &imageFrame, &cellFrame, 3 + imageSize.width, NSMinXEdge); + if ([self drawsBackground]) { + [[self backgroundColor] set]; + NSRectFill(imageFrame); + } + imageFrame.origin.x += 3; + imageFrame.size = imageSize; + + if ([controlView isFlipped]) + imageFrame.origin.y += ceil((cellFrame.size.height + imageFrame.size.height) / 2); + else + imageFrame.origin.y += ceil((cellFrame.size.height - imageFrame.size.height) / 2); + + [image compositeToPoint:imageFrame.origin operation:NSCompositeSourceOver]; + } + [super drawWithFrame:cellFrame inView:controlView]; +} + +- (NSSize)cellSize { + NSSize cellSize = [super cellSize]; + cellSize.width += (image ? [image size].width : 0) + 3; + return cellSize; +} + +@end \ No newline at end of file diff --git a/FileDrawer/PathIcon.h b/FileDrawer/PathIcon.h new file mode 100644 index 000000000..c31e19a44 --- /dev/null +++ b/FileDrawer/PathIcon.h @@ -0,0 +1,19 @@ +// +// FileIcon.h +// Cog +// +// Created by Zaphod Beeblebrox on 8/20/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import + + +@interface PathIcon : NSObject { + NSString *path; + NSImage *icon; +} + +-(id)initWithPath:(NSString *)p; + +@end diff --git a/FileDrawer/PathIcon.m b/FileDrawer/PathIcon.m new file mode 100644 index 000000000..0044e5e11 --- /dev/null +++ b/FileDrawer/PathIcon.m @@ -0,0 +1,38 @@ +// +// FileIcon.m +// Cog +// +// Created by Zaphod Beeblebrox on 8/20/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import "PathIcon.h" + + +@implementation PathIcon + +-(id)initWithPath:(NSString *)p +{ + self = [super init]; + if (self) + { + path = [p retain]; + icon = [[[NSWorkspace sharedWorkspace] iconForFile:path] retain]; + + [icon setSize: NSMakeSize(16.0, 16.0)]; + } + + return self; +} + +- (NSString *) path +{ + return path; +} + +- (NSImage *) icon +{ + return icon; +} + +@end diff --git a/FileDrawer/PathNode.h b/FileDrawer/PathNode.h new file mode 100644 index 000000000..906764e5b --- /dev/null +++ b/FileDrawer/PathNode.h @@ -0,0 +1,23 @@ +// +// Node.h +// Cog +// +// Created by Vincent Spader on 8/20/2006. +// Copyright 2006 Vincent Spader. All rights reserved. +// + +#import +#import "PathIcon.h" + +@interface PathNode : NSObject +{ + NSString *path; + PathIcon *pathIcon; +} + +- (id)initWithPath:(NSString *)p; + +- (id)pathIcon; +- (void)setPathIcon:(id)pi; + +@end diff --git a/FileDrawer/PathNode.m b/FileDrawer/PathNode.m new file mode 100644 index 000000000..8c6fdc444 --- /dev/null +++ b/FileDrawer/PathNode.m @@ -0,0 +1,50 @@ +// +// Node.m +// Cog +// +// Created by Vincent Spader on 8/20/2006. +// Copyright 2006 Vincent Spader. All rights reserved. +// + +#import "PathNode.h" + +@implementation PathNode + +- (id)initWithPath:(NSString *)p +{ + self = [super init]; + + if (self) + { + path = [p retain]; + [self setPathIcon:[[PathIcon alloc] initWithPath:path]]; + } + + return self; +} + +- (void)dealloc +{ + [path release]; + [super dealloc]; +} + +- (NSString *)path +{ + return path; +} + +- (id)pathIcon +{ + return pathIcon; +} + +- (void)setPathIcon:(id)pi +{ + [pi retain]; + [pathIcon release]; + pathIcon = pi; +} + + +@end diff --git a/FileDrawer/UKKQueue/UKFNSubscribeFileWatcher.h b/FileDrawer/UKKQueue/UKFNSubscribeFileWatcher.h new file mode 100644 index 000000000..259cb8378 --- /dev/null +++ b/FileDrawer/UKKQueue/UKFNSubscribeFileWatcher.h @@ -0,0 +1,49 @@ +/* ============================================================================= + FILE: UKFNSubscribeFileWatcher.m + PROJECT: Filie + + COPYRIGHT: (c) 2005 M. Uli Kusterer, all rights reserved. + + AUTHORS: M. Uli Kusterer - UK + + LICENSES: MIT License + + REVISIONS: + 2006-03-13 UK Commented, added singleton. + 2005-03-02 UK Created. + ========================================================================== */ + +// ----------------------------------------------------------------------------- +// Headers: +// ----------------------------------------------------------------------------- + +#import +#import "UKFileWatcher.h" +#import + +/* + NOTE: FNSubscribe has a built-in delay: If your application is in the + background while the changes happen, all notifications will be queued up + and sent to your app at once the moment it is brought to front again. If + your app really needs to do live updates in the background, use a KQueue + instead. +*/ + +// ----------------------------------------------------------------------------- +// Class declaration: +// ----------------------------------------------------------------------------- + +@interface UKFNSubscribeFileWatcher : NSObject +{ + id delegate; // Delegate must respond to UKFileWatcherDelegate protocol. + NSMutableDictionary* subscriptions; // List of FNSubscription pointers in NSValues, with the pathnames as their keys. +} + ++(id) sharedFileWatcher; + +// UKFileWatcher defines the methods: addPath: removePath: and delegate accessors. + +// Private: +-(void) sendDelegateMessage: (FNMessage)message forSubscription: (FNSubscriptionRef)subscription; + +@end diff --git a/FileDrawer/UKKQueue/UKFNSubscribeFileWatcher.m b/FileDrawer/UKKQueue/UKFNSubscribeFileWatcher.m new file mode 100644 index 000000000..f4df11ee7 --- /dev/null +++ b/FileDrawer/UKKQueue/UKFNSubscribeFileWatcher.m @@ -0,0 +1,201 @@ +/* ============================================================================= + FILE: UKFNSubscribeFileWatcher.m + PROJECT: Filie + + COPYRIGHT: (c) 2005 M. Uli Kusterer, all rights reserved. + + AUTHORS: M. Uli Kusterer - UK + + LICENSES: MIT License + + REVISIONS: + 2006-03-13 UK Commented, added singleton, added notifications. + 2005-03-02 UK Created. + ========================================================================== */ + +// ----------------------------------------------------------------------------- +// Headers: +// ----------------------------------------------------------------------------- + +#import "UKFNSubscribeFileWatcher.h" +#import + + +// ----------------------------------------------------------------------------- +// Prototypes: +// ----------------------------------------------------------------------------- + +void UKFileSubscriptionProc(FNMessage message, OptionBits flags, void *refcon, FNSubscriptionRef subscription); + + +@implementation UKFNSubscribeFileWatcher + +// ----------------------------------------------------------------------------- +// sharedFileWatcher: +// Singleton accessor. +// ----------------------------------------------------------------------------- + ++(id) sharedFileWatcher +{ + static UKFNSubscribeFileWatcher* sSharedFileWatcher = nil; + + if( !sSharedFileWatcher ) + sSharedFileWatcher = [[UKFNSubscribeFileWatcher alloc] init]; // This is a singleton, and thus an intentional "leak". + + return sSharedFileWatcher; +} + + +// ----------------------------------------------------------------------------- +// * CONSTRUCTOR: +// ----------------------------------------------------------------------------- + +-(id) init +{ + self = [super init]; + if( !self ) + return nil; + + subscriptions = [[NSMutableDictionary alloc] init]; + + return self; +} + + +// ----------------------------------------------------------------------------- +// * DESTRUCTOR: +// ----------------------------------------------------------------------------- + +-(void) dealloc +{ + NSEnumerator* enny = [subscriptions objectEnumerator]; + NSValue* subValue = nil; + + while( (subValue = [enny nextObject]) ) + { + FNSubscriptionRef subscription = [subValue pointerValue]; + FNUnsubscribe( subscription ); + } + + [subscriptions release]; + [super dealloc]; +} + + +// ----------------------------------------------------------------------------- +// addPath: +// Start watching the object at the specified path. This only sends write +// notifications for all changes, as FNSubscribe doesn't tell what actually +// changed about our folder. +// ----------------------------------------------------------------------------- + +-(void) addPath: (NSString*)path +{ + OSStatus err = noErr; + static FNSubscriptionUPP subscriptionUPP = NULL; + FNSubscriptionRef subscription = NULL; + + if( !subscriptionUPP ) + subscriptionUPP = NewFNSubscriptionUPP( UKFileSubscriptionProc ); + + err = FNSubscribeByPath( (UInt8*) [path fileSystemRepresentation], subscriptionUPP, (void*)self, + kNilOptions, &subscription ); + if( err != noErr ) + { + NSLog( @"UKFNSubscribeFileWatcher addPath: %@ failed due to error ID=%ld.", path, err ); + return; + } + + [subscriptions setObject: [NSValue valueWithPointer: subscription] forKey: path]; +} + + +// ----------------------------------------------------------------------------- +// removePath: +// Stop watching the object at the specified path. +// ----------------------------------------------------------------------------- + +-(void) removePath: (NSString*)path +{ + NSValue* subValue = nil; + @synchronized( self ) + { + subValue = [[[subscriptions objectForKey: path] retain] autorelease]; + [subscriptions removeObjectForKey: path]; + } + + if( subValue ) + { + FNSubscriptionRef subscription = [subValue pointerValue]; + + FNUnsubscribe( subscription ); + } +} + + +// ----------------------------------------------------------------------------- +// sendDelegateMessage:forSubscription: +// Bottleneck for change notifications. This is called by our callback +// function to actually inform the delegate and send out notifications. +// +// This *only* sends out write notifications, as FNSubscribe doesn't tell +// what changed about our folder. +// ----------------------------------------------------------------------------- + +-(void) sendDelegateMessage: (FNMessage)message forSubscription: (FNSubscriptionRef)subscription +{ + NSValue* subValue = [NSValue valueWithPointer: subscription]; + NSString* path = [[subscriptions allKeysForObject: subValue] objectAtIndex: 0]; + + [[[NSWorkspace sharedWorkspace] notificationCenter] postNotificationName: UKFileWatcherWriteNotification + object: self + userInfo: [NSDictionary dictionaryWithObjectsAndKeys: path, @"path", nil]]; + + [delegate watcher: self receivedNotification: UKFileWatcherWriteNotification forPath: path]; + //NSLog( @"UKFNSubscribeFileWatcher noticed change to %@", path ); // DEBUG ONLY! +} + + + +// ----------------------------------------------------------------------------- +// delegate: +// Accessor for file watcher delegate. +// ----------------------------------------------------------------------------- + +-(id) delegate +{ + return delegate; +} + + +// ----------------------------------------------------------------------------- +// setDelegate: +// Mutator for file watcher delegate. +// ----------------------------------------------------------------------------- + +-(void) setDelegate: (id)newDelegate +{ + delegate = newDelegate; +} + + +@end + + +// ----------------------------------------------------------------------------- +// UKFileSubscriptionProc: +// Callback function we hand to Carbon so it can tell us when something +// changed about our watched folders. We set the refcon to a pointer to +// our object. This simply extracts the object and hands the info off to +// sendDelegateMessage:forSubscription: which does the actual work. +// ----------------------------------------------------------------------------- + +void UKFileSubscriptionProc( FNMessage message, OptionBits flags, void *refcon, FNSubscriptionRef subscription ) +{ + UKFNSubscribeFileWatcher* obj = (UKFNSubscribeFileWatcher*) refcon; + + if( message == kFNDirectoryModifiedMessage ) // No others exist as of 10.4 + [obj sendDelegateMessage: message forSubscription: subscription]; + else + NSLog( @"UKFileSubscriptionProc: Unknown message %d", message ); +} \ No newline at end of file diff --git a/FileDrawer/UKKQueue/UKFileWatcher.h b/FileDrawer/UKKQueue/UKFileWatcher.h new file mode 100644 index 000000000..c2c4ba28c --- /dev/null +++ b/FileDrawer/UKKQueue/UKFileWatcher.h @@ -0,0 +1,62 @@ +/* ============================================================================= + FILE: UKFileWatcher.h + PROJECT: Filie + + COPYRIGHT: (c) 2005 M. Uli Kusterer, all rights reserved. + + AUTHORS: M. Uli Kusterer - UK + + LICENSES: MIT License + + REVISIONS: + 2006-03-13 UK Moved notification constants to .m file. + 2005-02-25 UK Created. + ========================================================================== */ + +/* + This is a protocol that file change notification classes should adopt. + That way, no matter whether you use Carbon's FNNotify/FNSubscribe, BSD's + kqueue or whatever, the object being notified can react to change + notifications the same way, and you can easily swap one out for the other + to cater to different OS versions, target volumes etc. +*/ + +// ----------------------------------------------------------------------------- +// Protocol: +// ----------------------------------------------------------------------------- + +@protocol UKFileWatcher + +// +(id) sharedFileWatcher; // Singleton accessor. Not officially part of the protocol, but use this name if you provide a singleton. + +-(void) addPath: (NSString*)path; +-(void) removePath: (NSString*)path; + +-(id) delegate; +-(void) setDelegate: (id)newDelegate; + +@end + +// ----------------------------------------------------------------------------- +// Methods delegates need to provide: +// ----------------------------------------------------------------------------- + +@interface NSObject (UKFileWatcherDelegate) + +-(void) watcher: (id)kq receivedNotification: (NSString*)nm forPath: (NSString*)fpath; + +@end + + +// Notifications this sends: +/* object = the file watcher object + userInfo.path = file path watched + These notifications are sent via the NSWorkspace notification center */ +extern NSString* UKFileWatcherRenameNotification; +extern NSString* UKFileWatcherWriteNotification; +extern NSString* UKFileWatcherDeleteNotification; +extern NSString* UKFileWatcherAttributeChangeNotification; +extern NSString* UKFileWatcherSizeIncreaseNotification; +extern NSString* UKFileWatcherLinkCountChangeNotification; +extern NSString* UKFileWatcherAccessRevocationNotification; + diff --git a/FileDrawer/UKKQueue/UKFileWatcher.m b/FileDrawer/UKKQueue/UKFileWatcher.m new file mode 100644 index 000000000..952cf95fd --- /dev/null +++ b/FileDrawer/UKKQueue/UKFileWatcher.m @@ -0,0 +1,38 @@ +/* ============================================================================= + FILE: UKKQueue.m + PROJECT: Filie + + COPYRIGHT: (c) 2005-06 M. Uli Kusterer, all rights reserved. + + AUTHORS: M. Uli Kusterer - UK + + LICENSES: MIT License + + REVISIONS: + 2006-03-13 UK Created, moved notification constants here as exportable + symbols. + ========================================================================== */ + +// ----------------------------------------------------------------------------- +// Headers: +// ----------------------------------------------------------------------------- + +#import +#import "UKFileWatcher.h" + + +// ----------------------------------------------------------------------------- +// Constants: +// ----------------------------------------------------------------------------- + +// Do not rely on the actual contents of these constants. They will eventually +// be changed to be more generic and less KQueue-specific. + +NSString* UKFileWatcherRenameNotification = @"UKKQueueFileRenamedNotification"; +NSString* UKFileWatcherWriteNotification = @"UKKQueueFileWrittenToNotification"; +NSString* UKFileWatcherDeleteNotification = @"UKKQueueFileDeletedNotification"; +NSString* UKFileWatcherAttributeChangeNotification = @"UKKQueueFileAttributesChangedNotification"; +NSString* UKFileWatcherSizeIncreaseNotification = @"UKKQueueFileSizeIncreasedNotification"; +NSString* UKFileWatcherLinkCountChangeNotification = @"UKKQueueFileLinkCountChangedNotification"; +NSString* UKFileWatcherAccessRevocationNotification = @"UKKQueueFileAccessRevocationNotification"; + diff --git a/FileDrawer/UKKQueue/UKKQueue Readme.txt b/FileDrawer/UKKQueue/UKKQueue Readme.txt new file mode 100644 index 000000000..582e3da96 --- /dev/null +++ b/FileDrawer/UKKQueue/UKKQueue Readme.txt @@ -0,0 +1,32 @@ +UKKQUEUE +-------- + +A wrapper class around the kqueue file change notification mechanism. + +Simply create a UKKQueue (or use the singleton), add a few paths to it and listen to the change notifications via NSWorkspace's notification center. + +LICENSE: + +(c) 2003-06 by M. Uli Kusterer. You may redistribute, modify, use in +commercial products free of charge, however distributing modified copies +requires that you clearly mark them as having been modified by you, while +maintaining the original markings and copyrights. I don't like getting bug +reports about code I wasn't involved in. + +I'd also appreciate if you gave credit in your app's about screen or a similar +place. A simple "Thanks to M. Uli Kusterer" is quite sufficient. +Also, I rarely turn down any postcards, gifts, complementary copies of +applications etc. + + +REVISION HISTORY: +0.1 - Initial release. +0.2 - Now calls delegate on main thread using UKMainThreadProxy, and checks retain count to make sure the object is released even when the thread is still holding on to it. Equivalent to SVN revision 79. +0.3 - Now adopts UKFileWatcher protocol to allow swapping out a kqueue for another scheme easily. Uses O_EVONLY instead of O_RDONLY to open the file without preventing it from being deleted or its drive ejected. +0.4 - Now includes UKFNSubscribeFileWatcher, and closes the kqueue file descriptor in a separate thread (thanks to Dominic Yu for the suggestion!) so you don't have to wait for close() to time out. +0.5 - Turns off all deprecated features. Changes the notifications to make it possible to subscribe to them more selectively. Changes notification constants to be safer for apps that expose KQueue to their plugins. FNSubscribeFileWatcher now also sends notifications (sorry, "write" only). + + +CONTACT: +Get the newest version at http://www.zathras.de +E-Mail me at witness (at) zathras (dot) de or witness (dot) of (dot) teachtext (at) gmx (dot) net diff --git a/FileDrawer/UKKQueue/UKKQueue.h b/FileDrawer/UKKQueue/UKKQueue.h new file mode 100644 index 000000000..facd513cb --- /dev/null +++ b/FileDrawer/UKKQueue/UKKQueue.h @@ -0,0 +1,122 @@ +/* ============================================================================= + FILE: UKKQueue.h + PROJECT: Filie + + COPYRIGHT: (c) 2003 M. Uli Kusterer, all rights reserved. + + AUTHORS: M. Uli Kusterer - UK + + LICENSES: MIT License + + REVISIONS: + 2006-03-13 UK Clarified license, streamlined UKFileWatcher stuff, + Changed notifications to be useful and turned off by + default some deprecated stuff. + 2003-12-21 UK Created. + ========================================================================== */ + +// ----------------------------------------------------------------------------- +// Headers: +// ----------------------------------------------------------------------------- + +#import +#include +#include +#import "UKFileWatcher.h" + + +// ----------------------------------------------------------------------------- +// Constants: +// ----------------------------------------------------------------------------- + +// Backwards compatibility constants. Don't rely on code commented out with these constants, because it may be deleted in a future version. +#ifndef UKKQUEUE_BACKWARDS_COMPATIBLE +#define UKKQUEUE_BACKWARDS_COMPATIBLE 0 // 1 to send old-style kqueue:receivedNotification:forFile: messages to objects that accept them. +#endif + +#ifndef UKKQUEUE_SEND_STUPID_NOTIFICATIONS +#define UKKQUEUE_SEND_STUPID_NOTIFICATIONS 0 // 1 to send old-style notifications that have the path as the object and no userInfo dictionary. +#endif + +#ifndef UKKQUEUE_OLD_SINGLETON_ACCESSOR_NAME +#define UKKQUEUE_OLD_SINGLETON_ACCESSOR_NAME 0 // 1 to allow use of sharedQueue instead of sharedFileWatcher. +#endif + +#ifndef UKKQUEUE_OLD_NOTIFICATION_NAMES +#define UKKQUEUE_OLD_NOTIFICATION_NAMES 0 // 1 to allow use of old KQueue-style notification names instead of the new more generic ones in UKFileWatcher. +#endif + +// Flags for notifyingAbout: +#define UKKQueueNotifyAboutRename NOTE_RENAME // Item was renamed. +#define UKKQueueNotifyAboutWrite NOTE_WRITE // Item contents changed (also folder contents changed). +#define UKKQueueNotifyAboutDelete NOTE_DELETE // item was removed. +#define UKKQueueNotifyAboutAttributeChange NOTE_ATTRIB // Item attributes changed. +#define UKKQueueNotifyAboutSizeIncrease NOTE_EXTEND // Item size increased. +#define UKKQueueNotifyAboutLinkCountChanged NOTE_LINK // Item's link count changed. +#define UKKQueueNotifyAboutAccessRevocation NOTE_REVOKE // Access to item was revoked. + +// Notifications this sends: +// (see UKFileWatcher) +// Old names: *deprecated* +#if UKKQUEUE_OLD_NOTIFICATION_NAMES +#define UKKQueueFileRenamedNotification UKFileWatcherRenameNotification +#define UKKQueueFileWrittenToNotification UKFileWatcherWriteNotification +#define UKKQueueFileDeletedNotification UKFileWatcherDeleteNotification +#define UKKQueueFileAttributesChangedNotification UKFileWatcherAttributeChangeNotification +#define UKKQueueFileSizeIncreasedNotification UKFileWatcherSizeIncreaseNotification +#define UKKQueueFileLinkCountChangedNotification UKFileWatcherLinkCountChangeNotification +#define UKKQueueFileAccessRevocationNotification UKFileWatcherAccessRevocationNotification +#endif + + +// ----------------------------------------------------------------------------- +// UKKQueue: +// ----------------------------------------------------------------------------- + +@interface UKKQueue : NSObject +{ + int queueFD; // The actual queue ID (Unix file descriptor). + NSMutableArray* watchedPaths; // List of NSStrings containing the paths we're watching. + NSMutableArray* watchedFDs; // List of NSNumbers containing the file descriptors we're watching. + id delegate; // Gets messages about changes instead of notification center, if specified. + id delegateProxy; // Proxy object to which we send messages so they reach delegate on the main thread. + BOOL alwaysNotify; // Send notifications even if we have a delegate? Defaults to NO. + BOOL keepThreadRunning; // Termination criterion of our thread. +} + ++(id) sharedFileWatcher; // Returns a singleton, a shared kqueue object Handy if you're subscribing to the notifications. Use this, or just create separate objects using alloc/init. Whatever floats your boat. + +-(int) queueFD; // I know you unix geeks want this... + +// High-level file watching: (use UKFileWatcher protocol methods instead, where possible!) +-(void) addPathToQueue: (NSString*)path; +-(void) addPathToQueue: (NSString*)path notifyingAbout: (u_int)fflags; +-(void) removePathFromQueue: (NSString*)path; + +-(id) delegate; +-(void) setDelegate: (id)newDelegate; + +-(BOOL) alwaysNotify; +-(void) setAlwaysNotify: (BOOL)n; + +#if UKKQUEUE_OLD_SINGLETON_ACCESSOR_NAME ++(UKKQueue*) sharedQueue; +#endif + +// private: +-(void) watcherThread: (id)sender; +-(void) postNotification: (NSString*)nm forFile: (NSString*)fp; // Message-posting bottleneck. + +@end + + +// ----------------------------------------------------------------------------- +// Methods delegates need to provide: +// * DEPRECATED * use UKFileWatcher delegate methods instead! +// ----------------------------------------------------------------------------- + +@interface NSObject (UKKQueueDelegate) + +-(void) kqueue: (UKKQueue*)kq receivedNotification: (NSString*)nm forFile: (NSString*)fpath; + +@end diff --git a/FileDrawer/UKKQueue/UKKQueue.m b/FileDrawer/UKKQueue/UKKQueue.m new file mode 100644 index 000000000..3217ef49f --- /dev/null +++ b/FileDrawer/UKKQueue/UKKQueue.m @@ -0,0 +1,480 @@ +/* ============================================================================= + FILE: UKKQueue.m + PROJECT: Filie + + COPYRIGHT: (c) 2003 M. Uli Kusterer, all rights reserved. + + AUTHORS: M. Uli Kusterer - UK + + LICENSES: MIT License + + REVISIONS: + 2006-03-13 UK Clarified license, streamlined UKFileWatcher stuff, + Changed notifications to be useful and turned off by + default some deprecated stuff. + 2004-12-28 UK Several threading fixes. + 2003-12-21 UK Created. + ========================================================================== */ + +// ----------------------------------------------------------------------------- +// Headers: +// ----------------------------------------------------------------------------- + +#import "UKKQueue.h" +#import "UKMainThreadProxy.h" +#import +#import + + +// ----------------------------------------------------------------------------- +// Macros: +// ----------------------------------------------------------------------------- + +// @synchronized isn't available prior to 10.3, so we use a typedef so +// this class is thread-safe on Panther but still compiles on older OSs. + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3 +#define AT_SYNCHRONIZED(n) @synchronized(n) +#else +#define AT_SYNCHRONIZED(n) +#endif + + +// ----------------------------------------------------------------------------- +// Globals: +// ----------------------------------------------------------------------------- + +static UKKQueue * gUKKQueueSharedQueueSingleton = nil; + + +@implementation UKKQueue + +// Deprecated: +#if UKKQUEUE_OLD_SINGLETON_ACCESSOR_NAME ++(UKKQueue*) sharedQueue +{ + return [self sharedFileWatcher]; +} +#endif + +// ----------------------------------------------------------------------------- +// sharedQueue: +// Returns a singleton queue object. In many apps (especially those that +// subscribe to the notifications) there will only be one kqueue instance, +// and in that case you can use this. +// +// For all other cases, feel free to create additional instances to use +// independently. +// +// REVISIONS: +// 2006-03-13 UK Renamed from sharedQueue. +// 2005-07-02 UK Created. +// ----------------------------------------------------------------------------- + ++(id) sharedFileWatcher +{ + AT_SYNCHRONIZED( self ) + { + if( !gUKKQueueSharedQueueSingleton ) + gUKKQueueSharedQueueSingleton = [[UKKQueue alloc] init]; // This is a singleton, and thus an intentional "leak". + } + + return gUKKQueueSharedQueueSingleton; +} + + +// ----------------------------------------------------------------------------- +// * CONSTRUCTOR: +// Creates a new KQueue and starts that thread we use for our +// notifications. +// +// REVISIONS: +// 2004-11-12 UK Doesn't pass self as parameter to watcherThread anymore, +// because detachNewThreadSelector retains target and args, +// which would cause us to never be released. +// 2004-03-13 UK Documented. +// ----------------------------------------------------------------------------- + +-(id) init +{ + self = [super init]; + if( self ) + { + queueFD = kqueue(); + if( queueFD == -1 ) + { + [self release]; + return nil; + } + + watchedPaths = [[NSMutableArray alloc] init]; + watchedFDs = [[NSMutableArray alloc] init]; + + // Start new thread that fetches and processes our events: + keepThreadRunning = YES; + [NSThread detachNewThreadSelector:@selector(watcherThread:) toTarget:self withObject:nil]; + } + + return self; +} + + +// ----------------------------------------------------------------------------- +// release: +// Since NSThread retains its target, we need this method to terminate the +// thread when we reach a retain-count of two. The thread is terminated by +// setting keepThreadRunning to NO. +// +// REVISIONS: +// 2004-11-12 UK Created. +// ----------------------------------------------------------------------------- + +-(oneway void) release +{ + AT_SYNCHRONIZED(self) + { + //NSLog(@"%@ (%d)", self, [self retainCount]); + if( [self retainCount] == 2 && keepThreadRunning ) + keepThreadRunning = NO; + } + + [super release]; +} + +// ----------------------------------------------------------------------------- +// * DESTRUCTOR: +// Releases the kqueue again. +// +// REVISIONS: +// 2004-03-13 UK Documented. +// ----------------------------------------------------------------------------- + +-(void) dealloc +{ + delegate = nil; + [delegateProxy release]; + + if( keepThreadRunning ) + keepThreadRunning = NO; + + // Close all our file descriptors so the files can be deleted: + NSEnumerator* enny = [watchedFDs objectEnumerator]; + NSNumber* fdNum; + while( (fdNum = [enny nextObject]) ) + { + if( close( [fdNum intValue] ) == -1 ) + NSLog(@"dealloc: Couldn't close file descriptor (%d)", errno); + } + + [watchedPaths release]; + watchedPaths = nil; + [watchedFDs release]; + watchedFDs = nil; + + [super dealloc]; + + //NSLog(@"kqueue released."); +} + + +// ----------------------------------------------------------------------------- +// queueFD: +// Returns a Unix file descriptor for the KQueue this uses. The descriptor +// is owned by this object. Do not close it! +// +// REVISIONS: +// 2004-03-13 UK Documented. +// ----------------------------------------------------------------------------- + +-(int) queueFD +{ + return queueFD; +} + + +// ----------------------------------------------------------------------------- +// addPathToQueue: +// Tell this queue to listen for all interesting notifications sent for +// the object at the specified path. If you want more control, use the +// addPathToQueue:notifyingAbout: variant instead. +// +// REVISIONS: +// 2004-03-13 UK Documented. +// ----------------------------------------------------------------------------- + +-(void) addPathToQueue: (NSString*)path +{ + [self addPath: path]; +} + + +-(void) addPath: (NSString*)path +{ + [self addPathToQueue: path notifyingAbout: UKKQueueNotifyAboutRename + | UKKQueueNotifyAboutWrite + | UKKQueueNotifyAboutDelete + | UKKQueueNotifyAboutAttributeChange]; +} + + +// ----------------------------------------------------------------------------- +// addPathToQueue:notfyingAbout: +// Tell this queue to listen for the specified notifications sent for +// the object at the specified path. +// +// REVISIONS: +// 2005-06-29 UK Files are now opened using O_EVTONLY instead of O_RDONLY +// which allows ejecting or deleting watched files/folders. +// Thanks to Phil Hargett for finding this flag in the docs. +// 2004-03-13 UK Documented. +// ----------------------------------------------------------------------------- + +-(void) addPathToQueue: (NSString*)path notifyingAbout: (u_int)fflags +{ + struct timespec nullts = { 0, 0 }; + struct kevent ev; + int fd = open( [path fileSystemRepresentation], O_EVTONLY, 0 ); + + if( fd >= 0 ) + { + EV_SET( &ev, fd, EVFILT_VNODE, + EV_ADD | EV_ENABLE | EV_CLEAR, + fflags, 0, (void*)path ); + + AT_SYNCHRONIZED( self ) + { + [watchedPaths addObject: path]; + [watchedFDs addObject: [NSNumber numberWithInt: fd]]; + kevent( queueFD, &ev, 1, NULL, 0, &nullts ); + } + } +} + + +-(void) removePath: (NSString*)path +{ + [self removePathFromQueue: path]; +} + + +// ----------------------------------------------------------------------------- +// removePathFromQueue: +// Stop listening for changes to the specified path. This removes all +// notifications. Use this to balance both addPathToQueue:notfyingAbout: +// as well as addPathToQueue:. +// +// REVISIONS: +// 2004-03-13 UK Documented. +// ----------------------------------------------------------------------------- + +-(void) removePathFromQueue: (NSString*)path +{ + int index = 0; + int fd = -1; + + AT_SYNCHRONIZED( self ) + { + index = [watchedPaths indexOfObject: path]; + + if( index == NSNotFound ) + return; + + fd = [[watchedFDs objectAtIndex: index] intValue]; + + [watchedFDs removeObjectAtIndex: index]; + [watchedPaths removeObjectAtIndex: index]; + } + + if( close( fd ) == -1 ) + NSLog(@"removePathFromQueue: Couldn't close file descriptor (%d)", errno); +} + + +// ----------------------------------------------------------------------------- +// removeAllPathsFromQueue: +// Stop listening for changes to all paths. This removes all +// notifications. +// +// REVISIONS: +// 2004-12-28 UK Added as suggested by bbum. +// ----------------------------------------------------------------------------- + +-(void) removeAllPathsFromQueue; +{ + AT_SYNCHRONIZED( self ) + { + NSEnumerator * fdEnumerator = [watchedFDs objectEnumerator]; + NSNumber * anFD; + + while( (anFD = [fdEnumerator nextObject]) != nil ) + close( [anFD intValue] ); + + [watchedFDs removeAllObjects]; + [watchedPaths removeAllObjects]; + } +} + + +// ----------------------------------------------------------------------------- +// watcherThread: +// This method is called by our NSThread to loop and poll for any file +// changes that our kqueue wants to tell us about. This sends separate +// notifications for the different kinds of changes that can happen. +// All messages are sent via the postNotification:forFile: main bottleneck. +// +// This also calls sharedWorkspace's noteFileSystemChanged. +// +// To terminate this method (and its thread), set keepThreadRunning to NO. +// +// REVISIONS: +// 2005-08-27 UK Changed to use keepThreadRunning instead of kqueueFD +// being -1 as termination criterion, and to close the +// queue in this thread so the main thread isn't blocked. +// 2004-11-12 UK Fixed docs to include termination criterion, added +// timeout to make sure the bugger gets disposed. +// 2004-03-13 UK Documented. +// ----------------------------------------------------------------------------- + +-(void) watcherThread: (id)sender +{ + int n; + struct kevent ev; + struct timespec timeout = { 5, 0 }; // 5 seconds timeout. + int theFD = queueFD; // So we don't have to risk accessing iVars when the thread is terminated. + + while( keepThreadRunning ) + { + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + + NS_DURING + n = kevent( queueFD, NULL, 0, &ev, 1, &timeout ); + if( n > 0 ) + { + if( ev.filter == EVFILT_VNODE ) + { + if( ev.fflags ) + { + NSString* fpath = [[(NSString *)ev.udata retain] autorelease]; // In case one of the notified folks removes the path. + //NSLog(@"UKKQueue: Detected file change: %@", fpath); + [[NSWorkspace sharedWorkspace] noteFileSystemChanged: fpath]; + + //NSLog(@"ev.flags = %u",ev.fflags); // DEBUG ONLY! + + if( (ev.fflags & NOTE_RENAME) == NOTE_RENAME ) + [self postNotification: UKFileWatcherRenameNotification forFile: fpath]; + if( (ev.fflags & NOTE_WRITE) == NOTE_WRITE ) + [self postNotification: UKFileWatcherWriteNotification forFile: fpath]; + if( (ev.fflags & NOTE_DELETE) == NOTE_DELETE ) + [self postNotification: UKFileWatcherDeleteNotification forFile: fpath]; + if( (ev.fflags & NOTE_ATTRIB) == NOTE_ATTRIB ) + [self postNotification: UKFileWatcherAttributeChangeNotification forFile: fpath]; + if( (ev.fflags & NOTE_EXTEND) == NOTE_EXTEND ) + [self postNotification: UKFileWatcherSizeIncreaseNotification forFile: fpath]; + if( (ev.fflags & NOTE_LINK) == NOTE_LINK ) + [self postNotification: UKFileWatcherLinkCountChangeNotification forFile: fpath]; + if( (ev.fflags & NOTE_REVOKE) == NOTE_REVOKE ) + [self postNotification: UKFileWatcherAccessRevocationNotification forFile: fpath]; + } + } + } + NS_HANDLER + NSLog(@"Error in UKKQueue watcherThread: %@",localException); + NS_ENDHANDLER + + [pool release]; + } + + // Close our kqueue's file descriptor: + if( close( theFD ) == -1 ) + NSLog(@"release: Couldn't close main kqueue (%d)", errno); + + //NSLog(@"exiting kqueue watcher thread."); +} + + +// ----------------------------------------------------------------------------- +// postNotification:forFile: +// This is the main bottleneck for posting notifications. If you don't want +// the notifications to go through NSWorkspace, override this method and +// send them elsewhere. +// +// REVISIONS: +// 2004-02-27 UK Changed this to send new notification, and the old one +// only to objects that respond to it. The old category on +// NSObject could cause problems with the proxy itself. +// 2004-10-31 UK Helloween fun: Make this use a mainThreadProxy and +// allow sending the notification even if we have a +// delegate. +// 2004-03-13 UK Documented. +// ----------------------------------------------------------------------------- + +-(void) postNotification: (NSString*)nm forFile: (NSString*)fp +{ + if( delegateProxy ) + { + #if UKKQUEUE_BACKWARDS_COMPATIBLE + if( ![delegateProxy respondsToSelector: @selector(watcher:receivedNotification:forPath:)] ) + [delegateProxy kqueue: self receivedNotification: nm forFile: fp]; + else + #endif + [delegateProxy watcher: self receivedNotification: nm forPath: fp]; + } + + if( !delegateProxy || alwaysNotify ) + { + #if UKKQUEUE_SEND_STUPID_NOTIFICATIONS + [[[NSWorkspace sharedWorkspace] notificationCenter] postNotificationName: nm object: fp]; + #else + [[[NSWorkspace sharedWorkspace] notificationCenter] postNotificationName: nm object: self + userInfo: [NSDictionary dictionaryWithObjectsAndKeys: fp, @"path", nil]]; + #endif + } +} + +-(id) delegate +{ + return delegate; +} + +-(void) setDelegate: (id)newDelegate +{ + id oldProxy = delegateProxy; + delegate = newDelegate; + delegateProxy = [delegate copyMainThreadProxy]; + [oldProxy release]; +} + +// ----------------------------------------------------------------------------- +// Flag to send a notification even if we have a delegate: +// ----------------------------------------------------------------------------- + +-(BOOL) alwaysNotify +{ + return alwaysNotify; +} + + +-(void) setAlwaysNotify: (BOOL)n +{ + alwaysNotify = n; +} + + +// ----------------------------------------------------------------------------- +// description: +// This method can be used to help in debugging. It provides the value +// used by NSLog & co. when you request to print this object using the +// %@ format specifier. +// +// REVISIONS: +// 2004-11-12 UK Created. +// ----------------------------------------------------------------------------- + +-(NSString*) description +{ + return [NSString stringWithFormat: @"%@ { watchedPaths = %@, alwaysNotify = %@ }", NSStringFromClass([self class]), watchedPaths, (alwaysNotify? @"YES" : @"NO") ]; +} + +@end + + diff --git a/FileDrawer/UKKQueue/UKMainThreadProxy.h b/FileDrawer/UKKQueue/UKMainThreadProxy.h new file mode 100644 index 000000000..9fd6ff453 --- /dev/null +++ b/FileDrawer/UKKQueue/UKMainThreadProxy.h @@ -0,0 +1,56 @@ +/* ============================================================================= + FILE: UKMainThreadProxy.h + PROJECT: UKMainThreadProxy + + PURPOSE: Send a message to object theObject to [theObject mainThreadProxy] + instead and the message will be received on the main thread by + theObject. + + COPYRIGHT: (c) 2004 M. Uli Kusterer, all rights reserved. + + AUTHORS: M. Uli Kusterer - UK + + LICENSES: MIT License + + REVISIONS: + 2006-03-13 UK Clarified license. + 2004-10-14 UK Created. + ========================================================================== */ + +// ----------------------------------------------------------------------------- +// Headers: +// ----------------------------------------------------------------------------- + +#import + + +// ----------------------------------------------------------------------------- +// Categories: +// ----------------------------------------------------------------------------- + +@interface NSObject (UKMainThreadProxy) + +-(id) mainThreadProxy; // You can't init or release this object. +-(id) copyMainThreadProxy; // Gives you a retained version. + +@end + + +// ----------------------------------------------------------------------------- +// Classes: +// ----------------------------------------------------------------------------- + +/* + This object is created as a proxy in a second thread for an existing object. + All messages you send to this object will automatically be sent to the other + object on the main thread, except NSObject methods like retain/release etc. +*/ + +@interface UKMainThreadProxy : NSObject +{ + IBOutlet id target; +} + +-(id) initWithTarget: (id)targ; + +@end diff --git a/FileDrawer/UKKQueue/UKMainThreadProxy.m b/FileDrawer/UKKQueue/UKMainThreadProxy.m new file mode 100644 index 000000000..c3517980e --- /dev/null +++ b/FileDrawer/UKKQueue/UKMainThreadProxy.m @@ -0,0 +1,151 @@ +/* ============================================================================= + FILE: UKMainThreadProxy.h + PROJECT: UKMainThreadProxy + + PURPOSE: Send a message to object theObject to [theObject mainThreadProxy] + instead and the message will be received on the main thread by + theObject. + + COPYRIGHT: (c) 2004 M. Uli Kusterer, all rights reserved. + + AUTHORS: M. Uli Kusterer - UK + + LICENSES: MIT Licenseâ + + REVISIONS: + 2006-03-13 UK Clarified license. + 2004-10-14 UK Created. + ========================================================================== */ + +// ----------------------------------------------------------------------------- +// Headers: +// ----------------------------------------------------------------------------- + +#import "UKMainThreadProxy.h" + + +@implementation UKMainThreadProxy + +-(id) initWithTarget: (id)targ +{ + self = [super init]; + if( self ) + target = targ; + + return self; +} + + +// ----------------------------------------------------------------------------- +// Introspection overrides: +// ----------------------------------------------------------------------------- + +-(BOOL) respondsToSelector: (SEL)itemAction +{ + BOOL does = [super respondsToSelector: itemAction]; + + return( does || [target respondsToSelector: itemAction] ); +} + + +-(id) performSelector: (SEL)itemAction +{ + BOOL does = [super respondsToSelector: itemAction]; + if( does ) + return [super performSelector: itemAction]; + + if( ![target respondsToSelector: itemAction] ) + [self doesNotRecognizeSelector: itemAction]; + + [target retain]; + [target performSelectorOnMainThread: itemAction withObject: nil waitUntilDone: YES]; + [target release]; + + return nil; +} + + +-(id) performSelector: (SEL)itemAction withObject: (id)obj +{ + BOOL does = [super respondsToSelector: itemAction]; + if( does ) + return [super performSelector: itemAction withObject: obj]; + + if( ![target respondsToSelector: itemAction] ) + [self doesNotRecognizeSelector: itemAction]; + + [target retain]; + [obj retain]; + [target performSelectorOnMainThread: itemAction withObject: obj waitUntilDone: YES]; + [obj release]; + [target release]; + + return nil; +} + + +// ----------------------------------------------------------------------------- +// Forwarding unknown methods to the target: +// ----------------------------------------------------------------------------- + +-(NSMethodSignature*) methodSignatureForSelector: (SEL)itemAction +{ + NSMethodSignature* sig = [super methodSignatureForSelector: itemAction]; + + if( sig ) + return sig; + + return [target methodSignatureForSelector: itemAction]; +} + +-(void) forwardInvocation: (NSInvocation*)invocation +{ + SEL itemAction = [invocation selector]; + + if( [target respondsToSelector: itemAction] ) + { + [invocation retainArguments]; + [target retain]; + [invocation performSelectorOnMainThread: @selector(invokeWithTarget:) withObject: target waitUntilDone: YES]; + [target release]; + } + else + [self doesNotRecognizeSelector: itemAction]; +} + + +// ----------------------------------------------------------------------------- +// Safety net: +// ----------------------------------------------------------------------------- + +-(id) mainThreadProxy // Just in case someone accidentally sends this message to a main thread proxy. +{ + return self; +} + +-(id) copyMainThreadProxy // Just in case someone accidentally sends this message to a main thread proxy. +{ + return [self retain]; +} + +@end + + +// ----------------------------------------------------------------------------- +// Shorthand notation for getting a main thread proxy: +// ----------------------------------------------------------------------------- + +@implementation NSObject (UKMainThreadProxy) + +-(id) mainThreadProxy +{ + return [[[UKMainThreadProxy alloc] initWithTarget: self] autorelease]; +} + +-(id) copyMainThreadProxy +{ + return [[UKMainThreadProxy alloc] initWithTarget: self]; +} + +@end + diff --git a/Icons/add_blue.png b/Icons/add_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..61847fd66761a8099fadb21fc97a8d23cf1e92bb GIT binary patch literal 4838 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

17iP)g$qgNcs@H4@*9%cF@gCMLcZ z9?%$fA4rT5!V3ZqR=|otNK4DoZI-UHb(a2q=luT+Q>Z~N-2U_5x%VvJ`Odj#lp{xu z5D!IBXnua4W@ct+X=#b#@i@)R&C&GqH2Hi!T3ucB=!RaWkWy`uSw<##tb-KA+5*<* zGU?1zQBhHp&)3%0QgwATx!rC#ziHDZ^85W{nx-7n>0btKfH4XVZ^ofV8X6h~nwy#* zsH(22FD)&tEOr+g*hR5;JiWNM7z)k>Z;y?SjZRKZo`UgbaP*d$)3U+XQ1RN@8c%;q zOUo0D4Gk~v-o3kT`}Xa=+S)pDyWHe*ImvK1WN$i^G7`yTEfA`mnx5*tdgaOs=g*%% zH!(T+1rYoNa_0Z5VpY?$hSt{B*B|WZdFhcrz~8X7fdFCNs4QkCk;sS0=`0dRD=I3e zy{+BX)z$sPnKNg4NB$W3a&~t16KtF0qlHSe{{H^F09dVNv)Qit`ug|x@7w>%zJ2>$ z_$=RLZH1<}CV}NO{0GoPG^L}&QtH{>7hs@LN{*Q*kl;S8-0C!!+QgJ$>A`dG%Etv4aJ@q-+uQk9Y20N z|JBgbLv--qL0fs2oCr?kI|NaKJ%*kBWU~tssa(xb+DLopEQYw|| zfU-k<{r#o>GC#oxz^U4NxL5Phqels8L!F(S)Y#Z4#NvIGRh6XT9Kf`AV5enCiH|_m zQXqQ>y3Ru9MI8)Q7Zw%hR&ia1t@~+tD9fm=x=@dogBND#)&GpViA~C=^RWPs>BxvJYRR!J+*jg~Tl(KuB zJ39;3poE^-0U2|Ll|LTuLguXNH0e@3~SPHxDF8eim{lL^kJw> ziIr(bPMB&-4S~75%m#e@&DS(KI!fc?;}YMepL~iA95{gVNzzJmMe^BUmsXa+yuiDU zbuzgs@S?h$E{Y{$VmwOf&EG#aF1MD?~ zTZ9u~Ch{6J-Y~c%S0EI+BWKZiZ%N+eBFLmbk~IDF!;ds|`!<1v#HF^oYZt0hBk{I) zEH3b>sxI-(Kq2yn{u_C73x;#A_;8HR&&LxU%}Jq;m}d`2o2PTtQf$4J20h>lDBCSsOcUS4tg zP+|B=5OS<6izh-38!?U_TaJswg0rB2OK3ROc8EA+LQdOr!_ehUfZ<7WBscZ4va&1i zdVX?p!p{(90c$K469t@m9CE(!SQuYjksymtGl3PyEW{eMNXHLl+3eE z6?p#z=q`?pjf+B#C&S5}>Y6SGG=WeD{0ULaIn3|6uHAXs#^{@G*1J()kTo4nCtbgO zosnADv17-ttW!q~H8FqQwQJY&BO@dG*c)zP_*%TDPl6CO3~&h&3f+G&5@E#lFVy(n zhaUPJF#pWCpfY38x=z88&u~NCK7IPMu+NExj@g}`5YXJxlK0pUXzzS)!L7?a&3?Mz zDa&G+n<2ZSqvJEyB^_+SZrZTXiN&|jQM_H`be23mI7ob3ZRGj=hbd{r*>U2;34SgQ z4Gnz=WIsYxOA6s~ilx0&RsYJ$%DX2|o_rN4=0@*Dm6erHo|Oy4yq`Y10c6iZp%6h1 z%Zx+L=U%V({lZpvonnRnZ1%&;H*wj&HZ?U>+TGnv=&9{4ivt4#pMo17BU|PR_uZqI$y3CPGtK9(UcLG@n)3(vQot_>%tk6JE0qFLIJkYn zuLKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C2n|U@K~#9!l$Tp<9Y-0*f8WgP?B$&J_>$n*j^j9SY$s_$ z8~2(^1x_i2r?v{J6yOcsP-&$K3H1TN1C@9|NJuRz;sr!OR6^=QRN4{(ZK!CJHndHf zk~Gf6cH$;>d^tYn>^ZwTJnV6DVp0JkecG9w%m4dk{@;Ig<>{xN20%oZo15d(rAsU< zEKsRbn3t!U5g02eBPE*8r0IL;-~BpyB{h92tTGW1w>s zzqr1$drj{XQSnIc^3wdX&bbq<;3ms5L4am~N>X&?{|qqhG7$9F?N2PjPS`^=Q-MS=x9c3`1Ke6j0@InR>mx zJyrg}aA0q{Eq0()iZNh}pqt=E3&yN6t$5=P&+?}ip28TeJ0(r0j1fGOk_8=HjP7l( zX7*sCUf*6Wmr+`4wX|?;JS+B(McrF5Dn%KEHVR`vH_fz~2U$|#&@Z0k)AJuNG&bIJ z1dIl)K^uiOLTDA!i*+VtGc)v!EicWFYps>iBK?(WJRYpy9(X~B(qOcpH7K1skVmc1 zIya*gGv_~GdErxfw%pFn2OhzA3hN1;5j>+X8bV*FBpGLC8(;&jg(JaYr8cfb`VC~m zRf3Ud-2mECxHM;pTxV)4YxAlAn{U65EjxeLB$goJ5Rp8oGKbZQNH4H0g1NC(|WD3)>tH`KB+=*&24jN$-P~S6XvUq zYgNYwe|?!xj=V_b9G^^GW_@?=6iR^s>j_G=XiAI9W;X9Lp0&mgqMG5Vb6G6L2+rl+ zX(dz>$CKYZar_n~R7G`6|@hb^aRY$B8nbjCixa-?LrqI=mR)X<_^2FO*IQ%PotMLQD z_XXcq*#9ttl?o*Y0gO`fFxzWrEVuz|w&+;B$iuYZ=PyOR*Q}zsn>`W z&N8}t^n~?;_f4TtSlYJzwpago^3?w6iH|y#H|-*l#!WfA`UbusEUuX-Ih!0HZnfw* z#CW8W?=!rHYa`okdo_%rCFA?P^L_u&J-a@C;HAGEf5?4qfS|n#m!|yJ;%-IXn=rw6 zH0H0;cHtd%KQMNzy`$q0;FNQYIF6@Ax9xcD{-M6f^u%G5i?N}_v(hw`n>2Ev zAOGU`&y_Jht=H>wA}xen4Xl*H_kADd4xIk@)c4*z{?5*`)r`i5P5Awr@Y^~t#Udui z=Oi^q%4OokYs44N;Z2@nbEw!mw(GsEBcne-!BoR9Gp0P z=FtyN|Lcy)g=OYbM>&I9GvYvmqJnlUY$z4jzIFJ-;MSo(8sq&oP17?LWLRAD7Vsu;IsXmH*Si()zXt$9 W@myuXt8p>_0000z^Q>-8KIssI20AY({UO#lFGcmM!%YXAWDEC2w49RL7p zoB#mgssI2n#Q*>n^txT8uoIgg5JCb$5RoE932z|?3Bf~Tx3@3|F+;uamZ zESP*8S032Ezi3^))mr;i?`4xmt+Lj31EQ2n;{8d%9SOtmB@g?yZQEY^RKfP|-@h!+ zTHngOdfZEKEkPNAGEM?Kx^3hw;xou<_-qErlM`CmKbDH|?>BGRa^e#Q+rMw`<4G&u zMbxuYic4rok)#FnmZg#-j29wnf(5E-EqD!Mxiy`3Sks^g|l zqVws0m>~G>jvYJCer&M8!GSfkTKzeR`#sm=eHDXA&XP@?Jlx$?`R3-$Ti&~Au;a&%^^A{Cyh_}^B`dAq%vh7*shnC1 zvfSYS?*KfAU z-u)L_y6qubzJrq&6V6Xr8mS}qZ6H6lLL!LL9C_(}Qul*isXc;K;26(7=-+c`JcWTb9Myu&F_8pMDypaLkA zOB{XsZ#=*2QJ#D1VTSholR`O01?}q+v~AIldCzFWa%Mcicdo#Nl`q$-Gf&)5f*l+j z?5j4KzX%ttWUOwvSa&oXcu|N^pcTrr4{a1dq?sBS`tbh7)CGc2qi3&cbIBg9$PmU7 z$7n4l>|IUL%AY!T@W868In32RG?U~zChl3BnKBnA5)$V@2}-UM_uQ~~llvZgoYB*V z2nsP953eQd*L>nx6+=njb8; z59qjCQV&fFUV#LH_VY0b&N~ji`U3UIQPNgIQk`bUgOAbEzXEG73$)q$wFVJk|3H&t zCo+~V(oEMqw{=!%wT8dGFqpNQqf&*MgIolqL0^_YuZS9@a1M^W`x@{3^;yzJd!Jsn z^NaMaUQH{pm)U|bLapZ5JJ96RnT$X~l6qzmOIC?-PS!0Ll^(f+z>xd4;Kc~a2zs7F zlt%}O$9DaiAN}bqN}b*9e;OK00AVOZ1x2BtunrC#O?mmXIwwx0XlZ*ov(QW(mVn&4 z-UXx5THB+H!Q~#M+x3E|Yh;B|pp<|ImscdAjkmMSP)FSKk4&qYgiPt2qGRW zFwyV~oXr`XZVNhy72)hdMQLoNK6H6lQbZjJ+giA4mszl4B$Ue7H@7@l$L8@6QDQ|#2&K13;0rVwe9nt~9-vs=)0z_fynqN1}yW3mR~?a_r@ zsnm;UZTiQtKy2W2%`-6RQH6!wB1)n3r4=&;MOYGYb$zf~iZk}wEfUJ$HU zEbVK}R8Ol`a(ieBoNH#7k|F@y0$Y*}0=zefZj*-_$yz!n*)7LE&2L}e0k4;S<@awkqob*MGRC8u5?V6q| zcL5z~-h1{LhF*TY9kxp0(iXj&?&EVm`4xg^ZvHtXXo0eVbsd^JO@FWAz*qC`Gyl|E^-NN#cq8zndszO1B?XwC6WjrFYb&>ag zM=Af|^*LJ;32`JWD=F4?DGC?Q6I3VO=K=nsU|F~p;z_@VdDE?(60g}c{pIC;~rZ*RZ(=K5Bazo1v% zxjtLAl;IREq%h^6<=eXRSHa2Uxk?}us3_tLJNK<(<@u5u+(gWKj3l0?q+N0wsYS1HBP+G*kSkA!K~?_0G=DZ+}#~ z;D%ZR`}XeDt!DFy)bpfT(qECjWweSRbq@^-Eq5tu)htwO+F(&LgOT&N3+HOa*`Gzl z;xD&v-`@H}n=1SEzPqNGG{2WC{U~vHh3e{oxQq`X{A{Kd?~p8odJQ)Ps7|tHmqFxE2=-=D6Z=d*| i^vC|+QM?t$e+B@&hu~x~p-T?{0000KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C2m?t(K~#9!lviDBT*Vds&Y8J$|Lm-HaqPt2;7x2cu}vU9 zK(TSvWMu`O3Z(=jR30kzF;Yc|+9%ZV2rpHoO7PIPRuz>1bx|oSE#Jh^V`}d(ZCOyC2Era)p8Zf&03;yRsb}9Xox`w*Z4`tro4W zt}cDG_|=W+&!#_^ot>RnSXj73L|>Y9l-so10&A_Iwa(mg&pnUr&E=jua^%R!;NW1Y zr>7U5>%ny$SV{o^qA;}TjYdzcR_mFYpL^)~wQDCQCnw*XnVtP(u~wJ!dzz$}Ew z<@5QUKXCNuPaYW?%jEiUux)!os90+>>-7y6IgSm_^U&GZi39r&qz)ZA{Me;Smma$O zpUZ!`dGqG)0L%i=TS3I==;+1)wOWniI6jokW?y>r#G^kwapF-oo6UlV5Vru0(EtcU z1R}tIU<_bl4Gjaq0$p8Q*tc(=>v{h7s?|zw9LLkPZ7+JBw_$qm@WT(UkEzjU>~Cvp z`_1_H_>YhM;23<*M>B4=1WSY?5QtkneT|Y}gVq|Z=b^8!54N&~78e(H8e`sf9B0`W z17i%tsZ*z*l)~!jYEK-;zZxAKeeU?N(iy~Y3}OZ`60Pn)%#4>`c^NO9egVV` zw7we$VK`K&RKP+AURhZwWV6|$`TTywS|^(bAQB*A@NKA8 ztK<1!JddfVDHI9?Fab=Iqy;7WK?F-mtQ3pLWHQKPGDl0LQb7p8OhkKvFf0rX4LPps zf?5Y8fYcg)lRlc7!qQhuIC$_N9{=Iv02l-Y5x004%CZndA(o5Fux%UJJz1w-uNR1D zkJMV{9oycY>&tHU8x=IfYIQ@M%zHXO@L%#0F&f1Q36`2Rk3(;5%qccf4`t42&_D{%jik{R1EdU;qsRW(g_fhJ})+F6k_3B|)c@lAh-^ zmT%oMVHlDihBgKu13`pl9HUfPLl}mLb&S8BIfL`(&u^Gc2niv?hQkR4Bmhuioo!)2 zgjmNgMjOX*8tnW2a@1_rtF;PPFqjEK3N(Tcw{9(?Ua!FzljJ4~y!hga=<4bMGeb&= zEAL;yUtWJ5mXxrh1u3m$Y+2h#DTOGC0HE%9-ZFP|bbO(;Zmg}9A%y@lBWMIDm)8IS zlv0qEfV2dje&%WP_xI!E$&(-=oIQIMpMLr&jvX&RSPGU*%q*n^%aV|m)tXD#wnDvL z2QxQPsni!Tolal#eZM$6JCnKl?z<6(A*$6XhzLqqAOmRV#NVwv-OS-uw1Z$MF|~nd z@tSR^C#1y9g$3-`v7?wyr>{xJaX#F)Z{L-VKmK^&=+Ord$1#{W@f|jO$6pJS%^GR5 z+sr!J#>hkn!Vq8HxPgNQ4_f2Y&wa{vq*V-N(v-0<-5tJ!S!#>I;l5k(Ok z*MX2?lZ1fSs;Ll=Th^r%kgfDuPczqX5JeF#Uc87s+3by>p`llUAeb}8fP)}_F$PMh z^Myj;H6g^>#9MD63_>`zv)#m^B|u9EvA!mfvDh#%!*LvhQG~bNej7rFwL+orno{a~ zOHok0RV@MlGiS=>@~+Z3%-Dp*}z#mvkMW@l%?%s6u7$Oi`w9C(F@-Uxyq&|2d=ft6CwT0;mi5Jl0m z)6>&G`s9;O4ppmF-081m{n^Xs^H&B22F_ZR_2)Q_rz^Q>-8KIssI20AY({UO#lFGcmM!%YXAWDEC2w49RL7p zoB#mgssI2n#Q*>n^txT8_9U^#$&Brp>7M?pDh}hGwUe2N9kM6~N_wZRs{ZPI-+T4y5h*2}#zFCv zj;9uw`Z$Zm$H$43a$gvRpOaD^2JlHrX&M0GoUZ`5%Q?TM>-u|)vE0zmP_W&9knLz} zVq&7h^Sp0JDZj1j`lk)UV3uV;(=-rTcfJ$?K@gx)slc{v;dx$82=RudX>T4re0cGR z0~;F~`zq(*uae1*eVNQoB&-A|p%79)Z~?Kt4+kz0X0U(7Q)1fK~ z^7%Y&-?{TaOxI70jEvmac2v&J&c=P;f3vf*^M$>8`w()0n(Kmd2`TZBfq+nogk`}@ zSaq!t0-$bE0zydCYA#&QM^A4rda~K)T-SYjYHDidwtF0a*?1AgK2*Y|{ zNl1VIgc1;1_XcAs-g)P3jE?>ln#MpWZG0z`)G-3!VF1T=(A}LycX#)Jm6g&PGcz;F zmVu3rkAH6%501r8Y5C9<{O-xl4%+1X<)-NqCK~>eJ zb0ggeArOWE_V)F`_x)c^Oib)~WP+{LYA>ZyslBPxC*U{^q!bYoO^59`c=grSFf}!W zcs!01Cyv8*?6zwF2`&UEAutRhVcYhP0KDEZDs#D$-SUI*}4k znF?Lk0RV2z1?L>34KhLq6h*V4VDoUkNA(>3}4-O8Nn^Nif{ytsTKb1@-5riQK zp>2$S5Q>DAK-@5(Pzr@oP-R{CE!I&=p=laE{BRoid>#P680+*r?=vl_48!n?sZ>g# zlmZ(vdDBx<0>LHT`tw^T7VpDxY?R9tyzmY=nQmG&a0&vdjcjbE2J{XxB4oO-9BZREfL!CV2Awmd>#Uk?g zJc`94f*^np0*ay_48wX72H?6beBTElk)ikX^SKG3NkWF)?l*M*bPL|8%ZJDNt<>h6RN~NhxCiAl`zr_3d`@U78e&A(Yf&&*{XeXp)(YVMdWh1VltV0d1z>8{IMUrV`F2zj^q43olbwYudfeL z^$}_AQS?R$m~)O>w{Br+X=zf|^>2-gj9mS%TLfccW4hxwKUP)sC%bp=j_=yFYmSp!nLg2ytIZ yc}q(94_(*K4-XG7e5`G#|K%Y6@4;?!{AU1-fuNf=u9SiR0000z^Q>-8KIssI20AY({UO#lFGcmM!%YXAWDEC2w49RL7p zoB#mgssI2n#Q*>n^txT8AuM*=O8nMw-5;%9-8uA{gYDk^?3F=izG>{5HW8~QP-%Rv zC~!^WS!CSZqqd(%@>xjRA`yHcfF zD3c;r5e$t?a^zq)gU1dMX{cMgipJJXEGLEuOSrZm=}6|K9qLjRaq>jd{ira1Uo4*Z zcxPwl#J>#Iclhwa$=u}K#>;LrsYQ(DVXP?G`NaJ^e%H4dInhfPhG?xZ#?aWdp7TC* zGtDdBLQu|QTNa*Yk+K6CGY<7>g)9u93omph;_*w@tX(_sPlFvjdNe&gKK`hQE$E6; ziy0jA8Lc?{@!mUl_|7lR02yd%TT4(aar)>!0Ni+*OTYLl&e?P^)8pezoIFg^k`*L8 zNkfgr;`ttSX#g`lxHp^4UeMm&K0ar#{{DV3HadD&D~D|9{cH67=NLUL~R4>-}xyHJ$*0p8d|yH>%T$!B|IA% zGm51P;#kwi5yjIF)i0>u+S=L{y_`Y*J=#Kk`pQ6fm#fSoPUR|$lnhf-Q#^9#jf6o! zrg0e`+axTy)Jg>K8A6$+s-qrM_hu zf)J$yN(qD%lq17LDPSUqQKhREb&wdA86VqK zIG*BQUzMJtRSLdgs%!{lf-nd#dPy4m?M)czF58LWYY2ou*^Q zX;>^Amp~hk0wERELXP~z7y#+IEJA`(GZeP#aD3k`c5J`yMZ_61#vm;Vr7Qx!f)E0P zpim4^*|*UC&YMB|1R<3Dh!78LM0Qp%V@OHcMn@o}!4eW3`hV_prNE5~ zg3<&ho_}u69ZK3Hu;Lab2#^j$(qNQ@2}NvHFlN?6N)Sq*q(I8Qo(#65ux*&A7$)-( zrE0`rWf86K`pTJ5zM2_hNHnyg;t^SdoypM5X+uPYAp;-%thHY z0K;P?p6)RWo}38-LK224YTGw3M>5<@J$3?wkvNXPO(>KK5SYrWU_x+G2mTwJ7$_kK zFnEb1iJDpplVkMuj}dhWR6=3_RxHWzvrqBdcelUl(TIRA}7!1j?mSV@j zvIQwmQj?O{eg#X41G9ojr5+1P`5WUB5*D1A*7O!F(#twI-TgQdea|9gh#gm83<#fW z$7(LT{YmE32OChXi%?ZuTTq*jWa0uHJYqF1LEN$BBwYy3o8~ z3%xsTW%6)0#nV01wyhwlR#BeA@b2CG@um;ISkwM-@-KYz#ccZ8?Zm=>1vQF<@KKfg zNjnky!>nK(9UYZtckaBeG#2YlL{okA*RY+Lm^b zwq}v1$PgeWhYRsk^80h@V7s4t?(=y&c3arCf}Vomq!GN(+sBSe))176oO9X7xbXHL z6BJ*pZ!u6Fl*cvwk3Y=WTQ5P#8723(A(nunp;2p=rzOtO9unoLo7Q!0*#2?`wQbug zo4Zn})LqGqZxK?pr0Uc7fx%l;MT9L3Z7G z6Q_4R!;*`(B9(&)3??!NZSb_AK|y;)5+4~t4iE0CsjdBFHk%FSEJhCZ^eh}1AAiy` zx3-m=8aQ5p(^a2)uK6fE58O=@MKpD7;;clAj9{C-UeTM*8ciorRyzN^UZG$!_ z0dWBhwxBfuiIEY^@xv$P*VUc3eEIU@|FnF2{=k8b-1PK)G%sljnwl6ga3WXYfiGRp z-e3QcAPCM#H)9OS^;q}W8`%7{Z=kCnjlmI+7SQMjnp|*)hKP>!op5dY(hVCo?*5kr z?}7dMn{&C`&#B9vD_UA9#vR5YIPj-u=)QXgrw;BXFq-<6YglpBM`&8R5>p0CLqbBW z1z8u;)d16f95FV$%k$i;)~)Y4@^6m__H=iSNC3kebqMPRxNRRh8U zqk$^83gQY90z5x}p;JV|r;Cn`Zi&Scx2*15U3yK2D!ZO}W_cI{*G9IzRirb`BvTMi zVq6a+XO1ZmY4FR4atVrg%+%y5D~cYpZ0q**T^siON5@cmy1O%h@4r2aqPJ`4FjCeE zsp0@eM`fY)goHmUDIZgg{rh$6){pST diff --git a/Icons/loop_blue_2.png b/Icons/loop_blue_2.png deleted file mode 100644 index 51f3067b5d9debb6ab0fc5b8c0a765f14b38c676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2710 zcmV;H3TgF;P)z^Q>-8KIssI20AY({UO#lFGcmM!%YXAWDEC2w49RL7p zoB#mgssI2n#Q*>n^txT86WHV>a+z6v?!XoDbf}JiZ%}FCUM=M?T0$3l~!4t zwuTJHaa;qkR??IxnIc7sl*CQs<6G`N{XkibTF{W32JnXtaK6l)JM)_}XAb^zgteBp zW0Sm1+uIgQzm=a(o;sn^IJrB`viD_Kw#Qo0lUYgt0$UMelR}82TI=VfR4?z?xih-e zHN>sN*r`(|yP`1sbdvFqRr&406i9`Ol?H^yS|CdhHbP_pHm)L)+K?nYq_z3_yY}pv z{67af`s$HijuQLFIL+N6*GVXS8j+wLW(09YoMvD_D~W3)IY;6<7GrDJ`eg{_FS|y3 zQ5*N`J9qBPermASUVE*zUaLNtsQkxNaXodLXMQU3@`&xRhOa}mp7Mx20?%QJfH1-|*{gCuc4=ceua!soxjx~+GE zkj#t^@x8}?hq04C#PRZ!H}7C#@MS*wyHD`$eZNjvuc9R69l@qHmrg$-m^{AF)>_&< zuyxzmn|iEXtA0l0TFS95Fk6j@Qa}i_qeznm&pq{rBym7%S1$+t>=|x<_gVkJViv+24cXROtuFuOn;zxx@URKv>|v*+ zi^VWyIk6@FRc1r@s6Qu3x-9XM0Z{rS^6ZDM|~p5hx=#aW>-obVxPJ6N$pc zFbwvt3YNt2{mLs6SqL+*a%FeMGt?I6xG?kz0J}eYfPBeC$_%B&iYZGP1-$D+`}wuU zze8)+CIHHPci`p?N`d1Fj4K%$i8wnJu^d>I>Xt+n2*dFGtAeFjwnv&Ak%btEP!g#m zPR?*;e3+$~DU^2Tf6sknsYPnJVn(8jL}@|T2-*5`d->dx|4#RoopkjLU>xv#MVJWw z^H{*}>k&!{g4nWLPl@nIQoCbSb&*+mgyRxtfC2%?42%o20!C*3t!vQA;N(h9oC;@XdSV&7NDW$%IFcJA?jkOul zK%u=vbKh>TKXH<)HEU^p$95dw;z>!qsL>)s3Om0lm{#&t8#X@RD9{qLg^QJp;YF|= zy#O?3$05Cn)6zkf#6V2z=6>#b{KcPG9HiqQl_HB1vNT!g{BH-KL`*R!DHSEA5ul|Q zTs2)dj&nG!FXIaEHOx0G!;2YcOMCxTlyM0w^HisX@JbHGm)A_;`0~1WB||WKj=90Z zq~Q#X&kf%lU*P2>Ek#9hPN3o{j^q5ts$j0`y__|w=R~89XB1N*n4H9MVp?zCOiSN( z0485Nh$(>1NlZ>+asusv_CUGdwQ9~D{0fI3xt|w*?;(`Q(7r@_U_5Ygf38V=>ppxSpUbFX$>s)Z!G5$o^&99d}gUR9$#p?ul@5Zq~#B z8=DQyzQoN*gn)rh{1Q&FL|D1XslWYG+#(oXqdkfCB*xcxEs_&Y{1LS)7cqW;ZJ+ur zqypovjB#_4k}p|T(zFmE7iTJ7&j0HF?-n==y>Bq>(nKK=;b8|1)o=yG1+AhXwFdbV$N3cAVsxy%^|qhCy?@K(EkEDRoIbr}c7Fb#=-x1p zba!(phUpNh1{!h7(I@|g;ivzR%Eb#=r>|1 z_fahMib4_V`QYWS*Tk7f69@xDqlT?jp|Uh4llYKvoUiS<>#mWXNww#?2Tz{JhmBxw zlEn9Ah&!zi?FgA$xd~ZASUV>LgIejsO6%u$?cTloGc7~?e?{@_4EA3G0ArPM8Dwwa Q{r~^~07*qoM6N<$g6>fzuK)l5 diff --git a/Icons/loop_gray.png b/Icons/loop_gray.png deleted file mode 100644 index afe05ac7e8044de4ddeff3aca9e5763fd85195d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2113 zcmV-H2)_4;P)z^Q>-8KIssI20AY({UO#lFGcmM!%YXAWDEC2w49RL7p zoB#mgssI2n#Q*>n^txT8B!gjanA2M=X;$)IOlj1MZg;>Z!DPf zDjy9F4vLi07^U?4jIn)$kS5OgM$S1QgcJZwaL(_Eg7BpviZ^1hn7!UH$a-vSU|>ME zZTl2}4;4lEj%k{Ls;ZD>8KNixgn&{C$97OImypZlP%f9p0Q^-^luNN#Ed7mx_4oI` zZ`<~7g27;@H-7-is`fwAR&2q6#z0iqy)GKNyAi23<>q|@mPA>_BZuK(fS z!Gr9z!G?y00+mYTkAA=ZgKgWIU~Vu$T^F|FfKmqUd(M}y3Go0$L4c&lP$U_}ViC#Y zL*#O~{{#YolhJ52^~zua0|T4OZa*7ehlsrxisxzGKIB zRICaFkw6jUHO&&|9F}E46am|+py%_?kj`0AO1d?%yAW<2Y-Al4Th?cQ!*H%l1{hPly1r;v|ewIF60x z=4K2I4t_i|H1t_C8vSZjuv{*8def#&+f8!=EUSWiK9A1M4opu^Ll6XSpcjejx@c@{ zL~m~|48wTN8ORE3)lNC*&@?SjDwRF~@KH@08yOjq9LG7ndGlsa>UtVmmIcNbT-Sx; zIB;F}g$)2GrJmtezkkvhs$R-D$Nl^FA;@pv4M9z6m8D2fs)m&@$>2a;YmFtX?du=zCMhPk3$qiFveipHVnf6=e%V#<8M+F#j^)V zl90({aP;U=WHK4A^IGCK4jLL7aP{g{)YsQTk|b}|rlzKF{rYuGPEJCWW$(W0y2}Ls zu%#v#A*8OVNfnMUhGa5{#l^)n&z5CbD3wZ>nVIpNA(>2~si_I7sy@!8%Rtp%qb3;V zoV;#+NbFWsJcv z44glI9@Ep)n46nhHDr*LLNSxccpz0JBuRP>OqON%e7Dzcs;RS^lz6D8vhe!d}1MkGZ)y&p_9_yIFa^ySp2+v$Nj)OP4MI z04`p)A~yiULY0y1Kg1-`@`a@cDeWa^(uz+S*{-HZ)CxEXx=j9ku*^ z|99Kk+6GpwU=JKPFrz5S?_92CyK=)D5dL~wQ9ZJ)zyV- z*RElBco^Yu7_RF=*L9>)DLi=aU^o;CweQ`#H@oJ|NIV`7r_$;F63G?&wh{xlz!C>%*`}gm^v+nKN$jHd9OeXWsNF=f+5{Y=R zYCUjIrW-;CW@cuPNF*|R;u^X?v;qB||3s)+YKX2Hu;YYi7?}p#+_p-ujGgyVG zf;o4-2_m?h^pNXlQ5%hQnd6N_d%AmW8>wIZRDW zRUF6p)G&5zrTNLsZ{zofS;MBxh)tBLf3Wpd_J#Mqm;t3ER@S-EG{l$ zX=!PmQu=pM6n}U4@ZrR_a@tds-rin=Qu+hNSUVwPKOtl*0G$v*IOiqK`5a^HD@l@W r$g=$JSS&XGtsX=D|3vXk2K(OtI`Z2AgyB_l00000NkvXXu0mjfTA|n1 diff --git a/Icons/minus_blue.png b/Icons/minus_blue.png deleted file mode 100644 index 1acbf334a456147d67a5e0a6c8ed97544e03e0e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1954 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 delta 2299 zcmVI=0Bf880OG0u05Qb?02cJRU8Upz00@RjL_t(|+U%HXh+Wkc$A4?@ zeIEBclT4gU%sVETm^8^GQ6m*!1s}x^5*yooXwz0G*rL#yLdBMTDy>cJL!{Eus)$f5 z!4?XpR0T^xLt-*9iDqKn&q*?Kf9G*$=H7dryC3ePnM`IhNwpN}fei=FKAYcJ|F!;S z?Jd??{ueL#6zsnR_U^9Exp5rdV6FXZlG+(s>lSMvPU5l_=@wzTW1P2Fu3B~Q69;>5 z@19H$1nZ(W{km1&TB|cToC0W%#DZ8*0%;Op!yzQ8)+DKIQ<6Ss9B=cQe>H2WA3NBt z&K-9IVf>5KDXo;uH6*$~Jyul1lpst=QVSN87CfWyU4?H_Ogcn5au&kA-JW9}zv0H4 zUj10WcJ12bMN#mRMEpl}ewME5Ci;gH%EJ*uwUl~jiBd>M!9>6)@EsxVE1C-~Qwka{ z86>G3#iZ3|{cQHT9VyCGU%ZrFw*^IOH0e=e-|xURGa8kH5u{1 z;J{NV*LuG#&f!G4&hh@3!FobuQ!F3~L|+(c+`ZDERU>kVwG4-rvMbcePBGUj=0$Ep>-Rv;8#U|m9kP9T(7fJ7Q|kWvqKTp*pevVyiDfOp|zkjmo-pOODyGD zL?y{nS1q$@)#`>1jab*deP*CCywz)4vbrbEaHKb2D6qt%fAVSLkS6iOVLSh&+5nIw zF_Q&SE6BTwa0uoVBc_D!eNZZ9moHzwBA75@aU8efcpcWyQwd^11knnu71{{H<&(I+ zi+}&*hhX!1~=ngB&lEU*}v^Ip84i&y!*yx z+^k2YkVQFy7|gV<6pX6r`uIBYW zJcZbZT$7J+8wGOy+V|GqdHNf7@WRIR?A^YXH@7)_a9B{PVKh-}snt_bToOy$q+m&! z=EZTae_{~@N}aE!M%2b9bEWqTuWZ`LrZ3&hTYvgJHmabt8slD&rU~zC+01Vqx`iDt zJxV-s2;~`+tFVp`3nWSbs&tX9jCZ7l8A`*skxM31;5hG1J$6j_WskkG8dUV^d2K*3b@Ur;#4o zO)0caXXV3Bvgm<_aqPlOLwnBRe;wU< zZfYUB@cO08Dihkp;`a6tN#hsmz1@hbC}b7+tYCbF>uaozQW5WrsWjZmNcev2AAaJu}~A(1vtiecDU#Cx6ITTO>;_y`ba`0zEF`@y9<>I z1x8-Oth}aK#Yp*NEtAbYb6Jhzf3~e#AF1V=pN{4)rmJE(7Npe1^!D~Dp_D*I!7Nu; zQc`$F58zjNe{kd4n}2*s-!{=gg<|p9c%b}%E}y&Yx@p&t4k=DYmYThCxUo>aK$`;# z3yMs+7wJE@HQ&_q^DEkn?0f(H*}eS(|IpX9&mEdFg~P+p9XH@&doh@ue+1_Iy%xv{ zOgAt;FBAs`i1xpCd}^t5=d#Z%J9Nd{w;k_nUpZ0_Uoi_7&kI^xI8}%4$Wlomw2i#8 zDM3ZA!q)tWWiuX@AVxpU|IYOVIXZMo)FnKPe3N7GY> z{scx+2x-WhjstRmoPv^ue^wugaSF$ez_~Nq9Id~4)7rKB|KlTq&dyH1HZrm?cHGC! zwX?H!S}Qe27)}}uWiTr5`Kt2-G8zgR{MaJBXGu<;s5^1E$bgMB8BQMUM=_f*H~)t#T{ zG1NQTwoi|u@OF#bYn9BmT2D_c&S>>TB*|H2?O`pvrnG+Jh8u4>{prEo|1H?R1^_P* V+X;~Bu<`%^002ovPDHLkV1mL1V=({# diff --git a/Icons/next_gray.png b/Icons/next_gray.png index ffe3cbadde1ea3e8bac502a29bb5661eb2c5b35a..4bc36cec54a6cb1537eb03dce2e34129fee349d6 100644 GIT binary patch delta 2209 zcmXw5dsvcb7JuPGL_vk{0+b467n>A_Qp*y^GAzf)tify*5h<&&l4;Tn=lcM!S*BB? z*k!WP$;vG%OWRCQEUm1xtjsQolQvCSCT8A%rFQp^_q>1o&U2pM}mD@0EbY)@(Ani`SszjU+V?eMFk8d92EpWlm&qPV*sSP0U$jJK!*kZ783ySr*0!d z1OUz_bU8mVrBgC#v2Yd+fq(?QQKuWC}|99!F_ z^TxLiVI3^9<$<`XFCRPzkKpli%Y;H!SXAiq*y!k^>sGHmq&yJ|=2=dlPGymBhHfr} ztr#CJFmztsM)=`kjOmvzuU{Sb*i{$%*`UuNXF0n6GcU=>+D`Q0{rm5l^!h*V-M{ai z5SJ8}AlZr@@z%p3*$#pY<}3|ZMqu$ZyDrAuge3v;K7u~y(CoZ4)A;V^Ma)<~sD6g@ z20-I(4V9L9MbWwWMMeI%Zr=`hcKddr(oQzFAu0VnJzAMJey|inMOuOsZ&><*87qCQ zM5j8k4pf}*-|;$LvxEoO^^~%*GKnsrG9f-b_wvi>#io9H%hAN{nw$BPFf5^*|sxZt=)BeDQx^u`JC@|0# zV%N)d04b9q4ftNX_@AkCioOqCj*))OCs6+8mD!TKXPD4I`e zH8#+Bkq@s|nL&bDmtn<9J!ml!)|?1(vE8>6o*e!3z15CrnRlXiL#t3I>?RVYq;Dh~ zkd-h@eEHbr(kt!N@o{&8!}2#_q{oBOX!{)q1d2+nqDHnylDt22(|JFfwvUAF zde^}wS<1*HRqrqM##P!@I7P~86k`!2DU%135!XjA#@2bw^qNVp$K9(8%im5Q#fz&` z4Ab?ua^0weVF!vzrKYw&f!lQ_p}7N;lXqxdP7UMZ;{*>6j}i>lG1<>=L&|G6S63PM z|A=F2Fd}c#ztIF`w#|chHzsRKVj?>|Gjsly#I1aLXYrsJddkqP$}}|Q zkO@tB?(xD68)Sn+LlWWIwaWLluFnZpUyPtJL_7;74WhRBI3{@{30AG}{n6kUhnX0( z?gTMm?seZy)jCkYq9_y!3etvUM#pvX?LJ$%Bdj|Uo-jBvBpVzY2D#9mM^IAF<`@K^ z$BvOGX08&u6Y)(qC=ZIDig^qA%Z024;w8Fj*Ts$ zEvhc=sli^A}_*S-JX)7dNOJIRczwv`s|c6C6@8$1i2~ghOwuZatC5)`NIMrZ z0i@Lh1tfJ*mA_h515aBuee|I7GWx>TyoD^e7F9Bv|H*9kO~lKcoW#U;YYuuWm1wnE zFclMafS}um+v3fEv=y5NjYjCV@Bjy|5C;OdLWTYplYPb)y7tk;uG%yhapB_UEJPm- zCg^0uj;z$wRM8PSk*St5SeuN>t=g(AaW9NbHyQMMGdDl{-Lz}>ZWHEfRzyg#c?t`c z2k>_5#eTn5Ub}{!_&p=Tg`{nkiRBo_#9^Ab@4(cO8VgNS>WS+6vf7%@vz;1E9)!;X z;(NhiYu6S~Una-tHqUtnoL~Cycr}jSf9i`>b%~W<%>B{5--m_yLD6R}!h9PHSsRA6 z2_zG*2-6vT$lcLHv)8EhJ$**s%NtSl+u-OTk1@x{N@~YX|F+vc{!36wHxNMrPIjia zgdtWVnW{IMsQkuaMzS!qI^b{`*y7Q=DSzx6dY%=Xg0<X_ z95XhYUU~2w+QHENFaBrD(W;nef&7uVFAo$(MIB~Ky-v+_mlH=<$5WRwQcm(jXe)1 zKJ0mQqlKq0Mpm%NTAl>s8nRzk`vMmKZF1^=Y=Rbl@YK>w=Sxc~T|^ThC3!6wq z2CIgG?M#<;G**HyIf>N~+rVXhf;X24V|r%u(v25SA;LWuuQD_52{qk761SM delta 2028 zcmVI=0Bf880OG0u05Qb?02cJRU8Upz00((VL_t(|+U%HJY!lfP$N%?Z zK0Fh9Z~{pK0Rw_94KyIUA;Do0;vrR`sHs#nO(R876~Xe-hnB6>2U=QqY^9<~75l(G zZJ*mGqEf+9RS``>Lja3HoDgC}e+X8-96PqhGjnerVuxgjqX5|oRlU}Iu;$F2-<)&i zod3N=INnO{Qlu{<7l(!jU|2%Z)(8yN~ z_Ta$-#kTDeLWnb(rbTpJxBPxTG))5`1QGzGL_VKKDwRSelgZ?Axqo?{e|J^a^}mF} z;pDo5-MMq8(RJP5T9(yRSy>6c-w#R|gb?sNf#N!Z5HLm;K&3!Bokk*&!1VO=Lm|W` zM~)o1wk}}z@874{Z1$I$ru|~;)~%{#S@1jo$H~JJ3qZv+mckK2KnaDaD&Sl}DxE@n zYz%XAbDtW9?`Prghx2a@e-@2Ked%=ivxig-MZ@$vD$8-~$#@ZiB0ZwxjxG{k3TXFso~sA%1>V+ZWK11Il5e922|3JW2i zlz?*uhT%gzK89z{p7oTMm!GJut({xx9$IR#WHR}iU@+LaW9LrTfB8Hd$AN@^gaimc zC|UCa0VE_`&qXGa!M1H7)YQ~8&CJaFvDEWvi4Zm@it_XA+qWZc+i+bMQh1P3f)Kpb zT*yHIPk6{?GuXCm8~lEMdw+j_+nPf8=+PrzGMW6x?%lh?mSrKE%`Sv*9g8O=6uPd# z&gXG&aPXyNS^M|xf7|zRRgcZj&wn=%2!w;dAZ**l0ykOL9{{+n2TCan!>F2{pFgu| zC?7t2NL<%FQ(avR&+`fiUI-rmRaHSLEhO|x;gaB-Ls5818-iE1qfbWR^ZDR;-jAcv zsIMfL<2c)OU5^9;0XVL=;3+~ECZ!l1eFDlT%F0X-N?%8Jm zf6az63RTrGG!#QTJ_Z2boQG`Nt}h9e&1OF`O;e?m0!xY|r38lQ!?|4#wEh z7cN_R4`2F6N=e?PF2!OoT)1!nilSh4c6LP@Ap~yTya~&)(9zKWO6ek8!ONs17=X0r zdCS7Fe>8+bh}RxynkHIWTF}zcf=!z?p}V_#MX-j326T3IV%M%+ux%TJ5GaZQMNvR0 z1tG*P2_}Si?z-+WFvb{ixg4H6d9utKx~`+Sxf!jktq6reux%TRF{rA#45+TI4sC61 zXl!f*r4+eb4vM0H5CTQ91ucc zCBZo7U!+ng34k!hFgG`c;o)IODWR$=!r?I5+S+jJ*fEfTHY>h)(Yxj4<>>0_LVJ5V ze}cgvve_&=&x4{Uuce32=Yy{6NG6k@l>V(`6Tf@+u4>!%U|n6^H&j(cEEYp1lUWR{ zq9|aD6?&*Fsl9YvhvPVKUALqSV+?^n0H$eTWMpKTG4?@yef?BPb#eRl?VnawR{n0w zmMwVx{5c%QSuyF~X=_FZG)+S=7{tuXe+(ujCO(ZsA|J2zRl>5YKTS+bd=d->zZMJz zkxr+VH1zd>DyRxD#*j!PY`@?Chc!v--rnAJpU?OCo;`aoKR=IrKL5sYx}+8>)UQAw zfYH%WOioT-h(sd4UbE)!>FN1%C=_a`si|2vuN8C4FbqsiP9heI4Q|-5A+mSxf8Oku zZF#9hOw;Td9Uc8ZQIy)Ms;UKf{SIC$_FT?6lF1}uvDi#mS=oddXfnpYIS1z))6>(4Mx&Fuu77|3{{8=c>kV&TU*Bfiwm++^ zto+u_ojai@3Z#^aU+QXQqnJ}ge~I(-=~KLT@nVn=(h-S79=!7rL2qv_&*gGI(KPK> zH8nMX>gwu6Wv~+5(v~KrL?V$uJRbM5+3aQ0G%tk1;ncbws`T~seciV0k2Ote4Fm$! z8#iu*VHk^zxY+1j*F`p)#njXklF8(BE|=?86y^5~4Gnj`(qpLJ-rjP@LUE1~LcUE1 z*~2-n0-zS8i{p9Tq!1zo;IEX@FAg6*{NjJ+;Ev)w9q%pJe+B@DU1~V5cc9S#0000< KMNUMnLSTXi-op+6 diff --git a/Icons/pause_blue.png b/Icons/pause_blue.png index 44f14b183caaca19e5669125e307f4de31f94918..90e4a4f3e5cf2c681aa21f2be1b8af3ed50ad6e4 100644 GIT binary patch delta 2931 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 diff --git a/Icons/pause_gray.png b/Icons/pause_gray.png index 3f10c61b150485fb285ccbaa25dfc9a01f0acf75..58e2247c2dde6d4a0d397fad2b15246b7f7ac8b0 100644 GIT binary patch literal 2837 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 delta 2444 zcmV;733K+97N8R$iBL{Q4GJ0x0000DNk~Le0000m0000m2nGNE09OL}hmj#Ke{FaG z0CQ^q0QM{Z0D>I=0Bf880OG0u05Qb?02cJRU8Upz00|aJL_t(|+U#0SOkBqq|INI4 z|CTko>>3k@9x`ue`k7tx5b8s*9Kfg%AgU4_c8PR z=KJ&e<{O9*0-xnU@fjbVc>rv`7Mh%#R3%C3c3t-=$8k<^&U*+UtpFf|s0$$$8DsN| zv6Li9>0~l#?8m-jFEKDZJxv|QdB$;^mpJExl+xpjFJwzojV3^S!+%q3Igx^*T7`5JF%-h>#EhN(eMvhY%cd zAJ1WZef^)&X!O~^!NJ0wc%WLX{y~=I=O63qgQ{w%*Gvcw2o69H5YRnO2m&quvu*)` zpnu?TMBCcVl*{FJf70o6%Y6g5a^=d;J`<*%d$p&h2YM(3%QV5cx5al4W&(h1Z^Z9oi3B+3FHB5K zym(Il78Vvrxm^BjXJ@AzkH=xwO$Z@2O@8n{0D)y$XlV(ff2XGhl}hFHnVFfxO#>*G z%NHo6Lk~avFl^ffZxGUhn*xAknK*Lf2tuJyd$n49rKv2GPN!+HSe!h1^w<-}jva+z z7~ni8(+Fsq4oQ->eKAcFuIqvjK%x>fUEe0dxrch)#D=(ice{+^)eHFl|_V&ZDEW2^?JDQI&T)A=?#bRmOw}F8Hbab>s2%uCdVfup) zw#ghi6vpY(r#Brz+>u%-gy2Z0uWr^=Qk!8IF9CRMR|}+4sXxbJv2UC_nLw>pyR9s^ zGk5E{hI8l6;lmF<-1hygxBiF=7hZtpalHTjdpLjofBZI?{{DW9jg5g2x@{jtVaQ|_ zkWQy@{P=M&#$Xu6)mSWcYG7c1?-&EKv$LA#c|-Add?RQHKq(2Fgb*l-vU8ozq)jW4 z9bF6nWLW_rblbYBs$yj&kJ;H-pNk+#5WN>@=7xUTz5U=VZ82U=TOK`Gt0)8E|!8}7vz!`j*! z(&;p^*(@lfV2m|ngb;8X2a2M=w(X;V0E7_Tf2yiBeRBH&Zf$K1*=!cMTn_bmeOpZV z>u}CNDFuM=ZWhpGS>BgB^47rJ+<4olR4PcNQgB@tlv3zBaD{IrLI^0O;GE05S%BWF zTLj53FE3+eW(J<;VQy}2M;ZTAHBH+!T~kUyDfRavfdB|0w&OT=Ra}xJxUP%U)m7AL ze>-1eS65fDva$lsIZCBc;99=LgRHbQz&GXG-2i-Q+xC|NE58jBVr69oxm*s0VFUt@ zWw~*(L0sW0hr3)sWm$$S%f1DSKmd{?T{R3NfS4F6l?oOY7f~n_8a^9DQhs(3LIld( z3jj^iP^nZvDZLp8K$hiy_`Mt7O?+hve}w`T78YRJb|cufoXU=XWm&!}0N;gz0QfN? z%d)T6SReq#*p%mag<7q4xUH=Xp67v5iej;drKP3K`bXbVuPA{4BuRpzDBzqUD6=&K zK$0YcLLmqtVB5CW+S>YVAQLB($r6C{`uch!`YV+Rvf1or=Rj-tqb$olGX|cVf1)T* z6eTb~ZQF({%TQJIwsp6zuP6$_;jq8YrY&Hu;QU0DxCY@c& z>8YuyP^nbXDAdxE|=TYf5ZnlBuPRzyg|J4^Yd0D5;=Y5%$f9E`$A)5W4{FO zN+OX!wOZY{R_;PHJKoiVxG%Xo<0BG@U}6H!nW-Lw}MY@x~^kxZVoqZ-kf>pp@+^U z5{cS9ztF_v@fY*?e9!#+d~#r50J1C}s4MxG8%0sDyu6HjK3|B(gqykYb!#b zP*Z< z@NM-I=Nz8r!7vQmV!Cw;l}ZJk=PeULF6p}dtC5kB>Ho_+@fOlkIOk7TmUW(UeipzN z0JI1pl+8P=MF=qg+#rNpQ55BGnx;+c$7477{GUBO2e7yC-vI#FkZ5%D0IMkg0000< KMNUMnLSTa3)rwO9 diff --git a/Icons/play_blue.png b/Icons/play_blue.png index 931519a96fd9c48a511e492b614b1805528c5910..a37af3ec75a5fef71996cc078a7d6a632dae2a18 100644 GIT binary patch delta 3127 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 Bx8DE& delta 3036 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 diff --git a/Icons/prev_blue.png b/Icons/prev_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..582d39d60e60663fc12fdd94c42c3a67f9ec4c49 GIT binary patch literal 2388 zcmY*bc~H~W7QR^^!2}XONWx}#ajQj1prQ~V0YSl{Ac_REkU|KwQbDYWY)KSC#3+jv zQ4ml-t)c`_(Xs^svddyCC_GsdluBhufk2jDZo;kF`j`Z0Kgc3F&Ma>Pt+bFBV6~o0x9-evKo_k+08HltkU{`}lc&9t3joy?0OPq)xit#_bcdI_>%q7;p(+SsAZYxo ztSo}(aRiNkKLKdwczeWL2w9`k%-}1`@jRXD%h!nZFt{j{pXzO7WYomds0<%fS68n# zH0=8@KHkp>5BKMAxjDcQ&FLFy;Dx9(YNe(+dgNil8TsU`yLUexH#N;!vJI|{!(4&V zIurRIw0Yvh&Ye32YZ%F*U+>>n&dcTWfELnT5Knk8Y`kvD={>x1RzFxP75K% zh`kD$OCN&>Wb;dib<_vb)>D!lL{|Ap?TtSprzfAF*^g-3tbTVO(7s zsr$YU=W(qq_pP_K)ZOI(E3)x*rm()wZI>zvVVgjX5|UG74W|Q0n)(`*S~*l>u0_!B zrz{P(!NAh#Z;O9h@j;VhcwivlQd(N;)x11<`ga{2=^n#Z1Xojj6m;Az@ulj;ae>|JS|R{ob@TY5_0OQpKs5I8PvR+&lU z1Q;Cc4GvTd%RlrWNY6@lJmqYbUhmD;wej08GynGNPNWm%h)Cz7gb~Wc76vosMm2NG zw@XUiA1&%~<^%W;{O5~JJ%x-1+t;3S97L`o<^~Gt*#frdAzkVk4q#b$R)HH`@a!;M8PAbg;$;tn4Jc4^6^&i3QsrMc+ZiaCyftIZ z2og?{Jqbw{gUI`z}EtEzjF1AMtPct<3F)_^kJ{((bS*`rZ zBeM>`kb5S^8{LdH0nlz8GKKz`fc@$+ZcD-jP;#L6jTia@EY|cGp0)fQV977M@Af3+nB`e=1#elYwnWi!IE3-RVsW+|BEZiC(fZ3_>;QjmdEwO$F;C9IwyO$yV?JRdKO#->N4)Wf6cc~`Q{>0a zR_qe4OxLVSd??=zO!(jY(MtQNQiCo9O;;wyH~lx@xavuIddHow=}YQm<$`l3whkacDMA*C!=%s zh%-moS;_7!mcmGj?daC^>ujKbT6;7MrG(kHZGuAYre!w*wnE|qtus7f^gxCku_L`+_qD9EvxczN0MDf2l2HyPw+#&r4qt&Z^YWRhn#RY5 z)UWL%mDZ7_#5|K<^q)s=Z7L!84Di7WVXT~`N2ZVVp@fek@*(zD^D zN&{{Gd2{m1%>cl-A^$3Jhsce}H#IILOvuZ`G?k?vunYyin9%ROmJ*pP?$ z;ff^rJdfh|>&&ZHuc`&zx0BiR!J=b0CK#Kp02tl|wg*08s=u`N#D^CZ!Mw%nU%Y|} zvUVO42=*RH7x??82(Deo8=I*v$2N>Ke6LuTC&@BeaYT)Ck|N~59#wT#R$sKUbKM_I zIRWwR%o+zefQz!2yR*y(aTqvPzae4i^O=#lgsaPAvNUh03(;7zp$R>mM}sSmL4s!! z42jQ@PjIlNu(EPKWZk;b2arZRgcR4GEV`w0bxhmoJfmz)e!l<@#T4DtmE!wAWjIq` vJCUH9efX2Zz{%+M@$InYG!YF?mI8|vE5f$(KW)=aK)}mmpZh~M_St^`ypcZu literal 0 HcmV?d00001 diff --git a/Icons/prev_gray.png b/Icons/prev_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..aa1cac9dc1fad3849eb64b9032b0091239c14b9a GIT binary patch literal 2256 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 TkzZ~U00000NkvXXu0mjfL;W#D diff --git a/Icons/random_gray.png b/Icons/random_gray.png deleted file mode 100644 index 103ae6f952eb05eb3b96871300743ed043c76841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1954 zcmV;T2VMAyP)z^Q>-8KIssI20AY({UO#lFGcmM!%YXAWDEC2w49RL7p zoB#mgssI2n#Q*>n^txT8o;=i^XD4RTY#{0Duqzwr!(Yt-`i#w{F)TK;ZYB^V?HXQ(G?`Y<_-z#&Mim ziA3Vep+kp|NF+chgMdI7h7e(69YP2wr680b3`0~a6_iRPl*{F10Kc4`p8oiyfGsR6 z$dyXv14)wJ8yp-&Pfrhg--qY<2*LnD2t;c{zl4wmAfez2hb+r5x3;jlx(ds(K29c+ z@18z=y86Okxm+%3n&ux8iNx&i@GvN)ux$rH;J3kaT7wYMroqVEtE;P6Utj+$l}f!m zF)^{)ZExCbVr6ATGfne$PfyS6i4!Lw1W>O#2!aqokfs0>gs@%GSeilzf-r2n>$)D^ zc;f^H2Z!D?P4m;m#l^!12HV)!xRp#MXO15~4%c8HcP!*Co2e&9pw_!A-6mjD8s%ZSHgh{X)VVg__w zM;L~v*DV}9dKB?^{H=TU?)_w6K9kR0@`5L4+a5 z3j|<8*YU|Gf5Q9kf6#oU>pJe3j4^1M*0a66{SJWlx|(uvagq9daILSe z4?z&@I{pWd#(V9a(r^U=!YBlQrKKfkng-wZe~`^)(_O(F$N8G7s%MhPBz!*rA#`6t zDQlA^5ZSG3LMgZ`BbUn|pU+2T9}q%(vn!Zw+ut$_L!y*Ih!DW@ot-fXO;g)Ml2`+x zLu})+jD>{-eE#SWJkNvUI8ap;j^lj0tB(aia5kAtwwZ9Rp{gn}nG9~+xB*F$KnQ_t z+qil2CT3=4ItJZ`4j%4N56Y)5P4|T-)mSkt40ji2nClSFkV)UvHREJQpb1RFZaAPM+rh0BW_`Zd39`?j(eO zG1g330AhQE3(`qbgb*l-($u2w`zV!4FijJ=T&`2%$K2c;o;-QdF}_6~!x(G*NZJ*Q z5K<0;pv{bwQn;>*J9qA&R;yuSV*|xv5d#AQn4FwMxm@lVU^{73lBA}_WLbtR%MqBh zmnrj}=Y69UOqOL73I$xhe!UH1c6Jt*E?t76D7!Y7Wf_X1fHAg9^ASvBR#jD_=`Z)n zm7klY+0+f#W!3P1F9~6>NNb+-8h@^z`Xd z_`VO$ISj+-xOr5ScG8$6NzgQ{qmM;?Wf%sM$s{V33WN}!PE1U!?O9#uy8g#vvG}vz z-rm=HdU{}477~dBu3Wi-t*xz{^4iAK)D#FI=%ZMs&7a9+-eHXWZftA}^?Dti=YezHR>wzq zjxpAHvZ7+3sqrY2w9YZc5Rb?4`0-;@DwSVdxNza;`>J54rlvl$EbGsOLIJ5%3c9X? z5YlWs!Z2*}vFLduoO9^94oQ+4tzApQqG=k^>2%c6Wz*^O%>#Afy}i9ZE))tUIp<>o z0|W4VziUUduRd|7PLm`FrBVqiD=X{iboz&DW$*Y>+3so`0(Lf4&QCKu8Z~cb*!ze zS+;HeIu?uFI(znP<)vP#WHOln$8oMvN`GV+#$Y;~Mk0}D9{rts3(xbgy}gZcxr|z^ zR&-tWwj@cvxp?v7;#Yb(Lo obLY;P|1%eN6tC!bWx@V40P|8nAA8B1RsaA107*qoM6N<$f}?JcegFUf diff --git a/Icons/remove_blue.png b/Icons/remove_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..6c55e6d92be06eff75f3c1dcd6a327f9df7516bf GIT binary patch literal 4751 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 literal 0 HcmV?d00001 diff --git a/Icons/remove_gray.png b/Icons/remove_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..28d6394977858f16b421251c935334d126eafc30 GIT binary patch literal 4717 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 pp?Y5tJm=IiI?&G^UtGF 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 O00008x8 literal 0 HcmV?d00001 diff --git a/Icons/shuffle_off.png b/Icons/shuffle_off.png new file mode 100644 index 0000000000000000000000000000000000000000..ed69a0c38f632ab382d9d5ffb1d215c26808b37d GIT binary patch literal 4785 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 SNjB{O0000 #import "SoundFile.h" -#define _USE_WRAPPER_ +#undef _USE_WRAPPER_ @interface CoreAudioFile : SoundFile { diff --git a/Sound/SoundFile/CoreAudioFile.m b/Sound/SoundFile/CoreAudioFile.m index 5e5ce896f..553bd4778 100644 --- a/Sound/SoundFile/CoreAudioFile.m +++ b/Sound/SoundFile/CoreAudioFile.m @@ -224,7 +224,7 @@ OSStatus writeFunc(void * inRefCon, SInt64 inPosition, ByteCount requestCount, c } size = sizeof(totalFrames); -// err = ExtAudioFileGetProperty(_in, kExtAudioFileProperty_FileLengthFrames, &size, &totalFrames); + err = ExtAudioFileGetProperty(_in, kExtAudioFileProperty_FileLengthFrames, &size, &totalFrames); if(err != noErr) { err = ExtAudioFileDispose(_in); return NO; @@ -256,7 +256,7 @@ OSStatus writeFunc(void * inRefCon, SInt64 inPosition, ByteCount requestCount, c bitsPerSample = 16; } - totalSize = totalFrames * channels * (bitsPerSample / 8); + totalSize = totalFrames * channels * (bitsPerSample / 8); // Set output format AudioStreamBasicDescription result; diff --git a/Sound/SoundFile/MADFile.h b/Sound/SoundFile/MADFile.h index 8e584e478..c5256364d 100644 --- a/Sound/SoundFile/MADFile.h +++ b/Sound/SoundFile/MADFile.h @@ -28,6 +28,12 @@ FILE *_inFd; BOOL _seekSkip; + + //For gapless playback of mp3s + BOOL _gapless; + long _currentFrame; + int _startPadding; + int _endPadding; } @end diff --git a/Sound/SoundFile/MADFile.m b/Sound/SoundFile/MADFile.m index 058bc7632..b273ab029 100644 --- a/Sound/SoundFile/MADFile.m +++ b/Sound/SoundFile/MADFile.m @@ -15,6 +15,8 @@ /*XING FUN*/ #define XING_MAGIC (('X' << 24) | ('i' << 16) | ('n' << 8) | 'g') +#define INFO_MAGIC (('I' << 24) | ('n' << 16) | ('f' << 8) | 'o') +#define LAME_MAGIC (('L' << 24) | ('A' << 16) | ('M' << 8) | 'E') struct xing { @@ -25,6 +27,11 @@ struct xing long scale; /* ?? */ }; +struct lame +{ + long flags; +}; + enum { XING_FRAMES = 0x00000001L, @@ -33,29 +40,52 @@ enum XING_SCALE = 0x00000008L }; -int xing_parse(struct xing *xing, struct mad_bitptr ptr, unsigned int bitlen) +int lame_parse(struct lame *lame, struct mad_bitptr *ptr, unsigned int bitlen) +{ + unsigned long magic; + unsigned long garbage; + + magic = mad_bit_read(ptr, 32); //4 bytes + + if (magic != LAME_MAGIC) + return 0; + + mad_bit_skip(ptr, 17*8); //17 bytes skipped + garbage = mad_bit_read(ptr, 24); //3 bytes +// _startPadding = (garbage >> 12) & 0x000FFF; +// _endPadding = garbage & 0x000FFF; + + return 1; +} + +int xing_parse(struct xing *xing, struct mad_bitptr *ptr, unsigned int bitlen) { xing->flags = 0; + unsigned long magic; - if (bitlen < 64 || mad_bit_read(&ptr, 32) != XING_MAGIC) - goto fail; + if (bitlen < 64) + return 0; + + magic = mad_bit_read(ptr, 32); + if (magic != INFO_MAGIC && magic != XING_MAGIC) + return 0; - xing->flags = mad_bit_read(&ptr, 32); + xing->flags = mad_bit_read(ptr, 32); bitlen -= 64; if (xing->flags & XING_FRAMES) { if (bitlen < 32) - goto fail; + return 0; - xing->frames = mad_bit_read(&ptr, 32); + xing->frames = mad_bit_read(ptr, 32); bitlen -= 32; } if (xing->flags & XING_BYTES) { if (bitlen < 32) - goto fail; + return 0; - xing->bytes = mad_bit_read(&ptr, 32); + xing->bytes = mad_bit_read(ptr, 32); bitlen -= 32; } @@ -63,27 +93,38 @@ int xing_parse(struct xing *xing, struct mad_bitptr ptr, unsigned int bitlen) int i; if (bitlen < 800) - goto fail; + return 0; for (i = 0; i < 100; ++i) - xing->toc[i] = mad_bit_read(&ptr, 8); + xing->toc[i] = mad_bit_read(ptr, 8); bitlen -= 800; } if (xing->flags & XING_SCALE) { if (bitlen < 32) - goto fail; + return 0; - xing->scale = mad_bit_read(&ptr, 32); + xing->scale = mad_bit_read(ptr, 32); bitlen -= 32; } - return 0; + return 1; +} + +int parse_headers(struct xing *xing, struct lame *lame, struct mad_bitptr ptr, unsigned int bitlen) +{ + xing->flags = 0; + lame->flags = 0; -fail: - xing->flags = 0; - return -1; + if (xing_parse(xing, &ptr, bitlen)) + { + lame_parse(lame, &ptr, bitlen); + + return 1; + } + + return 0; } @@ -96,6 +137,7 @@ fail: struct mad_header header; struct mad_frame frame; /* to read xing data */ struct xing xing; + struct lame lame; int remainder = 0; int data_used = 0; int len = 0; @@ -175,7 +217,7 @@ fail: if (mad_frame_decode(&frame, &stream) == -1) continue; - if (xing_parse (&xing, stream.anc_ptr, stream.anc_bitlen) == 0) + if (parse_headers(&xing, &lame, stream.anc_ptr, stream.anc_bitlen)) { has_xing = YES; vbr = YES; @@ -427,7 +469,7 @@ static inline signed int scale (mad_fixed_t sample) mad_stream_buffer(&_stream, _inputBuffer, len); _stream.error = 0; - if (_seekSkip) +/* if (_seekSkip) { int skip = 2; do @@ -444,7 +486,7 @@ static inline signed int scale (mad_fixed_t sample) _seekSkip = NO; } - +*/ } if (mad_frame_decode(&_frame, &_stream) == -1) { if (!MAD_RECOVERABLE (_stream.error)) @@ -514,12 +556,14 @@ static inline signed int scale (mad_fixed_t sample) new_position = ((double) seconds / (double) total_seconds) * _fileSize; fseek(_inFd, new_position, SEEK_SET); - mad_frame_mute(&_frame); - mad_synth_mute(&_synth); + mad_stream_sync(&_stream); _stream.error = MAD_ERROR_BUFLEN; _stream.sync = 0; _outputAvailable = 0; + mad_frame_mute(&_frame); + mad_synth_mute(&_synth); + _seekSkip = YES; return seconds*1000.0;