From 4ed575f4755c32fa933d58ef9462201dbe594231 Mon Sep 17 00:00:00 2001 From: vspader Date: Wed, 14 Mar 2007 02:28:30 +0000 Subject: [PATCH] Moved PlaylistEntry number variables over to NSNumber. Removed displayIndex and lengthString, using formatters instead. Fix bug with autosaving playlist. --- Application/AppController.m | 10 +- Application/PlaybackController.h | 2 +- Application/PlaybackController.m | 7 +- AudioScrobbler/AudioScrobbler.m | 2 +- Cog.xcodeproj/project.pbxproj | 24 +++++ English.lproj/MainMenu.nib/classes.nib | 1 + English.lproj/MainMenu.nib/info.nib | 20 ++-- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 60211 -> 60278 bytes Playlist/PlaylistController.h | 2 +- Playlist/PlaylistController.m | 28 +++--- Playlist/PlaylistEntry.h | 56 +++++------ Playlist/PlaylistEntry.m | 102 ++++++++++---------- Playlist/PlaylistLoader.m | 9 +- Playlist/PlaylistView.m | 13 ++- TODO | 3 - 15 files changed, 152 insertions(+), 127 deletions(-) diff --git a/Application/AppController.m b/Application/AppController.m index f1844d071..99734569e 100644 --- a/Application/AppController.m +++ b/Application/AppController.m @@ -161,15 +161,7 @@ increase/decrease as long as the user holds the left/right, plus/minus button */ { NSURL *url = [NSURL URLWithString:[urlComboBox stringValue]]; - PlaylistEntry *pe = [[PlaylistEntry alloc] init]; - - [pe setURL:url]; - [pe setIndex:[[playlistController arrangedObjects] count]]; - [pe setTitle:[urlComboBox stringValue]]; - - [playlistController addObject:pe]; - - [pe release]; + [playlistLoader addURLs:[NSArray arrayWithObject:url] sort:NO]; [NSApp endSheet:addURLPanel]; [addURLPanel orderOut:self]; diff --git a/Application/PlaybackController.h b/Application/PlaybackController.h index d457a8243..819dce218 100644 --- a/Application/PlaybackController.h +++ b/Application/PlaybackController.h @@ -5,10 +5,10 @@ #import #import "CogAudio/AudioPlayer.h" -#import "PlaylistController.h" #import "TrackingSlider.h" #import "AudioScrobbler.h" +@class PlaylistController; @class PlaylistView; @interface PlaybackController : NSObject diff --git a/Application/PlaybackController.m b/Application/PlaybackController.m index 6a2883b26..4072de69d 100644 --- a/Application/PlaybackController.m +++ b/Application/PlaybackController.m @@ -4,6 +4,9 @@ #import "DBLog.h" #import "CogAudio/Status.h" +#import "PlaylistController.h" +#import "PlaylistEntry.h" + @implementation PlaybackController - (id)init @@ -289,11 +292,11 @@ if ([playlistController shuffle] == YES) { - pe = [playlistController entryAtIndex:[curEntry shuffleIndex]+1]; + pe = [playlistController entryAtIndex:[[curEntry shuffleIndex] intValue] + 1]; } else { - pe = [playlistController entryAtIndex:[curEntry index]+1]; + pe = [playlistController entryAtIndex:[[curEntry index] intValue] + 1]; } if (pe == nil) diff --git a/AudioScrobbler/AudioScrobbler.m b/AudioScrobbler/AudioScrobbler.m index 9c181ba4b..40fb772c8 100644 --- a/AudioScrobbler/AudioScrobbler.m +++ b/AudioScrobbler/AudioScrobbler.m @@ -104,7 +104,7 @@ escapeForLastFM(NSString *string) escapeForLastFM([pe title]), escapeForLastFM([pe album]), @"", // TODO: MusicBrainz support - (int)([pe length]/1000.0), + (int)([[pe length] doubleValue]/1000.0), escapeForLastFM([[pe url] path]) ]]; } diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index 12553ff21..ef054f02f 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -100,6 +100,12 @@ 8E7575D009F31DCA0080F1EE /* Credits.html in Resources */ = {isa = PBXBuildFile; fileRef = 8E7575C809F31DCA0080F1EE /* Credits.html */; }; 8E7575D109F31DCA0080F1EE /* README in Resources */ = {isa = PBXBuildFile; fileRef = 8E7575C909F31DCA0080F1EE /* README */; }; 8E7575DB09F31E930080F1EE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8E7575D909F31E930080F1EE /* Localizable.strings */; }; + 8E9A2E850BA78B500091081B /* SecondsFormatter.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E9A2E830BA78B500091081B /* SecondsFormatter.h */; }; + 8E9A2E860BA78B500091081B /* SecondsFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E9A2E840BA78B500091081B /* SecondsFormatter.m */; }; + 8E9A2ED90BA78D9D0091081B /* IndexFormatter.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E9A2ED70BA78D9D0091081B /* IndexFormatter.h */; }; + 8E9A2EDA0BA78D9D0091081B /* IndexFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E9A2ED80BA78D9D0091081B /* IndexFormatter.m */; }; + 8E9A30150BA792DC0091081B /* NSFileHandle+CreateFile.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E9A30130BA792DC0091081B /* NSFileHandle+CreateFile.h */; }; + 8E9A30160BA792DC0091081B /* NSFileHandle+CreateFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E9A30140BA792DC0091081B /* NSFileHandle+CreateFile.m */; }; 8EFFCD5F0AA093AF00C458A5 /* DirectoryNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD430AA093AF00C458A5 /* DirectoryNode.m */; }; 8EFFCD610AA093AF00C458A5 /* FileIconCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD450AA093AF00C458A5 /* FileIconCell.m */; }; 8EFFCD630AA093AF00C458A5 /* FileNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EFFCD470AA093AF00C458A5 /* FileNode.m */; }; @@ -141,6 +147,9 @@ 170680840B950164006BA573 /* Growl.framework in CopyFiles */, 17F94CCD0B8D090800A34E87 /* Sparkle.framework in CopyFiles */, 1755E1F80BA0D2B600CA3560 /* PlaylistLoader.h in CopyFiles */, + 8E9A2E850BA78B500091081B /* SecondsFormatter.h in CopyFiles */, + 8E9A2ED90BA78D9D0091081B /* IndexFormatter.h in CopyFiles */, + 8E9A30150BA792DC0091081B /* NSFileHandle+CreateFile.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -277,6 +286,12 @@ 8E7575C909F31DCA0080F1EE /* README */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = README; sourceTree = ""; }; 8E7575DA09F31E930080F1EE /* English */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = ""; }; 8E7575DC09F31EAF0080F1EE /* French */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = French; path = French.lproj/Localizable.strings; sourceTree = ""; }; + 8E9A2E830BA78B500091081B /* SecondsFormatter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SecondsFormatter.h; sourceTree = ""; }; + 8E9A2E840BA78B500091081B /* SecondsFormatter.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = SecondsFormatter.m; sourceTree = ""; }; + 8E9A2ED70BA78D9D0091081B /* IndexFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IndexFormatter.h; sourceTree = ""; }; + 8E9A2ED80BA78D9D0091081B /* IndexFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IndexFormatter.m; sourceTree = ""; }; + 8E9A30130BA792DC0091081B /* NSFileHandle+CreateFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSFileHandle+CreateFile.h"; sourceTree = ""; }; + 8E9A30140BA792DC0091081B /* NSFileHandle+CreateFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileHandle+CreateFile.m"; 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 = ""; }; @@ -470,6 +485,8 @@ 177EC01B0B8BC2CF0000BC8C /* TrackingCell.m */, 177EC01C0B8BC2CF0000BC8C /* TrackingSlider.h */, 177EC01D0B8BC2CF0000BC8C /* TrackingSlider.m */, + 8E9A30130BA792DC0091081B /* NSFileHandle+CreateFile.h */, + 8E9A30140BA792DC0091081B /* NSFileHandle+CreateFile.m */, ); path = Utils; sourceTree = ""; @@ -630,6 +647,10 @@ 8E75753209F31D5A0080F1EE /* PlaylistView.m */, 8E75753309F31D5A0080F1EE /* Shuffle.h */, 8E75753409F31D5A0080F1EE /* Shuffle.m */, + 8E9A2E830BA78B500091081B /* SecondsFormatter.h */, + 8E9A2E840BA78B500091081B /* SecondsFormatter.m */, + 8E9A2ED70BA78D9D0091081B /* IndexFormatter.h */, + 8E9A2ED80BA78D9D0091081B /* IndexFormatter.m */, ); path = Playlist; sourceTree = ""; @@ -796,6 +817,9 @@ 1766C6930B911DF1004A7AE4 /* AudioScrobbler.m in Sources */, 1766C6950B911DF1004A7AE4 /* AudioScrobblerClient.m in Sources */, 1755E1F90BA0D2B600CA3560 /* PlaylistLoader.m in Sources */, + 8E9A2E860BA78B500091081B /* SecondsFormatter.m in Sources */, + 8E9A2EDA0BA78D9D0091081B /* IndexFormatter.m in Sources */, + 8E9A30160BA792DC0091081B /* NSFileHandle+CreateFile.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib index 7c9b6d260..d15d578f9 100644 --- a/English.lproj/MainMenu.nib/classes.nib +++ b/English.lproj/MainMenu.nib/classes.nib @@ -166,6 +166,7 @@ LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = SecondsFormatter; LANGUAGE = ObjC; SUPERCLASS = NSFormatter; }, { ACTIONS = { changeVolume = id; diff --git a/English.lproj/MainMenu.nib/info.nib b/English.lproj/MainMenu.nib/info.nib index fec6bb7dd..61b2b0f21 100644 --- a/English.lproj/MainMenu.nib/info.nib +++ b/English.lproj/MainMenu.nib/info.nib @@ -7,17 +7,17 @@ IBEditorPositions 1063 - 0 320 136 49 0 0 1680 1028 + 0 228 136 49 0 0 1024 746 1156 - 719 527 241 366 0 0 1680 1028 + 391 336 241 366 0 0 1024 746 1324 - 788 657 137 182 0 0 1680 1028 + 453 438 137 182 0 0 1024 746 29 - -3 975 383 44 0 0 1680 1028 + -3 696 383 44 0 0 1024 746 463 - 669 637 341 145 0 0 1680 1028 + 341 447 341 145 0 0 1024 746 513 - 352 836 125 137 0 0 1680 1028 + 204 571 125 137 0 0 1024 746 IBFramework Version 446.1 @@ -34,16 +34,16 @@ 4 IBOpenObjects + 1307 513 + 1324 + 21 463 29 - 21 - 1307 1063 1156 - 1324 IBSystem Version - 8L2127 + 8L127 diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index d8d8b164d890d6b8cd7d8e71dee43d80a89bd23b..aa7359f32ae308df102c4b5cee53c21516d625bc 100644 GIT binary patch delta 28927 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 O?Em|JtotAH75@hro;@A_ delta 28891 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 diff --git a/Playlist/PlaylistController.h b/Playlist/PlaylistController.h index fb248b3d6..b8b2ad72f 100644 --- a/Playlist/PlaylistController.h +++ b/Playlist/PlaylistController.h @@ -60,6 +60,6 @@ - (void)addShuffledListToFront; - (void)resetShuffleList; -- (void)handlePlaylistViewHeaderNotification:(NSNotification*)notif; +- (PlaylistEntry *)entryAtIndex:(int)i; @end diff --git a/Playlist/PlaylistController.m b/Playlist/PlaylistController.m index 049f2133e..7fc72b89c 100644 --- a/Playlist/PlaylistController.m +++ b/Playlist/PlaylistController.m @@ -121,7 +121,7 @@ PlaylistEntry* pe; while (pe = [enumerator nextObject]) { - tt += [pe length]; + tt += [[pe length] doubleValue]; } int sec = (int)(tt/1000.0); @@ -148,7 +148,7 @@ PlaylistEntry *p; p = [[self arrangedObjects] objectAtIndex:j]; - [p setIndex:j]; + [p setIndex:[NSNumber numberWithInt:j]]; } } @@ -159,7 +159,7 @@ if ([a containsObject:currentEntry]) { - [currentEntry setIndex:-1]; + [currentEntry setIndex:[NSNumber numberWithInt:-1]]; } [super removeObjectsAtArrangedObjectIndexes:indexes]; @@ -281,11 +281,11 @@ { if (shuffle == YES) { - return [self shuffledEntryAtIndex:[pe shuffleIndex] + 1]; + return [self shuffledEntryAtIndex:([[pe shuffleIndex] intValue] + 1)]; } else { - return [self entryAtIndex:[pe index] + 1]; + return [self entryAtIndex:([[pe index] intValue] + 1)]; } } @@ -293,18 +293,18 @@ { if (shuffle == YES) { - return [self shuffledEntryAtIndex:[pe shuffleIndex] - 1]; + return [self shuffledEntryAtIndex:([[pe shuffleIndex] intValue] - 1)]; } else { //Fix for removing a track, then pressing prev with repeat turned on - if ([pe index] == -1) + if ([[pe index] intValue] == -1) { - return [self entryAtIndex:[pe index]]; + return [self entryAtIndex:[[pe index] intValue]]; } else { - return [self entryAtIndex:[pe index] - 1]; + return [self entryAtIndex:[[pe index] intValue] - 1]; } } } @@ -347,7 +347,7 @@ int i; for (i = 0; i < [shuffleList count]; i++) { - [[shuffleList objectAtIndex:i] setShuffleIndex:i]; + [[shuffleList objectAtIndex:i] setShuffleIndex:[NSNumber numberWithInt:i]]; } } @@ -361,7 +361,7 @@ int i; for (i = ([shuffleList count] - [newList count]); i < [shuffleList count]; i++) { - [[shuffleList objectAtIndex:i] setShuffleIndex:i]; + [[shuffleList objectAtIndex:i] setShuffleIndex:[NSNumber numberWithInt:i]]; } } @@ -372,7 +372,7 @@ [self addShuffledListToFront]; - if (currentEntry && [currentEntry index] != -1) + if (currentEntry && [[currentEntry index] intValue] != -1) { [shuffleList insertObject:currentEntry atIndex:0]; [currentEntry setShuffleIndex:0]; @@ -388,7 +388,7 @@ [shuffleList removeObjectAtIndex:i]; } - [[shuffleList objectAtIndex:i] setShuffleIndex:i]; + [[shuffleList objectAtIndex:i] setShuffleIndex:[NSNumber numberWithInt:i]]; } } } @@ -403,7 +403,7 @@ [currentEntry setCurrent:NO]; [pe setCurrent:YES]; - [tableView scrollRowToVisible:[pe index]]; + [tableView scrollRowToVisible:[[pe index] intValue]]; [pe retain]; [currentEntry release]; diff --git a/Playlist/PlaylistEntry.h b/Playlist/PlaylistEntry.h index 51da6d7fb..8ac1fa9ea 100644 --- a/Playlist/PlaylistEntry.h +++ b/Playlist/PlaylistEntry.h @@ -17,28 +17,26 @@ NSString *genre; NSString *year; - unsigned int track; + NSNumber *track; - NSString *lengthString; - - double length; - int bitrate; - int channels; - int bitsPerSample; - float sampleRate; + NSNumber *length; + NSNumber *bitrate; + NSNumber *channels; + NSNumber *bitsPerSample; + NSNumber *sampleRate; BOOL current; - int idx; //Can't use index due to some weird bug...might be fixed...should test in the future...think it was a conflict with flac, which is now an external lib - int shuffleIdx; - int displayIdx; + NSNumber *idx; + NSNumber *shuffleIndex; + NSNumber *displayIndex; } -- (void)setIndex:(int)i; -- (int)index; +- (void)setIndex:(NSNumber *)i; +- (NSNumber *)index; -- (void)setShuffleIndex:(int)si; -- (int)shuffleIndex; +- (void)setShuffleIndex:(NSNumber *)si; +- (NSNumber *)shuffleIndex; - (void)setURL:(NSURL *)u; - (NSURL *)url; @@ -54,25 +52,23 @@ - (void)setGenre:(NSString *)s; - (NSString *)genre; -- (NSString *)lengthString; -- (void)setLengthString:(double)l; - - (void)setYear:(NSString *)y; - (NSString *)year; -- (void)setTrack:(int)y; -- (int)track; +- (void)setTrack:(NSNumber *)y; +- (NSNumber *)track; -- (void)setLength:(double)l; -- (void)setBitrate:(int) br; -- (void)setChannels:(int)c; -- (void)setBitsPerSample:(int)bps; -- (void)setSampleRate:(float)s; +- (void)setLength:(NSNumber *)l; +- (NSNumber *)length; -- (double)length; -- (int)bitrate; -- (int)channels; -- (int)bitsPerSample; -- (float)sampleRate; +- (void)setBitrate:(NSNumber *) br; +- (NSNumber *)bitrate; + +- (void)setChannels:(NSNumber *)c; +- (NSNumber *)channels; +- (void)setBitsPerSample:(NSNumber *)bps; +- (NSNumber *)bitsPerSample; +- (void)setSampleRate:(NSNumber *)s; +- (NSNumber *)sampleRate; - (void)setMetadata: (NSDictionary *)m; - (void)readMetadataThread; diff --git a/Playlist/PlaylistEntry.m b/Playlist/PlaylistEntry.m index f85529e5b..142a3770e 100644 --- a/Playlist/PlaylistEntry.m +++ b/Playlist/PlaylistEntry.m @@ -17,7 +17,7 @@ self = [super init]; if (self) { - [self setIndex:0]; + [self setIndex:nil]; [self setURL:nil]; } @@ -31,37 +31,32 @@ [super dealloc]; } --(void)setShuffleIndex:(int)si +-(void)setShuffleIndex:(NSNumber *)si { - shuffleIdx = si; + [si retain]; + [shuffleIndex release]; + + shuffleIndex = si; } --(int)shuffleIndex +-(NSNumber *)shuffleIndex { - return shuffleIdx; + return shuffleIndex; } --(void)setIndex:(int)i +-(void)setIndex:(NSNumber *)i { + [i retain]; + [idx release]; + NSLog(@"INDEX: %@", i); idx = i; - [self setDisplayIndex:i+1]; } --(int)index +-(NSNumber *)index { return idx; } --(void)setDisplayIndex:(int)i -{ - displayIdx=i; -} - --(int)displayIndex -{ - return displayIdx; -} - -(void)setURL:(NSURL *)u { [u retain]; @@ -155,24 +150,25 @@ return year; } -- (void)setTrack:(int)t +- (void)setTrack:(NSNumber *)t { + [t retain]; + [track release]; + track = t; } -- (int)track +- (NSNumber *)track { return track; } - (void)setProperties:(NSDictionary *)dict { - [self setLength: [[dict objectForKey:@"length" ] doubleValue]]; - [self setBitrate: [[dict objectForKey:@"bitrate" ] intValue]]; - [self setChannels: [[dict objectForKey:@"channels" ] intValue]]; - [self setBitsPerSample: [[dict objectForKey:@"bitsPerSample"] intValue]]; - [self setSampleRate: [[dict objectForKey:@"sampleRate" ] floatValue]]; - - [self setLengthString:[[dict objectForKey:@"length"] doubleValue]]; + [self setLength: [dict objectForKey:@"length" ]]; + [self setBitrate: [dict objectForKey:@"bitrate" ]]; + [self setChannels: [dict objectForKey:@"channels" ]]; + [self setBitsPerSample: [dict objectForKey:@"bitsPerSample" ]]; + [self setSampleRate: [dict objectForKey:@"sampleRate" ]]; } - (void)readPropertiesThread @@ -182,60 +178,62 @@ [self performSelectorOnMainThread:@selector(setProperties:) withObject:properties waitUntilDone:YES]; } -- (NSString *)lengthString -{ - return lengthString; -} -- (void)setLengthString:(double)l -{ - int sec = (int)(l/1000.0); - - [lengthString release]; - lengthString = [[NSString alloc] initWithFormat:@"%i:%02i",sec/60,sec%60]; -} - - -- (void)setLength:(double)l +- (void)setLength:(NSNumber *)l { + [l retain]; + [length release]; + length = l; } -- (double)length +- (NSNumber *)length { return length; } -- (void)setBitrate:(int) br +- (void)setBitrate:(NSNumber *) br { + [br retain]; + [bitrate release]; + bitrate = br; } -- (int)bitrate +- (NSNumber *)bitrate { return bitrate; } -- (void)setChannels:(int)c +- (void)setChannels:(NSNumber *)c { + [c retain]; + [channels release]; + channels = c; } -- (int)channels +- (NSNumber *)channels { return channels; } -- (void)setBitsPerSample:(int)bps +- (void)setBitsPerSample:(NSNumber *)bps { + [bps retain]; + [bitsPerSample release]; + bitsPerSample = bps; } -- (int)bitsPerSample +- (NSNumber *)bitsPerSample { return bitsPerSample; } -- (void)setSampleRate:(float)s +- (void)setSampleRate:(NSNumber *)s { + [s retain]; + [s release]; + sampleRate = s; } -- (float)sampleRate +- (NSNumber *)sampleRate { return sampleRate; } @@ -255,7 +253,7 @@ [self setAlbum:[m objectForKey:@"album"]]; [self setGenre:[m objectForKey:@"genre"]]; [self setYear:[m objectForKey:@"year"]]; - [self setTrack:[[m objectForKey:@"track"] intValue]]; + [self setTrack:[m objectForKey:@"track"]]; } - (void)readMetadataThread @@ -268,7 +266,7 @@ - (NSString *)description { - return [NSString stringWithFormat:@"PlaylistEntry %i:(%@)",idx, url]; + return [NSString stringWithFormat:@"PlaylistEntry %i:(%@)", idx, url]; } @end diff --git a/Playlist/PlaylistLoader.m b/Playlist/PlaylistLoader.m index 35f7beb2e..c07a88a0f 100755 --- a/Playlist/PlaylistLoader.m +++ b/Playlist/PlaylistLoader.m @@ -10,6 +10,8 @@ #import "PlaylistController.h" #import "PlaylistEntry.h" +#import "NSFileHandle+CreateFile.h" + #import "CogAudio/AudioPlayer.h" @implementation PlaylistLoader @@ -136,8 +138,9 @@ - (BOOL)saveM3u:(NSString *)filename { - NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:filename]; + NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:filename createFile:YES]; if (!fileHandle) { + NSLog(@"Error!"); return NO; } [fileHandle truncateFileAtOffset:0]; @@ -201,7 +204,7 @@ - (BOOL)savePls:(NSString *)filename { - NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:filename]; + NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:filename createFile:YES]; if (!fileHandle) { return NO; } @@ -327,7 +330,7 @@ NSURL *url = [finalURLs objectAtIndex:i]; [pe setURL:url]; - [pe setIndex:index+i]; + [pe setIndex:[NSNumber numberWithInt:(index+i)]]; [pe setTitle:[[url path] lastPathComponent]]; [entries addObject:pe]; diff --git a/Playlist/PlaylistView.m b/Playlist/PlaylistView.m index d047f7e24..601d3a966 100644 --- a/Playlist/PlaylistView.m +++ b/Playlist/PlaylistView.m @@ -12,6 +12,9 @@ #import "PlaylistHeaderView.h" +#import "IndexFormatter.h" +#import "SecondsFormatter.h" + @implementation PlaylistView - (void)awakeFromNib @@ -31,7 +34,7 @@ [[c dataCell] setControlSize:s]; [[c dataCell] setFont:f]; } - + NSTableHeaderView *currentTableHeaderView = [self headerView]; PlaylistHeaderView *customTableHeaderView = [[PlaylistHeaderView alloc] init]; @@ -40,6 +43,14 @@ // [self setColumnAutoresizingStyle:NSTableViewNoColumnAutoresizing]; [self setHeaderView:customTableHeaderView]; + + NSFormatter *secondsFormatter = [[SecondsFormatter alloc] init]; + [[[self tableColumnWithIdentifier:@"length"] dataCell] setFormatter:secondsFormatter]; + [secondsFormatter release]; + + NSFormatter *indexFormatter = [[IndexFormatter alloc] init]; + [[[self tableColumnWithIdentifier:@"index"] dataCell] setFormatter:indexFormatter]; + [indexFormatter release]; [self setVerticalMotionCanBeginDrag:YES]; } diff --git a/TODO b/TODO index 569075b4e..30d921a5e 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,2 @@ Make playlist table header menu, (See Play _streamTableHeaderContextMenu). -Make PlaylistEntry numbers use NSNumber. -Instead of LengthString, use a formatter. -Add automatic header seperator without testing explicit types. Pull out binding? Perhaps the table column can do a objectAtIndex and then get a stringValue to get the width. \ No newline at end of file