/[iselect]/ISelect.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /ISelect.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 21 by dpavlin, Thu Oct 25 20:41:54 2007 UTC revision 23 by dpavlin, Thu Oct 25 21:27:58 2007 UTC
# Line 18  debug Line 18  debug
18  / );  / );
19    
20    
21  our $VERSION = '0.01';  our $VERSION = '0.02';
22    
23  =head1 NAME  =head1 NAME
24    
# Line 156  sub redraw_statusline { Line 156  sub redraw_statusline {
156    
157  =head2 selected  =head2 selected
158    
159  Move selection (or refresh it)  Move selection to some line of document
160    
161    $iselect->selected( +1 );    $iselect->selected( 42 );
   $iselect->selected( -1 );  
   $iselect->selected( 0 );  
162    
163  =cut  =cut
164    
165  sub selected {  sub selected {
166          my $self = shift;          my $self = shift;
167    
168          my $d = shift || 0;          my $new_pos = shift;
169    
170          my $screen_line = $pos - $top_screen_line;          if ( defined $new_pos ) {
171    
172          $self->redraw_line( $screen_line, $self->lines->[$pos] );                  my $screen_line = $pos - $top_screen_line;
173                    $self->redraw_line( $screen_line, $self->lines->[$pos] );
174    
175          my $last_screen_line = $self->screen->rows - $status_lines;                  my $last_screen_line = $self->screen->rows - $status_lines;
176    
177          if ( $d < 0 && $screen_line == 0 ) {                  if ( $new_pos < $pos && $screen_line == 0 ) {
178                  if ( $pos > 0 ) {                          if ( $pos > 0 ) {
179                          $top_screen_line--;                                  $top_screen_line--;
180                          $pos--;                                  $pos--;
181  #                       $self->redraw_screen;                                  $self->screen->at(0,0)->il;
182                          $self->screen->at(0,0)->il;                                  $self->error_text( ' ' );
183                  } else {                          } else {
184                          $self->error_text( "Already at Begin." );                                  $self->error_text( "Already at Begin." );
185                  }                          }
186          } elsif ( $d > 0 && $screen_line == $last_screen_line ) {                  } elsif ( $new_pos > $pos && $screen_line == $last_screen_line ) {
187                  if ( $pos < $nr_lines ) {                          if ( $pos < $nr_lines ) {
188                          $top_screen_line++;                                  $top_screen_line++;
189                          $pos++;                                  $pos++;
190  #                       $self->redraw_screen;                                  $self->screen->at(0,0)->dl;
191                          $self->screen->at(0,0)->dl;                          } else {
192                                    $self->error_text( "Already at End." );
193                            }
194                  } else {                  } else {
195                          $self->error_text( "Already at End." );                          $pos = $new_pos;
196                  }                  }
197          } else {          
                 $pos += $d;  
198          }          }
199    
200          my $line = $self->lines->[$pos];          my $line = $self->lines->[$pos];
# Line 248  sub loop { Line 248  sub loop {
248          $self->selected;          $self->selected;
249    
250          my $lines_on_screen = $self->screen->rows - $status_lines;          my $lines_on_screen = $self->screen->rows - $status_lines;
251            my $max_top_screen_line =
252                            $nr_lines > $lines_on_screen ?  $nr_lines - $lines_on_screen : 0;      
253    
254          while(my $key = $self->screen->getch()) {          while(my $key = $self->screen->getch()) {
255    
256                  $self->error_text('');                  $self->error_text('');
257    
258                  if ($key eq 'ku') {                  if ($key eq 'ku') {
259                          $self->selected( -1 );                          $self->selected( $pos - 1 );
260                  } elsif ($key eq 'kd') {                  } elsif ($key eq 'kd') {
261                          $self->selected( +1 );                          $self->selected( $pos + 1 );
262                  } elsif ($key eq 'pgup' ) {                  } elsif ($key eq 'pgup' ) {
263                          # first line on screen?                          # first line on screen?
264                          if ( $pos == $top_screen_line ) {                          if ( $pos == $top_screen_line ) {
# Line 264  sub loop { Line 266  sub loop {
266                                  $top_screen_line = 0 if $top_screen_line < 0;                                  $top_screen_line = 0 if $top_screen_line < 0;
267                                  $self->redraw_screen;                                  $self->redraw_screen;
268                          }                          }
269                          if ( my $rel_pos = -( $pos - $top_screen_line ) ) {                          if ( $pos == $top_screen_line ) {
                                 $self->selected( $rel_pos );  
                         } else {  
270                                  $self->error_text( "Already at top." );                                  $self->error_text( "Already at top." );
271                            } else {
272                                    $self->selected( $top_screen_line );
273                          }                          }
274                  } elsif ($key eq 'pgdn' ) {                  } elsif ($key eq 'pgdn' ) {
275                          # last line on screen?                          # last line on screen?
276                          if ( $pos - $top_screen_line == $lines_on_screen ) {                          if ( $pos - $top_screen_line == $lines_on_screen ) {
277                                  $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;        
   
278                                  $top_screen_line = $max_top_screen_line if $top_screen_line > $max_top_screen_line;                                  $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";  
279                                  $self->redraw_screen;                                  $self->redraw_screen;
280                          }                          }
281                          if (my $relative_pos = $top_screen_line + $lines_on_screen - $pos) {                          if ( $pos == $nr_lines ) {
                                 $self->selected( $relative_pos );  
                         } else {  
282                                  $self->error_text( "Already at bottom." );                                  $self->error_text( "Already at bottom." );
283                            } else {
284                                    $self->selected( $top_screen_line + $lines_on_screen );
285                            }
286                    } elsif ($key eq 'g' ) {
287                            if ( $top_screen_line == 0 ) {
288                                    if ( $pos == 0 ) {
289                                            $self->error_text( "Already at top." );
290                                    } else {
291                                            $self->selected( 0 );
292                                    }
293                            } else {
294                                    $top_screen_line = 0;
295                                    $pos = 0;
296                                    $self->redraw_screen;
297                            }
298                    } elsif ($key eq 'G' ) {
299                            if ( $top_screen_line == $max_top_screen_line ) {
300                                    if ( $pos == $nr_lines ) {
301                                            $self->error_text( "Already at bottom." );
302                                    } else {
303                                            $self->selected( $nr_lines );
304                                    }
305                            } else {
306                                    $top_screen_line = $max_top_screen_line;
307                                    $pos = $nr_lines;
308                                    $self->redraw_screen;
309                          }                          }
310                  }                  }
311    

Legend:
Removed from v.21  
changed lines
  Added in v.23

  ViewVC Help
Powered by ViewVC 1.1.26