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
1=== modified file '.pc/shimmer-layouts/gmbrc.default'
2--- .pc/shimmer-layouts/gmbrc.default 2011-03-23 19:23:40 +0000
3+++ .pc/shimmer-layouts/gmbrc.default 2014-02-15 20:02:02 +0000
4@@ -9,6 +9,7 @@
5 # of the plugin found at the top of the plugin file :
6 PLUGIN_LYRICS: 1
7 PLUGIN_FETCHCOVER: 1
8+PLUGIN_AUTOSAVE: 1
9
10 # default player layout
11 #Layout: Small player
12
13=== modified file '.pc/shimmer-layouts/gmusicbrowser.pl'
14--- .pc/shimmer-layouts/gmusicbrowser.pl 2014-01-25 14:17:08 +0000
15+++ .pc/shimmer-layouts/gmusicbrowser.pl 2014-02-15 20:02:02 +0000
16@@ -79,8 +79,8 @@
17 {
18 TRUE => 1,
19 FALSE => 0,
20- VERSION => '1.1011',
21- VERSIONSTRING => '1.1.11',
22+ VERSION => '1.1012',
23+ VERSIONSTRING => '1.1.12',
24 PIXPATH => $DATADIR.SLASH.'pix'.SLASH,
25 PROGRAM_NAME => 'gmusicbrowser',
26 # PERL510 => $^V ge 'v5.10',
27@@ -151,8 +151,9 @@
28
29 our %Alias_ext; #define alternate file extensions (ie: .ogg files treated as .oga files)
30 INIT {%Alias_ext=(ogg=> 'oga', m4b=>'m4a');} #needs to be in a INIT block because used in a INIT block in gmusicbrowser_tags.pm
31+our @ScanExt= qw/mp3 ogg oga flac mpc ape wv m4a m4b/;
32
33-our $debug;
34+our ($Verbose,$debug);
35 our %CmdLine;
36 our ($HomeDir,$SaveFile,$FIFOFile,$ImportFile,$DBus_id);
37 sub find_gmbrc_file { my @f= map $_[0].$_, '','.gz','.xz'; return wantarray ? (grep { -e $_ } @f) : first { -e $_ } @f }
38@@ -185,7 +186,8 @@
39 -nogst : do not use gstreamer
40 -server : send playing song to connected icecast clent
41 -port N : listen for connection on port N in icecast server mode
42--debug : print lots of mostly useless informations
43+-verbose: print some info, like the file being played
44+-debug : print lots of mostly useless informations, implies -verbose
45 -backtrace : print a backtrace for every warning
46 -nodbus : do not provide DBus services
47 -dbus-id KEY : append .KEY to the DBus service id used by gmusicbrowser (org.gmusicbrowser)
48@@ -243,7 +245,8 @@
49 elsif($arg eq '-ro') {$CmdLine{ro}=$CmdLine{rotags}=1}
50 elsif($arg eq '-rotags') {$CmdLine{rotags}=1}
51 elsif($arg eq '-port') {$CmdLine{port}=shift if $ARGV[0]}
52- elsif($arg eq '-debug') {$debug=1}
53+ elsif($arg eq '-verbose') {$Verbose=1}
54+ elsif($arg eq '-debug') {$debug=$Verbose=4}
55 elsif($arg eq '-backtrace') { $SIG{ __WARN__ } = \&Carp::cluck; $SIG{ __DIE__ } = \&Carp::confess; }
56 elsif($arg eq '-nofifo') {$FIFOFile=''}
57 elsif($arg eq '-workspace') {$CmdLine{workspace}=shift if defined $ARGV[0]} #requires Gnome2::Wnck
58@@ -450,7 +453,7 @@
59 $DRAGTYPES{$DRAGTYPES[$_][0]}=$_ for DRAG_FILE,DRAG_USTRING,DRAG_STRING,DRAG_ID,DRAG_ARTIST,DRAG_ALBUM,DRAG_FILTER,DRAG_MARKUP;
60
61 our @submenuRemove=
62-( { 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'},
63+( { 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', },
64 { label => _"Remove from library", code => sub { SongsRemove($_[0]{IDs}); }, },
65 { label => _"Remove from disk", code => sub { DeleteFiles($_[0]{IDs}); }, test => sub {!$CmdLine{ro}}, stockicon => 'gtk-delete' },
66 );
67@@ -1192,6 +1195,8 @@
68 Rewind => [\&Rewind, _"Rewind",_"Number of seconds",qr/^\d+$/],
69 Seek => [sub {SkipTo($_[1])}, _"Seek",_"Number of seconds",qr/^\d+$/],
70 Stop => [\&Stop, _"Stop"],
71+ Pause => [sub {Pause() if $TogPlay; }, _"Pause"],
72+ Play => [sub {PlayPause() unless $TogPlay; },_"Play"],
73 Browser => [\&OpenBrowser, _"Open Browser"],
74 OpenQueue => [\&EditQueue, _"Open Queue window"],
75 OpenSearch => [sub { Layout::Window->new($Options{LayoutS}, uniqueid=>'Search'); }, _"Open Search window"],
76@@ -1488,6 +1493,11 @@
77 return $utf8name;
78 }
79
80+sub get_event_window
81+{ my $widget=shift;
82+ $widget||= Gtk2->get_event_widget(Gtk2->get_current_event);
83+ return find_ancestor($widget,'Gtk2::Window');
84+}
85 sub get_layout_widget
86 { find_ancestor($_[0],'Layout');
87 }
88@@ -2038,6 +2048,7 @@
89 $oldversion||=delete $Options{version} || VERSION; # for version <=1.1.7
90 if ($oldversion>VERSION) { warn "Loading a gmbrc saved with a more recent version of gmusicbrowser, try upgrading gmusicbrowser if there are problems\n"; }
91 if ($oldversion<1.10091) {delete $Options{$_} for qw/Diacritic_sort gst_volume Simplehttp_CacheSize mplayer_use_replaygain/;} #cleanup old options
92+ if ($oldversion<=1.1011) {delete $Options{$_} for qw/ScanPlayOnly/;} #cleanup old options
93 $Options{AutoRemoveCurrentSong}= delete $Options{TAG_auto_check_current} if $oldversion<1.1005 && exists $Options{TAG_auto_check_current};
94 $Options{PlayedMinPercent}= 100*delete $Options{PlayedPercent} if exists $Options{PlayedPercent};
95 if ($Options{ArtistSplit}) # for versions <= 1.1.5
96@@ -2181,7 +2192,7 @@
97 sub SaveTags #save tags _and_ settings
98 { my $fork=shift; #if true, save in a forked process
99 HasChanged('Save');
100- if ($CmdLine{demo}) { warn "-demo option => not saving tags/settings\n"; return }
101+ if ($CmdLine{demo}) { warn "-demo option => not saving tags/settings\n" if $Verbose || !$fork; return }
102
103 my $ext='';
104 my $SaveFile= $SaveFile; #do a local copy to locally remove .gz extension if present
105@@ -2231,7 +2242,7 @@
106 my $error;
107 (my$fh,my$tempfile,$ext)= Open_gmbrc("$SaveFile.new.$$"."$ext",1);
108 unless ($fh) { warn "Save aborted\n"; POSIX::_exit(0) if $fork; return; }
109- warn "Writing tags in $SaveFile$ext ...\n";
110+ warn "Writing tags in $SaveFile$ext ...\n" if $Verbose || !$fork;
111
112 print $fh "# gmbrc version=".VERSION." time=".time."\n" or $error||=$!;
113
114@@ -2248,7 +2259,7 @@
115 }
116 #save fields properties, like album pictures ...
117 for my $field (sort keys %$extrasub)
118- { print $fh "\n[$field]\n$extra_subfields->{$field}\n" or $error++;
119+ { print $fh "\n[$field]\n$extra_subfields->{$field}\n" or $error||=$!;
120 my $h= $extrasub->{$field}->();
121 for my $key (sort keys %$h)
122 { my $vals= $h->{$key};
123@@ -2297,7 +2308,7 @@
124 unlink $_ for find_gmbrc_file($SaveFile); #make sure there is no other old gmbrc without .bak, as they could cause confusion
125 }
126 rename $tempfile,$SaveFile.$ext or warn $!;
127- warn "Writing tags in $SaveFile$ext ... done\n";
128+ warn "Writing tags in $SaveFile$ext ... done\n" if $Verbose || !$fork;
129 POSIX::_exit(0) if $fork;
130 }
131
132@@ -2508,7 +2519,7 @@
133 warn $error."\n";
134 return if $Options{IgnorePlayError};
135 my $dialog = Gtk2::MessageDialog->new
136- ( undef, [qw/modal destroy-with-parent/],
137+ ( $MainWindow, [qw/modal destroy-with-parent/],
138 'error','close','%s',
139 $error
140 );
141@@ -4075,7 +4086,7 @@
142 sub PopupContextMenu
143 { my $args=$_[1];
144 my $menu=BuildMenu(@_);
145- PopupMenu($menu,nomenupos=>!$args->{usemenupos});
146+ PopupMenu($menu,nomenupos=>!$args->{usemenupos},self=>$args->{self});
147 }
148
149 sub PopupMenu
150@@ -4083,6 +4094,8 @@
151 return unless $menu->get_children;
152 $menu->show_all;
153 my $event= $args{event} || Gtk2->get_current_event;
154+ my $widget= $args{self} || Gtk2->get_event_widget($event);
155+ $menu->attach_to_widget($widget,undef) if $widget;
156 my $posfunction= $args{posfunction}; # usually undef
157 my $button=my $time=0;
158 if ($event)
159@@ -4135,12 +4148,26 @@
160 my @order= 0..$#labels;
161 @order=sort {superlc($labels[$a]) cmp superlc($labels[$b])} @order if ref $choices eq 'HASH' || $tree;
162
163+ my $selection;
164 my $smenu_callback=sub
165 { my $sub=$_[1];
166- $sub->( $args, $_[0]{selected} );
167+ my $selected= $_[0]{selected};
168+ if ($selection && $options{return_list})
169+ { $selection->{$selected} ^=1;
170+ $selected= [sort grep $selection->{$_}, keys %$selection];
171+ }
172+ $sub->($args, $selected);
173 };
174- my $check;
175+ my ($check,$radio);
176 $check= $options{check}($args) if $options{check};
177+ if (defined $check)
178+ { $selection={};
179+ if (ref $check) { $selection->{$_}=1 for @$check; }
180+ else
181+ { $radio=1;
182+ $selection->{$check}=1;
183+ }
184+ }
185 for my $i (@order)
186 { my $label=$labels[$i];
187 my $value=$values[$i];
188@@ -4151,13 +4178,10 @@
189 $item->set_submenu($submenu);
190 }
191 else
192- { if (defined $check)
193+ { if ($selection)
194 { $item=Gtk2::CheckMenuItem->new_with_label($label);
195- if (ref $check) { $item->set_active(1) if grep $_ eq $value, @$check; }
196- else
197- { $item->set_draw_as_radio(1);
198- $item->set_active(1) if $check eq $value;
199- }
200+ $item->set_active(1) if $selection->{$value};
201+ $item->set_draw_as_radio(1) if $radio;
202 }
203 $item->{selected}= $value;
204 $item->signal_connect(activate => $smenu_callback, $options{code} );
205@@ -4323,7 +4347,7 @@
206 { my ($IDs,$copy)=@_;
207 my $msg=$copy ? _"Choose directory to copy files to"
208 : _"Choose directory to move files to";
209- my $newdir=ChooseDir($msg, Songs::Get($IDs->[0],'path').SLASH);
210+ my $newdir=ChooseDir($msg, path=>Songs::Get($IDs->[0],'path').SLASH);
211 CopyMoveFiles($IDs,copy=>$copy,basedir=>$newdir) if defined $newdir;
212 }
213
214@@ -4406,7 +4430,8 @@
215 }
216
217 sub ChooseDir
218-{ my ($msg,$path,$extrawidget,$remember_key,$multiple,$allowfiles) = @_;
219+{ my ($msg,%opt)=@_;
220+ my ($path,$extrawidget,$remember_key,$multiple,$allowfiles) = @opt{qw/path extrawidget remember_key multiple allowfiles/};
221 my $mode= $allowfiles ? 'open' : 'select-folder';
222 # 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)
223 my $dialog=Gtk2::Dialog->new($msg,undef,[], 'gtk-ok' => 'ok', 'gtk-cancel' => 'none');
224@@ -4418,6 +4443,8 @@
225 $dialog->vbox->set_spacing(5); #
226 ::SetWSize($dialog,'ChooseDir','750x580');
227
228+ if (ref $allowfiles) { FileChooser_add_filters($filechooser,@$allowfiles); }
229+
230 if ($remember_key) { $path= $Options{$remember_key}; }
231 elsif ($path) { $path= url_escape($path); }
232 $filechooser->set_current_folder_uri("file://".$path) if $path;
233@@ -4456,6 +4483,17 @@
234 # return $path;
235 #}
236
237+sub FileChooser_add_filters
238+{ my ($filechooser,@patterns)=@_;
239+ for my $aref (@patterns)
240+ { my $filter= Gtk2::FileFilter->new;
241+ if ($aref->[1]) { $filter->add_mime_type($_) for split / /,$aref->[1]; }
242+ if ($aref->[2]) { $filter->add_pattern($_) for split / /,$aref->[2]; }
243+ $filter->set_name($aref->[0]);
244+ $filechooser->add_filter($filter);
245+ }
246+}
247+
248 sub ChooseFiles
249 { my ($text,$remember_key,@patterns)=@_;
250 $text||=_"Choose files";
251@@ -4463,13 +4501,7 @@
252 'gtk-ok' => 'ok',
253 'gtk-cancel' => 'none');
254 $dialog->set_select_multiple(1);
255- for my $aref (@patterns)
256- { my $filter= Gtk2::FileFilter->new;
257- if ($aref->[1]) { $filter->add_mime_type($_) for split / /,$aref->[1]; }
258- if ($aref->[2]) { $filter->add_pattern($_) for split / /,$aref->[2]; }
259- $filter->set_name($aref->[0]);
260- $dialog->add_filter($filter);
261- }
262+ FileChooser_add_filters($dialog,@patterns);
263 if ($remember_key)
264 { my $path= decode_url($Options{$remember_key});
265 $dialog->set_current_folder($path);
266@@ -4495,18 +4527,11 @@
267 'gtk-ok' => 'ok',
268 'gtk-cancel' => 'none');
269
270- for my $aref
271- ( [_"Pictures and music files",'image/*','*.mp3 *.flac *.m4a *.m4b *.ogg *.oga' ],
272+ FileChooser_add_filters($dialog,
273+ [_"Pictures and music files",'image/*','*.mp3 *.flac *.m4a *.m4b *.ogg *.oga' ],
274 [_"Pictures files",'image/*'],
275 [_"All files",undef,'*'],
276- )
277- { my $filter= Gtk2::FileFilter->new;
278- #$filter->add_mime_type('image/'.$_) for qw/jpeg gif png bmp/;
279- if ($aref->[1]) { $filter->add_mime_type($_) for split / /,$aref->[1]; }
280- if ($aref->[2]) { $filter->add_pattern($_) for split / /,$aref->[2]; }
281- $filter->set_name($aref->[0]);
282- $dialog->add_filter($filter);
283- }
284+ );
285
286 my $preview=Gtk2::VBox->new;
287 my $label=Gtk2::Label->new;
288@@ -4760,7 +4785,7 @@
289 return unless @$IDs;
290 my $text=(@$IDs==1)? "'".Songs::Display($IDs->[0],'file')."'" : __("%d file","%d files",scalar @$IDs);
291 my $dialog = Gtk2::MessageDialog->new
292- ( undef,
293+ ( ::get_event_window(),
294 'modal',
295 'warning','cancel','%s',
296 __x(_("About to delete {files}\nAre you sure ?"), files => $text)
297@@ -5454,19 +5479,17 @@
298 return @IDs;
299 }
300
301-sub MakeScanRegex #FIXME
302-{ my $s;
303- if ($Options{ScanPlayOnly})
304- { my %ext; $ext{$_}=1 for ($PlayNext_package||$Play_package)->supported_formats;
305- $ext{$_}=1 for grep $ext{$Alias_ext{$_}}, keys %Alias_ext;
306- $s=join '|',keys %ext;
307- }
308- else { $s='mp3|ogg|oga|flac|mpc|ape|wv|m4a|m4b'; } #FIXME find a better way
309- $ScanRegex=qr/\.(?:$s)$/i;
310+sub MakeScanRegex
311+{ my %ext; $ext{$_}=1 for @ScanExt;
312+ my $ignore= $Options{ScanIgnore} || [];
313+ delete $ext{$_} for @$ignore;
314+ my $re=join '|', sort keys %ext;
315+ warn "Scan regular expression is empty\n" unless $re;
316+ $ScanRegex=qr/\.(?:$re)$/i;
317 }
318
319 sub ScanFolder
320-{ warn "ScanFolder(@_)\n";
321+{ warn "Scanning : @_\n" if $Verbose;
322 my $dir=$_[0];
323 $dir=~s#^file://##;
324 MakeScanRegex() unless $ScanRegex;
325@@ -6165,47 +6188,6 @@
326 }
327 sub Set_replaygain { $Play_package->RG_set_options() if $Play_package->can('RG_set_options'); }
328
329-sub pref_artists_update_desc
330-{ my $button=shift;
331- my $hash= $button->{hash};
332- my $key= $button->{key};
333- my $text= join ' ',map $hash->{$_}||=qq("$_"), @{ $Options{$key} };
334- $text||= $button->{empty};
335- unless ($button->{label})
336- { my $label= $button->{label}= Gtk2::Label->new;
337- #$label->set_ellipsize('end');
338- my $hbox=Gtk2::HBox->new(0,0);
339- $hbox->pack_start($label,1,1,2);
340- $hbox->pack_start($_,0,0,2) for Gtk2::VSeparator->new, Gtk2::Arrow->new('down','none');
341- $button->add($hbox);
342- }
343- $button->{label}->set_text($text);
344-}
345-sub pref_artists_change_cb
346-{ my $button= $_[0]{button};
347- my $key= $button->{key};
348- my $l= $Options{$key};
349- my $before=@$l;
350- @$l= grep $_ ne $_[1], @$l;
351- push @$l,$_[1] if $before==@$l;
352- @$l= sort @$l;
353- pref_artists_update_desc($button);
354- Songs::UpdateArtistsRE();
355-}
356-sub pref_artists_button_cb
357-{ my ($button,$event)=@_;
358- my $menu=BuildChoiceMenu
359- ( $button->{hash},
360- check=> sub { $Options{$_[0]{button}{key}} },
361- code => \&pref_artists_change_cb,
362- 'reverse'=>1,
363- args => {button=>$button},
364- );
365- PopupMenu($menu,event=>$event);
366- 1;
367-}
368-
369-
370 sub PrefMisc
371 { #Default rating
372 my $DefRating=NewPrefSpinButton('DefaultRating',0,100, step=>10, page=>20, text=>_"Default rating : %d %", cb=> sub
373@@ -6231,24 +6213,13 @@
374 my $shutentry=NewPrefEntry(Shutdown_cmd => _"Shutdown command :", tip => _"Command used when\n'turn off computer when queue empty'\nis selected", cb=> \&Update_QueueActionList);
375
376 #artist splitting
377- my $asplit_label= Gtk2::Label->new(_"Split artist names on :");
378- my $asplit=Gtk2::Button->new;
379- $asplit->set_tooltip_text(_"Used for the Artists field");
380- $asplit->{hash}= \%Artists_split;
381- $asplit->{key}= 'Artists_split_re';
382- $asplit->{empty}= _"no splitting";
383- pref_artists_update_desc($asplit);
384- $asplit->signal_connect(button_press_event=> \&pref_artists_button_cb);
385-
386+ my $asplit= NewPrefMultiCombo( Artists_split_re=>\%Artists_split,
387+ text=>_"Split artist names on :", tip=>_"Used for the Artists field", separator=> ' ',
388+ empty=>_"no splitting", cb=>\&Songs::UpdateArtistsRE );
389 #artist in title
390- my $atitle_label= Gtk2::Label->new(_"Extract guest artist from title :");
391- my $atitle=Gtk2::Button->new;
392- $atitle->set_tooltip_text(_"Used for the Artists field");
393- $atitle->{hash}= \%Artists_from_title;
394- $atitle->{key}= 'Artists_title_re';
395- $atitle->{empty}= _"ignore title";
396- pref_artists_update_desc($atitle);
397- $atitle->signal_connect(button_press_event=> \&pref_artists_button_cb);
398+ my $atitle= NewPrefMultiCombo( Artists_title_re=>\%Artists_from_title,
399+ text=>_"Extract guest artist from title :", tip=>_"Used for the Artists field", separator=> ' ',
400+ empty=>_"ignore title", cb=>\&Songs::UpdateArtistsRE );
401
402 #date format
403 my $dateex= mktime(5,4,3,2,0,(localtime)[5]);
404@@ -6278,7 +6249,7 @@
405 my $playedpercent= NewPrefSpinButton('PlayedMinPercent' ,0,100, text=>_"Threshold to count a song as played : %d %");
406 my $playedseconds= NewPrefSpinButton('PlayedMinSeconds' ,0,99999,text=>_"or %d seconds");
407
408- my $vbox= Vpack( $checkR1,$checkR2,$checkR4, $DefRating,$ProxyCheck, [$asplit_label, $asplit],[$atitle_label, $atitle],
409+ my $vbox= Vpack( $checkR1,$checkR2,$checkR4, $DefRating,$ProxyCheck, $asplit, $atitle,
410 [0,$datealign,$preview], $screensaver,$shutentry, $always_in_pl,
411 $recent_include_not_played, $volstep, $pixcache,
412 [ $playedpercent, $playedseconds ],
413@@ -6442,7 +6413,7 @@
414 { my $parent=shift;
415 $parent=~s/([^$QSLASH]+)$//o;
416 my $folder=$1;
417- my $new=ChooseDir(_"Move folder to",$parent);
418+ my $new=ChooseDir(_"Move folder to", path=>$parent);
419 return unless $new;
420 my $old=$parent.$folder.SLASH;
421 $new.=SLASH.$folder.SLASH;
422@@ -6513,7 +6484,10 @@
423 $sw->set_policy ('automatic', 'automatic');
424 $sw->add($treeview);
425
426- my $Cscanall=NewPrefCheckButton(ScanPlayOnly => _"Do not add songs that can't be played", cb=>sub {$ScanRegex=undef});
427+ my $extensions= NewPrefMultiCombo(ScanIgnore => {map {$_=>$_} @ScanExt},
428+ text=>_"Ignored file extensions :", tip=>_"Files with these extensions won't be added", empty=>_"none",
429+ cb=>sub {$ScanRegex=undef}, );
430+
431 my $CScan=NewPrefCheckButton(StartScan => _"Search for new songs on startup");
432 my $CCheck=NewPrefCheckButton(StartCheck => _"Check for updated/deleted songs on startup");
433 my $BScan= NewIconButton('gtk-refresh',_"scan now", sub { IdleScan(); });
434@@ -6557,7 +6531,7 @@
435 [$addbut,$rmdbut,'-',$reorg],
436 [$CCheck,'-',$BCheck],
437 [$CScan,'-',$BScan],
438- $Cscanall,
439+ $extensions,
440 $autoremove,
441 [$lengthcheck,'-',$Blengthcheck],
442 $masterfiltercheck,
443@@ -6567,7 +6541,8 @@
444 }
445 sub ChooseAddPath
446 { my ($addtolibrary,$allowfiles)=@_;
447- my @dirs=ChooseDir(_"Choose folder to add",undef,undef,'LastFolder_Add',1,$allowfiles);
448+ $allowfiles&&= [ [_"Music files", undef, join(' ',map "*.$_", sort @ScanExt) ], [_"All files",undef,'*'] ];
449+ my @dirs=ChooseDir(_"Choose folder to add", remember_key=>'LastFolder_Add', multiple=>1, allowfiles=>$allowfiles);
450 @dirs=map url_escape($_), @dirs;
451 AddPath($addtolibrary,@dirs);
452 }
453@@ -6605,7 +6580,7 @@
454 my $IDlist= Songs::MakeFilterFromGID($field,$gid)->filter;
455 if (my $nb=@$IDlist)
456 { my $dialog = Gtk2::MessageDialog->new
457- ( undef, #FIXME
458+ ( ::get_event_window(),
459 [qw/modal destroy-with-parent/],
460 'warning','ok-cancel',
461 __("This label is set for %d song.","This label is set for %d songs.",$nb)."\n".
462@@ -6679,7 +6654,7 @@
463 my ($label,$nb)=$store->get_value($iter);
464 if ($nb)
465 { my $dialog = Gtk2::MessageDialog->new
466- ( undef, #FIXME
467+ ( $treeview->get_toplevel,
468 [qw/modal destroy-with-parent/],
469 'warning','ok-cancel','%s',
470 __("This label is set for %d song.","This label is set for %d songs.",$nb)."\n".
471@@ -6902,7 +6877,7 @@
472 &$cb if $cb;
473 });
474 $button->signal_connect( clicked => sub
475- { my $file= $folder? ChooseDir($text,$Options{$key}) : undef;
476+ { my $file= $folder? ChooseDir($text, path=>$Options{$key}) : undef;
477 return unless $file;
478 # could simply $entry->set_text(), but wouldn't work with filenames with broken encoding
479 SetOption( $key, url_escape($file) );
480@@ -6973,15 +6948,66 @@
481 my $combo= NewPrefCombo($key => $buildlist, text => $text, sizeg1=>$sg1,sizeg2=>$sg2, tree=>1, cb => $cb, event=>'Layouts');
482 my $set_tooltip= sub #show layout author in tooltip
483 { return if $_[1] && $_[1] ne $key;
484- my $author= $Layout::Layouts{$Options{$key}}{Author};
485- $author&&= _("by").' '.$author;
486- $_[0]->set_tooltip_text($author);
487+ my $layoutdef= $Layout::Layouts{$Options{$key}};
488+ my $tip= $layoutdef->{PATH}.$layoutdef->{FILE}.':'.$layoutdef->{LINE};
489+ if (my $author= $layoutdef->{Author}) { $tip= _("by")." $author\n$tip"; }
490+ $_[0]->set_tooltip_text($tip);
491 };
492 Watch( $combo, Option => $set_tooltip);
493 $set_tooltip->($combo);
494 return $combo;
495 }
496
497+sub NewPrefMultiCombo
498+{ my ($key,$possible_values_hash,%opt)=@_;
499+ my $sep= $opt{separator}|| ', ';
500+ my $display_cb= $opt{display} || sub
501+ { my $values= $Options{$key} || [];
502+ return $opt{empty} unless @$values;
503+ return join $sep,map $possible_values_hash->{$_}||=qq("$_"), @$values;
504+ };
505+ $display_cb= sub {$opt{display}} if !ref $display_cb; # label in the button is a constant
506+ my $button= Gtk2::Button->new;
507+
508+ my $label_value= Gtk2::Label->new;
509+ #$label_value->set_ellipsize('end');
510+ my $hbox=Gtk2::HBox->new(0,0);
511+ $hbox->pack_start($label_value,1,1,2);
512+ $hbox->pack_start($_,0,0,2) for Gtk2::VSeparator->new, Gtk2::Arrow->new('down','none');
513+ $button->add($hbox);
514+ $label_value->set_text( $display_cb->() );
515+
516+ my $change_cb=sub
517+ { my $button= $_[0]{button};
518+ $Options{$key}= $_[1];
519+ $label_value->set_text( $display_cb->() );
520+ $opt{cb}->() if $opt{cb};
521+ };
522+ my $click_cb=sub
523+ { my ($button,$event)=@_;
524+ my $menu=BuildChoiceMenu
525+ ( $possible_values_hash,
526+ check=> sub { $Options{$key}||[] },
527+ code => $change_cb,
528+ 'reverse'=>1, return_list=>1,
529+ args => {button=>$button},
530+ );
531+ PopupMenu($menu,event=>$event);
532+ 1;
533+ };
534+
535+ $button->signal_connect(button_press_event=> \&$click_cb);
536+ my $widget=$button;
537+ if (defined $opt{text})
538+ { my $hbox0= Gtk2::HBox->new;
539+ my $label= Gtk2::Label->new($opt{text});
540+ $hbox0->pack_start($_, FALSE, FALSE, 2) for $label,$button;
541+ $widget=$hbox0;
542+ }
543+ $widget->set_tooltip_text($opt{tip}) if $opt{tip};
544+ return $widget;
545+}
546+
547 sub NewIconButton
548 { my ($icon,$text,$coderef,$style,$tip)=@_;
549 my $but=Gtk2::Button->new;
550@@ -8727,7 +8753,7 @@
551 $entry->signal_connect(activate=> \&GMB::FilterBox::activate);
552 $button->signal_connect( clicked => sub
553 { my $self=$_[0]->parent;
554- my $folder= ::ChooseDir(_"Choose a folder", $self->{value});
555+ my $folder= ::ChooseDir(_"Choose a folder", path=>$self->{value});
556 return unless $folder;
557 $busy=1;
558 $self->Set( ::url_escape($folder) );
559
560=== modified file '.pc/shimmer-layouts/gmusicbrowser_layout.pm'
561--- .pc/shimmer-layouts/gmusicbrowser_layout.pm 2014-01-25 14:17:08 +0000
562+++ .pc/shimmer-layouts/gmusicbrowser_layout.pm 2014-02-15 20:02:02 +0000
563@@ -757,35 +757,36 @@
564
565 sub ReadLayoutFile
566 { my $file=shift;
567- my $path=$file; $path=~s#[^/]+$##;
568 return unless -f $file;
569 open my$fh,"<:utf8",$file or do { warn $!; return };
570 my $first;
571+ my $linecount=0; my ($linefirst,$linenext);
572 while (1)
573 { my ($next,$longline);
574 my @lines=($first);
575 while (local $_=<$fh>)
576- { s#^\s+##;
577+ { $linecount++;
578+ s#^\s+##;
579 next if m/^#/;
580 s#\s*[\n\r]+$##;
581 if (s#\\$##) {$longline.=$_;next}
582 next if $_ eq '';
583 if ($longline) {$_=$longline.$_;undef $longline;}
584- if (m#^[{[]#) {$next=$_;last}
585+ if (m#^[{[]#) { $next=$_; $linenext=$linecount; last}
586 push @lines,$_;
587 }
588 if ($first)
589- { if ($first=~m#^\[#) {ParseLayout(\@lines,$path)}
590+ { if ($first=~m#^\[#) {ParseLayout(\@lines,$file,$linefirst)}
591 else {ParseSongTreeSkin(\@lines)}
592 }
593- $first=$next;
594+ $first=$next; $linefirst=$linenext;
595 last unless $first;
596 }
597 close $fh;
598 }
599
600 sub ParseLayout
601-{ my ($lines,$path)=@_;
602+{ my ($lines,$file,$line)=@_;
603 my $first=shift @$lines;
604 my $name;
605 if ($first=~m/^\[([^]=]+)\](?:\s*based on (.+))?$/)
606@@ -809,7 +810,10 @@
607 for my $key (qw/Name Category Title/)
608 { $Layouts{$name}{$key}=~s/^"(.*)"$/$1/ if $Layouts{$name}{$key}; #remove quotes from layout name and category
609 }
610+ my $path=$file; $path=~s#([^/]+)$##; $file=$1;
611 $Layouts{$name}{PATH}=$path;
612+ $Layouts{$name}{FILE}=$file;
613+ $Layouts{$name}{LINE}=$line;
614 }
615
616 sub ParseSongTreeSkin
617@@ -858,6 +862,8 @@
618 %default= @optlist;
619 }
620 $_=::ParseOptions($_) for values %default;
621+ $default{DEFAULT_OPTIONS}=1;
622+ $default{Window}{DEFAULT_OPTIONS}=1;
623 return \%default;
624 }
625
626@@ -1802,6 +1808,9 @@
627 my (undef,undef,$monitorwidth,$monitorheight)=$screen->get_monitor_geometry($monitor)->values;
628 $w= $1*$monitorwidth/100 if $w=~m/(\d+)%/;
629 $h= $1*$monitorheight/100 if $h=~m/(\d+)%/;
630+ if ($self->{options}{DEFAULT_OPTIONS}) { $monitorwidth-=40; $monitorheight-=80; } # if using default layout size, reserve some space for potential panels and decorations
631+ $w=$monitorwidth if $w>$monitorwidth;
632+ $h=$monitorheight if $h>$monitorheight;
633 if ($self->{fixedsize})
634 { $w=-1 if $w<1; # -1 => do not override default minimum size
635 $h=-1 if $h<1;
636@@ -2581,7 +2590,7 @@
637 }
638
639 sub newbutton_cb
640-{ my $self= ::find_ancestor($_[0],__PACKAGE__);
641+{ my $self= ::find_ancestor($_[0],__PACKAGE__);
642 ::PopupContextMenu(\@contextmenu, { self=>$self, type=>$self->{typesubmenu}, usemenupos=>1 } );
643 1;
644 }
645@@ -4044,7 +4053,7 @@
646 }
647 }
648 sub SaveOptions
649-{ my $self=shift,
650+{ my $self=shift;
651 my %opt;
652 if (my $cats=$self->{cats})
653 { $opt{collapsed}= $self->{collapsed}= join ' ', sort grep !$cats->{$_}->get_expanded, keys %$cats;
654
655=== modified file '.pc/shimmer-layouts/gmusicbrowser_list.pm'
656--- .pc/shimmer-layouts/gmusicbrowser_list.pm 2014-01-25 14:17:08 +0000
657+++ .pc/shimmer-layouts/gmusicbrowser_list.pm 2014-02-15 20:02:02 +0000
658@@ -311,6 +311,8 @@
659 my $watchedarray= $songlist && $songlist->{array};
660 return if !$watchedarray || ($array && $watchedarray!=$array);
661 $self->{bclear}->set_sensitive(scalar @$watchedarray);
662+ $self->set_sensitive( !$songlist->{autoupdate} );
663+ $self->set_visible( !$songlist->{autoupdate} );
664 }
665
666 sub SelectionChanged
667@@ -533,8 +535,6 @@
668 }
669 $self->{filter}=$filter;
670 return if $self->{ignoreSetFilter};
671-
672- #if ($self->{type} eq 'A') { $self->{array}->SetFilter($filter); return } #FIXME needs a PlayFilter with multiple levels to work correctly
673 $self->{array}->SetSortAndFilter($self->{sort},$filter);
674 }
675 sub Empty
676@@ -560,10 +560,20 @@
677 }
678 sub RemoveSelected
679 { my $self=shift;
680+ return if $self->{autoupdate}; #can't remove selection from an always-filtered list
681 my $songarray=$self->{array};
682 $songarray->Remove($self->GetSelectedRows);
683 }
684
685+sub PopupContextMenu
686+{ my $self=shift;
687+ #return unless @{$self->{array}}; #no context menu for empty lists
688+ my @IDs=$self->GetSelectedIDs;
689+ my %args=(self => $self, mode => $self->{type}, IDs => \@IDs, listIDs => $self->{array});
690+ $args{allowremove}=1 unless $self->{autoupdate};
691+ ::PopupContextMenu(\@::SongCMenu,\%args);
692+}
693+
694 sub MoveUpDown
695 { my ($self,$up,$max)=@_;
696 my $songarray=$self->{array};
697@@ -1086,14 +1096,6 @@
698 1;
699 }
700
701-sub PopupContextMenu
702-{ my ($self,$tv,$event)=@_;
703- #return unless @{$self->{array}}; #no context menu for empty lists
704- my @IDs=$self->GetSelectedIDs;
705- my %args=(self => $self, mode => $self->{type}, IDs => \@IDs, listIDs => $self->{array});
706- ::PopupContextMenu(\@::SongCMenu,\%args );
707-}
708-
709 sub GetCurrentRow
710 { my $self=shift;
711 my $tv=$self->child;
712@@ -1556,7 +1558,7 @@
713 #$sel->select_path($path);
714 $tv->set_cursor($path);
715 }
716- $self->PopupContextMenu($tv,$event);
717+ $self->PopupContextMenu;
718 return 1;
719 }
720 return 0; #let the event propagate
721@@ -1739,7 +1741,7 @@
722 },
723 { label=> _"Remove label", stockicon => 'gtk-remove',
724 code => sub { my $gid=$_[0]{gidlist}[0]; ::RemoveLabel($_[0]{field},$gid); },
725- onlyone=> 'gidlist', test => sub { $_[0]{field} eq 'label' }, #FIXME ? label specific
726+ 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
727 },
728 # { separator=>1 },
729 { label => _"Options", submenu => \@MenuPageOptions, stock => 'gtk-preferences', isdefined => 'field' },
730@@ -2095,7 +2097,7 @@
731 }
732
733 sub PopupContextMenu
734-{ my ($page,$event,$hash,$menu)=@_;
735+{ my ($page,$hash,$menu)=@_;
736 my $self=::find_ancestor($page,__PACKAGE__);
737 $hash->{filterpane}=$self;
738 $menu||=\@cMenu;
739@@ -2103,8 +2105,7 @@
740 }
741
742 sub PopupOpt #Only for FilterList #FIXME should be moved in FilterList::, and/or use a common function with FilterList::PopupContextMenu
743-{ my ($but,$event)=@_;
744- my $self=::find_ancestor($but,__PACKAGE__);
745+{ my $self=::find_ancestor($_[0],__PACKAGE__);
746 my $nb=$self->{notebook};
747 my $page=$nb->get_nth_page( $nb->get_current_page );
748 my $field=$page->{field}[0];
749@@ -2548,13 +2549,12 @@
750 }
751
752 sub PopupContextMenu
753-{ my ($self,undef,$event)=@_;
754- $self=::find_ancestor($self,__PACKAGE__);
755+{ my $self=::find_ancestor($_[0],__PACKAGE__);
756 my ($field,$gidlist)=$self->get_selected_list;
757 my $mainfield=Songs::MainField($field);
758 my $aa= ($mainfield eq 'artist' || $mainfield eq 'album') ? $mainfield : undef; #FIXME
759 my $mode= uc(substr $self->{mode},0,1); # C => cloud, M => mosaic, L => list
760- FilterPane::PopupContextMenu($self,$event,{ self=> $self, filter => $self->get_selected_filters, field => $field, aa => $aa, gidlist =>$gidlist, mode => $mode, subfield => $field, depth =>0 });
761+ FilterPane::PopupContextMenu($self,{ self=> $self, filter => $self->get_selected_filters, field => $field, aa => $aa, gidlist =>$gidlist, mode => $mode, subfield => $field, depth =>0 });
762 }
763
764 sub key_press_cb
765@@ -2723,10 +2723,11 @@
766 FilterPane::Activate($self,$button,$filter);
767 }
768 sub PopupContextMenu
769-{ my ($self,$tv,$event)=@_;
770+{ my $self=shift;
771+ my $tv=$self->{treeview};
772 my @paths=_get_path_selection($tv);
773 my @raw= map ::decode_url($_), @paths;
774- FilterPane::PopupContextMenu($self,$event,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });
775+ FilterPane::PopupContextMenu($self,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });
776 }
777
778 sub _get_path_selection
779@@ -2904,10 +2905,11 @@
780 FilterPane::Activate($self,$button,$filter);
781 }
782 sub PopupContextMenu
783-{ my ($self,$tv,$event)=@_;
784+{ my $self=$_[0];
785+ my $tv=$self->{treeview};
786 my @paths=_get_path_selection($tv);
787 my @raw= map ::decode_url($_), @paths;
788- FilterPane::PopupContextMenu($self,$event,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });
789+ FilterPane::PopupContextMenu($self,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });
790 }
791
792 sub _get_path_selection
793@@ -3089,7 +3091,8 @@
794 }
795
796 sub PopupContextMenu
797-{ my ($self,$tv,$event)=@_;
798+{ my $self=shift;
799+ my $tv=$self->{treeview};
800 my @rows=$tv->get_selection->get_selected_rows;
801 my $store=$tv->get_model;
802 my %sel;
803@@ -3109,7 +3112,7 @@
804 else { $args{mode}=''; }
805 my $songlist=::GetSonglist($self);
806 $args{songlist}=$songlist if $songlist;
807- FilterPane::PopupContextMenu($self,$event,\%args, [@cMenu,{ separator=>1 },@FilterPane::cMenu] );
808+ FilterPane::PopupContextMenu($self,\%args, [@cMenu,{ separator=>1 },@FilterPane::cMenu] );
809 }
810
811 sub drag_motion_cb
812@@ -3383,6 +3386,7 @@
813 #return if $self->{Sel} == $key;
814 if (defined $key) { $self->{Sel}=$key; }
815 else { $key=$self->{Sel}; }
816+ return unless defined $key;
817 my $aa=$self->{aa};
818 $self->pic_update;
819 $self->{Ltitle}->set_markup( AA::ReplaceFields($key,"<big><b>%a</b></big>",$aa,1) );
820@@ -3432,6 +3436,7 @@
821 sub setpic
822 { my $img=shift;
823 my $self= ::find_ancestor($img,__PACKAGE__);
824+ return unless defined $self->{SelID};
825 my $file= $img->{filename}= AAPicture::GetPicture($self->{aa},$self->{Sel});
826 my $pixbuf= $file ? GMB::Picture::pixbuf($file,$img->{size}) : undef;
827 $img->set_from_pixbuf($pixbuf);
828@@ -3494,7 +3499,7 @@
829 );
830 our @DefaultOptions=
831 ( nb => 1,
832- fields => $SelectorMenu[0][1],
833+ fields => $SelectorMenu[2][1],
834 autofilter =>1,
835 );
836
837@@ -3566,14 +3571,6 @@
838 $self->{$key}=$value;
839 $self->DoFilter unless $self->get_text eq '';
840 }
841-sub ToggleField
842-{ my ($self,$field)=@_;
843- my @list= split /\|/,$self->{fields};
844- my $nb=@list;
845- @list= grep $_ ne $field, @list; #remove
846- push @list,$field if $nb==@list; #add if not removed
847- $self->ChangeOption(fields=> join '|',@list );
848-}
849
850 sub PopupSelectorMenu
851 { my $self=shift;
852@@ -3590,9 +3587,9 @@
853 my $item1=Gtk2::MenuItem->new(_"Select search fields");
854 $item1->set_submenu( ::BuildChoiceMenu(
855 { map { $_=>Songs::FieldName($_) } Songs::StringFields(),qw/file path year/,},
856- 'reverse' =>1,
857+ 'reverse' =>1, return_list=>1,
858 check=> sub { [split /\|/,$self->{fields}]; },
859- code => sub { $self->ToggleField($_[1]); },
860+ code => sub { $self->ChangeOption(fields=> join '|',@{$_[1]} ); },
861 ) );
862 $menu->append($item1);
863 $menu->append(Gtk2::SeparatorMenuItem->new);
864@@ -5451,8 +5448,7 @@
865 }
866
867 sub PopupOpt
868-{ my ($widget,$event)=@_;
869- my $self=::find_ancestor($widget,__PACKAGE__);
870+{ my $self=::find_ancestor($_[0],__PACKAGE__);
871 ::PopupContextMenu(\@OptionsMenu, { self=>$self, usemenupos => 1,} );
872 return 1;
873 }
874@@ -6587,10 +6583,7 @@
875 { if ($answer && !defined $depth && !vec($self->{selected},$row,1))
876 { $self->song_selected($event,$row);
877 }
878- my @IDs=$self->GetSelectedIDs;
879- my %args=(self => $self, mode => $self->{type}, IDs => \@IDs, listIDs => $self->{array});
880- ::PopupContextMenu(\@::SongCMenu,\%args );
881-
882+ $self->PopupContextMenu;
883 return 1;
884 }
885 else# ($but==1)
886
887=== modified file '.pc/shimmer-layouts/plugins/fetch_cover.pm'
888--- .pc/shimmer-layouts/plugins/fetch_cover.pm 2014-01-25 14:17:08 +0000
889+++ .pc/shimmer-layouts/plugins/fetch_cover.pm 2014-02-15 20:02:02 +0000
890@@ -389,6 +389,7 @@
891 sub searchresults_cb
892 { my ($self,$result)=@_;
893 $self->{waiting}=undef;
894+ warn "Getting results from $self->{url}\n" if $::Verbose;
895 unless (defined $result) { stop($self,_"connection failed."); return; }
896 my $parse= $Sites{$self->{mainfield}}{$self->{site}}[2];
897 my ($list,$nexturl)=$parse->($result,$self->{url},$self->{searchcontext});
898@@ -565,5 +566,3 @@
899
900 1
901
902-__END__
903-xml.amazon.com/onca/xml3?t=webservices-20&dev-t=%l&KeywordSearch=%s&mode=music&type=heavy&locale=us&page=1&f=xml
904
905=== modified file 'NEWS'
906--- NEWS 2014-01-25 14:17:08 +0000
907+++ NEWS 2014-02-15 20:02:02 +0000
908@@ -1,3 +1,14 @@
909+v1.1.12
910+fix not being able to remove filters from lists in playlist mode
911+fix performances problems with autoupdated lists
912+fix some dialogs appearing below other windows
913+fix creating windows bigger than screen
914+replace "Do not add songs that can't be played" option by "Ignored file extensions" option
915+export plugin: fix wrong encoding of certain file names in .m3u
916+export plugin: export more fields in csv files
917+don't print messages in normal operation, add -verbose option
918+translation updates: Chinese(Taiwan), Finnish
919+
920 v1.1.11
921 improve search responsiveness (improve responsiveness of SimpleSearch)
922 add auto-update mode that keeps browser lists sorted and filtered (on by default, can be disabled in the songlist/songtree option menu)
923
924=== modified file 'debian/changelog'
925--- debian/changelog 2014-01-25 14:17:08 +0000
926+++ debian/changelog 2014-02-15 20:02:02 +0000
927@@ -1,3 +1,9 @@
928+gmusicbrowser (1.1.12-0ubuntu1) trusty; urgency=medium
929+
930+ * New upstream release.
931+
932+ -- Jackson Doak <noskcaj@ubuntu.com> Sun, 16 Feb 2014 06:55:42 +1100
933+
934 gmusicbrowser (1.1.11-1) unstable; urgency=medium
935
936 * New upstream release
937
938=== modified file 'debian/control'
939--- debian/control 2014-01-25 14:17:08 +0000
940+++ debian/control 2014-02-15 20:02:02 +0000
941@@ -1,7 +1,8 @@
942 Source: gmusicbrowser
943 Section: sound
944 Priority: extra
945-Maintainer: Debian Multimedia Maintainers <pkg-multimedia-maintainers@lists.alioth.debian.org>
946+Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
947+XSBC-Original-Maintainer: Debian Multimedia Maintainers <pkg-multimedia-maintainers@lists.alioth.debian.org>
948 Uploaders:
949 Antonio Radici <antonio@dyne.org>,
950 Alessio Treglia <alessio@debian.org>,
951
952=== modified file 'debian/patches/shimmer-layouts'
953--- debian/patches/shimmer-layouts 2014-01-25 14:17:08 +0000
954+++ debian/patches/shimmer-layouts 2014-02-15 20:02:02 +0000
955@@ -14,10 +14,10 @@
956
957 --- a/gmbrc.default
958 +++ b/gmbrc.default
959-@@ -9,6 +9,16 @@
960- # of the plugin found at the top of the plugin file :
961+@@ -10,6 +10,16 @@
962 PLUGIN_LYRICS: 1
963 PLUGIN_FETCHCOVER: 1
964+ PLUGIN_AUTOSAVE: 1
965 +PLUGIN_ARTISTINFO: 1
966 +PLUGIN_MPRIS2: 1
967 +
968@@ -33,7 +33,7 @@
969 #Layout: Small player
970 --- a/gmusicbrowser.pl
971 +++ b/gmusicbrowser.pl
972-@@ -497,9 +497,9 @@ our @cMenuAA=
973+@@ -500,9 +500,9 @@ our @cMenuAA=
974 ( { label => _"Lock", code => sub { ToggleLock($_[0]{lockfield}); }, check => sub { $::TogLock && $::TogLock eq $_[0]{lockfield}}, mode => 'P',
975 test => sub { $_[0]{field} eq $_[0]{lockfield} || $_[0]{gid} == Songs::Get_gid($::SongID,$_[0]{lockfield}); },
976 },
977@@ -105,7 +105,7 @@
978 event => 'Picture_artist',
979 update => \&Layout::AAPicture::Changed,
980 noinit => 1,
981-@@ -1588,7 +1601,7 @@ use base 'Gtk2::Window';
982+@@ -1594,7 +1607,7 @@ use base 'Gtk2::Window';
983 sub new
984 { my ($class,$layout,%options)=@_;
985 my @original_args=@_;
986@@ -145,7 +145,7 @@
987 }
988
989 ### selected functions
990-@@ -1591,6 +1591,7 @@ our %Pages=
991+@@ -1593,6 +1593,7 @@ our %Pages=
992 our @MenuMarkupOptions=
993 ( "%a",
994 "<b>%a</b>%Y\n<small>%s <small>%l</small></small>",
995@@ -153,7 +153,7 @@
996 "<b>%a</b>%Y\n<small>%b</small>",
997 "<b>%a</b>%Y\n<small>%b</small>\n<small>%s <small>%l</small></small>",
998 "<b>%y %a</b>",
999-@@ -1607,6 +1608,7 @@ my @mpicsize_menu=
1000+@@ -1609,6 +1610,7 @@ my @mpicsize_menu=
1001 _("medium size") => 64,
1002 _("big size") => 96,
1003 _("huge size") => 128,
1004@@ -161,7 +161,7 @@
1005 );
1006 my @cloudstats_menu=
1007 ( _("number of songs") => 'count',
1008-@@ -3309,7 +3311,7 @@ sub new
1009+@@ -3312,7 +3314,7 @@ sub new
1010 my $BAlblist=::NewIconButton('gmb-playlist',undef,undef,'none');
1011 $BAlblist->signal_connect(button_press_event => \&AlbumListButton_press_cb);
1012 $BAlblist->set_tooltip_text(_"Choose Album From this Artist");
1013@@ -170,7 +170,7 @@
1014 }
1015
1016 my $drgsrc=$aa eq 'album' ? ::DRAG_ALBUM : ::DRAG_ARTIST;
1017-@@ -4601,6 +4603,16 @@ sub button_press_cb
1018+@@ -4598,6 +4600,16 @@ sub button_press_cb
1019 else { $self->{pressed}=1; }
1020 return 0;
1021 }
1022@@ -187,7 +187,7 @@
1023 if ($but==3)
1024 { my ($i,$j,$key)=$self->coord_to_index($event->get_coords);
1025 if (defined $key && !exists $self->{selected}{$key})
1026-@@ -5526,7 +5538,7 @@ sub new
1027+@@ -5522,7 +5534,7 @@ sub new
1028 my $default= $::Options{"DefaultOptions_$name"} || {};
1029
1030 %$opt=( @DefaultOptions, %$default, %$opt );
1031@@ -196,7 +196,7 @@
1032
1033 #create widgets used to draw the songtree as a treeview, would be nice to do without but it's not possible currently
1034 $self->{stylewidget}=Gtk2::TreeView->new;
1035-@@ -5592,6 +5604,16 @@ sub new
1036+@@ -5588,6 +5600,16 @@ sub new
1037 $self->AddColumn($_) for split / +/,$opt->{cols};
1038 unless ($self->{cells}) { $self->AddColumn('title'); } #to ensure there is at least 1 column
1039
1040
1041=== modified file 'gmbrc.default'
1042--- gmbrc.default 2011-03-23 19:23:40 +0000
1043+++ gmbrc.default 2014-02-15 20:02:02 +0000
1044@@ -9,6 +9,7 @@
1045 # of the plugin found at the top of the plugin file :
1046 PLUGIN_LYRICS: 1
1047 PLUGIN_FETCHCOVER: 1
1048+PLUGIN_AUTOSAVE: 1
1049 PLUGIN_ARTISTINFO: 1
1050 PLUGIN_MPRIS2: 1
1051
1052
1053=== modified file 'gmusicbrowser.man'
1054--- gmusicbrowser.man 2012-02-08 00:33:53 +0000
1055+++ gmusicbrowser.man 2014-02-15 20:02:02 +0000
1056@@ -18,6 +18,7 @@
1057 [\-cfg FILE]
1058 [\-fifo FIFO|\-nofifo]
1059 [\-debug]
1060+[\-verbose]
1061 [\-layout NAME]
1062 [\-plugin NAME]
1063 [\-searchpath FOLDER]
1064@@ -93,8 +94,11 @@
1065 \fB\-dbus\-id KEY\fR
1066 append .KEY to the DBus service id used by gmusicbrowser (org.gmusicbrowser)
1067 .TP
1068+\fB\-verbose\fR
1069+print some info, like the file being played
1070+.TP
1071 \fB\-debug\fR
1072-print lots of useless information
1073+print lots of useless information, implies -verbose
1074 .TP
1075 \fB\-backtrace\fR
1076 print a backtrace for every warning
1077
1078=== modified file 'gmusicbrowser.pl'
1079--- gmusicbrowser.pl 2014-01-25 14:17:08 +0000
1080+++ gmusicbrowser.pl 2014-02-15 20:02:02 +0000
1081@@ -79,8 +79,8 @@
1082 {
1083 TRUE => 1,
1084 FALSE => 0,
1085- VERSION => '1.1011',
1086- VERSIONSTRING => '1.1.11',
1087+ VERSION => '1.1012',
1088+ VERSIONSTRING => '1.1.12',
1089 PIXPATH => $DATADIR.SLASH.'pix'.SLASH,
1090 PROGRAM_NAME => 'gmusicbrowser',
1091 # PERL510 => $^V ge 'v5.10',
1092@@ -151,8 +151,9 @@
1093
1094 our %Alias_ext; #define alternate file extensions (ie: .ogg files treated as .oga files)
1095 INIT {%Alias_ext=(ogg=> 'oga', m4b=>'m4a');} #needs to be in a INIT block because used in a INIT block in gmusicbrowser_tags.pm
1096+our @ScanExt= qw/mp3 ogg oga flac mpc ape wv m4a m4b/;
1097
1098-our $debug;
1099+our ($Verbose,$debug);
1100 our %CmdLine;
1101 our ($HomeDir,$SaveFile,$FIFOFile,$ImportFile,$DBus_id);
1102 sub find_gmbrc_file { my @f= map $_[0].$_, '','.gz','.xz'; return wantarray ? (grep { -e $_ } @f) : first { -e $_ } @f }
1103@@ -185,7 +186,8 @@
1104 -nogst : do not use gstreamer
1105 -server : send playing song to connected icecast clent
1106 -port N : listen for connection on port N in icecast server mode
1107--debug : print lots of mostly useless informations
1108+-verbose: print some info, like the file being played
1109+-debug : print lots of mostly useless informations, implies -verbose
1110 -backtrace : print a backtrace for every warning
1111 -nodbus : do not provide DBus services
1112 -dbus-id KEY : append .KEY to the DBus service id used by gmusicbrowser (org.gmusicbrowser)
1113@@ -243,7 +245,8 @@
1114 elsif($arg eq '-ro') {$CmdLine{ro}=$CmdLine{rotags}=1}
1115 elsif($arg eq '-rotags') {$CmdLine{rotags}=1}
1116 elsif($arg eq '-port') {$CmdLine{port}=shift if $ARGV[0]}
1117- elsif($arg eq '-debug') {$debug=1}
1118+ elsif($arg eq '-verbose') {$Verbose=1}
1119+ elsif($arg eq '-debug') {$debug=$Verbose=4}
1120 elsif($arg eq '-backtrace') { $SIG{ __WARN__ } = \&Carp::cluck; $SIG{ __DIE__ } = \&Carp::confess; }
1121 elsif($arg eq '-nofifo') {$FIFOFile=''}
1122 elsif($arg eq '-workspace') {$CmdLine{workspace}=shift if defined $ARGV[0]} #requires Gnome2::Wnck
1123@@ -450,7 +453,7 @@
1124 $DRAGTYPES{$DRAGTYPES[$_][0]}=$_ for DRAG_FILE,DRAG_USTRING,DRAG_STRING,DRAG_ID,DRAG_ARTIST,DRAG_ALBUM,DRAG_FILTER,DRAG_MARKUP;
1125
1126 our @submenuRemove=
1127-( { 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'},
1128+( { 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', },
1129 { label => _"Remove from library", code => sub { SongsRemove($_[0]{IDs}); }, },
1130 { label => _"Remove from disk", code => sub { DeleteFiles($_[0]{IDs}); }, test => sub {!$CmdLine{ro}}, stockicon => 'gtk-delete' },
1131 );
1132@@ -1192,6 +1195,8 @@
1133 Rewind => [\&Rewind, _"Rewind",_"Number of seconds",qr/^\d+$/],
1134 Seek => [sub {SkipTo($_[1])}, _"Seek",_"Number of seconds",qr/^\d+$/],
1135 Stop => [\&Stop, _"Stop"],
1136+ Pause => [sub {Pause() if $TogPlay; }, _"Pause"],
1137+ Play => [sub {PlayPause() unless $TogPlay; },_"Play"],
1138 Browser => [\&OpenBrowser, _"Open Browser"],
1139 OpenQueue => [\&EditQueue, _"Open Queue window"],
1140 OpenSearch => [sub { Layout::Window->new($Options{LayoutS}, uniqueid=>'Search'); }, _"Open Search window"],
1141@@ -1488,6 +1493,11 @@
1142 return $utf8name;
1143 }
1144
1145+sub get_event_window
1146+{ my $widget=shift;
1147+ $widget||= Gtk2->get_event_widget(Gtk2->get_current_event);
1148+ return find_ancestor($widget,'Gtk2::Window');
1149+}
1150 sub get_layout_widget
1151 { find_ancestor($_[0],'Layout');
1152 }
1153@@ -2038,6 +2048,7 @@
1154 $oldversion||=delete $Options{version} || VERSION; # for version <=1.1.7
1155 if ($oldversion>VERSION) { warn "Loading a gmbrc saved with a more recent version of gmusicbrowser, try upgrading gmusicbrowser if there are problems\n"; }
1156 if ($oldversion<1.10091) {delete $Options{$_} for qw/Diacritic_sort gst_volume Simplehttp_CacheSize mplayer_use_replaygain/;} #cleanup old options
1157+ if ($oldversion<=1.1011) {delete $Options{$_} for qw/ScanPlayOnly/;} #cleanup old options
1158 $Options{AutoRemoveCurrentSong}= delete $Options{TAG_auto_check_current} if $oldversion<1.1005 && exists $Options{TAG_auto_check_current};
1159 $Options{PlayedMinPercent}= 100*delete $Options{PlayedPercent} if exists $Options{PlayedPercent};
1160 if ($Options{ArtistSplit}) # for versions <= 1.1.5
1161@@ -2181,7 +2192,7 @@
1162 sub SaveTags #save tags _and_ settings
1163 { my $fork=shift; #if true, save in a forked process
1164 HasChanged('Save');
1165- if ($CmdLine{demo}) { warn "-demo option => not saving tags/settings\n"; return }
1166+ if ($CmdLine{demo}) { warn "-demo option => not saving tags/settings\n" if $Verbose || !$fork; return }
1167
1168 my $ext='';
1169 my $SaveFile= $SaveFile; #do a local copy to locally remove .gz extension if present
1170@@ -2231,7 +2242,7 @@
1171 my $error;
1172 (my$fh,my$tempfile,$ext)= Open_gmbrc("$SaveFile.new.$$"."$ext",1);
1173 unless ($fh) { warn "Save aborted\n"; POSIX::_exit(0) if $fork; return; }
1174- warn "Writing tags in $SaveFile$ext ...\n";
1175+ warn "Writing tags in $SaveFile$ext ...\n" if $Verbose || !$fork;
1176
1177 print $fh "# gmbrc version=".VERSION." time=".time."\n" or $error||=$!;
1178
1179@@ -2248,7 +2259,7 @@
1180 }
1181 #save fields properties, like album pictures ...
1182 for my $field (sort keys %$extrasub)
1183- { print $fh "\n[$field]\n$extra_subfields->{$field}\n" or $error++;
1184+ { print $fh "\n[$field]\n$extra_subfields->{$field}\n" or $error||=$!;
1185 my $h= $extrasub->{$field}->();
1186 for my $key (sort keys %$h)
1187 { my $vals= $h->{$key};
1188@@ -2297,7 +2308,7 @@
1189 unlink $_ for find_gmbrc_file($SaveFile); #make sure there is no other old gmbrc without .bak, as they could cause confusion
1190 }
1191 rename $tempfile,$SaveFile.$ext or warn $!;
1192- warn "Writing tags in $SaveFile$ext ... done\n";
1193+ warn "Writing tags in $SaveFile$ext ... done\n" if $Verbose || !$fork;
1194 POSIX::_exit(0) if $fork;
1195 }
1196
1197@@ -2508,7 +2519,7 @@
1198 warn $error."\n";
1199 return if $Options{IgnorePlayError};
1200 my $dialog = Gtk2::MessageDialog->new
1201- ( undef, [qw/modal destroy-with-parent/],
1202+ ( $MainWindow, [qw/modal destroy-with-parent/],
1203 'error','close','%s',
1204 $error
1205 );
1206@@ -4075,7 +4086,7 @@
1207 sub PopupContextMenu
1208 { my $args=$_[1];
1209 my $menu=BuildMenu(@_);
1210- PopupMenu($menu,nomenupos=>!$args->{usemenupos});
1211+ PopupMenu($menu,nomenupos=>!$args->{usemenupos},self=>$args->{self});
1212 }
1213
1214 sub PopupMenu
1215@@ -4083,6 +4094,8 @@
1216 return unless $menu->get_children;
1217 $menu->show_all;
1218 my $event= $args{event} || Gtk2->get_current_event;
1219+ my $widget= $args{self} || Gtk2->get_event_widget($event);
1220+ $menu->attach_to_widget($widget,undef) if $widget;
1221 my $posfunction= $args{posfunction}; # usually undef
1222 my $button=my $time=0;
1223 if ($event)
1224@@ -4135,12 +4148,26 @@
1225 my @order= 0..$#labels;
1226 @order=sort {superlc($labels[$a]) cmp superlc($labels[$b])} @order if ref $choices eq 'HASH' || $tree;
1227
1228+ my $selection;
1229 my $smenu_callback=sub
1230 { my $sub=$_[1];
1231- $sub->( $args, $_[0]{selected} );
1232+ my $selected= $_[0]{selected};
1233+ if ($selection && $options{return_list})
1234+ { $selection->{$selected} ^=1;
1235+ $selected= [sort grep $selection->{$_}, keys %$selection];
1236+ }
1237+ $sub->($args, $selected);
1238 };
1239- my $check;
1240+ my ($check,$radio);
1241 $check= $options{check}($args) if $options{check};
1242+ if (defined $check)
1243+ { $selection={};
1244+ if (ref $check) { $selection->{$_}=1 for @$check; }
1245+ else
1246+ { $radio=1;
1247+ $selection->{$check}=1;
1248+ }
1249+ }
1250 for my $i (@order)
1251 { my $label=$labels[$i];
1252 my $value=$values[$i];
1253@@ -4151,13 +4178,10 @@
1254 $item->set_submenu($submenu);
1255 }
1256 else
1257- { if (defined $check)
1258+ { if ($selection)
1259 { $item=Gtk2::CheckMenuItem->new_with_label($label);
1260- if (ref $check) { $item->set_active(1) if grep $_ eq $value, @$check; }
1261- else
1262- { $item->set_draw_as_radio(1);
1263- $item->set_active(1) if $check eq $value;
1264- }
1265+ $item->set_active(1) if $selection->{$value};
1266+ $item->set_draw_as_radio(1) if $radio;
1267 }
1268 $item->{selected}= $value;
1269 $item->signal_connect(activate => $smenu_callback, $options{code} );
1270@@ -4323,7 +4347,7 @@
1271 { my ($IDs,$copy)=@_;
1272 my $msg=$copy ? _"Choose directory to copy files to"
1273 : _"Choose directory to move files to";
1274- my $newdir=ChooseDir($msg, Songs::Get($IDs->[0],'path').SLASH);
1275+ my $newdir=ChooseDir($msg, path=>Songs::Get($IDs->[0],'path').SLASH);
1276 CopyMoveFiles($IDs,copy=>$copy,basedir=>$newdir) if defined $newdir;
1277 }
1278
1279@@ -4406,7 +4430,8 @@
1280 }
1281
1282 sub ChooseDir
1283-{ my ($msg,$path,$extrawidget,$remember_key,$multiple,$allowfiles) = @_;
1284+{ my ($msg,%opt)=@_;
1285+ my ($path,$extrawidget,$remember_key,$multiple,$allowfiles) = @opt{qw/path extrawidget remember_key multiple allowfiles/};
1286 my $mode= $allowfiles ? 'open' : 'select-folder';
1287 # 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)
1288 my $dialog=Gtk2::Dialog->new($msg,undef,[], 'gtk-ok' => 'ok', 'gtk-cancel' => 'none');
1289@@ -4418,6 +4443,8 @@
1290 $dialog->vbox->set_spacing(5); #
1291 ::SetWSize($dialog,'ChooseDir','750x580');
1292
1293+ if (ref $allowfiles) { FileChooser_add_filters($filechooser,@$allowfiles); }
1294+
1295 if ($remember_key) { $path= $Options{$remember_key}; }
1296 elsif ($path) { $path= url_escape($path); }
1297 $filechooser->set_current_folder_uri("file://".$path) if $path;
1298@@ -4456,6 +4483,17 @@
1299 # return $path;
1300 #}
1301
1302+sub FileChooser_add_filters
1303+{ my ($filechooser,@patterns)=@_;
1304+ for my $aref (@patterns)
1305+ { my $filter= Gtk2::FileFilter->new;
1306+ if ($aref->[1]) { $filter->add_mime_type($_) for split / /,$aref->[1]; }
1307+ if ($aref->[2]) { $filter->add_pattern($_) for split / /,$aref->[2]; }
1308+ $filter->set_name($aref->[0]);
1309+ $filechooser->add_filter($filter);
1310+ }
1311+}
1312+
1313 sub ChooseFiles
1314 { my ($text,$remember_key,@patterns)=@_;
1315 $text||=_"Choose files";
1316@@ -4463,13 +4501,7 @@
1317 'gtk-ok' => 'ok',
1318 'gtk-cancel' => 'none');
1319 $dialog->set_select_multiple(1);
1320- for my $aref (@patterns)
1321- { my $filter= Gtk2::FileFilter->new;
1322- if ($aref->[1]) { $filter->add_mime_type($_) for split / /,$aref->[1]; }
1323- if ($aref->[2]) { $filter->add_pattern($_) for split / /,$aref->[2]; }
1324- $filter->set_name($aref->[0]);
1325- $dialog->add_filter($filter);
1326- }
1327+ FileChooser_add_filters($dialog,@patterns);
1328 if ($remember_key)
1329 { my $path= decode_url($Options{$remember_key});
1330 $dialog->set_current_folder($path);
1331@@ -4495,18 +4527,11 @@
1332 'gtk-ok' => 'ok',
1333 'gtk-cancel' => 'none');
1334
1335- for my $aref
1336- ( [_"Pictures and music files",'image/*','*.mp3 *.flac *.m4a *.m4b *.ogg *.oga' ],
1337+ FileChooser_add_filters($dialog,
1338+ [_"Pictures and music files",'image/*','*.mp3 *.flac *.m4a *.m4b *.ogg *.oga' ],
1339 [_"Pictures files",'image/*'],
1340 [_"All files",undef,'*'],
1341- )
1342- { my $filter= Gtk2::FileFilter->new;
1343- #$filter->add_mime_type('image/'.$_) for qw/jpeg gif png bmp/;
1344- if ($aref->[1]) { $filter->add_mime_type($_) for split / /,$aref->[1]; }
1345- if ($aref->[2]) { $filter->add_pattern($_) for split / /,$aref->[2]; }
1346- $filter->set_name($aref->[0]);
1347- $dialog->add_filter($filter);
1348- }
1349+ );
1350
1351 my $preview=Gtk2::VBox->new;
1352 my $label=Gtk2::Label->new;
1353@@ -4760,7 +4785,7 @@
1354 return unless @$IDs;
1355 my $text=(@$IDs==1)? "'".Songs::Display($IDs->[0],'file')."'" : __("%d file","%d files",scalar @$IDs);
1356 my $dialog = Gtk2::MessageDialog->new
1357- ( undef,
1358+ ( ::get_event_window(),
1359 'modal',
1360 'warning','cancel','%s',
1361 __x(_("About to delete {files}\nAre you sure ?"), files => $text)
1362@@ -5454,19 +5479,17 @@
1363 return @IDs;
1364 }
1365
1366-sub MakeScanRegex #FIXME
1367-{ my $s;
1368- if ($Options{ScanPlayOnly})
1369- { my %ext; $ext{$_}=1 for ($PlayNext_package||$Play_package)->supported_formats;
1370- $ext{$_}=1 for grep $ext{$Alias_ext{$_}}, keys %Alias_ext;
1371- $s=join '|',keys %ext;
1372- }
1373- else { $s='mp3|ogg|oga|flac|mpc|ape|wv|m4a|m4b'; } #FIXME find a better way
1374- $ScanRegex=qr/\.(?:$s)$/i;
1375+sub MakeScanRegex
1376+{ my %ext; $ext{$_}=1 for @ScanExt;
1377+ my $ignore= $Options{ScanIgnore} || [];
1378+ delete $ext{$_} for @$ignore;
1379+ my $re=join '|', sort keys %ext;
1380+ warn "Scan regular expression is empty\n" unless $re;
1381+ $ScanRegex=qr/\.(?:$re)$/i;
1382 }
1383
1384 sub ScanFolder
1385-{ warn "ScanFolder(@_)\n";
1386+{ warn "Scanning : @_\n" if $Verbose;
1387 my $dir=$_[0];
1388 $dir=~s#^file://##;
1389 MakeScanRegex() unless $ScanRegex;
1390@@ -6165,47 +6188,6 @@
1391 }
1392 sub Set_replaygain { $Play_package->RG_set_options() if $Play_package->can('RG_set_options'); }
1393
1394-sub pref_artists_update_desc
1395-{ my $button=shift;
1396- my $hash= $button->{hash};
1397- my $key= $button->{key};
1398- my $text= join ' ',map $hash->{$_}||=qq("$_"), @{ $Options{$key} };
1399- $text||= $button->{empty};
1400- unless ($button->{label})
1401- { my $label= $button->{label}= Gtk2::Label->new;
1402- #$label->set_ellipsize('end');
1403- my $hbox=Gtk2::HBox->new(0,0);
1404- $hbox->pack_start($label,1,1,2);
1405- $hbox->pack_start($_,0,0,2) for Gtk2::VSeparator->new, Gtk2::Arrow->new('down','none');
1406- $button->add($hbox);
1407- }
1408- $button->{label}->set_text($text);
1409-}
1410-sub pref_artists_change_cb
1411-{ my $button= $_[0]{button};
1412- my $key= $button->{key};
1413- my $l= $Options{$key};
1414- my $before=@$l;
1415- @$l= grep $_ ne $_[1], @$l;
1416- push @$l,$_[1] if $before==@$l;
1417- @$l= sort @$l;
1418- pref_artists_update_desc($button);
1419- Songs::UpdateArtistsRE();
1420-}
1421-sub pref_artists_button_cb
1422-{ my ($button,$event)=@_;
1423- my $menu=BuildChoiceMenu
1424- ( $button->{hash},
1425- check=> sub { $Options{$_[0]{button}{key}} },
1426- code => \&pref_artists_change_cb,
1427- 'reverse'=>1,
1428- args => {button=>$button},
1429- );
1430- PopupMenu($menu,event=>$event);
1431- 1;
1432-}
1433-
1434-
1435 sub PrefMisc
1436 { #Default rating
1437 my $DefRating=NewPrefSpinButton('DefaultRating',0,100, step=>10, page=>20, text=>_"Default rating : %d %", cb=> sub
1438@@ -6231,24 +6213,13 @@
1439 my $shutentry=NewPrefEntry(Shutdown_cmd => _"Shutdown command :", tip => _"Command used when\n'turn off computer when queue empty'\nis selected", cb=> \&Update_QueueActionList);
1440
1441 #artist splitting
1442- my $asplit_label= Gtk2::Label->new(_"Split artist names on :");
1443- my $asplit=Gtk2::Button->new;
1444- $asplit->set_tooltip_text(_"Used for the Artists field");
1445- $asplit->{hash}= \%Artists_split;
1446- $asplit->{key}= 'Artists_split_re';
1447- $asplit->{empty}= _"no splitting";
1448- pref_artists_update_desc($asplit);
1449- $asplit->signal_connect(button_press_event=> \&pref_artists_button_cb);
1450-
1451+ my $asplit= NewPrefMultiCombo( Artists_split_re=>\%Artists_split,
1452+ text=>_"Split artist names on :", tip=>_"Used for the Artists field", separator=> ' ',
1453+ empty=>_"no splitting", cb=>\&Songs::UpdateArtistsRE );
1454 #artist in title
1455- my $atitle_label= Gtk2::Label->new(_"Extract guest artist from title :");
1456- my $atitle=Gtk2::Button->new;
1457- $atitle->set_tooltip_text(_"Used for the Artists field");
1458- $atitle->{hash}= \%Artists_from_title;
1459- $atitle->{key}= 'Artists_title_re';
1460- $atitle->{empty}= _"ignore title";
1461- pref_artists_update_desc($atitle);
1462- $atitle->signal_connect(button_press_event=> \&pref_artists_button_cb);
1463+ my $atitle= NewPrefMultiCombo( Artists_title_re=>\%Artists_from_title,
1464+ text=>_"Extract guest artist from title :", tip=>_"Used for the Artists field", separator=> ' ',
1465+ empty=>_"ignore title", cb=>\&Songs::UpdateArtistsRE );
1466
1467 #date format
1468 my $dateex= mktime(5,4,3,2,0,(localtime)[5]);
1469@@ -6278,7 +6249,7 @@
1470 my $playedpercent= NewPrefSpinButton('PlayedMinPercent' ,0,100, text=>_"Threshold to count a song as played : %d %");
1471 my $playedseconds= NewPrefSpinButton('PlayedMinSeconds' ,0,99999,text=>_"or %d seconds");
1472
1473- my $vbox= Vpack( $checkR1,$checkR2,$checkR4, $DefRating,$ProxyCheck, [$asplit_label, $asplit],[$atitle_label, $atitle],
1474+ my $vbox= Vpack( $checkR1,$checkR2,$checkR4, $DefRating,$ProxyCheck, $asplit, $atitle,
1475 [0,$datealign,$preview], $screensaver,$shutentry, $always_in_pl,
1476 $recent_include_not_played, $volstep, $pixcache,
1477 [ $playedpercent, $playedseconds ],
1478@@ -6442,7 +6413,7 @@
1479 { my $parent=shift;
1480 $parent=~s/([^$QSLASH]+)$//o;
1481 my $folder=$1;
1482- my $new=ChooseDir(_"Move folder to",$parent);
1483+ my $new=ChooseDir(_"Move folder to", path=>$parent);
1484 return unless $new;
1485 my $old=$parent.$folder.SLASH;
1486 $new.=SLASH.$folder.SLASH;
1487@@ -6513,7 +6484,10 @@
1488 $sw->set_policy ('automatic', 'automatic');
1489 $sw->add($treeview);
1490
1491- my $Cscanall=NewPrefCheckButton(ScanPlayOnly => _"Do not add songs that can't be played", cb=>sub {$ScanRegex=undef});
1492+ my $extensions= NewPrefMultiCombo(ScanIgnore => {map {$_=>$_} @ScanExt},
1493+ text=>_"Ignored file extensions :", tip=>_"Files with these extensions won't be added", empty=>_"none",
1494+ cb=>sub {$ScanRegex=undef}, );
1495+
1496 my $CScan=NewPrefCheckButton(StartScan => _"Search for new songs on startup");
1497 my $CCheck=NewPrefCheckButton(StartCheck => _"Check for updated/deleted songs on startup");
1498 my $BScan= NewIconButton('gtk-refresh',_"scan now", sub { IdleScan(); });
1499@@ -6557,7 +6531,7 @@
1500 [$addbut,$rmdbut,'-',$reorg],
1501 [$CCheck,'-',$BCheck],
1502 [$CScan,'-',$BScan],
1503- $Cscanall,
1504+ $extensions,
1505 $autoremove,
1506 [$lengthcheck,'-',$Blengthcheck],
1507 $masterfiltercheck,
1508@@ -6567,7 +6541,8 @@
1509 }
1510 sub ChooseAddPath
1511 { my ($addtolibrary,$allowfiles)=@_;
1512- my @dirs=ChooseDir(_"Choose folder to add",undef,undef,'LastFolder_Add',1,$allowfiles);
1513+ $allowfiles&&= [ [_"Music files", undef, join(' ',map "*.$_", sort @ScanExt) ], [_"All files",undef,'*'] ];
1514+ my @dirs=ChooseDir(_"Choose folder to add", remember_key=>'LastFolder_Add', multiple=>1, allowfiles=>$allowfiles);
1515 @dirs=map url_escape($_), @dirs;
1516 AddPath($addtolibrary,@dirs);
1517 }
1518@@ -6605,7 +6580,7 @@
1519 my $IDlist= Songs::MakeFilterFromGID($field,$gid)->filter;
1520 if (my $nb=@$IDlist)
1521 { my $dialog = Gtk2::MessageDialog->new
1522- ( undef, #FIXME
1523+ ( ::get_event_window(),
1524 [qw/modal destroy-with-parent/],
1525 'warning','ok-cancel',
1526 __("This label is set for %d song.","This label is set for %d songs.",$nb)."\n".
1527@@ -6679,7 +6654,7 @@
1528 my ($label,$nb)=$store->get_value($iter);
1529 if ($nb)
1530 { my $dialog = Gtk2::MessageDialog->new
1531- ( undef, #FIXME
1532+ ( $treeview->get_toplevel,
1533 [qw/modal destroy-with-parent/],
1534 'warning','ok-cancel','%s',
1535 __("This label is set for %d song.","This label is set for %d songs.",$nb)."\n".
1536@@ -6902,7 +6877,7 @@
1537 &$cb if $cb;
1538 });
1539 $button->signal_connect( clicked => sub
1540- { my $file= $folder? ChooseDir($text,$Options{$key}) : undef;
1541+ { my $file= $folder? ChooseDir($text, path=>$Options{$key}) : undef;
1542 return unless $file;
1543 # could simply $entry->set_text(), but wouldn't work with filenames with broken encoding
1544 SetOption( $key, url_escape($file) );
1545@@ -6973,15 +6948,66 @@
1546 my $combo= NewPrefCombo($key => $buildlist, text => $text, sizeg1=>$sg1,sizeg2=>$sg2, tree=>1, cb => $cb, event=>'Layouts');
1547 my $set_tooltip= sub #show layout author in tooltip
1548 { return if $_[1] && $_[1] ne $key;
1549- my $author= $Layout::Layouts{$Options{$key}}{Author};
1550- $author&&= _("by").' '.$author;
1551- $_[0]->set_tooltip_text($author);
1552+ my $layoutdef= $Layout::Layouts{$Options{$key}};
1553+ my $tip= $layoutdef->{PATH}.$layoutdef->{FILE}.':'.$layoutdef->{LINE};
1554+ if (my $author= $layoutdef->{Author}) { $tip= _("by")." $author\n$tip"; }
1555+ $_[0]->set_tooltip_text($tip);
1556 };
1557 Watch( $combo, Option => $set_tooltip);
1558 $set_tooltip->($combo);
1559 return $combo;
1560 }
1561
1562+sub NewPrefMultiCombo
1563+{ my ($key,$possible_values_hash,%opt)=@_;
1564+ my $sep= $opt{separator}|| ', ';
1565+ my $display_cb= $opt{display} || sub
1566+ { my $values= $Options{$key} || [];
1567+ return $opt{empty} unless @$values;
1568+ return join $sep,map $possible_values_hash->{$_}||=qq("$_"), @$values;
1569+ };
1570+ $display_cb= sub {$opt{display}} if !ref $display_cb; # label in the button is a constant
1571+ my $button= Gtk2::Button->new;
1572+
1573+ my $label_value= Gtk2::Label->new;
1574+ #$label_value->set_ellipsize('end');
1575+ my $hbox=Gtk2::HBox->new(0,0);
1576+ $hbox->pack_start($label_value,1,1,2);
1577+ $hbox->pack_start($_,0,0,2) for Gtk2::VSeparator->new, Gtk2::Arrow->new('down','none');
1578+ $button->add($hbox);
1579+ $label_value->set_text( $display_cb->() );
1580+
1581+ my $change_cb=sub
1582+ { my $button= $_[0]{button};
1583+ $Options{$key}= $_[1];
1584+ $label_value->set_text( $display_cb->() );
1585+ $opt{cb}->() if $opt{cb};
1586+ };
1587+ my $click_cb=sub
1588+ { my ($button,$event)=@_;
1589+ my $menu=BuildChoiceMenu
1590+ ( $possible_values_hash,
1591+ check=> sub { $Options{$key}||[] },
1592+ code => $change_cb,
1593+ 'reverse'=>1, return_list=>1,
1594+ args => {button=>$button},
1595+ );
1596+ PopupMenu($menu,event=>$event);
1597+ 1;
1598+ };
1599+
1600+ $button->signal_connect(button_press_event=> \&$click_cb);
1601+ my $widget=$button;
1602+ if (defined $opt{text})
1603+ { my $hbox0= Gtk2::HBox->new;
1604+ my $label= Gtk2::Label->new($opt{text});
1605+ $hbox0->pack_start($_, FALSE, FALSE, 2) for $label,$button;
1606+ $widget=$hbox0;
1607+ }
1608+ $widget->set_tooltip_text($opt{tip}) if $opt{tip};
1609+ return $widget;
1610+}
1611+
1612 sub NewIconButton
1613 { my ($icon,$text,$coderef,$style,$tip)=@_;
1614 my $but=Gtk2::Button->new;
1615@@ -8727,7 +8753,7 @@
1616 $entry->signal_connect(activate=> \&GMB::FilterBox::activate);
1617 $button->signal_connect( clicked => sub
1618 { my $self=$_[0]->parent;
1619- my $folder= ::ChooseDir(_"Choose a folder", $self->{value});
1620+ my $folder= ::ChooseDir(_"Choose a folder", path=>$self->{value});
1621 return unless $folder;
1622 $busy=1;
1623 $self->Set( ::url_escape($folder) );
1624
1625=== modified file 'gmusicbrowser.spec'
1626--- gmusicbrowser.spec 2014-01-25 14:17:08 +0000
1627+++ gmusicbrowser.spec 2014-02-15 20:02:02 +0000
1628@@ -1,6 +1,6 @@
1629 Name: gmusicbrowser
1630 Summary: Jukebox for large collections of music files
1631-Version: 1.1.11
1632+Version: 1.1.12
1633 Release: 1
1634 License: GPL
1635 Group: Sound
1636
1637=== modified file 'gmusicbrowser_123.pm'
1638--- gmusicbrowser_123.pm 2013-10-11 19:12:33 +0000
1639+++ gmusicbrowser_123.pm 2014-02-15 20:02:02 +0000
1640@@ -174,7 +174,7 @@
1641 SkipTo(undef,$sec) if $sec;
1642 }
1643 $OUTPUTfh->blocking(0); #set non-blocking IO
1644- warn "playing $file (pid=$ChildPID)\n";
1645+ warn "playing $file (pid=$ChildPID)\n" if $::Verbose;
1646 $WatchTag= Glib::IO->add_watch(fileno($OUTPUTfh),'hup',\&_eos_cb);
1647 $WatchTag2= $RemoteMode ?
1648 Glib::IO->add_watch(fileno($OUTPUTfh),'in',$RemoteMode->{watcher}) :
1649
1650=== modified file 'gmusicbrowser_gstreamer-0.10.pm'
1651--- gmusicbrowser_gstreamer-0.10.pm 2014-01-25 14:17:08 +0000
1652+++ gmusicbrowser_gstreamer-0.10.pm 2014-02-15 20:02:02 +0000
1653@@ -316,7 +316,7 @@
1654 { $visual_window->realize unless $visual_window->window;
1655 if (my $w=$visual_window->window) { $VSink->set_xwindow_id($w->XID); }
1656 }
1657- warn "playing $file\n";
1658+ warn "playing $file\n" if $::Verbose;
1659 set_file($file);
1660 my $newstate='playing'; $StateAfterSkip=undef;
1661 if ($Skip) { $newstate='paused'; $StateAfterSkip='playing'; }
1662
1663=== modified file 'gmusicbrowser_layout.pm'
1664--- gmusicbrowser_layout.pm 2014-01-25 14:17:08 +0000
1665+++ gmusicbrowser_layout.pm 2014-02-15 20:02:02 +0000
1666@@ -770,35 +770,36 @@
1667
1668 sub ReadLayoutFile
1669 { my $file=shift;
1670- my $path=$file; $path=~s#[^/]+$##;
1671 return unless -f $file;
1672 open my$fh,"<:utf8",$file or do { warn $!; return };
1673 my $first;
1674+ my $linecount=0; my ($linefirst,$linenext);
1675 while (1)
1676 { my ($next,$longline);
1677 my @lines=($first);
1678 while (local $_=<$fh>)
1679- { s#^\s+##;
1680+ { $linecount++;
1681+ s#^\s+##;
1682 next if m/^#/;
1683 s#\s*[\n\r]+$##;
1684 if (s#\\$##) {$longline.=$_;next}
1685 next if $_ eq '';
1686 if ($longline) {$_=$longline.$_;undef $longline;}
1687- if (m#^[{[]#) {$next=$_;last}
1688+ if (m#^[{[]#) { $next=$_; $linenext=$linecount; last}
1689 push @lines,$_;
1690 }
1691 if ($first)
1692- { if ($first=~m#^\[#) {ParseLayout(\@lines,$path)}
1693+ { if ($first=~m#^\[#) {ParseLayout(\@lines,$file,$linefirst)}
1694 else {ParseSongTreeSkin(\@lines)}
1695 }
1696- $first=$next;
1697+ $first=$next; $linefirst=$linenext;
1698 last unless $first;
1699 }
1700 close $fh;
1701 }
1702
1703 sub ParseLayout
1704-{ my ($lines,$path)=@_;
1705+{ my ($lines,$file,$line)=@_;
1706 my $first=shift @$lines;
1707 my $name;
1708 if ($first=~m/^\[([^]=]+)\](?:\s*based on (.+))?$/)
1709@@ -822,7 +823,10 @@
1710 for my $key (qw/Name Category Title/)
1711 { $Layouts{$name}{$key}=~s/^"(.*)"$/$1/ if $Layouts{$name}{$key}; #remove quotes from layout name and category
1712 }
1713+ my $path=$file; $path=~s#([^/]+)$##; $file=$1;
1714 $Layouts{$name}{PATH}=$path;
1715+ $Layouts{$name}{FILE}=$file;
1716+ $Layouts{$name}{LINE}=$line;
1717 }
1718
1719 sub ParseSongTreeSkin
1720@@ -871,6 +875,8 @@
1721 %default= @optlist;
1722 }
1723 $_=::ParseOptions($_) for values %default;
1724+ $default{DEFAULT_OPTIONS}=1;
1725+ $default{Window}{DEFAULT_OPTIONS}=1;
1726 return \%default;
1727 }
1728
1729@@ -1815,6 +1821,9 @@
1730 my (undef,undef,$monitorwidth,$monitorheight)=$screen->get_monitor_geometry($monitor)->values;
1731 $w= $1*$monitorwidth/100 if $w=~m/(\d+)%/;
1732 $h= $1*$monitorheight/100 if $h=~m/(\d+)%/;
1733+ if ($self->{options}{DEFAULT_OPTIONS}) { $monitorwidth-=40; $monitorheight-=80; } # if using default layout size, reserve some space for potential panels and decorations
1734+ $w=$monitorwidth if $w>$monitorwidth;
1735+ $h=$monitorheight if $h>$monitorheight;
1736 if ($self->{fixedsize})
1737 { $w=-1 if $w<1; # -1 => do not override default minimum size
1738 $h=-1 if $h<1;
1739@@ -2594,7 +2603,7 @@
1740 }
1741
1742 sub newbutton_cb
1743-{ my $self= ::find_ancestor($_[0],__PACKAGE__);
1744+{ my $self= ::find_ancestor($_[0],__PACKAGE__);
1745 ::PopupContextMenu(\@contextmenu, { self=>$self, type=>$self->{typesubmenu}, usemenupos=>1 } );
1746 1;
1747 }
1748@@ -4057,7 +4066,7 @@
1749 }
1750 }
1751 sub SaveOptions
1752-{ my $self=shift,
1753+{ my $self=shift;
1754 my %opt;
1755 if (my $cats=$self->{cats})
1756 { $opt{collapsed}= $self->{collapsed}= join ' ', sort grep !$cats->{$_}->get_expanded, keys %$cats;
1757
1758=== modified file 'gmusicbrowser_list.pm'
1759--- gmusicbrowser_list.pm 2014-01-25 14:17:08 +0000
1760+++ gmusicbrowser_list.pm 2014-02-15 20:02:02 +0000
1761@@ -311,6 +311,8 @@
1762 my $watchedarray= $songlist && $songlist->{array};
1763 return if !$watchedarray || ($array && $watchedarray!=$array);
1764 $self->{bclear}->set_sensitive(scalar @$watchedarray);
1765+ $self->set_sensitive( !$songlist->{autoupdate} );
1766+ $self->set_visible( !$songlist->{autoupdate} );
1767 }
1768
1769 sub SelectionChanged
1770@@ -533,8 +535,6 @@
1771 }
1772 $self->{filter}=$filter;
1773 return if $self->{ignoreSetFilter};
1774-
1775- #if ($self->{type} eq 'A') { $self->{array}->SetFilter($filter); return } #FIXME needs a PlayFilter with multiple levels to work correctly
1776 $self->{array}->SetSortAndFilter($self->{sort},$filter);
1777 }
1778 sub Empty
1779@@ -560,10 +560,20 @@
1780 }
1781 sub RemoveSelected
1782 { my $self=shift;
1783+ return if $self->{autoupdate}; #can't remove selection from an always-filtered list
1784 my $songarray=$self->{array};
1785 $songarray->Remove($self->GetSelectedRows);
1786 }
1787
1788+sub PopupContextMenu
1789+{ my $self=shift;
1790+ #return unless @{$self->{array}}; #no context menu for empty lists
1791+ my @IDs=$self->GetSelectedIDs;
1792+ my %args=(self => $self, mode => $self->{type}, IDs => \@IDs, listIDs => $self->{array});
1793+ $args{allowremove}=1 unless $self->{autoupdate};
1794+ ::PopupContextMenu(\@::SongCMenu,\%args);
1795+}
1796+
1797 sub MoveUpDown
1798 { my ($self,$up,$max)=@_;
1799 my $songarray=$self->{array};
1800@@ -1086,14 +1096,6 @@
1801 1;
1802 }
1803
1804-sub PopupContextMenu
1805-{ my ($self,$tv,$event)=@_;
1806- #return unless @{$self->{array}}; #no context menu for empty lists
1807- my @IDs=$self->GetSelectedIDs;
1808- my %args=(self => $self, mode => $self->{type}, IDs => \@IDs, listIDs => $self->{array});
1809- ::PopupContextMenu(\@::SongCMenu,\%args );
1810-}
1811-
1812 sub GetCurrentRow
1813 { my $self=shift;
1814 my $tv=$self->child;
1815@@ -1556,7 +1558,7 @@
1816 #$sel->select_path($path);
1817 $tv->set_cursor($path);
1818 }
1819- $self->PopupContextMenu($tv,$event);
1820+ $self->PopupContextMenu;
1821 return 1;
1822 }
1823 return 0; #let the event propagate
1824@@ -1741,7 +1743,7 @@
1825 },
1826 { label=> _"Remove label", stockicon => 'gtk-remove',
1827 code => sub { my $gid=$_[0]{gidlist}[0]; ::RemoveLabel($_[0]{field},$gid); },
1828- onlyone=> 'gidlist', test => sub { $_[0]{field} eq 'label' }, #FIXME ? label specific
1829+ 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
1830 },
1831 # { separator=>1 },
1832 { label => _"Options", submenu => \@MenuPageOptions, stock => 'gtk-preferences', isdefined => 'field' },
1833@@ -2097,7 +2099,7 @@
1834 }
1835
1836 sub PopupContextMenu
1837-{ my ($page,$event,$hash,$menu)=@_;
1838+{ my ($page,$hash,$menu)=@_;
1839 my $self=::find_ancestor($page,__PACKAGE__);
1840 $hash->{filterpane}=$self;
1841 $menu||=\@cMenu;
1842@@ -2105,8 +2107,7 @@
1843 }
1844
1845 sub PopupOpt #Only for FilterList #FIXME should be moved in FilterList::, and/or use a common function with FilterList::PopupContextMenu
1846-{ my ($but,$event)=@_;
1847- my $self=::find_ancestor($but,__PACKAGE__);
1848+{ my $self=::find_ancestor($_[0],__PACKAGE__);
1849 my $nb=$self->{notebook};
1850 my $page=$nb->get_nth_page( $nb->get_current_page );
1851 my $field=$page->{field}[0];
1852@@ -2550,13 +2551,12 @@
1853 }
1854
1855 sub PopupContextMenu
1856-{ my ($self,undef,$event)=@_;
1857- $self=::find_ancestor($self,__PACKAGE__);
1858+{ my $self=::find_ancestor($_[0],__PACKAGE__);
1859 my ($field,$gidlist)=$self->get_selected_list;
1860 my $mainfield=Songs::MainField($field);
1861 my $aa= ($mainfield eq 'artist' || $mainfield eq 'album') ? $mainfield : undef; #FIXME
1862 my $mode= uc(substr $self->{mode},0,1); # C => cloud, M => mosaic, L => list
1863- FilterPane::PopupContextMenu($self,$event,{ self=> $self, filter => $self->get_selected_filters, field => $field, aa => $aa, gidlist =>$gidlist, mode => $mode, subfield => $field, depth =>0 });
1864+ FilterPane::PopupContextMenu($self,{ self=> $self, filter => $self->get_selected_filters, field => $field, aa => $aa, gidlist =>$gidlist, mode => $mode, subfield => $field, depth =>0 });
1865 }
1866
1867 sub key_press_cb
1868@@ -2725,10 +2725,11 @@
1869 FilterPane::Activate($self,$button,$filter);
1870 }
1871 sub PopupContextMenu
1872-{ my ($self,$tv,$event)=@_;
1873+{ my $self=shift;
1874+ my $tv=$self->{treeview};
1875 my @paths=_get_path_selection($tv);
1876 my @raw= map ::decode_url($_), @paths;
1877- FilterPane::PopupContextMenu($self,$event,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });
1878+ FilterPane::PopupContextMenu($self,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });
1879 }
1880
1881 sub _get_path_selection
1882@@ -2906,10 +2907,11 @@
1883 FilterPane::Activate($self,$button,$filter);
1884 }
1885 sub PopupContextMenu
1886-{ my ($self,$tv,$event)=@_;
1887+{ my $self=$_[0];
1888+ my $tv=$self->{treeview};
1889 my @paths=_get_path_selection($tv);
1890 my @raw= map ::decode_url($_), @paths;
1891- FilterPane::PopupContextMenu($self,$event,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });
1892+ FilterPane::PopupContextMenu($self,{self=>$tv, rawpathlist=> \@raw, pathlist => \@paths, filter => _MakeFolderFilter(@paths) });
1893 }
1894
1895 sub _get_path_selection
1896@@ -3091,7 +3093,8 @@
1897 }
1898
1899 sub PopupContextMenu
1900-{ my ($self,$tv,$event)=@_;
1901+{ my $self=shift;
1902+ my $tv=$self->{treeview};
1903 my @rows=$tv->get_selection->get_selected_rows;
1904 my $store=$tv->get_model;
1905 my %sel;
1906@@ -3111,7 +3114,7 @@
1907 else { $args{mode}=''; }
1908 my $songlist=::GetSonglist($self);
1909 $args{songlist}=$songlist if $songlist;
1910- FilterPane::PopupContextMenu($self,$event,\%args, [@cMenu,{ separator=>1 },@FilterPane::cMenu] );
1911+ FilterPane::PopupContextMenu($self,\%args, [@cMenu,{ separator=>1 },@FilterPane::cMenu] );
1912 }
1913
1914 sub drag_motion_cb
1915@@ -3385,6 +3388,7 @@
1916 #return if $self->{Sel} == $key;
1917 if (defined $key) { $self->{Sel}=$key; }
1918 else { $key=$self->{Sel}; }
1919+ return unless defined $key;
1920 my $aa=$self->{aa};
1921 $self->pic_update;
1922 $self->{Ltitle}->set_markup( AA::ReplaceFields($key,"<big><b>%a</b></big>",$aa,1) );
1923@@ -3434,6 +3438,7 @@
1924 sub setpic
1925 { my $img=shift;
1926 my $self= ::find_ancestor($img,__PACKAGE__);
1927+ return unless defined $self->{SelID};
1928 my $file= $img->{filename}= AAPicture::GetPicture($self->{aa},$self->{Sel});
1929 my $pixbuf= $file ? GMB::Picture::pixbuf($file,$img->{size}) : undef;
1930 $img->set_from_pixbuf($pixbuf);
1931@@ -3496,7 +3501,7 @@
1932 );
1933 our @DefaultOptions=
1934 ( nb => 1,
1935- fields => $SelectorMenu[0][1],
1936+ fields => $SelectorMenu[2][1],
1937 autofilter =>1,
1938 );
1939
1940@@ -3568,14 +3573,6 @@
1941 $self->{$key}=$value;
1942 $self->DoFilter unless $self->get_text eq '';
1943 }
1944-sub ToggleField
1945-{ my ($self,$field)=@_;
1946- my @list= split /\|/,$self->{fields};
1947- my $nb=@list;
1948- @list= grep $_ ne $field, @list; #remove
1949- push @list,$field if $nb==@list; #add if not removed
1950- $self->ChangeOption(fields=> join '|',@list );
1951-}
1952
1953 sub PopupSelectorMenu
1954 { my $self=shift;
1955@@ -3592,9 +3589,9 @@
1956 my $item1=Gtk2::MenuItem->new(_"Select search fields");
1957 $item1->set_submenu( ::BuildChoiceMenu(
1958 { map { $_=>Songs::FieldName($_) } Songs::StringFields(),qw/file path year/,},
1959- 'reverse' =>1,
1960+ 'reverse' =>1, return_list=>1,
1961 check=> sub { [split /\|/,$self->{fields}]; },
1962- code => sub { $self->ToggleField($_[1]); },
1963+ code => sub { $self->ChangeOption(fields=> join '|',@{$_[1]} ); },
1964 ) );
1965 $menu->append($item1);
1966 $menu->append(Gtk2::SeparatorMenuItem->new);
1967@@ -5463,8 +5460,7 @@
1968 }
1969
1970 sub PopupOpt
1971-{ my ($widget,$event)=@_;
1972- my $self=::find_ancestor($widget,__PACKAGE__);
1973+{ my $self=::find_ancestor($_[0],__PACKAGE__);
1974 ::PopupContextMenu(\@OptionsMenu, { self=>$self, usemenupos => 1,} );
1975 return 1;
1976 }
1977@@ -6609,10 +6605,7 @@
1978 { if ($answer && !defined $depth && !vec($self->{selected},$row,1))
1979 { $self->song_selected($event,$row);
1980 }
1981- my @IDs=$self->GetSelectedIDs;
1982- my %args=(self => $self, mode => $self->{type}, IDs => \@IDs, listIDs => $self->{array});
1983- ::PopupContextMenu(\@::SongCMenu,\%args );
1984-
1985+ $self->PopupContextMenu;
1986 return 1;
1987 }
1988 else# ($but==1)
1989
1990=== modified file 'gmusicbrowser_mplayer.pm'
1991--- gmusicbrowser_mplayer.pm 2013-08-27 20:31:56 +0000
1992+++ gmusicbrowser_mplayer.pm 2014-02-15 20:02:02 +0000
1993@@ -95,7 +95,7 @@
1994 #SkipTo(undef,$sec) if $sec;
1995
1996 $OUTPUTfh->blocking(0); #set non-blocking IO
1997- warn "playing $file (pid=$ChildPID)\n";
1998+ warn "playing $file (pid=$ChildPID)\n" if $::Verbose;
1999 $WatchTag= Glib::IO->add_watch(fileno($OUTPUTfh),'hup',\&_eos_cb);
2000 $WatchTag2=Glib::IO->add_watch(fileno($OUTPUTfh),'in',\&_remotemsg);
2001 #Glib::Timeout->add(500,\&_UpdateTime);
2002
2003=== modified file 'gmusicbrowser_songs.pm'
2004--- gmusicbrowser_songs.pm 2014-01-25 14:17:08 +0000
2005+++ gmusicbrowser_songs.pm 2014-02-15 20:02:02 +0000
2006@@ -3364,6 +3364,8 @@
2007 use base 'SongArray';
2008 our %Filter;
2009 our %Sort;
2010+our %needupdate;
2011+
2012 INIT
2013 { ::Watch(undef, SongsChanged => \&SongsChanged_cb);
2014 ::Watch(undef, SongsAdded => \&SongsAdded_cb);
2015@@ -3389,6 +3391,7 @@
2016 { my $self=$_[0];
2017 delete $Filter{$self};
2018 delete $Sort{$self};
2019+ delete $needupdate{$self};
2020 @list_of_AutoUpdate= grep defined, @list_of_AutoUpdate;
2021 ::weaken($_) for @list_of_AutoUpdate;
2022 $self->SUPER::DESTROY;
2023@@ -3405,6 +3408,7 @@
2024 @$self=@$list;
2025 ::HasChanged('SongArray',$self,'update',\@old);
2026 }
2027+ else { ::HasChanged('SongArray',$self,'mode'); }
2028 }
2029 sub Sort
2030 { my ($self,$sort)=@_;
2031@@ -3423,7 +3427,8 @@
2032 sub SongsAdded_cb
2033 { my (undef,$IDs)=@_;
2034 for my $self (grep defined, @list_of_AutoUpdate)
2035- { my $filter=$Filter{$self};
2036+ { next if ($needupdate{$self}||0)>1;
2037+ my $filter=$Filter{$self};
2038 my ($greponly)=$filter->info;
2039 if ($greponly)
2040 { my $toadd=$filter->filter($IDs);
2041@@ -3436,12 +3441,27 @@
2042 }
2043 }
2044 else
2045- { $self->_update_full;
2046+ { $needupdate{$self}=2;
2047+ ::IdleDo('7_autoupdate_update'.$self,6000, \&delayed_update_cb,$self);
2048+ }
2049+ }
2050+}
2051+sub delayed_update_cb
2052+{ my $self=shift;
2053+ my $need= delete $needupdate{$self};
2054+ return unless $need;
2055+ if ($need>1) { $self->_update_full }
2056+ else
2057+ { my @old=@$self;
2058+ Songs::SortList($self,$Sort{$self});
2059+ if ("@old" ne "@$self") #only update if there was a change
2060+ { ::HasChanged('SongArray',$self,'update',\@old);
2061 }
2062 }
2063 }
2064 sub _update_full
2065 { my $self=shift;
2066+ delete $needupdate{$self};
2067 my @old=@$self;
2068 my $list=$Filter{$self}->filter;
2069 Songs::SortList($list,$Sort{$self});
2070@@ -3452,12 +3472,19 @@
2071 sub SongsChanged_cb
2072 { my (undef,$IDs,$fields)=@_;
2073 for my $self (grep defined, @list_of_AutoUpdate)
2074- { if ($Filter{$self}->changes_may_affect($IDs,$fields,$self)) #re-filter and re-sort
2075- { $self->_update_full;
2076- }
2077- elsif (::OneInCommon($fields,Songs::SortDepends($Sort{$self}))) #re-sort
2078- { $self->Sort($Sort{$self});
2079- }
2080+ { next if ($needupdate{$self}||0)>1;
2081+ my $delayed;
2082+ if ($Filter{$self}->changes_may_affect($IDs,$fields,$self))
2083+ { #re-filter and re-sort
2084+ $needupdate{$self}=2;
2085+ $delayed=1;
2086+ }
2087+ elsif ($self->AreIn($IDs) && ::OneInCommon($fields,Songs::SortDepends($Sort{$self})))
2088+ { #re-sort
2089+ $needupdate{$self}=1;
2090+ $delayed=1;
2091+ }
2092+ ::IdleDo('7_autoupdate_update'.$self,6000, \&delayed_update_cb,$self) if $delayed;
2093 }
2094 }
2095
2096@@ -3498,9 +3525,9 @@
2097 ::QHasChanged('Sort');
2098 ::QHasChanged('Pos');
2099 }
2100-sub SetSortAndFilter #FIXME could be optimized
2101+sub 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
2102 { my ($self,$sort,$filter)=@_;
2103- $self->SetFilter($filter);
2104+ $self->Replace($filter->filter,filter=>$filter); #$self->SetFilter($filter); #FIXME use SetFilter once multi-level filters are implemented
2105 $self->Sort($sort);
2106 }
2107 sub Replace
2108
2109=== modified file 'layout_doc.html'
2110--- layout_doc.html 2014-01-25 14:17:08 +0000
2111+++ layout_doc.html 2014-02-15 20:02:02 +0000
2112@@ -1,813 +0,0 @@
2113-<h1>Layout documentation</h1>
2114-
2115-<h2>Introduction</h2>
2116-
2117-<p>Gmusicbrowser's interface is defined by layouts. Each layout define a window that contain several containers, each containing widgets. <br />
2118-Layouts 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>
2119-
2120-<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>
2121-
2122-<h2>Advice for testing layouts</h2>
2123-
2124-<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.
2125- 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>
2126-
2127-<h2>Layout files</h2>
2128-
2129-<p>Layouts are defined using text files, each file can contain one or more layout. <br />
2130-Layout files use the <code>.layout</code> extension, they are found in 2 places:</p>
2131-
2132-<ul>
2133-<li>the default layouts included with gmusicbrowser are in installed <code>/usr/share/gmusicbrowser/layouts/</code></li>
2134-<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>
2135-</ul>
2136-
2137-<h2>Layout syntax</h2>
2138-
2139-<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>
2140-
2141-<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>
2142-
2143-<p>layout definition syntax :</p>
2144-
2145-<pre><code>[layout_id]
2146-key1 = value
2147-key2 = value
2148-...
2149-</code></pre>
2150-
2151-<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>
2152-
2153-<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 />
2154-Keys define either containers or properties, they only use simple alphanumeric characters : <code>A-Z a-z _ 0-9</code> . <br />
2155-Keys are unique for a layout, duplicate key definitions replace the previous one.</p>
2156-
2157-<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 />
2158-For 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>
2159-
2160-<p>There must be one, and only one, container which has no parent, this container will be put in the layout window.</p>
2161-
2162-<h3>Simple examples</h3>
2163-
2164-<p>Very simple example, with 3 buttons (settings, play/pause, and open browser window) and the current song title :</p>
2165-
2166-<pre><code>[very_simple]
2167-Type = G
2168-HBox = Pref Play OpenBrowser _Title
2169-</code></pre>
2170-
2171-<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>
2172-
2173-<pre><code>[simple]
2174-Type=G
2175-VBmain = MBmenu HBbuttons Title Text(markup="&lt;i&gt;by&lt;/i&gt; $artist &lt;i&gt;in&lt;/i&gt; $album")
2176-MBmenu = MainMenuItem
2177-HBbuttons= Prev Play Next
2178-</code></pre>
2179-
2180-<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>
2181-
2182-<p>Look in the layouts files (installed in <code>/usr/share/gmusicbrowser/layouts/</code>) for more examples.</p>
2183-
2184-<h2>Normal containers</h2>
2185-
2186-<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>
2187-
2188-<pre><code>HBname = (option1=value1,option2=value2) widget1 widget2
2189-</code></pre>
2190-
2191-<p>All containers accept the option <code>border</code> to specify the amount of padding around the container.</p>
2192-
2193-<h4>HB/VB : Horizontal/Vertical Boxes (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkBox.html">GtkBox</a>)</h4>
2194-
2195-<p>These containers group widgets horizontally or vertically. Optional packing options are :</p>
2196-
2197-<ul>
2198-<li>a number : padding (in pixels)</li>
2199-<li>an underscore <code>_</code> : expand (the widget will use all remaining space in the container)</li>
2200-<li>a dash <code>-</code> : right aligned</li>
2201-<li><p>a dot <code>.</code> : fill (rarely needed)</p>
2202-
2203-<p>Example : <br />
2204-<code>HBname = 2_-widget1(opt1=val,opt2=val) -widget2 2container3</code></p>
2205-
2206-<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 />
2207-Note that the maxwidth and maxheight widgets options only work inside a HB and a VB respectively.</p></li>
2208-</ul>
2209-
2210-<h4>HP/VP : Horizontal/Vertical Panes (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkPaned.html">GtkPaned</a>)</h4>
2211-
2212-<p>Same as HB/VB but they contain only 2 widgets <br />
2213- 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 />
2214- If both children have the expand propriety, they will both give or receive space when the container is resized. </p>
2215-
2216-<h4>TB : Notebook (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkNotebook.html">GtkNotebook</a>) <em>(deprecated)</em></h4>
2217-
2218-<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 />
2219- The title can have spaces by using quotes, for example :</p>
2220-
2221-<pre><code>TBname = title1 widget1(options) "title with spaces" widget2(options) title3 container3
2222-</code></pre>
2223-
2224-<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>
2225-
2226-<p>No packing options, syntax is simply the list of children.</p>
2227-
2228-<p>A title and an optional icon is given by children options <code>tabtitle</code> and <code>tabicon</code>. For example :</p>
2229-
2230-<pre><code>NBname = widget1(tabtitle="a title",other_option=value) widget2(tabtitle="other tab",tabicon=gmb-list) widget3(tabtitle=third)
2231-</code></pre>
2232-
2233-<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 />
2234- Example : <br />
2235- <code>NBname = (tabpos=left90) children1 children2</code></p>
2236-
2237-<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>
2238-
2239-<p>As this container is in fact a TabbedLists/Context with different default options, it also accept the TabbedLists/Context widget options.</p>
2240-
2241-<h4>EB : Expander (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkExpander.html">GtkExpander</a>)</h4>
2242-
2243-<p>Contains only one child, that child can be shown/hidden by clicking on the expander
2244- Option : <code>label</code> sets the text that will be displayed next to the expander. <br />
2245- Examples :</p>
2246-
2247-<pre><code>EBname = (label="optional label") widget1`
2248-EBsimple = widget2`
2249-</code></pre>
2250-
2251-<h4>FB : Fixed (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkFixed.html">GtkFixed</a>)</h4>
2252-
2253-<p>Each widget is positioned at precise coordinates <br />
2254- Syntax : <code>FBname = x1,y1 widget1 x2,y2,w2,h2 widget2 ...</code> <br />
2255- The widget is positioned at the x,y coordinate. <br />
2256- 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 />
2257- x,y,w,h can be relative to the width/height of the container by preceding the number with a dot (<code>.</code>) <br />
2258- x,y can be relative to the right/bottom border by prefixing it with minus (<code>-</code>).</p>
2259-
2260-<h4>MB : Menu Bar</h4>
2261-
2262-<p>They can only contain MenuItem widgets or SM containers, no packing options</p>
2263-
2264-<h4>SM : Submenu</h4>
2265-
2266-<p>They can only contain MenuItem widgets or SM containers, no packing options, label is set with the <code>label</code> container option</p>
2267-
2268-<h4>BM : Button menu</h4>
2269-
2270-<p>They can only contain MenuItem widgets or SM containers, no packing options. <br />
2271- Container options :</p>
2272-
2273-<ul>
2274-<li>label : set the button label</li>
2275-<li>icon : set an icon</li>
2276-<li>relief : (default to none) button relief</li>
2277-<li>size : (default to menu) size of the icon</li>
2278-</ul>
2279-
2280-<h4>FR : Frame (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkFrame.html">GtkFrame</a>)</h4>
2281-
2282-<p>Draw a border around its child, with an optional label. (Can only contain one child) <br />
2283- Container options :</p>
2284-
2285-<ul>
2286-<li>shadow : one of <code>none</code>, <code>in</code>, <code>out</code>, <code>etched-in</code> (default), <code>etched-out</code></li>
2287-<li>label : optional text of the frame label</li>
2288-</ul>
2289-
2290-<h4>SB : Scrolled window (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkScrolledWindow.html">GtkScrolledWindow</a>)</h4>
2291-
2292-<p>Adds scrollbars to its child. (Can only contain one child)</p>
2293-
2294-<h4>AB : Alignment (based on <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkAlignment.html">GtkAlignment</a>)</h4>
2295-
2296-<p>Controls the alignment and size of its child. (Can only contain one child) <br />
2297- Container options :</p>
2298-
2299-<ul>
2300-<li>xalign : Horizontal position of child in available space, value between 0(left) and 1(right), default to .5 (center)</li>
2301-<li>yalign : Vertical position of child in available space, value between 0(top) and 1(bottom), default to .5 (center)</li>
2302-<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>
2303-<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>
2304-</ul>
2305-
2306-<h4>WB : Event window</h4>
2307-
2308-<p>This container is used to have control over the background or mouse events on its child. (Can only contain one child)
2309- 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.
2310- 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>
2311-
2312-<h2>Special containers</h2>
2313-
2314-<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>
2315-
2316-<h4>HSize/VSize : Size groups (see <a href="http://developer.gnome.org/doc/API/2.0/gtk/GtkSizeGroup.html">GtkSizeGroup</a>)</h4>
2317-
2318-<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 />
2319- Example :</p>
2320-
2321-<pre><code>HSize0 = 20 widget1 widget2
2322-HSize1 = widget3 widget4
2323-</code></pre>
2324-
2325-<h4>VolumeScroll :</h4>
2326-
2327-<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 />
2328- Example :</p>
2329-
2330-<pre><code>VBmain= Title HBbuttons TimeBar
2331-HBbuttons= Pref Play
2332-VolumeScroll= Title HBbuttons
2333-</code></pre>
2334-
2335-<h2>Layout properties</h2>
2336-
2337-<h4>Title</h4>
2338-
2339-<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>
2340-
2341-<pre><code>Title = gmusicbrowser playing %S by %a from %l
2342-</code></pre>
2343-
2344-<h4>Type</h4>
2345-
2346-<p>A String of letters (most of the time only one letter) defining the type(s) of a layout, possible types :</p>
2347-
2348-<ul>
2349-<li>G Generic or player window</li>
2350-<li>B Browser window</li>
2351-<li>T Tray window</li>
2352-<li>F Fullscreen</li>
2353-<li>S Search</li>
2354-<li>P Page for use in TabbedLists/NB/Context</li>
2355-<li>O titlebar Overlay used by the titlebar plugin</li>
2356-<li>D Desktop widget used by the "Desktop widgets" plugin</li>
2357-<li><p>K for Karaoke plugin <em>(there is not yet an option to change the layout in the plugin)</em></p>
2358-
2359-<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>
2360-
2361-<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>
2362-</ul>
2363-
2364-<h4><a id=layoutname> Name </a></h4>
2365-
2366-<p>Set the name of the layout displayed in the settings dialog. The default Name is the layout id. <br />
2367- Contrary to the layout id, the Name can be changed without losing the layout's saved settings (window size, ...). <br />
2368- The name can be marked as translatable by using the syntax <code>Name= _"name of the layout"</code></p>
2369-
2370-<h4>Title and Icon</h4>
2371-
2372-<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>
2373-
2374-<h4>Default <em>(mostly deprecated)</em></h4>
2375-
2376-<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>
2377-
2378-<p>There is a special key : Window, for the window properties, see the Window layout property below.</p>
2379-
2380-<p>Example :</p>
2381-
2382-<pre><code>Default = Window size=1120x820,sticky=0 HPbig 780 FPane0 page=artist
2383-</code></pre>
2384-
2385-<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>
2386-
2387-<h4>KeyBindings</h4>
2388-
2389-<p>Pairs of keys and action, example :</p>
2390-
2391-<pre><code>KeyBindings = Insert OpenSearch c-q EnqueueSelected c-Insert OpenCustom(a_layout_id)
2392-</code></pre>
2393-
2394-<p>Key names are as shown in the key binding tab in the settings dialog. <br />
2395- Commands can be found by running gmusicbrowser with command-line option <code>-listcmd</code>.</p>
2396-
2397-<h4>DefaultFocus</h4>
2398-
2399-<p>Set which widget gets the initial focus in the window.
2400- 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 />
2401-Example :</p>
2402-
2403-<pre><code>HBmain= Pref Play _Title
2404-DefaultFocus= Play
2405-</code></pre>
2406-
2407-<h4>DefaultFont and DefaultFontColor</h4>
2408-
2409-<p>Set a default font and font color for widgets that use a font or a color option.</p>
2410-
2411-<h4>SkinPath and SkinFile</h4>
2412-
2413-<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>
2414-
2415-<h4>Window</h4>
2416-
2417-<p>Set some window options :</p>
2418-
2419-<ul>
2420-<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 />
2421-If 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 />
2422-For 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>
2423-<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>
2424-<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>
2425-<li><p><code>insensitive</code>: if set to 1, makes the window completely insensitive to mouse or keyboard.</p></li>
2426-<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>
2427-<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>
2428-<li><p><code>opacity</code>: value is a number between 0 and 1, requires a compositing window manager</p></li>
2429-<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>
2430-<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>
2431-<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>
2432-</ul>
2433-
2434-<h2>Derived layouts</h2>
2435-
2436-<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>
2437-
2438-<pre><code>[layout_id] based on this_other_layout_id
2439-</code></pre>
2440-
2441-<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 />
2442-This 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>
2443-
2444-<h2>Widgets</h2>
2445-
2446-<h3>Widgets options</h3>
2447-
2448-<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>
2449-
2450-<pre><code>VBmain= widget1(key1=value1,key2=value2, key3=value3) widget2(anotherkey=somevalue)
2451-</code></pre>
2452-
2453-<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>
2454-
2455-<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>
2456-
2457-<p>In the future, some of the layout-set options may become user-set options, as more options are exposed to the GUI.</p>
2458-
2459-<h3>Generic widget options</h3>
2460-
2461-<p>A number of options work on a lot of widgets and containers</p>
2462-
2463-<h4>size options</h4>
2464-
2465-<ul>
2466-<li><code>minwidth</code> and <code>minheight</code> : specify a minimum width or height, will not work on some widget</li>
2467-<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>
2468-<li><code>expand_weight</code>: default to 1, used to specify a higher priority to get extra space from a HB/VB</li>
2469-</ul>
2470-
2471-<h4>click options</h4>
2472-
2473-<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 />
2474-Example : <code>Play(click2=OpenSongProp)</code> <br />
2475-Button 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>
2476-
2477-<h4><code>tip</code> option</h4>
2478-
2479-<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 />
2480-Example : <code>Title(tip="last played : $lastplay")</code></p>
2481-
2482-<h4><code>cursor</code> option</h4>
2483-
2484-<p>Another common option, it is used to change the mouse cursor when it hovers over the widget. <br />
2485-Example : <code>Play(cursor=hand2)</code> <br />
2486-See <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>
2487-
2488-<h4><code>hover_layout</code> option</h4>
2489-
2490-<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 />
2491-Only 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 />
2492-The <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 />
2493-Simple 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>
2494-
2495-<pre><code>[CoverPopup]
2496-VBmain= Cover(minsize=800,maxsize=800,click1=CloseWindow)
2497-</code></pre>
2498-
2499-<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>
2500-
2501-<h4><code>group</code> option</h4>
2502-
2503-<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>
2504-
2505-<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 />
2506-Group names that begin with an upper-case letter are global, the others are local to the window. <br />
2507-There are a few special predefined groups : </p>
2508-
2509-<ul>
2510-<li>Play : links to the current song or the playlist </li>
2511-<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>
2512-<li>Recent or RecentN : link to the previously played song or the (N+1)th previously played song </li>
2513-</ul>
2514-
2515-<p>Examples : </p>
2516-
2517-<ul>
2518-<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>
2519-
2520-<pre><code>VBmain= HPfilterpanes SimpleSearch(group=1) _SongList(group=1) Total(group=1)
2521-HPfilterpanes= FilterPane1(group=1,nb=1) FilterPane2(group=1,nb=2)
2522-</code></pre></li>
2523-<li><p>Title widget that display the next song's title :</p>
2524-
2525-<pre><code>Title2(group=Next, markup_empty="&lt;i&gt;no next song&lt;/i&gt;")
2526-</code></pre></li>
2527-<li><p>making a Text widget display the title and artist of the song selected in a SongList :</p>
2528-
2529-<pre><code>VBox= Text0(group=mygroup, markup="$title by $artist", markup_empty="&lt;i&gt;no selected song&lt;/i&gt;") _SongList(group=mygroup)
2530-</code></pre></li>
2531-</ul>
2532-
2533-<h4>Options common to the text widgets</h4>
2534-
2535-<p>The text widgets (sometimes called label widgets) include : Title, Title_by, Album, Artist, Comment, Year, Length, PlayingTime, Pos, and Text</p>
2536-
2537-<ul>
2538-<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>
2539-<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>
2540-<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
2541-markup : 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>
2542-<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>
2543-<li>xalign : horizontal alignement as a value between 0 (left) and 1 (right), .5 being center</li>
2544-<li>yalign : vertical alignement as a value between 0 (up) and 1 (bottom), .5 being center</li>
2545-<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>
2546-</ul>
2547-
2548-<h3>Text widgets</h3>
2549-
2550-<ul>
2551-<li>Title : Display currently playing Title</li>
2552-<li>Title_by : Display currently playing Title and Artist</li>
2553-<li>Album : Display currently playing Album</li>
2554-<li>Artist : Display currently playing Artist</li>
2555-<li>Comment : Display comment of currently playing song</li>
2556-<li>Year : Display year of currently playing song</li>
2557-<li>Length : Display length of currently playing song</li>
2558-<li>Pos : Display position of currently playing song in the playlist</li>
2559-<li><p>Text : Display custom text (other text widgets can use these options too to change their defaults)</p>
2560-
2561-<ul>
2562-<li>text : label text</li>
2563-<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>
2564-<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>
2565-</ul>
2566-
2567-<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>
2568-</ul></p>
2569-
2570-<h3>Buttons widgets</h3>
2571-
2572-<ul>
2573-<li>Next : Next button</li>
2574-<li>Play : Play/Pause button</li>
2575-<li>Prev : Previous button</li>
2576-<li>Stop : Stop button</li>
2577-<li>Quit : Quit button</li>
2578-<li>Repeat : Button to change repeat mode</li>
2579-<li>OpenContext : Button to open context window</li>
2580-<li>OpenBrowser : Button to open Browser window</li>
2581-<li>Pref : Button to open Settings window</li>
2582-<li>ChooseAlbum : Open a window to select an album</li>
2583-<li>OpenQueue : Open a queue window</li>
2584-<li>Fullscreen : Button to switch to/from fullscreen mode</li>
2585-<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>
2586-<li>Choose : Button to open a search window</li>
2587-<li>Button : custom button (other buttons can use these options too)
2588-<ul>
2589-<li>text or label : text in the button</li>
2590-<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>
2591-</ul></li>
2592-<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>
2593-</ul>
2594-
2595-<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>
2596-
2597-<p>All buttons can be changed to an indicator(no button border, smaller) with the option <code>button=0</code></p>
2598-
2599-<p>Relief can be changed for buttons by using the option <code>relief=none</code> (default), <code>half</code> or <code>normal</code>.</p>
2600-
2601-<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>
2602-
2603-<h3>Indicators widgets</h3>
2604-
2605-<ul>
2606-<li>Filter : Playing filter indicator</li>
2607-<li>Queue : Queue indicator</li>
2608-<li>Sort : Sort mode indicator</li>
2609-<li>LockAlbum : Album lock</li>
2610-<li>LockArtist : Artist lock</li>
2611-<li>LockSong : Song lock</li>
2612-<li>EventBox : same as Button with default option <code>button=0</code></li>
2613-</ul>
2614-
2615-<p>All indicators can be changed to buttons with the option <code>button=1</code>.
2616-Size can be changed same as buttons, see above.</p>
2617-
2618-<p>indicators (Filter Queue Sort ...) and some buttons (Play Next Prev Stop Quit ...) have a few common options:</p>
2619-
2620-<ul>
2621-<li><code>with_text</code>: set to 1 to activate icon-with-text mode</li>
2622-<li><code>text</code> : to change the default text</li>
2623-<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>
2624-<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>
2625-<li><code>stock</code>: option to change the default icons, see <a href="http://git.gmusicbrowser.org/commit/9287bb273a">this commit</a></li>
2626-</ul>
2627-
2628-<h3>Time widgets</h3>
2629-
2630-<ul>
2631-<li>PlayingTime : Display position of currently playing song
2632-<ul>
2633-<li>markup_stopped : markup to use when stopped (default is <code>--:--</code>)</li>
2634-</ul></li>
2635-<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 />
2636-example : <code>LabelTime(markup="%s / $length", initsize="XX:XX / -XX:XX")</code></li>
2637-<li>TimeSlider : Playing position slider
2638-<ul>
2639-<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>
2640-</ul></li>
2641-<li>TimeBar : Playing position progress bar
2642-<ul>
2643-<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>
2644-<li>text_empty : used instead of text when no song is selected</li>
2645-<li>ellipsize : used to ellipsize the text, default to <code>end</code>, can be none, start, middle, or end</li>
2646-<li>font : set the font</li>
2647-</ul></li>
2648-</ul>
2649-
2650-<h3>Volume widgets</h3>
2651-
2652-<ul>
2653-<li>VolumeIcon : Volume indicator</li>
2654-<li>VolumeSlider : Volume slider
2655-<ul>
2656-<li>hide : hide the value if true (=1)</li>
2657-<li>horizontal : vertical slider if true (=1)</li>
2658-<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>
2659-</ul></li>
2660-<li>VolumeBar : Volume bar</li>
2661-<li>Volume : current volume as text</li>
2662-</ul>
2663-
2664-<h3>Other widgets related to the playing song</h3>
2665-
2666-<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>
2667-
2668-<ul>
2669-<li>Cover : Album cover of currently playing song
2670-<ul>
2671-<li>forceratio : 1 or 0, if 1 always request a square size, useful for tray tip windows as they can't be resized</li>
2672-<li>minsize : minimum size</li>
2673-<li>maxsize : maximum size (default is 500)</li>
2674-<li>default : set a default file to use if there is no cover/artist picture</li>
2675-<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>
2676-<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>
2677-<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>
2678-<li>r_scale : (0-100, default=90) to configure the vertical scaling of the reflection</li>
2679-<li>(the filename in the <code>default</code> and <code>overlay</code> option can be absolute or relative to the layout folder)</li>
2680-</ul></li>
2681-<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>
2682-<li>Stars : Display currently playing rating as a picture (default to stars), clicking on the stars change the rating
2683-<ul>
2684-<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>
2685-</ul></li>
2686-<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>
2687-<li>SongInfo : display the song properties (like the info tab of the song properties window)
2688-<ul>
2689-<li>expander: 1 or 0, defaults to 1, show expanders for each field category if 1</li>
2690-<li>hide<em>empty: 1 or 0, default to 1, hide empty fields if 1</li>
2691-<li>font : default font</li>
2692-<li>group : group that determine current song, defaults to Play</li>
2693-<li>markup</em>cat : markup for categories name, defaults to <code>&lt;u&gt;%s&lt;/u&gt;</code></li>
2694-<li>markup<em>field : markup for fields name, defaults to <code>&lt;small&gt;%s :&lt;/small&gt;</code></li>
2695-<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>
2696-</ul></li>
2697-<li>PictureBrowser : display pictures in folder of the current album, click to change picture, many options are planned</li>
2698-<li>AddLabelEntry : Entry to add labels to the current song</li>
2699-<li>LabelToggleButtons : displays list of labels with toggle buttons to edit current song's labels
2700-<ul>
2701-<li>hide_unset: if true(=1), hide labels that not set for the song</li>
2702-</ul></li>
2703-<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>
2704-</ul>
2705-
2706-<h4>Miscellaneous widgets</h4>
2707-
2708-<ul>
2709-<li>AASearch
2710-<ul>
2711-<li>aa : artist or album</li>
2712-<li>activate : addplay or other action, see activate option of SongList</li>
2713-</ul></li>
2714-<li>ArtistSearch : same as AASearch(aa=artists)</li>
2715-<li>AlbumSearch : same as AASearch(aa=album)</li>
2716-<li>SongSearch</li>
2717-<li>ConnectionsList : the active connections when in gstreamer-server mode (very rough for now, mostly for testing)</li>
2718-<li>Visuals : Display a sound visualisation, only with gstreamer</li>
2719-<li>QueueActions : combobox to change the queued action</li>
2720-<li>ToggleButton : Show/Hide other widget(s)
2721-<ul>
2722-<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>
2723-<li>text : button text</li>
2724-<li>widget : list of widgets/containers separated by <code>|</code></li>
2725-<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>
2726-<li>togglegroup : activating a ToggleButton or MenuItem with a togglegroup will deactivate all the TogButton or MenuItem of the same togglegroup</li>
2727-<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>
2728-<li>relief</li>
2729-</ul></li>
2730-<li>Filler : empty widget to add space, for use with H/VSize</li>
2731-<li>HSeparator : Horizontal separator</li>
2732-<li>VSeparator : Vertical separator</li>
2733-<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>
2734-<li>Equalizer : Equalizer, only active with gstreamer currently
2735-<ul>
2736-<li>preamp : whether to show the preamp, default to 1</li>
2737-<li>labels : pango attribute used to display labels, default to <code>x-small</code></li>
2738-</ul></li>
2739-<li>Progress : widget to display progress of current operations, hidden if no operations in progress
2740-<ul>
2741-<li>compact: make it more compact, less verbose, default to 1</li>
2742-</ul></li>
2743-<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>
2744-</ul>
2745-
2746-<h4>Songlist widgets</h4>
2747-
2748-<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 />
2749-All 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>
2750-
2751-<ul>
2752-<li>QueueList : Display queue (and edit it), accept the same options as SongList</li>
2753-<li>PlayList : SongList in playlist mode</li>
2754-<li>SongList :
2755-<ul>
2756-<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>
2757-<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>
2758-<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>
2759-<li>mode : if set to <code>playlist</code>, the songlist and the playlist are synchronized</li>
2760-<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>
2761-<li>activateX : where X is a mouse button number, defines the action used when the button X is double-clicked</li>
2762-<li>headers : hide the headers if set to <code>off</code></li>
2763-<li>songypad : change the default number of pixels between rows</li>
2764-<li>no_typeahead : if 1, disable automatic searching when a letter/digit is pressed and the SongList has focus</li>
2765-<li>rowtip : default tip to show when the mouse is above a row, can use %-letters and $-words</li>
2766-<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>
2767-</ul></li>
2768-<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)
2769-<ul>
2770-<li>tablist : if 1, show the list of tabs in the tab context-menu</li>
2771-<li>closebuttons : if 1, display close buttons in the tab of tabs that can be closed</li>
2772-<li>newbutton : if 1 (default) show a "new page" button next to the tabs</li>
2773-<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>
2774-<li>default_child : widget type that will be opened by default when closing the last page. default to <code>PlayList</code></li>
2775-<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>
2776-</ul></li>
2777-<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>
2778-</ul>
2779-
2780-<h4>Widgets related to songlists</h4>
2781-
2782-<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 />
2783-All 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>
2784-
2785-<ul>
2786-<li>AABox : Artist or Album box (name, picture and stats of selected album/artist)
2787-<ul>
2788-<li>aa : artist or album</li>
2789-</ul></li>
2790-<li>ArtistBox : same as AABox(aa=artists)</li>
2791-<li>AlbumBox : same as AABox(aa=album)</li>
2792-<li><p>EditListButtons : buttons to remove/move the selected song(s) in the songlist and clear the list</p>
2793-
2794-<ul>
2795-<li>small : if true(=1) hide the label of the remove and clear buttons</li>
2796-<li>orientation : vertical buttons if set to <code>vertical</code></li>
2797-</ul></li>
2798-<li><p>FilterBox : advanced search box (set filter#1)</p></li>
2799-<li>FilterLock : Lock/unlock : current songlist filter is put in filter#0
2800-<ul>
2801-<li>relief</li>
2802-</ul></li>
2803-<li>FilterPane : Filter pane
2804-<ul>
2805-<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>
2806-<li>hidebb : hide bottom buttons if true(=1)</li>
2807-<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>
2808-<li>activate : play, queue, queueinsert, replacequeue, insertplay, playlist, addplay or properties (see <code>activate</code> option of SongList)</li>
2809-<li>activateX : where X is a mouse button number, defines the action used when the button X is double-clicked</li>
2810-<li>searchbox : if true(=1) add a search box to artist/album,genre,label pages</li>
2811-<li>no_typeahead : if true(=1) disable automatic searching when a letter/digit is pressed and the FilterPane has focus</li>
2812-<li>hidetabs : if true(=1) tabs are hidden</li>
2813-<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>
2814-<li>hscrollbar : show horizontal scrollbar if 1, hide it if 0</li>
2815-</ul></li>
2816-<li>PlayFilter : Button to Play current songlist filter</li>
2817-<li>QueueFilter : Button to Enqueue current songlist filter</li>
2818-<li>Refresh : Button to re-filter songlist</li>
2819-<li>ResetFilter : Button to reset songlist filter</li>
2820-<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)
2821-<ul>
2822-<li>noselector : if set to 1 hide the selector icon, not recommended as it makes the widget much less powerful</li>
2823-<li>activate : can be used to set a command to run after enter is pressed</li>
2824-</ul></li>
2825-<li>Total : Total number/length/size of selected/filter/library
2826-<ul>
2827-<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>
2828-<li>format : short or long (default)</li>
2829-<li>button : default to 1, if 0 a click-able label is used instead of a button</li>
2830-<li>relief : relief of the button, default to <code>none</code></li>
2831-</ul></li>
2832-</ul>
2833-
2834-<h4>MenuItem widgets (can only be put in a MB/SM)</h4>
2835-
2836-<ul>
2837-<li>HistItem : Filter history (set filter#1)</li>
2838-<li>LSortItem : Sort order for songlist</li>
2839-<li>MainMenuItem : main menu</li>
2840-<li>LayoutItem : layout menu (allows the user to switch to an other layout of type G+)</li>
2841-<li>MenuItem : Custom menu item
2842-<ul>
2843-<li>text : text of the menu item</li>
2844-<li>icon : name of the icon</li>
2845-<li>command : gmusicbrowser command to execute</li>
2846-<li>togglewidget : list of widgets/containers separated by <code>|</code></li>
2847-<li>resizeonly : with the togglewidget option, see the resize option of the ToggleButton</li>
2848-<li>togglegroup : activating a ToggleButton or MenuItem with a togglegroup will deactivate all the TogButton or MenuItem of the same togglegroup</li>
2849-<li>button : if set to 1 and has a submenu, the menuitem is turned into a button (same as BM)</li>
2850-</ul></li>
2851-<li>PFilterItem : playing filter menu</li>
2852-<li>PSortItem : playing sort order</li>
2853-<li>PlayItem : choose a Filter based on playing title/artist/album/filter (set filter#1) and follow playing songlist option</li>
2854-<li>QueueItem : queue menu</li>
2855-<li>SeparatorMenuItem : separator</li>
2856-</ul>
2857-
2858-<h3>Widget aliases</h3>
2859-
2860-<p>Some widgets have been renamed, the old names are deprecated but can be found in old layouts. <br />
2861-old name => new name :</p>
2862-
2863-<pre><code>Playlist =&gt; OpenBrowser
2864-BContext =&gt; OpenContext
2865-Date =&gt; Year
2866-Label =&gt; Text
2867-Vol =&gt; VolumeIcon
2868-LabelVol =&gt; Volume
2869-FLock =&gt; FilterLock
2870-TogButton =&gt; ToggleButton
2871-ProgressV =&gt; VProgress
2872-FBox =&gt; FilterBox
2873-Scale =&gt; TimeSlider
2874-VolSlider =&gt; VolumeSlider
2875-VolBar =&gt; VolumeBar
2876-FPane =&gt; FilterPane
2877-LabelTime =&gt; PlayingTime
2878-</code></pre>
2879-
2880-<h2>Embedded layouts (experimental)</h2>
2881-
2882-<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
2883-supported in embedded layouts identifier) <br />
2884-example :</p>
2885-
2886-<pre><code>[example_layout]
2887-HBmain = Play Stop Pref
2888-VBmain = HBmain Title _@embedded_example
2889-
2890-[embedded_example]
2891-VBmain = Title _SongTree
2892-</code></pre>
2893-
2894-<h2><a id="songvar"> %-letters and $-words</a></h2>
2895-
2896-<p>Some options accept %-letters and $-words variables that are replaced by a field/property of the currently playing song.
2897-For 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 />
2898-Note that %c and %f are not meant to be used for displaying.</p>
2899-
2900-<p>$-words : the word can be any of the activated field name, see the fields tab of the settings dialog.</p>
2901-
2902-<p>%-letters :</p>
2903-
2904-<pre><code>t title
2905-a artist
2906-l album
2907-d disc
2908-n track
2909-y year
2910-C comment
2911-p play count
2912-P last play
2913-k skip count
2914-K last skip
2915-g genres
2916-L labels
2917-m length
2918-V version or nothing if song doesn't have a version/subtitle tag
2919-S title or filename if no title
2920-f filename (with path) (raw filename, may not display correctly)
2921-u filename (with path) (in utf8, used for display, might not be convertible back to the real filename)
2922-c cover file
2923-Y album year(s)
2924-A album artist or artist
2925-</code></pre>
2926
2927=== modified file 'layouts/browser.layout'
2928--- layouts/browser.layout 2013-08-27 20:31:56 +0000
2929+++ layouts/browser.layout 2014-02-15 20:02:02 +0000
2930@@ -1,7 +1,7 @@
2931 [Browser]
2932 Type=B
2933 Name = _"Browser"
2934-Default = Window(size=1120x820) HPfp(size=180) HPbig(size=780) VPlistAA(size=645) FilterPane0(page=artist) FilterPane1(page=album)
2935+Default = Window(size=1120x820) HPfp(size=150-150) HPbig(size=780-350) VPlistAA(size=645-140) FilterPane0(page=artist) FilterPane1(page=album)
2936 VBmain = HBstatus 5_HPbig
2937 HBstatus = SimpleSearch 10MBlist ResetFilter Refresh PlayFilter FilterLock -Total
2938 MBlist = HistItem LSortItem PlayItem
2939@@ -14,7 +14,7 @@
2940 [Smaller browser]
2941 Type=B
2942 Name = _"Smaller browser"
2943-Default = Window(size=1120x820) HPfp(size=180) HPbig(size=780) VPlistAA(size=645) FilterPane0(page=artist) FilterPane1(page=album)
2944+Default = Window(size=1120x820) HPfp(size=150-150) HPbig(size=800-300) VPlistAA(size=600-125) FilterPane0(page=artist) FilterPane1(page=album)
2945 VBmain = HBstatus 5_HPbig
2946 HBstatus = SimpleSearch 10MBlist ResetFilter Refresh PlayFilter FilterLock
2947 MBlist = HistItem LSortItem PlayItem
2948@@ -32,14 +32,14 @@
2949 [3 Filter panes] based on Browser
2950 Type=B
2951 Name = _"3 Filter panes"
2952-Default = Window(size=1120x820) HPfp1(size=125) HPbig(size=750) HPfp2(size=125) VPlistAA(size=655) FilterPane0(page=savedtree) FilterPane1(page=artist) FilterPane2(page=album)
2953+Default = 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)
2954 HPfp = _FilterPane0(nb=1) HPfp2
2955 HPfp2 = _FilterPane1(nb=2) FilterPane2(nb=3)
2956
2957 [left-side filter panes]
2958 Type=B
2959 Name = _"left-side filter panes"
2960-Default = Window(size=1120x820) HPfp(size=180) HPbig(size=360) VPlistAA(size=645) FilterPane0(page=artist) FilterPane1(page=album)
2961+Default = Window(size=1120x820) HPfp(size=150-150) HPbig(size=350-780) VPlistAA(size=645-140) FilterPane0(page=artist) FilterPane1(page=album)
2962 VBmain = HBstatus 5_HPbig
2963 HBstatus = SimpleSearch 10MBlist ResetFilter Refresh PlayFilter FilterLock -Total
2964 MBlist = HistItem LSortItem PlayItem
2965
2966=== modified file 'layouts/main.layout'
2967--- layouts/main.layout 2012-02-08 00:33:53 +0000
2968+++ layouts/main.layout 2014-02-15 20:02:02 +0000
2969@@ -9,7 +9,7 @@
2970 HBmenu = _MBmenu
2971 MBmenu = MainMenuItem LayoutItem PSortItem PFilterItem QueueItem
2972 HPmain = VBLeft _TBRight
2973- VBLeft = 5VBplayer _TabbedLists(group=1)
2974+ VBLeft = 5VBplayer _TabbedLists(group=1,pages="+PlayList +QueueList +SongInfo +PictureBrowser")
2975 VBplayer = HBButtons3 HBText_Cover
2976 HBButtons3 = 5Sort 5Filter 5Queue 5Pos -Stars
2977 HBText_Cover= _VBText 5-Cover
2978
2979=== modified file 'locale/cs/LC_MESSAGES/gmusicbrowser.mo'
2980Binary 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
2981=== modified file 'locale/de/LC_MESSAGES/gmusicbrowser.mo'
2982Binary 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
2983=== modified file 'locale/es/LC_MESSAGES/gmusicbrowser.mo'
2984Binary 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
2985=== modified file 'locale/fi/LC_MESSAGES/gmusicbrowser.mo'
2986Binary 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
2987=== modified file 'locale/fr/LC_MESSAGES/gmusicbrowser.mo'
2988Binary 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
2989=== modified file 'locale/hu/LC_MESSAGES/gmusicbrowser.mo'
2990Binary 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
2991=== modified file 'locale/it/LC_MESSAGES/gmusicbrowser.mo'
2992Binary 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
2993=== modified file 'locale/ja/LC_MESSAGES/gmusicbrowser.mo'
2994Binary 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
2995=== modified file 'locale/ko/LC_MESSAGES/gmusicbrowser.mo'
2996Binary 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
2997=== modified file 'locale/nl/LC_MESSAGES/gmusicbrowser.mo'
2998Binary 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
2999=== modified file 'locale/pl/LC_MESSAGES/gmusicbrowser.mo'
3000Binary 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
3001=== modified file 'locale/pt/LC_MESSAGES/gmusicbrowser.mo'
3002Binary 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
3003=== modified file 'locale/pt_BR/LC_MESSAGES/gmusicbrowser.mo'
3004Binary 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
3005=== modified file 'locale/ru/LC_MESSAGES/gmusicbrowser.mo'
3006Binary 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
3007=== modified file 'locale/sr/LC_MESSAGES/gmusicbrowser.mo'
3008Binary 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
3009=== modified file 'locale/sv/LC_MESSAGES/gmusicbrowser.mo'
3010Binary 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
3011=== modified file 'locale/zh_CN/LC_MESSAGES/gmusicbrowser.mo'
3012Binary 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
3013=== modified file 'locale/zh_TW/LC_MESSAGES/gmusicbrowser.mo'
3014Binary 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
3015=== modified file 'plugins/export.pm'
3016--- plugins/export.pm 2014-01-25 14:17:08 +0000
3017+++ plugins/export.pm 2014-02-15 20:02:02 +0000
3018@@ -145,11 +145,14 @@
3019 my $content="#EXTM3U\n";
3020 for my $ID (@$IDs)
3021 { my ($file,$length,$artist,$title)= Songs::Get($ID,qw/fullfilename length artist title/);
3022+ ::_utf8_on($file); # for file, so it doesn't get converted in utf8
3023 $content.= "\n#EXTINF:$length,$artist - $title\n$file\n";
3024 }
3025- open my$fh,'>',$file or warn "Error opening '$file' for writing : $!\n";
3026- print $fh $content or warn "Error writing to '$file' : $!\n";
3027- close $fh;
3028+ { my $fh;
3029+ open($fh,'>:utf8',$file) && (print $fh $content) && close($fh) && last;
3030+ my $res= ::Retry_Dialog($!,_"Error writing .m3u file", details=> ::__x( _"file: {filename}", filename=>$file));
3031+ redo if $res eq 'retry';
3032+ }
3033 }
3034
3035 sub ToCSV
3036@@ -157,24 +160,31 @@
3037 my $check=::NewPrefCheckButton(OPT.'toCSV_notitlerow',_"Do not add a title row");
3038 my $file=::ChooseSaveFile(undef,_"Write filenames to ...",undef,'songs.csv',$check);
3039 return unless defined $file;
3040- 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 fields
3041- open my$fh,'>:utf8',$file;
3042- unless ($::Options{OPT.'toCSV_notitlerow'}) #print a title row
3043- { print $fh join(',',map Songs::FieldName($_), @fields)."\n";
3044- }
3045- no warnings 'uninitialized';
3046- for my $ID (@$IDs)
3047- { my @val;
3048- push @val, Songs::Get($ID,@fields);
3049- s/\x00/\t/g for @val; #for genres and labels
3050- s/"/""/g for @val;
3051- ::_utf8_on($val[0]); # for file and path, so it doesn't get converted in utf8
3052- ::_utf8_on($val[1]); # FIXME find a cleaner way to do that
3053- #print STDERR join(',',@val)."\n";
3054- print $fh join(',',map '"'.$_.'"', @val)."\n";
3055- }
3056- close $fh;
3057-
3058+ my @fields= (qw/file path/,sort grep !m/^file$|^path$/, (Songs::PropertyFields())); #make sure file and path are in position 0 and 1
3059+
3060+ my $retry;
3061+ { if ($retry)
3062+ { my $res= ::Retry_Dialog($!,_"Error writing .csv file", details=> ::__x( _"file: {filename}", filename=>$file));
3063+ last unless $res eq 'retry';
3064+ }
3065+ $retry=1;
3066+
3067+ open my$fh,'>:utf8',$file or redo;
3068+ unless ($::Options{OPT.'toCSV_notitlerow'}) #print a title row
3069+ { print $fh join(',',map Songs::FieldName($_), @fields)."\n" or redo;
3070+ }
3071+ for my $ID (@$IDs)
3072+ { my @val;
3073+ push @val, Songs::Get($ID,@fields);
3074+ s/\x00/\t/g for @val; #for genres and labels
3075+ s/"/""/g for @val;
3076+ ::_utf8_on($val[0]); # for file and path, so it doesn't get converted in utf8
3077+ ::_utf8_on($val[1]); # FIXME find a cleaner way to do that
3078+ #print STDERR join(',',@val)."\n";
3079+ print $fh join(',',map '"'.$_.'"', @val)."\n" or redo;
3080+ }
3081+ close $fh or redo;
3082+ }
3083 }
3084
3085 sub RunCommand
3086
3087=== modified file 'plugins/fetch_cover.pm'
3088--- plugins/fetch_cover.pm 2014-01-25 14:17:08 +0000
3089+++ plugins/fetch_cover.pm 2014-02-15 20:02:02 +0000
3090@@ -391,6 +391,7 @@
3091 sub searchresults_cb
3092 { my ($self,$result)=@_;
3093 $self->{waiting}=undef;
3094+ warn "Getting results from $self->{url}\n" if $::Verbose;
3095 unless (defined $result) { stop($self,_"connection failed."); return; }
3096 my $parse= $Sites{$self->{mainfield}}{$self->{site}}[2];
3097 my ($list,$nexturl)=$parse->($result,$self->{url},$self->{searchcontext});
3098@@ -567,5 +568,3 @@
3099
3100 1
3101
3102-__END__
3103-xml.amazon.com/onca/xml3?t=webservices-20&dev-t=%l&KeywordSearch=%s&mode=music&type=heavy&locale=us&page=1&f=xml
3104
3105=== modified file 'po/cs.po'
3106--- po/cs.po 2014-01-25 14:17:08 +0000
3107+++ po/cs.po 2014-02-15 20:02:02 +0000
3108@@ -5,7 +5,7 @@
3109 msgstr ""
3110 "Project-Id-Version: gmusicbrowser 1.1005\n"
3111 "Report-Msgid-Bugs-To: squentin@free.fr\n"
3112-"POT-Creation-Date: 2014-01-13 21:36+0100\n"
3113+"POT-Creation-Date: 2014-02-15 01:23+0100\n"
3114 "PO-Revision-Date: 2012-10-08 08:52+0100\n"
3115 "Last-Translator: Petr Šimáček <petr.simacek@gmail.com>\n"
3116 "Language-Team: čeština <L3D9Z6@seznam.cz>\n"
3117@@ -34,11 +34,11 @@
3118 msgid " of {length}"
3119 msgstr " z {length}"
3120
3121-#: gmusicbrowser.pl:6651
3122+#: gmusicbrowser.pl:6626
3123 msgid "# songs"
3124 msgstr "# skladby"
3125
3126-#: gmusicbrowser_layout.pm:1776
3127+#: gmusicbrowser_layout.pm:1782
3128 #, perl-format
3129 msgid "%S by %a"
3130 msgstr "%S od %a"
3131@@ -60,8 +60,8 @@
3132 msgstr[1] "%d Interpreti"
3133 msgstr[2] "%d Interpretů"
3134
3135-#: gmusicbrowser.pl:3303 gmusicbrowser.pl:3307 gmusicbrowser.pl:5139
3136-#: gmusicbrowser_list.pm:1717
3137+#: gmusicbrowser.pl:3314 gmusicbrowser.pl:3318 gmusicbrowser.pl:5164
3138+#: gmusicbrowser_list.pm:1719
3139 #, perl-format
3140 msgid "%d Song"
3141 msgid_plural "%d Songs"
3142@@ -77,7 +77,7 @@
3143 msgstr[1] "%d nadcházející události"
3144 msgstr[2] "%d nadcházejících událostí"
3145
3146-#: gmusicbrowser.pl:433 gmusicbrowser_list.pm:7997 gmusicbrowser_songs.pm:875
3147+#: gmusicbrowser.pl:436 gmusicbrowser_list.pm:7990 gmusicbrowser_songs.pm:875
3148 #, perl-format
3149 msgid "%d album"
3150 msgid_plural "%d albums"
3151@@ -85,7 +85,7 @@
3152 msgstr[1] "%d alba"
3153 msgstr[2] "%d alb"
3154
3155-#: gmusicbrowser.pl:419 gmusicbrowser.pl:426 gmusicbrowser_list.pm:8008
3156+#: gmusicbrowser.pl:422 gmusicbrowser.pl:429 gmusicbrowser_list.pm:8001
3157 #: gmusicbrowser_songs.pm:848 gmusicbrowser_songs.pm:3033
3158 #, perl-format
3159 msgid "%d artist"
3160@@ -94,7 +94,7 @@
3161 msgstr[1] "%d interpreti"
3162 msgstr[2] "%d interpretů"
3163
3164-#: gmusicbrowser.pl:4761
3165+#: gmusicbrowser.pl:4786
3166 #, perl-format
3167 msgid "%d file"
3168 msgid_plural "%d files"
3169@@ -110,7 +110,7 @@
3170 msgstr[1] "%d soubory ve složce {folder}"
3171 msgstr[2] "%d souborů ve složce {folder}"
3172
3173-#: gmusicbrowser.pl:5561
3174+#: gmusicbrowser.pl:5584
3175 #, perl-format
3176 msgid "%d folder"
3177 msgid_plural "%d folders"
3178@@ -118,7 +118,7 @@
3179 msgstr[1] "%d složky"
3180 msgstr[2] "%d složek"
3181
3182-#: gmusicbrowser.pl:1557
3183+#: gmusicbrowser.pl:1567
3184 #, perl-format
3185 msgid "%d second"
3186 msgid_plural "%d seconds"
3187@@ -126,8 +126,8 @@
3188 msgstr[1] "%d vteřiny"
3189 msgstr[2] "%d vteřin"
3190
3191-#: gmusicbrowser.pl:413 gmusicbrowser.pl:421 gmusicbrowser.pl:6389
3192-#: gmusicbrowser.pl:6595 gmusicbrowser.pl:8270 gmusicbrowser_layout.pm:238
3193+#: gmusicbrowser.pl:416 gmusicbrowser.pl:424 gmusicbrowser.pl:6360
3194+#: gmusicbrowser.pl:6570 gmusicbrowser.pl:8296 gmusicbrowser_layout.pm:238
3195 #: gmusicbrowser_list.pm:248 gmusicbrowser_songs.pm:3027
3196 #: plugins/audioscrobbler.pm:173
3197 #, perl-format
3198@@ -137,7 +137,7 @@
3199 msgstr[1] "%d skladby"
3200 msgstr[2] "%d skladeb"
3201
3202-#: gmusicbrowser.pl:5560
3203+#: gmusicbrowser.pl:5583
3204 #, perl-format
3205 msgid "%d song added"
3206 msgid_plural "%d songs added"
3207@@ -145,7 +145,7 @@
3208 msgstr[1] "%d skladby přidány"
3209 msgstr[2] "%d skladeb přidáno"
3210
3211-#: gmusicbrowser.pl:3312 gmusicbrowser_layout.pm:234
3212+#: gmusicbrowser.pl:3323 gmusicbrowser_layout.pm:234
3213 #: gmusicbrowser_layout.pm:237
3214 #, perl-format
3215 msgid "%d song in queue"
3216@@ -181,12 +181,12 @@
3217 msgid "%t by %a (%m)"
3218 msgstr "%S od %a"
3219
3220-#: gmusicbrowser.pl:4655
3221+#: gmusicbrowser.pl:4680
3222 #, perl-brace-format
3223 msgid "'{file}' exists. Overwrite ?"
3224 msgstr "'{file}' existuje. Přepsat ?"
3225
3226-#: gmusicbrowser.pl:6548
3227+#: gmusicbrowser.pl:6522
3228 #, perl-format
3229 msgid "(%d song excluded)"
3230 msgid_plural "(%d songs excluded)"
3231@@ -194,7 +194,7 @@
3232 msgstr[1] "(%d skladby vyjmuty)"
3233 msgstr[2] "(%d skladeb vyjmuto)"
3234
3235-#: gmusicbrowser.pl:3135
3236+#: gmusicbrowser.pl:3146
3237 msgid "(case insensitive)"
3238 msgstr "(nedostupné)"
3239
3240@@ -211,11 +211,15 @@
3241 msgid "(see http://www.last.fm)"
3242 msgstr "(navštivte http://www.last.fm)"
3243
3244-#: gmusicbrowser.pl:6150 gmusicbrowser_gstreamer-0.10.pm:508
3245+#: gmusicbrowser.pl:6173 gmusicbrowser_gstreamer-0.10.pm:508
3246 msgid "(unstable)"
3247 msgstr "(nestabilní)"
3248
3249-#: gmusicbrowser.pl:6273
3250+#: gmusicbrowser.pl:6544
3251+msgid ", sort @ScanExt) ], [_"
3252+msgstr ""
3253+
3254+#: gmusicbrowser.pl:6244
3255 msgid ""
3256 "- When selecting a song, the playlist filter will be reset if the song is "
3257 "not in it\n"
3258@@ -226,7 +230,7 @@
3259 "- Pokud bude stávající skladba odstraněna z playlistu, bude přeskočeno na "
3260 "další skladbu"
3261
3262-#: gmusicbrowser.pl:8410
3263+#: gmusicbrowser.pl:8436
3264 msgid "0 chance"
3265 msgstr "0 možností"
3266
3267@@ -234,7 +238,7 @@
3268 msgid "0 means 'show all'"
3269 msgstr "0 znamená 'zobrazit vše'"
3270
3271-#: gmusicbrowser.pl:8408
3272+#: gmusicbrowser.pl:8434
3273 #, perl-brace-format
3274 msgid "1 chance in {probability}"
3275 msgstr "1 možnost v {probability}"
3276@@ -247,15 +251,15 @@
3277 msgid "32x32 PNG file icon"
3278 msgstr "soubor s ikonou 32x32 PNG"
3279
3280-#: gmusicbrowser.pl:1807
3281+#: gmusicbrowser.pl:1817
3282 msgid "50 Last Added"
3283 msgstr "50 naposled přidaných"
3284
3285-#: gmusicbrowser.pl:1806
3286+#: gmusicbrowser.pl:1816
3287 msgid "50 Last Played"
3288 msgstr "50 naposled přehrávaných"
3289
3290-#: gmusicbrowser.pl:1805
3291+#: gmusicbrowser.pl:1815
3292 msgid "50 Most Played"
3293 msgstr "50 nejpřehrávanějších"
3294
3295@@ -264,7 +268,7 @@
3296 msgid "<Unknown>"
3297 msgstr "<Unknown>"
3298
3299-#: gmusicbrowser.pl:417
3300+#: gmusicbrowser.pl:420
3301 #, perl-format
3302 msgid ""
3303 "<b>%t</b>\n"
3304@@ -280,12 +284,12 @@
3305 msgid "<big><big>by %a</big></big>"
3306 msgstr "<big><big>od %a</big></big>"
3307
3308-#: gmusicbrowser_list.pm:721 plugins/notify.pm:24
3309+#: gmusicbrowser_list.pm:731 plugins/notify.pm:24
3310 #, perl-format
3311 msgid "<i>by</i> %a\\n<i>from</i> %l"
3312 msgstr "<i>od</i> %a\\n<i>z</i> %l"
3313
3314-#: gmusicbrowser_layout.pm:4317
3315+#: gmusicbrowser_layout.pm:4326
3316 msgid "Abort"
3317 msgstr "Zrušit"
3318
3319@@ -302,7 +306,7 @@
3320 msgid "About"
3321 msgstr "O aplikaci"
3322
3323-#: gmusicbrowser.pl:4766
3324+#: gmusicbrowser.pl:4791
3325 #, perl-brace-format
3326 msgid ""
3327 "About to delete {files}\n"
3328@@ -311,7 +315,7 @@
3329 "Odstraňování {files}\n"
3330 "Odstranit?"
3331
3332-#: gmusicbrowser.pl:1557
3333+#: gmusicbrowser.pl:1567
3334 msgid "About to turn off the computer in :"
3335 msgstr "Vypnout počítač za :"
3336
3337@@ -319,7 +323,7 @@
3338 msgid "Actions are not supported by current notification daemon"
3339 msgstr "Akce není podporována stávajícím notifikačním démonem"
3340
3341-#: gmusicbrowser.pl:7643 gmusicbrowser.pl:7927 gmusicbrowser.pl:8148
3342+#: gmusicbrowser.pl:7669 gmusicbrowser.pl:7953 gmusicbrowser.pl:8174
3343 #: gmusicbrowser_tags.pm:1323 plugins/desktopwidget.pm:36
3344 msgid "Add"
3345 msgstr "Přidat"
3346@@ -343,29 +347,29 @@
3347 msgid "Add a filter"
3348 msgstr "Přidat filtr"
3349
3350-#: gmusicbrowser.pl:6326
3351+#: gmusicbrowser.pl:6297
3352 msgid "Add a fullscreen button"
3353 msgstr "Přidat tlačítko celoobrazovkového režimu"
3354
3355-#: gmusicbrowser.pl:6326
3356+#: gmusicbrowser.pl:6297
3357 msgid "Add a fullscreen button to layouts that can accept extra buttons"
3358 msgstr ""
3359 "Přidat tlačítko celoobrazovkového režimu do vzhledů, které akceptují extra "
3360 "tlačítka"
3361
3362-#: gmusicbrowser_list.pm:7560
3363+#: gmusicbrowser_list.pm:7553
3364 msgid "Add a group"
3365 msgstr "Přidat skupinu"
3366
3367-#: gmusicbrowser.pl:1250
3368+#: gmusicbrowser.pl:1255
3369 msgid "Add a label to the current song"
3370 msgstr "Přidat štítek stávající skladbě"
3371
3372-#: gmusicbrowser.pl:1243
3373+#: gmusicbrowser.pl:1248
3374 msgid "Add a list of files/folders to the playlist"
3375 msgstr "Přidat seznam souborů/složek do playlistu"
3376
3377-#: gmusicbrowser_list.pm:8054
3378+#: gmusicbrowser_list.pm:8047
3379 msgid "Add a radio"
3380 msgstr "Přidat rádio"
3381
3382@@ -373,11 +377,11 @@
3383 msgid "Add files or folders"
3384 msgstr "Přidat soubory a složky"
3385
3386-#: gmusicbrowser.pl:1246
3387+#: gmusicbrowser.pl:1251
3388 msgid "Add files/folders to library"
3389 msgstr "Přidat soubory/složky do knihovny"
3390
3391-#: gmusicbrowser.pl:6494
3392+#: gmusicbrowser.pl:6465
3393 msgid "Add folder"
3394 msgstr "Přidat složku"
3395
3396@@ -387,31 +391,31 @@
3397 msgid "Add folder ..."
3398 msgstr "Přidat složku ..."
3399
3400-#: gmusicbrowser.pl:6697
3401+#: gmusicbrowser.pl:6672
3402 msgid "Add label"
3403 msgstr "Přidat štítek"
3404
3405-#: gmusicbrowser.pl:7644
3406+#: gmusicbrowser.pl:7670
3407 msgid "Add multiple condition"
3408 msgstr "Přidat vícenásobnou podmínku"
3409
3410-#: gmusicbrowser.pl:5199
3411+#: gmusicbrowser.pl:5224
3412 msgid "Add new label"
3413 msgstr "Přidat nový štítek"
3414
3415-#: gmusicbrowser_list.pm:8124
3416+#: gmusicbrowser_list.pm:8117
3417 msgid "Add new radio"
3418 msgstr "Přidat nové rádio"
3419
3420-#: gmusicbrowser.pl:8150
3421+#: gmusicbrowser.pl:8176
3422 msgid "Add rule : "
3423 msgstr "Přidat pravidlo :"
3424
3425-#: gmusicbrowser.pl:5843
3426+#: gmusicbrowser.pl:5866
3427 msgid "Add shorcut key"
3428 msgstr "Přidat klávesovou zkratku"
3429
3430-#: gmusicbrowser_list.pm:1964
3431+#: gmusicbrowser_list.pm:1966
3432 msgid "Add tab"
3433 msgstr "Přidat záložku"
3434
3435@@ -419,7 +423,7 @@
3436 msgid "Add to existing values"
3437 msgstr "Přidat do stávajících hodnot"
3438
3439-#: gmusicbrowser.pl:474
3440+#: gmusicbrowser.pl:477
3441 msgid "Add to list"
3442 msgstr "Přidat do seznamu"
3443
3444@@ -440,15 +444,15 @@
3445 msgid "Added"
3446 msgstr "Přidáno"
3447
3448-#: gmusicbrowser.pl:1809
3449+#: gmusicbrowser.pl:1819
3450 msgid "Added Today"
3451 msgstr "Přidáno dnes"
3452
3453-#: gmusicbrowser_list.pm:8113
3454+#: gmusicbrowser_list.pm:8106
3455 msgid "Adding a radio"
3456 msgstr "Přidávání rádia"
3457
3458-#: gmusicbrowser.pl:6258
3459+#: gmusicbrowser.pl:6229
3460 msgid ""
3461 "Additionally this format can be used :\n"
3462 " default number1 format1 number2 format2 ...\n"
3463@@ -466,7 +470,7 @@
3464 "Přidat položku do kontextového menu interpreta/alba, která umožní hledat "
3465 "googlem obrázek/přebal a uložit jej."
3466
3467-#: gmusicbrowser_layout.pm:1550
3468+#: gmusicbrowser_layout.pm:1556
3469 msgid "Adds labels to the current song"
3470 msgstr "Přidat štítky stávající skladbě"
3471
3472@@ -474,19 +478,19 @@
3473 msgid "Adds menu entries to song contextual menu"
3474 msgstr "Přidat položky do kontextového menu skladby"
3475
3476-#: gmusicbrowser.pl:5252
3477+#: gmusicbrowser.pl:5277
3478 msgid "Advanced"
3479 msgstr ""
3480
3481-#: gmusicbrowser_list.pm:3616
3482+#: gmusicbrowser_list.pm:3613
3483 msgid "Advanced Search ..."
3484 msgstr "Rozšířené vyhledávání ..."
3485
3486-#: gmusicbrowser.pl:5252 gmusicbrowser_tags.pm:1493
3487+#: gmusicbrowser.pl:5277 gmusicbrowser_tags.pm:1493
3488 msgid "Advanced Tag Editing"
3489 msgstr "Rozšířená editace popisků"
3490
3491-#: gmusicbrowser.pl:996 gmusicbrowser_songs.pm:868 gmusicbrowser_tags.pm:1614
3492+#: gmusicbrowser.pl:999 gmusicbrowser_songs.pm:868 gmusicbrowser_tags.pm:1614
3493 #: gmusicbrowser_tags.pm:1652 gmusicbrowser_tags.pm:1667
3494 #: gmusicbrowser_tags.pm:1685 gmusicbrowser_tags.pm:1692
3495 #: gmusicbrowser_tags.pm:1938 plugins/albuminfo.pm:63
3496@@ -521,7 +525,7 @@
3497 msgid "Album gain"
3498 msgstr "Zisk alba"
3499
3500-#: gmusicbrowser.pl:6151
3501+#: gmusicbrowser.pl:6174
3502 msgid "Album mode"
3503 msgstr "Režim alba"
3504
3505@@ -529,11 +533,11 @@
3506 msgid "Album peak"
3507 msgstr "Vrchol alba"
3508
3509-#: gmusicbrowser_list.pm:815 gmusicbrowser_songs.pm:891
3510+#: gmusicbrowser_list.pm:825 gmusicbrowser_songs.pm:891
3511 msgid "Album picture"
3512 msgstr "Obrázek alba"
3513
3514-#: gmusicbrowser_list.pm:838
3515+#: gmusicbrowser_list.pm:848
3516 msgid "Album picture & info"
3517 msgstr "Obrázek alba & info"
3518
3519@@ -549,7 +553,7 @@
3520 msgid "Album shuffle"
3521 msgstr "Zamíchané album"
3522
3523-#: gmusicbrowser.pl:995
3524+#: gmusicbrowser.pl:998
3525 msgid "Album with picture"
3526 msgstr "Album s obrázkem"
3527
3528@@ -580,12 +584,12 @@
3529 msgid "Albums"
3530 msgstr "Alba"
3531
3532-#: gmusicbrowser_songs.pm:2372 gmusicbrowser_songs.pm:4739
3533+#: gmusicbrowser_songs.pm:2372 gmusicbrowser_songs.pm:4766
3534 #: layouts/makeitlooklike.layout:314
3535 msgid "All"
3536 msgstr "Vše"
3537
3538-#: gmusicbrowser_songs.pm:4728
3539+#: gmusicbrowser_songs.pm:4755
3540 msgid "All Songs"
3541 msgstr "Všechny skladby"
3542
3543@@ -597,7 +601,7 @@
3544 msgid "All artists"
3545 msgstr "Všichni interpreti"
3546
3547-#: gmusicbrowser.pl:4501
3548+#: gmusicbrowser.pl:4533
3549 msgid "All files"
3550 msgstr "Všechny soubory"
3551
3552@@ -613,12 +617,12 @@
3553 msgid "All moods"
3554 msgstr "Všechny nálady"
3555
3556-#: gmusicbrowser.pl:7781 gmusicbrowser.pl:7876 gmusicbrowser_songs.pm:4744
3557+#: gmusicbrowser.pl:7807 gmusicbrowser.pl:7902 gmusicbrowser_songs.pm:4771
3558 msgid "All of :"
3559 msgstr "Vše z :"
3560
3561-#: gmusicbrowser.pl:9343 gmusicbrowser_layout.pm:1477
3562-#: gmusicbrowser_songs.pm:4063
3563+#: gmusicbrowser.pl:9369 gmusicbrowser_layout.pm:1483
3564+#: gmusicbrowser_songs.pm:4090
3565 msgid "All songs"
3566 msgstr "Všechny skladby"
3567
3568@@ -651,16 +655,16 @@
3569 msgstr "Ovládat gmusicbrowser přes DBus za použití standardu MPRIS v2.0"
3570
3571 #. Alt key
3572-#: gmusicbrowser.pl:1044
3573+#: gmusicbrowser.pl:1047
3574 msgctxt "Keyboard"
3575 msgid "Alt"
3576 msgstr "Alt"
3577
3578-#: gmusicbrowser.pl:6272
3579+#: gmusicbrowser.pl:6243
3580 msgid "Amount of volume changed by the mouse wheel"
3581 msgstr "Velikost kroku změny hlasitosti kolečkem myši"
3582
3583-#: gmusicbrowser.pl:6089
3584+#: gmusicbrowser.pl:6112
3585 msgid ""
3586 "Analyse and add replaygain tags for all songs that don't have replaygain "
3587 "tags, or incoherent album replaygain tags"
3588@@ -668,11 +672,11 @@
3589 "Analýzovat a přidat replaygain tagy pro všechny písně, které nemají "
3590 "replaygain značky, nebo nesoudržné replaygain značky alba "
3591
3592-#: gmusicbrowser.pl:7781 gmusicbrowser.pl:7877 gmusicbrowser_songs.pm:4744
3593+#: gmusicbrowser.pl:7807 gmusicbrowser.pl:7903 gmusicbrowser_songs.pm:4771
3594 msgid "Any of :"
3595 msgstr "Cokoliv z :"
3596
3597-#: gmusicbrowser.pl:460
3598+#: gmusicbrowser.pl:463
3599 msgid "Append"
3600 msgstr "Přidat"
3601
3602@@ -680,7 +684,7 @@
3603 msgid "Append (only if not already present)"
3604 msgstr "Přidat (pouze pokud již neexistuje)"
3605
3606-#: gmusicbrowser_list.pm:1706
3607+#: gmusicbrowser_list.pm:1708
3608 msgid "Append to playlist"
3609 msgstr "Přidat do playlistu"
3610
3611@@ -688,12 +692,12 @@
3612 msgid "Application"
3613 msgstr "Aplikace"
3614
3615-#: gmusicbrowser.pl:6612
3616+#: gmusicbrowser.pl:6587
3617 #, perl-brace-format
3618 msgid "Are you sure you want to delete the '{label}' label ?"
3619 msgstr "Určitě odstranit štítek '{label}' ?"
3620
3621-#: gmusicbrowser.pl:5881
3622+#: gmusicbrowser.pl:5904
3623 msgid "Arguments"
3624 msgstr "Argumenty"
3625
3626@@ -708,7 +712,7 @@
3627 msgid "Artist"
3628 msgstr "Interpret"
3629
3630-#: gmusicbrowser.pl:994
3631+#: gmusicbrowser.pl:997
3632 msgid "Artist & album"
3633 msgstr "Interpret & album"
3634
3635@@ -724,7 +728,7 @@
3636 msgid "Artist URL"
3637 msgstr "URL interpreta"
3638
3639-#: gmusicbrowser_list.pm:823 gmusicbrowser_songs.pm:900
3640+#: gmusicbrowser_list.pm:833 gmusicbrowser_songs.pm:900
3641 msgid "Artist picture"
3642 msgstr "Obrázek interpreta"
3643
3644@@ -737,11 +741,11 @@
3645 msgid "Artist playcount:"
3646 msgstr "Počet přehrání interpreta"
3647
3648-#: gmusicbrowser.pl:1012
3649+#: gmusicbrowser.pl:1015
3650 msgid "Artist,Album,Disc,Track"
3651 msgstr "Interpret,album,disk,stopa"
3652
3653-#: gmusicbrowser.pl:1013
3654+#: gmusicbrowser.pl:1016
3655 msgid "Artist,Date,Album,Disc,Track"
3656 msgstr "Interpret,rok,album,disk,stopa"
3657
3658@@ -765,7 +769,7 @@
3659 msgid "Artists"
3660 msgstr "Interpreti"
3661
3662-#: gmusicbrowser.pl:7992
3663+#: gmusicbrowser.pl:8018
3664 msgid "Ascending order"
3665 msgstr "Vzrůstající"
3666
3667@@ -773,7 +777,7 @@
3668 msgid "Ask confirmation only if file already exists"
3669 msgstr "Potvrzovat pouze pokud soubor již existuje"
3670
3671-#: gmusicbrowser.pl:5724
3672+#: gmusicbrowser.pl:5747
3673 msgid "Audio"
3674 msgstr "Audio"
3675
3676@@ -801,11 +805,11 @@
3677 msgid "Auto fill up to"
3678 msgstr "Automaticky vyplnit k"
3679
3680-#: gmusicbrowser_list.pm:3492
3681+#: gmusicbrowser_list.pm:3497
3682 msgid "Auto filter"
3683 msgstr "Automatický filter"
3684
3685-#: gmusicbrowser.pl:394
3686+#: gmusicbrowser.pl:397
3687 msgid "Auto-fill queue"
3688 msgstr "Automaticky vyplnit frontu"
3689
3690@@ -829,11 +833,11 @@
3691 msgid "Auto-scroll"
3692 msgstr "Automatický posun"
3693
3694-#: gmusicbrowser_list.pm:1732
3695+#: gmusicbrowser_list.pm:1734
3696 msgid "Auto-select Pictures"
3697 msgstr "Automatický výběr obrázků"
3698
3699-#: gmusicbrowser.pl:6529
3700+#: gmusicbrowser.pl:6503
3701 msgid "Automatically remove current song if not found"
3702 msgstr "Automaticky odstranit stávající skladbu, pokud nebyla nalezena"
3703
3704@@ -845,7 +849,7 @@
3705 msgid "Autosave plugin"
3706 msgstr "Zásuvný modul automatického ukládání"
3707
3708-#: gmusicbrowser.pl:7948
3709+#: gmusicbrowser.pl:7974
3710 msgid "Available"
3711 msgstr "Dostupné"
3712
3713@@ -861,7 +865,7 @@
3714 msgid "Bad session"
3715 msgstr "Chyba sezení"
3716
3717-#: gmusicbrowser.pl:4932
3718+#: gmusicbrowser.pl:4957
3719 msgid "Base Folder :"
3720 msgstr "Základní složka :"
3721
3722@@ -869,11 +873,11 @@
3723 msgid "Basic fields"
3724 msgstr "Základní pole"
3725
3726-#: gmusicbrowser_list.pm:5269
3727+#: gmusicbrowser_list.pm:5266
3728 msgid "Begin with"
3729 msgstr "Začít s"
3730
3731-#: gmusicbrowser_list.pm:1660
3732+#: gmusicbrowser_list.pm:1662
3733 msgid "Below"
3734 msgstr "Níže"
3735
3736@@ -901,7 +905,7 @@
3737 msgid "Browser views"
3738 msgstr "Zobrazení prohlížeče"
3739
3740-#: gmusicbrowser.pl:6313
3741+#: gmusicbrowser.pl:6284
3742 msgid "Browser window layout :"
3743 msgstr "Styl prohlížeče"
3744
3745@@ -917,7 +921,7 @@
3746 msgid "Buttons, Song & Cover"
3747 msgstr "Tlačítka, skladba & přebal"
3748
3749-#: gmusicbrowser.pl:1239
3750+#: gmusicbrowser.pl:1244
3751 msgid "Can be relative by using + or -"
3752 msgstr "Při použití + nebo - může být relativní"
3753
3754@@ -933,7 +937,7 @@
3755 "Nelze změnit hlasitost. Při použití tohoto audio backendu je vyžadován "
3756 "amixer (obsažen v alsa-utils)."
3757
3758-#: gmusicbrowser.pl:4313
3759+#: gmusicbrowser.pl:4337
3760 #, perl-brace-format
3761 msgid "Can't create folder: {path}"
3762 msgstr ""
3763@@ -951,7 +955,7 @@
3764 msgid "Can't read file or invalid file"
3765 msgstr "Soubor nelze číst nebo je poškozený"
3766
3767-#: gmusicbrowser.pl:4968
3768+#: gmusicbrowser.pl:4993
3769 #, perl-brace-format
3770 msgid "Can't write in base folder '{folder}'."
3771 msgstr "Nelze zapisovat do základní složky '{folder}'."
3772@@ -964,15 +968,15 @@
3773 msgid "Capitalize each word"
3774 msgstr "Všechna slova psát s vekými písmeny"
3775
3776-#: gmusicbrowser.pl:7988
3777+#: gmusicbrowser.pl:8014
3778 msgid "Case insensitive"
3779 msgstr "Nedostupná položka"
3780
3781-#: gmusicbrowser.pl:7988 gmusicbrowser.pl:8597 gmusicbrowser_list.pm:3487
3782+#: gmusicbrowser.pl:8014 gmusicbrowser.pl:8623 gmusicbrowser_list.pm:3492
3783 msgid "Case sensitive"
3784 msgstr "Dostupná položka"
3785
3786-#: gmusicbrowser_list.pm:5268
3787+#: gmusicbrowser_list.pm:5265
3788 msgid "Case-sensitive"
3789 msgstr "Dostupná položka"
3790
3791@@ -988,7 +992,7 @@
3792 msgid "Centered on"
3793 msgstr "Zarovnáno na"
3794
3795-#: gmusicbrowser.pl:1211
3796+#: gmusicbrowser.pl:1216
3797 msgid "Change Display"
3798 msgstr "Změnit zobrazení"
3799
3800@@ -1013,15 +1017,15 @@
3801 msgid "Check Collection"
3802 msgstr "Zkontrolovat kolekci"
3803
3804-#: gmusicbrowser.pl:6518
3805+#: gmusicbrowser.pl:6492
3806 msgid "Check for updated/deleted songs on startup"
3807 msgstr "Kontrolovat přidané/smazané skladby při startu"
3808
3809-#: gmusicbrowser_list.pm:1726
3810+#: gmusicbrowser_list.pm:1728
3811 msgid "Check for updated/removed songs"
3812 msgstr "Zkontrolovat přidané/smazané skladby"
3813
3814-#: gmusicbrowser.pl:6531
3815+#: gmusicbrowser.pl:6505
3816 msgid "Check real length of mp3"
3817 msgstr "Zkontrolovat skutečnou délku mp3 souboru"
3818
3819@@ -1029,15 +1033,15 @@
3820 msgid "Check your audio settings"
3821 msgstr "Zkontrolovat nastavení zvuku"
3822
3823-#: gmusicbrowser.pl:936
3824+#: gmusicbrowser.pl:939
3825 msgid "Checking length/bitrate"
3826 msgstr "Kontrolovat délku/datový tok"
3827
3828-#: gmusicbrowser.pl:934
3829+#: gmusicbrowser.pl:937
3830 msgid "Checking songs"
3831 msgstr "Kontrolovat skladby"
3832
3833-#: gmusicbrowser_list.pm:3311
3834+#: gmusicbrowser_list.pm:3314
3835 msgid "Choose Album From this Artist"
3836 msgstr "Vybrat album tohoto interpreta"
3837
3838@@ -1045,7 +1049,7 @@
3839 msgid "Choose Artist/Album/Song"
3840 msgstr "Vybrat interpreta/album/skladbu"
3841
3842-#: gmusicbrowser.pl:4492
3843+#: gmusicbrowser.pl:4524
3844 msgid "Choose Picture"
3845 msgstr "Vybrat obrázek"
3846
3847@@ -1053,23 +1057,23 @@
3848 msgid "Choose Random Album"
3849 msgstr "Vybrat náhodné album"
3850
3851-#: gmusicbrowser.pl:8730
3852+#: gmusicbrowser.pl:8756
3853 msgid "Choose a folder"
3854 msgstr "Vyberte složku"
3855
3856-#: gmusicbrowser.pl:4324
3857+#: gmusicbrowser.pl:4348
3858 msgid "Choose directory to copy files to"
3859 msgstr "Vybrat adresář pro kopírování souborů"
3860
3861-#: gmusicbrowser.pl:4325
3862+#: gmusicbrowser.pl:4349
3863 msgid "Choose directory to move files to"
3864 msgstr "Vybrat adresář pro přesunutí souborů"
3865
3866-#: gmusicbrowser.pl:4461
3867+#: gmusicbrowser.pl:4499
3868 msgid "Choose files"
3869 msgstr "Vybrat soubory"
3870
3871-#: gmusicbrowser.pl:6570
3872+#: gmusicbrowser.pl:6545
3873 msgid "Choose folder to add"
3874 msgstr "Vybrat složku pro přidání"
3875
3876@@ -1086,32 +1090,32 @@
3877 msgid "Choose icon for label {name}"
3878 msgstr "Vybrat ikonu pro štítek {name}"
3879
3880-#: gmusicbrowser_layout.pm:2670
3881+#: gmusicbrowser_layout.pm:2679
3882 msgid "Choose page to open"
3883 msgstr "Vybrat stránku k otevření"
3884
3885-#: gmusicbrowser.pl:3377
3886+#: gmusicbrowser.pl:3388
3887 #, perl-format
3888 msgid "Choose picture for '%s'"
3889 msgstr "Vybrat obrázek pro '%s'"
3890
3891-#: gmusicbrowser.pl:5403
3892+#: gmusicbrowser.pl:5428
3893 msgid "Choose playlist files to import"
3894 msgstr "Vybrat soubory s playlisty k importu"
3895
3896-#: gmusicbrowser.pl:7929 gmusicbrowser_list.pm:289
3897+#: gmusicbrowser.pl:7955 gmusicbrowser_list.pm:289
3898 msgid "Clear"
3899 msgstr "Smazat"
3900
3901-#: gmusicbrowser.pl:1220
3902+#: gmusicbrowser.pl:1225
3903 msgid "Clear playlist"
3904 msgstr "Vyčistit seznam skladeb"
3905
3906-#: gmusicbrowser.pl:1254
3907+#: gmusicbrowser.pl:1259
3908 msgid "Clear playlist filter"
3909 msgstr "Vyčistit filtr seznamu skladeb"
3910
3911-#: gmusicbrowser.pl:1219 gmusicbrowser_layout.pm:33
3912+#: gmusicbrowser.pl:1224 gmusicbrowser_layout.pm:33
3913 msgid "Clear queue"
3914 msgstr "Smazat frontu"
3915
3916@@ -1131,12 +1135,12 @@
3917 msgid "Client banned, contact gmusicbrowser's developer"
3918 msgstr "Zakázaný klient, kontaktujte vývojáře gmusicbrowser"
3919
3920-#: gmusicbrowser_layout.pm:2392 gmusicbrowser_list.pm:3991
3921-#: gmusicbrowser_list.pm:4058
3922+#: gmusicbrowser_layout.pm:2401 gmusicbrowser_list.pm:3988
3923+#: gmusicbrowser_list.pm:4055
3924 msgid "Close"
3925 msgstr "Zavřít"
3926
3927-#: gmusicbrowser.pl:1201
3928+#: gmusicbrowser.pl:1206
3929 msgid "Close Window"
3930 msgstr "Zavřít okno"
3931
3932@@ -1145,7 +1149,7 @@
3933 msgid "Close a filter"
3934 msgstr "Vybrat filtr"
3935
3936-#: gmusicbrowser.pl:6299
3937+#: gmusicbrowser.pl:6270
3938 msgid "Close to tray"
3939 msgstr "Zavřít do oznamovací oblasti"
3940
3941@@ -1153,7 +1157,7 @@
3942 msgid "Collection"
3943 msgstr "Kolekce"
3944
3945-#: gmusicbrowser.pl:5770 gmusicbrowser.pl:5880 gmusicbrowser_123.pm:291
3946+#: gmusicbrowser.pl:5793 gmusicbrowser.pl:5903 gmusicbrowser_123.pm:291
3947 msgid "Command"
3948 msgstr "Příkaz"
3949
3950@@ -1165,7 +1169,7 @@
3951 msgid "Command used :"
3952 msgstr "Použitý příkaz :"
3953
3954-#: gmusicbrowser.pl:6231
3955+#: gmusicbrowser.pl:6213
3956 msgid ""
3957 "Command used when\n"
3958 "'turn off computer when queue empty'\n"
3959@@ -1206,7 +1210,7 @@
3960 msgid "Conductor"
3961 msgstr "Dirigent"
3962
3963-#: gmusicbrowser.pl:6221
3964+#: gmusicbrowser.pl:6203
3965 msgid "Connect through a proxy"
3966 msgstr "Připojit přes proxy"
3967
3968@@ -1231,11 +1235,11 @@
3969 msgid "Conz Glimm (different controls)"
3970 msgstr "Conz Glimm (různé ovládací prvky)"
3971
3972-#: gmusicbrowser.pl:482
3973+#: gmusicbrowser.pl:485
3974 msgid "Copy"
3975 msgstr "Kopírovat"
3976
3977-#: gmusicbrowser.pl:4335
3978+#: gmusicbrowser.pl:4359
3979 msgid "Copy failed"
3980 msgstr "Kopírování selhalo"
3981
3982@@ -1255,7 +1259,7 @@
3983 msgid "Copy to portable player"
3984 msgstr "Kopírovat do přenosného přehrávače"
3985
3986-#: gmusicbrowser.pl:4337
3987+#: gmusicbrowser.pl:4361
3988 #, perl-format
3989 msgid "Copying file"
3990 msgid_plural "Copying %d files"
3991@@ -1271,17 +1275,17 @@
3992 msgid "Cover Size : "
3993 msgstr "Velikost přebalu:"
3994
3995-#: gmusicbrowser.pl:6349
3996+#: gmusicbrowser.pl:6320
3997 msgid "Create ID3v2 tags as ID3v2.4"
3998 msgstr "Vytvořit ID3v2 popisky jako ID3v2.4"
3999
4000 #. Ctrl key
4001-#: gmusicbrowser.pl:1043
4002+#: gmusicbrowser.pl:1046
4003 msgctxt "Keyboard"
4004 msgid "Ctrl"
4005 msgstr "Ctrl"
4006
4007-#: gmusicbrowser.pl:6273
4008+#: gmusicbrowser.pl:6244
4009 msgid "Current song must always be in the playlist"
4010 msgstr "Stávající skladba vždy musí být v playlistu"
4011
4012@@ -1317,16 +1321,16 @@
4013 msgid "Custom pipeline"
4014 msgstr "Vlastní pipeline"
4015
4016-#: gmusicbrowser_layout.pm:1435 gmusicbrowser_layout.pm:1462
4017-#: gmusicbrowser_layout.pm:1491 gmusicbrowser_list.pm:91
4018+#: gmusicbrowser_layout.pm:1441 gmusicbrowser_layout.pm:1468
4019+#: gmusicbrowser_layout.pm:1497 gmusicbrowser_list.pm:91
4020 msgid "Custom..."
4021 msgstr "Obecné..."
4022
4023-#: gmusicbrowser.pl:1009 gmusicbrowser_tags.pm:1617 gmusicbrowser_tags.pm:1655
4024+#: gmusicbrowser.pl:1012 gmusicbrowser_tags.pm:1617 gmusicbrowser_tags.pm:1655
4025 msgid "Date"
4026 msgstr "Rok"
4027
4028-#: gmusicbrowser.pl:6259
4029+#: gmusicbrowser.pl:6230
4030 msgid "Date format :"
4031 msgstr "Formát data:"
4032
4033@@ -1338,7 +1342,7 @@
4034 msgid "Debut Album"
4035 msgstr "Uvedení alba"
4036
4037-#: gmusicbrowser.pl:1222
4038+#: gmusicbrowser.pl:1227
4039 msgid "Decrease Volume"
4040 msgstr "Snížit hlasitost"
4041
4042@@ -1354,7 +1358,7 @@
4043 msgid "Default fullscreen"
4044 msgstr "Výchozí celá obrazovka"
4045
4046-#: gmusicbrowser.pl:6211
4047+#: gmusicbrowser.pl:6193
4048 #, perl-format
4049 msgid "Default rating : %d %"
4050 msgstr "Výchozí hodnocení : %d %"
4051@@ -1367,7 +1371,7 @@
4052 msgid "Default text font"
4053 msgstr "Výchozí font textu"
4054
4055-#: gmusicbrowser.pl:6301
4056+#: gmusicbrowser.pl:6272
4057 #, perl-format
4058 msgid "Delay before showing tray tip popup on mouse over : %d ms"
4059 msgstr ""
4060@@ -1378,19 +1382,19 @@
4061 msgid "Delete"
4062 msgstr "Odstranit"
4063
4064-#: gmusicbrowser.pl:1213
4065+#: gmusicbrowser.pl:1218
4066 msgid "Delete Selected Songs"
4067 msgstr "Odstranit vybrané skladby"
4068
4069-#: gmusicbrowser_layout.pm:2390
4070+#: gmusicbrowser_layout.pm:2399
4071 msgid "Delete list"
4072 msgstr "Odstranit seznam"
4073
4074-#: gmusicbrowser.pl:4777
4075+#: gmusicbrowser.pl:4802
4076 msgid "Deletion failed"
4077 msgstr ""
4078
4079-#: gmusicbrowser.pl:7992
4080+#: gmusicbrowser.pl:8018
4081 msgid "Descending order"
4082 msgstr "Sestupné pořadí"
4083
4084@@ -1412,12 +1416,12 @@
4085 msgid "Desktop widgets plugin"
4086 msgstr "Zásuvný modul pomůcek"
4087
4088-#: gmusicbrowser.pl:4390
4089+#: gmusicbrowser.pl:4414
4090 #, perl-brace-format
4091 msgid "Destination: {file}"
4092 msgstr ""
4093
4094-#: gmusicbrowser.pl:6228
4095+#: gmusicbrowser.pl:6210
4096 msgid "Disable screensaver when fullscreen and playing"
4097 msgstr "Při celoobrazovkovém režimu vypnout spořič obrazovky"
4098
4099@@ -1438,11 +1442,11 @@
4100 msgid "Disc name"
4101 msgstr "Název disku"
4102
4103-#: gmusicbrowser.pl:1211
4104+#: gmusicbrowser.pl:1216
4105 msgid "Display (:1 or host:0 for example)"
4106 msgstr "Zobrazit (:1 nebo host:0 pro příklad)"
4107
4108-#: gmusicbrowser.pl:505
4109+#: gmusicbrowser.pl:508
4110 msgid "Display Songs"
4111 msgstr "Zobrazit skladby"
4112
4113@@ -1459,28 +1463,24 @@
4114 msgid "Display synchronized lyrics of the current song"
4115 msgstr "Zobrazovat texty v souladu se stávající skladbou"
4116
4117-#: gmusicbrowser.pl:6297
4118+#: gmusicbrowser.pl:6268
4119 #, perl-format
4120 msgid "Display tray tip for %d ms"
4121 msgstr "Zobrazit vyskakovací okno oznamovací oblasti po %d ms"
4122
4123-#: plugins/export.pm:157
4124+#: plugins/export.pm:160
4125 msgid "Do not add a title row"
4126 msgstr "Nepřidávat titulkovou řádku"
4127
4128-#: gmusicbrowser.pl:6516
4129-msgid "Do not add songs that can't be played"
4130-msgstr "Nepřidávat skladby, které nelze přehrát"
4131-
4132-#: gmusicbrowser.pl:6355
4133+#: gmusicbrowser.pl:6326
4134 msgid "Do not create an id3v1 tag in mp3 files"
4135 msgstr "Nevytvářet ID3v1 popisek u souborů mp3"
4136
4137-#: gmusicbrowser.pl:6351
4138+#: gmusicbrowser.pl:6322
4139 msgid "Do not unsynchronise id3v2 tags"
4140 msgstr "Nechat synchronizované ID3v2 popisky"
4141
4142-#: gmusicbrowser.pl:6354
4143+#: gmusicbrowser.pl:6325
4144 msgid "Do not write the tags"
4145 msgstr "Nezapisovat popisky"
4146
4147@@ -1505,24 +1505,24 @@
4148 msgid "Download"
4149 msgstr "Stáhnout"
4150
4151-#: gmusicbrowser.pl:6384
4152+#: gmusicbrowser.pl:6355
4153 msgid "Drag and drop songs here to replace the selection."
4154 msgstr "Přetáhněte songy sem pro nahrazení výběru"
4155
4156-#: gmusicbrowser.pl:5263 layouts/makeitlooklike.layout:50
4157+#: gmusicbrowser.pl:5288 layouts/makeitlooklike.layout:50
4158 #: layouts/makeitlooklike.layout:235 layouts/makeitlooklike.layout:340
4159 msgid "Edit"
4160 msgstr "Upravit"
4161
4162-#: gmusicbrowser.pl:1204
4163+#: gmusicbrowser.pl:1209
4164 msgid "Edit Current Song Properties"
4165 msgstr "Upravit vlastnosti stávající skladby"
4166
4167-#: gmusicbrowser.pl:475
4168+#: gmusicbrowser.pl:478
4169 msgid "Edit Labels"
4170 msgstr "Upravit štítky"
4171
4172-#: gmusicbrowser.pl:491 gmusicbrowser.pl:4730
4173+#: gmusicbrowser.pl:494 gmusicbrowser.pl:4755
4174 msgid "Edit Lyrics"
4175 msgstr "Upravit texty"
4176
4177@@ -1530,11 +1530,11 @@
4178 msgid "Edit Lyrics ..."
4179 msgstr "Upravit texty ..."
4180
4181-#: gmusicbrowser.pl:5223
4182+#: gmusicbrowser.pl:5248
4183 msgid "Edit Multiple Songs Properties"
4184 msgstr "Upravit mnohočetné vlastnosti skladeb"
4185
4186-#: gmusicbrowser.pl:476
4187+#: gmusicbrowser.pl:479
4188 msgid "Edit Rating"
4189 msgstr "Upravit hodnocení"
4190
4191@@ -1546,7 +1546,7 @@
4192 msgid "Edit auto-fill formats ..."
4193 msgstr "Upravit formáty automatického vyplňování ..."
4194
4195-#: gmusicbrowser_list.pm:2944
4196+#: gmusicbrowser_list.pm:2946
4197 msgid "Edit filter"
4198 msgstr "Upravit filter"
4199
4200@@ -1554,7 +1554,7 @@
4201 msgid "Edit filter..."
4202 msgstr "Upravit filtr"
4203
4204-#: gmusicbrowser_list.pm:6757
4205+#: gmusicbrowser_list.pm:6750
4206 msgid "Edit grouping ..."
4207 msgstr "Upravit seskupení ..."
4208
4209@@ -1562,7 +1562,7 @@
4210 msgid "Edit in the last.fm wiki"
4211 msgstr "Upravit v last.fm wiki"
4212
4213-#: gmusicbrowser_list.pm:2952
4214+#: gmusicbrowser_list.pm:2954
4215 msgid "Edit list"
4216 msgstr "Upravit seznam"
4217
4218@@ -1570,24 +1570,24 @@
4219 msgid "Edit mode"
4220 msgstr "Režim úprav"
4221
4222-#: gmusicbrowser_layout.pm:1404
4223+#: gmusicbrowser_layout.pm:1410
4224 msgid "Edit ordered modes ..."
4225 msgstr "Upravit režimy pořadí"
4226
4227-#: gmusicbrowser_layout.pm:1388
4228+#: gmusicbrowser_layout.pm:1394
4229 msgid "Edit random modes ..."
4230 msgstr "Upravit náhodné režimy"
4231
4232-#: gmusicbrowser_list.pm:710 gmusicbrowser_list.pm:854
4233-#: gmusicbrowser_list.pm:6769
4234+#: gmusicbrowser_list.pm:720 gmusicbrowser_list.pm:864
4235+#: gmusicbrowser_list.pm:6762
4236 msgid "Edit row tip"
4237 msgstr "Upravit řádek Tip"
4238
4239-#: gmusicbrowser.pl:1205
4240+#: gmusicbrowser.pl:1210
4241 msgid "Edit selected song properties"
4242 msgstr "Upravit vlastnosti vybrané skladby"
4243
4244-#: gmusicbrowser.pl:9347 gmusicbrowser_layout.pm:39
4245+#: gmusicbrowser.pl:9373 gmusicbrowser_layout.pm:39
4246 msgid "Edit..."
4247 msgstr "Upravit..."
4248
4249@@ -1595,11 +1595,11 @@
4250 msgid "Editable in song properties dialog"
4251 msgstr "Je možno upravit v dialogu vlastností skladby"
4252
4253-#: gmusicbrowser.pl:3282 gmusicbrowser.pl:3289
4254+#: gmusicbrowser.pl:3293 gmusicbrowser.pl:3300
4255 msgid "Editing list : "
4256 msgstr "Úprava seznamu :"
4257
4258-#: gmusicbrowser.pl:1441
4259+#: gmusicbrowser.pl:1446
4260 msgid "Editing tags"
4261 msgstr "Úprava popisků"
4262
4263@@ -1627,40 +1627,40 @@
4264 msgid "Encoder"
4265 msgstr "Enkodér"
4266
4267-#: gmusicbrowser.pl:6353
4268+#: gmusicbrowser.pl:6324
4269 msgid "Encoding used for id3v1 tags :"
4270 msgstr "Kódování použité pro ID3v1 popisky :"
4271
4272-#: gmusicbrowser_list.pm:1709 gmusicbrowser_list.pm:3989
4273-#: gmusicbrowser_list.pm:4056
4274+#: gmusicbrowser_list.pm:1711 gmusicbrowser_list.pm:3986
4275+#: gmusicbrowser_list.pm:4053
4276 msgid "Enqueue"
4277 msgstr "Přidat do fronty"
4278
4279-#: gmusicbrowser.pl:1218
4280+#: gmusicbrowser.pl:1223
4281 msgid "Enqueue Action"
4282 msgstr "Možnosti přidání do fronty"
4283
4284-#: gmusicbrowser.pl:472
4285+#: gmusicbrowser.pl:475
4286 msgid "Enqueue Displayed"
4287 msgstr "Přidat do fronty zobrazené"
4288
4289-#: gmusicbrowser.pl:470
4290+#: gmusicbrowser.pl:473
4291 msgid "Enqueue Selected"
4292 msgstr "Přidat do fronty vybrané"
4293
4294-#: gmusicbrowser.pl:1215
4295+#: gmusicbrowser.pl:1220
4296 msgid "Enqueue Selected Songs"
4297 msgstr "Přidat do fronty vybrané skladby"
4298
4299-#: gmusicbrowser.pl:1217
4300+#: gmusicbrowser.pl:1222
4301 msgid "Enqueue Songs from Current Album"
4302 msgstr "Přidat do fronty skladby ze stávajícího alba"
4303
4304-#: gmusicbrowser.pl:1216
4305+#: gmusicbrowser.pl:1221
4306 msgid "Enqueue Songs from Current Artist"
4307 msgstr "Přidat do fronty skladby stávajícího interpreta"
4308
4309-#: gmusicbrowser.pl:1245
4310+#: gmusicbrowser.pl:1250
4311 msgid "Enqueue a list of files/folders"
4312 msgstr "Přidat do fronty seznam souborů/složek"
4313
4314@@ -1683,15 +1683,15 @@
4315 msgid "Equalizer"
4316 msgstr "Ekvalizér"
4317
4318-#: gmusicbrowser.pl:5937
4319+#: gmusicbrowser.pl:5960
4320 msgid "Error :"
4321 msgstr "Chyba :"
4322
4323-#: gmusicbrowser.pl:4314
4324+#: gmusicbrowser.pl:4338
4325 msgid "Error creating folder"
4326 msgstr ""
4327
4328-#: gmusicbrowser.pl:2516
4329+#: gmusicbrowser.pl:2527
4330 msgid "Error details"
4331 msgstr "Podrobnosti o chybě"
4332
4333@@ -1730,7 +1730,7 @@
4334 "Chyba ukládání textů do '{file}' :\n"
4335 "{error}"
4336
4337-#: plugins/fetch_cover.pm:556
4338+#: plugins/fetch_cover.pm:557
4339 msgid "Error saving picture"
4340 msgstr ""
4341
4342@@ -1755,11 +1755,19 @@
4343 msgid "Error while writing tag"
4344 msgstr ""
4345
4346-#: plugins/fetch_cover.pm:556
4347+#: plugins/fetch_cover.pm:557
4348 #, perl-brace-format
4349 msgid "Error writing '{file}'"
4350 msgstr "Chyba zápisu do '{file}'"
4351
4352+#: plugins/export.pm:167
4353+msgid "Error writing .csv file"
4354+msgstr ""
4355+
4356+#: plugins/export.pm:153
4357+msgid "Error writing .m3u file"
4358+msgstr ""
4359+
4360 #: gmusicbrowser_tags.pm:289
4361 msgid "Error writing lyrics"
4362 msgstr ""
4363@@ -1809,11 +1817,11 @@
4364 msgid "Extra fields"
4365 msgstr "Extra pole"
4366
4367-#: gmusicbrowser.pl:6155
4368+#: gmusicbrowser.pl:6178
4369 msgid "Extra gain"
4370 msgstr "Extra zisk"
4371
4372-#: gmusicbrowser.pl:6244
4373+#: gmusicbrowser.pl:6221
4374 msgid "Extract guest artist from title :"
4375 msgstr "Vyčlenit hostujícího interpreta z názvu :"
4376
4377@@ -1830,7 +1838,7 @@
4378 msgid "Fade-out then stop"
4379 msgstr "Slábnout, pak zastavit"
4380
4381-#: gmusicbrowser.pl:4779
4382+#: gmusicbrowser.pl:4804
4383 #, perl-brace-format
4384 msgid "Failed to delete '{file}'"
4385 msgstr ""
4386@@ -1847,7 +1855,7 @@
4387 msgid "Field type"
4388 msgstr "Typ pole"
4389
4390-#: gmusicbrowser.pl:5727 gmusicbrowser_list.pm:5272
4391+#: gmusicbrowser.pl:5750 gmusicbrowser_list.pm:5269
4392 msgid "Fields"
4393 msgstr "Pole"
4394
4395@@ -1893,12 +1901,16 @@
4396 msgid "Files"
4397 msgstr "Soubory"
4398
4399-#: gmusicbrowser_list.pm:1588
4400+#: gmusicbrowser.pl:6488
4401+msgid "Files with these extensions won't be added"
4402+msgstr ""
4403+
4404+#: gmusicbrowser_list.pm:1590
4405 msgid "Filesystem"
4406 msgstr "Souborový systém"
4407
4408-#: gmusicbrowser.pl:503 gmusicbrowser.pl:505 gmusicbrowser_list.pm:125
4409-#: gmusicbrowser_list.pm:1584 layouts/contrib.layout:335
4410+#: gmusicbrowser.pl:506 gmusicbrowser.pl:508 gmusicbrowser_list.pm:125
4411+#: gmusicbrowser_list.pm:1586 layouts/contrib.layout:335
4412 #: layouts/contrib.layout:534
4413 msgid "Filter"
4414 msgstr "Filtr"
4415@@ -1907,7 +1919,7 @@
4416 msgid "Filter : "
4417 msgstr "Filtr : "
4418
4419-#: gmusicbrowser.pl:7456
4420+#: gmusicbrowser.pl:7482
4421 msgid "Filter edition"
4422 msgstr "Editace filtru"
4423
4424@@ -1923,15 +1935,15 @@
4425 msgid "Filter on playing Song"
4426 msgstr "Filtr na přehrávanou skladbu"
4427
4428-#: gmusicbrowser_list.pm:3298
4429+#: gmusicbrowser_list.pm:3301
4430 msgid "Filter on this album"
4431 msgstr "Filtr na toto album"
4432
4433-#: gmusicbrowser_list.pm:3298
4434+#: gmusicbrowser_list.pm:3301
4435 msgid "Filter on this artist"
4436 msgstr "Filtr na tohoto interpreta"
4437
4438-#: gmusicbrowser_list.pm:5298
4439+#: gmusicbrowser_list.pm:5295
4440 msgid "Find :"
4441 msgstr "Nalézt :"
4442
4443@@ -1939,25 +1951,25 @@
4444 msgid "Find a unique filename if file already exists"
4445 msgstr "Pokud soubor již existuje, najít jedinečný název"
4446
4447-#: gmusicbrowser.pl:479
4448+#: gmusicbrowser.pl:482
4449 msgid "Find songs in same albums"
4450 msgstr "Najít skladby na stejných albech"
4451
4452-#: gmusicbrowser.pl:478
4453+#: gmusicbrowser.pl:481
4454 msgid "Find songs with same artists"
4455 msgstr "Najít skladby stejných interpretů"
4456
4457-#: gmusicbrowser.pl:477
4458+#: gmusicbrowser.pl:480
4459 msgid "Find songs with the same names"
4460 msgstr "Najít skladby stejných názvů"
4461
4462-#: gmusicbrowser.pl:997 gmusicbrowser_list.pm:781 gmusicbrowser_list.pm:1587
4463+#: gmusicbrowser.pl:1000 gmusicbrowser_list.pm:791 gmusicbrowser_list.pm:1589
4464 #: gmusicbrowser_songs.pm:803 layouts/contrib.layout:337
4465 #: layouts/songtree.layout:91
4466 msgid "Folder"
4467 msgstr "Složka"
4468
4469-#: gmusicbrowser_list.pm:781 layouts/songtree.layout:90
4470+#: gmusicbrowser_list.pm:791 layouts/songtree.layout:90
4471 msgid "Folder (right-aligned)"
4472 msgstr "Složka (zarovnáno vpravo)"
4473
4474@@ -1965,20 +1977,20 @@
4475 msgid "Folder format :"
4476 msgstr "Formát složky :"
4477
4478-#: gmusicbrowser.pl:4933
4479+#: gmusicbrowser.pl:4958
4480 msgid "Folder pattern :"
4481 msgstr "Vzor složky :"
4482
4483-#: gmusicbrowser.pl:6479 gmusicbrowser.pl:6521
4484+#: gmusicbrowser.pl:6450 gmusicbrowser.pl:6495
4485 msgid "Folders to search for new songs"
4486 msgstr "Nové skladby hledat ve složkách"
4487
4488-#: gmusicbrowser_layout.pm:4165 gmusicbrowser_list.pm:17
4489-#: gmusicbrowser_list.pm:859 gmusicbrowser_list.pm:6774
4490+#: gmusicbrowser_layout.pm:4174 gmusicbrowser_list.pm:17
4491+#: gmusicbrowser_list.pm:869 gmusicbrowser_list.pm:6767
4492 msgid "Follow playing song"
4493 msgstr "Následovat přehrávanou skladbu"
4494
4495-#: gmusicbrowser_layout.pm:4165
4496+#: gmusicbrowser_layout.pm:4174
4497 msgid "Follow selected song"
4498 msgstr "Následovat vybranou skladbu"
4499
4500@@ -1986,7 +1998,7 @@
4501 msgid "Font size"
4502 msgstr "Velikost písma"
4503
4504-#: gmusicbrowser.pl:1191
4505+#: gmusicbrowser.pl:1194
4506 msgid "Forward"
4507 msgstr "Vpřed"
4508
4509@@ -1998,18 +2010,18 @@
4510 msgid "Friday"
4511 msgstr "Pátek"
4512
4513-#: gmusicbrowser.pl:4994
4514+#: gmusicbrowser.pl:5019
4515 #, perl-brace-format
4516 msgid ""
4517 "From: {oldname}\n"
4518 "To: {newname}"
4519 msgstr ""
4520
4521-#: gmusicbrowser.pl:6315
4522+#: gmusicbrowser.pl:6286
4523 msgid "Full screen layout :"
4524 msgstr "Celoobrazovkové rozložení :"
4525
4526-#: gmusicbrowser.pl:522 gmusicbrowser_layout.pm:637
4527+#: gmusicbrowser.pl:525 gmusicbrowser_layout.pm:637
4528 msgid "Fullscreen"
4529 msgstr "Celá obrazovka"
4530
4531@@ -2017,11 +2029,11 @@
4532 msgid "Fullscreen simple"
4533 msgstr "Jednoduchá celá obrazovka"
4534
4535-#: gmusicbrowser.pl:6059
4536+#: gmusicbrowser.pl:6082
4537 msgid "GStreamer module not loaded."
4538 msgstr "Modul GStreamer není zaveden"
4539
4540-#: gmusicbrowser.pl:6156
4541+#: gmusicbrowser.pl:6179
4542 msgid "Gain for songs missing replaygain tags"
4543 msgstr "Výtěžek skladeb bez popisků replaygain"
4544
4545@@ -2044,7 +2056,7 @@
4546 msgid "Genre - Artist"
4547 msgstr "Žánr - Album"
4548
4549-#: gmusicbrowser_songs.pm:4947
4550+#: gmusicbrowser_songs.pm:4974
4551 msgid "Genre is set"
4552 msgstr "Žánr je nastaven"
4553
4554@@ -2068,11 +2080,11 @@
4555 msgid "Go to Playing Track"
4556 msgstr "Přejít na přehrávanou skladbu"
4557
4558-#: gmusicbrowser_list.pm:862 gmusicbrowser_list.pm:6777
4559+#: gmusicbrowser_list.pm:872 gmusicbrowser_list.pm:6770
4560 msgid "Go to playing song"
4561 msgstr "Přejít na přehrávanou skladbu"
4562
4563-#: gmusicbrowser_list.pm:7592
4564+#: gmusicbrowser_list.pm:7585
4565 msgid "Group by :"
4566 msgstr "Seskupit s :"
4567
4568@@ -2088,7 +2100,7 @@
4569 msgid "Handshake failed : "
4570 msgstr "Selhání spojení :"
4571
4572-#: gmusicbrowser.pl:6152
4573+#: gmusicbrowser.pl:6175
4574 msgid "Hard limiter"
4575 msgstr "Tvrdá omezení"
4576
4577@@ -2097,7 +2109,7 @@
4578 msgid "Help"
4579 msgstr "Pomoc"
4580
4581-#: gmusicbrowser.pl:521 gmusicbrowser.pl:1208
4582+#: gmusicbrowser.pl:524 gmusicbrowser.pl:1213
4583 msgid "Hide"
4584 msgstr "Skrýt"
4585
4586@@ -2105,7 +2117,7 @@
4587 msgid "Hide Artist/Album bar"
4588 msgstr "Skrýt lištu Umělec/Album"
4589
4590-#: gmusicbrowser_list.pm:5271
4591+#: gmusicbrowser_list.pm:5268
4592 msgid "Hide non-matching"
4593 msgstr "Skrýt, které se neshodují"
4594
4595@@ -2113,7 +2125,7 @@
4596 msgid "Hide toolbar"
4597 msgstr "Skrýt lištu nástrojů"
4598
4599-#: gmusicbrowser.pl:6329
4600+#: gmusicbrowser.pl:6300
4601 msgid "Icon theme :"
4602 msgstr "Téma ikon :"
4603
4604@@ -2121,11 +2133,15 @@
4605 msgid "Identifier in file tag"
4606 msgstr "Identifikátor v popisku souboru"
4607
4608-#: gmusicbrowser.pl:6102
4609+#: gmusicbrowser.pl:6125
4610 msgid "Ignore playback errors"
4611 msgstr "Ignorovat chyby přehrávání"
4612
4613-#: gmusicbrowser_list.pm:2958
4614+#: gmusicbrowser.pl:6488
4615+msgid "Ignored file extensions :"
4616+msgstr ""
4617+
4618+#: gmusicbrowser_list.pm:2960
4619 msgid "Import list"
4620 msgstr "Seznam importů"
4621
4622@@ -2141,7 +2157,7 @@
4623 msgid "Include Styles in Genres"
4624 msgstr "Zahrnout Styly a Žánry"
4625
4626-#: gmusicbrowser.pl:1221
4627+#: gmusicbrowser.pl:1226
4628 msgid "Increase Volume"
4629 msgstr "Zvýšit hlasitost"
4630
4631@@ -2149,7 +2165,7 @@
4632 msgid "Increase volume"
4633 msgstr "Zesílit hlasitost"
4634
4635-#: gmusicbrowser.pl:5264 gmusicbrowser_tags.pm:1683 layouts/pages.layout:40
4636+#: gmusicbrowser.pl:5289 gmusicbrowser_tags.pm:1683 layouts/pages.layout:40
4637 #: layouts/shimmer.layout:75
4638 msgid "Info"
4639 msgstr "Info"
4640@@ -2166,11 +2182,11 @@
4641 msgid "Insensitive, Song & Cover"
4642 msgstr "Nedostupné, skladba & přebal"
4643
4644-#: gmusicbrowser.pl:1214
4645+#: gmusicbrowser.pl:1219
4646 msgid "Insert Selected Songs at the top of the queue"
4647 msgstr "Vložit vybrané skladby na začátek fronty"
4648
4649-#: gmusicbrowser.pl:1244
4650+#: gmusicbrowser.pl:1249
4651 msgid "Insert a list of files/folders at the start of the playlist"
4652 msgstr "Vložit seznam souborů/složek na začátek playlistu"
4653
4654@@ -2182,7 +2198,7 @@
4655 msgid "Invalid regular expression"
4656 msgstr "Chybný výraz"
4657
4658-#: gmusicbrowser.pl:8567
4659+#: gmusicbrowser.pl:8593
4660 msgid "Invert filter"
4661 msgstr "Obrátit filtr"
4662
4663@@ -2199,7 +2215,7 @@
4664 msgid "Justified"
4665 msgstr "Do bloku"
4666
4667-#: gmusicbrowser.pl:807
4668+#: gmusicbrowser.pl:810
4669 msgid "KB"
4670 msgstr "KB"
4671
4672@@ -2211,15 +2227,15 @@
4673 msgid "Karaoke plugin"
4674 msgstr "Zásuvný modul karaoke"
4675
4676-#: gmusicbrowser_list.pm:856 gmusicbrowser_list.pm:6771
4677+#: gmusicbrowser_list.pm:866 gmusicbrowser_list.pm:6764
4678 msgid "Keep list filtered and sorted"
4679 msgstr ""
4680
4681-#: gmusicbrowser.pl:5767 gmusicbrowser.pl:5879
4682+#: gmusicbrowser.pl:5790 gmusicbrowser.pl:5902
4683 msgid "Key"
4684 msgstr "Klávesa"
4685
4686-#: gmusicbrowser.pl:5729
4687+#: gmusicbrowser.pl:5752
4688 msgid "Keys"
4689 msgstr "Klávesy"
4690
4691@@ -2227,12 +2243,12 @@
4692 msgid "Keywords"
4693 msgstr "Klíčová slova"
4694
4695-#: gmusicbrowser.pl:1250 gmusicbrowser.pl:1251 gmusicbrowser.pl:1252
4696-#: gmusicbrowser.pl:6646
4697+#: gmusicbrowser.pl:1255 gmusicbrowser.pl:1256 gmusicbrowser.pl:1257
4698+#: gmusicbrowser.pl:6621
4699 msgid "Label"
4700 msgstr "Štítek"
4701
4702-#: gmusicbrowser_songs.pm:4942
4703+#: gmusicbrowser_songs.pm:4969
4704 msgid "Label is set"
4705 msgstr "Štítek je nastaven"
4706
4707@@ -2240,11 +2256,11 @@
4708 msgid "Label/Publisher"
4709 msgstr "Značka/vydavatel"
4710
4711-#: gmusicbrowser.pl:5723 gmusicbrowser_songs.pm:1007
4712+#: gmusicbrowser.pl:5746 gmusicbrowser_songs.pm:1007
4713 msgid "Labels"
4714 msgstr "Štítky"
4715
4716-#: gmusicbrowser_list.pm:808 layouts/songtree.layout:51
4717+#: gmusicbrowser_list.pm:818 layouts/songtree.layout:51
4718 msgid "Labels' icons"
4719 msgstr "Ikony štítků"
4720
4721@@ -2260,7 +2276,7 @@
4722 msgid "Languages"
4723 msgstr "Jazyky"
4724
4725-#: gmusicbrowser.pl:1011 gmusicbrowser_list.pm:720 gmusicbrowser_songs.pm:1089
4726+#: gmusicbrowser.pl:1014 gmusicbrowser_list.pm:730 gmusicbrowser_songs.pm:1089
4727 msgid "Last played"
4728 msgstr "Naposled přehrávané"
4729
4730@@ -2280,7 +2296,7 @@
4731 msgid "Layout :"
4732 msgstr "Rozložení :"
4733
4734-#: gmusicbrowser.pl:5725
4735+#: gmusicbrowser.pl:5748
4736 msgid "Layouts"
4737 msgstr "Vzhled"
4738
4739@@ -2300,7 +2316,7 @@
4740 msgid "Length"
4741 msgstr "Délka"
4742
4743-#: gmusicbrowser.pl:5722 gmusicbrowser_list.pm:126 layouts/contrib.layout:227
4744+#: gmusicbrowser.pl:5745 gmusicbrowser_list.pm:126 layouts/contrib.layout:227
4745 #: layouts/contrib.layout:302 layouts/contrib.layout:319
4746 #: layouts/contrib.layout:587 layouts/contrib.layout:592
4747 #: layouts/contrib.layout:733 layouts/contrib.layout:741
4748@@ -2312,7 +2328,7 @@
4749 msgid "Library : "
4750 msgstr "Knihovna :"
4751
4752-#: gmusicbrowser_list.pm:449
4753+#: gmusicbrowser_list.pm:451
4754 msgid ""
4755 "Library empty.\n"
4756 "\n"
4757@@ -2322,7 +2338,7 @@
4758 "\n"
4759 "Použijte dialog nastavení pro přidání hudby."
4760
4761-#: gmusicbrowser.pl:6547
4762+#: gmusicbrowser.pl:6521
4763 #, perl-format
4764 msgid "Library size : %d song"
4765 msgid_plural "Library size : %d songs"
4766@@ -2339,16 +2355,16 @@
4767 msgid "Limit similar artists to the first : "
4768 msgstr "Nejprve stanovte limit podobnosti umělce"
4769
4770-#: gmusicbrowser_list.pm:1585 layouts/contrib.layout:336
4771+#: gmusicbrowser_list.pm:1587 layouts/contrib.layout:336
4772 #: layouts/contrib.layout:535
4773 msgid "List"
4774 msgstr "Seznam"
4775
4776-#: gmusicbrowser_list.pm:419
4777+#: gmusicbrowser_list.pm:421
4778 msgid "List empty"
4779 msgstr "Seznam je prázdný"
4780
4781-#: gmusicbrowser_layout.pm:1392 gmusicbrowser_layout.pm:1458
4782+#: gmusicbrowser_layout.pm:1398 gmusicbrowser_layout.pm:1464
4783 msgid "List order"
4784 msgstr "Pořadí seznamu"
4785
4786@@ -2372,7 +2388,7 @@
4787 msgid "Lists, Library & Context"
4788 msgstr "Seznamy, knihovna & kontext"
4789
4790-#: gmusicbrowser_list.pm:3488
4791+#: gmusicbrowser_list.pm:3493
4792 msgid "Literal search"
4793 msgstr "Písmenné vyhledávání"
4794
4795@@ -2401,15 +2417,15 @@
4796 msgid "Loading..."
4797 msgstr "Načítání..."
4798
4799-#: gmusicbrowser.pl:497
4800+#: gmusicbrowser.pl:500
4801 msgid "Lock"
4802 msgstr "Zamknout"
4803
4804-#: gmusicbrowser.pl:518
4805+#: gmusicbrowser.pl:521
4806 msgid "Lock Album"
4807 msgstr "Zamčené album"
4808
4809-#: gmusicbrowser.pl:517
4810+#: gmusicbrowser.pl:520
4811 msgid "Lock Artist"
4812 msgstr "Zamčený interpret"
4813
4814@@ -2438,11 +2454,11 @@
4815 msgid "Lookup at allmusic.com"
4816 msgstr "Vyhledávání na allmusic.com"
4817
4818-#: gmusicbrowser.pl:500
4819+#: gmusicbrowser.pl:503
4820 msgid "Lookup in AMG"
4821 msgstr "Vyhledat na AMG"
4822
4823-#: gmusicbrowser.pl:492
4824+#: gmusicbrowser.pl:495
4825 msgid "Lookup in google"
4826 msgstr "Vyhledat googlem"
4827
4828@@ -2490,7 +2506,7 @@
4829 msgid "Lyrics file name format"
4830 msgstr "Formát názvu souboru textu"
4831
4832-#: gmusicbrowser.pl:4722
4833+#: gmusicbrowser.pl:4747
4834 msgid "Lyrics for "
4835 msgstr "Text pro"
4836
4837@@ -2502,7 +2518,7 @@
4838 msgid "Lyrics source"
4839 msgstr "Zdroj textů"
4840
4841-#: gmusicbrowser.pl:808
4842+#: gmusicbrowser.pl:811
4843 msgid "MB"
4844 msgstr "MB"
4845
4846@@ -2554,11 +2570,11 @@
4847 "Umožnit ovládání multimediálními klávesami Gnome Další/Předchozí/Přehrát/"
4848 "Zastavit"
4849
4850-#: gmusicbrowser.pl:481
4851+#: gmusicbrowser.pl:484
4852 msgid "Mass Rename"
4853 msgstr "Hromadně přejmenovat"
4854
4855-#: gmusicbrowser.pl:4867
4856+#: gmusicbrowser.pl:4892
4857 msgid "Mass Renaming"
4858 msgstr "Hromadné přejmenování"
4859
4860@@ -2590,7 +2606,7 @@
4861 msgid "Minimum size"
4862 msgstr "Minimální velikost"
4863
4864-#: gmusicbrowser.pl:5726
4865+#: gmusicbrowser.pl:5749
4866 msgid "Misc."
4867 msgstr "Různé"
4868
4869@@ -2622,23 +2638,23 @@
4870 msgid "Mosaic View"
4871 msgstr "Pohled Mozaika"
4872
4873-#: gmusicbrowser.pl:484
4874+#: gmusicbrowser.pl:487
4875 msgid "Move"
4876 msgstr "Přesunout"
4877
4878-#: gmusicbrowser.pl:4938
4879+#: gmusicbrowser.pl:4963
4880 msgid "Move Files to :"
4881 msgstr "Přesunout soubory do :"
4882
4883-#: gmusicbrowser.pl:4336
4884+#: gmusicbrowser.pl:4360
4885 msgid "Move failed"
4886 msgstr "Přesouvání selhalo"
4887
4888-#: gmusicbrowser.pl:6445
4889+#: gmusicbrowser.pl:6416
4890 msgid "Move folder to"
4891 msgstr "Přesunout složku do"
4892
4893-#: gmusicbrowser.pl:4338
4894+#: gmusicbrowser.pl:4362
4895 #, perl-format
4896 msgid "Moving file"
4897 msgid_plural "Moving %d files"
4898@@ -2650,7 +2666,11 @@
4899 msgid "Music"
4900 msgstr "Hudba"
4901
4902-#: gmusicbrowser.pl:1223
4903+#: gmusicbrowser.pl:6544
4904+msgid "Music files"
4905+msgstr ""
4906+
4907+#: gmusicbrowser.pl:1228
4908 msgid "Mute/Unmute"
4909 msgstr "Ztlumit/zrušit ztlumení"
4910
4911@@ -2658,7 +2678,7 @@
4912 msgid "Name"
4913 msgstr "Název"
4914
4915-#: gmusicbrowser.pl:1199 gmusicbrowser.pl:1200 gmusicbrowser.pl:1202
4916+#: gmusicbrowser.pl:1204 gmusicbrowser.pl:1205 gmusicbrowser.pl:1207
4917 msgid "Name of layout"
4918 msgstr "Název rozložení"
4919
4920@@ -2666,7 +2686,7 @@
4921 msgid "Name under which the command will appear in the menu"
4922 msgstr "Název pod kterým se příkaz bude objevovat v menu"
4923
4924-#: gmusicbrowser.pl:6530
4925+#: gmusicbrowser.pl:6504
4926 msgid "Never"
4927 msgstr "Nikdy"
4928
4929@@ -2678,38 +2698,38 @@
4930 msgid "New custom field"
4931 msgstr "Nové uživatelské pole"
4932
4933-#: gmusicbrowser_list.pm:2943
4934+#: gmusicbrowser_list.pm:2945
4935 msgid "New filter"
4936 msgstr "Nový filtr"
4937
4938-#: gmusicbrowser_layout.pm:2377
4939+#: gmusicbrowser_layout.pm:2386
4940 msgid "New list"
4941 msgstr "Nový seznam"
4942
4943-#: gmusicbrowser.pl:4902
4944+#: gmusicbrowser.pl:4927
4945 msgid "New name"
4946 msgstr "Nový název"
4947
4948-#: gmusicbrowser.pl:515 gmusicbrowser.pl:2805 gmusicbrowser_layout.pm:85
4949-#: gmusicbrowser_list.pm:5294 plugins/notify.pm:93
4950+#: gmusicbrowser.pl:518 gmusicbrowser.pl:2816 gmusicbrowser_layout.pm:85
4951+#: gmusicbrowser_list.pm:5291 plugins/notify.pm:93
4952 #: layouts/makeitlooklike.layout:269 layouts/makeitlooklike.layout:353
4953 #: layouts/makeitlooklike.layout:427
4954 msgid "Next"
4955 msgstr "Další"
4956
4957-#: gmusicbrowser.pl:1186
4958+#: gmusicbrowser.pl:1189
4959 msgid "Next Album"
4960 msgstr "Další album"
4961
4962-#: gmusicbrowser.pl:1187
4963+#: gmusicbrowser.pl:1190
4964 msgid "Next Artist"
4965 msgstr "Další interpret"
4966
4967-#: gmusicbrowser.pl:1188 gmusicbrowser_layout.pm:84 layouts/contrib.layout:220
4968+#: gmusicbrowser.pl:1191 gmusicbrowser_layout.pm:84 layouts/contrib.layout:220
4969 msgid "Next Song"
4970 msgstr "Další"
4971
4972-#: gmusicbrowser.pl:1184
4973+#: gmusicbrowser.pl:1187
4974 msgid "Next Song In Playlist"
4975 msgstr "Další skladba v playlistu"
4976
4977@@ -2717,7 +2737,7 @@
4978 msgid "No connections"
4979 msgstr "Není spojení"
4980
4981-#: gmusicbrowser.pl:3354
4982+#: gmusicbrowser.pl:3365
4983 msgid "No file browser found."
4984 msgstr "Prohlížeč souborů nenalezen."
4985
4986@@ -2753,11 +2773,11 @@
4987 msgid "No review written."
4988 msgstr "Nebyly napsány žádné recenze"
4989
4990-#: gmusicbrowser_songs.pm:4069
4991+#: gmusicbrowser_songs.pm:4096
4992 msgid "No songs"
4993 msgstr "Žádné skladby"
4994
4995-#: gmusicbrowser_list.pm:421 gmusicbrowser_list.pm:422
4996+#: gmusicbrowser_list.pm:423 gmusicbrowser_list.pm:424
4997 msgid "No songs found"
4998 msgstr "Žádné skladby nenalezeny"
4999
5000@@ -2773,11 +2793,11 @@
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: