Index: Changelog6.html
===================================================================
--- Changelog6.html (revision 10225)
+++ Changelog6.html (working copy)
@@ -62,6 +62,7 @@
#4270 - Server Information on SB - two items muddled up
#4281 - Mix do not work with accented characters in filenames and paths
#4291 - if you change the http or cli port, mdns doesn't update its advertisements
+ #4309 - Sort genres by name in Random Mix
Index: Plugins/RandomPlay/Plugin.pm
===================================================================
--- Plugins/RandomPlay/Plugin.pm (revision 10230)
+++ Plugins/RandomPlay/Plugin.pm (working copy)
@@ -152,11 +152,11 @@
my $id = $genre->id;
my $ena = 1;
- if (grep { $_ eq $id } @exclude) {
+ if (grep { $_ eq $name } @exclude) {
$ena = 0;
}
- $clientGenres{$id} = {
+ $clientGenres{$name} = {
'id' => $id,
'name' => $name,
'enabled' => $ena,
@@ -170,20 +170,23 @@
# Returns an array of the non-excluded genres in the db
sub getFilteredGenres {
- my ($client, $returnExcluded) = @_;
+ my ($client, $returnExcluded, $namesOnly) = @_;
my @filteredGenres = ();
my @excludedGenres = ();
+
+ # use second arg to set what values we return. we may need list of ids or names
+ my $value = $namesOnly ? 'name' : 'id';
# If $returnExcluded, just return the current state of excluded genres
my $clientGenres = $returnExcluded ? $genres{$client} : getGenres($client);
- for my $id (keys %{$clientGenres}) {
+ for my $genre (keys %{$clientGenres}) {
- if ($clientGenres->{$id}->{'enabled'}) {
- push (@filteredGenres, $id) if !$returnExcluded;
+ if ($clientGenres->{$genre}->{'enabled'}) {
+ push (@filteredGenres, $clientGenres->{$genre}->{$value}) if !$returnExcluded;
} else {
- push (@excludedGenres, $id) if $returnExcluded;
+ push (@excludedGenres, $clientGenres->{$genre}->{$value}) if $returnExcluded;
}
}
@@ -379,7 +382,7 @@
#$client->currentPlaylist($string);
# Never show random as modified, since its a living playlist
- $client->currentPlaylistModified(0);
+ $client->currentPlaylistModified(0);
}
if ($type eq 'disable') {
@@ -391,7 +394,7 @@
if (Slim::Buttons::Common::mode($client) !~ /^SCREENSAVER./) {
$client->showBriefly(string('PLUGIN_RANDOM'),
- string('PLUGIN_RANDOM_DISABLED'));
+ string('PLUGIN_RANDOM_DISABLED'));
}
$mixInfo{$client->masterOrSelf->id} = undef;
@@ -476,9 +479,9 @@
# This item should be ticked if all the genres are selected
my $genresEnabled = 0;
- for my $id (keys %{$genres}) {
+ for my $genre (keys %{$genres}) {
- if ($genres->{$id}->{'enabled'}) {
+ if ($genres->{$genre}->{'enabled'}) {
$genresEnabled++;
}
}
@@ -488,14 +491,10 @@
} else {
- $rv = $genres->{$item->{'id'}}->{'enabled'};
+ $rv = $genres->{$item->{'name'}}->{'enabled'};
}
- if ($rv) {
- return [undef, '[X]'];
- } else {
- return [undef, '[ ]'];
- }
+ return [undef, Slim::Buttons::Common::checkBoxOverlay($client, $rv)];
}
# Toggle the exclude state of a genre in the select genres mode
@@ -514,10 +513,10 @@
} else {
# Toggle the selected state of the current item
- $genres{$client}->{$item->{'id'}}->{'enabled'} = ! $genres{$client}->{$item->{'id'}}->{'enabled'};
+ $genres{$client}->{$item->{'name'}}->{'enabled'} = ! $genres{$client}->{$item->{'name'}}->{'enabled'};
}
- Slim::Utils::Prefs::set('plugin_random_exclude_genres', getFilteredGenres($client, 1));
+ Slim::Utils::Prefs::set('plugin_random_exclude_genres', getFilteredGenres($client, 1, 1));
$client->update;
}
@@ -583,11 +582,15 @@
my @listRef = ({
name => $client->string('PLUGIN_RANDOM_SELECT_ALL'),
# Mark the fact that isn't really a genre
- selectAll => 1
+ selectAll => 1,
+ value => 1,
});
# Add the genres
foreach my $genre (sort keys %genreList) {
+
+ # HACK: add 'value' so that INPUT.Choice won't complain as much. nasty setup there.
+ $genreList{$genre}->{'value'} = $genreList{$genre}->{'id'};
push @listRef, $genreList{$genre};
}
@@ -819,9 +822,9 @@
my $genres = getGenres($client);
# %$params will contain a key called genre_ for each ticked checkbox on the page
- foreach my $genre (keys %{$params}) {
+ for my $genre (keys %{$genres}) {
- if ($genre =~ s/^genre_//) {
+ if ($params->{'genre_'.$genres->{$genre}->{'id'}}) {
delete($genres->{$genre});
}
}