diff options
Diffstat (limited to 'globetrotter/hwprofile')
0 files changed, 0 insertions, 0 deletions
![]() |
index : drakx | |
Mageia Installer and base platform for many utilities | Thierry Vignaud [tv] |
summaryrefslogtreecommitdiffstats |
package interactive_gtk; # $Id$
use diagnostics;
use strict;
use vars qw(@ISA);
@ISA = qw(interactive);
use interactive;
use common;
use my_gtk qw(:helpers :wrappers);
my $forgetTime = 1000; #- in milli-seconds
sub new {
($::windowheight, $::windowwidth) = my_gtk::gtkroot()->get_size if !$::isInstall;
goto &interactive::new;
}
sub enter_console { my ($o) = @_; $o->{suspended} = common::setVirtual(1) }
sub leave_console { my ($o) = @_; common::setVirtual(delete $o->{suspended}) }
sub exit {
gtkset_mousecursor_normal(); #- for restoring a normal in any case on standalone
my_gtk::flush();
$::isEmbedded and kill 10, $::CCPID; #10 is USR1
c::_exit($_[1]) #- workaround
}
sub ask_warn {
local $my_gtk::pop_it = 1;
&interactive::ask_warn;
}
sub ask_fileW {
my ($o, $title, $dir) = @_;
my $w = my_gtk->new($title);
$dir .= '/' if $dir !~ m|/$|;
my_gtk::_ask_file($w, $title, $dir);
$w->main;
}
sub create_boxradio {
my ($e, $may_go_to_next, $changed, $double_click) = @_;
my @l = map { may_apply($e->{format}, $_) } @{$e->{list}};
my $boxradio = gtkpack2__(new Gtk::VBox(0, 0),
my @radios = gtkradio('', @l));
$boxradio->show;
my $tips = new Gtk::Tooltips;
mapn {
my ($txt, $w) = @_;
$w->signal_connect(button_press_event => $double_click) if $double_click;
$w->signal_connect(key_press_event => sub {
my ($w, $event) = @_;
$may_go_to_next->($w, $event, 'tab');
1;
});
$w->signal_connect(clicked => sub {
${$e->{val}} = $txt;
&$changed;
});
if ($e->{help}) {
gtkset_tip($tips, $w,
ref($e->{help}) eq 'HASH' ? $e->{help}{$txt} :
ref($e->{help}) eq 'CODE' ? $e->{help}($txt) : $e->{help});
}
} $e->{list}, \@radios;
$boxradio, sub {
my ($v) = @_;
mapn { $_[0]->set_active($_[1] eq $v) } \@radios, $e->{list};
}, $radios[0];
}
sub create_clist {
my ($e, $may_go_to_next, $changed, $double_click) = @_;
my $curr;
my @l = map { may_apply($e->{format}, $_) } @{$e->{list}};
my $list = new Gtk::CList(1);
$list->set_selection_mode('browse');
$list->set_column_auto_resize(0, 1);
my $select = sub {
$list->set_focus_row($_[0]);
$list->select_row($_[0], 0);
$list->moveto($_[0], 0, 0.5, 0) if $list->row_is_visible($_[0]) ne 'full';
};
# ref $title && !@okcancel ?
# $list->signal_connect(button_release_event => $leave) :
# $list->signal_connect(button_press_event => sub { &$leave if $_[1]{type} =~ /^2/ });
my ($first_time, $starting_word, $start_reg) = (1, '', "^");
my $timeout;
$list->signal_connect(key_press_event => sub {
my ($w, $event) = @_;
my $c = chr($event->{keyval} & 0xff);
Gtk->timeout_remove($timeout) if $timeout; $timeout = '';
if ($event->{keyval} >= 0x100) {
&$may_go_to_next if $c eq "\r" || $c eq "\x8d";
$starting_word = '' if $event->{keyval} != 0xffe4; # control
} else {
if ($event->{state} & 4) {
#- control pressed
$c eq "s" or return 1;
$start_reg and $start_reg = '', return 1;
$curr++;
} else {
&$may_go_to_next if $c eq ' ';
$curr++ if $starting_word eq '' || $starting_word eq $c;
$starting_word .= $c unless $starting_word eq $c;
}
my $word = quotemeta $starting_word;
my $j; for ($j = 0; $j < @l; $j++) {
$l[($j + $curr) % @l] =~ /$start_reg$word/i and last;
}
$j == @l ?
$starting_word = '' :
$select->(($j + $curr) % @l);
$timeout = Gtk->timeout_add($forgetTime, sub { $timeout = $starting_word = ''; 0 } );
}
1;
});
$list->show;
$list->append($_) foreach @l;
$list->signal_connect(select_row => sub {
my ($w, $row) = @_;
${$e->{val}} = $e->{list}[$curr = $row];
&$changed;
});
$list->signal_connect(button_press_event => $double_click) if $double_click;
$list, sub {
my ($v) = @_;
eval {
my $nb = find_index { $_ eq $v } @{$e->{list}};
$select->($nb) if $nb != $list->focus_row;
};
};
}
sub create_ctree {
my ($e, $may_go_to_next, $changed, $double_click, $tree_expanded) = @_;
my @l = map { may_apply($e->{format}, $_) } @{$e->{list}};
my $sep = quotemeta $e->{separator};
my $tree = Gtk::CTree->new(1, 0);
my (%wtree, %wleaves, $size, $selected_via_click);
my $parent; $parent = sub {
if (my $w = $wtree{"$_[0]$e->{separator}"}) { return $w }
my $s;
foreach (split $sep, $_[0]) {
$wtree{"$s$_$e->{separator}"} ||=
$tree->insert_node($s ? $parent->($s) : undef, undef, [$_], 5, (undef) x 4, 0, $tree_expanded);
$size++ if !$s;
$s .= "$_$e->{separator}";
}
$wtree{$s};
};
foreach (@l) {
my ($root, $leaf) = /(.*)$sep(.+)/ ? ($1, $2) : ('', $_);
$wleaves{$_} = $tree->insert_node($parent->($root), undef, [$leaf], 5, (undef) x 4, 1, 0);
}
undef %wtree;
my $select = sub {
my ($node) = @_;
for (my $c = $node; $c; $c = $c->row->parent) {
$tree->expand($c);
}
for (my $i = 0; $tree->node_nth($i); $i++) {
if ($tree->node_nth($i) == $node) {
$tree->set_focus_row($i);
last;
}
}
$tree->select($node);
$tree->node_moveto($node, 0, 0.5, 0) if $tree->node_is_visible($node) ne 'full';
};
my $curr = $tree->node_nth(0); #- default value
$tree->set_column_auto_resize(0, 1);
$tree->set_selection_mode('browse');
$tree->set_row_height($tree->style->font->ascent + $tree->style->font->descent + 1);
$tree->signal_connect(tree_select_row => sub {
$curr = $_[1];
if ($curr->row->is_leaf) {
my @ll; for (my $c = $curr; $c; $c = $c->row->parent) {
unshift @ll, first $tree->node_get_pixtext($c, 0);
}
my $val = join $e->{separator}, @ll;
mapn {
${$e->{val}} = $_[1] if $val eq $_[0]
} \@l, $e->{list};
&$changed;
} else {
$tree->expand($curr) if $selected_via_click;
}
});
my ($first_time, $starting_word, $start_reg) = (1, '', "^");
my $timeout;
my $toggle = sub {
$curr->row->is_leaf ?
&$may_go_to_next :
$tree->toggle_expansion($curr);
};
$tree->signal_connect(key_press_event => sub {
my ($w, $event) = @_;
$selected_via_click = 0;
my $c = chr($event->{keyval} & 0xff);
$curr or return;
Gtk->timeout_remove($timeout) if $timeout; $timeout = '';
if ($event->{keyval} >= 0x100) {
&$toggle if $c eq "\r" || $c eq "\x8d";
$starting_word = '' if $event->{keyval} != 0xffe4; # control
} else {
my $next;
if ($event->{state} & 4) {
#- control pressed
$c eq "s" or return 1;
$start_reg and $start_reg = '', return 1;
$next = 1;
} else {
&$toggle if $c eq ' ';
$next = 1 if $starting_word eq '' || $starting_word eq $c;
$starting_word .= $c unless $starting_word eq $c;
}
my $word = quotemeta $starting_word;
my ($after, $best);
$tree->pre_recursive(undef, sub {
my ($tree, $node) = @_;
$next &&= !$after;
$after ||= $node == $curr;
my ($t) = $tree->node_get_pixtext($node, 0);
if ($t =~ /$start_reg$word/i) {
if ($after && !$next) {
($best, $after) = ($node, 0);
} else {
$best ||= $node;
}
}
});
if (defined $best) {
$select->($best);
} else {
$starting_word = '';
}
$timeout = Gtk->timeout_add($forgetTime, sub { $timeout = $starting_word = ''; 0 });
}
1;
});
$tree->signal_connect(button_press_event => sub {
$selected_via_click = 1;
&$double_click if $curr->row->is_leaf && $double_click;
});
$tree, sub {
my $v = may_apply($e->{format}, $_[0]);
$select->($wleaves{$v} || return) if $wleaves{$v} != $tree->selection;
}, $size;
}
sub create_list {
my ($e, $may_go_to_next, $changed, $double_click) = @_;
my $l = $e->{list};
my $list = new Gtk::List();
$list->set_selection_mode('browse');
my $select = sub {
$list->select_item($_[0]);
};
my $tips = new Gtk::Tooltips;
my $toselect;
map_index {
my $item = new Gtk::ListItem(may_apply($e->{format}, $_));
$item->signal_connect(key_press_event => sub {
my ($w, $event) = @_;
my $c = chr($event->{keyval} & 0xff);
$may_go_to_next->($event) if $event->{keyval} < 0x100 ? $c eq ' ' : $c eq "\r" || $c eq "\x8d";
1;
});
$list->append_items($item);
$item->show;
if ($e->{help}) {
gtkset_tip($tips, $item,
ref($e->{help}) eq 'HASH' ? $e->{help}{$_} :
ref($e->{help}) eq 'CODE' ? $e->{help}($_) : $e->{help});
}
$item->grab_focus if ${$e->{val}} && $_ eq ${$e->{val}};
} @$l;