f='#n178'>178
179
package interactive::stdio; # $Id$
use diagnostics;
use strict;
use vars qw(@ISA);
@ISA = qw(interactive);
use interactive;
use common;
$| = 1;
sub readln() {
my $l = <STDIN>;
chomp $l;
$l;
}
sub check_it {
my ($i, $n) = @_;
$i =~ /^\s*\d+\s*$/ && 1 <= $i && $i <= $n;
}
sub good_choice {
my ($def_s, $max) = @_;
my $i;
do {
defined $i and print N("Bad choice, try again\n");
print N("Your choice? (default %s) ", $def_s);
$i = readln();
} until !$i || check_it($i, $max);
$i;
}
sub ask_fromW {
my ($_o, $common, $l, $_l2) = @_;
add2hash_($common, { ok => N("Ok"), cancel => N("Cancel") }) if !exists $common->{ok};
ask_fromW_begin:
my $already_entries = 0;
my $predo_widget = sub {
my ($e) = @_;
$e->{type} = 'list' if $e->{type} =~ /(icon|tree)list/;
#- combo does not exist, fallback to a sensible default
$e->{type} = $e->{not_edit} ? 'list' : 'entry' if $e->{type} eq 'combo';
if ($e->{type} eq 'entry') {
my $t = "\t$e->{label} $e->{text}\n";
if ($already_entries) {
length($already_entries) > 1 and print N("Entries you'll have to fill:\n%s", $already_entries);
$already_entries = 1;
print $t;
} else {
$already_entries = $t;
}
}
};
my @labels;
my $format_label = sub { my ($e) = @_; return sprintf("`%s' %s %s\n", ${$e->{val}}, $e->{label}, $e->{text}) };
my $do_widget = sub {
my ($e, $ind) = @_;
if ($e->{type} eq 'bool') {
print "$e->{text} $e->{label}\n";
print N("Your choice? (0/1, default `%s') ", ${$e->{val}} || '0');
my $i = readln();
if ($i) {
to_bool($i) != to_bool(${$e->{val}}) && $e->{changed} and $e->{changed}->();
${$e->{val}} = $i;
}
} elsif ($e->{type} =~ /list/) {
$e->{text} || $e->{label} and print "=> $e->{label} $e->{text}\n";
my $n = 0; my $size = 0;
foreach (@{$e->{list}}) {
$n++;
my $t = "$n: " . may_apply($e->{format}, $_) . "\t";
if ($size + length($t) >= 80) {
print "\n";
$size = 0;
}
print $t;
$size += length($t);
}
print "\n";
my $i = good_choice(may_apply($e->{format}, ${$e->{val}}), $n);
print "Setting to <", $i ? ${$e->{list}}[$i-1] : ${$e->{val}}, ">\n";
if ($i) {
${$e->{val}} = ${$e->{list}}[$i-1];
$e->{changed} and $e->{changed}->();
}
} elsif ($e->{type} eq 'button') {
print N("Button `%s': %s", $e->{label}, may_apply($e->{format}, ${$e->{val}})), " $e->{text}\n";
print N("Do you want to click on this button?");
my $i = readln();
if ($i && $i !~ /^n/i) {
$e->{clicked_may_quit}();
$e->{changed} and $e->{changed}->();
}
} elsif ($e->{type} eq 'label') {
my $t = $format_label->($e);
push @labels, $t;
print $t;
} elsif ($e->{type} eq 'entry') {
print "$e->{label} $e->{text}\n";
print N("Your choice? (default `%s'%s) ", ${$e->{val}}, ${$e->{val}} ? N(" enter `void' for void entry") : '');
my $i = readln();