--- ISelect.pm 2007/10/25 18:39:49 15 +++ ISelect.pm 2007/10/25 20:41:54 21 @@ -80,6 +80,9 @@ my $cols = $self->screen->cols; my $t = shift; + + $t =~ s/{s}//; + $t = '' unless defined $t; $t = substr($t,0,$cols) if length($t) > $cols; return $t . (" " x ($cols - length($t))); @@ -147,7 +150,7 @@ .$pos_txt)->normal(); $scr->at($scr->rows - $status_lines + 2,0)->puts( - sprintf('%-'.$scr->cols.'s', $self->error_text) + sprintf('%-'.$scr->cols.'s', $self->error_text ) ) if $self->error_text; } @@ -176,18 +179,20 @@ if ( $pos > 0 ) { $top_screen_line--; $pos--; +# $self->redraw_screen; + $self->screen->at(0,0)->il; } else { $self->error_text( "Already at Begin." ); } - $self->redraw_screen; } elsif ( $d > 0 && $screen_line == $last_screen_line ) { if ( $pos < $nr_lines ) { $top_screen_line++; $pos++; +# $self->redraw_screen; + $self->screen->at(0,0)->dl; } else { $self->error_text( "Already at End." ); } - $self->redraw_screen; } else { $pos += $d; } @@ -221,11 +226,11 @@ my $callback = shift; confess "expect callback as first arg" unless ref($callback) eq 'CODE'; - my @lines = $self->lines; + my @lines = @{ $self->lines }; # find which lines are selectable in input file for my $l (0 .. $#lines) { - if ($lines[$l] =~ s/^{s}//) { + if ($lines[$l] =~ m/^{s}/) { $selectable_line->{$l}++; } } @@ -242,9 +247,11 @@ $self->redraw_screen; $self->selected; + my $lines_on_screen = $self->screen->rows - $status_lines; + while(my $key = $self->screen->getch()) { - my $lines_on_screen = $self->screen->rows - $status_lines; + $self->error_text(''); if ($key eq 'ku') { $self->selected( -1 ); @@ -257,15 +264,28 @@ $top_screen_line = 0 if $top_screen_line < 0; $self->redraw_screen; } - $self->selected( -( $pos - $top_screen_line ) ); + if ( my $rel_pos = -( $pos - $top_screen_line ) ) { + $self->selected( $rel_pos ); + } else { + $self->error_text( "Already at top." ); + } } elsif ($key eq 'pgdn' ) { # last line on screen? if ( $pos - $top_screen_line == $lines_on_screen ) { $top_screen_line += $lines_on_screen; - $top_screen_line = $#lines - $lines_on_screen if $top_screen_line >= $#lines - $lines_on_screen; + + my $max_top_screen_line = + $nr_lines > $lines_on_screen ? $nr_lines - $lines_on_screen : 0; + + $top_screen_line = $max_top_screen_line if $top_screen_line > $max_top_screen_line; + warn "max_top_screen_line = $max_top_screen_line top_screen_line = $top_screen_line\n"; $self->redraw_screen; } - $self->selected( $top_screen_line + $lines_on_screen - $pos ); + if (my $relative_pos = $top_screen_line + $lines_on_screen - $pos) { + $self->selected( $relative_pos ); + } else { + $self->error_text( "Already at bottom." ); + } } if ( length($key) > 1 ) {