diff --git a/Application/AppController.h b/Application/AppController.h
index 8998de211..3b6924fd3 100644
--- a/Application/AppController.h
+++ b/Application/AppController.h
@@ -108,6 +108,8 @@
- (void)showPathSuggester;
+ (void)globalShowPathSuggester;
+- (void)selectTrack:(id)sender;
+
- (IBAction)showRubberbandSettings:(id)sender;
+ (void)globalShowRubberbandSettings;
diff --git a/Application/AppController.m b/Application/AppController.m
index 5ffbff92b..e4eda4201 100644
--- a/Application/AppController.m
+++ b/Application/AppController.m
@@ -695,6 +695,7 @@ static BOOL consentLastEnabled = NO;
[userDefaultsValuesDict setObject:@(44100) forKey:@"synthSampleRate"];
[userDefaultsValuesDict setObject:@NO forKey:@"alwaysStopAfterCurrent"];
+ [userDefaultsValuesDict setObject:@YES forKey:@"selectionFollowsPlayback"];
// Register and sync defaults
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValuesDict];
@@ -882,4 +883,13 @@ static BOOL consentLastEnabled = NO;
[[SparkleBridge sharedStandardUpdaterController] checkForUpdates:[[NSApplication sharedApplication] delegate]];
}
+- (void)selectTrack:(id)sender {
+ PlaylistEntry *pe = (PlaylistEntry *)sender;
+ @try {
+ [playlistView selectRowIndexes:[NSIndexSet indexSetWithIndex:pe.index] byExtendingSelection:NO];
+ }
+ @catch(id anException) {
+ }
+}
+
@end
diff --git a/Base.lproj/MainMenu.xib b/Base.lproj/MainMenu.xib
index 079a00d81..ef856c2f6 100644
--- a/Base.lproj/MainMenu.xib
+++ b/Base.lproj/MainMenu.xib
@@ -1715,6 +1715,12 @@
+
diff --git a/Playlist/PlaylistController.m b/Playlist/PlaylistController.m
index 1ddb4cfcd..a9f756cc5 100644
--- a/Playlist/PlaylistController.m
+++ b/Playlist/PlaylistController.m
@@ -1288,11 +1288,20 @@ static void *playlistControllerContext = &playlistControllerContext;
}
- (PlaylistEntry *)getNextEntry:(PlaylistEntry *)pe ignoreRepeatOne:(BOOL)ignoreRepeatOne {
+ BOOL selectionFollows = [[NSUserDefaults standardUserDefaults] boolForKey:@"selectionFollowsPlayback"];
+
if(!ignoreRepeatOne && [[NSUserDefaults standardUserDefaults] boolForKey:@"alwaysStopAfterCurrent"]) {
+ if(selectionFollows) {
+ PlaylistEntry *nextPe = [self getNextEntry:pe ignoreRepeatOne:YES];
+ [appController selectTrack:nextPe];
+ }
return nil;
}
if(!ignoreRepeatOne && [self repeat] == RepeatModeRepeatOne) {
+ if(selectionFollows) {
+ [appController selectTrack:pe];
+ }
return pe;
}
@@ -1310,11 +1319,19 @@ static void *playlistControllerContext = &playlistControllerContext;
[self commitPersistentStore];
+ if(selectionFollows) {
+ [appController selectTrack:pe];
+ }
+
return pe;
}
if([self shuffle] != ShuffleOff) {
- return [self shuffledEntryAtIndex:(pe.shuffleIndex + 1)];
+ PlaylistEntry *nextPe = [self shuffledEntryAtIndex:(pe.shuffleIndex + 1)];
+ if(selectionFollows && nextPe) {
+ [appController selectTrack:nextPe];
+ }
+ return nextPe;
} else {
NSInteger i;
@@ -1342,7 +1359,13 @@ static void *playlistControllerContext = &playlistControllerContext;
}
}
- return [self entryAtIndex:i];
+ PlaylistEntry *nextPe = [self entryAtIndex:i];
+
+ if(selectionFollows) {
+ [appController selectTrack:nextPe];
+ }
+
+ return nextPe;
}
}
@@ -1361,16 +1384,29 @@ static void *playlistControllerContext = &playlistControllerContext;
}
- (PlaylistEntry *)getPrevEntry:(PlaylistEntry *)pe ignoreRepeatOne:(BOOL)ignoreRepeatOne {
+ BOOL selectionFollows = [[NSUserDefaults standardUserDefaults] boolForKey:@"selectionFollowsPlayback"];
+
if(!ignoreRepeatOne && [[NSUserDefaults standardUserDefaults] boolForKey:@"alwaysStopAfterCurrent"]) {
+ if(selectionFollows) {
+ PlaylistEntry *prevPe = [self getPrevEntry:pe ignoreRepeatOne:YES];
+ [appController selectTrack:prevPe];
+ }
return nil;
}
if(!ignoreRepeatOne && [self repeat] == RepeatModeRepeatOne) {
+ if(selectionFollows) {
+ [appController selectTrack:pe];
+ }
return pe;
}
if([self shuffle] != ShuffleOff) {
- return [self shuffledEntryAtIndex:(pe.shuffleIndex - 1)];
+ PlaylistEntry *prevPe = [self shuffledEntryAtIndex:(pe.shuffleIndex - 1)];
+ if(selectionFollows && prevPe) {
+ [appController selectTrack:prevPe];
+ }
+ return prevPe;
} else {
NSInteger i;
if(pe.index < 0) // Was a current entry, now removed.
@@ -1380,7 +1416,12 @@ static void *playlistControllerContext = &playlistControllerContext;
i = pe.index - 1;
}
- return [self entryAtIndex:i];
+ PlaylistEntry *prevPe = [self entryAtIndex:i];
+ if(selectionFollows) {
+ [appController selectTrack:prevPe];
+ }
+
+ return prevPe;
}
}
diff --git a/en.lproj/MainMenu.strings b/en.lproj/MainMenu.strings
index e25767503..b8e3f1387 100644
--- a/en.lproj/MainMenu.strings
+++ b/en.lproj/MainMenu.strings
@@ -419,6 +419,9 @@
/* Class = "NSMenuItem"; title = "Select Currently Playing"; ObjectID = "1823"; */
"1823.title" = "Select Currently Playing";
+/* Class = "NSMenuItem"; title = "Selection Follows Playback"; ObjectID = "Q7K-Eu-1Vf"; */
+"Q7K-Eu-1Vf.title" = "Selection Follows Playback";
+
/* Class = "NSMenuItem"; title = "View"; ObjectID = "1848"; */
"1848.title" = "View";
diff --git a/es.lproj/MainMenu.strings b/es.lproj/MainMenu.strings
index 6f1d5b50b..bd00d01b9 100644
--- a/es.lproj/MainMenu.strings
+++ b/es.lproj/MainMenu.strings
@@ -419,6 +419,9 @@
/* Class = "NSMenuItem"; title = "Select Currently Playing"; ObjectID = "1823"; */
"1823.title" = "Seleccionar reproducción actual";
+/* Class = "NSMenuItem"; title = "Selection Follows Playback"; ObjectID = "Q7K-Eu-1Vf"; */
+"Q7K-Eu-1Vf.title" = "Selección sigue la reproducción";
+
/* Class = "NSMenuItem"; title = "View"; ObjectID = "1848"; */
"1848.title" = "Visualización";