#!/usr/bin/perl
# The Virtual Songbook
-# (c) 2003--2004 Martin Mares <mj@ucw.cz>
+# (c) 2003--2005 Martin Mares <mj@ucw.cz>
use Curses;
use strict;
my @help_message = (
"",
- " The Virtual Songbook 0.9\n",
- " (c) 2003--2004 Martin Mares <mj\@ucw.cz>",
+ " The Virtual Songbook 0.9.1\n",
+ " (c) 2003--2005 Martin Mares <mj\@ucw.cz>",
"",
"Control keys:",
"",
" j k h l synonyms of the arrow keys (like in vi) [works in any window]",
" Ctrl-R reload the list",
" r toggle resolving of song/directory names",
- " / incremental search (/=next, \\=previous)",
+ " / incremental search (/=next, \\=previous, ?=search over all songs)",
"",
);
-my $help_status = "The Virtual Songbook 0.9";
+my $help_status = "The Virtual Songbook 0.9.1";
### Interface with Curses ###
$w->{"i"} = 0;
$w->{"1st"} = 0;
$w->{"search"} = undef;
+ $w->{"search-results"} = 0;
}
sub redraw_line($$) {
} else { $w->redraw_line($i); }
$w->{"win"}->noutrefresh;
}
- if ($auto_enter && $i < $w->{"n"} && $w->{"flist"}->[$i] !~ /\/$/) { $w->select; }
+ if ($auto_enter) { $w->select(0); }
}
sub go($$) {
$w->goto($i);
}
-sub select($) {
- my ($w) = @_;
+sub goto_name($$) {
+ my ($w, $name) = @_;
+ for (my $i=0; $i<$w->{"n"}; $i++) {
+ if ($w->{"flist"}->[$i] eq $name) {
+ $w->{"i"} = $i;
+ $w->{"1st"} = $i - int($w->{"h"}/2);
+ last;
+ }
+ }
+}
+
+sub select($$) {
+ my ($w, $explicit) = @_;
if ($w->{"i"} < $w->{"n"}) {
my $f = $w->{"flist"}->[$w->{"i"}];
my $x = $w->{"list"}->[$w->{"i"}];
if ($f =~ /\/$/) {
- if ($f eq "../") {
- $w->{"dir"} =~ s@([^/]*/)$@@;
- my $back = $1;
- $w->{"xdir"} =~ s@[^/]*/$@@;
- $w->reload;
- for (my $i=0; $i<$w->{"n"}; $i++) {
- if ($w->{"flist"}->[$i] eq $back) {
- $w->{"i"} = $i;
- $w->{"1st"} = $i - int($w->{"h"}/2);
- last;
- }
+ if ($explicit) {
+ if ($f eq "../") {
+ $w->{"dir"} =~ s@([^/]*/)$@@;
+ my $back = $1;
+ $w->{"xdir"} =~ s@[^/]*/$@@;
+ $w->reload;
+ $w->goto_name($back);
+ } else {
+ $w->{"dir"} .= $f;
+ $w->{"xdir"} .= $x;
+ $w->reload;
}
- } else {
- $w->{"dir"} .= $f;
- $w->{"xdir"} .= $x;
- $w->reload;
+ $w->redraw;
}
- $w->redraw;
} else {
+ if ($w->{"search-results"} && $explicit) {
+ $f =~ m@^(.*/)([^/]+)$@ or die;
+ $w->{"dir"} = $1;
+ $f = $2;
+ $w->{"xdir"} = "???"; ### FIXME
+ $w->reload;
+ $w->goto_name($f);
+ $w->redraw;
+ }
$main_window->view($w->{"dir"} . $f, $w->{"xdir"} . $x);
}
}
}
+sub global_search() {
+ my ($w) = @_;
+ my @full = ( "<back>" );
+ my @fn = ( $w->{"dir"} );
+ $w->{"dir"} = "./";
+ $w->{"xdir"} = "./";
+
+ my $query = $w->{"search"};
+ $query =~ tr/"'\\\`//d;
+ my @resp = `../search/songsearch -C ../search/config -i ../search/index -n 20 $query`;
+ chomp @resp;
+ while (@resp) {
+ my $r = shift @resp;
+ $r =~ /^\d+\. \[\d+\] (.*)/ or next;
+ my $file = $1;
+ my $name = shift @resp;
+ $name =~ s/^\t// or $name = $file;
+ while (@resp && $resp[0] =~ /^\t/) {
+ $r = shift @resp;
+ $r =~ s/^\t//;
+ $name .= " ($r)";
+ }
+ push @fn, $file;
+ push @full, $name;
+ }
+
+ $w->{"flist"} = \@fn;
+ $w->{"list"} = \@full;
+ $w->{"n"} = scalar @fn;
+ $w->{"i"} = 0;
+ $w->{"1st"} = 0;
+ $w->{"search"} = undef;
+ $w->{"search-results"} = 1;
+ $w->redraw;
+}
+
sub key($$) {
my ($w,$key) = @_;
if ($key eq KEY_UP) { $w->go(-1); }
elsif ($key eq KEY_NPAGE) { $w->go($w->{"h"}-1); }
elsif ($key eq KEY_HOME) { $w->go(-1000000000); }
elsif ($key eq KEY_END) { $w->go(1000000000); }
- elsif ($key eq KEY_RIGHT || $key eq "\r" || $key eq "\n") { $w->{"search"}=undef; $w->goto($w->{"i"}); $w->select; }
- elsif ($key eq KEY_LEFT) {
- if ($w->{"list"}->[0] eq "<parent>") {
+ elsif ($key eq KEY_RIGHT || $key eq "\r" || $key eq "\n") {
+ $w->{"search"}=undef;
+ $w->goto($w->{"i"});
+ $w->select(1);
+ } elsif ($key eq KEY_LEFT) {
+ if ($w->{"list"}->[0] =~ /^<(parent|back)>$/) {
$w->{"i"} = 0;
- $w->select;
+ $w->select(1);
}
} elsif ($key eq "\x12") {
$w->reload;
} elsif ($key eq "\\") {
$w->search_next($w->{"i"}-1, -1);
} elsif ($key eq "?") {
- return 0;
+ $w->global_search;
} elsif ($key eq KEY_BACKSPACE) {
if (length $w->{"search"}) {
$w->{"search"} =~ s/.$//;
} elsif ($key eq "/") {
$w->{"search"} = "";
$w->goto($w->{"i"});
- } elsif ($key eq "\n" || $key eq "\r") {
- $w->select;
} else { return 0; }
}
return 1;