From e3d076dbf7067661fdfae47ae66c9f0fbc516c9a Mon Sep 17 00:00:00 2001 From: vspader Date: Sun, 17 Sep 2006 18:11:29 +0000 Subject: [PATCH] Added preferences for the file drawer. Fixed bug with sorting added folders. --- AppController.m | 9 +++- Cog.xcodeproj/project.pbxproj | 8 ++-- FileDrawer/DirectoryNode.h | 1 + FileDrawer/DirectoryNode.m | 7 +++ FileDrawer/FileTreeController.m | 22 +++++++++- FileDrawer/FileTreeWatcher.h | 3 ++ FileDrawer/FileTreeWatcher.m | 6 +++ FileDrawer/PathIcon.m | 6 +++ FileDrawer/PathNode.m | 2 + .../TagLib/TagLib.xcodeproj/project.pbxproj | 23 ---------- Playlist/PlaylistController.m | 6 +-- Playlist/PlaylistEntry.m | 5 +++ .../English.lproj/Preferences.nib/classes.nib | 8 +++- .../English.lproj/Preferences.nib/info.nib | 10 ++--- .../Preferences.nib/keyedobjects.nib | Bin 6631 -> 7272 bytes Preferences/General/FileDrawerPane.h | 4 +- Preferences/General/FileDrawerPane.m | 25 +++++++++++ .../General/General.xcodeproj/project.pbxproj | 40 ++++++++++++------ 18 files changed, 134 insertions(+), 51 deletions(-) diff --git a/AppController.m b/AppController.m index d7d785c1a..fe389413a 100644 --- a/AppController.m +++ b/AppController.m @@ -12,7 +12,7 @@ [p setAllowsMultipleSelection:YES]; [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]; +// [p beginForDirectory:nil file:nil types:[playlistController acceptableFileTypes] modelessDelegate:self didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) contextInfo:nil]; /* if ([p runModalForTypes:[playlistController acceptableFileTypes]] == NSOKButton) { @@ -218,6 +218,8 @@ [userDefaultsValuesDict setObject:[NSNumber numberWithInt:(NSControlKeyMask|NSCommandKeyMask)] forKey:@"hotKeyPreviousModifiers"]; [userDefaultsValuesDict setObject:[NSNumber numberWithInt:'R'] forKey:@"hotKeyPreviousCharacter"]; + [userDefaultsValuesDict setObject:[@"~/Music" stringByExpandingTildeInPath] forKey:@"fileDrawerRootPath"]; + //Register and sync defaults [[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValuesDict]; [[NSUserDefaults standardUserDefaults] synchronize]; @@ -225,6 +227,8 @@ [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.hotKeyPlayKeyCode" options:0 context:nil]; [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.hotKeyPreviousKeyCode" options:0 context:nil]; [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.hotKeyNextKeyCode" options:0 context:nil]; + + [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.fileDrawerRootPath" options:0 context:nil]; } - (void) observeValueForKeyPath:(NSString *)keyPath @@ -241,6 +245,9 @@ else if ([keyPath isEqualToString:@"values.hotKeyNextKeyCode"]) { [self registerHotKeys]; } + else if ([keyPath isEqualToString:@"values.fileDrawerRootPath"]) { + [fileTreeController setRootPath:[[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileDrawerRootPath"]]; + } } - (void)registerHotKeys diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index 6e7cb781a..ce3f69760 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -404,6 +404,10 @@ 8E75751A09F31D5A0080F1EE /* Custom */, 8E75752A09F31D5A0080F1EE /* Playlist */, 8E75753509F31D5A0080F1EE /* Sound */, + 8E75751809F31D5A0080F1EE /* AppController.h */, + 8E75751909F31D5A0080F1EE /* AppController.m */, + 8E75752809F31D5A0080F1EE /* PlaybackController.h */, + 8E75752909F31D5A0080F1EE /* PlaybackController.m */, ); name = Classes; sourceTree = ""; @@ -441,10 +445,6 @@ isa = PBXGroup; children = ( 080E96DDFE201D6D7F000001 /* Classes */, - 8E75751809F31D5A0080F1EE /* AppController.h */, - 8E75751909F31D5A0080F1EE /* AppController.m */, - 8E75752809F31D5A0080F1EE /* PlaybackController.h */, - 8E75752909F31D5A0080F1EE /* PlaybackController.m */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, diff --git a/FileDrawer/DirectoryNode.h b/FileDrawer/DirectoryNode.h index e1c127176..f8938a04f 100644 --- a/FileDrawer/DirectoryNode.h +++ b/FileDrawer/DirectoryNode.h @@ -15,6 +15,7 @@ id controller; } +-(id)initWithPath:(NSString *)p controller:(id) c; - (NSArray *)subpaths; @end diff --git a/FileDrawer/DirectoryNode.m b/FileDrawer/DirectoryNode.m index 1a9c075a5..23efcf575 100644 --- a/FileDrawer/DirectoryNode.m +++ b/FileDrawer/DirectoryNode.m @@ -23,7 +23,14 @@ } - (void)dealloc { + [[controller watcher] removePath:[self path]]; + + NSLog(@"DEALLOC: %@", self); + if (subpaths) + [subpaths release]; + [controller release]; + [super dealloc]; } diff --git a/FileDrawer/FileTreeController.m b/FileDrawer/FileTreeController.m index b38fb08c9..0ba67c799 100644 --- a/FileDrawer/FileTreeController.m +++ b/FileDrawer/FileTreeController.m @@ -17,12 +17,16 @@ watcher = [[FileTreeWatcher alloc] init]; [watcher setDelegate:self]; - [self setRootPath: [@"~/Music" stringByExpandingTildeInPath]]; + [self setRootPath: [[[NSUserDefaultsController sharedUserDefaultsController] defaults] objectForKey:@"fileDrawerRootPath"] ]; } - (void)dealloc { [rootPath release]; + [watcher release]; + + NSLog(@"DEALLOCATING CONTROLLER"); + [super dealloc]; } @@ -43,10 +47,26 @@ - (void) refreshRoot { DirectoryNode *base = [[DirectoryNode alloc] initWithPath:rootPath controller:self]; + NSLog(@"Subpaths: %i", [[base subpaths] count]); [self setContent: [base subpaths]]; + NSLog(@"Test: %i", [[self content] retainCount]); + [base release]; } +//BUG IN NSTREECONTROLLER'S SETCONTENT. FIX YOUR SHIT, APPLE! +- (void)setContent:(id)content +{ + if(![content isEqual:[self content]]) + { + NSArray *paths = [[self selectionIndexPaths] retain]; + [super setContent:nil]; + [super setContent:content]; + [self setSelectionIndexPaths:paths]; + [paths release]; + } +} + - (void)refreshPath:(NSString *)path { if ([path compare:rootPath] == NSOrderedSame) { diff --git a/FileDrawer/FileTreeWatcher.h b/FileDrawer/FileTreeWatcher.h index 954cdba21..b4efd3076 100644 --- a/FileDrawer/FileTreeWatcher.h +++ b/FileDrawer/FileTreeWatcher.h @@ -16,4 +16,7 @@ NSMutableArray *watchedPaths; } +- (void)addPath: (NSString *)path; +- (void)removePath: (NSString *)path; + @end diff --git a/FileDrawer/FileTreeWatcher.m b/FileDrawer/FileTreeWatcher.m index 0ff64af9f..bd009feca 100644 --- a/FileDrawer/FileTreeWatcher.m +++ b/FileDrawer/FileTreeWatcher.m @@ -40,6 +40,12 @@ } } +- (void)removePath: (NSString *)path +{ + [watchedPaths removeObject:path]; + [kqueue removePath:path]; +} + -(void) setDelegate: (id)d { delegate = [d retain]; diff --git a/FileDrawer/PathIcon.m b/FileDrawer/PathIcon.m index 23ae70599..59e19f67b 100644 --- a/FileDrawer/PathIcon.m +++ b/FileDrawer/PathIcon.m @@ -25,6 +25,12 @@ return self; } +- (void)dealloc +{ + [path release]; + [icon release]; +} + - (NSString *) path { return path; diff --git a/FileDrawer/PathNode.m b/FileDrawer/PathNode.m index 8c6fdc444..9aaaf0750 100644 --- a/FileDrawer/PathNode.m +++ b/FileDrawer/PathNode.m @@ -26,6 +26,8 @@ - (void)dealloc { [path release]; + [pathIcon release]; + [super dealloc]; } diff --git a/Libraries/TagLib/TagLib.xcodeproj/project.pbxproj b/Libraries/TagLib/TagLib.xcodeproj/project.pbxproj index 78dd8febf..6ebe812fa 100644 --- a/Libraries/TagLib/TagLib.xcodeproj/project.pbxproj +++ b/Libraries/TagLib/TagLib.xcodeproj/project.pbxproj @@ -109,21 +109,6 @@ 8E75712209F319570080F1EE /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E75712109F319570080F1EE /* config.h */; }; /* End PBXBuildFile section */ -/* Begin PBXBuildStyle section */ - 014CEA440018CDF011CA2923 /* Debug */ = { - isa = PBXBuildStyle; - buildSettings = { - }; - name = Debug; - }; - 014CEA450018CDF011CA2923 /* Release */ = { - isa = PBXBuildStyle; - buildSettings = { - }; - name = Release; - }; -/* End PBXBuildStyle section */ - /* Begin PBXFileReference section */ 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; @@ -574,8 +559,6 @@ ); buildRules = ( ); - buildSettings = { - }; dependencies = ( ); name = TagLib; @@ -590,12 +573,6 @@ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "TagLib" */; - buildSettings = { - }; - buildStyles = ( - 014CEA440018CDF011CA2923 /* Debug */, - 014CEA450018CDF011CA2923 /* Release */, - ); hasScannedForEncodings = 1; mainGroup = 0867D691FE84028FC02AAC07 /* TagLib */; productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; diff --git a/Playlist/PlaylistController.m b/Playlist/PlaylistController.m index 23aad1359..01b02a0ba 100644 --- a/Playlist/PlaylistController.m +++ b/Playlist/PlaylistController.m @@ -122,10 +122,10 @@ { PlaylistEntry *pe = [[PlaylistEntry alloc] init]; - [pe setFilename:[files objectAtIndex:i]]; + [pe setFilename:[sortedFiles objectAtIndex:i]]; [pe setIndex:index+i]; - [pe setTitle:[[files objectAtIndex:i] lastPathComponent]]; - [pe setDisplay:[[files objectAtIndex:i] lastPathComponent]]; + [pe setTitle:[[sortedFiles objectAtIndex:i] lastPathComponent]]; + [pe setDisplay:[[sortedFiles objectAtIndex:i] lastPathComponent]]; // [pe performSelectorOnMainThread:@selector(readTags) withObject:nil waitUntilDone:NO]; // [pe performSelectorOnMainThread:@selector(readInfo) withObject:nil waitUntilDone:NO]; diff --git a/Playlist/PlaylistEntry.m b/Playlist/PlaylistEntry.m index d2be9d41d..a325141bb 100644 --- a/Playlist/PlaylistEntry.m +++ b/Playlist/PlaylistEntry.m @@ -482,4 +482,9 @@ waitUntilDone:YES]; } +- (NSString *)description +{ + return [NSString stringWithFormat:@"PlaylistEntry %i:(%@)",idx, filename]; +} + @end diff --git a/Preferences/General/English.lproj/Preferences.nib/classes.nib b/Preferences/General/English.lproj/Preferences.nib/classes.nib index f955ac163..9f01cf40d 100644 --- a/Preferences/General/English.lproj/Preferences.nib/classes.nib +++ b/Preferences/General/English.lproj/Preferences.nib/classes.nib @@ -1,6 +1,12 @@ { IBClasses = ( - {CLASS = FileDrawerPane; LANGUAGE = ObjC; SUPERCLASS = PreferencePane; }, + { + ACTIONS = {openSheet = id; }; + CLASS = FileDrawerPane; + LANGUAGE = ObjC; + OUTLETS = {rootPathTextView = NSTextField; }; + SUPERCLASS = PreferencePane; + }, {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, {CLASS = HotKeyControl; LANGUAGE = ObjC; SUPERCLASS = NDHotKeyControl; }, { diff --git a/Preferences/General/English.lproj/Preferences.nib/info.nib b/Preferences/General/English.lproj/Preferences.nib/info.nib index a8ff62dd3..35c4bff4d 100644 --- a/Preferences/General/English.lproj/Preferences.nib/info.nib +++ b/Preferences/General/English.lproj/Preferences.nib/info.nib @@ -3,22 +3,22 @@ IBDocumentLocation - 69 77 356 240 0 0 1024 746 + 137 120 356 240 0 0 1680 1028 IBEditorPositions 10 - 178 415 668 209 0 0 1024 746 + 499 669 506 102 0 0 1680 1028 11 - 290 507 273 151 0 0 1024 746 + 703 634 273 151 0 0 1680 1028 IBFramework Version 446.1 IBOpenObjects - 10 11 + 10 IBSystem Version - 8J135 + 8K1106 diff --git a/Preferences/General/English.lproj/Preferences.nib/keyedobjects.nib b/Preferences/General/English.lproj/Preferences.nib/keyedobjects.nib index 8eb2ab49e99d9d7a96299a5068141bd38a3440fe..c126c7efa602b3e3ed351668c2480abd2eb62a69 100644 GIT binary patch literal 7272 zcma)A349Y(8vov#$$iX~DF`SkSCd~mZ!+I}=l?t28(SIhN21Be z9{~Xh9PnTQGg!brBFP&r8}Faw3l}Bfzlc8+9GVmjRTd?M#@^v8i$+RCA+KPduf|uN z86%W|%wDx0tY9nYpVi4AEB8jdjBF6!1P3@F1v*0)=n1_b6LMe#c%dA8PziUzy|4i8 zgN3jf*1(hS6g&$r!B*G?ufS{Y7Q7Ab!uzlvK7qq<2F}6{@Dp5wOTl zq$NorZAd$EGf5_0NjGvU=}r2Qej0CbI~hWX^;H=uCjk;6Q8+{HB2&pMG8L>?uNk#*z=vVpunwv!#?EwY!qPd+Ax$YH`E)q~_ya+Lgw94B9sQ{+2x zmi$1@p-t(v^g42iw#L79^d{PgrqOhoOZ(AcI)M<%U;&*@ z?In$KU7BxpW@Ahc2Sa={EXLdX)Z)9;08-FX>nGID8E!=-2cF{f3^T z-_ld`J9?U)p=as8>G$v={SQ4yf1u~-kMt+{Grd56p%>||^b$uo)3BsqRUmLwl)(jV z5I_V8WKh5ZDkMM?XbRUrGiVMi;99s2T0$bUg6p9*BtaXv0op=4Xb(3+2j~blK_|Ew zl652uHc(OM4OICM8`tC&WR{irA`$;sf50ED$qogBh?-E?z)g0*8;STL26b^>!C-%R z1hEtunOBhKo#4~gC3yugGVRHgEVXwG2BQoH4YI|&fNMTZ$CQoB% zsDWVC?sQScTX+|kae;5D*VG!H~c`z9A;dU4T1uztbK_LuhHa47%XLqmw3$ckT!m3y`t6{aQ zj!k3J*$g&|<$nalFcP&H1tl;VN?{DTwvR6o^#{FCjMebGf;#M4<{MK{ZT<8koY| ztQEVFrL%6VC(C5HY#_@&j9S#eRG0<~rlU4@W4KH3I}2vR9GDC9;2xNd!V0P?ePK

go=|B3KMdU@0tv`%%~BumT={ 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 literal 6631 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 dcHZTTb;dbUoN4&J0zZ^S&L_2V