Merge lp:~noskcaj/ubuntu/trusty/gmusicbrowser/1.1.12 into lp:ubuntu/trusty/gmusicbrowser
- Trusty (14.04)
- 1.1.12
- Merge into trusty
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Daniel Holbach (community) | Needs Fixing | ||
Review via email: mp+206589@code.launchpad.net |
Commit message
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.
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="<i>by</i> $artist <i>in</i> $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="<i>no next song</i>") |
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="<i>no selected song</i>") _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><b>...</b></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><Empty playlist></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><small>%s</small></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><u>%s</u></code></li> |
2694 | -<li>markup<em>field : markup for fields name, defaults to <code><small>%s :</small></code></li> |
2695 | -<li>markup</em>value : markup for values, defaults to <code><small><b>%s</b></small></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&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 => OpenBrowser |
2864 | -BContext => OpenContext |
2865 | -Date => Year |
2866 | -Label => Text |
2867 | -Vol => VolumeIcon |
2868 | -LabelVol => Volume |
2869 | -FLock => FilterLock |
2870 | -TogButton => ToggleButton |
2871 | -ProgressV => VProgress |
2872 | -FBox => FilterBox |
2873 | -Scale => TimeSlider |
2874 | -VolSlider => VolumeSlider |
2875 | -VolBar => VolumeBar |
2876 | -FPane => FilterPane |
2877 | -LabelTime => 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' |
2980 | Binary 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' |
2982 | Binary 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' |
2984 | Binary 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' |
2986 | Binary 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' |
2988 | Binary 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' |
2990 | Binary 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' |
2992 | Binary 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' |
2994 | Binary 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' |
2996 | Binary 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' |
2998 | Binary 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' |
3000 | Binary 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' |
3002 | Binary 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' |
3004 | Binary 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' |
3006 | Binary 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' |
3008 | Binary 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' |
3010 | Binary 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' |
3012 | Binary 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' |
3014 | Binary 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.
Text conflict in gmbrc.default