Merge lp:~noskcaj/ubuntu/trusty/gmusicbrowser/1.1.12 into lp:ubuntu/trusty/gmusicbrowser

Proposed by Jackson Doak
Status: Needs review
Proposed branch: lp:~noskcaj/ubuntu/trusty/gmusicbrowser/1.1.12
Merge into: lp:ubuntu/trusty/gmusicbrowser
Diff against target: 92860 lines (+14340/-14438)
43 files modified
.pc/shimmer-layouts/gmbrc.default (+1/-0)
.pc/shimmer-layouts/gmusicbrowser.pl (+146/-120)
.pc/shimmer-layouts/gmusicbrowser_layout.pm (+17/-8)
.pc/shimmer-layouts/gmusicbrowser_list.pm (+34/-41)
.pc/shimmer-layouts/plugins/fetch_cover.pm (+1/-2)
NEWS (+11/-0)
debian/changelog (+6/-0)
debian/control (+2/-1)
debian/patches/shimmer-layouts (+10/-10)
gmbrc.default (+1/-0)
gmusicbrowser.man (+5/-1)
gmusicbrowser.pl (+146/-120)
gmusicbrowser.spec (+1/-1)
gmusicbrowser_123.pm (+1/-1)
gmusicbrowser_gstreamer-0.10.pm (+1/-1)
gmusicbrowser_layout.pm (+17/-8)
gmusicbrowser_list.pm (+34/-41)
gmusicbrowser_mplayer.pm (+1/-1)
gmusicbrowser_songs.pm (+37/-10)
layout_doc.html (+0/-813)
layouts/browser.layout (+4/-4)
layouts/main.layout (+1/-1)
plugins/export.pm (+31/-21)
plugins/fetch_cover.pm (+1/-2)
po/cs.po (+728/-696)
po/de.po (+728/-696)
po/es.po (+728/-696)
po/fi.po (+738/-709)
po/fr.po (+728/-696)
po/gmusicbrowser.pot (+707/-678)
po/hu.po (+728/-696)
po/it.po (+728/-696)
po/ja.po (+730/-698)
po/ko.po (+728/-696)
po/nl.po (+728/-696)
po/pl.po (+728/-696)
po/pt.po (+728/-696)
po/pt_BR.po (+728/-696)
po/ru.po (+728/-696)
po/sr.po (+728/-696)
po/sv.po (+728/-696)
po/zh_CN.po (+728/-696)
po/zh_TW.po (+736/-706)
To merge this branch: bzr merge lp:~noskcaj/ubuntu/trusty/gmusicbrowser/1.1.12
Reviewer Review Type Date Requested Status
Daniel Holbach (community) Needs Fixing
Review via email: mp+206589@code.launchpad.net

Description of the change

New upstream release. I haven't put it in debian since alioth broke.

To post a comment you must log in.
Revision history for this message
Daniel Holbach (dholbach) wrote :

Text conflict in gmbrc.default

review: Needs Fixing

Unmerged revisions

20. By Jackson Doak

update-maintainer

19. By Jackson Doak

New upstream release.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file '.pc/shimmer-layouts/gmbrc.default'
--- .pc/shimmer-layouts/gmbrc.default 2011-03-23 19:23:40 +0000
+++ .pc/shimmer-layouts/gmbrc.default 2014-02-15 20:02:02 +0000
@@ -9,6 +9,7 @@
9# of the plugin found at the top of the plugin file :9# of the plugin found at the top of the plugin file :
10PLUGIN_LYRICS: 110PLUGIN_LYRICS: 1
11PLUGIN_FETCHCOVER: 111PLUGIN_FETCHCOVER: 1
12PLUGIN_AUTOSAVE: 1
1213
13# default player layout14# default player layout
14#Layout: Small player15#Layout: Small player
1516
=== modified file '.pc/shimmer-layouts/gmusicbrowser.pl'
--- .pc/shimmer-layouts/gmusicbrowser.pl 2014-01-25 14:17:08 +0000
+++ .pc/shimmer-layouts/gmusicbrowser.pl 2014-02-15 20:02:02 +0000
@@ -79,8 +79,8 @@
79{79{
80 TRUE => 1,80 TRUE => 1,
81 FALSE => 0,81 FALSE => 0,
82 VERSION => '1.1011',82 VERSION => '1.1012',
83 VERSIONSTRING => '1.1.11',83 VERSIONSTRING => '1.1.12',
84 PIXPATH => $DATADIR.SLASH.'pix'.SLASH,84 PIXPATH => $DATADIR.SLASH.'pix'.SLASH,
85 PROGRAM_NAME => 'gmusicbrowser',85 PROGRAM_NAME => 'gmusicbrowser',
86# PERL510 => $^V ge 'v5.10',86# PERL510 => $^V ge 'v5.10',
@@ -151,8 +151,9 @@
151151
152our %Alias_ext; #define alternate file extensions (ie: .ogg files treated as .oga files)152our %Alias_ext; #define alternate file extensions (ie: .ogg files treated as .oga files)
153INIT {%Alias_ext=(ogg=> 'oga', m4b=>'m4a');} #needs to be in a INIT block because used in a INIT block in gmusicbrowser_tags.pm153INIT {%Alias_ext=(ogg=> 'oga', m4b=>'m4a');} #needs to be in a INIT block because used in a INIT block in gmusicbrowser_tags.pm
154our @ScanExt= qw/mp3 ogg oga flac mpc ape wv m4a m4b/;
154155
155our $debug;156our ($Verbose,$debug);
156our %CmdLine;157our %CmdLine;
157our ($HomeDir,$SaveFile,$FIFOFile,$ImportFile,$DBus_id);158our ($HomeDir,$SaveFile,$FIFOFile,$ImportFile,$DBus_id);
158sub find_gmbrc_file { my @f= map $_[0].$_, '','.gz','.xz'; return wantarray ? (grep { -e $_ } @f) : first { -e $_ } @f }159sub find_gmbrc_file { my @f= map $_[0].$_, '','.gz','.xz'; return wantarray ? (grep { -e $_ } @f) : first { -e $_ } @f }
@@ -185,7 +186,8 @@
185-nogst : do not use gstreamer186-nogst : do not use gstreamer
186-server : send playing song to connected icecast clent187-server : send playing song to connected icecast clent
187-port N : listen for connection on port N in icecast server mode188-port N : listen for connection on port N in icecast server mode
188-debug : print lots of mostly useless informations189-verbose: print some info, like the file being played
190-debug : print lots of mostly useless informations, implies -verbose
189-backtrace : print a backtrace for every warning191-backtrace : print a backtrace for every warning
190-nodbus : do not provide DBus services192-nodbus : do not provide DBus services
191-dbus-id KEY : append .KEY to the DBus service id used by gmusicbrowser (org.gmusicbrowser)193-dbus-id KEY : append .KEY to the DBus service id used by gmusicbrowser (org.gmusicbrowser)
@@ -243,7 +245,8 @@
243 elsif($arg eq '-ro') {$CmdLine{ro}=$CmdLine{rotags}=1}245 elsif($arg eq '-ro') {$CmdLine{ro}=$CmdLine{rotags}=1}
244 elsif($arg eq '-rotags') {$CmdLine{rotags}=1}246 elsif($arg eq '-rotags') {$CmdLine{rotags}=1}
245 elsif($arg eq '-port') {$CmdLine{port}=shift if $ARGV[0]}247 elsif($arg eq '-port') {$CmdLine{port}=shift if $ARGV[0]}
246 elsif($arg eq '-debug') {$debug=1}248 elsif($arg eq '-verbose') {$Verbose=1}
249 elsif($arg eq '-debug') {$debug=$Verbose=4}
247 elsif($arg eq '-backtrace') { $SIG{ __WARN__ } = \&Carp::cluck; $SIG{ __DIE__ } = \&Carp::confess; }250 elsif($arg eq '-backtrace') { $SIG{ __WARN__ } = \&Carp::cluck; $SIG{ __DIE__ } = \&Carp::confess; }
248 elsif($arg eq '-nofifo') {$FIFOFile=''}251 elsif($arg eq '-nofifo') {$FIFOFile=''}
249 elsif($arg eq '-workspace') {$CmdLine{workspace}=shift if defined $ARGV[0]} #requires Gnome2::Wnck252 elsif($arg eq '-workspace') {$CmdLine{workspace}=shift if defined $ARGV[0]} #requires Gnome2::Wnck
@@ -450,7 +453,7 @@
450$DRAGTYPES{$DRAGTYPES[$_][0]}=$_ for DRAG_FILE,DRAG_USTRING,DRAG_STRING,DRAG_ID,DRAG_ARTIST,DRAG_ALBUM,DRAG_FILTER,DRAG_MARKUP;453$DRAGTYPES{$DRAGTYPES[$_][0]}=$_ for DRAG_FILE,DRAG_USTRING,DRAG_STRING,DRAG_ID,DRAG_ARTIST,DRAG_ALBUM,DRAG_FILTER,DRAG_MARKUP;
451454
452our @submenuRemove=455our @submenuRemove=
453( { label => sub {$_[0]{mode} eq 'Q' ? _"Remove from queue" : $_[0]{mode} eq 'A' ? _"Remove from playlist" : _"Remove from list"}, code => sub { $_[0]{self}->RemoveSelected; }, mode => 'BLQA'},456( { label => sub {$_[0]{mode} eq 'Q' ? _"Remove from queue" : $_[0]{mode} eq 'A' ? _"Remove from playlist" : _"Remove from list"}, code => sub { $_[0]{self}->RemoveSelected; }, mode => 'BLQA', istrue=> 'allowremove', },
454 { label => _"Remove from library", code => sub { SongsRemove($_[0]{IDs}); }, },457 { label => _"Remove from library", code => sub { SongsRemove($_[0]{IDs}); }, },
455 { label => _"Remove from disk", code => sub { DeleteFiles($_[0]{IDs}); }, test => sub {!$CmdLine{ro}}, stockicon => 'gtk-delete' },458 { label => _"Remove from disk", code => sub { DeleteFiles($_[0]{IDs}); }, test => sub {!$CmdLine{ro}}, stockicon => 'gtk-delete' },
456);459);
@@ -1192,6 +1195,8 @@
1192 Rewind => [\&Rewind, _"Rewind",_"Number of seconds",qr/^\d+$/],1195 Rewind => [\&Rewind, _"Rewind",_"Number of seconds",qr/^\d+$/],
1193 Seek => [sub {SkipTo($_[1])}, _"Seek",_"Number of seconds",qr/^\d+$/],1196 Seek => [sub {SkipTo($_[1])}, _"Seek",_"Number of seconds",qr/^\d+$/],
1194 Stop => [\&Stop, _"Stop"],1197 Stop => [\&Stop, _"Stop"],
1198 Pause => [sub {Pause() if $TogPlay; }, _"Pause"],
1199 Play => [sub {PlayPause() unless $TogPlay; },_"Play"],
1195 Browser => [\&OpenBrowser, _"Open Browser"],1200 Browser => [\&OpenBrowser, _"Open Browser"],
1196 OpenQueue => [\&EditQueue, _"Open Queue window"],1201 OpenQueue => [\&EditQueue, _"Open Queue window"],
1197 OpenSearch => [sub { Layout::Window->new($Options{LayoutS}, uniqueid=>'Search'); }, _"Open Search window"],1202 OpenSearch => [sub { Layout::Window->new($Options{LayoutS}, uniqueid=>'Search'); }, _"Open Search window"],
@@ -1488,6 +1493,11 @@
1488 return $utf8name;1493 return $utf8name;
1489}1494}
14901495
1496sub get_event_window
1497{ my $widget=shift;
1498 $widget||= Gtk2->get_event_widget(Gtk2->get_current_event);
1499 return find_ancestor($widget,'Gtk2::Window');
1500}
1491sub get_layout_widget1501sub get_layout_widget
1492{ find_ancestor($_[0],'Layout');1502{ find_ancestor($_[0],'Layout');
1493}1503}
@@ -2038,6 +2048,7 @@
2038 $oldversion||=delete $Options{version} || VERSION; # for version <=1.1.72048 $oldversion||=delete $Options{version} || VERSION; # for version <=1.1.7
2039 if ($oldversion>VERSION) { warn "Loading a gmbrc saved with a more recent version of gmusicbrowser, try upgrading gmusicbrowser if there are problems\n"; }2049 if ($oldversion>VERSION) { warn "Loading a gmbrc saved with a more recent version of gmusicbrowser, try upgrading gmusicbrowser if there are problems\n"; }
2040 if ($oldversion<1.10091) {delete $Options{$_} for qw/Diacritic_sort gst_volume Simplehttp_CacheSize mplayer_use_replaygain/;} #cleanup old options2050 if ($oldversion<1.10091) {delete $Options{$_} for qw/Diacritic_sort gst_volume Simplehttp_CacheSize mplayer_use_replaygain/;} #cleanup old options
2051 if ($oldversion<=1.1011) {delete $Options{$_} for qw/ScanPlayOnly/;} #cleanup old options
2041 $Options{AutoRemoveCurrentSong}= delete $Options{TAG_auto_check_current} if $oldversion<1.1005 && exists $Options{TAG_auto_check_current};2052 $Options{AutoRemoveCurrentSong}= delete $Options{TAG_auto_check_current} if $oldversion<1.1005 && exists $Options{TAG_auto_check_current};
2042 $Options{PlayedMinPercent}= 100*delete $Options{PlayedPercent} if exists $Options{PlayedPercent};2053 $Options{PlayedMinPercent}= 100*delete $Options{PlayedPercent} if exists $Options{PlayedPercent};
2043 if ($Options{ArtistSplit}) # for versions <= 1.1.52054 if ($Options{ArtistSplit}) # for versions <= 1.1.5
@@ -2181,7 +2192,7 @@
2181sub SaveTags #save tags _and_ settings2192sub SaveTags #save tags _and_ settings
2182{ my $fork=shift; #if true, save in a forked process2193{ my $fork=shift; #if true, save in a forked process
2183 HasChanged('Save');2194 HasChanged('Save');
2184 if ($CmdLine{demo}) { warn "-demo option => not saving tags/settings\n"; return }2195 if ($CmdLine{demo}) { warn "-demo option => not saving tags/settings\n" if $Verbose || !$fork; return }
21852196
2186 my $ext='';2197 my $ext='';
2187 my $SaveFile= $SaveFile; #do a local copy to locally remove .gz extension if present2198 my $SaveFile= $SaveFile; #do a local copy to locally remove .gz extension if present
@@ -2231,7 +2242,7 @@
2231 my $error;2242 my $error;
2232 (my$fh,my$tempfile,$ext)= Open_gmbrc("$SaveFile.new.$$"."$ext",1);2243 (my$fh,my$tempfile,$ext)= Open_gmbrc("$SaveFile.new.$$"."$ext",1);
2233 unless ($fh) { warn "Save aborted\n"; POSIX::_exit(0) if $fork; return; }2244 unless ($fh) { warn "Save aborted\n"; POSIX::_exit(0) if $fork; return; }
2234 warn "Writing tags in $SaveFile$ext ...\n";2245 warn "Writing tags in $SaveFile$ext ...\n" if $Verbose || !$fork;
22352246
2236 print $fh "# gmbrc version=".VERSION." time=".time."\n" or $error||=$!;2247 print $fh "# gmbrc version=".VERSION." time=".time."\n" or $error||=$!;
22372248
@@ -2248,7 +2259,7 @@
2248 }2259 }
2249 #save fields properties, like album pictures ...2260 #save fields properties, like album pictures ...
2250 for my $field (sort keys %$extrasub)2261 for my $field (sort keys %$extrasub)
2251 { print $fh "\n[$field]\n$extra_subfields->{$field}\n" or $error++;2262 { print $fh "\n[$field]\n$extra_subfields->{$field}\n" or $error||=$!;
2252 my $h= $extrasub->{$field}->();2263 my $h= $extrasub->{$field}->();
2253 for my $key (sort keys %$h)2264 for my $key (sort keys %$h)
2254 { my $vals= $h->{$key};2265 { my $vals= $h->{$key};
@@ -2297,7 +2308,7 @@
2297 unlink $_ for find_gmbrc_file($SaveFile); #make sure there is no other old gmbrc without .bak, as they could cause confusion2308 unlink $_ for find_gmbrc_file($SaveFile); #make sure there is no other old gmbrc without .bak, as they could cause confusion
2298 }2309 }
2299 rename $tempfile,$SaveFile.$ext or warn $!;2310 rename $tempfile,$SaveFile.$ext or warn $!;
2300 warn "Writing tags in $SaveFile$ext ... done\n";2311 warn "Writing tags in $SaveFile$ext ... done\n" if $Verbose || !$fork;
2301 POSIX::_exit(0) if $fork;2312 POSIX::_exit(0) if $fork;
2302}2313}
23032314
@@ -2508,7 +2519,7 @@
2508 warn $error."\n";2519 warn $error."\n";
2509 return if $Options{IgnorePlayError};2520 return if $Options{IgnorePlayError};
2510 my $dialog = Gtk2::MessageDialog->new2521 my $dialog = Gtk2::MessageDialog->new
2511 ( undef, [qw/modal destroy-with-parent/],2522 ( $MainWindow, [qw/modal destroy-with-parent/],
2512 'error','close','%s',2523 'error','close','%s',
2513 $error2524 $error
2514 );2525 );
@@ -4075,7 +4086,7 @@
4075sub PopupContextMenu4086sub PopupContextMenu
4076{ my $args=$_[1];4087{ my $args=$_[1];
4077 my $menu=BuildMenu(@_);4088 my $menu=BuildMenu(@_);
4078 PopupMenu($menu,nomenupos=>!$args->{usemenupos});4089 PopupMenu($menu,nomenupos=>!$args->{usemenupos},self=>$args->{self});
4079}4090}
40804091
4081sub PopupMenu4092sub PopupMenu
@@ -4083,6 +4094,8 @@
4083 return unless $menu->get_children;4094 return unless $menu->get_children;
4084 $menu->show_all;4095 $menu->show_all;
4085 my $event= $args{event} || Gtk2->get_current_event;4096 my $event= $args{event} || Gtk2->get_current_event;
4097 my $widget= $args{self} || Gtk2->get_event_widget($event);
4098 $menu->attach_to_widget($widget,undef) if $widget;
4086 my $posfunction= $args{posfunction}; # usually undef4099 my $posfunction= $args{posfunction}; # usually undef
4087 my $button=my $time=0;4100 my $button=my $time=0;
4088 if ($event)4101 if ($event)
@@ -4135,12 +4148,26 @@
4135 my @order= 0..$#labels;4148 my @order= 0..$#labels;
4136 @order=sort {superlc($labels[$a]) cmp superlc($labels[$b])} @order if ref $choices eq 'HASH' || $tree;4149 @order=sort {superlc($labels[$a]) cmp superlc($labels[$b])} @order if ref $choices eq 'HASH' || $tree;
41374150
4151 my $selection;
4138 my $smenu_callback=sub4152 my $smenu_callback=sub
4139 { my $sub=$_[1];4153 { my $sub=$_[1];
4140 $sub->( $args, $_[0]{selected} );4154 my $selected= $_[0]{selected};
4155 if ($selection && $options{return_list})
4156 { $selection->{$selected} ^=1;
4157 $selected= [sort grep $selection->{$_}, keys %$selection];
4158 }
4159 $sub->($args, $selected);
4141 };4160 };
4142 my $check;4161 my ($check,$radio);
4143 $check= $options{check}($args) if $options{check};4162 $check= $options{check}($args) if $options{check};
4163 if (defined $check)
4164 { $selection={};
4165 if (ref $check) { $selection->{$_}=1 for @$check; }
4166 else
4167 { $radio=1;
4168 $selection->{$check}=1;
4169 }
4170 }
4144 for my $i (@order)4171 for my $i (@order)
4145 { my $label=$labels[$i];4172 { my $label=$labels[$i];
4146 my $value=$values[$i];4173 my $value=$values[$i];
@@ -4151,13 +4178,10 @@
4151 $item->set_submenu($submenu);4178 $item->set_submenu($submenu);
4152 }4179 }
4153 else4180 else
4154 { if (defined $check)4181 { if ($selection)
4155 { $item=Gtk2::CheckMenuItem->new_with_label($label);4182 { $item=Gtk2::CheckMenuItem->new_with_label($label);
4156 if (ref $check) { $item->set_active(1) if grep $_ eq $value, @$check; }4183 $item->set_active(1) if $selection->{$value};
4157 else4184 $item->set_draw_as_radio(1) if $radio;
4158 { $item->set_draw_as_radio(1);
4159 $item->set_active(1) if $check eq $value;
4160 }
4161 }4185 }
4162 $item->{selected}= $value;4186 $item->{selected}= $value;
4163 $item->signal_connect(activate => $smenu_callback, $options{code} );4187 $item->signal_connect(activate => $smenu_callback, $options{code} );
@@ -4323,7 +4347,7 @@
4323{ my ($IDs,$copy)=@_;4347{ my ($IDs,$copy)=@_;
4324 my $msg=$copy ? _"Choose directory to copy files to"4348 my $msg=$copy ? _"Choose directory to copy files to"
4325 : _"Choose directory to move files to";4349 : _"Choose directory to move files to";
4326 my $newdir=ChooseDir($msg, Songs::Get($IDs->[0],'path').SLASH);4350 my $newdir=ChooseDir($msg, path=>Songs::Get($IDs->[0],'path').SLASH);
4327 CopyMoveFiles($IDs,copy=>$copy,basedir=>$newdir) if defined $newdir;4351 CopyMoveFiles($IDs,copy=>$copy,basedir=>$newdir) if defined $newdir;
4328}4352}
43294353
@@ -4406,7 +4430,8 @@
4406}4430}
44074431
4408sub ChooseDir4432sub ChooseDir
4409{ my ($msg,$path,$extrawidget,$remember_key,$multiple,$allowfiles) = @_;4433{ my ($msg,%opt)=@_;
4434 my ($path,$extrawidget,$remember_key,$multiple,$allowfiles) = @opt{qw/path extrawidget remember_key multiple allowfiles/};
4410 my $mode= $allowfiles ? 'open' : 'select-folder';4435 my $mode= $allowfiles ? 'open' : 'select-folder';
4411 # there is no mode in Gtk2::FileChooserDialog that let you select both files or folders (Bug #136294), so use Gtk2::FileChooserWidget directly as it doesn't interfere with the ok button (in "open" mode pressing ok in a Gtk2::FileChooserDialog while a folder is selected go inside that folder rather than emiiting the ok response with that folder selected)4436 # there is no mode in Gtk2::FileChooserDialog that let you select both files or folders (Bug #136294), so use Gtk2::FileChooserWidget directly as it doesn't interfere with the ok button (in "open" mode pressing ok in a Gtk2::FileChooserDialog while a folder is selected go inside that folder rather than emiiting the ok response with that folder selected)
4412 my $dialog=Gtk2::Dialog->new($msg,undef,[], 'gtk-ok' => 'ok', 'gtk-cancel' => 'none');4437 my $dialog=Gtk2::Dialog->new($msg,undef,[], 'gtk-ok' => 'ok', 'gtk-cancel' => 'none');
@@ -4418,6 +4443,8 @@
4418 $dialog->vbox->set_spacing(5); #4443 $dialog->vbox->set_spacing(5); #
4419 ::SetWSize($dialog,'ChooseDir','750x580');4444 ::SetWSize($dialog,'ChooseDir','750x580');
44204445
4446 if (ref $allowfiles) { FileChooser_add_filters($filechooser,@$allowfiles); }
4447
4421 if ($remember_key) { $path= $Options{$remember_key}; }4448 if ($remember_key) { $path= $Options{$remember_key}; }
4422 elsif ($path) { $path= url_escape($path); }4449 elsif ($path) { $path= url_escape($path); }
4423 $filechooser->set_current_folder_uri("file://".$path) if $path;4450 $filechooser->set_current_folder_uri("file://".$path) if $path;
@@ -4456,6 +4483,17 @@
4456# return $path;4483# return $path;
4457#}4484#}
44584485
4486sub FileChooser_add_filters
4487{ my ($filechooser,@patterns)=@_;
4488 for my $aref (@patterns)
4489 { my $filter= Gtk2::FileFilter->new;
4490 if ($aref->[1]) { $filter->add_mime_type($_) for split / /,$aref->[1]; }
4491 if ($aref->[2]) { $filter->add_pattern($_) for split / /,$aref->[2]; }
4492 $filter->set_name($aref->[0]);
4493 $filechooser->add_filter($filter);
4494 }
4495}
4496
4459sub ChooseFiles4497sub ChooseFiles
4460{ my ($text,$remember_key,@patterns)=@_;4498{ my ($text,$remember_key,@patterns)=@_;
4461 $text||=_"Choose files";4499 $text||=_"Choose files";
@@ -4463,13 +4501,7 @@
4463 'gtk-ok' => 'ok',4501 'gtk-ok' => 'ok',
4464 'gtk-cancel' => 'none');4502 'gtk-cancel' => 'none');
4465 $dialog->set_select_multiple(1);4503 $dialog->set_select_multiple(1);
4466 for my $aref (@patterns)4504 FileChooser_add_filters($dialog,@patterns);
4467 { my $filter= Gtk2::FileFilter->new;
4468 if ($aref->[1]) { $filter->add_mime_type($_) for split / /,$aref->[1]; }
4469 if ($aref->[2]) { $filter->add_pattern($_) for split / /,$aref->[2]; }
4470 $filter->set_name($aref->[0]);
4471 $dialog->add_filter($filter);
4472 }
4473 if ($remember_key)4505 if ($remember_key)
4474 { my $path= decode_url($Options{$remember_key});4506 { my $path= decode_url($Options{$remember_key});
4475 $dialog->set_current_folder($path);4507 $dialog->set_current_folder($path);
@@ -4495,18 +4527,11 @@
4495 'gtk-ok' => 'ok',4527 'gtk-ok' => 'ok',
4496 'gtk-cancel' => 'none');4528 'gtk-cancel' => 'none');
44974529
4498 for my $aref4530 FileChooser_add_filters($dialog,
4499 ( [_"Pictures and music files",'image/*','*.mp3 *.flac *.m4a *.m4b *.ogg *.oga' ],4531 [_"Pictures and music files",'image/*','*.mp3 *.flac *.m4a *.m4b *.ogg *.oga' ],
4500 [_"Pictures files",'image/*'],4532 [_"Pictures files",'image/*'],
4501 [_"All files",undef,'*'],4533 [_"All files",undef,'*'],
4502 )4534 );
4503 { my $filter= Gtk2::FileFilter->new;
4504 #$filter->add_mime_type('image/'.$_) for qw/jpeg gif png bmp/;
4505 if ($aref->[1]) { $filter->add_mime_type($_) for split / /,$aref->[1]; }
4506 if ($aref->[2]) { $filter->add_pattern($_) for split / /,$aref->[2]; }
4507 $filter->set_name($aref->[0]);
4508 $dialog->add_filter($filter);
4509 }
45104535
4511 my $preview=Gtk2::VBox->new;4536 my $preview=Gtk2::VBox->new;
4512 my $label=Gtk2::Label->new;4537 my $label=Gtk2::Label->new;
@@ -4760,7 +4785,7 @@
4760 return unless @$IDs;4785 return unless @$IDs;
4761 my $text=(@$IDs==1)? "'".Songs::Display($IDs->[0],'file')."'" : __("%d file","%d files",scalar @$IDs);4786 my $text=(@$IDs==1)? "'".Songs::Display($IDs->[0],'file')."'" : __("%d file","%d files",scalar @$IDs);
4762 my $dialog = Gtk2::MessageDialog->new4787 my $dialog = Gtk2::MessageDialog->new
4763 ( undef,4788 ( ::get_event_window(),
4764 'modal',4789 'modal',
4765 'warning','cancel','%s',4790 'warning','cancel','%s',
4766 __x(_("About to delete {files}\nAre you sure ?"), files => $text)4791 __x(_("About to delete {files}\nAre you sure ?"), files => $text)
@@ -5454,19 +5479,17 @@
5454 return @IDs;5479 return @IDs;
5455}5480}
54565481
5457sub MakeScanRegex #FIXME5482sub MakeScanRegex
5458{ my $s;5483{ my %ext; $ext{$_}=1 for @ScanExt;
5459 if ($Options{ScanPlayOnly})5484 my $ignore= $Options{ScanIgnore} || [];
5460 { my %ext; $ext{$_}=1 for ($PlayNext_package||$Play_package)->supported_formats;5485 delete $ext{$_} for @$ignore;
5461 $ext{$_}=1 for grep $ext{$Alias_ext{$_}}, keys %Alias_ext;5486 my $re=join '|', sort keys %ext;
5462 $s=join '|',keys %ext;5487 warn "Scan regular expression is empty\n" unless $re;
5463 }5488 $ScanRegex=qr/\.(?:$re)$/i;
5464 else { $s='mp3|ogg|oga|flac|mpc|ape|wv|m4a|m4b'; } #FIXME find a better way
5465 $ScanRegex=qr/\.(?:$s)$/i;
5466}5489}
54675490
5468sub ScanFolder5491sub ScanFolder
5469{ warn "ScanFolder(@_)\n";5492{ warn "Scanning : @_\n" if $Verbose;
5470 my $dir=$_[0];5493 my $dir=$_[0];
5471 $dir=~s#^file://##;5494 $dir=~s#^file://##;
5472 MakeScanRegex() unless $ScanRegex;5495 MakeScanRegex() unless $ScanRegex;
@@ -6165,47 +6188,6 @@
6165}6188}
6166sub Set_replaygain { $Play_package->RG_set_options() if $Play_package->can('RG_set_options'); }6189sub Set_replaygain { $Play_package->RG_set_options() if $Play_package->can('RG_set_options'); }
61676190
6168sub pref_artists_update_desc
6169{ my $button=shift;
6170 my $hash= $button->{hash};
6171 my $key= $button->{key};
6172 my $text= join ' ',map $hash->{$_}||=qq("$_"), @{ $Options{$key} };
6173 $text||= $button->{empty};
6174 unless ($button->{label})
6175 { my $label= $button->{label}= Gtk2::Label->new;
6176 #$label->set_ellipsize('end');
6177 my $hbox=Gtk2::HBox->new(0,0);
6178 $hbox->pack_start($label,1,1,2);
6179 $hbox->pack_start($_,0,0,2) for Gtk2::VSeparator->new, Gtk2::Arrow->new('down','none');
6180 $button->add($hbox);
6181 }
6182 $button->{label}->set_text($text);
6183}
6184sub pref_artists_change_cb
6185{ my $button= $_[0]{button};
6186 my $key= $button->{key};
6187 my $l= $Options{$key};
6188 my $before=@$l;
6189 @$l= grep $_ ne $_[1], @$l;
6190 push @$l,$_[1] if $before==@$l;
6191 @$l= sort @$l;
6192 pref_artists_update_desc($button);
6193 Songs::UpdateArtistsRE();
6194}
6195sub pref_artists_button_cb
6196{ my ($button,$event)=@_;
6197 my $menu=BuildChoiceMenu
6198 ( $button->{hash},
6199 check=> sub { $Options{$_[0]{button}{key}} },
6200 code => \&pref_artists_change_cb,
6201 'reverse'=>1,
6202 args => {button=>$button},
6203 );
6204 PopupMenu($menu,event=>$event);
6205 1;
6206}
6207
6208
6209sub PrefMisc6191sub PrefMisc
6210{ #Default rating6192{ #Default rating
6211 my $DefRating=NewPrefSpinButton('DefaultRating',0,100, step=>10, page=>20, text=>_"Default rating : %d %", cb=> sub6193 my $DefRating=NewPrefSpinButton('DefaultRating',0,100, step=>10, page=>20, text=>_"Default rating : %d %", cb=> sub
@@ -6231,24 +6213,13 @@
6231 my $shutentry=NewPrefEntry(Shutdown_cmd => _"Shutdown command :", tip => _"Command used when\n'turn off computer when queue empty'\nis selected", cb=> \&Update_QueueActionList);6213 my $shutentry=NewPrefEntry(Shutdown_cmd => _"Shutdown command :", tip => _"Command used when\n'turn off computer when queue empty'\nis selected", cb=> \&Update_QueueActionList);
62326214
6233 #artist splitting6215 #artist splitting
6234 my $asplit_label= Gtk2::Label->new(_"Split artist names on :");6216 my $asplit= NewPrefMultiCombo( Artists_split_re=>\%Artists_split,
6235 my $asplit=Gtk2::Button->new;6217 text=>_"Split artist names on :", tip=>_"Used for the Artists field", separator=> ' ',
6236 $asplit->set_tooltip_text(_"Used for the Artists field");6218 empty=>_"no splitting", cb=>\&Songs::UpdateArtistsRE );
6237 $asplit->{hash}= \%Artists_split;
6238 $asplit->{key}= 'Artists_split_re';
6239 $asplit->{empty}= _"no splitting";
6240 pref_artists_update_desc($asplit);
6241 $asplit->signal_connect(button_press_event=> \&pref_artists_button_cb);
6242
6243 #artist in title6219 #artist in title
6244 my $atitle_label= Gtk2::Label->new(_"Extract guest artist from title :");6220 my $atitle= NewPrefMultiCombo( Artists_title_re=>\%Artists_from_title,
6245 my $atitle=Gtk2::Button->new;6221 text=>_"Extract guest artist from title :", tip=>_"Used for the Artists field", separator=> ' ',
6246 $atitle->set_tooltip_text(_"Used for the Artists field");6222 empty=>_"ignore title", cb=>\&Songs::UpdateArtistsRE );
6247 $atitle->{hash}= \%Artists_from_title;
6248 $atitle->{key}= 'Artists_title_re';
6249 $atitle->{empty}= _"ignore title";
6250 pref_artists_update_desc($atitle);
6251 $atitle->signal_connect(button_press_event=> \&pref_artists_button_cb);
62526223
6253 #date format6224 #date format
6254 my $dateex= mktime(5,4,3,2,0,(localtime)[5]);6225 my $dateex= mktime(5,4,3,2,0,(localtime)[5]);
@@ -6278,7 +6249,7 @@
6278 my $playedpercent= NewPrefSpinButton('PlayedMinPercent' ,0,100, text=>_"Threshold to count a song as played : %d %");6249 my $playedpercent= NewPrefSpinButton('PlayedMinPercent' ,0,100, text=>_"Threshold to count a song as played : %d %");
6279 my $playedseconds= NewPrefSpinButton('PlayedMinSeconds' ,0,99999,text=>_"or %d seconds");6250 my $playedseconds= NewPrefSpinButton('PlayedMinSeconds' ,0,99999,text=>_"or %d seconds");
62806251
6281 my $vbox= Vpack( $checkR1,$checkR2,$checkR4, $DefRating,$ProxyCheck, [$asplit_label, $asplit],[$atitle_label, $atitle],6252 my $vbox= Vpack( $checkR1,$checkR2,$checkR4, $DefRating,$ProxyCheck, $asplit, $atitle,
6282 [0,$datealign,$preview], $screensaver,$shutentry, $always_in_pl,6253 [0,$datealign,$preview], $screensaver,$shutentry, $always_in_pl,
6283 $recent_include_not_played, $volstep, $pixcache,6254 $recent_include_not_played, $volstep, $pixcache,
6284 [ $playedpercent, $playedseconds ],6255 [ $playedpercent, $playedseconds ],
@@ -6442,7 +6413,7 @@
6442{ my $parent=shift;6413{ my $parent=shift;
6443 $parent=~s/([^$QSLASH]+)$//o;6414 $parent=~s/([^$QSLASH]+)$//o;
6444 my $folder=$1;6415 my $folder=$1;
6445 my $new=ChooseDir(_"Move folder to",$parent);6416 my $new=ChooseDir(_"Move folder to", path=>$parent);
6446 return unless $new;6417 return unless $new;
6447 my $old=$parent.$folder.SLASH;6418 my $old=$parent.$folder.SLASH;
6448 $new.=SLASH.$folder.SLASH;6419 $new.=SLASH.$folder.SLASH;
@@ -6513,7 +6484,10 @@
6513 $sw->set_policy ('automatic', 'automatic');6484 $sw->set_policy ('automatic', 'automatic');
6514 $sw->add($treeview);6485 $sw->add($treeview);
65156486
6516 my $Cscanall=NewPrefCheckButton(ScanPlayOnly => _"Do not add songs that can't be played", cb=>sub {$ScanRegex=undef});6487 my $extensions= NewPrefMultiCombo(ScanIgnore => {map {$_=>$_} @ScanExt},
6488 text=>_"Ignored file extensions :", tip=>_"Files with these extensions won't be added", empty=>_"none",
6489 cb=>sub {$ScanRegex=undef}, );
6490
6517 my $CScan=NewPrefCheckButton(StartScan => _"Search for new songs on startup");6491 my $CScan=NewPrefCheckButton(StartScan => _"Search for new songs on startup");
6518 my $CCheck=NewPrefCheckButton(StartCheck => _"Check for updated/deleted songs on startup");6492 my $CCheck=NewPrefCheckButton(StartCheck => _"Check for updated/deleted songs on startup");
6519 my $BScan= NewIconButton('gtk-refresh',_"scan now", sub { IdleScan(); });6493 my $BScan= NewIconButton('gtk-refresh',_"scan now", sub { IdleScan(); });
@@ -6557,7 +6531,7 @@
6557 [$addbut,$rmdbut,'-',$reorg],6531 [$addbut,$rmdbut,'-',$reorg],
6558 [$CCheck,'-',$BCheck],6532 [$CCheck,'-',$BCheck],
6559 [$CScan,'-',$BScan],6533 [$CScan,'-',$BScan],
6560 $Cscanall,6534 $extensions,
6561 $autoremove,6535 $autoremove,
6562 [$lengthcheck,'-',$Blengthcheck],6536 [$lengthcheck,'-',$Blengthcheck],
6563 $masterfiltercheck,6537 $masterfiltercheck,
@@ -6567,7 +6541,8 @@
6567}6541}
6568sub ChooseAddPath6542sub ChooseAddPath
6569{ my ($addtolibrary,$allowfiles)=@_;6543{ my ($addtolibrary,$allowfiles)=@_;
6570 my @dirs=ChooseDir(_"Choose folder to add",undef,undef,'LastFolder_Add',1,$allowfiles);6544 $allowfiles&&= [ [_"Music files", undef, join(' ',map "*.$_", sort @ScanExt) ], [_"All files",undef,'*'] ];
6545 my @dirs=ChooseDir(_"Choose folder to add", remember_key=>'LastFolder_Add', multiple=>1, allowfiles=>$allowfiles);
6571 @dirs=map url_escape($_), @dirs;6546 @dirs=map url_escape($_), @dirs;
6572 AddPath($addtolibrary,@dirs);6547 AddPath($addtolibrary,@dirs);
6573}6548}
@@ -6605,7 +6580,7 @@
6605 my $IDlist= Songs::MakeFilterFromGID($field,$gid)->filter;6580 my $IDlist= Songs::MakeFilterFromGID($field,$gid)->filter;
6606 if (my $nb=@$IDlist)6581 if (my $nb=@$IDlist)
6607 { my $dialog = Gtk2::MessageDialog->new6582 { my $dialog = Gtk2::MessageDialog->new
6608 ( undef, #FIXME6583 ( ::get_event_window(),
6609 [qw/modal destroy-with-parent/],6584 [qw/modal destroy-with-parent/],
6610 'warning','ok-cancel',6585 'warning','ok-cancel',
6611 __("This label is set for %d song.","This label is set for %d songs.",$nb)."\n".6586 __("This label is set for %d song.","This label is set for %d songs.",$nb)."\n".
@@ -6679,7 +6654,7 @@
6679 my ($label,$nb)=$store->get_value($iter);6654 my ($label,$nb)=$store->get_value($iter);
6680 if ($nb)6655 if ($nb)
6681 { my $dialog = Gtk2::MessageDialog->new6656 { my $dialog = Gtk2::MessageDialog->new
6682 ( undef, #FIXME6657 ( $treeview->get_toplevel,
6683 [qw/modal destroy-with-parent/],6658 [qw/modal destroy-with-parent/],
6684 'warning','ok-cancel','%s',6659 'warning','ok-cancel','%s',
6685 __("This label is set for %d song.","This label is set for %d songs.",$nb)."\n".6660 __("This label is set for %d song.","This label is set for %d songs.",$nb)."\n".
@@ -6902,7 +6877,7 @@
6902 &$cb if $cb;6877 &$cb if $cb;
6903 });6878 });
6904 $button->signal_connect( clicked => sub6879 $button->signal_connect( clicked => sub
6905 { my $file= $folder? ChooseDir($text,$Options{$key}) : undef;6880 { my $file= $folder? ChooseDir($text, path=>$Options{$key}) : undef;
6906 return unless $file;6881 return unless $file;
6907 # could simply $entry->set_text(), but wouldn't work with filenames with broken encoding6882 # could simply $entry->set_text(), but wouldn't work with filenames with broken encoding
6908 SetOption( $key, url_escape($file) );6883 SetOption( $key, url_escape($file) );
@@ -6973,15 +6948,66 @@
6973 my $combo= NewPrefCombo($key => $buildlist, text => $text, sizeg1=>$sg1,sizeg2=>$sg2, tree=>1, cb => $cb, event=>'Layouts');6948 my $combo= NewPrefCombo($key => $buildlist, text => $text, sizeg1=>$sg1,sizeg2=>$sg2, tree=>1, cb => $cb, event=>'Layouts');
6974 my $set_tooltip= sub #show layout author in tooltip6949 my $set_tooltip= sub #show layout author in tooltip
6975 { return if $_[1] && $_[1] ne $key;6950 { return if $_[1] && $_[1] ne $key;
6976 my $author= $Layout::Layouts{$Options{$key}}{Author};6951 my $layoutdef= $Layout::Layouts{$Options{$key}};
6977 $author&&= _("by").' '.$author;6952 my $tip= $layoutdef->{PATH}.$layoutdef->{FILE}.':'.$layoutdef->{LINE};
6978 $_[0]->set_tooltip_text($author);6953 if (my $author= $layoutdef->{Author}) { $tip= _("by")." $author\n$tip"; }
6954 $_[0]->set_tooltip_text($tip);
6979 };6955 };
6980 Watch( $combo, Option => $set_tooltip);6956 Watch( $combo, Option => $set_tooltip);
6981 $set_tooltip->($combo);6957 $set_tooltip->($combo);
6982 return $combo;6958 return $combo;
6983}6959}
69846960
6961sub NewPrefMultiCombo
6962{ my ($key,$possible_values_hash,%opt)=@_;
6963 my $sep= $opt{separator}|| ', ';
6964 my $display_cb= $opt{display} || sub
6965 { my $values= $Options{$key} || [];
6966 return $opt{empty} unless @$values;
6967 return join $sep,map $possible_values_hash->{$_}||=qq("$_"), @$values;
6968 };
6969 $display_cb= sub {$opt{display}} if !ref $display_cb; # label in the button is a constant
6970 my $button= Gtk2::Button->new;
6971
6972 my $label_value= Gtk2::Label->new;
6973 #$label_value->set_ellipsize('end');
6974 my $hbox=Gtk2::HBox->new(0,0);
6975 $hbox->pack_start($label_value,1,1,2);
6976 $hbox->pack_start($_,0,0,2) for Gtk2::VSeparator->new, Gtk2::Arrow->new('down','none');
6977 $button->add($hbox);
6978 $label_value->set_text( $display_cb->() );
6979
6980 my $change_cb=sub
6981 { my $button= $_[0]{button};
6982 $Options{$key}= $_[1];
6983 $label_value->set_text( $display_cb->() );
6984 $opt{cb}->() if $opt{cb};
6985 };
6986 my $click_cb=sub
6987 { my ($button,$event)=@_;
6988 my $menu=BuildChoiceMenu
6989 ( $possible_values_hash,
6990 check=> sub { $Options{$key}||[] },
6991 code => $change_cb,
6992 'reverse'=>1, return_list=>1,
6993 args => {button=>$button},
6994 );
6995 PopupMenu($menu,event=>$event);
6996 1;
6997 };
6998
6999 $button->signal_connect(button_press_event=> \&$click_cb);
7000 my $widget=$button;
7001 if (defined $opt{text})
7002 { my $hbox0= Gtk2::HBox->new;
7003 my $label= Gtk2::Label->new($opt{text});
7004 $hbox0->pack_start($_, FALSE, FALSE, 2) for $label,$button;
7005 $widget=$hbox0;
7006 }
7007 $widget->set_tooltip_text($opt{tip}) if $opt{tip};
7008 return $widget;
7009}
7010
6985sub NewIconButton7011sub NewIconButton
6986{ my ($icon,$text,$coderef,$style,$tip)=@_;7012{ my ($icon,$text,$coderef,$style,$tip)=@_;
6987 my $but=Gtk2::Button->new;7013 my $but=Gtk2::Button->new;
@@ -8727,7 +8753,7 @@
8727 $entry->signal_connect(activate=> \&GMB::FilterBox::activate);8753 $entry->signal_connect(activate=> \&GMB::FilterBox::activate);
8728 $button->signal_connect( clicked => sub8754 $button->signal_connect( clicked => sub
8729 { my $self=$_[0]->parent;8755 { my $self=$_[0]->parent;
8730 my $folder= ::ChooseDir(_"Choose a folder", $self->{value});8756 my $folder= ::ChooseDir(_"Choose a folder", path=>$self->{value});
8731 return unless $folder;8757 return unless $folder;
8732 $busy=1;8758 $busy=1;
8733 $self->Set( ::url_escape($folder) );8759 $self->Set( ::url_escape($folder) );
87348760
=== modified file '.pc/shimmer-layouts/gmusicbrowser_layout.pm'
--- .pc/shimmer-layouts/gmusicbrowser_layout.pm 2014-01-25 14:17:08 +0000
+++ .pc/shimmer-layouts/gmusicbrowser_layout.pm 2014-02-15 20:02:02 +0000
@@ -757,35 +757,36 @@
757757
758sub ReadLayoutFile758sub ReadLayoutFile
759{ my $file=shift;759{ my $file=shift;
760 my $path=$file; $path=~s#[^/]+$##;
761 return unless -f $file;760 return unless -f $file;
762 open my$fh,"<:utf8",$file or do { warn $!; return };761 open my$fh,"<:utf8",$file or do { warn $!; return };
763 my $first;762 my $first;
763 my $linecount=0; my ($linefirst,$linenext);
764 while (1)764 while (1)
765 { my ($next,$longline);765 { my ($next,$longline);
766 my @lines=($first);766 my @lines=($first);
767 while (local $_=<$fh>)767 while (local $_=<$fh>)
768 { s#^\s+##;768 { $linecount++;
769 s#^\s+##;
769 next if m/^#/;770 next if m/^#/;
770 s#\s*[\n\r]+$##;771 s#\s*[\n\r]+$##;
771 if (s#\\$##) {$longline.=$_;next}772 if (s#\\$##) {$longline.=$_;next}
772 next if $_ eq '';773 next if $_ eq '';
773 if ($longline) {$_=$longline.$_;undef $longline;}774 if ($longline) {$_=$longline.$_;undef $longline;}
774 if (m#^[{[]#) {$next=$_;last}775 if (m#^[{[]#) { $next=$_; $linenext=$linecount; last}
775 push @lines,$_;776 push @lines,$_;
776 }777 }
777 if ($first)778 if ($first)
778 { if ($first=~m#^\[#) {ParseLayout(\@lines,$path)}779 { if ($first=~m#^\[#) {ParseLayout(\@lines,$file,$linefirst)}
779 else {ParseSongTreeSkin(\@lines)}780 else {ParseSongTreeSkin(\@lines)}
780 }781 }
781 $first=$next;782 $first=$next; $linefirst=$linenext;
782 last unless $first;783 last unless $first;
783 }784 }
784 close $fh;785 close $fh;
785}786}
786787
787sub ParseLayout788sub ParseLayout
788{ my ($lines,$path)=@_;789{ my ($lines,$file,$line)=@_;
789 my $first=shift @$lines;790 my $first=shift @$lines;
790 my $name;791 my $name;
791 if ($first=~m/^\[([^]=]+)\](?:\s*based on (.+))?$/)792 if ($first=~m/^\[([^]=]+)\](?:\s*based on (.+))?$/)
@@ -809,7 +810,10 @@
809 for my $key (qw/Name Category Title/)810 for my $key (qw/Name Category Title/)
810 { $Layouts{$name}{$key}=~s/^"(.*)"$/$1/ if $Layouts{$name}{$key}; #remove quotes from layout name and category811 { $Layouts{$name}{$key}=~s/^"(.*)"$/$1/ if $Layouts{$name}{$key}; #remove quotes from layout name and category
811 }812 }
813 my $path=$file; $path=~s#([^/]+)$##; $file=$1;
812 $Layouts{$name}{PATH}=$path;814 $Layouts{$name}{PATH}=$path;
815 $Layouts{$name}{FILE}=$file;
816 $Layouts{$name}{LINE}=$line;
813}817}
814818
815sub ParseSongTreeSkin819sub ParseSongTreeSkin
@@ -858,6 +862,8 @@
858 %default= @optlist;862 %default= @optlist;
859 }863 }
860 $_=::ParseOptions($_) for values %default;864 $_=::ParseOptions($_) for values %default;
865 $default{DEFAULT_OPTIONS}=1;
866 $default{Window}{DEFAULT_OPTIONS}=1;
861 return \%default;867 return \%default;
862}868}
863869
@@ -1802,6 +1808,9 @@
1802 my (undef,undef,$monitorwidth,$monitorheight)=$screen->get_monitor_geometry($monitor)->values;1808 my (undef,undef,$monitorwidth,$monitorheight)=$screen->get_monitor_geometry($monitor)->values;
1803 $w= $1*$monitorwidth/100 if $w=~m/(\d+)%/;1809 $w= $1*$monitorwidth/100 if $w=~m/(\d+)%/;
1804 $h= $1*$monitorheight/100 if $h=~m/(\d+)%/;1810 $h= $1*$monitorheight/100 if $h=~m/(\d+)%/;
1811 if ($self->{options}{DEFAULT_OPTIONS}) { $monitorwidth-=40; $monitorheight-=80; } # if using default layout size, reserve some space for potential panels and decorations
1812 $w=$monitorwidth if $w>$monitorwidth;
1813 $h=$monitorheight if $h>$monitorheight;
1805 if ($self->{fixedsize})1814 if ($self->{fixedsize})
1806 { $w=-1 if $w<1; # -1 => do not override default minimum size1815 { $w=-1 if $w<1; # -1 => do not override default minimum size
1807 $h=-1 if $h<1;1816 $h=-1 if $h<1;
@@ -2581,7 +2590,7 @@
2581}2590}
25822591
2583sub newbutton_cb2592sub newbutton_cb
2584{ my $self= ::find_ancestor($_[0],__PACKAGE__);2593{ my $self= ::find_ancestor($_[0],__PACKAGE__);
2585 ::PopupContextMenu(\@contextmenu, { self=>$self, type=>$self->{typesubmenu}, usemenupos=>1 } );2594 ::PopupContextMenu(\@contextmenu, { self=>$self, type=>$self->{typesubmenu}, usemenupos=>1 } );
2586 1;2595 1;
2587}2596}
@@ -4044,7 +4053,7 @@
4044 }4053 }
4045}4054}
4046sub SaveOptions4055sub SaveOptions
4047{ my $self=shift,4056{ my $self=shift;
4048 my %opt;4057 my %opt;
4049 if (my $cats=$self->{cats})4058 if (my $cats=$self->{cats})
4050 { $opt{collapsed}= $self->{collapsed}= join ' ', sort grep !$cats->{$_}->get_expanded, keys %$cats;4059 { $opt{collapsed}= $self->{collapsed}= join ' ', sort grep !$cats->{$_}->get_expanded, keys %$cats;
40514060
=== modified file '.pc/shimmer-layouts/gmusicbrowser_list.pm'
--- .pc/shimmer-layouts/gmusicbrowser_list.pm 2014-01-25 14:17:08 +0000
+++ .pc/shimmer-layouts/gmusicbrowser_list.pm 2014-02-15 20:02:02 +0000
@@ -311,6 +311,8 @@
311 my $watchedarray= $songlist && $songlist->{array};311 my $watchedarray= $songlist && $songlist->{array};
312 return if !$watchedarray || ($array && $watchedarray!=$array);312 return if !$watchedarray || ($array && $watchedarray!=$array);
313 $self->{bclear}->set_sensitive(scalar @$watchedarray);313 $self->{bclear}->set_sensitive(scalar @$watchedarray);
314 $self->set_sensitive( !$songlist->{autoupdate} );
315 $self->set_visible( !$songlist->{autoupdate} );
314}316}
315317
316sub SelectionChanged318sub SelectionChanged
@@ -533,8 +535,6 @@
533 }535 }
534 $self->{filter}=$filter;536 $self->{filter}=$filter;
535 return if $self->{ignoreSetFilter};537 return if $self->{ignoreSetFilter};
536
537 #if ($self->{type} eq 'A') { $self->{array}->SetFilter($filter); return } #FIXME needs a PlayFilter with multiple levels to work correctly
538 $self->{array}->SetSortAndFilter($self->{sort},$filter);538 $self->{array}->SetSortAndFilter($self->{sort},$filter);
539}539}
540sub Empty540sub Empty
@@ -560,10 +560,20 @@
560}560}
561sub RemoveSelected561sub RemoveSelected
562{ my $self=shift;562{ my $self=shift;
563 return if $self->{autoupdate}; #can't remove selection from an always-filtered list
563 my $songarray=$self->{array};564 my $songarray=$self->{array};
564 $songarray->Remove($self->GetSelectedRows);565 $songarray->Remove($self->GetSelectedRows);
565}566}
566567
568sub PopupContextMenu
569{ my $self=shift;
570 #return unless @{$self->{array}}; #no context menu for empty lists
571 my @IDs=$self->GetSelectedIDs;
572 my %args=(self => $self, mode => $self->{type}, IDs => \@IDs, listIDs => $self->{array});
573 $args{allowremove}=1 unless $self->{autoupdate};
574 ::PopupContextMenu(\@::SongCMenu,\%args);
575}
576
567sub MoveUpDown577sub MoveUpDown
568{ my ($self,$up,$max)=@_;578{ my ($self,$up,$max)=@_;
569 my $songarray=$self->{array};579 my $songarray=$self->{array};
@@ -1086,14 +1096,6 @@
1086 1;1096 1;
1087}1097}
10881098
1089sub PopupContextMenu
1090{ my ($self,$tv,$event)=@_;
1091 #return unless @{$self->{array}}; #no context menu for empty lists
1092 my @IDs=$self->GetSelectedIDs;
1093 my %args=(self => $self, mode => $self->{type}, IDs => \@IDs, listIDs => $self->{array});
1094 ::PopupContextMenu(\@::SongCMenu,\%args );
1095}
1096
1097sub GetCurrentRow1099sub GetCurrentRow
1098{ my $self=shift;1100{ my $self=shift;
1099 my $tv=$self->child;1101 my $tv=$self->child;
@@ -1556,7 +1558,7 @@
1556 #$sel->select_path($path);1558 #$sel->select_path($path);
1557 $tv->set_cursor($path);1559 $tv->set_cursor($path);
1558 }1560 }
1559 $self->PopupContextMenu($tv,$event);1561 $self->PopupContextMenu;
1560 return 1;1562 return 1;
1561 }1563 }
1562 return 0; #let the event propagate1564 return 0; #let the event propagate
@@ -1739,7 +1741,7 @@
1739 },1741 },
1740 { label=> _"Remove label", stockicon => 'gtk-remove',1742 { label=> _"Remove label", stockicon => 'gtk-remove',
1741 code => sub { my $gid=$_[0]{gidlist}[0]; ::RemoveLabel($_[0]{field},$gid); },1743 code => sub { my $gid=$_[0]{gidlist}[0]; ::RemoveLabel($_[0]{field},$gid); },
1742 onlyone=> 'gidlist', test => sub { $_[0]{field} eq 'label' }, #FIXME ? label specific1744 onlyone=> 'gidlist', test => sub { $_[0]{field} eq 'label' && $_[0]{gidlist}[0] !=0 }, #FIXME make it generic rather than specific to field label ? #FIXME find a better way to chack if gid is special than comparing it to 0
1743 },1745 },
1744# { separator=>1 },1746# { separator=>1 },
1745 { label => _"Options", submenu => \@MenuPageOptions, stock => 'gtk-preferences', isdefined => 'field' },1747 { label => _"Options", submenu => \@MenuPageOptions, stock => 'gtk-preferences', isdefined => 'field' },
@@ -2095,7 +2097,7 @@
2095}2097}
20962098
2097sub PopupContextMenu2099sub PopupContextMenu
2098{ my ($page,$event,$hash,$menu)=@_;2100{ my ($page,$hash,$menu)=@_;
2099 my $self=::find_ancestor($page,__PACKAGE__);2101 my $self=::find_ancestor($page,__PACKAGE__);
2100 $hash->{filterpane}=$self;2102 $hash->{filterpane}=$self;
2101 $menu||=\@cMenu;2103 $menu||=\@cMenu;
@@ -2103,8 +2105,7 @@
2103}2105}
21042106
2105sub PopupOpt #Only for FilterList #FIXME should be moved in FilterList::, and/or use a common function with FilterList::PopupContextMenu2107sub PopupOpt #Only for FilterList #FIXME should be moved in FilterList::, and/or use a common function with FilterList::PopupContextMenu
2106{ my ($but,$event)=@_;2108{ my $self=::find_ancestor($_[0],__PACKAGE__);
2107 my $self=::find_ancestor($but,__PACKAGE__);
2108 my $nb=$self->{notebook};2109 my $nb=$self->{notebook};
2109 my $page=$nb->get_nth_page( $nb->get_current_page );2110 my $page=$nb->get_nth_page( $nb->get_current_page );
2110 my $field=$page->{field}[0];2111 my $field=$page->{field}[0];
@@ -2548,13 +2549,12 @@
2548}2549}
25492550
2550sub PopupContextMenu2551sub PopupContextMenu
2551{ my ($self,undef,$event)=@_;2552{ my $self=::find_ancestor($_[0],__PACKAGE__);
2552 $self=::find_ancestor($self,__PACKAGE__);
2553 my ($field,$gidlist)=$self->get_selected_list;2553 my ($field,$gidlist)=$self->get_selected_list;
2554 my $mainfield=Songs::MainField($field);2554 my $mainfield=Songs::MainField($field);
2555 my $aa= ($mainfield eq 'artist' || $mainfield eq 'album') ? $mainfield : undef; #FIXME2555 my $aa= ($mainfield eq 'artist' || $mainfield eq 'album') ? $mainfield : undef; #FIXME
2556 my $mode= uc(substr $self->{mode},0,1); # C => cloud, M => mosaic, L => list2556 my $mode= uc(substr $self->{mode},0,1); # C => cloud, M => mosaic, L => list
2557 FilterPane::PopupContextMenu($self,$event,{ self=> $self, filter => $self->get_selected_filters, field => $field, aa => $aa, gidlist =>$gidlist, mode => $mode, subfield => $field, depth =>0 });2557 FilterPane::PopupContextMenu($self,{ self=> $self, filter => $self->get_selected_filters, field => $field, aa => $aa, gidlist =>$gidlist, mode => $mode, subfield => $field, depth =>0 });
2558}2558}
25592559
2560sub key_press_cb2560sub key_press_cb
@@ -2723,10 +2723,11 @@
2723 FilterPane::Activate($self,$button,$filter);2723 FilterPane::Activate($self,$button,$filter);
2724}2724}
2725sub PopupContextMenu2725sub PopupContextMenu
2726{ my ($self,$tv,$event)=@_;2726{ my $self=shift;
2727 my $tv=$self->{treeview};
2727 my @paths=_get_path_selection($tv);2728 my @paths=_get_path_selection($tv);
2728 my @raw= map ::decode_url($_), @paths;2729 my @raw= map ::decode_url($_), @paths;
2729 FilterPane::PopupContextMenu($self,$event,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });2730 FilterPane::PopupContextMenu($self,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });
2730}2731}
27312732
2732sub _get_path_selection2733sub _get_path_selection
@@ -2904,10 +2905,11 @@
2904 FilterPane::Activate($self,$button,$filter);2905 FilterPane::Activate($self,$button,$filter);
2905}2906}
2906sub PopupContextMenu2907sub PopupContextMenu
2907{ my ($self,$tv,$event)=@_;2908{ my $self=$_[0];
2909 my $tv=$self->{treeview};
2908 my @paths=_get_path_selection($tv);2910 my @paths=_get_path_selection($tv);
2909 my @raw= map ::decode_url($_), @paths;2911 my @raw= map ::decode_url($_), @paths;
2910 FilterPane::PopupContextMenu($self,$event,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });2912 FilterPane::PopupContextMenu($self,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });
2911}2913}
29122914
2913sub _get_path_selection2915sub _get_path_selection
@@ -3089,7 +3091,8 @@
3089}3091}
30903092
3091sub PopupContextMenu3093sub PopupContextMenu
3092{ my ($self,$tv,$event)=@_;3094{ my $self=shift;
3095 my $tv=$self->{treeview};
3093 my @rows=$tv->get_selection->get_selected_rows;3096 my @rows=$tv->get_selection->get_selected_rows;
3094 my $store=$tv->get_model;3097 my $store=$tv->get_model;
3095 my %sel;3098 my %sel;
@@ -3109,7 +3112,7 @@
3109 else { $args{mode}=''; }3112 else { $args{mode}=''; }
3110 my $songlist=::GetSonglist($self);3113 my $songlist=::GetSonglist($self);
3111 $args{songlist}=$songlist if $songlist;3114 $args{songlist}=$songlist if $songlist;
3112 FilterPane::PopupContextMenu($self,$event,\%args, [@cMenu,{ separator=>1 },@FilterPane::cMenu] );3115 FilterPane::PopupContextMenu($self,\%args, [@cMenu,{ separator=>1 },@FilterPane::cMenu] );
3113}3116}
31143117
3115sub drag_motion_cb3118sub drag_motion_cb
@@ -3383,6 +3386,7 @@
3383 #return if $self->{Sel} == $key;3386 #return if $self->{Sel} == $key;
3384 if (defined $key) { $self->{Sel}=$key; }3387 if (defined $key) { $self->{Sel}=$key; }
3385 else { $key=$self->{Sel}; }3388 else { $key=$self->{Sel}; }
3389 return unless defined $key;
3386 my $aa=$self->{aa};3390 my $aa=$self->{aa};
3387 $self->pic_update;3391 $self->pic_update;
3388 $self->{Ltitle}->set_markup( AA::ReplaceFields($key,"<big><b>%a</b></big>",$aa,1) );3392 $self->{Ltitle}->set_markup( AA::ReplaceFields($key,"<big><b>%a</b></big>",$aa,1) );
@@ -3432,6 +3436,7 @@
3432sub setpic3436sub setpic
3433{ my $img=shift;3437{ my $img=shift;
3434 my $self= ::find_ancestor($img,__PACKAGE__);3438 my $self= ::find_ancestor($img,__PACKAGE__);
3439 return unless defined $self->{SelID};
3435 my $file= $img->{filename}= AAPicture::GetPicture($self->{aa},$self->{Sel});3440 my $file= $img->{filename}= AAPicture::GetPicture($self->{aa},$self->{Sel});
3436 my $pixbuf= $file ? GMB::Picture::pixbuf($file,$img->{size}) : undef;3441 my $pixbuf= $file ? GMB::Picture::pixbuf($file,$img->{size}) : undef;
3437 $img->set_from_pixbuf($pixbuf);3442 $img->set_from_pixbuf($pixbuf);
@@ -3494,7 +3499,7 @@
3494);3499);
3495our @DefaultOptions=3500our @DefaultOptions=
3496( nb => 1,3501( nb => 1,
3497 fields => $SelectorMenu[0][1],3502 fields => $SelectorMenu[2][1],
3498 autofilter =>1,3503 autofilter =>1,
3499);3504);
35003505
@@ -3566,14 +3571,6 @@
3566 $self->{$key}=$value;3571 $self->{$key}=$value;
3567 $self->DoFilter unless $self->get_text eq '';3572 $self->DoFilter unless $self->get_text eq '';
3568}3573}
3569sub ToggleField
3570{ my ($self,$field)=@_;
3571 my @list= split /\|/,$self->{fields};
3572 my $nb=@list;
3573 @list= grep $_ ne $field, @list; #remove
3574 push @list,$field if $nb==@list; #add if not removed
3575 $self->ChangeOption(fields=> join '|',@list );
3576}
35773574
3578sub PopupSelectorMenu3575sub PopupSelectorMenu
3579{ my $self=shift;3576{ my $self=shift;
@@ -3590,9 +3587,9 @@
3590 my $item1=Gtk2::MenuItem->new(_"Select search fields");3587 my $item1=Gtk2::MenuItem->new(_"Select search fields");
3591 $item1->set_submenu( ::BuildChoiceMenu(3588 $item1->set_submenu( ::BuildChoiceMenu(
3592 { map { $_=>Songs::FieldName($_) } Songs::StringFields(),qw/file path year/,},3589 { map { $_=>Songs::FieldName($_) } Songs::StringFields(),qw/file path year/,},
3593 'reverse' =>1,3590 'reverse' =>1, return_list=>1,
3594 check=> sub { [split /\|/,$self->{fields}]; },3591 check=> sub { [split /\|/,$self->{fields}]; },
3595 code => sub { $self->ToggleField($_[1]); },3592 code => sub { $self->ChangeOption(fields=> join '|',@{$_[1]} ); },
3596 ) );3593 ) );
3597 $menu->append($item1);3594 $menu->append($item1);
3598 $menu->append(Gtk2::SeparatorMenuItem->new);3595 $menu->append(Gtk2::SeparatorMenuItem->new);
@@ -5451,8 +5448,7 @@
5451}5448}
54525449
5453sub PopupOpt5450sub PopupOpt
5454{ my ($widget,$event)=@_;5451{ my $self=::find_ancestor($_[0],__PACKAGE__);
5455 my $self=::find_ancestor($widget,__PACKAGE__);
5456 ::PopupContextMenu(\@OptionsMenu, { self=>$self, usemenupos => 1,} );5452 ::PopupContextMenu(\@OptionsMenu, { self=>$self, usemenupos => 1,} );
5457 return 1;5453 return 1;
5458}5454}
@@ -6587,10 +6583,7 @@
6587 { if ($answer && !defined $depth && !vec($self->{selected},$row,1))6583 { if ($answer && !defined $depth && !vec($self->{selected},$row,1))
6588 { $self->song_selected($event,$row);6584 { $self->song_selected($event,$row);
6589 }6585 }
6590 my @IDs=$self->GetSelectedIDs;6586 $self->PopupContextMenu;
6591 my %args=(self => $self, mode => $self->{type}, IDs => \@IDs, listIDs => $self->{array});
6592 ::PopupContextMenu(\@::SongCMenu,\%args );
6593
6594 return 1;6587 return 1;
6595 }6588 }
6596 else# ($but==1)6589 else# ($but==1)
65976590
=== modified file '.pc/shimmer-layouts/plugins/fetch_cover.pm'
--- .pc/shimmer-layouts/plugins/fetch_cover.pm 2014-01-25 14:17:08 +0000
+++ .pc/shimmer-layouts/plugins/fetch_cover.pm 2014-02-15 20:02:02 +0000
@@ -389,6 +389,7 @@
389sub searchresults_cb389sub searchresults_cb
390{ my ($self,$result)=@_;390{ my ($self,$result)=@_;
391 $self->{waiting}=undef;391 $self->{waiting}=undef;
392 warn "Getting results from $self->{url}\n" if $::Verbose;
392 unless (defined $result) { stop($self,_"connection failed."); return; }393 unless (defined $result) { stop($self,_"connection failed."); return; }
393 my $parse= $Sites{$self->{mainfield}}{$self->{site}}[2];394 my $parse= $Sites{$self->{mainfield}}{$self->{site}}[2];
394 my ($list,$nexturl)=$parse->($result,$self->{url},$self->{searchcontext});395 my ($list,$nexturl)=$parse->($result,$self->{url},$self->{searchcontext});
@@ -565,5 +566,3 @@
565566
56615671
567568
568__END__
569xml.amazon.com/onca/xml3?t=webservices-20&dev-t=%l&KeywordSearch=%s&mode=music&type=heavy&locale=us&page=1&f=xml
570569
=== modified file 'NEWS'
--- NEWS 2014-01-25 14:17:08 +0000
+++ NEWS 2014-02-15 20:02:02 +0000
@@ -1,3 +1,14 @@
1v1.1.12
2fix not being able to remove filters from lists in playlist mode
3fix performances problems with autoupdated lists
4fix some dialogs appearing below other windows
5fix creating windows bigger than screen
6replace "Do not add songs that can't be played" option by "Ignored file extensions" option
7export plugin: fix wrong encoding of certain file names in .m3u
8export plugin: export more fields in csv files
9don't print messages in normal operation, add -verbose option
10translation updates: Chinese(Taiwan), Finnish
11
1v1.1.1112v1.1.11
2improve search responsiveness (improve responsiveness of SimpleSearch)13improve search responsiveness (improve responsiveness of SimpleSearch)
3add auto-update mode that keeps browser lists sorted and filtered (on by default, can be disabled in the songlist/songtree option menu)14add auto-update mode that keeps browser lists sorted and filtered (on by default, can be disabled in the songlist/songtree option menu)
415
=== modified file 'debian/changelog'
--- debian/changelog 2014-01-25 14:17:08 +0000
+++ debian/changelog 2014-02-15 20:02:02 +0000
@@ -1,3 +1,9 @@
1gmusicbrowser (1.1.12-0ubuntu1) trusty; urgency=medium
2
3 * New upstream release.
4
5 -- Jackson Doak <noskcaj@ubuntu.com> Sun, 16 Feb 2014 06:55:42 +1100
6
1gmusicbrowser (1.1.11-1) unstable; urgency=medium7gmusicbrowser (1.1.11-1) unstable; urgency=medium
28
3 * New upstream release9 * New upstream release
410
=== modified file 'debian/control'
--- debian/control 2014-01-25 14:17:08 +0000
+++ debian/control 2014-02-15 20:02:02 +0000
@@ -1,7 +1,8 @@
1Source: gmusicbrowser1Source: gmusicbrowser
2Section: sound2Section: sound
3Priority: extra3Priority: extra
4Maintainer: Debian Multimedia Maintainers <pkg-multimedia-maintainers@lists.alioth.debian.org>4Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
5XSBC-Original-Maintainer: Debian Multimedia Maintainers <pkg-multimedia-maintainers@lists.alioth.debian.org>
5Uploaders:6Uploaders:
6 Antonio Radici <antonio@dyne.org>,7 Antonio Radici <antonio@dyne.org>,
7 Alessio Treglia <alessio@debian.org>,8 Alessio Treglia <alessio@debian.org>,
89
=== modified file 'debian/patches/shimmer-layouts'
--- debian/patches/shimmer-layouts 2014-01-25 14:17:08 +0000
+++ debian/patches/shimmer-layouts 2014-02-15 20:02:02 +0000
@@ -14,10 +14,10 @@
1414
15--- a/gmbrc.default15--- a/gmbrc.default
16+++ b/gmbrc.default16+++ b/gmbrc.default
17@@ -9,6 +9,16 @@17@@ -10,6 +10,16 @@
18 # of the plugin found at the top of the plugin file :
19 PLUGIN_LYRICS: 118 PLUGIN_LYRICS: 1
20 PLUGIN_FETCHCOVER: 119 PLUGIN_FETCHCOVER: 1
20 PLUGIN_AUTOSAVE: 1
21+PLUGIN_ARTISTINFO: 121+PLUGIN_ARTISTINFO: 1
22+PLUGIN_MPRIS2: 122+PLUGIN_MPRIS2: 1
23+23+
@@ -33,7 +33,7 @@
33 #Layout: Small player33 #Layout: Small player
34--- a/gmusicbrowser.pl34--- a/gmusicbrowser.pl
35+++ b/gmusicbrowser.pl35+++ b/gmusicbrowser.pl
36@@ -497,9 +497,9 @@ our @cMenuAA=36@@ -500,9 +500,9 @@ our @cMenuAA=
37 ( { label => _"Lock", code => sub { ToggleLock($_[0]{lockfield}); }, check => sub { $::TogLock && $::TogLock eq $_[0]{lockfield}}, mode => 'P',37 ( { label => _"Lock", code => sub { ToggleLock($_[0]{lockfield}); }, check => sub { $::TogLock && $::TogLock eq $_[0]{lockfield}}, mode => 'P',
38 test => sub { $_[0]{field} eq $_[0]{lockfield} || $_[0]{gid} == Songs::Get_gid($::SongID,$_[0]{lockfield}); },38 test => sub { $_[0]{field} eq $_[0]{lockfield} || $_[0]{gid} == Songs::Get_gid($::SongID,$_[0]{lockfield}); },
39 },39 },
@@ -105,7 +105,7 @@
105 event => 'Picture_artist',105 event => 'Picture_artist',
106 update => \&Layout::AAPicture::Changed,106 update => \&Layout::AAPicture::Changed,
107 noinit => 1,107 noinit => 1,
108@@ -1588,7 +1601,7 @@ use base 'Gtk2::Window';108@@ -1594,7 +1607,7 @@ use base 'Gtk2::Window';
109 sub new109 sub new
110 { my ($class,$layout,%options)=@_;110 { my ($class,$layout,%options)=@_;
111 my @original_args=@_;111 my @original_args=@_;
@@ -145,7 +145,7 @@
145 }145 }
146 146
147 ### selected functions147 ### selected functions
148@@ -1591,6 +1591,7 @@ our %Pages=148@@ -1593,6 +1593,7 @@ our %Pages=
149 our @MenuMarkupOptions=149 our @MenuMarkupOptions=
150 ( "%a",150 ( "%a",
151 "<b>%a</b>%Y\n<small>%s <small>%l</small></small>",151 "<b>%a</b>%Y\n<small>%s <small>%l</small></small>",
@@ -153,7 +153,7 @@
153 "<b>%a</b>%Y\n<small>%b</small>",153 "<b>%a</b>%Y\n<small>%b</small>",
154 "<b>%a</b>%Y\n<small>%b</small>\n<small>%s <small>%l</small></small>",154 "<b>%a</b>%Y\n<small>%b</small>\n<small>%s <small>%l</small></small>",
155 "<b>%y %a</b>",155 "<b>%y %a</b>",
156@@ -1607,6 +1608,7 @@ my @mpicsize_menu=156@@ -1609,6 +1610,7 @@ my @mpicsize_menu=
157 _("medium size") => 64,157 _("medium size") => 64,
158 _("big size") => 96,158 _("big size") => 96,
159 _("huge size") => 128,159 _("huge size") => 128,
@@ -161,7 +161,7 @@
161 );161 );
162 my @cloudstats_menu=162 my @cloudstats_menu=
163 ( _("number of songs") => 'count',163 ( _("number of songs") => 'count',
164@@ -3309,7 +3311,7 @@ sub new164@@ -3312,7 +3314,7 @@ sub new
165 my $BAlblist=::NewIconButton('gmb-playlist',undef,undef,'none');165 my $BAlblist=::NewIconButton('gmb-playlist',undef,undef,'none');
166 $BAlblist->signal_connect(button_press_event => \&AlbumListButton_press_cb);166 $BAlblist->signal_connect(button_press_event => \&AlbumListButton_press_cb);
167 $BAlblist->set_tooltip_text(_"Choose Album From this Artist");167 $BAlblist->set_tooltip_text(_"Choose Album From this Artist");
@@ -170,7 +170,7 @@
170 }170 }
171 171
172 my $drgsrc=$aa eq 'album' ? ::DRAG_ALBUM : ::DRAG_ARTIST;172 my $drgsrc=$aa eq 'album' ? ::DRAG_ALBUM : ::DRAG_ARTIST;
173@@ -4601,6 +4603,16 @@ sub button_press_cb173@@ -4598,6 +4600,16 @@ sub button_press_cb
174 else { $self->{pressed}=1; }174 else { $self->{pressed}=1; }
175 return 0;175 return 0;
176 }176 }
@@ -187,7 +187,7 @@
187 if ($but==3)187 if ($but==3)
188 { my ($i,$j,$key)=$self->coord_to_index($event->get_coords);188 { my ($i,$j,$key)=$self->coord_to_index($event->get_coords);
189 if (defined $key && !exists $self->{selected}{$key})189 if (defined $key && !exists $self->{selected}{$key})
190@@ -5526,7 +5538,7 @@ sub new190@@ -5522,7 +5534,7 @@ sub new
191 my $default= $::Options{"DefaultOptions_$name"} || {};191 my $default= $::Options{"DefaultOptions_$name"} || {};
192 192
193 %$opt=( @DefaultOptions, %$default, %$opt );193 %$opt=( @DefaultOptions, %$default, %$opt );
@@ -196,7 +196,7 @@
196 196
197 #create widgets used to draw the songtree as a treeview, would be nice to do without but it's not possible currently197 #create widgets used to draw the songtree as a treeview, would be nice to do without but it's not possible currently
198 $self->{stylewidget}=Gtk2::TreeView->new;198 $self->{stylewidget}=Gtk2::TreeView->new;
199@@ -5592,6 +5604,16 @@ sub new199@@ -5588,6 +5600,16 @@ sub new
200 $self->AddColumn($_) for split / +/,$opt->{cols};200 $self->AddColumn($_) for split / +/,$opt->{cols};
201 unless ($self->{cells}) { $self->AddColumn('title'); } #to ensure there is at least 1 column201 unless ($self->{cells}) { $self->AddColumn('title'); } #to ensure there is at least 1 column
202 202
203203
=== modified file 'gmbrc.default'
--- gmbrc.default 2011-03-23 19:23:40 +0000
+++ gmbrc.default 2014-02-15 20:02:02 +0000
@@ -9,6 +9,7 @@
9# of the plugin found at the top of the plugin file :9# of the plugin found at the top of the plugin file :
10PLUGIN_LYRICS: 110PLUGIN_LYRICS: 1
11PLUGIN_FETCHCOVER: 111PLUGIN_FETCHCOVER: 1
12PLUGIN_AUTOSAVE: 1
12PLUGIN_ARTISTINFO: 113PLUGIN_ARTISTINFO: 1
13PLUGIN_MPRIS2: 114PLUGIN_MPRIS2: 1
1415
1516
=== modified file 'gmusicbrowser.man'
--- gmusicbrowser.man 2012-02-08 00:33:53 +0000
+++ gmusicbrowser.man 2014-02-15 20:02:02 +0000
@@ -18,6 +18,7 @@
18[\-cfg FILE]18[\-cfg FILE]
19[\-fifo FIFO|\-nofifo]19[\-fifo FIFO|\-nofifo]
20[\-debug]20[\-debug]
21[\-verbose]
21[\-layout NAME]22[\-layout NAME]
22[\-plugin NAME]23[\-plugin NAME]
23[\-searchpath FOLDER]24[\-searchpath FOLDER]
@@ -93,8 +94,11 @@
93\fB\-dbus\-id KEY\fR94\fB\-dbus\-id KEY\fR
94append .KEY to the DBus service id used by gmusicbrowser (org.gmusicbrowser)95append .KEY to the DBus service id used by gmusicbrowser (org.gmusicbrowser)
95.TP96.TP
97\fB\-verbose\fR
98print some info, like the file being played
99.TP
96\fB\-debug\fR100\fB\-debug\fR
97print lots of useless information101print lots of useless information, implies -verbose
98.TP102.TP
99\fB\-backtrace\fR103\fB\-backtrace\fR
100print a backtrace for every warning104print a backtrace for every warning
101105
=== modified file 'gmusicbrowser.pl'
--- gmusicbrowser.pl 2014-01-25 14:17:08 +0000
+++ gmusicbrowser.pl 2014-02-15 20:02:02 +0000
@@ -79,8 +79,8 @@
79{79{
80 TRUE => 1,80 TRUE => 1,
81 FALSE => 0,81 FALSE => 0,
82 VERSION => '1.1011',82 VERSION => '1.1012',
83 VERSIONSTRING => '1.1.11',83 VERSIONSTRING => '1.1.12',
84 PIXPATH => $DATADIR.SLASH.'pix'.SLASH,84 PIXPATH => $DATADIR.SLASH.'pix'.SLASH,
85 PROGRAM_NAME => 'gmusicbrowser',85 PROGRAM_NAME => 'gmusicbrowser',
86# PERL510 => $^V ge 'v5.10',86# PERL510 => $^V ge 'v5.10',
@@ -151,8 +151,9 @@
151151
152our %Alias_ext; #define alternate file extensions (ie: .ogg files treated as .oga files)152our %Alias_ext; #define alternate file extensions (ie: .ogg files treated as .oga files)
153INIT {%Alias_ext=(ogg=> 'oga', m4b=>'m4a');} #needs to be in a INIT block because used in a INIT block in gmusicbrowser_tags.pm153INIT {%Alias_ext=(ogg=> 'oga', m4b=>'m4a');} #needs to be in a INIT block because used in a INIT block in gmusicbrowser_tags.pm
154our @ScanExt= qw/mp3 ogg oga flac mpc ape wv m4a m4b/;
154155
155our $debug;156our ($Verbose,$debug);
156our %CmdLine;157our %CmdLine;
157our ($HomeDir,$SaveFile,$FIFOFile,$ImportFile,$DBus_id);158our ($HomeDir,$SaveFile,$FIFOFile,$ImportFile,$DBus_id);
158sub find_gmbrc_file { my @f= map $_[0].$_, '','.gz','.xz'; return wantarray ? (grep { -e $_ } @f) : first { -e $_ } @f }159sub find_gmbrc_file { my @f= map $_[0].$_, '','.gz','.xz'; return wantarray ? (grep { -e $_ } @f) : first { -e $_ } @f }
@@ -185,7 +186,8 @@
185-nogst : do not use gstreamer186-nogst : do not use gstreamer
186-server : send playing song to connected icecast clent187-server : send playing song to connected icecast clent
187-port N : listen for connection on port N in icecast server mode188-port N : listen for connection on port N in icecast server mode
188-debug : print lots of mostly useless informations189-verbose: print some info, like the file being played
190-debug : print lots of mostly useless informations, implies -verbose
189-backtrace : print a backtrace for every warning191-backtrace : print a backtrace for every warning
190-nodbus : do not provide DBus services192-nodbus : do not provide DBus services
191-dbus-id KEY : append .KEY to the DBus service id used by gmusicbrowser (org.gmusicbrowser)193-dbus-id KEY : append .KEY to the DBus service id used by gmusicbrowser (org.gmusicbrowser)
@@ -243,7 +245,8 @@
243 elsif($arg eq '-ro') {$CmdLine{ro}=$CmdLine{rotags}=1}245 elsif($arg eq '-ro') {$CmdLine{ro}=$CmdLine{rotags}=1}
244 elsif($arg eq '-rotags') {$CmdLine{rotags}=1}246 elsif($arg eq '-rotags') {$CmdLine{rotags}=1}
245 elsif($arg eq '-port') {$CmdLine{port}=shift if $ARGV[0]}247 elsif($arg eq '-port') {$CmdLine{port}=shift if $ARGV[0]}
246 elsif($arg eq '-debug') {$debug=1}248 elsif($arg eq '-verbose') {$Verbose=1}
249 elsif($arg eq '-debug') {$debug=$Verbose=4}
247 elsif($arg eq '-backtrace') { $SIG{ __WARN__ } = \&Carp::cluck; $SIG{ __DIE__ } = \&Carp::confess; }250 elsif($arg eq '-backtrace') { $SIG{ __WARN__ } = \&Carp::cluck; $SIG{ __DIE__ } = \&Carp::confess; }
248 elsif($arg eq '-nofifo') {$FIFOFile=''}251 elsif($arg eq '-nofifo') {$FIFOFile=''}
249 elsif($arg eq '-workspace') {$CmdLine{workspace}=shift if defined $ARGV[0]} #requires Gnome2::Wnck252 elsif($arg eq '-workspace') {$CmdLine{workspace}=shift if defined $ARGV[0]} #requires Gnome2::Wnck
@@ -450,7 +453,7 @@
450$DRAGTYPES{$DRAGTYPES[$_][0]}=$_ for DRAG_FILE,DRAG_USTRING,DRAG_STRING,DRAG_ID,DRAG_ARTIST,DRAG_ALBUM,DRAG_FILTER,DRAG_MARKUP;453$DRAGTYPES{$DRAGTYPES[$_][0]}=$_ for DRAG_FILE,DRAG_USTRING,DRAG_STRING,DRAG_ID,DRAG_ARTIST,DRAG_ALBUM,DRAG_FILTER,DRAG_MARKUP;
451454
452our @submenuRemove=455our @submenuRemove=
453( { label => sub {$_[0]{mode} eq 'Q' ? _"Remove from queue" : $_[0]{mode} eq 'A' ? _"Remove from playlist" : _"Remove from list"}, code => sub { $_[0]{self}->RemoveSelected; }, mode => 'BLQA'},456( { label => sub {$_[0]{mode} eq 'Q' ? _"Remove from queue" : $_[0]{mode} eq 'A' ? _"Remove from playlist" : _"Remove from list"}, code => sub { $_[0]{self}->RemoveSelected; }, mode => 'BLQA', istrue=> 'allowremove', },
454 { label => _"Remove from library", code => sub { SongsRemove($_[0]{IDs}); }, },457 { label => _"Remove from library", code => sub { SongsRemove($_[0]{IDs}); }, },
455 { label => _"Remove from disk", code => sub { DeleteFiles($_[0]{IDs}); }, test => sub {!$CmdLine{ro}}, stockicon => 'gtk-delete' },458 { label => _"Remove from disk", code => sub { DeleteFiles($_[0]{IDs}); }, test => sub {!$CmdLine{ro}}, stockicon => 'gtk-delete' },
456);459);
@@ -1192,6 +1195,8 @@
1192 Rewind => [\&Rewind, _"Rewind",_"Number of seconds",qr/^\d+$/],1195 Rewind => [\&Rewind, _"Rewind",_"Number of seconds",qr/^\d+$/],
1193 Seek => [sub {SkipTo($_[1])}, _"Seek",_"Number of seconds",qr/^\d+$/],1196 Seek => [sub {SkipTo($_[1])}, _"Seek",_"Number of seconds",qr/^\d+$/],
1194 Stop => [\&Stop, _"Stop"],1197 Stop => [\&Stop, _"Stop"],
1198 Pause => [sub {Pause() if $TogPlay; }, _"Pause"],
1199 Play => [sub {PlayPause() unless $TogPlay; },_"Play"],
1195 Browser => [\&OpenBrowser, _"Open Browser"],1200 Browser => [\&OpenBrowser, _"Open Browser"],
1196 OpenQueue => [\&EditQueue, _"Open Queue window"],1201 OpenQueue => [\&EditQueue, _"Open Queue window"],
1197 OpenSearch => [sub { Layout::Window->new($Options{LayoutS}, uniqueid=>'Search'); }, _"Open Search window"],1202 OpenSearch => [sub { Layout::Window->new($Options{LayoutS}, uniqueid=>'Search'); }, _"Open Search window"],
@@ -1488,6 +1493,11 @@
1488 return $utf8name;1493 return $utf8name;
1489}1494}
14901495
1496sub get_event_window
1497{ my $widget=shift;
1498 $widget||= Gtk2->get_event_widget(Gtk2->get_current_event);
1499 return find_ancestor($widget,'Gtk2::Window');
1500}
1491sub get_layout_widget1501sub get_layout_widget
1492{ find_ancestor($_[0],'Layout');1502{ find_ancestor($_[0],'Layout');
1493}1503}
@@ -2038,6 +2048,7 @@
2038 $oldversion||=delete $Options{version} || VERSION; # for version <=1.1.72048 $oldversion||=delete $Options{version} || VERSION; # for version <=1.1.7
2039 if ($oldversion>VERSION) { warn "Loading a gmbrc saved with a more recent version of gmusicbrowser, try upgrading gmusicbrowser if there are problems\n"; }2049 if ($oldversion>VERSION) { warn "Loading a gmbrc saved with a more recent version of gmusicbrowser, try upgrading gmusicbrowser if there are problems\n"; }
2040 if ($oldversion<1.10091) {delete $Options{$_} for qw/Diacritic_sort gst_volume Simplehttp_CacheSize mplayer_use_replaygain/;} #cleanup old options2050 if ($oldversion<1.10091) {delete $Options{$_} for qw/Diacritic_sort gst_volume Simplehttp_CacheSize mplayer_use_replaygain/;} #cleanup old options
2051 if ($oldversion<=1.1011) {delete $Options{$_} for qw/ScanPlayOnly/;} #cleanup old options
2041 $Options{AutoRemoveCurrentSong}= delete $Options{TAG_auto_check_current} if $oldversion<1.1005 && exists $Options{TAG_auto_check_current};2052 $Options{AutoRemoveCurrentSong}= delete $Options{TAG_auto_check_current} if $oldversion<1.1005 && exists $Options{TAG_auto_check_current};
2042 $Options{PlayedMinPercent}= 100*delete $Options{PlayedPercent} if exists $Options{PlayedPercent};2053 $Options{PlayedMinPercent}= 100*delete $Options{PlayedPercent} if exists $Options{PlayedPercent};
2043 if ($Options{ArtistSplit}) # for versions <= 1.1.52054 if ($Options{ArtistSplit}) # for versions <= 1.1.5
@@ -2181,7 +2192,7 @@
2181sub SaveTags #save tags _and_ settings2192sub SaveTags #save tags _and_ settings
2182{ my $fork=shift; #if true, save in a forked process2193{ my $fork=shift; #if true, save in a forked process
2183 HasChanged('Save');2194 HasChanged('Save');
2184 if ($CmdLine{demo}) { warn "-demo option => not saving tags/settings\n"; return }2195 if ($CmdLine{demo}) { warn "-demo option => not saving tags/settings\n" if $Verbose || !$fork; return }
21852196
2186 my $ext='';2197 my $ext='';
2187 my $SaveFile= $SaveFile; #do a local copy to locally remove .gz extension if present2198 my $SaveFile= $SaveFile; #do a local copy to locally remove .gz extension if present
@@ -2231,7 +2242,7 @@
2231 my $error;2242 my $error;
2232 (my$fh,my$tempfile,$ext)= Open_gmbrc("$SaveFile.new.$$"."$ext",1);2243 (my$fh,my$tempfile,$ext)= Open_gmbrc("$SaveFile.new.$$"."$ext",1);
2233 unless ($fh) { warn "Save aborted\n"; POSIX::_exit(0) if $fork; return; }2244 unless ($fh) { warn "Save aborted\n"; POSIX::_exit(0) if $fork; return; }
2234 warn "Writing tags in $SaveFile$ext ...\n";2245 warn "Writing tags in $SaveFile$ext ...\n" if $Verbose || !$fork;
22352246
2236 print $fh "# gmbrc version=".VERSION." time=".time."\n" or $error||=$!;2247 print $fh "# gmbrc version=".VERSION." time=".time."\n" or $error||=$!;
22372248
@@ -2248,7 +2259,7 @@
2248 }2259 }
2249 #save fields properties, like album pictures ...2260 #save fields properties, like album pictures ...
2250 for my $field (sort keys %$extrasub)2261 for my $field (sort keys %$extrasub)
2251 { print $fh "\n[$field]\n$extra_subfields->{$field}\n" or $error++;2262 { print $fh "\n[$field]\n$extra_subfields->{$field}\n" or $error||=$!;
2252 my $h= $extrasub->{$field}->();2263 my $h= $extrasub->{$field}->();
2253 for my $key (sort keys %$h)2264 for my $key (sort keys %$h)
2254 { my $vals= $h->{$key};2265 { my $vals= $h->{$key};
@@ -2297,7 +2308,7 @@
2297 unlink $_ for find_gmbrc_file($SaveFile); #make sure there is no other old gmbrc without .bak, as they could cause confusion2308 unlink $_ for find_gmbrc_file($SaveFile); #make sure there is no other old gmbrc without .bak, as they could cause confusion
2298 }2309 }
2299 rename $tempfile,$SaveFile.$ext or warn $!;2310 rename $tempfile,$SaveFile.$ext or warn $!;
2300 warn "Writing tags in $SaveFile$ext ... done\n";2311 warn "Writing tags in $SaveFile$ext ... done\n" if $Verbose || !$fork;
2301 POSIX::_exit(0) if $fork;2312 POSIX::_exit(0) if $fork;
2302}2313}
23032314
@@ -2508,7 +2519,7 @@
2508 warn $error."\n";2519 warn $error."\n";
2509 return if $Options{IgnorePlayError};2520 return if $Options{IgnorePlayError};
2510 my $dialog = Gtk2::MessageDialog->new2521 my $dialog = Gtk2::MessageDialog->new
2511 ( undef, [qw/modal destroy-with-parent/],2522 ( $MainWindow, [qw/modal destroy-with-parent/],
2512 'error','close','%s',2523 'error','close','%s',
2513 $error2524 $error
2514 );2525 );
@@ -4075,7 +4086,7 @@
4075sub PopupContextMenu4086sub PopupContextMenu
4076{ my $args=$_[1];4087{ my $args=$_[1];
4077 my $menu=BuildMenu(@_);4088 my $menu=BuildMenu(@_);
4078 PopupMenu($menu,nomenupos=>!$args->{usemenupos});4089 PopupMenu($menu,nomenupos=>!$args->{usemenupos},self=>$args->{self});
4079}4090}
40804091
4081sub PopupMenu4092sub PopupMenu
@@ -4083,6 +4094,8 @@
4083 return unless $menu->get_children;4094 return unless $menu->get_children;
4084 $menu->show_all;4095 $menu->show_all;
4085 my $event= $args{event} || Gtk2->get_current_event;4096 my $event= $args{event} || Gtk2->get_current_event;
4097 my $widget= $args{self} || Gtk2->get_event_widget($event);
4098 $menu->attach_to_widget($widget,undef) if $widget;
4086 my $posfunction= $args{posfunction}; # usually undef4099 my $posfunction= $args{posfunction}; # usually undef
4087 my $button=my $time=0;4100 my $button=my $time=0;
4088 if ($event)4101 if ($event)
@@ -4135,12 +4148,26 @@
4135 my @order= 0..$#labels;4148 my @order= 0..$#labels;
4136 @order=sort {superlc($labels[$a]) cmp superlc($labels[$b])} @order if ref $choices eq 'HASH' || $tree;4149 @order=sort {superlc($labels[$a]) cmp superlc($labels[$b])} @order if ref $choices eq 'HASH' || $tree;
41374150
4151 my $selection;
4138 my $smenu_callback=sub4152 my $smenu_callback=sub
4139 { my $sub=$_[1];4153 { my $sub=$_[1];
4140 $sub->( $args, $_[0]{selected} );4154 my $selected= $_[0]{selected};
4155 if ($selection && $options{return_list})
4156 { $selection->{$selected} ^=1;
4157 $selected= [sort grep $selection->{$_}, keys %$selection];
4158 }
4159 $sub->($args, $selected);
4141 };4160 };
4142 my $check;4161 my ($check,$radio);
4143 $check= $options{check}($args) if $options{check};4162 $check= $options{check}($args) if $options{check};
4163 if (defined $check)
4164 { $selection={};
4165 if (ref $check) { $selection->{$_}=1 for @$check; }
4166 else
4167 { $radio=1;
4168 $selection->{$check}=1;
4169 }
4170 }
4144 for my $i (@order)4171 for my $i (@order)
4145 { my $label=$labels[$i];4172 { my $label=$labels[$i];
4146 my $value=$values[$i];4173 my $value=$values[$i];
@@ -4151,13 +4178,10 @@
4151 $item->set_submenu($submenu);4178 $item->set_submenu($submenu);
4152 }4179 }
4153 else4180 else
4154 { if (defined $check)4181 { if ($selection)
4155 { $item=Gtk2::CheckMenuItem->new_with_label($label);4182 { $item=Gtk2::CheckMenuItem->new_with_label($label);
4156 if (ref $check) { $item->set_active(1) if grep $_ eq $value, @$check; }4183 $item->set_active(1) if $selection->{$value};
4157 else4184 $item->set_draw_as_radio(1) if $radio;
4158 { $item->set_draw_as_radio(1);
4159 $item->set_active(1) if $check eq $value;
4160 }
4161 }4185 }
4162 $item->{selected}= $value;4186 $item->{selected}= $value;
4163 $item->signal_connect(activate => $smenu_callback, $options{code} );4187 $item->signal_connect(activate => $smenu_callback, $options{code} );
@@ -4323,7 +4347,7 @@
4323{ my ($IDs,$copy)=@_;4347{ my ($IDs,$copy)=@_;
4324 my $msg=$copy ? _"Choose directory to copy files to"4348 my $msg=$copy ? _"Choose directory to copy files to"
4325 : _"Choose directory to move files to";4349 : _"Choose directory to move files to";
4326 my $newdir=ChooseDir($msg, Songs::Get($IDs->[0],'path').SLASH);4350 my $newdir=ChooseDir($msg, path=>Songs::Get($IDs->[0],'path').SLASH);
4327 CopyMoveFiles($IDs,copy=>$copy,basedir=>$newdir) if defined $newdir;4351 CopyMoveFiles($IDs,copy=>$copy,basedir=>$newdir) if defined $newdir;
4328}4352}
43294353
@@ -4406,7 +4430,8 @@
4406}4430}
44074431
4408sub ChooseDir4432sub ChooseDir
4409{ my ($msg,$path,$extrawidget,$remember_key,$multiple,$allowfiles) = @_;4433{ my ($msg,%opt)=@_;
4434 my ($path,$extrawidget,$remember_key,$multiple,$allowfiles) = @opt{qw/path extrawidget remember_key multiple allowfiles/};
4410 my $mode= $allowfiles ? 'open' : 'select-folder';4435 my $mode= $allowfiles ? 'open' : 'select-folder';
4411 # there is no mode in Gtk2::FileChooserDialog that let you select both files or folders (Bug #136294), so use Gtk2::FileChooserWidget directly as it doesn't interfere with the ok button (in "open" mode pressing ok in a Gtk2::FileChooserDialog while a folder is selected go inside that folder rather than emiiting the ok response with that folder selected)4436 # there is no mode in Gtk2::FileChooserDialog that let you select both files or folders (Bug #136294), so use Gtk2::FileChooserWidget directly as it doesn't interfere with the ok button (in "open" mode pressing ok in a Gtk2::FileChooserDialog while a folder is selected go inside that folder rather than emiiting the ok response with that folder selected)
4412 my $dialog=Gtk2::Dialog->new($msg,undef,[], 'gtk-ok' => 'ok', 'gtk-cancel' => 'none');4437 my $dialog=Gtk2::Dialog->new($msg,undef,[], 'gtk-ok' => 'ok', 'gtk-cancel' => 'none');
@@ -4418,6 +4443,8 @@
4418 $dialog->vbox->set_spacing(5); #4443 $dialog->vbox->set_spacing(5); #
4419 ::SetWSize($dialog,'ChooseDir','750x580');4444 ::SetWSize($dialog,'ChooseDir','750x580');
44204445
4446 if (ref $allowfiles) { FileChooser_add_filters($filechooser,@$allowfiles); }
4447
4421 if ($remember_key) { $path= $Options{$remember_key}; }4448 if ($remember_key) { $path= $Options{$remember_key}; }
4422 elsif ($path) { $path= url_escape($path); }4449 elsif ($path) { $path= url_escape($path); }
4423 $filechooser->set_current_folder_uri("file://".$path) if $path;4450 $filechooser->set_current_folder_uri("file://".$path) if $path;
@@ -4456,6 +4483,17 @@
4456# return $path;4483# return $path;
4457#}4484#}
44584485
4486sub FileChooser_add_filters
4487{ my ($filechooser,@patterns)=@_;
4488 for my $aref (@patterns)
4489 { my $filter= Gtk2::FileFilter->new;
4490 if ($aref->[1]) { $filter->add_mime_type($_) for split / /,$aref->[1]; }
4491 if ($aref->[2]) { $filter->add_pattern($_) for split / /,$aref->[2]; }
4492 $filter->set_name($aref->[0]);
4493 $filechooser->add_filter($filter);
4494 }
4495}
4496
4459sub ChooseFiles4497sub ChooseFiles
4460{ my ($text,$remember_key,@patterns)=@_;4498{ my ($text,$remember_key,@patterns)=@_;
4461 $text||=_"Choose files";4499 $text||=_"Choose files";
@@ -4463,13 +4501,7 @@
4463 'gtk-ok' => 'ok',4501 'gtk-ok' => 'ok',
4464 'gtk-cancel' => 'none');4502 'gtk-cancel' => 'none');
4465 $dialog->set_select_multiple(1);4503 $dialog->set_select_multiple(1);
4466 for my $aref (@patterns)4504 FileChooser_add_filters($dialog,@patterns);
4467 { my $filter= Gtk2::FileFilter->new;
4468 if ($aref->[1]) { $filter->add_mime_type($_) for split / /,$aref->[1]; }
4469 if ($aref->[2]) { $filter->add_pattern($_) for split / /,$aref->[2]; }
4470 $filter->set_name($aref->[0]);
4471 $dialog->add_filter($filter);
4472 }
4473 if ($remember_key)4505 if ($remember_key)
4474 { my $path= decode_url($Options{$remember_key});4506 { my $path= decode_url($Options{$remember_key});
4475 $dialog->set_current_folder($path);4507 $dialog->set_current_folder($path);
@@ -4495,18 +4527,11 @@
4495 'gtk-ok' => 'ok',4527 'gtk-ok' => 'ok',
4496 'gtk-cancel' => 'none');4528 'gtk-cancel' => 'none');
44974529
4498 for my $aref4530 FileChooser_add_filters($dialog,
4499 ( [_"Pictures and music files",'image/*','*.mp3 *.flac *.m4a *.m4b *.ogg *.oga' ],4531 [_"Pictures and music files",'image/*','*.mp3 *.flac *.m4a *.m4b *.ogg *.oga' ],
4500 [_"Pictures files",'image/*'],4532 [_"Pictures files",'image/*'],
4501 [_"All files",undef,'*'],4533 [_"All files",undef,'*'],
4502 )4534 );
4503 { my $filter= Gtk2::FileFilter->new;
4504 #$filter->add_mime_type('image/'.$_) for qw/jpeg gif png bmp/;
4505 if ($aref->[1]) { $filter->add_mime_type($_) for split / /,$aref->[1]; }
4506 if ($aref->[2]) { $filter->add_pattern($_) for split / /,$aref->[2]; }
4507 $filter->set_name($aref->[0]);
4508 $dialog->add_filter($filter);
4509 }
45104535
4511 my $preview=Gtk2::VBox->new;4536 my $preview=Gtk2::VBox->new;
4512 my $label=Gtk2::Label->new;4537 my $label=Gtk2::Label->new;
@@ -4760,7 +4785,7 @@
4760 return unless @$IDs;4785 return unless @$IDs;
4761 my $text=(@$IDs==1)? "'".Songs::Display($IDs->[0],'file')."'" : __("%d file","%d files",scalar @$IDs);4786 my $text=(@$IDs==1)? "'".Songs::Display($IDs->[0],'file')."'" : __("%d file","%d files",scalar @$IDs);
4762 my $dialog = Gtk2::MessageDialog->new4787 my $dialog = Gtk2::MessageDialog->new
4763 ( undef,4788 ( ::get_event_window(),
4764 'modal',4789 'modal',
4765 'warning','cancel','%s',4790 'warning','cancel','%s',
4766 __x(_("About to delete {files}\nAre you sure ?"), files => $text)4791 __x(_("About to delete {files}\nAre you sure ?"), files => $text)
@@ -5454,19 +5479,17 @@
5454 return @IDs;5479 return @IDs;
5455}5480}
54565481
5457sub MakeScanRegex #FIXME5482sub MakeScanRegex
5458{ my $s;5483{ my %ext; $ext{$_}=1 for @ScanExt;
5459 if ($Options{ScanPlayOnly})5484 my $ignore= $Options{ScanIgnore} || [];
5460 { my %ext; $ext{$_}=1 for ($PlayNext_package||$Play_package)->supported_formats;5485 delete $ext{$_} for @$ignore;
5461 $ext{$_}=1 for grep $ext{$Alias_ext{$_}}, keys %Alias_ext;5486 my $re=join '|', sort keys %ext;
5462 $s=join '|',keys %ext;5487 warn "Scan regular expression is empty\n" unless $re;
5463 }5488 $ScanRegex=qr/\.(?:$re)$/i;
5464 else { $s='mp3|ogg|oga|flac|mpc|ape|wv|m4a|m4b'; } #FIXME find a better way
5465 $ScanRegex=qr/\.(?:$s)$/i;
5466}5489}
54675490
5468sub ScanFolder5491sub ScanFolder
5469{ warn "ScanFolder(@_)\n";5492{ warn "Scanning : @_\n" if $Verbose;
5470 my $dir=$_[0];5493 my $dir=$_[0];
5471 $dir=~s#^file://##;5494 $dir=~s#^file://##;
5472 MakeScanRegex() unless $ScanRegex;5495 MakeScanRegex() unless $ScanRegex;
@@ -6165,47 +6188,6 @@
6165}6188}
6166sub Set_replaygain { $Play_package->RG_set_options() if $Play_package->can('RG_set_options'); }6189sub Set_replaygain { $Play_package->RG_set_options() if $Play_package->can('RG_set_options'); }
61676190
6168sub pref_artists_update_desc
6169{ my $button=shift;
6170 my $hash= $button->{hash};
6171 my $key= $button->{key};
6172 my $text= join ' ',map $hash->{$_}||=qq("$_"), @{ $Options{$key} };
6173 $text||= $button->{empty};
6174 unless ($button->{label})
6175 { my $label= $button->{label}= Gtk2::Label->new;
6176 #$label->set_ellipsize('end');
6177 my $hbox=Gtk2::HBox->new(0,0);
6178 $hbox->pack_start($label,1,1,2);
6179 $hbox->pack_start($_,0,0,2) for Gtk2::VSeparator->new, Gtk2::Arrow->new('down','none');
6180 $button->add($hbox);
6181 }
6182 $button->{label}->set_text($text);
6183}
6184sub pref_artists_change_cb
6185{ my $button= $_[0]{button};
6186 my $key= $button->{key};
6187 my $l= $Options{$key};
6188 my $before=@$l;
6189 @$l= grep $_ ne $_[1], @$l;
6190 push @$l,$_[1] if $before==@$l;
6191 @$l= sort @$l;
6192 pref_artists_update_desc($button);
6193 Songs::UpdateArtistsRE();
6194}
6195sub pref_artists_button_cb
6196{ my ($button,$event)=@_;
6197 my $menu=BuildChoiceMenu
6198 ( $button->{hash},
6199 check=> sub { $Options{$_[0]{button}{key}} },
6200 code => \&pref_artists_change_cb,
6201 'reverse'=>1,
6202 args => {button=>$button},
6203 );
6204 PopupMenu($menu,event=>$event);
6205 1;
6206}
6207
6208
6209sub PrefMisc6191sub PrefMisc
6210{ #Default rating6192{ #Default rating
6211 my $DefRating=NewPrefSpinButton('DefaultRating',0,100, step=>10, page=>20, text=>_"Default rating : %d %", cb=> sub6193 my $DefRating=NewPrefSpinButton('DefaultRating',0,100, step=>10, page=>20, text=>_"Default rating : %d %", cb=> sub
@@ -6231,24 +6213,13 @@
6231 my $shutentry=NewPrefEntry(Shutdown_cmd => _"Shutdown command :", tip => _"Command used when\n'turn off computer when queue empty'\nis selected", cb=> \&Update_QueueActionList);6213 my $shutentry=NewPrefEntry(Shutdown_cmd => _"Shutdown command :", tip => _"Command used when\n'turn off computer when queue empty'\nis selected", cb=> \&Update_QueueActionList);
62326214
6233 #artist splitting6215 #artist splitting
6234 my $asplit_label= Gtk2::Label->new(_"Split artist names on :");6216 my $asplit= NewPrefMultiCombo( Artists_split_re=>\%Artists_split,
6235 my $asplit=Gtk2::Button->new;6217 text=>_"Split artist names on :", tip=>_"Used for the Artists field", separator=> ' ',
6236 $asplit->set_tooltip_text(_"Used for the Artists field");6218 empty=>_"no splitting", cb=>\&Songs::UpdateArtistsRE );
6237 $asplit->{hash}= \%Artists_split;
6238 $asplit->{key}= 'Artists_split_re';
6239 $asplit->{empty}= _"no splitting";
6240 pref_artists_update_desc($asplit);
6241 $asplit->signal_connect(button_press_event=> \&pref_artists_button_cb);
6242
6243 #artist in title6219 #artist in title
6244 my $atitle_label= Gtk2::Label->new(_"Extract guest artist from title :");6220 my $atitle= NewPrefMultiCombo( Artists_title_re=>\%Artists_from_title,
6245 my $atitle=Gtk2::Button->new;6221 text=>_"Extract guest artist from title :", tip=>_"Used for the Artists field", separator=> ' ',
6246 $atitle->set_tooltip_text(_"Used for the Artists field");6222 empty=>_"ignore title", cb=>\&Songs::UpdateArtistsRE );
6247 $atitle->{hash}= \%Artists_from_title;
6248 $atitle->{key}= 'Artists_title_re';
6249 $atitle->{empty}= _"ignore title";
6250 pref_artists_update_desc($atitle);
6251 $atitle->signal_connect(button_press_event=> \&pref_artists_button_cb);
62526223
6253 #date format6224 #date format
6254 my $dateex= mktime(5,4,3,2,0,(localtime)[5]);6225 my $dateex= mktime(5,4,3,2,0,(localtime)[5]);
@@ -6278,7 +6249,7 @@
6278 my $playedpercent= NewPrefSpinButton('PlayedMinPercent' ,0,100, text=>_"Threshold to count a song as played : %d %");6249 my $playedpercent= NewPrefSpinButton('PlayedMinPercent' ,0,100, text=>_"Threshold to count a song as played : %d %");
6279 my $playedseconds= NewPrefSpinButton('PlayedMinSeconds' ,0,99999,text=>_"or %d seconds");6250 my $playedseconds= NewPrefSpinButton('PlayedMinSeconds' ,0,99999,text=>_"or %d seconds");
62806251
6281 my $vbox= Vpack( $checkR1,$checkR2,$checkR4, $DefRating,$ProxyCheck, [$asplit_label, $asplit],[$atitle_label, $atitle],6252 my $vbox= Vpack( $checkR1,$checkR2,$checkR4, $DefRating,$ProxyCheck, $asplit, $atitle,
6282 [0,$datealign,$preview], $screensaver,$shutentry, $always_in_pl,6253 [0,$datealign,$preview], $screensaver,$shutentry, $always_in_pl,
6283 $recent_include_not_played, $volstep, $pixcache,6254 $recent_include_not_played, $volstep, $pixcache,
6284 [ $playedpercent, $playedseconds ],6255 [ $playedpercent, $playedseconds ],
@@ -6442,7 +6413,7 @@
6442{ my $parent=shift;6413{ my $parent=shift;
6443 $parent=~s/([^$QSLASH]+)$//o;6414 $parent=~s/([^$QSLASH]+)$//o;
6444 my $folder=$1;6415 my $folder=$1;
6445 my $new=ChooseDir(_"Move folder to",$parent);6416 my $new=ChooseDir(_"Move folder to", path=>$parent);
6446 return unless $new;6417 return unless $new;
6447 my $old=$parent.$folder.SLASH;6418 my $old=$parent.$folder.SLASH;
6448 $new.=SLASH.$folder.SLASH;6419 $new.=SLASH.$folder.SLASH;
@@ -6513,7 +6484,10 @@
6513 $sw->set_policy ('automatic', 'automatic');6484 $sw->set_policy ('automatic', 'automatic');
6514 $sw->add($treeview);6485 $sw->add($treeview);
65156486
6516 my $Cscanall=NewPrefCheckButton(ScanPlayOnly => _"Do not add songs that can't be played", cb=>sub {$ScanRegex=undef});6487 my $extensions= NewPrefMultiCombo(ScanIgnore => {map {$_=>$_} @ScanExt},
6488 text=>_"Ignored file extensions :", tip=>_"Files with these extensions won't be added", empty=>_"none",
6489 cb=>sub {$ScanRegex=undef}, );
6490
6517 my $CScan=NewPrefCheckButton(StartScan => _"Search for new songs on startup");6491 my $CScan=NewPrefCheckButton(StartScan => _"Search for new songs on startup");
6518 my $CCheck=NewPrefCheckButton(StartCheck => _"Check for updated/deleted songs on startup");6492 my $CCheck=NewPrefCheckButton(StartCheck => _"Check for updated/deleted songs on startup");
6519 my $BScan= NewIconButton('gtk-refresh',_"scan now", sub { IdleScan(); });6493 my $BScan= NewIconButton('gtk-refresh',_"scan now", sub { IdleScan(); });
@@ -6557,7 +6531,7 @@
6557 [$addbut,$rmdbut,'-',$reorg],6531 [$addbut,$rmdbut,'-',$reorg],
6558 [$CCheck,'-',$BCheck],6532 [$CCheck,'-',$BCheck],
6559 [$CScan,'-',$BScan],6533 [$CScan,'-',$BScan],
6560 $Cscanall,6534 $extensions,
6561 $autoremove,6535 $autoremove,
6562 [$lengthcheck,'-',$Blengthcheck],6536 [$lengthcheck,'-',$Blengthcheck],
6563 $masterfiltercheck,6537 $masterfiltercheck,
@@ -6567,7 +6541,8 @@
6567}6541}
6568sub ChooseAddPath6542sub ChooseAddPath
6569{ my ($addtolibrary,$allowfiles)=@_;6543{ my ($addtolibrary,$allowfiles)=@_;
6570 my @dirs=ChooseDir(_"Choose folder to add",undef,undef,'LastFolder_Add',1,$allowfiles);6544 $allowfiles&&= [ [_"Music files", undef, join(' ',map "*.$_", sort @ScanExt) ], [_"All files",undef,'*'] ];
6545 my @dirs=ChooseDir(_"Choose folder to add", remember_key=>'LastFolder_Add', multiple=>1, allowfiles=>$allowfiles);
6571 @dirs=map url_escape($_), @dirs;6546 @dirs=map url_escape($_), @dirs;
6572 AddPath($addtolibrary,@dirs);6547 AddPath($addtolibrary,@dirs);
6573}6548}
@@ -6605,7 +6580,7 @@
6605 my $IDlist= Songs::MakeFilterFromGID($field,$gid)->filter;6580 my $IDlist= Songs::MakeFilterFromGID($field,$gid)->filter;
6606 if (my $nb=@$IDlist)6581 if (my $nb=@$IDlist)
6607 { my $dialog = Gtk2::MessageDialog->new6582 { my $dialog = Gtk2::MessageDialog->new
6608 ( undef, #FIXME6583 ( ::get_event_window(),
6609 [qw/modal destroy-with-parent/],6584 [qw/modal destroy-with-parent/],
6610 'warning','ok-cancel',6585 'warning','ok-cancel',
6611 __("This label is set for %d song.","This label is set for %d songs.",$nb)."\n".6586 __("This label is set for %d song.","This label is set for %d songs.",$nb)."\n".
@@ -6679,7 +6654,7 @@
6679 my ($label,$nb)=$store->get_value($iter);6654 my ($label,$nb)=$store->get_value($iter);
6680 if ($nb)6655 if ($nb)
6681 { my $dialog = Gtk2::MessageDialog->new6656 { my $dialog = Gtk2::MessageDialog->new
6682 ( undef, #FIXME6657 ( $treeview->get_toplevel,
6683 [qw/modal destroy-with-parent/],6658 [qw/modal destroy-with-parent/],
6684 'warning','ok-cancel','%s',6659 'warning','ok-cancel','%s',
6685 __("This label is set for %d song.","This label is set for %d songs.",$nb)."\n".6660 __("This label is set for %d song.","This label is set for %d songs.",$nb)."\n".
@@ -6902,7 +6877,7 @@
6902 &$cb if $cb;6877 &$cb if $cb;
6903 });6878 });
6904 $button->signal_connect( clicked => sub6879 $button->signal_connect( clicked => sub
6905 { my $file= $folder? ChooseDir($text,$Options{$key}) : undef;6880 { my $file= $folder? ChooseDir($text, path=>$Options{$key}) : undef;
6906 return unless $file;6881 return unless $file;
6907 # could simply $entry->set_text(), but wouldn't work with filenames with broken encoding6882 # could simply $entry->set_text(), but wouldn't work with filenames with broken encoding
6908 SetOption( $key, url_escape($file) );6883 SetOption( $key, url_escape($file) );
@@ -6973,15 +6948,66 @@
6973 my $combo= NewPrefCombo($key => $buildlist, text => $text, sizeg1=>$sg1,sizeg2=>$sg2, tree=>1, cb => $cb, event=>'Layouts');6948 my $combo= NewPrefCombo($key => $buildlist, text => $text, sizeg1=>$sg1,sizeg2=>$sg2, tree=>1, cb => $cb, event=>'Layouts');
6974 my $set_tooltip= sub #show layout author in tooltip6949 my $set_tooltip= sub #show layout author in tooltip
6975 { return if $_[1] && $_[1] ne $key;6950 { return if $_[1] && $_[1] ne $key;
6976 my $author= $Layout::Layouts{$Options{$key}}{Author};6951 my $layoutdef= $Layout::Layouts{$Options{$key}};
6977 $author&&= _("by").' '.$author;6952 my $tip= $layoutdef->{PATH}.$layoutdef->{FILE}.':'.$layoutdef->{LINE};
6978 $_[0]->set_tooltip_text($author);6953 if (my $author= $layoutdef->{Author}) { $tip= _("by")." $author\n$tip"; }
6954 $_[0]->set_tooltip_text($tip);
6979 };6955 };
6980 Watch( $combo, Option => $set_tooltip);6956 Watch( $combo, Option => $set_tooltip);
6981 $set_tooltip->($combo);6957 $set_tooltip->($combo);
6982 return $combo;6958 return $combo;
6983}6959}
69846960
6961sub NewPrefMultiCombo
6962{ my ($key,$possible_values_hash,%opt)=@_;
6963 my $sep= $opt{separator}|| ', ';
6964 my $display_cb= $opt{display} || sub
6965 { my $values= $Options{$key} || [];
6966 return $opt{empty} unless @$values;
6967 return join $sep,map $possible_values_hash->{$_}||=qq("$_"), @$values;
6968 };
6969 $display_cb= sub {$opt{display}} if !ref $display_cb; # label in the button is a constant
6970 my $button= Gtk2::Button->new;
6971
6972 my $label_value= Gtk2::Label->new;
6973 #$label_value->set_ellipsize('end');
6974 my $hbox=Gtk2::HBox->new(0,0);
6975 $hbox->pack_start($label_value,1,1,2);
6976 $hbox->pack_start($_,0,0,2) for Gtk2::VSeparator->new, Gtk2::Arrow->new('down','none');
6977 $button->add($hbox);
6978 $label_value->set_text( $display_cb->() );
6979
6980 my $change_cb=sub
6981 { my $button= $_[0]{button};
6982 $Options{$key}= $_[1];
6983 $label_value->set_text( $display_cb->() );
6984 $opt{cb}->() if $opt{cb};
6985 };
6986 my $click_cb=sub
6987 { my ($button,$event)=@_;
6988 my $menu=BuildChoiceMenu
6989 ( $possible_values_hash,
6990 check=> sub { $Options{$key}||[] },
6991 code => $change_cb,
6992 'reverse'=>1, return_list=>1,
6993 args => {button=>$button},
6994 );
6995 PopupMenu($menu,event=>$event);
6996 1;
6997 };
6998
6999 $button->signal_connect(button_press_event=> \&$click_cb);
7000 my $widget=$button;
7001 if (defined $opt{text})
7002 { my $hbox0= Gtk2::HBox->new;
7003 my $label= Gtk2::Label->new($opt{text});
7004 $hbox0->pack_start($_, FALSE, FALSE, 2) for $label,$button;
7005 $widget=$hbox0;
7006 }
7007 $widget->set_tooltip_text($opt{tip}) if $opt{tip};
7008 return $widget;
7009}
7010
6985sub NewIconButton7011sub NewIconButton
6986{ my ($icon,$text,$coderef,$style,$tip)=@_;7012{ my ($icon,$text,$coderef,$style,$tip)=@_;
6987 my $but=Gtk2::Button->new;7013 my $but=Gtk2::Button->new;
@@ -8727,7 +8753,7 @@
8727 $entry->signal_connect(activate=> \&GMB::FilterBox::activate);8753 $entry->signal_connect(activate=> \&GMB::FilterBox::activate);
8728 $button->signal_connect( clicked => sub8754 $button->signal_connect( clicked => sub
8729 { my $self=$_[0]->parent;8755 { my $self=$_[0]->parent;
8730 my $folder= ::ChooseDir(_"Choose a folder", $self->{value});8756 my $folder= ::ChooseDir(_"Choose a folder", path=>$self->{value});
8731 return unless $folder;8757 return unless $folder;
8732 $busy=1;8758 $busy=1;
8733 $self->Set( ::url_escape($folder) );8759 $self->Set( ::url_escape($folder) );
87348760
=== modified file 'gmusicbrowser.spec'
--- gmusicbrowser.spec 2014-01-25 14:17:08 +0000
+++ gmusicbrowser.spec 2014-02-15 20:02:02 +0000
@@ -1,6 +1,6 @@
1Name: gmusicbrowser1Name: gmusicbrowser
2Summary: Jukebox for large collections of music files2Summary: Jukebox for large collections of music files
3Version: 1.1.113Version: 1.1.12
4Release: 14Release: 1
5License: GPL5License: GPL
6Group: Sound6Group: Sound
77
=== modified file 'gmusicbrowser_123.pm'
--- gmusicbrowser_123.pm 2013-10-11 19:12:33 +0000
+++ gmusicbrowser_123.pm 2014-02-15 20:02:02 +0000
@@ -174,7 +174,7 @@
174 SkipTo(undef,$sec) if $sec;174 SkipTo(undef,$sec) if $sec;
175 }175 }
176 $OUTPUTfh->blocking(0); #set non-blocking IO176 $OUTPUTfh->blocking(0); #set non-blocking IO
177 warn "playing $file (pid=$ChildPID)\n";177 warn "playing $file (pid=$ChildPID)\n" if $::Verbose;
178 $WatchTag= Glib::IO->add_watch(fileno($OUTPUTfh),'hup',\&_eos_cb);178 $WatchTag= Glib::IO->add_watch(fileno($OUTPUTfh),'hup',\&_eos_cb);
179 $WatchTag2= $RemoteMode ?179 $WatchTag2= $RemoteMode ?
180 Glib::IO->add_watch(fileno($OUTPUTfh),'in',$RemoteMode->{watcher}) :180 Glib::IO->add_watch(fileno($OUTPUTfh),'in',$RemoteMode->{watcher}) :
181181
=== modified file 'gmusicbrowser_gstreamer-0.10.pm'
--- gmusicbrowser_gstreamer-0.10.pm 2014-01-25 14:17:08 +0000
+++ gmusicbrowser_gstreamer-0.10.pm 2014-02-15 20:02:02 +0000
@@ -316,7 +316,7 @@
316 { $visual_window->realize unless $visual_window->window;316 { $visual_window->realize unless $visual_window->window;
317 if (my $w=$visual_window->window) { $VSink->set_xwindow_id($w->XID); }317 if (my $w=$visual_window->window) { $VSink->set_xwindow_id($w->XID); }
318 }318 }
319 warn "playing $file\n";319 warn "playing $file\n" if $::Verbose;
320 set_file($file);320 set_file($file);
321 my $newstate='playing'; $StateAfterSkip=undef;321 my $newstate='playing'; $StateAfterSkip=undef;
322 if ($Skip) { $newstate='paused'; $StateAfterSkip='playing'; }322 if ($Skip) { $newstate='paused'; $StateAfterSkip='playing'; }
323323
=== modified file 'gmusicbrowser_layout.pm'
--- gmusicbrowser_layout.pm 2014-01-25 14:17:08 +0000
+++ gmusicbrowser_layout.pm 2014-02-15 20:02:02 +0000
@@ -770,35 +770,36 @@
770770
771sub ReadLayoutFile771sub ReadLayoutFile
772{ my $file=shift;772{ my $file=shift;
773 my $path=$file; $path=~s#[^/]+$##;
774 return unless -f $file;773 return unless -f $file;
775 open my$fh,"<:utf8",$file or do { warn $!; return };774 open my$fh,"<:utf8",$file or do { warn $!; return };
776 my $first;775 my $first;
776 my $linecount=0; my ($linefirst,$linenext);
777 while (1)777 while (1)
778 { my ($next,$longline);778 { my ($next,$longline);
779 my @lines=($first);779 my @lines=($first);
780 while (local $_=<$fh>)780 while (local $_=<$fh>)
781 { s#^\s+##;781 { $linecount++;
782 s#^\s+##;
782 next if m/^#/;783 next if m/^#/;
783 s#\s*[\n\r]+$##;784 s#\s*[\n\r]+$##;
784 if (s#\\$##) {$longline.=$_;next}785 if (s#\\$##) {$longline.=$_;next}
785 next if $_ eq '';786 next if $_ eq '';
786 if ($longline) {$_=$longline.$_;undef $longline;}787 if ($longline) {$_=$longline.$_;undef $longline;}
787 if (m#^[{[]#) {$next=$_;last}788 if (m#^[{[]#) { $next=$_; $linenext=$linecount; last}
788 push @lines,$_;789 push @lines,$_;
789 }790 }
790 if ($first)791 if ($first)
791 { if ($first=~m#^\[#) {ParseLayout(\@lines,$path)}792 { if ($first=~m#^\[#) {ParseLayout(\@lines,$file,$linefirst)}
792 else {ParseSongTreeSkin(\@lines)}793 else {ParseSongTreeSkin(\@lines)}
793 }794 }
794 $first=$next;795 $first=$next; $linefirst=$linenext;
795 last unless $first;796 last unless $first;
796 }797 }
797 close $fh;798 close $fh;
798}799}
799800
800sub ParseLayout801sub ParseLayout
801{ my ($lines,$path)=@_;802{ my ($lines,$file,$line)=@_;
802 my $first=shift @$lines;803 my $first=shift @$lines;
803 my $name;804 my $name;
804 if ($first=~m/^\[([^]=]+)\](?:\s*based on (.+))?$/)805 if ($first=~m/^\[([^]=]+)\](?:\s*based on (.+))?$/)
@@ -822,7 +823,10 @@
822 for my $key (qw/Name Category Title/)823 for my $key (qw/Name Category Title/)
823 { $Layouts{$name}{$key}=~s/^"(.*)"$/$1/ if $Layouts{$name}{$key}; #remove quotes from layout name and category824 { $Layouts{$name}{$key}=~s/^"(.*)"$/$1/ if $Layouts{$name}{$key}; #remove quotes from layout name and category
824 }825 }
826 my $path=$file; $path=~s#([^/]+)$##; $file=$1;
825 $Layouts{$name}{PATH}=$path;827 $Layouts{$name}{PATH}=$path;
828 $Layouts{$name}{FILE}=$file;
829 $Layouts{$name}{LINE}=$line;
826}830}
827831
828sub ParseSongTreeSkin832sub ParseSongTreeSkin
@@ -871,6 +875,8 @@
871 %default= @optlist;875 %default= @optlist;
872 }876 }
873 $_=::ParseOptions($_) for values %default;877 $_=::ParseOptions($_) for values %default;
878 $default{DEFAULT_OPTIONS}=1;
879 $default{Window}{DEFAULT_OPTIONS}=1;
874 return \%default;880 return \%default;
875}881}
876882
@@ -1815,6 +1821,9 @@
1815 my (undef,undef,$monitorwidth,$monitorheight)=$screen->get_monitor_geometry($monitor)->values;1821 my (undef,undef,$monitorwidth,$monitorheight)=$screen->get_monitor_geometry($monitor)->values;
1816 $w= $1*$monitorwidth/100 if $w=~m/(\d+)%/;1822 $w= $1*$monitorwidth/100 if $w=~m/(\d+)%/;
1817 $h= $1*$monitorheight/100 if $h=~m/(\d+)%/;1823 $h= $1*$monitorheight/100 if $h=~m/(\d+)%/;
1824 if ($self->{options}{DEFAULT_OPTIONS}) { $monitorwidth-=40; $monitorheight-=80; } # if using default layout size, reserve some space for potential panels and decorations
1825 $w=$monitorwidth if $w>$monitorwidth;
1826 $h=$monitorheight if $h>$monitorheight;
1818 if ($self->{fixedsize})1827 if ($self->{fixedsize})
1819 { $w=-1 if $w<1; # -1 => do not override default minimum size1828 { $w=-1 if $w<1; # -1 => do not override default minimum size
1820 $h=-1 if $h<1;1829 $h=-1 if $h<1;
@@ -2594,7 +2603,7 @@
2594}2603}
25952604
2596sub newbutton_cb2605sub newbutton_cb
2597{ my $self= ::find_ancestor($_[0],__PACKAGE__);2606{ my $self= ::find_ancestor($_[0],__PACKAGE__);
2598 ::PopupContextMenu(\@contextmenu, { self=>$self, type=>$self->{typesubmenu}, usemenupos=>1 } );2607 ::PopupContextMenu(\@contextmenu, { self=>$self, type=>$self->{typesubmenu}, usemenupos=>1 } );
2599 1;2608 1;
2600}2609}
@@ -4057,7 +4066,7 @@
4057 }4066 }
4058}4067}
4059sub SaveOptions4068sub SaveOptions
4060{ my $self=shift,4069{ my $self=shift;
4061 my %opt;4070 my %opt;
4062 if (my $cats=$self->{cats})4071 if (my $cats=$self->{cats})
4063 { $opt{collapsed}= $self->{collapsed}= join ' ', sort grep !$cats->{$_}->get_expanded, keys %$cats;4072 { $opt{collapsed}= $self->{collapsed}= join ' ', sort grep !$cats->{$_}->get_expanded, keys %$cats;
40644073
=== modified file 'gmusicbrowser_list.pm'
--- gmusicbrowser_list.pm 2014-01-25 14:17:08 +0000
+++ gmusicbrowser_list.pm 2014-02-15 20:02:02 +0000
@@ -311,6 +311,8 @@
311 my $watchedarray= $songlist && $songlist->{array};311 my $watchedarray= $songlist && $songlist->{array};
312 return if !$watchedarray || ($array && $watchedarray!=$array);312 return if !$watchedarray || ($array && $watchedarray!=$array);
313 $self->{bclear}->set_sensitive(scalar @$watchedarray);313 $self->{bclear}->set_sensitive(scalar @$watchedarray);
314 $self->set_sensitive( !$songlist->{autoupdate} );
315 $self->set_visible( !$songlist->{autoupdate} );
314}316}
315317
316sub SelectionChanged318sub SelectionChanged
@@ -533,8 +535,6 @@
533 }535 }
534 $self->{filter}=$filter;536 $self->{filter}=$filter;
535 return if $self->{ignoreSetFilter};537 return if $self->{ignoreSetFilter};
536
537 #if ($self->{type} eq 'A') { $self->{array}->SetFilter($filter); return } #FIXME needs a PlayFilter with multiple levels to work correctly
538 $self->{array}->SetSortAndFilter($self->{sort},$filter);538 $self->{array}->SetSortAndFilter($self->{sort},$filter);
539}539}
540sub Empty540sub Empty
@@ -560,10 +560,20 @@
560}560}
561sub RemoveSelected561sub RemoveSelected
562{ my $self=shift;562{ my $self=shift;
563 return if $self->{autoupdate}; #can't remove selection from an always-filtered list
563 my $songarray=$self->{array};564 my $songarray=$self->{array};
564 $songarray->Remove($self->GetSelectedRows);565 $songarray->Remove($self->GetSelectedRows);
565}566}
566567
568sub PopupContextMenu
569{ my $self=shift;
570 #return unless @{$self->{array}}; #no context menu for empty lists
571 my @IDs=$self->GetSelectedIDs;
572 my %args=(self => $self, mode => $self->{type}, IDs => \@IDs, listIDs => $self->{array});
573 $args{allowremove}=1 unless $self->{autoupdate};
574 ::PopupContextMenu(\@::SongCMenu,\%args);
575}
576
567sub MoveUpDown577sub MoveUpDown
568{ my ($self,$up,$max)=@_;578{ my ($self,$up,$max)=@_;
569 my $songarray=$self->{array};579 my $songarray=$self->{array};
@@ -1086,14 +1096,6 @@
1086 1;1096 1;
1087}1097}
10881098
1089sub PopupContextMenu
1090{ my ($self,$tv,$event)=@_;
1091 #return unless @{$self->{array}}; #no context menu for empty lists
1092 my @IDs=$self->GetSelectedIDs;
1093 my %args=(self => $self, mode => $self->{type}, IDs => \@IDs, listIDs => $self->{array});
1094 ::PopupContextMenu(\@::SongCMenu,\%args );
1095}
1096
1097sub GetCurrentRow1099sub GetCurrentRow
1098{ my $self=shift;1100{ my $self=shift;
1099 my $tv=$self->child;1101 my $tv=$self->child;
@@ -1556,7 +1558,7 @@
1556 #$sel->select_path($path);1558 #$sel->select_path($path);
1557 $tv->set_cursor($path);1559 $tv->set_cursor($path);
1558 }1560 }
1559 $self->PopupContextMenu($tv,$event);1561 $self->PopupContextMenu;
1560 return 1;1562 return 1;
1561 }1563 }
1562 return 0; #let the event propagate1564 return 0; #let the event propagate
@@ -1741,7 +1743,7 @@
1741 },1743 },
1742 { label=> _"Remove label", stockicon => 'gtk-remove',1744 { label=> _"Remove label", stockicon => 'gtk-remove',
1743 code => sub { my $gid=$_[0]{gidlist}[0]; ::RemoveLabel($_[0]{field},$gid); },1745 code => sub { my $gid=$_[0]{gidlist}[0]; ::RemoveLabel($_[0]{field},$gid); },
1744 onlyone=> 'gidlist', test => sub { $_[0]{field} eq 'label' }, #FIXME ? label specific1746 onlyone=> 'gidlist', test => sub { $_[0]{field} eq 'label' && $_[0]{gidlist}[0] !=0 }, #FIXME make it generic rather than specific to field label ? #FIXME find a better way to chack if gid is special than comparing it to 0
1745 },1747 },
1746# { separator=>1 },1748# { separator=>1 },
1747 { label => _"Options", submenu => \@MenuPageOptions, stock => 'gtk-preferences', isdefined => 'field' },1749 { label => _"Options", submenu => \@MenuPageOptions, stock => 'gtk-preferences', isdefined => 'field' },
@@ -2097,7 +2099,7 @@
2097}2099}
20982100
2099sub PopupContextMenu2101sub PopupContextMenu
2100{ my ($page,$event,$hash,$menu)=@_;2102{ my ($page,$hash,$menu)=@_;
2101 my $self=::find_ancestor($page,__PACKAGE__);2103 my $self=::find_ancestor($page,__PACKAGE__);
2102 $hash->{filterpane}=$self;2104 $hash->{filterpane}=$self;
2103 $menu||=\@cMenu;2105 $menu||=\@cMenu;
@@ -2105,8 +2107,7 @@
2105}2107}
21062108
2107sub PopupOpt #Only for FilterList #FIXME should be moved in FilterList::, and/or use a common function with FilterList::PopupContextMenu2109sub PopupOpt #Only for FilterList #FIXME should be moved in FilterList::, and/or use a common function with FilterList::PopupContextMenu
2108{ my ($but,$event)=@_;2110{ my $self=::find_ancestor($_[0],__PACKAGE__);
2109 my $self=::find_ancestor($but,__PACKAGE__);
2110 my $nb=$self->{notebook};2111 my $nb=$self->{notebook};
2111 my $page=$nb->get_nth_page( $nb->get_current_page );2112 my $page=$nb->get_nth_page( $nb->get_current_page );
2112 my $field=$page->{field}[0];2113 my $field=$page->{field}[0];
@@ -2550,13 +2551,12 @@
2550}2551}
25512552
2552sub PopupContextMenu2553sub PopupContextMenu
2553{ my ($self,undef,$event)=@_;2554{ my $self=::find_ancestor($_[0],__PACKAGE__);
2554 $self=::find_ancestor($self,__PACKAGE__);
2555 my ($field,$gidlist)=$self->get_selected_list;2555 my ($field,$gidlist)=$self->get_selected_list;
2556 my $mainfield=Songs::MainField($field);2556 my $mainfield=Songs::MainField($field);
2557 my $aa= ($mainfield eq 'artist' || $mainfield eq 'album') ? $mainfield : undef; #FIXME2557 my $aa= ($mainfield eq 'artist' || $mainfield eq 'album') ? $mainfield : undef; #FIXME
2558 my $mode= uc(substr $self->{mode},0,1); # C => cloud, M => mosaic, L => list2558 my $mode= uc(substr $self->{mode},0,1); # C => cloud, M => mosaic, L => list
2559 FilterPane::PopupContextMenu($self,$event,{ self=> $self, filter => $self->get_selected_filters, field => $field, aa => $aa, gidlist =>$gidlist, mode => $mode, subfield => $field, depth =>0 });2559 FilterPane::PopupContextMenu($self,{ self=> $self, filter => $self->get_selected_filters, field => $field, aa => $aa, gidlist =>$gidlist, mode => $mode, subfield => $field, depth =>0 });
2560}2560}
25612561
2562sub key_press_cb2562sub key_press_cb
@@ -2725,10 +2725,11 @@
2725 FilterPane::Activate($self,$button,$filter);2725 FilterPane::Activate($self,$button,$filter);
2726}2726}
2727sub PopupContextMenu2727sub PopupContextMenu
2728{ my ($self,$tv,$event)=@_;2728{ my $self=shift;
2729 my $tv=$self->{treeview};
2729 my @paths=_get_path_selection($tv);2730 my @paths=_get_path_selection($tv);
2730 my @raw= map ::decode_url($_), @paths;2731 my @raw= map ::decode_url($_), @paths;
2731 FilterPane::PopupContextMenu($self,$event,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });2732 FilterPane::PopupContextMenu($self,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });
2732}2733}
27332734
2734sub _get_path_selection2735sub _get_path_selection
@@ -2906,10 +2907,11 @@
2906 FilterPane::Activate($self,$button,$filter);2907 FilterPane::Activate($self,$button,$filter);
2907}2908}
2908sub PopupContextMenu2909sub PopupContextMenu
2909{ my ($self,$tv,$event)=@_;2910{ my $self=$_[0];
2911 my $tv=$self->{treeview};
2910 my @paths=_get_path_selection($tv);2912 my @paths=_get_path_selection($tv);
2911 my @raw= map ::decode_url($_), @paths;2913 my @raw= map ::decode_url($_), @paths;
2912 FilterPane::PopupContextMenu($self,$event,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });2914 FilterPane::PopupContextMenu($self,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });
2913}2915}
29142916
2915sub _get_path_selection2917sub _get_path_selection
@@ -3091,7 +3093,8 @@
3091}3093}
30923094
3093sub PopupContextMenu3095sub PopupContextMenu
3094{ my ($self,$tv,$event)=@_;3096{ my $self=shift;
3097 my $tv=$self->{treeview};
3095 my @rows=$tv->get_selection->get_selected_rows;3098 my @rows=$tv->get_selection->get_selected_rows;
3096 my $store=$tv->get_model;3099 my $store=$tv->get_model;
3097 my %sel;3100 my %sel;
@@ -3111,7 +3114,7 @@
3111 else { $args{mode}=''; }3114 else { $args{mode}=''; }
3112 my $songlist=::GetSonglist($self);3115 my $songlist=::GetSonglist($self);
3113 $args{songlist}=$songlist if $songlist;3116 $args{songlist}=$songlist if $songlist;
3114 FilterPane::PopupContextMenu($self,$event,\%args, [@cMenu,{ separator=>1 },@FilterPane::cMenu] );3117 FilterPane::PopupContextMenu($self,\%args, [@cMenu,{ separator=>1 },@FilterPane::cMenu] );
3115}3118}
31163119
3117sub drag_motion_cb3120sub drag_motion_cb
@@ -3385,6 +3388,7 @@
3385 #return if $self->{Sel} == $key;3388 #return if $self->{Sel} == $key;
3386 if (defined $key) { $self->{Sel}=$key; }3389 if (defined $key) { $self->{Sel}=$key; }
3387 else { $key=$self->{Sel}; }3390 else { $key=$self->{Sel}; }
3391 return unless defined $key;
3388 my $aa=$self->{aa};3392 my $aa=$self->{aa};
3389 $self->pic_update;3393 $self->pic_update;
3390 $self->{Ltitle}->set_markup( AA::ReplaceFields($key,"<big><b>%a</b></big>",$aa,1) );3394 $self->{Ltitle}->set_markup( AA::ReplaceFields($key,"<big><b>%a</b></big>",$aa,1) );
@@ -3434,6 +3438,7 @@
3434sub setpic3438sub setpic
3435{ my $img=shift;3439{ my $img=shift;
3436 my $self= ::find_ancestor($img,__PACKAGE__);3440 my $self= ::find_ancestor($img,__PACKAGE__);
3441 return unless defined $self->{SelID};
3437 my $file= $img->{filename}= AAPicture::GetPicture($self->{aa},$self->{Sel});3442 my $file= $img->{filename}= AAPicture::GetPicture($self->{aa},$self->{Sel});
3438 my $pixbuf= $file ? GMB::Picture::pixbuf($file,$img->{size}) : undef;3443 my $pixbuf= $file ? GMB::Picture::pixbuf($file,$img->{size}) : undef;
3439 $img->set_from_pixbuf($pixbuf);3444 $img->set_from_pixbuf($pixbuf);
@@ -3496,7 +3501,7 @@
3496);3501);
3497our @DefaultOptions=3502our @DefaultOptions=
3498( nb => 1,3503( nb => 1,
3499 fields => $SelectorMenu[0][1],3504 fields => $SelectorMenu[2][1],
3500 autofilter =>1,3505 autofilter =>1,
3501);3506);
35023507
@@ -3568,14 +3573,6 @@
3568 $self->{$key}=$value;3573 $self->{$key}=$value;
3569 $self->DoFilter unless $self->get_text eq '';3574 $self->DoFilter unless $self->get_text eq '';
3570}3575}
3571sub ToggleField
3572{ my ($self,$field)=@_;
3573 my @list= split /\|/,$self->{fields};
3574 my $nb=@list;
3575 @list= grep $_ ne $field, @list; #remove
3576 push @list,$field if $nb==@list; #add if not removed
3577 $self->ChangeOption(fields=> join '|',@list );
3578}
35793576
3580sub PopupSelectorMenu3577sub PopupSelectorMenu
3581{ my $self=shift;3578{ my $self=shift;
@@ -3592,9 +3589,9 @@
3592 my $item1=Gtk2::MenuItem->new(_"Select search fields");3589 my $item1=Gtk2::MenuItem->new(_"Select search fields");
3593 $item1->set_submenu( ::BuildChoiceMenu(3590 $item1->set_submenu( ::BuildChoiceMenu(
3594 { map { $_=>Songs::FieldName($_) } Songs::StringFields(),qw/file path year/,},3591 { map { $_=>Songs::FieldName($_) } Songs::StringFields(),qw/file path year/,},
3595 'reverse' =>1,3592 'reverse' =>1, return_list=>1,
3596 check=> sub { [split /\|/,$self->{fields}]; },3593 check=> sub { [split /\|/,$self->{fields}]; },
3597 code => sub { $self->ToggleField($_[1]); },3594 code => sub { $self->ChangeOption(fields=> join '|',@{$_[1]} ); },
3598 ) );3595 ) );
3599 $menu->append($item1);3596 $menu->append($item1);
3600 $menu->append(Gtk2::SeparatorMenuItem->new);3597 $menu->append(Gtk2::SeparatorMenuItem->new);
@@ -5463,8 +5460,7 @@
5463}5460}
54645461
5465sub PopupOpt5462sub PopupOpt
5466{ my ($widget,$event)=@_;5463{ my $self=::find_ancestor($_[0],__PACKAGE__);
5467 my $self=::find_ancestor($widget,__PACKAGE__);
5468 ::PopupContextMenu(\@OptionsMenu, { self=>$self, usemenupos => 1,} );5464 ::PopupContextMenu(\@OptionsMenu, { self=>$self, usemenupos => 1,} );
5469 return 1;5465 return 1;
5470}5466}
@@ -6609,10 +6605,7 @@
6609 { if ($answer && !defined $depth && !vec($self->{selected},$row,1))6605 { if ($answer && !defined $depth && !vec($self->{selected},$row,1))
6610 { $self->song_selected($event,$row);6606 { $self->song_selected($event,$row);
6611 }6607 }
6612 my @IDs=$self->GetSelectedIDs;6608 $self->PopupContextMenu;
6613 my %args=(self => $self, mode => $self->{type}, IDs => \@IDs, listIDs => $self->{array});
6614 ::PopupContextMenu(\@::SongCMenu,\%args );
6615
6616 return 1;6609 return 1;
6617 }6610 }
6618 else# ($but==1)6611 else# ($but==1)
66196612
=== modified file 'gmusicbrowser_mplayer.pm'
--- gmusicbrowser_mplayer.pm 2013-08-27 20:31:56 +0000
+++ gmusicbrowser_mplayer.pm 2014-02-15 20:02:02 +0000
@@ -95,7 +95,7 @@
95 #SkipTo(undef,$sec) if $sec;95 #SkipTo(undef,$sec) if $sec;
9696
97 $OUTPUTfh->blocking(0); #set non-blocking IO97 $OUTPUTfh->blocking(0); #set non-blocking IO
98 warn "playing $file (pid=$ChildPID)\n";98 warn "playing $file (pid=$ChildPID)\n" if $::Verbose;
99 $WatchTag= Glib::IO->add_watch(fileno($OUTPUTfh),'hup',\&_eos_cb);99 $WatchTag= Glib::IO->add_watch(fileno($OUTPUTfh),'hup',\&_eos_cb);
100 $WatchTag2=Glib::IO->add_watch(fileno($OUTPUTfh),'in',\&_remotemsg);100 $WatchTag2=Glib::IO->add_watch(fileno($OUTPUTfh),'in',\&_remotemsg);
101 #Glib::Timeout->add(500,\&_UpdateTime);101 #Glib::Timeout->add(500,\&_UpdateTime);
102102
=== modified file 'gmusicbrowser_songs.pm'
--- gmusicbrowser_songs.pm 2014-01-25 14:17:08 +0000
+++ gmusicbrowser_songs.pm 2014-02-15 20:02:02 +0000
@@ -3364,6 +3364,8 @@
3364use base 'SongArray';3364use base 'SongArray';
3365our %Filter;3365our %Filter;
3366our %Sort;3366our %Sort;
3367our %needupdate;
3368
3367INIT3369INIT
3368{ ::Watch(undef, SongsChanged => \&SongsChanged_cb);3370{ ::Watch(undef, SongsChanged => \&SongsChanged_cb);
3369 ::Watch(undef, SongsAdded => \&SongsAdded_cb);3371 ::Watch(undef, SongsAdded => \&SongsAdded_cb);
@@ -3389,6 +3391,7 @@
3389{ my $self=$_[0];3391{ my $self=$_[0];
3390 delete $Filter{$self};3392 delete $Filter{$self};
3391 delete $Sort{$self};3393 delete $Sort{$self};
3394 delete $needupdate{$self};
3392 @list_of_AutoUpdate= grep defined, @list_of_AutoUpdate;3395 @list_of_AutoUpdate= grep defined, @list_of_AutoUpdate;
3393 ::weaken($_) for @list_of_AutoUpdate;3396 ::weaken($_) for @list_of_AutoUpdate;
3394 $self->SUPER::DESTROY;3397 $self->SUPER::DESTROY;
@@ -3405,6 +3408,7 @@
3405 @$self=@$list;3408 @$self=@$list;
3406 ::HasChanged('SongArray',$self,'update',\@old);3409 ::HasChanged('SongArray',$self,'update',\@old);
3407 }3410 }
3411 else { ::HasChanged('SongArray',$self,'mode'); }
3408}3412}
3409sub Sort3413sub Sort
3410{ my ($self,$sort)=@_;3414{ my ($self,$sort)=@_;
@@ -3423,7 +3427,8 @@
3423sub SongsAdded_cb3427sub SongsAdded_cb
3424{ my (undef,$IDs)=@_;3428{ my (undef,$IDs)=@_;
3425 for my $self (grep defined, @list_of_AutoUpdate)3429 for my $self (grep defined, @list_of_AutoUpdate)
3426 { my $filter=$Filter{$self};3430 { next if ($needupdate{$self}||0)>1;
3431 my $filter=$Filter{$self};
3427 my ($greponly)=$filter->info;3432 my ($greponly)=$filter->info;
3428 if ($greponly)3433 if ($greponly)
3429 { my $toadd=$filter->filter($IDs);3434 { my $toadd=$filter->filter($IDs);
@@ -3436,12 +3441,27 @@
3436 }3441 }
3437 }3442 }
3438 else3443 else
3439 { $self->_update_full;3444 { $needupdate{$self}=2;
3445 ::IdleDo('7_autoupdate_update'.$self,6000, \&delayed_update_cb,$self);
3446 }
3447 }
3448}
3449sub delayed_update_cb
3450{ my $self=shift;
3451 my $need= delete $needupdate{$self};
3452 return unless $need;
3453 if ($need>1) { $self->_update_full }
3454 else
3455 { my @old=@$self;
3456 Songs::SortList($self,$Sort{$self});
3457 if ("@old" ne "@$self") #only update if there was a change
3458 { ::HasChanged('SongArray',$self,'update',\@old);
3440 }3459 }
3441 }3460 }
3442}3461}
3443sub _update_full3462sub _update_full
3444{ my $self=shift;3463{ my $self=shift;
3464 delete $needupdate{$self};
3445 my @old=@$self;3465 my @old=@$self;
3446 my $list=$Filter{$self}->filter;3466 my $list=$Filter{$self}->filter;
3447 Songs::SortList($list,$Sort{$self});3467 Songs::SortList($list,$Sort{$self});
@@ -3452,12 +3472,19 @@
3452sub SongsChanged_cb3472sub SongsChanged_cb
3453{ my (undef,$IDs,$fields)=@_;3473{ my (undef,$IDs,$fields)=@_;
3454 for my $self (grep defined, @list_of_AutoUpdate)3474 for my $self (grep defined, @list_of_AutoUpdate)
3455 { if ($Filter{$self}->changes_may_affect($IDs,$fields,$self)) #re-filter and re-sort3475 { next if ($needupdate{$self}||0)>1;
3456 { $self->_update_full;3476 my $delayed;
3457 }3477 if ($Filter{$self}->changes_may_affect($IDs,$fields,$self))
3458 elsif (::OneInCommon($fields,Songs::SortDepends($Sort{$self}))) #re-sort3478 { #re-filter and re-sort
3459 { $self->Sort($Sort{$self});3479 $needupdate{$self}=2;
3460 }3480 $delayed=1;
3481 }
3482 elsif ($self->AreIn($IDs) && ::OneInCommon($fields,Songs::SortDepends($Sort{$self})))
3483 { #re-sort
3484 $needupdate{$self}=1;
3485 $delayed=1;
3486 }
3487 ::IdleDo('7_autoupdate_update'.$self,6000, \&delayed_update_cb,$self) if $delayed;
3461 }3488 }
3462}3489}
34633490
@@ -3498,9 +3525,9 @@
3498 ::QHasChanged('Sort');3525 ::QHasChanged('Sort');
3499 ::QHasChanged('Pos');3526 ::QHasChanged('Pos');
3500}3527}
3501sub SetSortAndFilter #FIXME could be optimized3528sub SetSortAndFilter #FIXME could be optimized #FIXME only called from a songtree/songlist for now, and as these calls are usually not about setting the level 0 filter, it doesn't actually change the filter for now, just the list, as it needs multi-level filters to work properly
3502{ my ($self,$sort,$filter)=@_;3529{ my ($self,$sort,$filter)=@_;
3503 $self->SetFilter($filter);3530 $self->Replace($filter->filter,filter=>$filter); #$self->SetFilter($filter); #FIXME use SetFilter once multi-level filters are implemented
3504 $self->Sort($sort);3531 $self->Sort($sort);
3505}3532}
3506sub Replace3533sub Replace
35073534
=== modified file 'layout_doc.html'
--- layout_doc.html 2014-01-25 14:17:08 +0000
+++ layout_doc.html 2014-02-15 20:02:02 +0000
@@ -1,813 +0,0 @@
1<h1>Layout documentation</h1>
2
3<h2>Introduction</h2>
4
5<p>Gmusicbrowser's interface is defined by layouts. Each layout define a window that contain several containers, each containing widgets. <br />
6Layouts are used in many places in gmusicbrowser : the main window, the "traytip" popup, the fullscreen mode, the search and browser windows, pages that can be inserted as a tab, desktop widgets (plugin), the titlebar overlays (plugin), as well as some internal windows (such as the queue, equalizer).</p>
7
8<p>Note that this documentation is likely incomplete, and could be improved. Don't hesitate to suggest improvements, ask for clarification, or point out missing informations.</p>
9
10<h2>Advice for testing layouts</h2>
11
12<p>Experimenting with layouts is highly encouraged. When doing so, it is recommended to launch gmusicbrowser from the command-line as some layout errors can be printed on the terminal. A good way to do that is launch gmusicbrowser with the <code>-layout</code> (or <code>-l</code>) followed by the layout identifier, this will directly open the desired layout.
13 You can then easily quit without saving by pressing ctrl-c in the terminal, an advantage of this exit method is that it always works (no matter what your layout contains) and that no setting for the layout will be saved, so that you can see it each time as a new user would. Note that the auto-save plugin might still save the options, the <code>-demo</code> option will prevent any writing of the gmbrc. You can also use a copy of your gmbrc file and use the <code>-cfg</code> option to tell gmb to use the copy.</p>
14
15<h2>Layout files</h2>
16
17<p>Layouts are defined using text files, each file can contain one or more layout. <br />
18Layout files use the <code>.layout</code> extension, they are found in 2 places:</p>
19
20<ul>
21<li>the default layouts included with gmusicbrowser are in installed <code>/usr/share/gmusicbrowser/layouts/</code></li>
22<li>custom layouts can be added by putting them in <code>~/.config/gmusicbrowser/layouts</code>, which can be either a file or a folder containing multiple <code>.layout</code> files (read in alphabetical order)</li>
23</ul>
24
25<h2>Layout syntax</h2>
26
27<p>A layout definition begins with a line containing a layout identifier enclosed in square brackets (<code>[]</code>) such as: <code>[some_layout_id]</code>.</p>
28
29<p>(Layouts files may also contain group and column definition for the SongTree widget (see the <a href="http://wiki.gmusicbrowser.org/customization/songtree">SongTree documentation</a> for details). These group and column definitions begin with lines between <code>{}</code>. The definitions include all the following lines up to the next <code>[]</code> or <code>{}</code> line, or to the end of the file.)</p>
30
31<p>layout definition syntax :</p>
32
33<pre><code>[layout_id]
34key1 = value
35key2 = value
36...
37</code></pre>
38
39<p><code>layout_id</code> is the string used to identify the layout. It can contain spaces or other special characters but it is recommended that only alphanumeric characters (<code>A-Z</code>, <code>a-z</code>, <code>0-9</code> and <code>_</code>) be used, otherwise it may harder or impossible to use the layout with some advanced features. If you want to give the layout a nice name use the <a href="#layoutname">Name</a> property explained below.</p>
40
41<p>Long lines can be be split into multiple lines by ending them with a backslash (the backslash is optional as long as the next line doesn't begin with something like <code>word=</code>). <br />
42Keys define either containers or properties, they only use simple alphanumeric characters : <code>A-Z a-z _ 0-9</code> . <br />
43Keys are unique for a layout, duplicate key definitions replace the previous one.</p>
44
45<p>If the name of the key begins with one of : HB, VB, HP, VP, MB, EB, TB, FR, NB (and some others, see below) the key is the name of a container that will contain widgets (also called layout elements or controls) or other containers. <br />
46For containers the value is a list of children (widgets and/or other containers), separated by a space and preceded by optional packing options. The widget names can be followed by a number (to have multiple widgets of the same name) and its options between parentheses.</p>
47
48<p>There must be one, and only one, container which has no parent, this container will be put in the layout window.</p>
49
50<h3>Simple examples</h3>
51
52<p>Very simple example, with 3 buttons (settings, play/pause, and open browser window) and the current song title :</p>
53
54<pre><code>[very_simple]
55Type = G
56HBox = Pref Play OpenBrowser _Title
57</code></pre>
58
59<p>Type=G (G for generic) is used to make it appear in the player layouts list in the settings dialog. The <code>_</code> before Title is used to make the Title use all the available space in the horizontal box (HBox) it is packed in. The 4 widgets are put into a HB (= horizontal box) container, so they will be placed in a line.</p>
60
61<pre><code>[simple]
62Type=G
63VBmain = MBmenu HBbuttons Title Text(markup="&lt;i&gt;by&lt;/i&gt; $artist &lt;i&gt;in&lt;/i&gt; $album")
64MBmenu = MainMenuItem
65HBbuttons= Prev Play Next
66</code></pre>
67
68<p>This layout has 3 containers, <code>VBMain</code> being the parent widget for <code>MBmenu</code> and <code>HBbuttons</code>. The <code>Title</code> widget displays the current song's title and <code>Text</code> has an option that defines what it should display, complete with <a href="http://developer.gnome.org/pango/stable/PangoMarkupFormat.html">pango markup</a> and <a href="#songvar">$-words</a>. This layout will show, vertically : a menu, buttons, title, and the text widget showing artist and album.</p>
69
70<p>Look in the layouts files (installed in <code>/usr/share/gmusicbrowser/layouts/</code>) for more examples.</p>
71
72<h2>Normal containers</h2>
73
74<p>Containers are used to organize the widgets inside the window. They accept options that must be specified in parenthesis before the child widgets list. For example :</p>
75
76<pre><code>HBname = (option1=value1,option2=value2) widget1 widget2
77</code></pre>
78
79<p>All containers accept the option <code>border</code> to specify the amount of padding around the container.</p>
80
81<h4>HB/VB : Horizontal/Vertical Boxes (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkBox.html">GtkBox</a>)</h4>
82
83<p>These containers group widgets horizontally or vertically. Optional packing options are :</p>
84
85<ul>
86<li>a number : padding (in pixels)</li>
87<li>an underscore <code>_</code> : expand (the widget will use all remaining space in the container)</li>
88<li>a dash <code>-</code> : right aligned</li>
89<li><p>a dot <code>.</code> : fill (rarely needed)</p>
90
91<p>Example : <br />
92<code>HBname = 2_-widget1(opt1=val,opt2=val) -widget2 2container3</code></p>
93
94<p>Cover and ArtistPic widgets are treated specially, they ignore the expand mode, and expand until they reach a square size. For instance, in a HBox which has a height of 30, a Cover widget will use available space to expand if it has a width less than 30. <br />
95Note that the maxwidth and maxheight widgets options only work inside a HB and a VB respectively.</p></li>
96</ul>
97
98<h4>HP/VP : Horizontal/Vertical Panes (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkPaned.html">GtkPaned</a>)</h4>
99
100<p>Same as HB/VB but they contain only 2 widgets <br />
101 They only have one packing option, the underscore <code>_</code>. It sets the expand propriety that tells the container that this widget should give or receive space when the container is resized. <br />
102 If both children have the expand propriety, they will both give or receive space when the container is resized. </p>
103
104<h4>TB : Notebook (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkNotebook.html">GtkNotebook</a>) <em>(deprecated)</em></h4>
105
106<p>Each widget is in a tab, no packing options but the syntax is a bit different, each widget is preceded by the tab title. <br />
107 The title can have spaces by using quotes, for example :</p>
108
109<pre><code>TBname = title1 widget1(options) "title with spaces" widget2(options) title3 container3
110</code></pre>
111
112<h4>NB : Notebook (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkNotebook.html">GtkNotebook</a>) <em>(new version)</em></h4>
113
114<p>No packing options, syntax is simply the list of children.</p>
115
116<p>A title and an optional icon is given by children options <code>tabtitle</code> and <code>tabicon</code>. For example :</p>
117
118<pre><code>NBname = widget1(tabtitle="a title",other_option=value) widget2(tabtitle="other tab",tabicon=gmb-list) widget3(tabtitle=third)
119</code></pre>
120
121<p>Tab position and rotation can be set by using <code>tabpos</code> option, which can be one of left, right, top, or bottom, optionally followed by an angle : 0, 90, 180 or 270 <br />
122 Example : <br />
123 <code>NBname = (tabpos=left90) children1 children2</code></p>
124
125<p>The <code>hidetabs=1</code> container option can be used to hide the tabs, this is meant to be used with commands that use SetFocusOn to change the visible page/child</p>
126
127<p>As this container is in fact a TabbedLists/Context with different default options, it also accept the TabbedLists/Context widget options.</p>
128
129<h4>EB : Expander (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkExpander.html">GtkExpander</a>)</h4>
130
131<p>Contains only one child, that child can be shown/hidden by clicking on the expander
132 Option : <code>label</code> sets the text that will be displayed next to the expander. <br />
133 Examples :</p>
134
135<pre><code>EBname = (label="optional label") widget1`
136EBsimple = widget2`
137</code></pre>
138
139<h4>FB : Fixed (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkFixed.html">GtkFixed</a>)</h4>
140
141<p>Each widget is positioned at precise coordinates <br />
142 Syntax : <code>FBname = x1,y1 widget1 x2,y2,w2,h2 widget2 ...</code> <br />
143 The widget is positioned at the x,y coordinate. <br />
144 An optional width and height can follow the coordinates, to specify how much space the widget should use. An height or width of 0 means leave it as default. <br />
145 x,y,w,h can be relative to the width/height of the container by preceding the number with a dot (<code>.</code>) <br />
146 x,y can be relative to the right/bottom border by prefixing it with minus (<code>-</code>).</p>
147
148<h4>MB : Menu Bar</h4>
149
150<p>They can only contain MenuItem widgets or SM containers, no packing options</p>
151
152<h4>SM : Submenu</h4>
153
154<p>They can only contain MenuItem widgets or SM containers, no packing options, label is set with the <code>label</code> container option</p>
155
156<h4>BM : Button menu</h4>
157
158<p>They can only contain MenuItem widgets or SM containers, no packing options. <br />
159 Container options :</p>
160
161<ul>
162<li>label : set the button label</li>
163<li>icon : set an icon</li>
164<li>relief : (default to none) button relief</li>
165<li>size : (default to menu) size of the icon</li>
166</ul>
167
168<h4>FR : Frame (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkFrame.html">GtkFrame</a>)</h4>
169
170<p>Draw a border around its child, with an optional label. (Can only contain one child) <br />
171 Container options :</p>
172
173<ul>
174<li>shadow : one of <code>none</code>, <code>in</code>, <code>out</code>, <code>etched-in</code> (default), <code>etched-out</code></li>
175<li>label : optional text of the frame label</li>
176</ul>
177
178<h4>SB : Scrolled window (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkScrolledWindow.html">GtkScrolledWindow</a>)</h4>
179
180<p>Adds scrollbars to its child. (Can only contain one child)</p>
181
182<h4>AB : Alignment (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkAlignment.html">GtkAlignment</a>)</h4>
183
184<p>Controls the alignment and size of its child. (Can only contain one child) <br />
185 Container options :</p>
186
187<ul>
188<li>xalign : Horizontal position of child in available space, value between 0(left) and 1(right), default to .5 (center)</li>
189<li>yalign : Vertical position of child in available space, value between 0(top) and 1(bottom), default to .5 (center)</li>
190<li>xscale : If available horizontal space is bigger than needed for the child, how much of it to use for the child. 0.0 means none, 1.0 means all (default to 1)</li>
191<li>yscale : If available vertical space is bigger than needed for the child, how much of it to use for the child. 0.0 means none, 1.0 means all (default to 1)</li>
192</ul>
193
194<h4>WB : Event window</h4>
195
196<p>This container is used to have control over the background or mouse events on its child. (Can only contain one child)
197 Some containers and widgets (like HB/VB) do not have their own gdkwindow and thus can't control their background or mouse events. Putting them inside a WB allows working around that.
198 For example for having a window pop-up when the mouse is above a HB container, using the <code>hover_layout</code> option on the HB won't work, but putting the HB inside a WB and using the <code>hover_layout</code> option on the WB will work. It's also a way to paint the background of a HB using a custom gtk theme.</p>
199
200<h2>Special containers</h2>
201
202<p>There is also 2 special containers, widgets in these containers must belong to a normal container, and as the widget is defined elsewhere, widgets options can not be set here. These containers can be viewed as layout properties that take a list of widgets as value.</p>
203
204<h4>HSize/VSize : Size groups (see <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkSizeGroup.html">GtkSizeGroup</a>)</h4>
205
206<p>Force all widgets to have the same Horizontal/Vertical size, if the list of widgets begin with a number, the first widget Horizontal/Vertical size will be set to this number (in pixels) <br />
207 Example :</p>
208
209<pre><code>HSize0 = 20 widget1 widget2
210HSize1 = widget3 widget4
211</code></pre>
212
213<h4>VolumeScroll :</h4>
214
215<p>A unique virtual container (must be the exact name). For all widgets or containers inside, the scroll wheel will modify the volume (unless the scroll event is intercepted, like in a scrollable list). <br />
216 Example :</p>
217
218<pre><code>VBmain= Title HBbuttons TimeBar
219HBbuttons= Pref Play
220VolumeScroll= Title HBbuttons
221</code></pre>
222
223<h2>Layout properties</h2>
224
225<h4>Title</h4>
226
227<p>Set a title for the window. If not set, the window title defaults to <em>Song Title by Artist</em> (<code>%S by %a</code>) (see <a href="#songvar">%-letters and $-words</a>) </p>
228
229<pre><code>Title = gmusicbrowser playing %S by %a from %l
230</code></pre>
231
232<h4>Type</h4>
233
234<p>A String of letters (most of the time only one letter) defining the type(s) of a layout, possible types :</p>
235
236<ul>
237<li>G Generic or player window</li>
238<li>B Browser window</li>
239<li>T Tray window</li>
240<li>F Fullscreen</li>
241<li>S Search</li>
242<li>P Page for use in TabbedLists/NB/Context</li>
243<li>O titlebar Overlay used by the titlebar plugin</li>
244<li>D Desktop widget used by the "Desktop widgets" plugin</li>
245<li><p>K for Karaoke plugin <em>(there is not yet an option to change the layout in the plugin)</em></p>
246
247<p>Layouts of type G may optionally be followed a plus sign <code>+</code> that will make the layout appear in the LayoutItem sub-menu. This should only be used by layouts that include a LayoutItem. The idea is that users must be able to switch between the different '+' layouts easily.</p>
248
249<p>Layouts work perfectly fine without a type, layouts without a type just won't be listed anywhere in the GUI. But they can for be opened with the <code>OpenCustom</code> command or with the <code>-layout</code> command-line option.</p></li>
250</ul>
251
252<h4><a id=layoutname> Name </a></h4>
253
254<p>Set the name of the layout displayed in the settings dialog. The default Name is the layout id. <br />
255 Contrary to the layout id, the Name can be changed without losing the layout's saved settings (window size, ...). <br />
256 The name can be marked as translatable by using the syntax <code>Name= _"name of the layout"</code></p>
257
258<h4>Title and Icon</h4>
259
260<p>Used to define a tab title and a tab icon if the layout is used as a page in a NB/TabbedLists/Context</p>
261
262<h4>Default <em>(mostly deprecated)</em></h4>
263
264<p>Default options used when the layout has no saved state, contains a space-separated list of keys and values, by pair, <code>widget_or_container_name widget_or_container_variable_options</code>.</p>
265
266<p>There is a special key : Window, for the window properties, see the Window layout property below.</p>
267
268<p>Example :</p>
269
270<pre><code>Default = Window size=1120x820,sticky=0 HPbig 780 FPane0 page=artist
271</code></pre>
272
273<p>This is mostly deprecated as now default options can be specified among the normal widget options, but it is still used a bit, in particular for HP/VP containers.</p>
274
275<h4>KeyBindings</h4>
276
277<p>Pairs of keys and action, example :</p>
278
279<pre><code>KeyBindings = Insert OpenSearch c-q EnqueueSelected c-Insert OpenCustom(a_layout_id)
280</code></pre>
281
282<p>Key names are as shown in the key binding tab in the settings dialog. <br />
283 Commands can be found by running gmusicbrowser with command-line option <code>-listcmd</code>.</p>
284
285<h4>DefaultFocus</h4>
286
287<p>Set which widget gets the initial focus in the window.
288 It might not work with some complex widgets though it is easy to fix, just ask me if you'd like to enable it for a widget that currently doesn't support it. <br />
289Example :</p>
290
291<pre><code>HBmain= Pref Play _Title
292DefaultFocus= Play
293</code></pre>
294
295<h4>DefaultFont and DefaultFontColor</h4>
296
297<p>Set a default font and font color for widgets that use a font or a color option.</p>
298
299<h4>SkinPath and SkinFile</h4>
300
301<p>Used to set a picture file to be used as a skin, that can be used to set a window background, see the <a href="http://wiki.gmusicbrowser.org/customization/skins">skin documentation</a>.</p>
302
303<h4>Window</h4>
304
305<p>Set some window options :</p>
306
307<ul>
308<li><p><code>pos</code> and <code>size</code> : set the default size and position of the window, format is numberxnumber, values can be relative by using a %. For example : <code>pos=0x20</code> or <code>pos=50%x20%</code>. <br />
309If a percentage is used for <code>pos</code>, the window will be centered on this position by default. This can be changed by appending a percentage relative to the size of the window. <br />
310For example <code>pos=50%-50%x0+10%</code> will put the window at <code>x= screenwidth/2 - windowwidth/2</code> and <code>y= 0 + windowheight/10</code></p></li>
311<li><p><code>fixedsize</code>: set a fixed size for the window, -1 means the normal minimum width/height of the window. Example: <code>fixedsize=200x-1</code></p></li>
312<li><p><code>sticky</code>, <code>ontop</code>, <code>below</code> and <code>fullscreen</code> : can be set to 1 (true) ot 0 (false). Note that it only sets the default, if this window property is changed by the user it will be saved.</p></li>
313<li><p><code>insensitive</code>: if set to 1, makes the window completely insensitive to mouse or keyboard.</p></li>
314<li><p><code>transparent</code>: if set to 1, makes the window background transparent (requires Cairo perl module and a compositing window manager to work).</p></li>
315<li><p><code>shape</code>: when used with a background skin and with the transparent=1 option, it will make the window "transparent to input" where the alpha value is inferior to the shape option. Example : <code>Window = transparent=1, shape=10</code></p></li>
316<li><p><code>opacity</code>: value is a number between 0 and 1, requires a compositing window manager</p></li>
317<li><p><code>dragtomove</code>: if set to 1 the window can be moved by clicking on an empty area of the window</p></li>
318<li><p><code>uniqueid</code>: a string, default to layout id, used by the option <code>ifexist</code>. Note that this option is overridden for the usual windows (player, browser, search ...), but can be used at least with the <code>OpenCustom</code> command</p></li>
319<li><p><code>ifexist</code>: define the action to take when attempting to create a window with the same <code>uniqueid</code> as an existing window, it can be one of toggle(close existing window), present(bring the existing window to the front), replace(close the existing window and open a new window)</p></li>
320</ul>
321
322<h2>Derived layouts</h2>
323
324<p>A layout can be derived from a previously defined layout by adding <code>based on</code>, followed by the layout id of the layout it is based on:</p>
325
326<pre><code>[layout_id] based on this_other_layout_id
327</code></pre>
328
329<p>In this case the layout starts with all the key definitions of the other layout, each key can be re-defined or deleted (if nothing follows the <code>=</code>). <br />
330This method of deriving layouts is only recommended for very small variants where only one or two line changes, as it might easily break if the original layout changes.</p>
331
332<h2>Widgets</h2>
333
334<h3>Widgets options</h3>
335
336<p>Widget options are specified in the layout definition, in parentheses, after the name of the widget. Options are a list of keywords and values, separated by commas (with optional spaces). For example :</p>
337
338<pre><code>VBmain= widget1(key1=value1,key2=value2, key3=value3) widget2(anotherkey=somevalue)
339</code></pre>
340
341<p>There are 2 kind of widget options. The first one (let's call them <strong>layout-set</strong> options) are the options that can only be set in the layout definition, most of the options described in this document are of this kind. The second kind (let's call them <strong>user-set</strong> options) are the options that the user can change in the GUI and are saved when the window is closed. The layout definition can change the default value of the user-set options, but if the user has already used the layout once, the user-set options will use their last recorded value and ignore the value set in the layout definition. As mentioned earlier, you can use the <code>-demo</code> command-line option to prevent the user-set options from having a recorded value and be able to test the value set in the layout definition.</p>
342
343<p>Most of these user-set options are not documented here. To discover them you just need to use the widget in a layout and then look at the file containing the saved options (~/.config/gmusicbrowser/gmbrc) for the line containing the layout id, then for the line containing the widget name, the following lines contain the saved widget options. Some of these options may contain sub-options (for example a FilterPane has a set of sub-options for each of its page), a default for these sub-options can be set in the layout by using a slash (<code>/</code>) to separate option and sub-option. Example : <code>FilterPane(page_album/mode=mosaic)</code></p>
344
345<p>In the future, some of the layout-set options may become user-set options, as more options are exposed to the GUI.</p>
346
347<h3>Generic widget options</h3>
348
349<p>A number of options work on a lot of widgets and containers</p>
350
351<h4>size options</h4>
352
353<ul>
354<li><code>minwidth</code> and <code>minheight</code> : specify a minimum width or height, will not work on some widget</li>
355<li><code>maxwidth</code> and <code>maxheight</code> : only works if the widget is inside of a HB/VB container, specify a maximum expansion width or height</li>
356<li><code>expand_weight</code>: default to 1, used to specify a higher priority to get extra space from a HB/VB</li>
357</ul>
358
359<h4>click options</h4>
360
361<p>A lot of widgets, in particular text labels, indicators and buttons can use the option <code>click1</code> (or <code>click2</code> ...) to (re)define the action executed when the widget is clicked with mouse button 1 (or 2 ...). <br />
362Example : <code>Play(click2=OpenSongProp)</code> <br />
363Button widgets also accept the option <code>activate</code> to (re)define the action executed when the button is activated with a mouse click or keyboard</p>
364
365<h4><code>tip</code> option</h4>
366
367<p>A lot of widgets, in particular labels, indicators and buttons can use the option <code>tip</code> to define a tool-tip for the widget. The tip may contain <a href="#songvar">%-letters and $-words</a> to display informations on the current song. <br />
368Example : <code>Title(tip="last played : $lastplay")</code></p>
369
370<h4><code>cursor</code> option</h4>
371
372<p>Another common option, it is used to change the mouse cursor when it hovers over the widget. <br />
373Example : <code>Play(cursor=hand2)</code> <br />
374See <a href="http://gtk2-perl.sourceforge.net/doc/pod/Gtk2/Gdk/Cursor.html#enum_Gtk2_Gdk_Cursor">this page</a> for a list of cursor names.</p>
375
376<h4><code>hover_layout</code> option</h4>
377
378<p>Many widgets and containers can use the <code>hover_layout=ALayoutName</code> option. It causes a window using the ALayoutName layout to pop-up when the mouse hover on the widget (for more than 1000ms, or the value set by the hover_delay option, use 1000ms if set to 0). The popped-up window disappear when the mouse exit the window. <br />
379Only the widget or container that have their own gdkwindow can use this option. For the other widgets/containers, they can be placed inside a WB and use the <code>hover_layout</code> option on this EW. <br />
380The <code>hover_layout_pos</code> option can used to control the position of the popped window, see <a href="http://git.gmusicbrowser.org/commit/41b0c69b45">this commit</a> <br />
381Simple example of the <code>hover_layout</code> option to popup a big cover when the mouse hover on a Cover widget, by defining the Cover widget with this option : <code>Cover(hover_layout=CoverPopup)</code>, where CoverPopup is the the layout :</p>
382
383<pre><code>[CoverPopup]
384VBmain= Cover(minsize=800,maxsize=800,click1=CloseWindow)
385</code></pre>
386
387<p>To make the layout popup when the Cover widget is clicked rather than hovered, use this option : <code>Cover(click1=PopupCustom(CoverPopup))</code></p>
388
389<h4><code>group</code> option</h4>
390
391<p>The <code>group</code> option is used to link a widget to a songlist (or equivalent widget) or to a song or set of songs. There are 2 type of links associated with the group option (they will be separable in the future), links to 1 song (like the current song or the last clicked song in a songlist), and the links to a set of songs (like the playlist or the content of a songlist), most widgets only use one type of links, some use both.</p>
392
393<p>If the group option is not specified, most filter-oriented widgets (like songlist and FilterPane) will use a default group, local to the window. The song-oriented widget will often default to the group Play (like the Title/Artist/... widgets) to follow the current song. <br />
394Group names that begin with an upper-case letter are global, the others are local to the window. <br />
395There are a few special predefined groups : </p>
396
397<ul>
398<li>Play : links to the current song or the playlist </li>
399<li>Next or NextN : link to the next song or the (N+1)th next song. The next song can be undefined, in particular when in a random weighted mode </li>
400<li>Recent or RecentN : link to the previously played song or the (N+1)th previously played song </li>
401</ul>
402
403<p>Examples : </p>
404
405<ul>
406<li><p>linking 2 FilterPane a SimpleSearch and a Total widget with a SongList (if there is no other songlist-like widget in the layout, using the group option is not needed as the default group will do fine) :</p>
407
408<pre><code>VBmain= HPfilterpanes SimpleSearch(group=1) _SongList(group=1) Total(group=1)
409HPfilterpanes= FilterPane1(group=1,nb=1) FilterPane2(group=1,nb=2)
410</code></pre></li>
411<li><p>Title widget that display the next song's title :</p>
412
413<pre><code>Title2(group=Next, markup_empty="&lt;i&gt;no next song&lt;/i&gt;")
414</code></pre></li>
415<li><p>making a Text widget display the title and artist of the song selected in a SongList :</p>
416
417<pre><code>VBox= Text0(group=mygroup, markup="$title by $artist", markup_empty="&lt;i&gt;no selected song&lt;/i&gt;") _SongList(group=mygroup)
418</code></pre></li>
419</ul>
420
421<h4>Options common to the text widgets</h4>
422
423<p>The text widgets (sometimes called label widgets) include : Title, Title_by, Album, Artist, Comment, Year, Length, PlayingTime, Pos, and Text</p>
424
425<ul>
426<li>font : change the default font, the value use the <a href="http://developer.gnome.org/pango/stable/pango-Fonts.html#pango-font-description-from-string">pango font syntax</a>, for example : <code>12</code>, <code>Sans Italic 12</code>, <code>Monospace</code>. (Note that the font for a part of the string can be set in pango markup)</li>
427<li>color : set the default font color, value is an RGB color specification such as <code>#00FF00</code> or a color name such as <code>red</code>. (Note that the color for a part of the string can be set in pango markup)</li>
428<li>minsize : if set (it is set by default for Album, Artist, Comment, Title, Title_by), the label will request a minimum width (it can have more if packed with the expand option in a container), if the width is not enough to display the text, the text will scroll on mouse-over. The value of the <code>minsize</code> option is the width it will request, the unit is in pixels if followed by a <code>p</code> or in the width of the <code>X</code> character if it is only a number
429markup : can be used to re-define the text displayed, you can use <a href="#songvar">%-letters and $-words</a> (like <code>%t</code>, <code>%a</code>, ...) for current-song dependent text, and <a href="http://library.gnome.org/devel/pango/stable/PangoMarkupFormat.html">pango markup</a> (like <code>&lt;b&gt;...&lt;/b&gt;</code>)for formatting.</li>
430<li><code>markup_empty</code> : for Text/Title/Artist/... widgets, define what to display if there is no current song (or if there is no selected song in the group they are linked to). Most of time this default to an empty string, Title defaults to <code>&lt;Empty playlist&gt;</code></li>
431<li>xalign : horizontal alignement as a value between 0 (left) and 1 (right), .5 being center</li>
432<li>yalign : vertical alignement as a value between 0 (up) and 1 (bottom), .5 being center</li>
433<li>expand_max : same as the maxwidth option (specify a maximum expand width when inside a HB) but the widget will never grow wider than what is needed to display the string (replace the maxwidth value, so using the maxwidth with it will have no effect)</li>
434</ul>
435
436<h3>Text widgets</h3>
437
438<ul>
439<li>Title : Display currently playing Title</li>
440<li>Title_by : Display currently playing Title and Artist</li>
441<li>Album : Display currently playing Album</li>
442<li>Artist : Display currently playing Artist</li>
443<li>Comment : Display comment of currently playing song</li>
444<li>Year : Display year of currently playing song</li>
445<li>Length : Display length of currently playing song</li>
446<li>Pos : Display position of currently playing song in the playlist</li>
447<li><p>Text : Display custom text (other text widgets can use these options too to change their defaults)</p>
448
449<ul>
450<li>text : label text</li>
451<li>markup : text than can include <a href="#songvar">%-letters and $-words</a> and <a href="http://library.gnome.org/devel/pango/stable/PangoMarkupFormat.html">pango markup</a></li>
452<li>ellipsize : can be none, start, middle, or end. Default is none. Note that enabling ellipsize will make the widget require very little width, so you need to either force a bigger width request (option minwidth), or pack the widget in a way that will give it additional width (such as using the expand option in a HB, provided the HB gets enough width)</li>
453</ul>
454
455<p><p>Many of these widgets are simply a Text widget with a set of default options, in particular the options : <code>markup</code>, <code>click1</code>, <code>click3</code>, <code>minsize</code>.</p></li>
456</ul></p>
457
458<h3>Buttons widgets</h3>
459
460<ul>
461<li>Next : Next button</li>
462<li>Play : Play/Pause button</li>
463<li>Prev : Previous button</li>
464<li>Stop : Stop button</li>
465<li>Quit : Quit button</li>
466<li>Repeat : Button to change repeat mode</li>
467<li>OpenContext : Button to open context window</li>
468<li>OpenBrowser : Button to open Browser window</li>
469<li>Pref : Button to open Settings window</li>
470<li>ChooseAlbum : Open a window to select an album</li>
471<li>OpenQueue : Open a queue window</li>
472<li>Fullscreen : Button to switch to/from fullscreen mode</li>
473<li>ChooseRandAlbum : Button to select an album at random, option <code>action</code> can be playlist, addplay, insertplay, queue, replacequeue, ... see action option in SongList</li>
474<li>Choose : Button to open a search window</li>
475<li>Button : custom button (other buttons can use these options too)
476<ul>
477<li>text or label : text in the button</li>
478<li>stock : icon name, see <code>/usr/share/gmusicbrowser/pix/</code> or <a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk-Stock-Items.html">Gtk2 Stock-Items</a> or <code>~/.config/gmusicbrowser/icons/</code> (without filename extension)</li>
479</ul></li>
480<li>ExtraButtons : placeholder for extra buttons provided by plugins or activated in the preferences. Options are passed to the buttons, generic button options such as size and relief should work, example: <code>HButtons= Play Stop ExtraButtons</code> or <code>HButtons= Play(size=menu) Stop(size=menu) ExtraButtons(size=menu)</code></li>
481</ul>
482
483<p>The OpenContext, OpenBrowser and OpenQueue buttons accept the option 'toggle', if true (=1) the button will close the opened window if it is already opened</p>
484
485<p>All buttons can be changed to an indicator(no button border, smaller) with the option <code>button=0</code></p>
486
487<p>Relief can be changed for buttons by using the option <code>relief=none</code> (default), <code>half</code> or <code>normal</code>.</p>
488
489<p>Size of buttons and indicators can be set by setting the option <code>size</code> to <code>menu</code>, <code>small-toolbar</code>, <code>large-toolbar</code>, <code>button</code>, <code>dialog</code>, <code>dnd</code> (the actual size depends on gtk settings)</p>
490
491<h3>Indicators widgets</h3>
492
493<ul>
494<li>Filter : Playing filter indicator</li>
495<li>Queue : Queue indicator</li>
496<li>Sort : Sort mode indicator</li>
497<li>LockAlbum : Album lock</li>
498<li>LockArtist : Artist lock</li>
499<li>LockSong : Song lock</li>
500<li>EventBox : same as Button with default option <code>button=0</code></li>
501</ul>
502
503<p>All indicators can be changed to buttons with the option <code>button=1</code>.
504Size can be changed same as buttons, see above.</p>
505
506<p>indicators (Filter Queue Sort ...) and some buttons (Play Next Prev Stop Quit ...) have a few common options:</p>
507
508<ul>
509<li><code>with_text</code>: set to 1 to activate icon-with-text mode</li>
510<li><code>text</code> : to change the default text</li>
511<li><code>ellipsize</code> : set to start/middle/end to activate ellipsize mode, better used with a minwidth option or when packed in expand mode</li>
512<li><code>markup</code> : can be used to set the pango markup that will be used to display the text, and also add text to the default text. %s is replaced by the default text. Default to <code>&lt;small&gt;%s&lt;/small&gt;</code> for widgets with <code>size=menu</code>, else to <code>%s</code></li>
513<li><code>stock</code>: option to change the default icons, see <a href="http://git.gmusicbrowser.org/commit/9287bb273a">this commit</a></li>
514</ul>
515
516<h3>Time widgets</h3>
517
518<ul>
519<li>PlayingTime : Display position of currently playing song
520<ul>
521<li>markup_stopped : markup to use when stopped (default is <code>--:--</code>)</li>
522</ul></li>
523<li>Time : displays XX:XX of XX:XX, format can be redefined with options markup and markup_empty (and initsize to request enough size from the start). %s is replaced by the current playtime, <br />
524example : <code>LabelTime(markup="%s / $length", initsize="XX:XX / -XX:XX")</code></li>
525<li>TimeSlider : Playing position slider
526<ul>
527<li>step_mode : if 1, clicking on the slider advance or or move back the position by one step, rather than jumping to the clicked position</li>
528</ul></li>
529<li>TimeBar : Playing position progress bar
530<ul>
531<li>text : specify a text to display inside the bar, it can contain %-letters and $-words, in addition these variables are available : $percent, $current, $left, $total</li>
532<li>text_empty : used instead of text when no song is selected</li>
533<li>ellipsize : used to ellipsize the text, default to <code>end</code>, can be none, start, middle, or end</li>
534<li>font : set the font</li>
535</ul></li>
536</ul>
537
538<h3>Volume widgets</h3>
539
540<ul>
541<li>VolumeIcon : Volume indicator</li>
542<li>VolumeSlider : Volume slider
543<ul>
544<li>hide : hide the value if true (=1)</li>
545<li>horizontal : vertical slider if true (=1)</li>
546<li>step_mode : if 1, clicking on the slider increase or decrease the volume by one step, rather than setting it to the corresponding value</li>
547</ul></li>
548<li>VolumeBar : Volume bar</li>
549<li>Volume : current volume as text</li>
550</ul>
551
552<h3>Other widgets related to the playing song</h3>
553
554<p>By default, all these widgets show information on the currently playing song, some allow the edition of a property of the current song. By using the <code>group</code> option (see above), these widgets should be able to follow for example the selected song in a songlist rather than the current song. Example : <code>VBexample= _SongList(group=example) Cover(group=example)</code></p>
555
556<ul>
557<li>Cover : Album cover of currently playing song
558<ul>
559<li>forceratio : 1 or 0, if 1 always request a square size, useful for tray tip windows as they can't be resized</li>
560<li>minsize : minimum size</li>
561<li>maxsize : maximum size (default is 500)</li>
562<li>default : set a default file to use if there is no cover/artist picture</li>
563<li>overlay : set an overlay which is drawn on top of the picture, format is <code>XxY:WIDTHxHEIGHT:FILE</code>, where X, Y, WIDTH and HEIGHT define a rectangle in the overlay file where the album/artist picture will be drawn</li>
564<li>reflection : enable a reflection effect below the picture, (requires Cairo perl module) The value can be 0-100, used to define the height of the reflection in percentage of the picture (the value 1 set it to the default value of 25)</li>
565<li>r<em>alpha1 and r</em>alpha2 : can be used to set the starting (default=80) and ending (default=0) transparency percentage (0-100) of the reflection</li>
566<li>r_scale : (0-100, default=90) to configure the vertical scaling of the reflection</li>
567<li>(the filename in the <code>default</code> and <code>overlay</code> option can be absolute or relative to the layout folder)</li>
568</ul></li>
569<li>ArtistPic : Artist picture of currently playing song. Same options as Cover. With multiple artists, displays only one picture unless the option <code>multiple</code> was given, which can be set to <code>v</code> (vertical) or <code>h</code> (horizontal)</li>
570<li>Stars : Display currently playing rating as a picture (default to stars), clicking on the stars change the rating
571<ul>
572<li>xalign and yalign : value between 0 and 1. Used to align the stars in the widget if the widget has more space than needed. Default to .5</li>
573</ul></li>
574<li>LabelsIcons : Icons for currently playing labels for which an icon is defined in <code>~/.config/gmusicbrowser/icons/</code> (by a .png or .svg named <code>label-</code> followed by the label name.)</li>
575<li>SongInfo : display the song properties (like the info tab of the song properties window)
576<ul>
577<li>expander: 1 or 0, defaults to 1, show expanders for each field category if 1</li>
578<li>hide<em>empty: 1 or 0, default to 1, hide empty fields if 1</li>
579<li>font : default font</li>
580<li>group : group that determine current song, defaults to Play</li>
581<li>markup</em>cat : markup for categories name, defaults to <code>&lt;u&gt;%s&lt;/u&gt;</code></li>
582<li>markup<em>field : markup for fields name, defaults to <code>&lt;small&gt;%s :&lt;/small&gt;</code></li>
583<li>markup</em>value : markup for values, defaults to <code>&lt;small&gt;&lt;b&gt;%s&lt;/b&gt;&lt;/small&gt;</code></li>
584</ul></li>
585<li>PictureBrowser : display pictures in folder of the current album, click to change picture, many options are planned</li>
586<li>AddLabelEntry : Entry to add labels to the current song</li>
587<li>LabelToggleButtons : displays list of labels with toggle buttons to edit current song's labels
588<ul>
589<li>hide_unset: if true(=1), hide labels that not set for the song</li>
590</ul></li>
591<li>Context : Context view, in fact this widget is a TabbedLists with a few different default options, in particular <code>match=context page</code> that automatically add context pages provided by plugins, and <code>typesubmenu=C</code> that limit the context menu to context_pages-related entries</li>
592</ul>
593
594<h4>Miscellaneous widgets</h4>
595
596<ul>
597<li>AASearch
598<ul>
599<li>aa : artist or album</li>
600<li>activate : addplay or other action, see activate option of SongList</li>
601</ul></li>
602<li>ArtistSearch : same as AASearch(aa=artists)</li>
603<li>AlbumSearch : same as AASearch(aa=album)</li>
604<li>SongSearch</li>
605<li>ConnectionsList : the active connections when in gstreamer-server mode (very rough for now, mostly for testing)</li>
606<li>Visuals : Display a sound visualisation, only with gstreamer</li>
607<li>QueueActions : combobox to change the queued action</li>
608<li>ToggleButton : Show/Hide other widget(s)
609<ul>
610<li>icon : icon name, see <code>/usr/share/gmusicbrowser/pix/</code> or <a href="http://developer.gnome.org/doc/API/2.0/gtk/gtk-Stock-Items.html">Gtk2 Stock-Items</a> or <code>~/.config/gmusicbrowser/icons/</code> (without filename extension)</li>
611<li>text : button text</li>
612<li>widget : list of widgets/containers separated by <code>|</code></li>
613<li>resize : String of <code>h</code>,<code>v</code> or <code>_</code>, one by hidden widget : shrink the window vertically (v) or horizontally (h) when each widget is hidden</li>
614<li>togglegroup : activating a ToggleButton or MenuItem with a togglegroup will deactivate all the TogButton or MenuItem of the same togglegroup</li>
615<li>size : can be <code>menu</code>, <code>small-toolbar</code>, <code>large-toolbar</code>, <code>button</code>, <code>dialog</code>, <code>dnd</code>. (the actual size depends on gtk settings)</li>
616<li>relief</li>
617</ul></li>
618<li>Filler : empty widget to add space, for use with H/VSize</li>
619<li>HSeparator : Horizontal separator</li>
620<li>VSeparator : Vertical separator</li>
621<li>PlayOrderCombo : Combo box to change play order, the option minwidth set the requested width, it defaults to 100, -1 to let it grow, but it can grow much to wide, so it's best to set a minimum width and pack it with the expand option</li>
622<li>Equalizer : Equalizer, only active with gstreamer currently
623<ul>
624<li>preamp : whether to show the preamp, default to 1</li>
625<li>labels : pango attribute used to display labels, default to <code>x-small</code></li>
626</ul></li>
627<li>Progress : widget to display progress of current operations, hidden if no operations in progress
628<ul>
629<li>compact: make it more compact, less verbose, default to 1</li>
630</ul></li>
631<li>VProgress : same as Progress, but the widget use more vertical space and less horizontal space, and the compact option is 0 (false) by default</li>
632</ul>
633
634<h4>Songlist widgets</h4>
635
636<p>When there is more than one SongList/TabbedLists/... in a layout, they must each but one be assigned a group number though the group option. The one without a group number will be the default with which other widgets interact with. <br />
637All the other widgets which interact with a SongList/TabbedLists/... accept the option 'group' to specify which one they interact with, it is only needed when the layout contain more than one SongList/TabbedLists/...</p>
638
639<ul>
640<li>QueueList : Display queue (and edit it), accept the same options as SongList</li>
641<li>PlayList : SongList in playlist mode</li>
642<li>SongList :
643<ul>
644<li>hideif : can be <code>nofilter</code> or <code>empty</code>. Other values disable this. Conditions that will make the songlist hide itself or the widgets specified by hidewidget</li>
645<li>hidewidget : List of widgets separated with <code>|</code>. When the hide conditions are met, these widgets will be hidden, by default the songlist is hidden</li>
646<li>shrinkonhide : String of <code>h</code>,<code>v</code> or <code>_</code>, one by hidden widget : shrink vertically (<code>v</code>) or horizontally (<code>h</code>) the window when hidden. When multiple widgets are hidden, a direction or no direction (<code>_</code>) can be specified for each widget by using a string of <code>h/v/_</code></li>
647<li>mode : if set to <code>playlist</code>, the songlist and the playlist are synchronized</li>
648<li>activate : Action when double-clicking on a song : <code>play</code>(play now), <code>queue</code>(enqueue), <code>queueinsert</code>(insert at the top of the queue), <code>replacequeue</code>, <code>playlist</code>(set this list as the playlist and play this song), <code>addplay</code>(add to playlist), <code>insertplay</code>(insert in playlist after current position), <code>filter_and_play</code>, <code>filter_sort_and_play</code>, or <code>properties</code>(open song property window). The action can be followed by a command like this : <code>activate=play&amp;CloseWindow</code></li>
649<li>activateX : where X is a mouse button number, defines the action used when the button X is double-clicked</li>
650<li>headers : hide the headers if set to <code>off</code></li>
651<li>songypad : change the default number of pixels between rows</li>
652<li>no_typeahead : if 1, disable automatic searching when a letter/digit is pressed and the SongList has focus</li>
653<li>rowtip : default tip to show when the mouse is above a row, can use %-letters and $-words</li>
654<li>autoupdate ; if 1 (default) keep list sorted and filtered (ignored in playlist, queue, or static list mode). User can toggle this option, so only affect newly created songlists</li>
655</ul></li>
656<li>TabbedLists : Songlists in tabs, can contain playlist, static lists and the queue. layouts of type 'P' can be opened in TabbedLists (use the layout property key <code>stockicon</code> to set the tab icon), context pages can also be opened (the Context widget is a TabbedLists with a different set of options)
657<ul>
658<li>tablist : if 1, show the list of tabs in the tab context-menu</li>
659<li>closebuttons : if 1, display close buttons in the tab of tabs that can be closed</li>
660<li>newbutton : if 1 (default) show a "new page" button next to the tabs</li>
661<li>tabpos : select tab position (left, right, top, bottom), optionally followed by the rotation angle : 0, 90, 180 or 270, example : <code>tabpos=left90</code></li>
662<li>default_child : widget type that will be opened by default when closing the last page. default to <code>PlayList</code></li>
663<li>match : set of keywords that define which dynamic widget should be added automatically? Default to empty, which means nothing will be added automatically. The Context widget has the is option set to <code>context page</code></li>
664</ul></li>
665<li>SongTree : Very customizable Songlist replacement. (drag and dropping columns is not yet implemented). See this <a href="http://wiki.gmusicbrowser.org/customization/songtree">wiki page</a> for some documentation. Many SongList options work, including these : activate activateX headers songxpad songypad rowtip autoupdate</li>
666</ul>
667
668<h4>Widgets related to songlists</h4>
669
670<p>(filter# is a number between 0-9, 0 is meant for FilterLock, when a filter is set all filters with a higher number are reset) <br />
671All these widgets accept the option <code>group</code> to specify which SongList/TabbedLists/... they interact with, it is only needed when the layout contain more than one SongList/TabbedLists/... </p>
672
673<ul>
674<li>AABox : Artist or Album box (name, picture and stats of selected album/artist)
675<ul>
676<li>aa : artist or album</li>
677</ul></li>
678<li>ArtistBox : same as AABox(aa=artists)</li>
679<li>AlbumBox : same as AABox(aa=album)</li>
680<li><p>EditListButtons : buttons to remove/move the selected song(s) in the songlist and clear the list</p>
681
682<ul>
683<li>small : if true(=1) hide the label of the remove and clear buttons</li>
684<li>orientation : vertical buttons if set to <code>vertical</code></li>
685</ul></li>
686<li><p>FilterBox : advanced search box (set filter#1)</p></li>
687<li>FilterLock : Lock/unlock : current songlist filter is put in filter#0
688<ul>
689<li>relief</li>
690</ul></li>
691<li>FilterPane : Filter pane
692<ul>
693<li>nb : filter#, filter number to set, the artist/album/genre/date/label/folder/... pages only show the artist/... for songs matching all filters with a lower number </li>
694<li>hidebb : hide bottom buttons if true(=1)</li>
695<li>pages : set the default list of pages, value is names of pages separated by <code>|</code>, among savedtree,artist,album,genre,date,label,folder,filesys,lastplay,added,modif,rating...</li>
696<li>activate : play, queue, queueinsert, replacequeue, insertplay, playlist, addplay or properties (see <code>activate</code> option of SongList)</li>
697<li>activateX : where X is a mouse button number, defines the action used when the button X is double-clicked</li>
698<li>searchbox : if true(=1) add a search box to artist/album,genre,label pages</li>
699<li>no_typeahead : if true(=1) disable automatic searching when a letter/digit is pressed and the FilterPane has focus</li>
700<li>hidetabs : if true(=1) tabs are hidden</li>
701<li>tabmode : value can be <code>text</code> (default), <code>icon</code> or <code>both</code>. When <code>icon</code> or <code>both</code>, it will try to use icons named <code>gmb-tab-</code> followed by the internal page name</li>
702<li>hscrollbar : show horizontal scrollbar if 1, hide it if 0</li>
703</ul></li>
704<li>PlayFilter : Button to Play current songlist filter</li>
705<li>QueueFilter : Button to Enqueue current songlist filter</li>
706<li>Refresh : Button to re-filter songlist</li>
707<li>ResetFilter : Button to reset songlist filter</li>
708<li>SimpleSearch : search entry, search title/album/artist (set filter#1), support powerful syntax (example title:sometitle and lots more, the documentation has not be written yet, see git logs for examples)
709<ul>
710<li>noselector : if set to 1 hide the selector icon, not recommended as it makes the widget much less powerful</li>
711<li>activate : can be used to set a command to run after enter is pressed</li>
712</ul></li>
713<li>Total : Total number/length/size of selected/filter/library
714<ul>
715<li>size : change text size, value can be xx-small, x-small, small, medium, large, x-large, xx-large, or see <a href="http://library.gnome.org/devel/pango/stable/PangoMarkupFormat.html">pango markup</a></li>
716<li>format : short or long (default)</li>
717<li>button : default to 1, if 0 a click-able label is used instead of a button</li>
718<li>relief : relief of the button, default to <code>none</code></li>
719</ul></li>
720</ul>
721
722<h4>MenuItem widgets (can only be put in a MB/SM)</h4>
723
724<ul>
725<li>HistItem : Filter history (set filter#1)</li>
726<li>LSortItem : Sort order for songlist</li>
727<li>MainMenuItem : main menu</li>
728<li>LayoutItem : layout menu (allows the user to switch to an other layout of type G+)</li>
729<li>MenuItem : Custom menu item
730<ul>
731<li>text : text of the menu item</li>
732<li>icon : name of the icon</li>
733<li>command : gmusicbrowser command to execute</li>
734<li>togglewidget : list of widgets/containers separated by <code>|</code></li>
735<li>resizeonly : with the togglewidget option, see the resize option of the ToggleButton</li>
736<li>togglegroup : activating a ToggleButton or MenuItem with a togglegroup will deactivate all the TogButton or MenuItem of the same togglegroup</li>
737<li>button : if set to 1 and has a submenu, the menuitem is turned into a button (same as BM)</li>
738</ul></li>
739<li>PFilterItem : playing filter menu</li>
740<li>PSortItem : playing sort order</li>
741<li>PlayItem : choose a Filter based on playing title/artist/album/filter (set filter#1) and follow playing songlist option</li>
742<li>QueueItem : queue menu</li>
743<li>SeparatorMenuItem : separator</li>
744</ul>
745
746<h3>Widget aliases</h3>
747
748<p>Some widgets have been renamed, the old names are deprecated but can be found in old layouts. <br />
749old name => new name :</p>
750
751<pre><code>Playlist =&gt; OpenBrowser
752BContext =&gt; OpenContext
753Date =&gt; Year
754Label =&gt; Text
755Vol =&gt; VolumeIcon
756LabelVol =&gt; Volume
757FLock =&gt; FilterLock
758TogButton =&gt; ToggleButton
759ProgressV =&gt; VProgress
760FBox =&gt; FilterBox
761Scale =&gt; TimeSlider
762VolSlider =&gt; VolumeSlider
763VolBar =&gt; VolumeBar
764FPane =&gt; FilterPane
765LabelTime =&gt; PlayingTime
766</code></pre>
767
768<h2>Embedded layouts (experimental)</h2>
769
770<p>Layouts can be embedded inside an other layout by simply adding <code>\@id_of_embedded_layout</code> to a container (not all characters are
771supported in embedded layouts identifier) <br />
772example :</p>
773
774<pre><code>[example_layout]
775HBmain = Play Stop Pref
776VBmain = HBmain Title _@embedded_example
777
778[embedded_example]
779VBmain = Title _SongTree
780</code></pre>
781
782<h2><a id="songvar"> %-letters and $-words</a></h2>
783
784<p>Some options accept %-letters and $-words variables that are replaced by a field/property of the currently playing song.
785For example in <code>%t by %a</code>, %t is replaced by the song title and %a by the artist name. It is equivalent to <code>$title by $artist</code> <br />
786Note that %c and %f are not meant to be used for displaying.</p>
787
788<p>$-words : the word can be any of the activated field name, see the fields tab of the settings dialog.</p>
789
790<p>%-letters :</p>
791
792<pre><code>t title
793a artist
794l album
795d disc
796n track
797y year
798C comment
799p play count
800P last play
801k skip count
802K last skip
803g genres
804L labels
805m length
806V version or nothing if song doesn't have a version/subtitle tag
807S title or filename if no title
808f filename (with path) (raw filename, may not display correctly)
809u filename (with path) (in utf8, used for display, might not be convertible back to the real filename)
810c cover file
811Y album year(s)
812A album artist or artist
813</code></pre>
8140
=== modified file 'layouts/browser.layout'
--- layouts/browser.layout 2013-08-27 20:31:56 +0000
+++ layouts/browser.layout 2014-02-15 20:02:02 +0000
@@ -1,7 +1,7 @@
1[Browser]1[Browser]
2Type=B2Type=B
3Name = _"Browser"3Name = _"Browser"
4Default = Window(size=1120x820) HPfp(size=180) HPbig(size=780) VPlistAA(size=645) FilterPane0(page=artist) FilterPane1(page=album)4Default = Window(size=1120x820) HPfp(size=150-150) HPbig(size=780-350) VPlistAA(size=645-140) FilterPane0(page=artist) FilterPane1(page=album)
5VBmain = HBstatus 5_HPbig5VBmain = HBstatus 5_HPbig
6HBstatus = SimpleSearch 10MBlist ResetFilter Refresh PlayFilter FilterLock -Total6HBstatus = SimpleSearch 10MBlist ResetFilter Refresh PlayFilter FilterLock -Total
7MBlist = HistItem LSortItem PlayItem7MBlist = HistItem LSortItem PlayItem
@@ -14,7 +14,7 @@
14[Smaller browser]14[Smaller browser]
15Type=B15Type=B
16Name = _"Smaller browser"16Name = _"Smaller browser"
17Default = Window(size=1120x820) HPfp(size=180) HPbig(size=780) VPlistAA(size=645) FilterPane0(page=artist) FilterPane1(page=album)17Default = Window(size=1120x820) HPfp(size=150-150) HPbig(size=800-300) VPlistAA(size=600-125) FilterPane0(page=artist) FilterPane1(page=album)
18VBmain = HBstatus 5_HPbig18VBmain = HBstatus 5_HPbig
19HBstatus = SimpleSearch 10MBlist ResetFilter Refresh PlayFilter FilterLock19HBstatus = SimpleSearch 10MBlist ResetFilter Refresh PlayFilter FilterLock
20MBlist = HistItem LSortItem PlayItem20MBlist = HistItem LSortItem PlayItem
@@ -32,14 +32,14 @@
32[3 Filter panes] based on Browser32[3 Filter panes] based on Browser
33Type=B33Type=B
34Name = _"3 Filter panes"34Name = _"3 Filter panes"
35Default = Window(size=1120x820) HPfp1(size=125) HPbig(size=750) HPfp2(size=125) VPlistAA(size=655) FilterPane0(page=savedtree) FilterPane1(page=artist) FilterPane2(page=album)35Default = Window(size=1120x820) HPfp(size=125-250) HPbig(size=750-450) HPfp2(size=125-125) VPlistAA(size=600-150) FilterPane0(page=savedtree) FilterPane1(page=artists) FilterPane2(page=album)
36HPfp = _FilterPane0(nb=1) HPfp236HPfp = _FilterPane0(nb=1) HPfp2
37HPfp2 = _FilterPane1(nb=2) FilterPane2(nb=3)37HPfp2 = _FilterPane1(nb=2) FilterPane2(nb=3)
3838
39[left-side filter panes]39[left-side filter panes]
40Type=B40Type=B
41Name = _"left-side filter panes"41Name = _"left-side filter panes"
42Default = Window(size=1120x820) HPfp(size=180) HPbig(size=360) VPlistAA(size=645) FilterPane0(page=artist) FilterPane1(page=album)42Default = Window(size=1120x820) HPfp(size=150-150) HPbig(size=350-780) VPlistAA(size=645-140) FilterPane0(page=artist) FilterPane1(page=album)
43VBmain = HBstatus 5_HPbig43VBmain = HBstatus 5_HPbig
44HBstatus = SimpleSearch 10MBlist ResetFilter Refresh PlayFilter FilterLock -Total44HBstatus = SimpleSearch 10MBlist ResetFilter Refresh PlayFilter FilterLock -Total
45MBlist = HistItem LSortItem PlayItem45MBlist = HistItem LSortItem PlayItem
4646
=== modified file 'layouts/main.layout'
--- layouts/main.layout 2012-02-08 00:33:53 +0000
+++ layouts/main.layout 2014-02-15 20:02:02 +0000
@@ -9,7 +9,7 @@
9 HBmenu = _MBmenu9 HBmenu = _MBmenu
10 MBmenu = MainMenuItem LayoutItem PSortItem PFilterItem QueueItem10 MBmenu = MainMenuItem LayoutItem PSortItem PFilterItem QueueItem
11 HPmain = VBLeft _TBRight11 HPmain = VBLeft _TBRight
12 VBLeft = 5VBplayer _TabbedLists(group=1)12 VBLeft = 5VBplayer _TabbedLists(group=1,pages="+PlayList +QueueList +SongInfo +PictureBrowser")
13 VBplayer = HBButtons3 HBText_Cover13 VBplayer = HBButtons3 HBText_Cover
14 HBButtons3 = 5Sort 5Filter 5Queue 5Pos -Stars14 HBButtons3 = 5Sort 5Filter 5Queue 5Pos -Stars
15 HBText_Cover= _VBText 5-Cover15 HBText_Cover= _VBText 5-Cover
1616
=== modified file 'locale/cs/LC_MESSAGES/gmusicbrowser.mo'
17Binary files locale/cs/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/cs/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ17Binary files locale/cs/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/cs/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/de/LC_MESSAGES/gmusicbrowser.mo'
18Binary files locale/de/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/de/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ18Binary files locale/de/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/de/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/es/LC_MESSAGES/gmusicbrowser.mo'
19Binary files locale/es/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/es/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ19Binary files locale/es/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/es/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/fi/LC_MESSAGES/gmusicbrowser.mo'
20Binary files locale/fi/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/fi/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ20Binary files locale/fi/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/fi/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/fr/LC_MESSAGES/gmusicbrowser.mo'
21Binary files locale/fr/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/fr/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ21Binary files locale/fr/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/fr/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/hu/LC_MESSAGES/gmusicbrowser.mo'
22Binary files locale/hu/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/hu/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ22Binary files locale/hu/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/hu/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/it/LC_MESSAGES/gmusicbrowser.mo'
23Binary files locale/it/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/it/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ23Binary files locale/it/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/it/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/ja/LC_MESSAGES/gmusicbrowser.mo'
24Binary files locale/ja/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/ja/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ24Binary files locale/ja/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/ja/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/ko/LC_MESSAGES/gmusicbrowser.mo'
25Binary files locale/ko/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/ko/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ25Binary files locale/ko/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/ko/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/nl/LC_MESSAGES/gmusicbrowser.mo'
26Binary files locale/nl/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/nl/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ26Binary files locale/nl/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/nl/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/pl/LC_MESSAGES/gmusicbrowser.mo'
27Binary files locale/pl/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/pl/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ27Binary files locale/pl/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/pl/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/pt/LC_MESSAGES/gmusicbrowser.mo'
28Binary files locale/pt/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/pt/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ28Binary files locale/pt/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/pt/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/pt_BR/LC_MESSAGES/gmusicbrowser.mo'
29Binary files locale/pt_BR/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/pt_BR/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ29Binary files locale/pt_BR/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/pt_BR/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/ru/LC_MESSAGES/gmusicbrowser.mo'
30Binary files locale/ru/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/ru/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ30Binary files locale/ru/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/ru/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/sr/LC_MESSAGES/gmusicbrowser.mo'
31Binary files locale/sr/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/sr/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ31Binary files locale/sr/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/sr/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/sv/LC_MESSAGES/gmusicbrowser.mo'
32Binary files locale/sv/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/sv/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ32Binary files locale/sv/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/sv/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/zh_CN/LC_MESSAGES/gmusicbrowser.mo'
33Binary files locale/zh_CN/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/zh_CN/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ33Binary files locale/zh_CN/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/zh_CN/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'locale/zh_TW/LC_MESSAGES/gmusicbrowser.mo'
34Binary files locale/zh_TW/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/zh_TW/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ34Binary files locale/zh_TW/LC_MESSAGES/gmusicbrowser.mo 2014-01-25 14:17:08 +0000 and locale/zh_TW/LC_MESSAGES/gmusicbrowser.mo 2014-02-15 20:02:02 +0000 differ
=== modified file 'plugins/export.pm'
--- plugins/export.pm 2014-01-25 14:17:08 +0000
+++ plugins/export.pm 2014-02-15 20:02:02 +0000
@@ -145,11 +145,14 @@
145 my $content="#EXTM3U\n";145 my $content="#EXTM3U\n";
146 for my $ID (@$IDs)146 for my $ID (@$IDs)
147 { my ($file,$length,$artist,$title)= Songs::Get($ID,qw/fullfilename length artist title/);147 { my ($file,$length,$artist,$title)= Songs::Get($ID,qw/fullfilename length artist title/);
148 ::_utf8_on($file); # for file, so it doesn't get converted in utf8
148 $content.= "\n#EXTINF:$length,$artist - $title\n$file\n";149 $content.= "\n#EXTINF:$length,$artist - $title\n$file\n";
149 }150 }
150 open my$fh,'>',$file or warn "Error opening '$file' for writing : $!\n";151 { my $fh;
151 print $fh $content or warn "Error writing to '$file' : $!\n";152 open($fh,'>:utf8',$file) && (print $fh $content) && close($fh) && last;
152 close $fh;153 my $res= ::Retry_Dialog($!,_"Error writing .m3u file", details=> ::__x( _"file: {filename}", filename=>$file));
154 redo if $res eq 'retry';
155 }
153}156}
154157
155sub ToCSV158sub ToCSV
@@ -157,24 +160,31 @@
157 my $check=::NewPrefCheckButton(OPT.'toCSV_notitlerow',_"Do not add a title row");160 my $check=::NewPrefCheckButton(OPT.'toCSV_notitlerow',_"Do not add a title row");
158 my $file=::ChooseSaveFile(undef,_"Write filenames to ...",undef,'songs.csv',$check);161 my $file=::ChooseSaveFile(undef,_"Write filenames to ...",undef,'songs.csv',$check);
159 return unless defined $file;162 return unless defined $file;
160 my @fields=qw/file path title artist album year comment track disc length size rating modif added lastplay playcount lastskip skipcount bitrate filetype channel samprate genre label/; #FIXME PHASE1 use a dynamic list of fields163 my @fields= (qw/file path/,sort grep !m/^file$|^path$/, (Songs::PropertyFields())); #make sure file and path are in position 0 and 1
161 open my$fh,'>:utf8',$file;164
162 unless ($::Options{OPT.'toCSV_notitlerow'}) #print a title row165 my $retry;
163 { print $fh join(',',map Songs::FieldName($_), @fields)."\n";166 { if ($retry)
164 }167 { my $res= ::Retry_Dialog($!,_"Error writing .csv file", details=> ::__x( _"file: {filename}", filename=>$file));
165 no warnings 'uninitialized';168 last unless $res eq 'retry';
166 for my $ID (@$IDs)169 }
167 { my @val;170 $retry=1;
168 push @val, Songs::Get($ID,@fields);171
169 s/\x00/\t/g for @val; #for genres and labels172 open my$fh,'>:utf8',$file or redo;
170 s/"/""/g for @val;173 unless ($::Options{OPT.'toCSV_notitlerow'}) #print a title row
171 ::_utf8_on($val[0]); # for file and path, so it doesn't get converted in utf8174 { print $fh join(',',map Songs::FieldName($_), @fields)."\n" or redo;
172 ::_utf8_on($val[1]); # FIXME find a cleaner way to do that175 }
173 #print STDERR join(',',@val)."\n";176 for my $ID (@$IDs)
174 print $fh join(',',map '"'.$_.'"', @val)."\n";177 { my @val;
175 }178 push @val, Songs::Get($ID,@fields);
176 close $fh;179 s/\x00/\t/g for @val; #for genres and labels
177180 s/"/""/g for @val;
181 ::_utf8_on($val[0]); # for file and path, so it doesn't get converted in utf8
182 ::_utf8_on($val[1]); # FIXME find a cleaner way to do that
183 #print STDERR join(',',@val)."\n";
184 print $fh join(',',map '"'.$_.'"', @val)."\n" or redo;
185 }
186 close $fh or redo;
187 }
178}188}
179189
180sub RunCommand190sub RunCommand
181191
=== modified file 'plugins/fetch_cover.pm'
--- plugins/fetch_cover.pm 2014-01-25 14:17:08 +0000
+++ plugins/fetch_cover.pm 2014-02-15 20:02:02 +0000
@@ -391,6 +391,7 @@
391sub searchresults_cb391sub searchresults_cb
392{ my ($self,$result)=@_;392{ my ($self,$result)=@_;
393 $self->{waiting}=undef;393 $self->{waiting}=undef;
394 warn "Getting results from $self->{url}\n" if $::Verbose;
394 unless (defined $result) { stop($self,_"connection failed."); return; }395 unless (defined $result) { stop($self,_"connection failed."); return; }
395 my $parse= $Sites{$self->{mainfield}}{$self->{site}}[2];396 my $parse= $Sites{$self->{mainfield}}{$self->{site}}[2];
396 my ($list,$nexturl)=$parse->($result,$self->{url},$self->{searchcontext});397 my ($list,$nexturl)=$parse->($result,$self->{url},$self->{searchcontext});
@@ -567,5 +568,3 @@
567568
56815691
569570
570__END__
571xml.amazon.com/onca/xml3?t=webservices-20&dev-t=%l&KeywordSearch=%s&mode=music&type=heavy&locale=us&page=1&f=xml
572571
=== modified file 'po/cs.po'
--- po/cs.po 2014-01-25 14:17:08 +0000
+++ po/cs.po 2014-02-15 20:02:02 +0000
@@ -5,7 +5,7 @@
5msgstr ""5msgstr ""
6"Project-Id-Version: gmusicbrowser 1.1005\n"6"Project-Id-Version: gmusicbrowser 1.1005\n"
7"Report-Msgid-Bugs-To: squentin@free.fr\n"7"Report-Msgid-Bugs-To: squentin@free.fr\n"
8"POT-Creation-Date: 2014-01-13 21:36+0100\n"8"POT-Creation-Date: 2014-02-15 01:23+0100\n"
9"PO-Revision-Date: 2012-10-08 08:52+0100\n"9"PO-Revision-Date: 2012-10-08 08:52+0100\n"
10"Last-Translator: Petr Šimáček <petr.simacek@gmail.com>\n"10"Last-Translator: Petr Šimáček <petr.simacek@gmail.com>\n"
11"Language-Team: čeština <L3D9Z6@seznam.cz>\n"11"Language-Team: čeština <L3D9Z6@seznam.cz>\n"
@@ -34,11 +34,11 @@
34msgid " of {length}"34msgid " of {length}"
35msgstr " z {length}"35msgstr " z {length}"
3636
37#: gmusicbrowser.pl:665137#: gmusicbrowser.pl:6626
38msgid "# songs"38msgid "# songs"
39msgstr "# skladby"39msgstr "# skladby"
4040
41#: gmusicbrowser_layout.pm:177641#: gmusicbrowser_layout.pm:1782
42#, perl-format42#, perl-format
43msgid "%S by %a"43msgid "%S by %a"
44msgstr "%S od %a"44msgstr "%S od %a"
@@ -60,8 +60,8 @@
60msgstr[1] "%d Interpreti"60msgstr[1] "%d Interpreti"
61msgstr[2] "%d Interpretů"61msgstr[2] "%d Interpretů"
6262
63#: gmusicbrowser.pl:3303 gmusicbrowser.pl:3307 gmusicbrowser.pl:513963#: gmusicbrowser.pl:3314 gmusicbrowser.pl:3318 gmusicbrowser.pl:5164
64#: gmusicbrowser_list.pm:171764#: gmusicbrowser_list.pm:1719
65#, perl-format65#, perl-format
66msgid "%d Song"66msgid "%d Song"
67msgid_plural "%d Songs"67msgid_plural "%d Songs"
@@ -77,7 +77,7 @@
77msgstr[1] "%d nadcházející události"77msgstr[1] "%d nadcházející události"
78msgstr[2] "%d nadcházejících událostí"78msgstr[2] "%d nadcházejících událostí"
7979
80#: gmusicbrowser.pl:433 gmusicbrowser_list.pm:7997 gmusicbrowser_songs.pm:87580#: gmusicbrowser.pl:436 gmusicbrowser_list.pm:7990 gmusicbrowser_songs.pm:875
81#, perl-format81#, perl-format
82msgid "%d album"82msgid "%d album"
83msgid_plural "%d albums"83msgid_plural "%d albums"
@@ -85,7 +85,7 @@
85msgstr[1] "%d alba"85msgstr[1] "%d alba"
86msgstr[2] "%d alb"86msgstr[2] "%d alb"
8787
88#: gmusicbrowser.pl:419 gmusicbrowser.pl:426 gmusicbrowser_list.pm:800888#: gmusicbrowser.pl:422 gmusicbrowser.pl:429 gmusicbrowser_list.pm:8001
89#: gmusicbrowser_songs.pm:848 gmusicbrowser_songs.pm:303389#: gmusicbrowser_songs.pm:848 gmusicbrowser_songs.pm:3033
90#, perl-format90#, perl-format
91msgid "%d artist"91msgid "%d artist"
@@ -94,7 +94,7 @@
94msgstr[1] "%d interpreti"94msgstr[1] "%d interpreti"
95msgstr[2] "%d interpretů"95msgstr[2] "%d interpretů"
9696
97#: gmusicbrowser.pl:476197#: gmusicbrowser.pl:4786
98#, perl-format98#, perl-format
99msgid "%d file"99msgid "%d file"
100msgid_plural "%d files"100msgid_plural "%d files"
@@ -110,7 +110,7 @@
110msgstr[1] "%d soubory ve složce {folder}"110msgstr[1] "%d soubory ve složce {folder}"
111msgstr[2] "%d souborů ve složce {folder}"111msgstr[2] "%d souborů ve složce {folder}"
112112
113#: gmusicbrowser.pl:5561113#: gmusicbrowser.pl:5584
114#, perl-format114#, perl-format
115msgid "%d folder"115msgid "%d folder"
116msgid_plural "%d folders"116msgid_plural "%d folders"
@@ -118,7 +118,7 @@
118msgstr[1] "%d složky"118msgstr[1] "%d složky"
119msgstr[2] "%d složek"119msgstr[2] "%d složek"
120120
121#: gmusicbrowser.pl:1557121#: gmusicbrowser.pl:1567
122#, perl-format122#, perl-format
123msgid "%d second"123msgid "%d second"
124msgid_plural "%d seconds"124msgid_plural "%d seconds"
@@ -126,8 +126,8 @@
126msgstr[1] "%d vteřiny"126msgstr[1] "%d vteřiny"
127msgstr[2] "%d vteřin"127msgstr[2] "%d vteřin"
128128
129#: gmusicbrowser.pl:413 gmusicbrowser.pl:421 gmusicbrowser.pl:6389129#: gmusicbrowser.pl:416 gmusicbrowser.pl:424 gmusicbrowser.pl:6360
130#: gmusicbrowser.pl:6595 gmusicbrowser.pl:8270 gmusicbrowser_layout.pm:238130#: gmusicbrowser.pl:6570 gmusicbrowser.pl:8296 gmusicbrowser_layout.pm:238
131#: gmusicbrowser_list.pm:248 gmusicbrowser_songs.pm:3027131#: gmusicbrowser_list.pm:248 gmusicbrowser_songs.pm:3027
132#: plugins/audioscrobbler.pm:173132#: plugins/audioscrobbler.pm:173
133#, perl-format133#, perl-format
@@ -137,7 +137,7 @@
137msgstr[1] "%d skladby"137msgstr[1] "%d skladby"
138msgstr[2] "%d skladeb"138msgstr[2] "%d skladeb"
139139
140#: gmusicbrowser.pl:5560140#: gmusicbrowser.pl:5583
141#, perl-format141#, perl-format
142msgid "%d song added"142msgid "%d song added"
143msgid_plural "%d songs added"143msgid_plural "%d songs added"
@@ -145,7 +145,7 @@
145msgstr[1] "%d skladby přidány"145msgstr[1] "%d skladby přidány"
146msgstr[2] "%d skladeb přidáno"146msgstr[2] "%d skladeb přidáno"
147147
148#: gmusicbrowser.pl:3312 gmusicbrowser_layout.pm:234148#: gmusicbrowser.pl:3323 gmusicbrowser_layout.pm:234
149#: gmusicbrowser_layout.pm:237149#: gmusicbrowser_layout.pm:237
150#, perl-format150#, perl-format
151msgid "%d song in queue"151msgid "%d song in queue"
@@ -181,12 +181,12 @@
181msgid "%t by %a (%m)"181msgid "%t by %a (%m)"
182msgstr "%S od %a"182msgstr "%S od %a"
183183
184#: gmusicbrowser.pl:4655184#: gmusicbrowser.pl:4680
185#, perl-brace-format185#, perl-brace-format
186msgid "'{file}' exists. Overwrite ?"186msgid "'{file}' exists. Overwrite ?"
187msgstr "'{file}' existuje. Přepsat ?"187msgstr "'{file}' existuje. Přepsat ?"
188188
189#: gmusicbrowser.pl:6548189#: gmusicbrowser.pl:6522
190#, perl-format190#, perl-format
191msgid "(%d song excluded)"191msgid "(%d song excluded)"
192msgid_plural "(%d songs excluded)"192msgid_plural "(%d songs excluded)"
@@ -194,7 +194,7 @@
194msgstr[1] "(%d skladby vyjmuty)"194msgstr[1] "(%d skladby vyjmuty)"
195msgstr[2] "(%d skladeb vyjmuto)"195msgstr[2] "(%d skladeb vyjmuto)"
196196
197#: gmusicbrowser.pl:3135197#: gmusicbrowser.pl:3146
198msgid "(case insensitive)"198msgid "(case insensitive)"
199msgstr "(nedostupné)"199msgstr "(nedostupné)"
200200
@@ -211,11 +211,15 @@
211msgid "(see http://www.last.fm)"211msgid "(see http://www.last.fm)"
212msgstr "(navštivte http://www.last.fm)"212msgstr "(navštivte http://www.last.fm)"
213213
214#: gmusicbrowser.pl:6150 gmusicbrowser_gstreamer-0.10.pm:508214#: gmusicbrowser.pl:6173 gmusicbrowser_gstreamer-0.10.pm:508
215msgid "(unstable)"215msgid "(unstable)"
216msgstr "(nestabilní)"216msgstr "(nestabilní)"
217217
218#: gmusicbrowser.pl:6273218#: gmusicbrowser.pl:6544
219msgid ", sort @ScanExt) ], [_"
220msgstr ""
221
222#: gmusicbrowser.pl:6244
219msgid ""223msgid ""
220"- When selecting a song, the playlist filter will be reset if the song is "224"- When selecting a song, the playlist filter will be reset if the song is "
221"not in it\n"225"not in it\n"
@@ -226,7 +230,7 @@
226"- Pokud bude stávající skladba odstraněna z playlistu, bude přeskočeno na "230"- Pokud bude stávající skladba odstraněna z playlistu, bude přeskočeno na "
227"další skladbu"231"další skladbu"
228232
229#: gmusicbrowser.pl:8410233#: gmusicbrowser.pl:8436
230msgid "0 chance"234msgid "0 chance"
231msgstr "0 možností"235msgstr "0 možností"
232236
@@ -234,7 +238,7 @@
234msgid "0 means 'show all'"238msgid "0 means 'show all'"
235msgstr "0 znamená 'zobrazit vše'"239msgstr "0 znamená 'zobrazit vše'"
236240
237#: gmusicbrowser.pl:8408241#: gmusicbrowser.pl:8434
238#, perl-brace-format242#, perl-brace-format
239msgid "1 chance in {probability}"243msgid "1 chance in {probability}"
240msgstr "1 možnost v {probability}"244msgstr "1 možnost v {probability}"
@@ -247,15 +251,15 @@
247msgid "32x32 PNG file icon"251msgid "32x32 PNG file icon"
248msgstr "soubor s ikonou 32x32 PNG"252msgstr "soubor s ikonou 32x32 PNG"
249253
250#: gmusicbrowser.pl:1807254#: gmusicbrowser.pl:1817
251msgid "50 Last Added"255msgid "50 Last Added"
252msgstr "50 naposled přidaných"256msgstr "50 naposled přidaných"
253257
254#: gmusicbrowser.pl:1806258#: gmusicbrowser.pl:1816
255msgid "50 Last Played"259msgid "50 Last Played"
256msgstr "50 naposled přehrávaných"260msgstr "50 naposled přehrávaných"
257261
258#: gmusicbrowser.pl:1805262#: gmusicbrowser.pl:1815
259msgid "50 Most Played"263msgid "50 Most Played"
260msgstr "50 nejpřehrávanějších"264msgstr "50 nejpřehrávanějších"
261265
@@ -264,7 +268,7 @@
264msgid "<Unknown>"268msgid "<Unknown>"
265msgstr "<Unknown>"269msgstr "<Unknown>"
266270
267#: gmusicbrowser.pl:417271#: gmusicbrowser.pl:420
268#, perl-format272#, perl-format
269msgid ""273msgid ""
270"<b>%t</b>\n"274"<b>%t</b>\n"
@@ -280,12 +284,12 @@
280msgid "<big><big>by %a</big></big>"284msgid "<big><big>by %a</big></big>"
281msgstr "<big><big>od %a</big></big>"285msgstr "<big><big>od %a</big></big>"
282286
283#: gmusicbrowser_list.pm:721 plugins/notify.pm:24287#: gmusicbrowser_list.pm:731 plugins/notify.pm:24
284#, perl-format288#, perl-format
285msgid "<i>by</i> %a\\n<i>from</i> %l"289msgid "<i>by</i> %a\\n<i>from</i> %l"
286msgstr "<i>od</i> %a\\n<i>z</i> %l"290msgstr "<i>od</i> %a\\n<i>z</i> %l"
287291
288#: gmusicbrowser_layout.pm:4317292#: gmusicbrowser_layout.pm:4326
289msgid "Abort"293msgid "Abort"
290msgstr "Zrušit"294msgstr "Zrušit"
291295
@@ -302,7 +306,7 @@
302msgid "About"306msgid "About"
303msgstr "O aplikaci"307msgstr "O aplikaci"
304308
305#: gmusicbrowser.pl:4766309#: gmusicbrowser.pl:4791
306#, perl-brace-format310#, perl-brace-format
307msgid ""311msgid ""
308"About to delete {files}\n"312"About to delete {files}\n"
@@ -311,7 +315,7 @@
311"Odstraňování {files}\n"315"Odstraňování {files}\n"
312"Odstranit?"316"Odstranit?"
313317
314#: gmusicbrowser.pl:1557318#: gmusicbrowser.pl:1567
315msgid "About to turn off the computer in :"319msgid "About to turn off the computer in :"
316msgstr "Vypnout počítač za :"320msgstr "Vypnout počítač za :"
317321
@@ -319,7 +323,7 @@
319msgid "Actions are not supported by current notification daemon"323msgid "Actions are not supported by current notification daemon"
320msgstr "Akce není podporována stávajícím notifikačním démonem"324msgstr "Akce není podporována stávajícím notifikačním démonem"
321325
322#: gmusicbrowser.pl:7643 gmusicbrowser.pl:7927 gmusicbrowser.pl:8148326#: gmusicbrowser.pl:7669 gmusicbrowser.pl:7953 gmusicbrowser.pl:8174
323#: gmusicbrowser_tags.pm:1323 plugins/desktopwidget.pm:36327#: gmusicbrowser_tags.pm:1323 plugins/desktopwidget.pm:36
324msgid "Add"328msgid "Add"
325msgstr "Přidat"329msgstr "Přidat"
@@ -343,29 +347,29 @@
343msgid "Add a filter"347msgid "Add a filter"
344msgstr "Přidat filtr"348msgstr "Přidat filtr"
345349
346#: gmusicbrowser.pl:6326350#: gmusicbrowser.pl:6297
347msgid "Add a fullscreen button"351msgid "Add a fullscreen button"
348msgstr "Přidat tlačítko celoobrazovkového režimu"352msgstr "Přidat tlačítko celoobrazovkového režimu"
349353
350#: gmusicbrowser.pl:6326354#: gmusicbrowser.pl:6297
351msgid "Add a fullscreen button to layouts that can accept extra buttons"355msgid "Add a fullscreen button to layouts that can accept extra buttons"
352msgstr ""356msgstr ""
353"Přidat tlačítko celoobrazovkového režimu do vzhledů, které akceptují extra "357"Přidat tlačítko celoobrazovkového režimu do vzhledů, které akceptují extra "
354"tlačítka"358"tlačítka"
355359
356#: gmusicbrowser_list.pm:7560360#: gmusicbrowser_list.pm:7553
357msgid "Add a group"361msgid "Add a group"
358msgstr "Přidat skupinu"362msgstr "Přidat skupinu"
359363
360#: gmusicbrowser.pl:1250364#: gmusicbrowser.pl:1255
361msgid "Add a label to the current song"365msgid "Add a label to the current song"
362msgstr "Přidat štítek stávající skladbě"366msgstr "Přidat štítek stávající skladbě"
363367
364#: gmusicbrowser.pl:1243368#: gmusicbrowser.pl:1248
365msgid "Add a list of files/folders to the playlist"369msgid "Add a list of files/folders to the playlist"
366msgstr "Přidat seznam souborů/složek do playlistu"370msgstr "Přidat seznam souborů/složek do playlistu"
367371
368#: gmusicbrowser_list.pm:8054372#: gmusicbrowser_list.pm:8047
369msgid "Add a radio"373msgid "Add a radio"
370msgstr "Přidat rádio"374msgstr "Přidat rádio"
371375
@@ -373,11 +377,11 @@
373msgid "Add files or folders"377msgid "Add files or folders"
374msgstr "Přidat soubory a složky"378msgstr "Přidat soubory a složky"
375379
376#: gmusicbrowser.pl:1246380#: gmusicbrowser.pl:1251
377msgid "Add files/folders to library"381msgid "Add files/folders to library"
378msgstr "Přidat soubory/složky do knihovny"382msgstr "Přidat soubory/složky do knihovny"
379383
380#: gmusicbrowser.pl:6494384#: gmusicbrowser.pl:6465
381msgid "Add folder"385msgid "Add folder"
382msgstr "Přidat složku"386msgstr "Přidat složku"
383387
@@ -387,31 +391,31 @@
387msgid "Add folder ..."391msgid "Add folder ..."
388msgstr "Přidat složku ..."392msgstr "Přidat složku ..."
389393
390#: gmusicbrowser.pl:6697394#: gmusicbrowser.pl:6672
391msgid "Add label"395msgid "Add label"
392msgstr "Přidat štítek"396msgstr "Přidat štítek"
393397
394#: gmusicbrowser.pl:7644398#: gmusicbrowser.pl:7670
395msgid "Add multiple condition"399msgid "Add multiple condition"
396msgstr "Přidat vícenásobnou podmínku"400msgstr "Přidat vícenásobnou podmínku"
397401
398#: gmusicbrowser.pl:5199402#: gmusicbrowser.pl:5224
399msgid "Add new label"403msgid "Add new label"
400msgstr "Přidat nový štítek"404msgstr "Přidat nový štítek"
401405
402#: gmusicbrowser_list.pm:8124406#: gmusicbrowser_list.pm:8117
403msgid "Add new radio"407msgid "Add new radio"
404msgstr "Přidat nové rádio"408msgstr "Přidat nové rádio"
405409
406#: gmusicbrowser.pl:8150410#: gmusicbrowser.pl:8176
407msgid "Add rule : "411msgid "Add rule : "
408msgstr "Přidat pravidlo :"412msgstr "Přidat pravidlo :"
409413
410#: gmusicbrowser.pl:5843414#: gmusicbrowser.pl:5866
411msgid "Add shorcut key"415msgid "Add shorcut key"
412msgstr "Přidat klávesovou zkratku"416msgstr "Přidat klávesovou zkratku"
413417
414#: gmusicbrowser_list.pm:1964418#: gmusicbrowser_list.pm:1966
415msgid "Add tab"419msgid "Add tab"
416msgstr "Přidat záložku"420msgstr "Přidat záložku"
417421
@@ -419,7 +423,7 @@
419msgid "Add to existing values"423msgid "Add to existing values"
420msgstr "Přidat do stávajících hodnot"424msgstr "Přidat do stávajících hodnot"
421425
422#: gmusicbrowser.pl:474426#: gmusicbrowser.pl:477
423msgid "Add to list"427msgid "Add to list"
424msgstr "Přidat do seznamu"428msgstr "Přidat do seznamu"
425429
@@ -440,15 +444,15 @@
440msgid "Added"444msgid "Added"
441msgstr "Přidáno"445msgstr "Přidáno"
442446
443#: gmusicbrowser.pl:1809447#: gmusicbrowser.pl:1819
444msgid "Added Today"448msgid "Added Today"
445msgstr "Přidáno dnes"449msgstr "Přidáno dnes"
446450
447#: gmusicbrowser_list.pm:8113451#: gmusicbrowser_list.pm:8106
448msgid "Adding a radio"452msgid "Adding a radio"
449msgstr "Přidávání rádia"453msgstr "Přidávání rádia"
450454
451#: gmusicbrowser.pl:6258455#: gmusicbrowser.pl:6229
452msgid ""456msgid ""
453"Additionally this format can be used :\n"457"Additionally this format can be used :\n"
454" default number1 format1 number2 format2 ...\n"458" default number1 format1 number2 format2 ...\n"
@@ -466,7 +470,7 @@
466"Přidat položku do kontextového menu interpreta/alba, která umožní hledat "470"Přidat položku do kontextového menu interpreta/alba, která umožní hledat "
467"googlem obrázek/přebal a uložit jej."471"googlem obrázek/přebal a uložit jej."
468472
469#: gmusicbrowser_layout.pm:1550473#: gmusicbrowser_layout.pm:1556
470msgid "Adds labels to the current song"474msgid "Adds labels to the current song"
471msgstr "Přidat štítky stávající skladbě"475msgstr "Přidat štítky stávající skladbě"
472476
@@ -474,19 +478,19 @@
474msgid "Adds menu entries to song contextual menu"478msgid "Adds menu entries to song contextual menu"
475msgstr "Přidat položky do kontextového menu skladby"479msgstr "Přidat položky do kontextového menu skladby"
476480
477#: gmusicbrowser.pl:5252481#: gmusicbrowser.pl:5277
478msgid "Advanced"482msgid "Advanced"
479msgstr ""483msgstr ""
480484
481#: gmusicbrowser_list.pm:3616485#: gmusicbrowser_list.pm:3613
482msgid "Advanced Search ..."486msgid "Advanced Search ..."
483msgstr "Rozšířené vyhledávání ..."487msgstr "Rozšířené vyhledávání ..."
484488
485#: gmusicbrowser.pl:5252 gmusicbrowser_tags.pm:1493489#: gmusicbrowser.pl:5277 gmusicbrowser_tags.pm:1493
486msgid "Advanced Tag Editing"490msgid "Advanced Tag Editing"
487msgstr "Rozšířená editace popisků"491msgstr "Rozšířená editace popisků"
488492
489#: gmusicbrowser.pl:996 gmusicbrowser_songs.pm:868 gmusicbrowser_tags.pm:1614493#: gmusicbrowser.pl:999 gmusicbrowser_songs.pm:868 gmusicbrowser_tags.pm:1614
490#: gmusicbrowser_tags.pm:1652 gmusicbrowser_tags.pm:1667494#: gmusicbrowser_tags.pm:1652 gmusicbrowser_tags.pm:1667
491#: gmusicbrowser_tags.pm:1685 gmusicbrowser_tags.pm:1692495#: gmusicbrowser_tags.pm:1685 gmusicbrowser_tags.pm:1692
492#: gmusicbrowser_tags.pm:1938 plugins/albuminfo.pm:63496#: gmusicbrowser_tags.pm:1938 plugins/albuminfo.pm:63
@@ -521,7 +525,7 @@
521msgid "Album gain"525msgid "Album gain"
522msgstr "Zisk alba"526msgstr "Zisk alba"
523527
524#: gmusicbrowser.pl:6151528#: gmusicbrowser.pl:6174
525msgid "Album mode"529msgid "Album mode"
526msgstr "Režim alba"530msgstr "Režim alba"
527531
@@ -529,11 +533,11 @@
529msgid "Album peak"533msgid "Album peak"
530msgstr "Vrchol alba"534msgstr "Vrchol alba"
531535
532#: gmusicbrowser_list.pm:815 gmusicbrowser_songs.pm:891536#: gmusicbrowser_list.pm:825 gmusicbrowser_songs.pm:891
533msgid "Album picture"537msgid "Album picture"
534msgstr "Obrázek alba"538msgstr "Obrázek alba"
535539
536#: gmusicbrowser_list.pm:838540#: gmusicbrowser_list.pm:848
537msgid "Album picture & info"541msgid "Album picture & info"
538msgstr "Obrázek alba & info"542msgstr "Obrázek alba & info"
539543
@@ -549,7 +553,7 @@
549msgid "Album shuffle"553msgid "Album shuffle"
550msgstr "Zamíchané album"554msgstr "Zamíchané album"
551555
552#: gmusicbrowser.pl:995556#: gmusicbrowser.pl:998
553msgid "Album with picture"557msgid "Album with picture"
554msgstr "Album s obrázkem"558msgstr "Album s obrázkem"
555559
@@ -580,12 +584,12 @@
580msgid "Albums"584msgid "Albums"
581msgstr "Alba"585msgstr "Alba"
582586
583#: gmusicbrowser_songs.pm:2372 gmusicbrowser_songs.pm:4739587#: gmusicbrowser_songs.pm:2372 gmusicbrowser_songs.pm:4766
584#: layouts/makeitlooklike.layout:314588#: layouts/makeitlooklike.layout:314
585msgid "All"589msgid "All"
586msgstr "Vše"590msgstr "Vše"
587591
588#: gmusicbrowser_songs.pm:4728592#: gmusicbrowser_songs.pm:4755
589msgid "All Songs"593msgid "All Songs"
590msgstr "Všechny skladby"594msgstr "Všechny skladby"
591595
@@ -597,7 +601,7 @@
597msgid "All artists"601msgid "All artists"
598msgstr "Všichni interpreti"602msgstr "Všichni interpreti"
599603
600#: gmusicbrowser.pl:4501604#: gmusicbrowser.pl:4533
601msgid "All files"605msgid "All files"
602msgstr "Všechny soubory"606msgstr "Všechny soubory"
603607
@@ -613,12 +617,12 @@
613msgid "All moods"617msgid "All moods"
614msgstr "Všechny nálady"618msgstr "Všechny nálady"
615619
616#: gmusicbrowser.pl:7781 gmusicbrowser.pl:7876 gmusicbrowser_songs.pm:4744620#: gmusicbrowser.pl:7807 gmusicbrowser.pl:7902 gmusicbrowser_songs.pm:4771
617msgid "All of :"621msgid "All of :"
618msgstr "Vše z :"622msgstr "Vše z :"
619623
620#: gmusicbrowser.pl:9343 gmusicbrowser_layout.pm:1477624#: gmusicbrowser.pl:9369 gmusicbrowser_layout.pm:1483
621#: gmusicbrowser_songs.pm:4063625#: gmusicbrowser_songs.pm:4090
622msgid "All songs"626msgid "All songs"
623msgstr "Všechny skladby"627msgstr "Všechny skladby"
624628
@@ -651,16 +655,16 @@
651msgstr "Ovládat gmusicbrowser přes DBus za použití standardu MPRIS v2.0"655msgstr "Ovládat gmusicbrowser přes DBus za použití standardu MPRIS v2.0"
652656
653#. Alt key657#. Alt key
654#: gmusicbrowser.pl:1044658#: gmusicbrowser.pl:1047
655msgctxt "Keyboard"659msgctxt "Keyboard"
656msgid "Alt"660msgid "Alt"
657msgstr "Alt"661msgstr "Alt"
658662
659#: gmusicbrowser.pl:6272663#: gmusicbrowser.pl:6243
660msgid "Amount of volume changed by the mouse wheel"664msgid "Amount of volume changed by the mouse wheel"
661msgstr "Velikost kroku změny hlasitosti kolečkem myši"665msgstr "Velikost kroku změny hlasitosti kolečkem myši"
662666
663#: gmusicbrowser.pl:6089667#: gmusicbrowser.pl:6112
664msgid ""668msgid ""
665"Analyse and add replaygain tags for all songs that don't have replaygain "669"Analyse and add replaygain tags for all songs that don't have replaygain "
666"tags, or incoherent album replaygain tags"670"tags, or incoherent album replaygain tags"
@@ -668,11 +672,11 @@
668"Analýzovat a přidat replaygain tagy pro všechny písně, které nemají "672"Analýzovat a přidat replaygain tagy pro všechny písně, které nemají "
669"replaygain značky, nebo nesoudržné replaygain značky alba "673"replaygain značky, nebo nesoudržné replaygain značky alba "
670674
671#: gmusicbrowser.pl:7781 gmusicbrowser.pl:7877 gmusicbrowser_songs.pm:4744675#: gmusicbrowser.pl:7807 gmusicbrowser.pl:7903 gmusicbrowser_songs.pm:4771
672msgid "Any of :"676msgid "Any of :"
673msgstr "Cokoliv z :"677msgstr "Cokoliv z :"
674678
675#: gmusicbrowser.pl:460679#: gmusicbrowser.pl:463
676msgid "Append"680msgid "Append"
677msgstr "Přidat"681msgstr "Přidat"
678682
@@ -680,7 +684,7 @@
680msgid "Append (only if not already present)"684msgid "Append (only if not already present)"
681msgstr "Přidat (pouze pokud již neexistuje)"685msgstr "Přidat (pouze pokud již neexistuje)"
682686
683#: gmusicbrowser_list.pm:1706687#: gmusicbrowser_list.pm:1708
684msgid "Append to playlist"688msgid "Append to playlist"
685msgstr "Přidat do playlistu"689msgstr "Přidat do playlistu"
686690
@@ -688,12 +692,12 @@
688msgid "Application"692msgid "Application"
689msgstr "Aplikace"693msgstr "Aplikace"
690694
691#: gmusicbrowser.pl:6612695#: gmusicbrowser.pl:6587
692#, perl-brace-format696#, perl-brace-format
693msgid "Are you sure you want to delete the '{label}' label ?"697msgid "Are you sure you want to delete the '{label}' label ?"
694msgstr "Určitě odstranit štítek '{label}' ?"698msgstr "Určitě odstranit štítek '{label}' ?"
695699
696#: gmusicbrowser.pl:5881700#: gmusicbrowser.pl:5904
697msgid "Arguments"701msgid "Arguments"
698msgstr "Argumenty"702msgstr "Argumenty"
699703
@@ -708,7 +712,7 @@
708msgid "Artist"712msgid "Artist"
709msgstr "Interpret"713msgstr "Interpret"
710714
711#: gmusicbrowser.pl:994715#: gmusicbrowser.pl:997
712msgid "Artist & album"716msgid "Artist & album"
713msgstr "Interpret & album"717msgstr "Interpret & album"
714718
@@ -724,7 +728,7 @@
724msgid "Artist URL"728msgid "Artist URL"
725msgstr "URL interpreta"729msgstr "URL interpreta"
726730
727#: gmusicbrowser_list.pm:823 gmusicbrowser_songs.pm:900731#: gmusicbrowser_list.pm:833 gmusicbrowser_songs.pm:900
728msgid "Artist picture"732msgid "Artist picture"
729msgstr "Obrázek interpreta"733msgstr "Obrázek interpreta"
730734
@@ -737,11 +741,11 @@
737msgid "Artist playcount:"741msgid "Artist playcount:"
738msgstr "Počet přehrání interpreta"742msgstr "Počet přehrání interpreta"
739743
740#: gmusicbrowser.pl:1012744#: gmusicbrowser.pl:1015
741msgid "Artist,Album,Disc,Track"745msgid "Artist,Album,Disc,Track"
742msgstr "Interpret,album,disk,stopa"746msgstr "Interpret,album,disk,stopa"
743747
744#: gmusicbrowser.pl:1013748#: gmusicbrowser.pl:1016
745msgid "Artist,Date,Album,Disc,Track"749msgid "Artist,Date,Album,Disc,Track"
746msgstr "Interpret,rok,album,disk,stopa"750msgstr "Interpret,rok,album,disk,stopa"
747751
@@ -765,7 +769,7 @@
765msgid "Artists"769msgid "Artists"
766msgstr "Interpreti"770msgstr "Interpreti"
767771
768#: gmusicbrowser.pl:7992772#: gmusicbrowser.pl:8018
769msgid "Ascending order"773msgid "Ascending order"
770msgstr "Vzrůstající"774msgstr "Vzrůstající"
771775
@@ -773,7 +777,7 @@
773msgid "Ask confirmation only if file already exists"777msgid "Ask confirmation only if file already exists"
774msgstr "Potvrzovat pouze pokud soubor již existuje"778msgstr "Potvrzovat pouze pokud soubor již existuje"
775779
776#: gmusicbrowser.pl:5724780#: gmusicbrowser.pl:5747
777msgid "Audio"781msgid "Audio"
778msgstr "Audio"782msgstr "Audio"
779783
@@ -801,11 +805,11 @@
801msgid "Auto fill up to"805msgid "Auto fill up to"
802msgstr "Automaticky vyplnit k"806msgstr "Automaticky vyplnit k"
803807
804#: gmusicbrowser_list.pm:3492808#: gmusicbrowser_list.pm:3497
805msgid "Auto filter"809msgid "Auto filter"
806msgstr "Automatický filter"810msgstr "Automatický filter"
807811
808#: gmusicbrowser.pl:394812#: gmusicbrowser.pl:397
809msgid "Auto-fill queue"813msgid "Auto-fill queue"
810msgstr "Automaticky vyplnit frontu"814msgstr "Automaticky vyplnit frontu"
811815
@@ -829,11 +833,11 @@
829msgid "Auto-scroll"833msgid "Auto-scroll"
830msgstr "Automatický posun"834msgstr "Automatický posun"
831835
832#: gmusicbrowser_list.pm:1732836#: gmusicbrowser_list.pm:1734
833msgid "Auto-select Pictures"837msgid "Auto-select Pictures"
834msgstr "Automatický výběr obrázků"838msgstr "Automatický výběr obrázků"
835839
836#: gmusicbrowser.pl:6529840#: gmusicbrowser.pl:6503
837msgid "Automatically remove current song if not found"841msgid "Automatically remove current song if not found"
838msgstr "Automaticky odstranit stávající skladbu, pokud nebyla nalezena"842msgstr "Automaticky odstranit stávající skladbu, pokud nebyla nalezena"
839843
@@ -845,7 +849,7 @@
845msgid "Autosave plugin"849msgid "Autosave plugin"
846msgstr "Zásuvný modul automatického ukládání"850msgstr "Zásuvný modul automatického ukládání"
847851
848#: gmusicbrowser.pl:7948852#: gmusicbrowser.pl:7974
849msgid "Available"853msgid "Available"
850msgstr "Dostupné"854msgstr "Dostupné"
851855
@@ -861,7 +865,7 @@
861msgid "Bad session"865msgid "Bad session"
862msgstr "Chyba sezení"866msgstr "Chyba sezení"
863867
864#: gmusicbrowser.pl:4932868#: gmusicbrowser.pl:4957
865msgid "Base Folder :"869msgid "Base Folder :"
866msgstr "Základní složka :"870msgstr "Základní složka :"
867871
@@ -869,11 +873,11 @@
869msgid "Basic fields"873msgid "Basic fields"
870msgstr "Základní pole"874msgstr "Základní pole"
871875
872#: gmusicbrowser_list.pm:5269876#: gmusicbrowser_list.pm:5266
873msgid "Begin with"877msgid "Begin with"
874msgstr "Začít s"878msgstr "Začít s"
875879
876#: gmusicbrowser_list.pm:1660880#: gmusicbrowser_list.pm:1662
877msgid "Below"881msgid "Below"
878msgstr "Níže"882msgstr "Níže"
879883
@@ -901,7 +905,7 @@
901msgid "Browser views"905msgid "Browser views"
902msgstr "Zobrazení prohlížeče"906msgstr "Zobrazení prohlížeče"
903907
904#: gmusicbrowser.pl:6313908#: gmusicbrowser.pl:6284
905msgid "Browser window layout :"909msgid "Browser window layout :"
906msgstr "Styl prohlížeče"910msgstr "Styl prohlížeče"
907911
@@ -917,7 +921,7 @@
917msgid "Buttons, Song & Cover"921msgid "Buttons, Song & Cover"
918msgstr "Tlačítka, skladba & přebal"922msgstr "Tlačítka, skladba & přebal"
919923
920#: gmusicbrowser.pl:1239924#: gmusicbrowser.pl:1244
921msgid "Can be relative by using + or -"925msgid "Can be relative by using + or -"
922msgstr "Při použití + nebo - může být relativní"926msgstr "Při použití + nebo - může být relativní"
923927
@@ -933,7 +937,7 @@
933"Nelze změnit hlasitost. Při použití tohoto audio backendu je vyžadován "937"Nelze změnit hlasitost. Při použití tohoto audio backendu je vyžadován "
934"amixer (obsažen v alsa-utils)."938"amixer (obsažen v alsa-utils)."
935939
936#: gmusicbrowser.pl:4313940#: gmusicbrowser.pl:4337
937#, perl-brace-format941#, perl-brace-format
938msgid "Can't create folder: {path}"942msgid "Can't create folder: {path}"
939msgstr ""943msgstr ""
@@ -951,7 +955,7 @@
951msgid "Can't read file or invalid file"955msgid "Can't read file or invalid file"
952msgstr "Soubor nelze číst nebo je poškozený"956msgstr "Soubor nelze číst nebo je poškozený"
953957
954#: gmusicbrowser.pl:4968958#: gmusicbrowser.pl:4993
955#, perl-brace-format959#, perl-brace-format
956msgid "Can't write in base folder '{folder}'."960msgid "Can't write in base folder '{folder}'."
957msgstr "Nelze zapisovat do základní složky '{folder}'."961msgstr "Nelze zapisovat do základní složky '{folder}'."
@@ -964,15 +968,15 @@
964msgid "Capitalize each word"968msgid "Capitalize each word"
965msgstr "Všechna slova psát s vekými písmeny"969msgstr "Všechna slova psát s vekými písmeny"
966970
967#: gmusicbrowser.pl:7988971#: gmusicbrowser.pl:8014
968msgid "Case insensitive"972msgid "Case insensitive"
969msgstr "Nedostupná položka"973msgstr "Nedostupná položka"
970974
971#: gmusicbrowser.pl:7988 gmusicbrowser.pl:8597 gmusicbrowser_list.pm:3487975#: gmusicbrowser.pl:8014 gmusicbrowser.pl:8623 gmusicbrowser_list.pm:3492
972msgid "Case sensitive"976msgid "Case sensitive"
973msgstr "Dostupná položka"977msgstr "Dostupná položka"
974978
975#: gmusicbrowser_list.pm:5268979#: gmusicbrowser_list.pm:5265
976msgid "Case-sensitive"980msgid "Case-sensitive"
977msgstr "Dostupná položka"981msgstr "Dostupná položka"
978982
@@ -988,7 +992,7 @@
988msgid "Centered on"992msgid "Centered on"
989msgstr "Zarovnáno na"993msgstr "Zarovnáno na"
990994
991#: gmusicbrowser.pl:1211995#: gmusicbrowser.pl:1216
992msgid "Change Display"996msgid "Change Display"
993msgstr "Změnit zobrazení"997msgstr "Změnit zobrazení"
994998
@@ -1013,15 +1017,15 @@
1013msgid "Check Collection"1017msgid "Check Collection"
1014msgstr "Zkontrolovat kolekci"1018msgstr "Zkontrolovat kolekci"
10151019
1016#: gmusicbrowser.pl:65181020#: gmusicbrowser.pl:6492
1017msgid "Check for updated/deleted songs on startup"1021msgid "Check for updated/deleted songs on startup"
1018msgstr "Kontrolovat přidané/smazané skladby při startu"1022msgstr "Kontrolovat přidané/smazané skladby při startu"
10191023
1020#: gmusicbrowser_list.pm:17261024#: gmusicbrowser_list.pm:1728
1021msgid "Check for updated/removed songs"1025msgid "Check for updated/removed songs"
1022msgstr "Zkontrolovat přidané/smazané skladby"1026msgstr "Zkontrolovat přidané/smazané skladby"
10231027
1024#: gmusicbrowser.pl:65311028#: gmusicbrowser.pl:6505
1025msgid "Check real length of mp3"1029msgid "Check real length of mp3"
1026msgstr "Zkontrolovat skutečnou délku mp3 souboru"1030msgstr "Zkontrolovat skutečnou délku mp3 souboru"
10271031
@@ -1029,15 +1033,15 @@
1029msgid "Check your audio settings"1033msgid "Check your audio settings"
1030msgstr "Zkontrolovat nastavení zvuku"1034msgstr "Zkontrolovat nastavení zvuku"
10311035
1032#: gmusicbrowser.pl:9361036#: gmusicbrowser.pl:939
1033msgid "Checking length/bitrate"1037msgid "Checking length/bitrate"
1034msgstr "Kontrolovat délku/datový tok"1038msgstr "Kontrolovat délku/datový tok"
10351039
1036#: gmusicbrowser.pl:9341040#: gmusicbrowser.pl:937
1037msgid "Checking songs"1041msgid "Checking songs"
1038msgstr "Kontrolovat skladby"1042msgstr "Kontrolovat skladby"
10391043
1040#: gmusicbrowser_list.pm:33111044#: gmusicbrowser_list.pm:3314
1041msgid "Choose Album From this Artist"1045msgid "Choose Album From this Artist"
1042msgstr "Vybrat album tohoto interpreta"1046msgstr "Vybrat album tohoto interpreta"
10431047
@@ -1045,7 +1049,7 @@
1045msgid "Choose Artist/Album/Song"1049msgid "Choose Artist/Album/Song"
1046msgstr "Vybrat interpreta/album/skladbu"1050msgstr "Vybrat interpreta/album/skladbu"
10471051
1048#: gmusicbrowser.pl:44921052#: gmusicbrowser.pl:4524
1049msgid "Choose Picture"1053msgid "Choose Picture"
1050msgstr "Vybrat obrázek"1054msgstr "Vybrat obrázek"
10511055
@@ -1053,23 +1057,23 @@
1053msgid "Choose Random Album"1057msgid "Choose Random Album"
1054msgstr "Vybrat náhodné album"1058msgstr "Vybrat náhodné album"
10551059
1056#: gmusicbrowser.pl:87301060#: gmusicbrowser.pl:8756
1057msgid "Choose a folder"1061msgid "Choose a folder"
1058msgstr "Vyberte složku"1062msgstr "Vyberte složku"
10591063
1060#: gmusicbrowser.pl:43241064#: gmusicbrowser.pl:4348
1061msgid "Choose directory to copy files to"1065msgid "Choose directory to copy files to"
1062msgstr "Vybrat adresář pro kopírování souborů"1066msgstr "Vybrat adresář pro kopírování souborů"
10631067
1064#: gmusicbrowser.pl:43251068#: gmusicbrowser.pl:4349
1065msgid "Choose directory to move files to"1069msgid "Choose directory to move files to"
1066msgstr "Vybrat adresář pro přesunutí souborů"1070msgstr "Vybrat adresář pro přesunutí souborů"
10671071
1068#: gmusicbrowser.pl:44611072#: gmusicbrowser.pl:4499
1069msgid "Choose files"1073msgid "Choose files"
1070msgstr "Vybrat soubory"1074msgstr "Vybrat soubory"
10711075
1072#: gmusicbrowser.pl:65701076#: gmusicbrowser.pl:6545
1073msgid "Choose folder to add"1077msgid "Choose folder to add"
1074msgstr "Vybrat složku pro přidání"1078msgstr "Vybrat složku pro přidání"
10751079
@@ -1086,32 +1090,32 @@
1086msgid "Choose icon for label {name}"1090msgid "Choose icon for label {name}"
1087msgstr "Vybrat ikonu pro štítek {name}"1091msgstr "Vybrat ikonu pro štítek {name}"
10881092
1089#: gmusicbrowser_layout.pm:26701093#: gmusicbrowser_layout.pm:2679
1090msgid "Choose page to open"1094msgid "Choose page to open"
1091msgstr "Vybrat stránku k otevření"1095msgstr "Vybrat stránku k otevření"
10921096
1093#: gmusicbrowser.pl:33771097#: gmusicbrowser.pl:3388
1094#, perl-format1098#, perl-format
1095msgid "Choose picture for '%s'"1099msgid "Choose picture for '%s'"
1096msgstr "Vybrat obrázek pro '%s'"1100msgstr "Vybrat obrázek pro '%s'"
10971101
1098#: gmusicbrowser.pl:54031102#: gmusicbrowser.pl:5428
1099msgid "Choose playlist files to import"1103msgid "Choose playlist files to import"
1100msgstr "Vybrat soubory s playlisty k importu"1104msgstr "Vybrat soubory s playlisty k importu"
11011105
1102#: gmusicbrowser.pl:7929 gmusicbrowser_list.pm:2891106#: gmusicbrowser.pl:7955 gmusicbrowser_list.pm:289
1103msgid "Clear"1107msgid "Clear"
1104msgstr "Smazat"1108msgstr "Smazat"
11051109
1106#: gmusicbrowser.pl:12201110#: gmusicbrowser.pl:1225
1107msgid "Clear playlist"1111msgid "Clear playlist"
1108msgstr "Vyčistit seznam skladeb"1112msgstr "Vyčistit seznam skladeb"
11091113
1110#: gmusicbrowser.pl:12541114#: gmusicbrowser.pl:1259
1111msgid "Clear playlist filter"1115msgid "Clear playlist filter"
1112msgstr "Vyčistit filtr seznamu skladeb"1116msgstr "Vyčistit filtr seznamu skladeb"
11131117
1114#: gmusicbrowser.pl:1219 gmusicbrowser_layout.pm:331118#: gmusicbrowser.pl:1224 gmusicbrowser_layout.pm:33
1115msgid "Clear queue"1119msgid "Clear queue"
1116msgstr "Smazat frontu"1120msgstr "Smazat frontu"
11171121
@@ -1131,12 +1135,12 @@
1131msgid "Client banned, contact gmusicbrowser's developer"1135msgid "Client banned, contact gmusicbrowser's developer"
1132msgstr "Zakázaný klient, kontaktujte vývojáře gmusicbrowser"1136msgstr "Zakázaný klient, kontaktujte vývojáře gmusicbrowser"
11331137
1134#: gmusicbrowser_layout.pm:2392 gmusicbrowser_list.pm:39911138#: gmusicbrowser_layout.pm:2401 gmusicbrowser_list.pm:3988
1135#: gmusicbrowser_list.pm:40581139#: gmusicbrowser_list.pm:4055
1136msgid "Close"1140msgid "Close"
1137msgstr "Zavřít"1141msgstr "Zavřít"
11381142
1139#: gmusicbrowser.pl:12011143#: gmusicbrowser.pl:1206
1140msgid "Close Window"1144msgid "Close Window"
1141msgstr "Zavřít okno"1145msgstr "Zavřít okno"
11421146
@@ -1145,7 +1149,7 @@
1145msgid "Close a filter"1149msgid "Close a filter"
1146msgstr "Vybrat filtr"1150msgstr "Vybrat filtr"
11471151
1148#: gmusicbrowser.pl:62991152#: gmusicbrowser.pl:6270
1149msgid "Close to tray"1153msgid "Close to tray"
1150msgstr "Zavřít do oznamovací oblasti"1154msgstr "Zavřít do oznamovací oblasti"
11511155
@@ -1153,7 +1157,7 @@
1153msgid "Collection"1157msgid "Collection"
1154msgstr "Kolekce"1158msgstr "Kolekce"
11551159
1156#: gmusicbrowser.pl:5770 gmusicbrowser.pl:5880 gmusicbrowser_123.pm:2911160#: gmusicbrowser.pl:5793 gmusicbrowser.pl:5903 gmusicbrowser_123.pm:291
1157msgid "Command"1161msgid "Command"
1158msgstr "Příkaz"1162msgstr "Příkaz"
11591163
@@ -1165,7 +1169,7 @@
1165msgid "Command used :"1169msgid "Command used :"
1166msgstr "Použitý příkaz :"1170msgstr "Použitý příkaz :"
11671171
1168#: gmusicbrowser.pl:62311172#: gmusicbrowser.pl:6213
1169msgid ""1173msgid ""
1170"Command used when\n"1174"Command used when\n"
1171"'turn off computer when queue empty'\n"1175"'turn off computer when queue empty'\n"
@@ -1206,7 +1210,7 @@
1206msgid "Conductor"1210msgid "Conductor"
1207msgstr "Dirigent"1211msgstr "Dirigent"
12081212
1209#: gmusicbrowser.pl:62211213#: gmusicbrowser.pl:6203
1210msgid "Connect through a proxy"1214msgid "Connect through a proxy"
1211msgstr "Připojit přes proxy"1215msgstr "Připojit přes proxy"
12121216
@@ -1231,11 +1235,11 @@
1231msgid "Conz Glimm (different controls)"1235msgid "Conz Glimm (different controls)"
1232msgstr "Conz Glimm (různé ovládací prvky)"1236msgstr "Conz Glimm (různé ovládací prvky)"
12331237
1234#: gmusicbrowser.pl:4821238#: gmusicbrowser.pl:485
1235msgid "Copy"1239msgid "Copy"
1236msgstr "Kopírovat"1240msgstr "Kopírovat"
12371241
1238#: gmusicbrowser.pl:43351242#: gmusicbrowser.pl:4359
1239msgid "Copy failed"1243msgid "Copy failed"
1240msgstr "Kopírování selhalo"1244msgstr "Kopírování selhalo"
12411245
@@ -1255,7 +1259,7 @@
1255msgid "Copy to portable player"1259msgid "Copy to portable player"
1256msgstr "Kopírovat do přenosného přehrávače"1260msgstr "Kopírovat do přenosného přehrávače"
12571261
1258#: gmusicbrowser.pl:43371262#: gmusicbrowser.pl:4361
1259#, perl-format1263#, perl-format
1260msgid "Copying file"1264msgid "Copying file"
1261msgid_plural "Copying %d files"1265msgid_plural "Copying %d files"
@@ -1271,17 +1275,17 @@
1271msgid "Cover Size : "1275msgid "Cover Size : "
1272msgstr "Velikost přebalu:"1276msgstr "Velikost přebalu:"
12731277
1274#: gmusicbrowser.pl:63491278#: gmusicbrowser.pl:6320
1275msgid "Create ID3v2 tags as ID3v2.4"1279msgid "Create ID3v2 tags as ID3v2.4"
1276msgstr "Vytvořit ID3v2 popisky jako ID3v2.4"1280msgstr "Vytvořit ID3v2 popisky jako ID3v2.4"
12771281
1278#. Ctrl key1282#. Ctrl key
1279#: gmusicbrowser.pl:10431283#: gmusicbrowser.pl:1046
1280msgctxt "Keyboard"1284msgctxt "Keyboard"
1281msgid "Ctrl"1285msgid "Ctrl"
1282msgstr "Ctrl"1286msgstr "Ctrl"
12831287
1284#: gmusicbrowser.pl:62731288#: gmusicbrowser.pl:6244
1285msgid "Current song must always be in the playlist"1289msgid "Current song must always be in the playlist"
1286msgstr "Stávající skladba vždy musí být v playlistu"1290msgstr "Stávající skladba vždy musí být v playlistu"
12871291
@@ -1317,16 +1321,16 @@
1317msgid "Custom pipeline"1321msgid "Custom pipeline"
1318msgstr "Vlastní pipeline"1322msgstr "Vlastní pipeline"
13191323
1320#: gmusicbrowser_layout.pm:1435 gmusicbrowser_layout.pm:14621324#: gmusicbrowser_layout.pm:1441 gmusicbrowser_layout.pm:1468
1321#: gmusicbrowser_layout.pm:1491 gmusicbrowser_list.pm:911325#: gmusicbrowser_layout.pm:1497 gmusicbrowser_list.pm:91
1322msgid "Custom..."1326msgid "Custom..."
1323msgstr "Obecné..."1327msgstr "Obecné..."
13241328
1325#: gmusicbrowser.pl:1009 gmusicbrowser_tags.pm:1617 gmusicbrowser_tags.pm:16551329#: gmusicbrowser.pl:1012 gmusicbrowser_tags.pm:1617 gmusicbrowser_tags.pm:1655
1326msgid "Date"1330msgid "Date"
1327msgstr "Rok"1331msgstr "Rok"
13281332
1329#: gmusicbrowser.pl:62591333#: gmusicbrowser.pl:6230
1330msgid "Date format :"1334msgid "Date format :"
1331msgstr "Formát data:"1335msgstr "Formát data:"
13321336
@@ -1338,7 +1342,7 @@
1338msgid "Debut Album"1342msgid "Debut Album"
1339msgstr "Uvedení alba"1343msgstr "Uvedení alba"
13401344
1341#: gmusicbrowser.pl:12221345#: gmusicbrowser.pl:1227
1342msgid "Decrease Volume"1346msgid "Decrease Volume"
1343msgstr "Snížit hlasitost"1347msgstr "Snížit hlasitost"
13441348
@@ -1354,7 +1358,7 @@
1354msgid "Default fullscreen"1358msgid "Default fullscreen"
1355msgstr "Výchozí celá obrazovka"1359msgstr "Výchozí celá obrazovka"
13561360
1357#: gmusicbrowser.pl:62111361#: gmusicbrowser.pl:6193
1358#, perl-format1362#, perl-format
1359msgid "Default rating : %d %"1363msgid "Default rating : %d %"
1360msgstr "Výchozí hodnocení : %d %"1364msgstr "Výchozí hodnocení : %d %"
@@ -1367,7 +1371,7 @@
1367msgid "Default text font"1371msgid "Default text font"
1368msgstr "Výchozí font textu"1372msgstr "Výchozí font textu"
13691373
1370#: gmusicbrowser.pl:63011374#: gmusicbrowser.pl:6272
1371#, perl-format1375#, perl-format
1372msgid "Delay before showing tray tip popup on mouse over : %d ms"1376msgid "Delay before showing tray tip popup on mouse over : %d ms"
1373msgstr ""1377msgstr ""
@@ -1378,19 +1382,19 @@
1378msgid "Delete"1382msgid "Delete"
1379msgstr "Odstranit"1383msgstr "Odstranit"
13801384
1381#: gmusicbrowser.pl:12131385#: gmusicbrowser.pl:1218
1382msgid "Delete Selected Songs"1386msgid "Delete Selected Songs"
1383msgstr "Odstranit vybrané skladby"1387msgstr "Odstranit vybrané skladby"
13841388
1385#: gmusicbrowser_layout.pm:23901389#: gmusicbrowser_layout.pm:2399
1386msgid "Delete list"1390msgid "Delete list"
1387msgstr "Odstranit seznam"1391msgstr "Odstranit seznam"
13881392
1389#: gmusicbrowser.pl:47771393#: gmusicbrowser.pl:4802
1390msgid "Deletion failed"1394msgid "Deletion failed"
1391msgstr ""1395msgstr ""
13921396
1393#: gmusicbrowser.pl:79921397#: gmusicbrowser.pl:8018
1394msgid "Descending order"1398msgid "Descending order"
1395msgstr "Sestupné pořadí"1399msgstr "Sestupné pořadí"
13961400
@@ -1412,12 +1416,12 @@
1412msgid "Desktop widgets plugin"1416msgid "Desktop widgets plugin"
1413msgstr "Zásuvný modul pomůcek"1417msgstr "Zásuvný modul pomůcek"
14141418
1415#: gmusicbrowser.pl:43901419#: gmusicbrowser.pl:4414
1416#, perl-brace-format1420#, perl-brace-format
1417msgid "Destination: {file}"1421msgid "Destination: {file}"
1418msgstr ""1422msgstr ""
14191423
1420#: gmusicbrowser.pl:62281424#: gmusicbrowser.pl:6210
1421msgid "Disable screensaver when fullscreen and playing"1425msgid "Disable screensaver when fullscreen and playing"
1422msgstr "Při celoobrazovkovém režimu vypnout spořič obrazovky"1426msgstr "Při celoobrazovkovém režimu vypnout spořič obrazovky"
14231427
@@ -1438,11 +1442,11 @@
1438msgid "Disc name"1442msgid "Disc name"
1439msgstr "Název disku"1443msgstr "Název disku"
14401444
1441#: gmusicbrowser.pl:12111445#: gmusicbrowser.pl:1216
1442msgid "Display (:1 or host:0 for example)"1446msgid "Display (:1 or host:0 for example)"
1443msgstr "Zobrazit (:1 nebo host:0 pro příklad)"1447msgstr "Zobrazit (:1 nebo host:0 pro příklad)"
14441448
1445#: gmusicbrowser.pl:5051449#: gmusicbrowser.pl:508
1446msgid "Display Songs"1450msgid "Display Songs"
1447msgstr "Zobrazit skladby"1451msgstr "Zobrazit skladby"
14481452
@@ -1459,28 +1463,24 @@
1459msgid "Display synchronized lyrics of the current song"1463msgid "Display synchronized lyrics of the current song"
1460msgstr "Zobrazovat texty v souladu se stávající skladbou"1464msgstr "Zobrazovat texty v souladu se stávající skladbou"
14611465
1462#: gmusicbrowser.pl:62971466#: gmusicbrowser.pl:6268
1463#, perl-format1467#, perl-format
1464msgid "Display tray tip for %d ms"1468msgid "Display tray tip for %d ms"
1465msgstr "Zobrazit vyskakovací okno oznamovací oblasti po %d ms"1469msgstr "Zobrazit vyskakovací okno oznamovací oblasti po %d ms"
14661470
1467#: plugins/export.pm:1571471#: plugins/export.pm:160
1468msgid "Do not add a title row"1472msgid "Do not add a title row"
1469msgstr "Nepřidávat titulkovou řádku"1473msgstr "Nepřidávat titulkovou řádku"
14701474
1471#: gmusicbrowser.pl:65161475#: gmusicbrowser.pl:6326
1472msgid "Do not add songs that can't be played"
1473msgstr "Nepřidávat skladby, které nelze přehrát"
1474
1475#: gmusicbrowser.pl:6355
1476msgid "Do not create an id3v1 tag in mp3 files"1476msgid "Do not create an id3v1 tag in mp3 files"
1477msgstr "Nevytvářet ID3v1 popisek u souborů mp3"1477msgstr "Nevytvářet ID3v1 popisek u souborů mp3"
14781478
1479#: gmusicbrowser.pl:63511479#: gmusicbrowser.pl:6322
1480msgid "Do not unsynchronise id3v2 tags"1480msgid "Do not unsynchronise id3v2 tags"
1481msgstr "Nechat synchronizované ID3v2 popisky"1481msgstr "Nechat synchronizované ID3v2 popisky"
14821482
1483#: gmusicbrowser.pl:63541483#: gmusicbrowser.pl:6325
1484msgid "Do not write the tags"1484msgid "Do not write the tags"
1485msgstr "Nezapisovat popisky"1485msgstr "Nezapisovat popisky"
14861486
@@ -1505,24 +1505,24 @@
1505msgid "Download"1505msgid "Download"
1506msgstr "Stáhnout"1506msgstr "Stáhnout"
15071507
1508#: gmusicbrowser.pl:63841508#: gmusicbrowser.pl:6355
1509msgid "Drag and drop songs here to replace the selection."1509msgid "Drag and drop songs here to replace the selection."
1510msgstr "Přetáhněte songy sem pro nahrazení výběru"1510msgstr "Přetáhněte songy sem pro nahrazení výběru"
15111511
1512#: gmusicbrowser.pl:5263 layouts/makeitlooklike.layout:501512#: gmusicbrowser.pl:5288 layouts/makeitlooklike.layout:50
1513#: layouts/makeitlooklike.layout:235 layouts/makeitlooklike.layout:3401513#: layouts/makeitlooklike.layout:235 layouts/makeitlooklike.layout:340
1514msgid "Edit"1514msgid "Edit"
1515msgstr "Upravit"1515msgstr "Upravit"
15161516
1517#: gmusicbrowser.pl:12041517#: gmusicbrowser.pl:1209
1518msgid "Edit Current Song Properties"1518msgid "Edit Current Song Properties"
1519msgstr "Upravit vlastnosti stávající skladby"1519msgstr "Upravit vlastnosti stávající skladby"
15201520
1521#: gmusicbrowser.pl:4751521#: gmusicbrowser.pl:478
1522msgid "Edit Labels"1522msgid "Edit Labels"
1523msgstr "Upravit štítky"1523msgstr "Upravit štítky"
15241524
1525#: gmusicbrowser.pl:491 gmusicbrowser.pl:47301525#: gmusicbrowser.pl:494 gmusicbrowser.pl:4755
1526msgid "Edit Lyrics"1526msgid "Edit Lyrics"
1527msgstr "Upravit texty"1527msgstr "Upravit texty"
15281528
@@ -1530,11 +1530,11 @@
1530msgid "Edit Lyrics ..."1530msgid "Edit Lyrics ..."
1531msgstr "Upravit texty ..."1531msgstr "Upravit texty ..."
15321532
1533#: gmusicbrowser.pl:52231533#: gmusicbrowser.pl:5248
1534msgid "Edit Multiple Songs Properties"1534msgid "Edit Multiple Songs Properties"
1535msgstr "Upravit mnohočetné vlastnosti skladeb"1535msgstr "Upravit mnohočetné vlastnosti skladeb"
15361536
1537#: gmusicbrowser.pl:4761537#: gmusicbrowser.pl:479
1538msgid "Edit Rating"1538msgid "Edit Rating"
1539msgstr "Upravit hodnocení"1539msgstr "Upravit hodnocení"
15401540
@@ -1546,7 +1546,7 @@
1546msgid "Edit auto-fill formats ..."1546msgid "Edit auto-fill formats ..."
1547msgstr "Upravit formáty automatického vyplňování ..."1547msgstr "Upravit formáty automatického vyplňování ..."
15481548
1549#: gmusicbrowser_list.pm:29441549#: gmusicbrowser_list.pm:2946
1550msgid "Edit filter"1550msgid "Edit filter"
1551msgstr "Upravit filter"1551msgstr "Upravit filter"
15521552
@@ -1554,7 +1554,7 @@
1554msgid "Edit filter..."1554msgid "Edit filter..."
1555msgstr "Upravit filtr"1555msgstr "Upravit filtr"
15561556
1557#: gmusicbrowser_list.pm:67571557#: gmusicbrowser_list.pm:6750
1558msgid "Edit grouping ..."1558msgid "Edit grouping ..."
1559msgstr "Upravit seskupení ..."1559msgstr "Upravit seskupení ..."
15601560
@@ -1562,7 +1562,7 @@
1562msgid "Edit in the last.fm wiki"1562msgid "Edit in the last.fm wiki"
1563msgstr "Upravit v last.fm wiki"1563msgstr "Upravit v last.fm wiki"
15641564
1565#: gmusicbrowser_list.pm:29521565#: gmusicbrowser_list.pm:2954
1566msgid "Edit list"1566msgid "Edit list"
1567msgstr "Upravit seznam"1567msgstr "Upravit seznam"
15681568
@@ -1570,24 +1570,24 @@
1570msgid "Edit mode"1570msgid "Edit mode"
1571msgstr "Režim úprav"1571msgstr "Režim úprav"
15721572
1573#: gmusicbrowser_layout.pm:14041573#: gmusicbrowser_layout.pm:1410
1574msgid "Edit ordered modes ..."1574msgid "Edit ordered modes ..."
1575msgstr "Upravit režimy pořadí"1575msgstr "Upravit režimy pořadí"
15761576
1577#: gmusicbrowser_layout.pm:13881577#: gmusicbrowser_layout.pm:1394
1578msgid "Edit random modes ..."1578msgid "Edit random modes ..."
1579msgstr "Upravit náhodné režimy"1579msgstr "Upravit náhodné režimy"
15801580
1581#: gmusicbrowser_list.pm:710 gmusicbrowser_list.pm:8541581#: gmusicbrowser_list.pm:720 gmusicbrowser_list.pm:864
1582#: gmusicbrowser_list.pm:67691582#: gmusicbrowser_list.pm:6762
1583msgid "Edit row tip"1583msgid "Edit row tip"
1584msgstr "Upravit řádek Tip"1584msgstr "Upravit řádek Tip"
15851585
1586#: gmusicbrowser.pl:12051586#: gmusicbrowser.pl:1210
1587msgid "Edit selected song properties"1587msgid "Edit selected song properties"
1588msgstr "Upravit vlastnosti vybrané skladby"1588msgstr "Upravit vlastnosti vybrané skladby"
15891589
1590#: gmusicbrowser.pl:9347 gmusicbrowser_layout.pm:391590#: gmusicbrowser.pl:9373 gmusicbrowser_layout.pm:39
1591msgid "Edit..."1591msgid "Edit..."
1592msgstr "Upravit..."1592msgstr "Upravit..."
15931593
@@ -1595,11 +1595,11 @@
1595msgid "Editable in song properties dialog"1595msgid "Editable in song properties dialog"
1596msgstr "Je možno upravit v dialogu vlastností skladby"1596msgstr "Je možno upravit v dialogu vlastností skladby"
15971597
1598#: gmusicbrowser.pl:3282 gmusicbrowser.pl:32891598#: gmusicbrowser.pl:3293 gmusicbrowser.pl:3300
1599msgid "Editing list : "1599msgid "Editing list : "
1600msgstr "Úprava seznamu :"1600msgstr "Úprava seznamu :"
16011601
1602#: gmusicbrowser.pl:14411602#: gmusicbrowser.pl:1446
1603msgid "Editing tags"1603msgid "Editing tags"
1604msgstr "Úprava popisků"1604msgstr "Úprava popisků"
16051605
@@ -1627,40 +1627,40 @@
1627msgid "Encoder"1627msgid "Encoder"
1628msgstr "Enkodér"1628msgstr "Enkodér"
16291629
1630#: gmusicbrowser.pl:63531630#: gmusicbrowser.pl:6324
1631msgid "Encoding used for id3v1 tags :"1631msgid "Encoding used for id3v1 tags :"
1632msgstr "Kódování použité pro ID3v1 popisky :"1632msgstr "Kódování použité pro ID3v1 popisky :"
16331633
1634#: gmusicbrowser_list.pm:1709 gmusicbrowser_list.pm:39891634#: gmusicbrowser_list.pm:1711 gmusicbrowser_list.pm:3986
1635#: gmusicbrowser_list.pm:40561635#: gmusicbrowser_list.pm:4053
1636msgid "Enqueue"1636msgid "Enqueue"
1637msgstr "Přidat do fronty"1637msgstr "Přidat do fronty"
16381638
1639#: gmusicbrowser.pl:12181639#: gmusicbrowser.pl:1223
1640msgid "Enqueue Action"1640msgid "Enqueue Action"
1641msgstr "Možnosti přidání do fronty"1641msgstr "Možnosti přidání do fronty"
16421642
1643#: gmusicbrowser.pl:4721643#: gmusicbrowser.pl:475
1644msgid "Enqueue Displayed"1644msgid "Enqueue Displayed"
1645msgstr "Přidat do fronty zobrazené"1645msgstr "Přidat do fronty zobrazené"
16461646
1647#: gmusicbrowser.pl:4701647#: gmusicbrowser.pl:473
1648msgid "Enqueue Selected"1648msgid "Enqueue Selected"
1649msgstr "Přidat do fronty vybrané"1649msgstr "Přidat do fronty vybrané"
16501650
1651#: gmusicbrowser.pl:12151651#: gmusicbrowser.pl:1220
1652msgid "Enqueue Selected Songs"1652msgid "Enqueue Selected Songs"
1653msgstr "Přidat do fronty vybrané skladby"1653msgstr "Přidat do fronty vybrané skladby"
16541654
1655#: gmusicbrowser.pl:12171655#: gmusicbrowser.pl:1222
1656msgid "Enqueue Songs from Current Album"1656msgid "Enqueue Songs from Current Album"
1657msgstr "Přidat do fronty skladby ze stávajícího alba"1657msgstr "Přidat do fronty skladby ze stávajícího alba"
16581658
1659#: gmusicbrowser.pl:12161659#: gmusicbrowser.pl:1221
1660msgid "Enqueue Songs from Current Artist"1660msgid "Enqueue Songs from Current Artist"
1661msgstr "Přidat do fronty skladby stávajícího interpreta"1661msgstr "Přidat do fronty skladby stávajícího interpreta"
16621662
1663#: gmusicbrowser.pl:12451663#: gmusicbrowser.pl:1250
1664msgid "Enqueue a list of files/folders"1664msgid "Enqueue a list of files/folders"
1665msgstr "Přidat do fronty seznam souborů/složek"1665msgstr "Přidat do fronty seznam souborů/složek"
16661666
@@ -1683,15 +1683,15 @@
1683msgid "Equalizer"1683msgid "Equalizer"
1684msgstr "Ekvalizér"1684msgstr "Ekvalizér"
16851685
1686#: gmusicbrowser.pl:59371686#: gmusicbrowser.pl:5960
1687msgid "Error :"1687msgid "Error :"
1688msgstr "Chyba :"1688msgstr "Chyba :"
16891689
1690#: gmusicbrowser.pl:43141690#: gmusicbrowser.pl:4338
1691msgid "Error creating folder"1691msgid "Error creating folder"
1692msgstr ""1692msgstr ""
16931693
1694#: gmusicbrowser.pl:25161694#: gmusicbrowser.pl:2527
1695msgid "Error details"1695msgid "Error details"
1696msgstr "Podrobnosti o chybě"1696msgstr "Podrobnosti o chybě"
16971697
@@ -1730,7 +1730,7 @@
1730"Chyba ukládání textů do '{file}' :\n"1730"Chyba ukládání textů do '{file}' :\n"
1731"{error}"1731"{error}"
17321732
1733#: plugins/fetch_cover.pm:5561733#: plugins/fetch_cover.pm:557
1734msgid "Error saving picture"1734msgid "Error saving picture"
1735msgstr ""1735msgstr ""
17361736
@@ -1755,11 +1755,19 @@
1755msgid "Error while writing tag"1755msgid "Error while writing tag"
1756msgstr ""1756msgstr ""
17571757
1758#: plugins/fetch_cover.pm:5561758#: plugins/fetch_cover.pm:557
1759#, perl-brace-format1759#, perl-brace-format
1760msgid "Error writing '{file}'"1760msgid "Error writing '{file}'"
1761msgstr "Chyba zápisu do '{file}'"1761msgstr "Chyba zápisu do '{file}'"
17621762
1763#: plugins/export.pm:167
1764msgid "Error writing .csv file"
1765msgstr ""
1766
1767#: plugins/export.pm:153
1768msgid "Error writing .m3u file"
1769msgstr ""
1770
1763#: gmusicbrowser_tags.pm:2891771#: gmusicbrowser_tags.pm:289
1764msgid "Error writing lyrics"1772msgid "Error writing lyrics"
1765msgstr ""1773msgstr ""
@@ -1809,11 +1817,11 @@
1809msgid "Extra fields"1817msgid "Extra fields"
1810msgstr "Extra pole"1818msgstr "Extra pole"
18111819
1812#: gmusicbrowser.pl:61551820#: gmusicbrowser.pl:6178
1813msgid "Extra gain"1821msgid "Extra gain"
1814msgstr "Extra zisk"1822msgstr "Extra zisk"
18151823
1816#: gmusicbrowser.pl:62441824#: gmusicbrowser.pl:6221
1817msgid "Extract guest artist from title :"1825msgid "Extract guest artist from title :"
1818msgstr "Vyčlenit hostujícího interpreta z názvu :"1826msgstr "Vyčlenit hostujícího interpreta z názvu :"
18191827
@@ -1830,7 +1838,7 @@
1830msgid "Fade-out then stop"1838msgid "Fade-out then stop"
1831msgstr "Slábnout, pak zastavit"1839msgstr "Slábnout, pak zastavit"
18321840
1833#: gmusicbrowser.pl:47791841#: gmusicbrowser.pl:4804
1834#, perl-brace-format1842#, perl-brace-format
1835msgid "Failed to delete '{file}'"1843msgid "Failed to delete '{file}'"
1836msgstr ""1844msgstr ""
@@ -1847,7 +1855,7 @@
1847msgid "Field type"1855msgid "Field type"
1848msgstr "Typ pole"1856msgstr "Typ pole"
18491857
1850#: gmusicbrowser.pl:5727 gmusicbrowser_list.pm:52721858#: gmusicbrowser.pl:5750 gmusicbrowser_list.pm:5269
1851msgid "Fields"1859msgid "Fields"
1852msgstr "Pole"1860msgstr "Pole"
18531861
@@ -1893,12 +1901,16 @@
1893msgid "Files"1901msgid "Files"
1894msgstr "Soubory"1902msgstr "Soubory"
18951903
1896#: gmusicbrowser_list.pm:15881904#: gmusicbrowser.pl:6488
1905msgid "Files with these extensions won't be added"
1906msgstr ""
1907
1908#: gmusicbrowser_list.pm:1590
1897msgid "Filesystem"1909msgid "Filesystem"
1898msgstr "Souborový systém"1910msgstr "Souborový systém"
18991911
1900#: gmusicbrowser.pl:503 gmusicbrowser.pl:505 gmusicbrowser_list.pm:1251912#: gmusicbrowser.pl:506 gmusicbrowser.pl:508 gmusicbrowser_list.pm:125
1901#: gmusicbrowser_list.pm:1584 layouts/contrib.layout:3351913#: gmusicbrowser_list.pm:1586 layouts/contrib.layout:335
1902#: layouts/contrib.layout:5341914#: layouts/contrib.layout:534
1903msgid "Filter"1915msgid "Filter"
1904msgstr "Filtr"1916msgstr "Filtr"
@@ -1907,7 +1919,7 @@
1907msgid "Filter : "1919msgid "Filter : "
1908msgstr "Filtr : "1920msgstr "Filtr : "
19091921
1910#: gmusicbrowser.pl:74561922#: gmusicbrowser.pl:7482
1911msgid "Filter edition"1923msgid "Filter edition"
1912msgstr "Editace filtru"1924msgstr "Editace filtru"
19131925
@@ -1923,15 +1935,15 @@
1923msgid "Filter on playing Song"1935msgid "Filter on playing Song"
1924msgstr "Filtr na přehrávanou skladbu"1936msgstr "Filtr na přehrávanou skladbu"
19251937
1926#: gmusicbrowser_list.pm:32981938#: gmusicbrowser_list.pm:3301
1927msgid "Filter on this album"1939msgid "Filter on this album"
1928msgstr "Filtr na toto album"1940msgstr "Filtr na toto album"
19291941
1930#: gmusicbrowser_list.pm:32981942#: gmusicbrowser_list.pm:3301
1931msgid "Filter on this artist"1943msgid "Filter on this artist"
1932msgstr "Filtr na tohoto interpreta"1944msgstr "Filtr na tohoto interpreta"
19331945
1934#: gmusicbrowser_list.pm:52981946#: gmusicbrowser_list.pm:5295
1935msgid "Find :"1947msgid "Find :"
1936msgstr "Nalézt :"1948msgstr "Nalézt :"
19371949
@@ -1939,25 +1951,25 @@
1939msgid "Find a unique filename if file already exists"1951msgid "Find a unique filename if file already exists"
1940msgstr "Pokud soubor již existuje, najít jedinečný název"1952msgstr "Pokud soubor již existuje, najít jedinečný název"
19411953
1942#: gmusicbrowser.pl:4791954#: gmusicbrowser.pl:482
1943msgid "Find songs in same albums"1955msgid "Find songs in same albums"
1944msgstr "Najít skladby na stejných albech"1956msgstr "Najít skladby na stejných albech"
19451957
1946#: gmusicbrowser.pl:4781958#: gmusicbrowser.pl:481
1947msgid "Find songs with same artists"1959msgid "Find songs with same artists"
1948msgstr "Najít skladby stejných interpretů"1960msgstr "Najít skladby stejných interpretů"
19491961
1950#: gmusicbrowser.pl:4771962#: gmusicbrowser.pl:480
1951msgid "Find songs with the same names"1963msgid "Find songs with the same names"
1952msgstr "Najít skladby stejných názvů"1964msgstr "Najít skladby stejných názvů"
19531965
1954#: gmusicbrowser.pl:997 gmusicbrowser_list.pm:781 gmusicbrowser_list.pm:15871966#: gmusicbrowser.pl:1000 gmusicbrowser_list.pm:791 gmusicbrowser_list.pm:1589
1955#: gmusicbrowser_songs.pm:803 layouts/contrib.layout:3371967#: gmusicbrowser_songs.pm:803 layouts/contrib.layout:337
1956#: layouts/songtree.layout:911968#: layouts/songtree.layout:91
1957msgid "Folder"1969msgid "Folder"
1958msgstr "Složka"1970msgstr "Složka"
19591971
1960#: gmusicbrowser_list.pm:781 layouts/songtree.layout:901972#: gmusicbrowser_list.pm:791 layouts/songtree.layout:90
1961msgid "Folder (right-aligned)"1973msgid "Folder (right-aligned)"
1962msgstr "Složka (zarovnáno vpravo)"1974msgstr "Složka (zarovnáno vpravo)"
19631975
@@ -1965,20 +1977,20 @@
1965msgid "Folder format :"1977msgid "Folder format :"
1966msgstr "Formát složky :"1978msgstr "Formát složky :"
19671979
1968#: gmusicbrowser.pl:49331980#: gmusicbrowser.pl:4958
1969msgid "Folder pattern :"1981msgid "Folder pattern :"
1970msgstr "Vzor složky :"1982msgstr "Vzor složky :"
19711983
1972#: gmusicbrowser.pl:6479 gmusicbrowser.pl:65211984#: gmusicbrowser.pl:6450 gmusicbrowser.pl:6495
1973msgid "Folders to search for new songs"1985msgid "Folders to search for new songs"
1974msgstr "Nové skladby hledat ve složkách"1986msgstr "Nové skladby hledat ve složkách"
19751987
1976#: gmusicbrowser_layout.pm:4165 gmusicbrowser_list.pm:171988#: gmusicbrowser_layout.pm:4174 gmusicbrowser_list.pm:17
1977#: gmusicbrowser_list.pm:859 gmusicbrowser_list.pm:67741989#: gmusicbrowser_list.pm:869 gmusicbrowser_list.pm:6767
1978msgid "Follow playing song"1990msgid "Follow playing song"
1979msgstr "Následovat přehrávanou skladbu"1991msgstr "Následovat přehrávanou skladbu"
19801992
1981#: gmusicbrowser_layout.pm:41651993#: gmusicbrowser_layout.pm:4174
1982msgid "Follow selected song"1994msgid "Follow selected song"
1983msgstr "Následovat vybranou skladbu"1995msgstr "Následovat vybranou skladbu"
19841996
@@ -1986,7 +1998,7 @@
1986msgid "Font size"1998msgid "Font size"
1987msgstr "Velikost písma"1999msgstr "Velikost písma"
19882000
1989#: gmusicbrowser.pl:11912001#: gmusicbrowser.pl:1194
1990msgid "Forward"2002msgid "Forward"
1991msgstr "Vpřed"2003msgstr "Vpřed"
19922004
@@ -1998,18 +2010,18 @@
1998msgid "Friday"2010msgid "Friday"
1999msgstr "Pátek"2011msgstr "Pátek"
20002012
2001#: gmusicbrowser.pl:49942013#: gmusicbrowser.pl:5019
2002#, perl-brace-format2014#, perl-brace-format
2003msgid ""2015msgid ""
2004"From: {oldname}\n"2016"From: {oldname}\n"
2005"To: {newname}"2017"To: {newname}"
2006msgstr ""2018msgstr ""
20072019
2008#: gmusicbrowser.pl:63152020#: gmusicbrowser.pl:6286
2009msgid "Full screen layout :"2021msgid "Full screen layout :"
2010msgstr "Celoobrazovkové rozložení :"2022msgstr "Celoobrazovkové rozložení :"
20112023
2012#: gmusicbrowser.pl:522 gmusicbrowser_layout.pm:6372024#: gmusicbrowser.pl:525 gmusicbrowser_layout.pm:637
2013msgid "Fullscreen"2025msgid "Fullscreen"
2014msgstr "Celá obrazovka"2026msgstr "Celá obrazovka"
20152027
@@ -2017,11 +2029,11 @@
2017msgid "Fullscreen simple"2029msgid "Fullscreen simple"
2018msgstr "Jednoduchá celá obrazovka"2030msgstr "Jednoduchá celá obrazovka"
20192031
2020#: gmusicbrowser.pl:60592032#: gmusicbrowser.pl:6082
2021msgid "GStreamer module not loaded."2033msgid "GStreamer module not loaded."
2022msgstr "Modul GStreamer není zaveden"2034msgstr "Modul GStreamer není zaveden"
20232035
2024#: gmusicbrowser.pl:61562036#: gmusicbrowser.pl:6179
2025msgid "Gain for songs missing replaygain tags"2037msgid "Gain for songs missing replaygain tags"
2026msgstr "Výtěžek skladeb bez popisků replaygain"2038msgstr "Výtěžek skladeb bez popisků replaygain"
20272039
@@ -2044,7 +2056,7 @@
2044msgid "Genre - Artist"2056msgid "Genre - Artist"
2045msgstr "Žánr - Album"2057msgstr "Žánr - Album"
20462058
2047#: gmusicbrowser_songs.pm:49472059#: gmusicbrowser_songs.pm:4974
2048msgid "Genre is set"2060msgid "Genre is set"
2049msgstr "Žánr je nastaven"2061msgstr "Žánr je nastaven"
20502062
@@ -2068,11 +2080,11 @@
2068msgid "Go to Playing Track"2080msgid "Go to Playing Track"
2069msgstr "Přejít na přehrávanou skladbu"2081msgstr "Přejít na přehrávanou skladbu"
20702082
2071#: gmusicbrowser_list.pm:862 gmusicbrowser_list.pm:67772083#: gmusicbrowser_list.pm:872 gmusicbrowser_list.pm:6770
2072msgid "Go to playing song"2084msgid "Go to playing song"
2073msgstr "Přejít na přehrávanou skladbu"2085msgstr "Přejít na přehrávanou skladbu"
20742086
2075#: gmusicbrowser_list.pm:75922087#: gmusicbrowser_list.pm:7585
2076msgid "Group by :"2088msgid "Group by :"
2077msgstr "Seskupit s :"2089msgstr "Seskupit s :"
20782090
@@ -2088,7 +2100,7 @@
2088msgid "Handshake failed : "2100msgid "Handshake failed : "
2089msgstr "Selhání spojení :"2101msgstr "Selhání spojení :"
20902102
2091#: gmusicbrowser.pl:61522103#: gmusicbrowser.pl:6175
2092msgid "Hard limiter"2104msgid "Hard limiter"
2093msgstr "Tvrdá omezení"2105msgstr "Tvrdá omezení"
20942106
@@ -2097,7 +2109,7 @@
2097msgid "Help"2109msgid "Help"
2098msgstr "Pomoc"2110msgstr "Pomoc"
20992111
2100#: gmusicbrowser.pl:521 gmusicbrowser.pl:12082112#: gmusicbrowser.pl:524 gmusicbrowser.pl:1213
2101msgid "Hide"2113msgid "Hide"
2102msgstr "Skrýt"2114msgstr "Skrýt"
21032115
@@ -2105,7 +2117,7 @@
2105msgid "Hide Artist/Album bar"2117msgid "Hide Artist/Album bar"
2106msgstr "Skrýt lištu Umělec/Album"2118msgstr "Skrýt lištu Umělec/Album"
21072119
2108#: gmusicbrowser_list.pm:52712120#: gmusicbrowser_list.pm:5268
2109msgid "Hide non-matching"2121msgid "Hide non-matching"
2110msgstr "Skrýt, které se neshodují"2122msgstr "Skrýt, které se neshodují"
21112123
@@ -2113,7 +2125,7 @@
2113msgid "Hide toolbar"2125msgid "Hide toolbar"
2114msgstr "Skrýt lištu nástrojů"2126msgstr "Skrýt lištu nástrojů"
21152127
2116#: gmusicbrowser.pl:63292128#: gmusicbrowser.pl:6300
2117msgid "Icon theme :"2129msgid "Icon theme :"
2118msgstr "Téma ikon :"2130msgstr "Téma ikon :"
21192131
@@ -2121,11 +2133,15 @@
2121msgid "Identifier in file tag"2133msgid "Identifier in file tag"
2122msgstr "Identifikátor v popisku souboru"2134msgstr "Identifikátor v popisku souboru"
21232135
2124#: gmusicbrowser.pl:61022136#: gmusicbrowser.pl:6125
2125msgid "Ignore playback errors"2137msgid "Ignore playback errors"
2126msgstr "Ignorovat chyby přehrávání"2138msgstr "Ignorovat chyby přehrávání"
21272139
2128#: gmusicbrowser_list.pm:29582140#: gmusicbrowser.pl:6488
2141msgid "Ignored file extensions :"
2142msgstr ""
2143
2144#: gmusicbrowser_list.pm:2960
2129msgid "Import list"2145msgid "Import list"
2130msgstr "Seznam importů"2146msgstr "Seznam importů"
21312147
@@ -2141,7 +2157,7 @@
2141msgid "Include Styles in Genres"2157msgid "Include Styles in Genres"
2142msgstr "Zahrnout Styly a Žánry"2158msgstr "Zahrnout Styly a Žánry"
21432159
2144#: gmusicbrowser.pl:12212160#: gmusicbrowser.pl:1226
2145msgid "Increase Volume"2161msgid "Increase Volume"
2146msgstr "Zvýšit hlasitost"2162msgstr "Zvýšit hlasitost"
21472163
@@ -2149,7 +2165,7 @@
2149msgid "Increase volume"2165msgid "Increase volume"
2150msgstr "Zesílit hlasitost"2166msgstr "Zesílit hlasitost"
21512167
2152#: gmusicbrowser.pl:5264 gmusicbrowser_tags.pm:1683 layouts/pages.layout:402168#: gmusicbrowser.pl:5289 gmusicbrowser_tags.pm:1683 layouts/pages.layout:40
2153#: layouts/shimmer.layout:752169#: layouts/shimmer.layout:75
2154msgid "Info"2170msgid "Info"
2155msgstr "Info"2171msgstr "Info"
@@ -2166,11 +2182,11 @@
2166msgid "Insensitive, Song & Cover"2182msgid "Insensitive, Song & Cover"
2167msgstr "Nedostupné, skladba & přebal"2183msgstr "Nedostupné, skladba & přebal"
21682184
2169#: gmusicbrowser.pl:12142185#: gmusicbrowser.pl:1219
2170msgid "Insert Selected Songs at the top of the queue"2186msgid "Insert Selected Songs at the top of the queue"
2171msgstr "Vložit vybrané skladby na začátek fronty"2187msgstr "Vložit vybrané skladby na začátek fronty"
21722188
2173#: gmusicbrowser.pl:12442189#: gmusicbrowser.pl:1249
2174msgid "Insert a list of files/folders at the start of the playlist"2190msgid "Insert a list of files/folders at the start of the playlist"
2175msgstr "Vložit seznam souborů/složek na začátek playlistu"2191msgstr "Vložit seznam souborů/složek na začátek playlistu"
21762192
@@ -2182,7 +2198,7 @@
2182msgid "Invalid regular expression"2198msgid "Invalid regular expression"
2183msgstr "Chybný výraz"2199msgstr "Chybný výraz"
21842200
2185#: gmusicbrowser.pl:85672201#: gmusicbrowser.pl:8593
2186msgid "Invert filter"2202msgid "Invert filter"
2187msgstr "Obrátit filtr"2203msgstr "Obrátit filtr"
21882204
@@ -2199,7 +2215,7 @@
2199msgid "Justified"2215msgid "Justified"
2200msgstr "Do bloku"2216msgstr "Do bloku"
22012217
2202#: gmusicbrowser.pl:8072218#: gmusicbrowser.pl:810
2203msgid "KB"2219msgid "KB"
2204msgstr "KB"2220msgstr "KB"
22052221
@@ -2211,15 +2227,15 @@
2211msgid "Karaoke plugin"2227msgid "Karaoke plugin"
2212msgstr "Zásuvný modul karaoke"2228msgstr "Zásuvný modul karaoke"
22132229
2214#: gmusicbrowser_list.pm:856 gmusicbrowser_list.pm:67712230#: gmusicbrowser_list.pm:866 gmusicbrowser_list.pm:6764
2215msgid "Keep list filtered and sorted"2231msgid "Keep list filtered and sorted"
2216msgstr ""2232msgstr ""
22172233
2218#: gmusicbrowser.pl:5767 gmusicbrowser.pl:58792234#: gmusicbrowser.pl:5790 gmusicbrowser.pl:5902
2219msgid "Key"2235msgid "Key"
2220msgstr "Klávesa"2236msgstr "Klávesa"
22212237
2222#: gmusicbrowser.pl:57292238#: gmusicbrowser.pl:5752
2223msgid "Keys"2239msgid "Keys"
2224msgstr "Klávesy"2240msgstr "Klávesy"
22252241
@@ -2227,12 +2243,12 @@
2227msgid "Keywords"2243msgid "Keywords"
2228msgstr "Klíčová slova"2244msgstr "Klíčová slova"
22292245
2230#: gmusicbrowser.pl:1250 gmusicbrowser.pl:1251 gmusicbrowser.pl:12522246#: gmusicbrowser.pl:1255 gmusicbrowser.pl:1256 gmusicbrowser.pl:1257
2231#: gmusicbrowser.pl:66462247#: gmusicbrowser.pl:6621
2232msgid "Label"2248msgid "Label"
2233msgstr "Štítek"2249msgstr "Štítek"
22342250
2235#: gmusicbrowser_songs.pm:49422251#: gmusicbrowser_songs.pm:4969
2236msgid "Label is set"2252msgid "Label is set"
2237msgstr "Štítek je nastaven"2253msgstr "Štítek je nastaven"
22382254
@@ -2240,11 +2256,11 @@
2240msgid "Label/Publisher"2256msgid "Label/Publisher"
2241msgstr "Značka/vydavatel"2257msgstr "Značka/vydavatel"
22422258
2243#: gmusicbrowser.pl:5723 gmusicbrowser_songs.pm:10072259#: gmusicbrowser.pl:5746 gmusicbrowser_songs.pm:1007
2244msgid "Labels"2260msgid "Labels"
2245msgstr "Štítky"2261msgstr "Štítky"
22462262
2247#: gmusicbrowser_list.pm:808 layouts/songtree.layout:512263#: gmusicbrowser_list.pm:818 layouts/songtree.layout:51
2248msgid "Labels' icons"2264msgid "Labels' icons"
2249msgstr "Ikony štítků"2265msgstr "Ikony štítků"
22502266
@@ -2260,7 +2276,7 @@
2260msgid "Languages"2276msgid "Languages"
2261msgstr "Jazyky"2277msgstr "Jazyky"
22622278
2263#: gmusicbrowser.pl:1011 gmusicbrowser_list.pm:720 gmusicbrowser_songs.pm:10892279#: gmusicbrowser.pl:1014 gmusicbrowser_list.pm:730 gmusicbrowser_songs.pm:1089
2264msgid "Last played"2280msgid "Last played"
2265msgstr "Naposled přehrávané"2281msgstr "Naposled přehrávané"
22662282
@@ -2280,7 +2296,7 @@
2280msgid "Layout :"2296msgid "Layout :"
2281msgstr "Rozložení :"2297msgstr "Rozložení :"
22822298
2283#: gmusicbrowser.pl:57252299#: gmusicbrowser.pl:5748
2284msgid "Layouts"2300msgid "Layouts"
2285msgstr "Vzhled"2301msgstr "Vzhled"
22862302
@@ -2300,7 +2316,7 @@
2300msgid "Length"2316msgid "Length"
2301msgstr "Délka"2317msgstr "Délka"
23022318
2303#: gmusicbrowser.pl:5722 gmusicbrowser_list.pm:126 layouts/contrib.layout:2272319#: gmusicbrowser.pl:5745 gmusicbrowser_list.pm:126 layouts/contrib.layout:227
2304#: layouts/contrib.layout:302 layouts/contrib.layout:3192320#: layouts/contrib.layout:302 layouts/contrib.layout:319
2305#: layouts/contrib.layout:587 layouts/contrib.layout:5922321#: layouts/contrib.layout:587 layouts/contrib.layout:592
2306#: layouts/contrib.layout:733 layouts/contrib.layout:7412322#: layouts/contrib.layout:733 layouts/contrib.layout:741
@@ -2312,7 +2328,7 @@
2312msgid "Library : "2328msgid "Library : "
2313msgstr "Knihovna :"2329msgstr "Knihovna :"
23142330
2315#: gmusicbrowser_list.pm:4492331#: gmusicbrowser_list.pm:451
2316msgid ""2332msgid ""
2317"Library empty.\n"2333"Library empty.\n"
2318"\n"2334"\n"
@@ -2322,7 +2338,7 @@
2322"\n"2338"\n"
2323"Použijte dialog nastavení pro přidání hudby."2339"Použijte dialog nastavení pro přidání hudby."
23242340
2325#: gmusicbrowser.pl:65472341#: gmusicbrowser.pl:6521
2326#, perl-format2342#, perl-format
2327msgid "Library size : %d song"2343msgid "Library size : %d song"
2328msgid_plural "Library size : %d songs"2344msgid_plural "Library size : %d songs"
@@ -2339,16 +2355,16 @@
2339msgid "Limit similar artists to the first : "2355msgid "Limit similar artists to the first : "
2340msgstr "Nejprve stanovte limit podobnosti umělce"2356msgstr "Nejprve stanovte limit podobnosti umělce"
23412357
2342#: gmusicbrowser_list.pm:1585 layouts/contrib.layout:3362358#: gmusicbrowser_list.pm:1587 layouts/contrib.layout:336
2343#: layouts/contrib.layout:5352359#: layouts/contrib.layout:535
2344msgid "List"2360msgid "List"
2345msgstr "Seznam"2361msgstr "Seznam"
23462362
2347#: gmusicbrowser_list.pm:4192363#: gmusicbrowser_list.pm:421
2348msgid "List empty"2364msgid "List empty"
2349msgstr "Seznam je prázdný"2365msgstr "Seznam je prázdný"
23502366
2351#: gmusicbrowser_layout.pm:1392 gmusicbrowser_layout.pm:14582367#: gmusicbrowser_layout.pm:1398 gmusicbrowser_layout.pm:1464
2352msgid "List order"2368msgid "List order"
2353msgstr "Pořadí seznamu"2369msgstr "Pořadí seznamu"
23542370
@@ -2372,7 +2388,7 @@
2372msgid "Lists, Library & Context"2388msgid "Lists, Library & Context"
2373msgstr "Seznamy, knihovna & kontext"2389msgstr "Seznamy, knihovna & kontext"
23742390
2375#: gmusicbrowser_list.pm:34882391#: gmusicbrowser_list.pm:3493
2376msgid "Literal search"2392msgid "Literal search"
2377msgstr "Písmenné vyhledávání"2393msgstr "Písmenné vyhledávání"
23782394
@@ -2401,15 +2417,15 @@
2401msgid "Loading..."2417msgid "Loading..."
2402msgstr "Načítání..."2418msgstr "Načítání..."
24032419
2404#: gmusicbrowser.pl:4972420#: gmusicbrowser.pl:500
2405msgid "Lock"2421msgid "Lock"
2406msgstr "Zamknout"2422msgstr "Zamknout"
24072423
2408#: gmusicbrowser.pl:5182424#: gmusicbrowser.pl:521
2409msgid "Lock Album"2425msgid "Lock Album"
2410msgstr "Zamčené album"2426msgstr "Zamčené album"
24112427
2412#: gmusicbrowser.pl:5172428#: gmusicbrowser.pl:520
2413msgid "Lock Artist"2429msgid "Lock Artist"
2414msgstr "Zamčený interpret"2430msgstr "Zamčený interpret"
24152431
@@ -2438,11 +2454,11 @@
2438msgid "Lookup at allmusic.com"2454msgid "Lookup at allmusic.com"
2439msgstr "Vyhledávání na allmusic.com"2455msgstr "Vyhledávání na allmusic.com"
24402456
2441#: gmusicbrowser.pl:5002457#: gmusicbrowser.pl:503
2442msgid "Lookup in AMG"2458msgid "Lookup in AMG"
2443msgstr "Vyhledat na AMG"2459msgstr "Vyhledat na AMG"
24442460
2445#: gmusicbrowser.pl:4922461#: gmusicbrowser.pl:495
2446msgid "Lookup in google"2462msgid "Lookup in google"
2447msgstr "Vyhledat googlem"2463msgstr "Vyhledat googlem"
24482464
@@ -2490,7 +2506,7 @@
2490msgid "Lyrics file name format"2506msgid "Lyrics file name format"
2491msgstr "Formát názvu souboru textu"2507msgstr "Formát názvu souboru textu"
24922508
2493#: gmusicbrowser.pl:47222509#: gmusicbrowser.pl:4747
2494msgid "Lyrics for "2510msgid "Lyrics for "
2495msgstr "Text pro"2511msgstr "Text pro"
24962512
@@ -2502,7 +2518,7 @@
2502msgid "Lyrics source"2518msgid "Lyrics source"
2503msgstr "Zdroj textů"2519msgstr "Zdroj textů"
25042520
2505#: gmusicbrowser.pl:8082521#: gmusicbrowser.pl:811
2506msgid "MB"2522msgid "MB"
2507msgstr "MB"2523msgstr "MB"
25082524
@@ -2554,11 +2570,11 @@
2554"Umožnit ovládání multimediálními klávesami Gnome Další/Předchozí/Přehrát/"2570"Umožnit ovládání multimediálními klávesami Gnome Další/Předchozí/Přehrát/"
2555"Zastavit"2571"Zastavit"
25562572
2557#: gmusicbrowser.pl:4812573#: gmusicbrowser.pl:484
2558msgid "Mass Rename"2574msgid "Mass Rename"
2559msgstr "Hromadně přejmenovat"2575msgstr "Hromadně přejmenovat"
25602576
2561#: gmusicbrowser.pl:48672577#: gmusicbrowser.pl:4892
2562msgid "Mass Renaming"2578msgid "Mass Renaming"
2563msgstr "Hromadné přejmenování"2579msgstr "Hromadné přejmenování"
25642580
@@ -2590,7 +2606,7 @@
2590msgid "Minimum size"2606msgid "Minimum size"
2591msgstr "Minimální velikost"2607msgstr "Minimální velikost"
25922608
2593#: gmusicbrowser.pl:57262609#: gmusicbrowser.pl:5749
2594msgid "Misc."2610msgid "Misc."
2595msgstr "Různé"2611msgstr "Různé"
25962612
@@ -2622,23 +2638,23 @@
2622msgid "Mosaic View"2638msgid "Mosaic View"
2623msgstr "Pohled Mozaika"2639msgstr "Pohled Mozaika"
26242640
2625#: gmusicbrowser.pl:4842641#: gmusicbrowser.pl:487
2626msgid "Move"2642msgid "Move"
2627msgstr "Přesunout"2643msgstr "Přesunout"
26282644
2629#: gmusicbrowser.pl:49382645#: gmusicbrowser.pl:4963
2630msgid "Move Files to :"2646msgid "Move Files to :"
2631msgstr "Přesunout soubory do :"2647msgstr "Přesunout soubory do :"
26322648
2633#: gmusicbrowser.pl:43362649#: gmusicbrowser.pl:4360
2634msgid "Move failed"2650msgid "Move failed"
2635msgstr "Přesouvání selhalo"2651msgstr "Přesouvání selhalo"
26362652
2637#: gmusicbrowser.pl:64452653#: gmusicbrowser.pl:6416
2638msgid "Move folder to"2654msgid "Move folder to"
2639msgstr "Přesunout složku do"2655msgstr "Přesunout složku do"
26402656
2641#: gmusicbrowser.pl:43382657#: gmusicbrowser.pl:4362
2642#, perl-format2658#, perl-format
2643msgid "Moving file"2659msgid "Moving file"
2644msgid_plural "Moving %d files"2660msgid_plural "Moving %d files"
@@ -2650,7 +2666,11 @@
2650msgid "Music"2666msgid "Music"
2651msgstr "Hudba"2667msgstr "Hudba"
26522668
2653#: gmusicbrowser.pl:12232669#: gmusicbrowser.pl:6544
2670msgid "Music files"
2671msgstr ""
2672
2673#: gmusicbrowser.pl:1228
2654msgid "Mute/Unmute"2674msgid "Mute/Unmute"
2655msgstr "Ztlumit/zrušit ztlumení"2675msgstr "Ztlumit/zrušit ztlumení"
26562676
@@ -2658,7 +2678,7 @@
2658msgid "Name"2678msgid "Name"
2659msgstr "Název"2679msgstr "Název"
26602680
2661#: gmusicbrowser.pl:1199 gmusicbrowser.pl:1200 gmusicbrowser.pl:12022681#: gmusicbrowser.pl:1204 gmusicbrowser.pl:1205 gmusicbrowser.pl:1207
2662msgid "Name of layout"2682msgid "Name of layout"
2663msgstr "Název rozložení"2683msgstr "Název rozložení"
26642684
@@ -2666,7 +2686,7 @@
2666msgid "Name under which the command will appear in the menu"2686msgid "Name under which the command will appear in the menu"
2667msgstr "Název pod kterým se příkaz bude objevovat v menu"2687msgstr "Název pod kterým se příkaz bude objevovat v menu"
26682688
2669#: gmusicbrowser.pl:65302689#: gmusicbrowser.pl:6504
2670msgid "Never"2690msgid "Never"
2671msgstr "Nikdy"2691msgstr "Nikdy"
26722692
@@ -2678,38 +2698,38 @@
2678msgid "New custom field"2698msgid "New custom field"
2679msgstr "Nové uživatelské pole"2699msgstr "Nové uživatelské pole"
26802700
2681#: gmusicbrowser_list.pm:29432701#: gmusicbrowser_list.pm:2945
2682msgid "New filter"2702msgid "New filter"
2683msgstr "Nový filtr"2703msgstr "Nový filtr"
26842704
2685#: gmusicbrowser_layout.pm:23772705#: gmusicbrowser_layout.pm:2386
2686msgid "New list"2706msgid "New list"
2687msgstr "Nový seznam"2707msgstr "Nový seznam"
26882708
2689#: gmusicbrowser.pl:49022709#: gmusicbrowser.pl:4927
2690msgid "New name"2710msgid "New name"
2691msgstr "Nový název"2711msgstr "Nový název"
26922712
2693#: gmusicbrowser.pl:515 gmusicbrowser.pl:2805 gmusicbrowser_layout.pm:852713#: gmusicbrowser.pl:518 gmusicbrowser.pl:2816 gmusicbrowser_layout.pm:85
2694#: gmusicbrowser_list.pm:5294 plugins/notify.pm:932714#: gmusicbrowser_list.pm:5291 plugins/notify.pm:93
2695#: layouts/makeitlooklike.layout:269 layouts/makeitlooklike.layout:3532715#: layouts/makeitlooklike.layout:269 layouts/makeitlooklike.layout:353
2696#: layouts/makeitlooklike.layout:4272716#: layouts/makeitlooklike.layout:427
2697msgid "Next"2717msgid "Next"
2698msgstr "Další"2718msgstr "Další"
26992719
2700#: gmusicbrowser.pl:11862720#: gmusicbrowser.pl:1189
2701msgid "Next Album"2721msgid "Next Album"
2702msgstr "Další album"2722msgstr "Další album"
27032723
2704#: gmusicbrowser.pl:11872724#: gmusicbrowser.pl:1190
2705msgid "Next Artist"2725msgid "Next Artist"
2706msgstr "Další interpret"2726msgstr "Další interpret"
27072727
2708#: gmusicbrowser.pl:1188 gmusicbrowser_layout.pm:84 layouts/contrib.layout:2202728#: gmusicbrowser.pl:1191 gmusicbrowser_layout.pm:84 layouts/contrib.layout:220
2709msgid "Next Song"2729msgid "Next Song"
2710msgstr "Další"2730msgstr "Další"
27112731
2712#: gmusicbrowser.pl:11842732#: gmusicbrowser.pl:1187
2713msgid "Next Song In Playlist"2733msgid "Next Song In Playlist"
2714msgstr "Další skladba v playlistu"2734msgstr "Další skladba v playlistu"
27152735
@@ -2717,7 +2737,7 @@
2717msgid "No connections"2737msgid "No connections"
2718msgstr "Není spojení"2738msgstr "Není spojení"
27192739
2720#: gmusicbrowser.pl:33542740#: gmusicbrowser.pl:3365
2721msgid "No file browser found."2741msgid "No file browser found."
2722msgstr "Prohlížeč souborů nenalezen."2742msgstr "Prohlížeč souborů nenalezen."
27232743
@@ -2753,11 +2773,11 @@
2753msgid "No review written."2773msgid "No review written."
2754msgstr "Nebyly napsány žádné recenze"2774msgstr "Nebyly napsány žádné recenze"
27552775
2756#: gmusicbrowser_songs.pm:40692776#: gmusicbrowser_songs.pm:4096
2757msgid "No songs"2777msgid "No songs"
2758msgstr "Žádné skladby"2778msgstr "Žádné skladby"
27592779
2760#: gmusicbrowser_list.pm:421 gmusicbrowser_list.pm:4222780#: gmusicbrowser_list.pm:423 gmusicbrowser_list.pm:424
2761msgid "No songs found"2781msgid "No songs found"
2762msgstr "Žádné skladby nenalezeny"2782msgstr "Žádné skladby nenalezeny"
27632783
@@ -2773,11 +2793,11 @@
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: