From 47fa30dc58956e86a39589f19a71fa18468278da Mon Sep 17 00:00:00 2001 From: vspader Date: Wed, 28 Feb 2007 00:35:27 +0000 Subject: [PATCH] Reworked preferences a little to make it easier for simple panes. Added Growl notifications for when a song is played, or when the song changes. --- Application/PlaybackController.h | 4 +- Application/PlaybackController.m | 35 +++++++++++++++++- Audio/Plugin.h | 1 + Cog.xcodeproj/project.pbxproj | 32 +++------------- .../English.lproj/Preferences.nib/classes.nib | 6 +-- .../English.lproj/Preferences.nib/info.nib | 19 ++++++---- .../Preferences.nib/keyedobjects.nib | Bin 14915 -> 14949 bytes .../General/General.xcodeproj/project.pbxproj | 18 --------- Preferences/General/PrefPaneController.h | 17 ++++----- Preferences/General/PrefPaneController.m | 24 ++++++------ Preferences/General/PreferencePane.h | 4 +- Preferences/General/PreferencePane.m | 26 +++++++++++-- 12 files changed, 104 insertions(+), 82 deletions(-) diff --git a/Application/PlaybackController.h b/Application/PlaybackController.h index 81843ee74..90e7be3b0 100644 --- a/Application/PlaybackController.h +++ b/Application/PlaybackController.h @@ -2,6 +2,8 @@ #import +#import + #import "CogAudio/AudioPlayer.h" #import "PlaylistController.h" #import "TrackingSlider.h" @@ -9,7 +11,7 @@ @class PlaylistView; -@interface PlaybackController : NSObject +@interface PlaybackController : NSObject { IBOutlet PlaylistController *playlistController; IBOutlet PlaylistView *playlistView; diff --git a/Application/PlaybackController.m b/Application/PlaybackController.m index ab937c8e3..14e6cd54b 100644 --- a/Application/PlaybackController.m +++ b/Application/PlaybackController.m @@ -20,6 +20,7 @@ showTimeRemaining = NO; scrobbler = [[AudioScrobbler alloc] init]; + [GrowlApplicationBridge setGrowlDelegate:self]; } return self; @@ -30,17 +31,28 @@ NSDictionary *defaultsDictionary = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], @"enableAudioScrobbler", [NSNumber numberWithBool:NO], @"automaticallyLaunchLastFM", + [NSNumber numberWithBool:YES], @"enableGrowlNotifications", nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDictionary]; } +- (NSDictionary *) registrationDictionaryForGrowl +{ + NSArray *notifications = [NSArray arrayWithObjects:@"Stream Changed", nil]; + + return [NSDictionary dictionaryWithObjectsAndKeys: + @"Cog", GROWL_APP_NAME, + notifications, GROWL_NOTIFICATIONS_ALL, + notifications, GROWL_NOTIFICATIONS_DEFAULT, + nil]; +} + - (void)awakeFromNib { currentVolume = 100.0; [volumeSlider setDoubleValue:pow(10.0, log10(0.5)/4.0)*[volumeSlider maxValue]]; } - - (IBAction)playPauseResume:(id)sender { @@ -90,6 +102,7 @@ if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableAudioScrobbler"]) { [scrobbler stop]; } + } //called by double-clicking on table @@ -126,6 +139,16 @@ if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableAudioScrobbler"]) { [scrobbler start:pe]; } + + if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableGrowlNotifications"]) { + [GrowlApplicationBridge notifyWithTitle:[pe title] + description:[pe artist] + notificationName:@"Stream Changed" + iconData:nil + priority:0 + isSticky:NO + clickContext:nil]; + } } - (IBAction)next:(id)sender @@ -298,6 +321,16 @@ if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableAudioScrobbler"]) { [scrobbler start:pe]; } + + if([[NSUserDefaults standardUserDefaults] boolForKey:@"enableGrowlNotifications"]) { + [GrowlApplicationBridge notifyWithTitle:[pe title] + description:[pe artist] + notificationName:@"Stream Changed" + iconData:nil + priority:0 + isSticky:NO + clickContext:nil]; + } } - (void)updatePosition:(id)sender diff --git a/Audio/Plugin.h b/Audio/Plugin.h index 2965cac82..32d770f05 100644 --- a/Audio/Plugin.h +++ b/Audio/Plugin.h @@ -1,6 +1,7 @@ typedef enum { kCogPluginCodec = 1, + kCogPluginGeneral } PluginType; @protocol CogPlugin diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index f7671affc..474536f40 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -8,10 +8,10 @@ /* Begin PBXBuildFile section */ 1705F1510B8BCB0C00C8B40D /* Help in Resources */ = {isa = PBXBuildFile; fileRef = 1705F1420B8BCB0C00C8B40D /* Help */; }; + 170680630B950158006BA573 /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 170680620B950158006BA573 /* Growl.framework */; }; + 170680840B950164006BA573 /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 170680620B950158006BA573 /* Growl.framework */; }; 171678C00AC8C39E00C28CF3 /* SmartFolderNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 171678BE0AC8C39E00C28CF3 /* SmartFolderNode.m */; }; - 1766C6920B911DF1004A7AE4 /* AudioScrobbler.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1766C68E0B911DF1004A7AE4 /* AudioScrobbler.h */; }; 1766C6930B911DF1004A7AE4 /* AudioScrobbler.m in Sources */ = {isa = PBXBuildFile; fileRef = 1766C68F0B911DF1004A7AE4 /* AudioScrobbler.m */; }; - 1766C6940B911DF1004A7AE4 /* AudioScrobblerClient.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1766C6900B911DF1004A7AE4 /* AudioScrobblerClient.h */; }; 1766C6950B911DF1004A7AE4 /* AudioScrobblerClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 1766C6910B911DF1004A7AE4 /* AudioScrobblerClient.m */; }; 1766C8920B912FB4004A7AE4 /* files_off.png in Resources */ = {isa = PBXBuildFile; fileRef = 1766C88A0B912FB4004A7AE4 /* files_off.png */; }; 1766C8930B912FB4004A7AE4 /* files_on.png in Resources */ = {isa = PBXBuildFile; fileRef = 1766C88B0B912FB4004A7AE4 /* files_on.png */; }; @@ -78,7 +78,6 @@ 17BB5CFA0B8A86350009ACB1 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17BB5CF70B8A86350009ACB1 /* CoreAudio.framework */; }; 17BB5CFB0B8A86350009ACB1 /* CoreAudioKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17BB5CF80B8A86350009ACB1 /* CoreAudioKit.framework */; }; 17BB5EA60B8A87850009ACB1 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17BB5EA50B8A87850009ACB1 /* IOKit.framework */; }; - 17D21DF60B8BE86900D1EBDE /* CoreAudioUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D21DF40B8BE86900D1EBDE /* CoreAudioUtils.m */; }; 17F94CC20B8D08FB00A34E87 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17F94CC10B8D08FB00A34E87 /* Sparkle.framework */; }; 17F94CCD0B8D090800A34E87 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 17F94CC10B8D08FB00A34E87 /* Sparkle.framework */; }; 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; @@ -141,10 +140,9 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 170680840B950164006BA573 /* Growl.framework in CopyFiles */, 17B61B630B90A28100BC003F /* CogAudio.framework in CopyFiles */, 17F94CCD0B8D090800A34E87 /* Sparkle.framework in CopyFiles */, - 1766C6920B911DF1004A7AE4 /* AudioScrobbler.h in CopyFiles */, - 1766C6940B911DF1004A7AE4 /* AudioScrobblerClient.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -154,6 +152,7 @@ 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 1705F1420B8BCB0C00C8B40D /* Help */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Help; sourceTree = ""; }; + 170680620B950158006BA573 /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Growl.framework; path = ThirdParty/Frameworks/Growl.framework; sourceTree = ""; }; 171678BD0AC8C39E00C28CF3 /* SmartFolderNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmartFolderNode.h; sourceTree = ""; }; 171678BE0AC8C39E00C28CF3 /* SmartFolderNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SmartFolderNode.m; sourceTree = ""; }; 1766C68E0B911DF1004A7AE4 /* AudioScrobbler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AudioScrobbler.h; sourceTree = ""; }; @@ -235,8 +234,6 @@ 17BB5CF70B8A86350009ACB1 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = ""; }; 17BB5CF80B8A86350009ACB1 /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = /System/Library/Frameworks/CoreAudioKit.framework; sourceTree = ""; }; 17BB5EA50B8A87850009ACB1 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = ""; }; - 17D21DF30B8BE86900D1EBDE /* CoreAudioUtils.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CoreAudioUtils.h; sourceTree = ""; }; - 17D21DF40B8BE86900D1EBDE /* CoreAudioUtils.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = CoreAudioUtils.m; sourceTree = ""; }; 17F94CC10B8D08FB00A34E87 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = ThirdParty/Frameworks/Sparkle.framework; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; @@ -310,6 +307,7 @@ 17BB5EA60B8A87850009ACB1 /* IOKit.framework in Frameworks */, 17F94CC20B8D08FB00A34E87 /* Sparkle.framework in Frameworks */, 17B61B5E0B90A27F00BC003F /* CogAudio.framework in Frameworks */, + 170680630B950158006BA573 /* Growl.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -334,6 +332,7 @@ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( + 170680620B950158006BA573 /* Growl.framework */, 17B61B5D0B90A27F00BC003F /* CogAudio.framework */, 17F94CC10B8D08FB00A34E87 /* Sparkle.framework */, 8E6889230AAA403C00AD3950 /* Carbon.framework */, @@ -381,10 +380,8 @@ 177EBF770B8BC2A70000BC8C /* ThirdParty */ = { isa = PBXGroup; children = ( - 17D21DF20B8BE86900D1EBDE /* CoreAudioUtils */, 177EBF780B8BC2A70000BC8C /* AMRemovableColumnsTableView */, 177EBF7D0B8BC2A70000BC8C /* AppleRemote */, - 177EBF800B8BC2A70000BC8C /* CoreAudioUtils */, 177EBF850B8BC2A70000BC8C /* ImageTextCell */, 177EBF880B8BC2A70000BC8C /* KFTypeSelectTableView */, 177EBF8B0B8BC2A70000BC8C /* NDHotKeys */, @@ -413,13 +410,6 @@ path = AppleRemote; sourceTree = ""; }; - 177EBF800B8BC2A70000BC8C /* CoreAudioUtils */ = { - isa = PBXGroup; - children = ( - ); - path = CoreAudioUtils; - sourceTree = ""; - }; 177EBF850B8BC2A70000BC8C /* ImageTextCell */ = { isa = PBXGroup; children = ( @@ -527,15 +517,6 @@ name = PlugIns; sourceTree = ""; }; - 17D21DF20B8BE86900D1EBDE /* CoreAudioUtils */ = { - isa = PBXGroup; - children = ( - 17D21DF30B8BE86900D1EBDE /* CoreAudioUtils.h */, - 17D21DF40B8BE86900D1EBDE /* CoreAudioUtils.m */, - ); - path = CoreAudioUtils; - sourceTree = ""; - }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( @@ -823,7 +804,6 @@ 177EC0290B8BC2CF0000BC8C /* TrackingSlider.m in Sources */, 1770429C0B8BC53600B86321 /* AppController.m in Sources */, 1770429E0B8BC53600B86321 /* PlaybackController.m in Sources */, - 17D21DF60B8BE86900D1EBDE /* CoreAudioUtils.m in Sources */, 1766C6930B911DF1004A7AE4 /* AudioScrobbler.m in Sources */, 1766C6950B911DF1004A7AE4 /* AudioScrobblerClient.m in Sources */, ); diff --git a/Preferences/General/English.lproj/Preferences.nib/classes.nib b/Preferences/General/English.lproj/Preferences.nib/classes.nib index 82ae8a94b..c3992d461 100644 --- a/Preferences/General/English.lproj/Preferences.nib/classes.nib +++ b/Preferences/General/English.lproj/Preferences.nib/classes.nib @@ -45,9 +45,9 @@ fileDrawerPane = FileDrawerPane; hotKeyPane = HotKeyPane; outputPane = OutputPane; - remotePane = RemotePane; - scrobblerPane = ScrobblerPane; - updatesPane = UpdatesPane; + remoteView = NSView; + scrobblerView = NSView; + updatesView = NSView; }; SUPERCLASS = NSObject; }, diff --git a/Preferences/General/English.lproj/Preferences.nib/info.nib b/Preferences/General/English.lproj/Preferences.nib/info.nib index 6e2ee1815..bd734612b 100644 --- a/Preferences/General/English.lproj/Preferences.nib/info.nib +++ b/Preferences/General/English.lproj/Preferences.nib/info.nib @@ -7,28 +7,31 @@ IBEditorPositions 10 - 144 608 506 102 0 0 1440 878 + 562 607 506 102 0 0 1680 1028 + 102 + 762 667 248 96 0 0 1680 1028 11 - 619 592 400 151 0 0 1440 878 + 640 634 400 151 0 0 1680 1028 43 - 103 395 400 116 0 0 1440 878 + 640 652 400 116 0 0 1680 1028 50 - 527 303 400 96 0 0 1440 878 + 640 662 400 96 0 0 1680 1028 58 - 154 210 411 101 0 0 1440 878 + 614 441 411 101 0 0 1680 1028 85 - 757 432 452 116 0 0 1440 878 + 614 652 452 116 0 0 1680 1028 IBFramework Version 446.1 IBOpenObjects + 58 + 102 + 85 43 50 11 10 - 58 - 85 IBSystem Version 8L2127 diff --git a/Preferences/General/English.lproj/Preferences.nib/keyedobjects.nib b/Preferences/General/English.lproj/Preferences.nib/keyedobjects.nib index 555e69fe82aa1ccb8531f6b4e58a933940a19e91..9aa2b7207b278aeb872da6a9165965a16c2a49f5 100644 GIT binary patch literal 14949 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πMWBFx`5vh@InE<38vtBaWPyrm&mo@ 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 diff --git a/Preferences/General/General.xcodeproj/project.pbxproj b/Preferences/General/General.xcodeproj/project.pbxproj index 14c271e5f..d3018c76c 100644 --- a/Preferences/General/General.xcodeproj/project.pbxproj +++ b/Preferences/General/General.xcodeproj/project.pbxproj @@ -7,9 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 172D72480B891FEF00D095BB /* RemotePane.m in Sources */ = {isa = PBXBuildFile; fileRef = 172D72470B891FEF00D095BB /* RemotePane.m */; }; 172D72AD0B8926CA00D095BB /* apple_remote.png in Resources */ = {isa = PBXBuildFile; fileRef = 172D72AC0B8926CA00D095BB /* apple_remote.png */; }; - 1766C73D0B9126E7004A7AE4 /* ScrobblerPane.m in Sources */ = {isa = PBXBuildFile; fileRef = 1766C73C0B9126E7004A7AE4 /* ScrobblerPane.m */; }; 1766C7A80B912A71004A7AE4 /* lastfm.png in Resources */ = {isa = PBXBuildFile; fileRef = 1766C7A70B912A71004A7AE4 /* lastfm.png */; }; 17C643380B8A77CC00C53518 /* OutputsArrayController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17C643360B8A77CC00C53518 /* OutputsArrayController.m */; }; 17C6433F0B8A783F00C53518 /* OutputPane.m in Sources */ = {isa = PBXBuildFile; fileRef = 17C6433E0B8A783F00C53518 /* OutputPane.m */; }; @@ -24,7 +22,6 @@ 8E07ABDC0AAC95BC00A4B32F /* file_drawer.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E07ABDA0AAC95BC00A4B32F /* file_drawer.png */; }; 8E07ABDD0AAC95BC00A4B32F /* hot_keys.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E07ABDB0AAC95BC00A4B32F /* hot_keys.png */; }; 8E07AC050AAC968C00A4B32F /* Preferences.nib in Resources */ = {isa = PBXBuildFile; fileRef = 8E07AC030AAC968C00A4B32F /* Preferences.nib */; }; - 8E15A8360B8944C4006DC802 /* UpdatesPane.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E15A8350B8944C4006DC802 /* UpdatesPane.m */; }; 8E15A86C0B894768006DC802 /* updates.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E15A86B0B894768006DC802 /* updates.png */; }; 8E6C12160AACAE4100819171 /* NDHotKeyControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E6C12130AACAE4100819171 /* NDHotKeyControl.m */; }; 8E6C12170AACAE4100819171 /* NDHotKeyEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E6C12150AACAE4100819171 /* NDHotKeyEvent.m */; }; @@ -37,11 +34,7 @@ 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 089C167FFE841241C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; - 172D72460B891FEF00D095BB /* RemotePane.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = RemotePane.h; sourceTree = ""; }; - 172D72470B891FEF00D095BB /* RemotePane.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = RemotePane.m; sourceTree = ""; }; 172D72AC0B8926CA00D095BB /* apple_remote.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = apple_remote.png; path = Icons/apple_remote.png; sourceTree = ""; }; - 1766C73B0B9126E7004A7AE4 /* ScrobblerPane.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ScrobblerPane.h; sourceTree = ""; }; - 1766C73C0B9126E7004A7AE4 /* ScrobblerPane.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ScrobblerPane.m; sourceTree = ""; }; 1766C7A70B912A71004A7AE4 /* lastfm.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = lastfm.png; path = Icons/lastfm.png; sourceTree = ""; }; 17C643360B8A77CC00C53518 /* OutputsArrayController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = OutputsArrayController.m; sourceTree = ""; }; 17C643370B8A77CC00C53518 /* OutputsArrayController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = OutputsArrayController.h; sourceTree = ""; }; @@ -64,8 +57,6 @@ 8E07ABDA0AAC95BC00A4B32F /* file_drawer.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = file_drawer.png; path = Icons/file_drawer.png; sourceTree = ""; }; 8E07ABDB0AAC95BC00A4B32F /* hot_keys.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = hot_keys.png; path = Icons/hot_keys.png; sourceTree = ""; }; 8E07AC040AAC968C00A4B32F /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Preferences.nib; sourceTree = ""; }; - 8E15A8340B8944C4006DC802 /* UpdatesPane.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = UpdatesPane.h; sourceTree = ""; }; - 8E15A8350B8944C4006DC802 /* UpdatesPane.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = UpdatesPane.m; sourceTree = ""; }; 8E15A86B0B894768006DC802 /* updates.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = updates.png; path = Icons/updates.png; sourceTree = ""; }; 8E6C12120AACAE4100819171 /* NDHotKeyControl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NDHotKeyControl.h; sourceTree = ""; }; 8E6C12130AACAE4100819171 /* NDHotKeyControl.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = NDHotKeyControl.m; sourceTree = ""; }; @@ -162,14 +153,8 @@ 8E07AA7F0AAC8EA200A4B32F /* FileDrawerPane.m */, 8E07AA800AAC8EA200A4B32F /* HotKeyPane.h */, 8E07AA810AAC8EA200A4B32F /* HotKeyPane.m */, - 172D72460B891FEF00D095BB /* RemotePane.h */, - 172D72470B891FEF00D095BB /* RemotePane.m */, - 8E15A8340B8944C4006DC802 /* UpdatesPane.h */, - 8E15A8350B8944C4006DC802 /* UpdatesPane.m */, 17C6433D0B8A783F00C53518 /* OutputPane.h */, 17C6433E0B8A783F00C53518 /* OutputPane.m */, - 1766C73B0B9126E7004A7AE4 /* ScrobblerPane.h */, - 1766C73C0B9126E7004A7AE4 /* ScrobblerPane.m */, ); name = Panes; sourceTree = ""; @@ -284,11 +269,8 @@ 8E6C12160AACAE4100819171 /* NDHotKeyControl.m in Sources */, 8E6C12170AACAE4100819171 /* NDHotKeyEvent.m in Sources */, 8E6C13A00AACBAB500819171 /* HotKeyControl.m in Sources */, - 172D72480B891FEF00D095BB /* RemotePane.m in Sources */, - 8E15A8360B8944C4006DC802 /* UpdatesPane.m in Sources */, 17C643380B8A77CC00C53518 /* OutputsArrayController.m in Sources */, 17C6433F0B8A783F00C53518 /* OutputPane.m in Sources */, - 1766C73D0B9126E7004A7AE4 /* ScrobblerPane.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Preferences/General/PrefPaneController.h b/Preferences/General/PrefPaneController.h index 967ded1cb..4fd8e7488 100644 --- a/Preferences/General/PrefPaneController.h +++ b/Preferences/General/PrefPaneController.h @@ -11,25 +11,24 @@ #import "HotKeyPane.h" #import "FileDrawerPane.h" -#import "RemotePane.h" -#import "UpdatesPane.h" #import "OutputPane.h" -#import "ScrobblerPane.h" @interface PrefPaneController : NSObject { IBOutlet HotKeyPane *hotKeyPane; IBOutlet FileDrawerPane *fileDrawerPane; - IBOutlet RemotePane *remotePane; - IBOutlet UpdatesPane *updatesPane; IBOutlet OutputPane *outputPane; - IBOutlet ScrobblerPane *scrobblerPane; + + IBOutlet NSView *scrobblerView; + IBOutlet NSView *remoteView; + IBOutlet NSView *updatesView; } - (HotKeyPane *)hotKeyPane; - (FileDrawerPane *)fileDrawerPane; -- (RemotePane *)remotePane; -- (UpdatesPane *)updatesPane; - (OutputPane *)outputPane; -- (ScrobblerPane *)scrobblerPane; + +- (PreferencePane *)remotePane; +- (PreferencePane *)updatesPane; +- (PreferencePane *)scrobblerPane; @end diff --git a/Preferences/General/PrefPaneController.m b/Preferences/General/PrefPaneController.m index 481e5a6a7..82d7f0dff 100644 --- a/Preferences/General/PrefPaneController.m +++ b/Preferences/General/PrefPaneController.m @@ -31,24 +31,24 @@ return fileDrawerPane; } -- (RemotePane *)remotePane -{ - return remotePane; -} - -- (UpdatesPane *)updatesPane -{ - return updatesPane; -} - - (OutputPane *)outputPane { return outputPane; } -- (ScrobblerPane *)scrobblerPane +- (PreferencePane *)remotePane { - return scrobblerPane; + return [PreferencePane preferencePaneWithView:remoteView name:@"Remote" icon:@"apple_remote"]; +} + +- (PreferencePane *)updatesPane +{ + return [PreferencePane preferencePaneWithView:updatesView name:@"Updates" icon:@"updates"]; +} + +- (PreferencePane *)scrobblerPane +{ + return [PreferencePane preferencePaneWithView:scrobblerView name:@"Last.fm" icon:@"lastfm"]; } @end diff --git a/Preferences/General/PreferencePane.h b/Preferences/General/PreferencePane.h index 8f06dce4d..9b7992e14 100644 --- a/Preferences/General/PreferencePane.h +++ b/Preferences/General/PreferencePane.h @@ -16,6 +16,8 @@ NSImage *icon; } ++ (PreferencePane *)preferencePaneWithView:(NSView *)v name:(NSString *)n icon:(NSString *)i; + - (NSView *)paneView; - (NSString *)paneName; - (NSImage *)paneIcon; @@ -24,8 +26,8 @@ - (BOOL)allowsHorizontalResizing; - (BOOL)allowsVerticalResizing; +- (void)setView:(NSView *)v; - (void)setName:(NSString *)s; - (void)setIcon:(NSString *)i; -- (void)setToolTip:(NSString *)t; @end diff --git a/Preferences/General/PreferencePane.m b/Preferences/General/PreferencePane.m index 78a5cf6c4..e32a36459 100644 --- a/Preferences/General/PreferencePane.m +++ b/Preferences/General/PreferencePane.m @@ -11,6 +11,19 @@ @implementation PreferencePane ++ (PreferencePane *)preferencePaneWithView:(NSView *)v name:(NSString *)n icon:(NSString *)i +{ + PreferencePane *pane = [[[PreferencePane alloc] init] autorelease]; + if (pane) + { + [pane setView:v]; + [pane setName:n]; + [pane setIcon:i]; + } + + return pane; +} + - (NSView *)paneView { return view; @@ -41,11 +54,18 @@ return NO; } -- (void)setName:(NSString *)s +- (void)setView:(NSView *)v { - [s retain]; + [v retain]; + [view release]; + view = v; +} + +- (void)setName:(NSString *)n +{ + [n retain]; [name release]; - name = s; + name = n; } - (void)setIcon:(NSString *)i