17 |
# public methods |
# public methods |
18 |
|
|
19 |
|
|
20 |
|
sub get_description { |
21 |
|
my ($hash_desc, $hash_key) = @_; |
22 |
|
my $value; |
23 |
|
my $key = (keys(%$hash_key))[0]; |
24 |
|
foreach (keys %$hash_desc) { |
25 |
|
$key =~ /^$_$/ and $value = $hash_desc->{$_}, last; |
26 |
|
} |
27 |
|
defined $value or return undef; |
28 |
|
my $value_desc = $hash_key->{$key}; |
29 |
|
ref($value_desc) eq '' and return $value; |
30 |
|
if (ref($value_desc) eq 'ARRAY') { |
31 |
|
die "not yet implemented :( "; |
32 |
|
} elsif (ref($value_desc) eq 'HASH') { |
33 |
|
ref($value) eq 'HASH' or die; |
34 |
|
return get_description($value, $value_desc); |
35 |
|
} |
36 |
|
} |
37 |
|
|
38 |
# @widget_options is optional |
# @widget_options is optional |
39 |
sub getBestWidget { |
sub getBestWidget { |
40 |
my ($struct, $key, @widget_options) = @_; |
my ($struct, $key, @widget_options) = @_; |
41 |
my $data_description = $struct->{_data_description}; |
my $data_description = $struct->{_data_description}; |
42 |
my $data_mapping = $struct->{_data_mapping}; |
my $data_mapping = $struct->{_data_mapping}; |
43 |
# use Data::Dumper; |
my $hash = {}; |
44 |
# print Dumper($data_description) . "\n"; |
eval("\$hash->$key = 1;"); |
45 |
my $a = "\$data_description->$key"; |
$@ and die $@; |
46 |
print " +++ $a\n"; |
my $ret = buildWidget($struct, get_description($data_description, $hash), $data_mapping, @widget_options); |
|
$a = eval("\$data_description->$key"); |
|
|
print " -- : " . Dumper($a). "\n"; |
|
|
my $ret = buildWidget(eval("\$data_description->$key"), $data_mapping, @widget_options); |
|
47 |
$ret->set_value(eval("\$struct->$key")); |
$ret->set_value(eval("\$struct->$key")); |
48 |
$ret; |
$ret; |
49 |
} |
} |
51 |
|
|
52 |
# @widget_options is optional |
# @widget_options is optional |
53 |
sub buildWidget { |
sub buildWidget { |
54 |
my ($data, $data_mapping, @widget_options) = @_; |
my ($struct, $data, $data_mapping, @widget_options) = @_; |
55 |
my ($type, $type2, $type3, $default, $values) = @{$data}{qw(type type2 type3 default values)}; |
my ($type, $type2, $type3, $default, $values) = @{$data}{qw(type type2 type3 default values)}; |
56 |
$data_mapping ||= {}; |
$data_mapping ||= {}; |
57 |
# print "-- $type\n"; |
# print "-- $type\n"; |
76 |
} |
} |
77 |
} |
} |
78 |
|
|
79 |
|
if (defined $default && ref($default) eq 'CODE') { |
80 |
|
$default = &$default(); |
81 |
|
} |
82 |
|
|
83 |
if ($type eq 'BOOLEAN') { |
if ($type eq 'BOOLEAN') { |
84 |
$ret = Libconf::GUI::Gtk2::CheckButton->new($default, $data_mapping->{BOOLEAN}, @widget_options); |
$ret = Libconf::GUI::Gtk2::CheckButton->new($default, $data_mapping->{BOOLEAN}, @widget_options); |
85 |
} elsif ($type eq 'INTEGER') { |
} elsif ($type eq 'INTEGER') { |
86 |
$ret = Libconf::GUI::Gtk2::SpinButton->new($default, $data_mapping->{BOOLEAN}, @widget_options); |
$ret = Libconf::GUI::Gtk2::SpinButton->new($default, $data_mapping->{BOOLEAN}, @widget_options); |
87 |
|
} elsif ($type eq 'HOSTNAME') { |
88 |
|
$ret = Libconf::GUI::Gtk2::Hostname->new($default, $data_mapping->{HOSTNAME}, @widget_options); |
89 |
} elsif ($type eq 'STRING') { |
} elsif ($type eq 'STRING') { |
90 |
if ($is_combo) { |
if ($is_combo) { |
91 |
$ret = gtkcombo_setpopdown_strings(Libconf::GUI::Gtk2::Combo->new($default, $data_mapping->{STRING}, @widget_options), |
$ret = gtkcombo_setpopdown_strings(Libconf::GUI::Gtk2::Combo->new($default, $data_mapping->{STRING}, @widget_options), |
439 |
# defined $self->{'data_mapping'} and $value = $self->{'data_mapping'}->($value); |
# defined $self->{'data_mapping'} and $value = $self->{'data_mapping'}->($value); |
440 |
$value; |
$value; |
441 |
} |
} |
442 |
|
|
443 |
|
package Libconf::GUI::Gtk2::Hostname; |
444 |
|
|
445 |
|
use ugtk2 qw(:helpers :wrappers :create); |
446 |
|
|
447 |
|
our @ISA = qw(Libconf::GUI::Gtk2::Entry); |
448 |
|
|
449 |
|
#constructor |
450 |
|
#@widget_options is optional |
451 |
|
sub new { |
452 |
|
my $class = shift; |
453 |
|
#call the constructor of the parent class. |
454 |
|
my $self = $class->SUPER::new(@_); |
455 |
|
bless $self, $class; |
456 |
|
return $self; |
457 |
|
} |
458 |
|
|
459 |
|
# #### TO BE REWORKED : data mapping is badly implemented |
460 |
|
# sub set_default { |
461 |
|
# my ($self) = @_; |
462 |
|
# my $default_value = $self->{'default_value'}; |
463 |
|
# $self->set_text($default_value); |
464 |
|
# $self->{'value'} = $default_value; |
465 |
|
# # defined $self->{'data_mapping'} and $default_value = $self->{'data_mapping'}->($default_value); |
466 |
|
# # $self->set_data('value', $default_value); |
467 |
|
# } |
468 |
|
|
469 |
|
# sub set_value { |
470 |
|
# my ($self, $value) = @_; |
471 |
|
# # $self->set_data('value', $value); |
472 |
|
# $self->{'value'} = $value; |
473 |
|
# $self->set_text($value); |
474 |
|
# # defined $self->{'data_mapping'} and $value = $self->{'data_mapping'}->($value); |
475 |
|
# # $self->set_active($value); |
476 |
|
# } |
477 |
|
|
478 |
|
# sub get_value { |
479 |
|
# my ($self) = @_; |
480 |
|
# # my $value = $self->get_data('value'); |
481 |
|
# my $value = $self->{'value'}; |
482 |
|
# # defined $self->{'data_mapping'} and $value = $self->{'data_mapping'}->($value); |
483 |
|
# $value; |
484 |
|
# } |