--- ISelect.pm 2007/10/25 20:41:54 21 +++ ISelect.pm 2007/10/25 21:27:58 23 @@ -18,7 +18,7 @@ / ); -our $VERSION = '0.01'; +our $VERSION = '0.02'; =head1 NAME @@ -156,45 +156,45 @@ =head2 selected -Move selection (or refresh it) +Move selection to some line of document - $iselect->selected( +1 ); - $iselect->selected( -1 ); - $iselect->selected( 0 ); + $iselect->selected( 42 ); =cut sub selected { my $self = shift; - my $d = shift || 0; + my $new_pos = shift; - my $screen_line = $pos - $top_screen_line; + if ( defined $new_pos ) { - $self->redraw_line( $screen_line, $self->lines->[$pos] ); + my $screen_line = $pos - $top_screen_line; + $self->redraw_line( $screen_line, $self->lines->[$pos] ); - my $last_screen_line = $self->screen->rows - $status_lines; + my $last_screen_line = $self->screen->rows - $status_lines; - if ( $d < 0 && $screen_line == 0 ) { - if ( $pos > 0 ) { - $top_screen_line--; - $pos--; -# $self->redraw_screen; - $self->screen->at(0,0)->il; - } else { - $self->error_text( "Already at Begin." ); - } - } 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; + if ( $new_pos < $pos && $screen_line == 0 ) { + if ( $pos > 0 ) { + $top_screen_line--; + $pos--; + $self->screen->at(0,0)->il; + $self->error_text( ' ' ); + } else { + $self->error_text( "Already at Begin." ); + } + } elsif ( $new_pos > $pos && $screen_line == $last_screen_line ) { + if ( $pos < $nr_lines ) { + $top_screen_line++; + $pos++; + $self->screen->at(0,0)->dl; + } else { + $self->error_text( "Already at End." ); + } } else { - $self->error_text( "Already at End." ); + $pos = $new_pos; } - } else { - $pos += $d; + } my $line = $self->lines->[$pos]; @@ -248,15 +248,17 @@ $self->selected; my $lines_on_screen = $self->screen->rows - $status_lines; + my $max_top_screen_line = + $nr_lines > $lines_on_screen ? $nr_lines - $lines_on_screen : 0; while(my $key = $self->screen->getch()) { $self->error_text(''); if ($key eq 'ku') { - $self->selected( -1 ); + $self->selected( $pos - 1 ); } elsif ($key eq 'kd') { - $self->selected( +1 ); + $self->selected( $pos + 1 ); } elsif ($key eq 'pgup' ) { # first line on screen? if ( $pos == $top_screen_line ) { @@ -264,27 +266,46 @@ $top_screen_line = 0 if $top_screen_line < 0; $self->redraw_screen; } - if ( my $rel_pos = -( $pos - $top_screen_line ) ) { - $self->selected( $rel_pos ); - } else { + if ( $pos == $top_screen_line ) { $self->error_text( "Already at top." ); + } else { + $self->selected( $top_screen_line ); } } elsif ($key eq 'pgdn' ) { # last line on screen? if ( $pos - $top_screen_line == $lines_on_screen ) { $top_screen_line += $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; } - if (my $relative_pos = $top_screen_line + $lines_on_screen - $pos) { - $self->selected( $relative_pos ); - } else { + if ( $pos == $nr_lines ) { $self->error_text( "Already at bottom." ); + } else { + $self->selected( $top_screen_line + $lines_on_screen ); + } + } elsif ($key eq 'g' ) { + if ( $top_screen_line == 0 ) { + if ( $pos == 0 ) { + $self->error_text( "Already at top." ); + } else { + $self->selected( 0 ); + } + } else { + $top_screen_line = 0; + $pos = 0; + $self->redraw_screen; + } + } elsif ($key eq 'G' ) { + if ( $top_screen_line == $max_top_screen_line ) { + if ( $pos == $nr_lines ) { + $self->error_text( "Already at bottom." ); + } else { + $self->selected( $nr_lines ); + } + } else { + $top_screen_line = $max_top_screen_line; + $pos = $nr_lines; + $self->redraw_screen; } }