diff options
author | chromatic <chromatic@wgz.org> | 2001-09-16 10:46:29 -0600 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2001-09-17 02:54:13 +0000 |
commit | ec385757ddd27dbd1bbd254e8b322dae1caa6318 (patch) | |
tree | d740f284ba11ed2531734ac6076d667fac3c6f32 /lib/CPAN | |
parent | 14fe70c2d1778829732c0549106909ab5b329425 (diff) | |
download | perl-ec385757ddd27dbd1bbd254e8b322dae1caa6318.tar.gz |
Re: CPAN.pm needs some hacking
Message-ID: <20010916225113.5606.qmail@onion.perl.org>
p4raw-id: //depot/perl@12042
Diffstat (limited to 'lib/CPAN')
-rw-r--r-- | lib/CPAN/FirstTime.pm | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/lib/CPAN/FirstTime.pm b/lib/CPAN/FirstTime.pm index 0429db1527..dd1a89fc73 100644 --- a/lib/CPAN/FirstTime.pm +++ b/lib/CPAN/FirstTime.pm @@ -518,28 +518,50 @@ sub picklist { my($items,$prompt,$default,$require_nonempty,$empty_warning)=@_; $default ||= ''; - my ($item, $i); - for $item (@$items) { - printf "(%d) %s\n", ++$i, $item; - } + my $pos = 0; my @nums; while (1) { - my $num = prompt($prompt,$default); - @nums = split (' ', $num); - (warn "invalid items entered, try again\n"), next - if grep (/\D/ || $_ < 1 || $_ > $i, @nums); - if ($require_nonempty) { - (warn "$empty_warning\n"), next - unless @nums; - } - last; + + # display, at most, 15 items at a time + my $limit = $#{ $items } - $pos; + $limit = 15 if $limit > 15; + + # show the next $limit items, get the new position + $pos = display_some($items, $limit, $pos); + $pos = 0 if $pos >= @$items; + + my $num = prompt($prompt,$default); + + @nums = split (' ', $num); + my $i = scalar @$items; + (warn "invalid items entered, try again\n"), next + if grep (/\D/ || $_ < 1 || $_ > $i, @nums); + if ($require_nonempty) { + (warn "$empty_warning\n"); + } + print "\n"; + + # a blank line continues... + next unless @nums; + last; } - print "\n"; for (@nums) { $_-- } @{$items}[@nums]; } +sub display_some { + my ($items, $limit, $pos) = @_; + $pos ||= 0; + + my @displayable = @$items[$pos .. ($pos + $limit)]; + for my $item (@displayable) { + printf "(%d) %s\n", ++$pos, $item; + } + printf "%d more items, hit ENTER\n", (@$items - $pos) if $pos < @$items; + return $pos; +} + sub read_mirrored_by { my $local = shift or return; my(%all,$url,$expected_size,$default,$ans,$host,$dst,$country,$continent,@location); |