/[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 14 by dpavlin, Thu Oct 25 17:24:33 2007 UTC revision 21 by dpavlin, Thu Oct 25 20:41:54 2007 UTC
# Line 64  my $status_lines = 3; Line 64  my $status_lines = 3;
64    
65  my $selectable_line;  my $selectable_line;
66    
67    my $nr_lines = 0;
68    
69  =head2 full_line  =head2 full_line
70    
71  Returns line padded up to screen width  Returns line padded up to screen width
# Line 78  sub full_line { Line 80  sub full_line {
80          my $cols = $self->screen->cols;          my $cols = $self->screen->cols;
81    
82          my $t = shift;          my $t = shift;
83    
84            $t =~ s/{s}//;
85    
86          $t = '' unless defined $t;          $t = '' unless defined $t;
87          $t = substr($t,0,$cols) if length($t) > $cols;          $t = substr($t,0,$cols) if length($t) > $cols;
88          return $t . (" " x ($cols - length($t)));          return $t . (" " x ($cols - length($t)));
# Line 110  sub redraw_line { Line 115  sub redraw_line {
115    
116  sub redraw_screen {  sub redraw_screen {
117          my $self = shift;          my $self = shift;
118          my @lines = $self->lines;          my @lines = @{ $self->lines };
119            $nr_lines = $#lines;
120          for my $l (0 .. $self->screen->rows - $status_lines) {          for my $l (0 .. $self->screen->rows - $status_lines) {
121                  my $line = $lines[ $l + $top_screen_line ];                  my $line = $lines[ $l + $top_screen_line ];
122                  $self->redraw_line( $l, $line );                  $self->redraw_line( $l, $line );
# Line 130  Redraw status line Line 136  Redraw status line
136  sub redraw_statusline {  sub redraw_statusline {
137          my $self = shift;          my $self = shift;
138    
139          my @lines = $self->lines;          my $pcnt = int(($pos || 0) * 100 / ( $nr_lines || 1 ) );
140            my $pos_txt = sprintf('%d/%s, %d%% ',$pos,$nr_lines,$pcnt);
         my $pcnt = int(($pos || 0) * 100 / ( $#lines || 1));  
         my $pos_txt = sprintf('%d, %d%% ',$pos,$pcnt);  
141    
142          my $scr = $self->screen || confess "need screen";          my $scr = $self->screen || confess "need screen";
143    
144            my $status_text = sprintf("pos: %-3d sel_pos: %-3d top_screen_line: %-3d", $pos, $sel_pos, $top_screen_line );
145    
146            $status_text .= ' ' . $self->status_text if $self->status_text;
147    
148          $scr->at($scr->rows - $status_lines + 1,0)->reverse()->puts(          $scr->at($scr->rows - $status_lines + 1,0)->reverse()->puts(
149                  sprintf(' %-'.($scr->cols - length($pos_txt) - 2).'s ',$self->status_text)                  sprintf(' %-'.($scr->cols - length($pos_txt) - 2).'s ',$status_text)
150          .$pos_txt)->normal() if $self->status_text;          .$pos_txt)->normal();
151    
152          $scr->at($scr->rows - $status_lines + 2,0)->puts(          $scr->at($scr->rows - $status_lines + 2,0)->puts(
153                  sprintf('%-'.$scr->cols.'s', $self->error_text)                  sprintf('%-'.$scr->cols.'s', $self->error_text )
154          ) if $self->error_text;          ) if $self->error_text;
155  }  }
156    
# Line 163  sub selected { Line 171  sub selected {
171    
172          my $screen_line = $pos - $top_screen_line;          my $screen_line = $pos - $top_screen_line;
173    
174          $self->redraw_line( $screen_line, ($self->lines)[$pos] );          $self->redraw_line( $screen_line, $self->lines->[$pos] );
175    
176          my $last_screen_line = $self->screen->rows - $status_lines;          my $last_screen_line = $self->screen->rows - $status_lines;
177    
# Line 171  sub selected { Line 179  sub selected {
179                  if ( $pos > 0 ) {                  if ( $pos > 0 ) {
180                          $top_screen_line--;                          $top_screen_line--;
181                          $pos--;                          $pos--;
182    #                       $self->redraw_screen;
183                            $self->screen->at(0,0)->il;
184                  } else {                  } else {
185                          $self->error_text( "Already at Begin." );                          $self->error_text( "Already at Begin." );
186                  }                  }
                 $self->redraw_screen;  
187          } elsif ( $d > 0 && $screen_line == $last_screen_line ) {          } elsif ( $d > 0 && $screen_line == $last_screen_line ) {
188                  if ( $pos < scalar($self->lines) ) {                  if ( $pos < $nr_lines ) {
189                          $top_screen_line++;                          $top_screen_line++;
190                          $pos++;                          $pos++;
191    #                       $self->redraw_screen;
192                            $self->screen->at(0,0)->dl;
193                  } else {                  } else {
194                          $self->error_text( "Already at End." );                          $self->error_text( "Already at End." );
195                  }                  }
                 $self->redraw_screen;  
196          } else {          } else {
197                  $pos += $d;                  $pos += $d;
198          }          }
199    
200          my $line = ($self->lines)[$pos];          my $line = $self->lines->[$pos];
201          if ( defined $selectable_line->{ $pos } ) {          if ( defined $selectable_line->{ $pos } ) {
202                  $self->screen->at($pos - $top_screen_line,0)->reverse->bold()->puts( $self->full_line( $line ) )->normal();                  $self->screen->at($pos - $top_screen_line,0)->reverse->bold()->puts( $self->full_line( $line ) )->normal();
203                  $sel_pos = $pos;                  $sel_pos = $pos;
# Line 216  sub loop { Line 226  sub loop {
226          my $callback = shift;          my $callback = shift;
227          confess "expect callback as first arg" unless ref($callback) eq 'CODE';          confess "expect callback as first arg" unless ref($callback) eq 'CODE';
228    
229          my @lines = $self->lines;          my @lines = @{ $self->lines };
230    
231          # find which lines are selectable in input file          # find which lines are selectable in input file
232          for my $l (0 .. $#lines) {          for my $l (0 .. $#lines) {
233                  if ($lines[$l] =~ s/^{s}//) {                  if ($lines[$l] =~ m/^{s}/) {
234                          $selectable_line->{$l}++;                          $selectable_line->{$l}++;
235                  }                  }
236          }          }
# Line 237  sub loop { Line 247  sub loop {
247          $self->redraw_screen;          $self->redraw_screen;
248          $self->selected;          $self->selected;
249    
250            my $lines_on_screen = $self->screen->rows - $status_lines;
251    
252          while(my $key = $self->screen->getch()) {          while(my $key = $self->screen->getch()) {
253    
254                  my $lines_on_screen = $self->screen->rows - $status_lines;                  $self->error_text('');
255    
256                  if ($key eq 'ku') {                  if ($key eq 'ku') {
257                          $self->selected( -1 );                          $self->selected( -1 );
# Line 252  sub loop { Line 264  sub loop {
264                                  $top_screen_line = 0 if $top_screen_line < 0;                                  $top_screen_line = 0 if $top_screen_line < 0;
265                                  $self->redraw_screen;                                  $self->redraw_screen;
266                          }                          }
267                          $self->selected( -( $pos - $top_screen_line ) );                          if ( my $rel_pos = -( $pos - $top_screen_line ) ) {
268                                    $self->selected( $rel_pos );
269                            } else {
270                                    $self->error_text( "Already at top." );
271                            }
272                  } elsif ($key eq 'pgdn' ) {                  } elsif ($key eq 'pgdn' ) {
273                          # last line on screen?                          # last line on screen?
274                          if ( $pos - $top_screen_line == $lines_on_screen ) {                          if ( $pos - $top_screen_line == $lines_on_screen ) {
275                                  $top_screen_line += $lines_on_screen;                                  $top_screen_line += $lines_on_screen;
276                                  $top_screen_line = $#lines - $lines_on_screen if $top_screen_line >= $#lines - $lines_on_screen;          
277                                    my $max_top_screen_line =
278                                            $nr_lines > $lines_on_screen ?  $nr_lines - $lines_on_screen : 0;      
279    
280                                    $top_screen_line = $max_top_screen_line if $top_screen_line > $max_top_screen_line;
281                                    warn "max_top_screen_line = $max_top_screen_line top_screen_line = $top_screen_line\n";
282                                  $self->redraw_screen;                                  $self->redraw_screen;
283                          }                          }
284                          $self->selected( $top_screen_line + $lines_on_screen - $pos );                          if (my $relative_pos = $top_screen_line + $lines_on_screen - $pos) {
285                                    $self->selected( $relative_pos );
286                            } else {
287                                    $self->error_text( "Already at bottom." );
288                            }
289                  }                  }
290    
                 my $status_text = sprintf("pos: %-3d sel_pos: %-3d top_screen_line: %-3d", $pos, $sel_pos, $top_screen_line );  
291                  if ( length($key) > 1 ) {                  if ( length($key) > 1 ) {
292                          $status_text .= " key: $key";                          $self->status_text("key: $key");
293                  } else {                  } else {
294                          $status_text .= sprintf("key: %s [%03d][%02x]", $key =~ m/\w/ ? $key : '?' , ord($key), ord($key) );                          $self->status_text( sprintf("key: %s [%03d][%02x]", $key =~ m/\w/ ? $key : '?' , ord($key), ord($key) ) );
295                  }                  }
                 $self->status_text( $status_text );  
296    
297                  # CTRL+L                  # CTRL+L
298                  $self->redraw_screen if ord($key) eq 0x0c;                  $self->redraw_screen if ord($key) eq 0x0c;

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

  ViewVC Help
Powered by ViewVC 1.1.26