Gtk2-Ex-FormFactory
view release on metacpan or search on metacpan
lib/Gtk2/Ex/FormFactory/Widget.pm view on Meta::CPAN
#-- Connect additional user specified signals (after)
my $signal_connect_after = $self->get_signal_connect_after;
if ( $signal_connect_after ) {
my $signal_widget = $self->get_gtk_signal_widget;
while ( my ($signal, $callback) = each %{$signal_connect_after} ) {
$signal_widget->signal_connect ( $signal => $callback );
}
}
1;
}
#========================================================================
# Lookup a widget
#========================================================================
sub get_widget {
my $self = shift;
my ($name) = @_;
my $widget;
my $form_factory = $self->get_form_factory;
croak "Widget '$name' not registered to this ".
"form factory ('".$form_factory->get_name."')"
unless $widget = $form_factory->get_widgets_by_name->{$name};
return $widget;
}
#========================================================================
# Lookup a widget reference
#========================================================================
sub lookup_widget {
my $self = shift;
my ($name) = @_;
if ( $name =~ /sibling\s*\((.*?)\)/ ) {
my $sibling_idx = $1;
my $siblings = $self->get_parent->get_content;
my $self_idx;
foreach my $sibling ( @{$siblings} ) {
if ( $sibling eq $self ) {
$self_idx ||= 0;
last;
}
++$self_idx;
}
die "Impossible" unless defined $self_idx;
my $sibling = $siblings->[$sibling_idx+$self_idx];
die "Can't find sibling($sibling_idx)" unless $sibling;
return $sibling;
} else {
return $self->get_form_factory->get_widget($name);
}
}
#========================================================================
# Update this widgets resp. transfer the object's value to the Widget
#========================================================================
sub update {
my $self = shift;
my ($change_state) = @_;
$change_state = '' if not defined $change_state;
$Gtk2::Ex::FormFactory::DEBUG &&
print "update_widget(".$self->get_name.", $change_state)\n";
#-- Check if widget updating is temoprarily disabled
#-- (refer to widget_value_changed() for this)
return if $self->get_no_widget_update;
#-- Is no object associated with this widget?
if ( not $self->get_object ) {
#-- Only a activity update may be possible, if
#-- an Gtk widget is present at all
if ( $self->get_gtk_parent_widget ) {
my $active = $self->get_active;
$active = $active ? "active" : "inactive";
$self->update_widget_activity ( $active );
}
return;
}
#-- We're going to change the widget's state. This will
#-- trigger the widget's changed signal. To prevent, that
#-- this triggers an object update again, we set this
#-- widget into update state (refer to widget_value_changed()
#-- for details)
$self->set_in_update(1);
#-- Do we have an activity update? (if $change state is given,
#-- and contains the string 'inactive') - Default is to detect
#-- activity by the correspondent Proxy method (see below)
my $active;
$active = $change_state =~ /inactive/ ? 0 : 1
if $change_state ne '';
#-- Now transform the object's activity state into a
#-- correspondent widget sensivity/visibility.
if ( $self->get_object and $self->get_gtk_parent_widget ) {
#-- Get object's activity state
$active = $self->get_proxy($self->get_object)
->get_attr_activity($self->get_attr)
if not defined $active;
#-- And set visibility or sensitivity accordingly,
#-- dependend on what's defined in the widget
$self->update_widget_activity ( $active );
}
#-- Transfer object value to widget
if ( $change_state eq '' ) {
$self->object_to_widget
if $self->get_proxy->get_object;
} elsif ( $change_state =~ /empty/ ) {
$self->empty_widget;
}
#-- Set widget into normal update state
$self->set_in_update(0);
1;
}
#========================================================================
# Update this widget, and it's child; overwritten by Container class
#========================================================================
sub update_all {
my $self = shift;
#-- For a non Container widget, this is the same as update()
$self->update(@_);
1;
}
#========================================================================
# Update this widget's activity state: (in)sensitive / (in)visible
#========================================================================
sub update_widget_activity {
my $self = shift;
my ($active) = @_;
$active = 0 if $active eq 'inactive';
#-- Use the Widget's activity value over the given $active
if ( defined $self->get_widget_activity ) {
$active = $self->get_widget_activity;
}
#-- Get associated object (if there is one)
my $object_name = $self->get_object;
my $object = $object_name ? $self->get_proxy->get_object : undef;
#-- If there is an object association but the object is
#-- currently not defined, set widget inactive
if ( $object_name && ! defined $object ) {
$active = 0;
}
#-- Otherwise check if an additional condition needs to be applied
else {
my $cond = $self->get_active_cond;
$active = &$cond($object) if $cond;
}
my $action = $self->get_inactive;
if ( $active eq 'insensitive' ) {
$action = "insensitive";
$active = 0;
}
elsif ( $active eq 'invisible' ) {
$action = "invisible";
$active = 0;
}
elsif ( $active eq 'sensitive' ) {
$action = "insensitive";
$active = 1;
}
elsif ( $active eq 'visible' ) {
$action = "invisible";
$active = 1;
}
if ( $active ) {
#-- Make the widget visible resp. sensitive
if ( $action eq 'invisible' ) {
$Gtk2::Ex::FormFactory::DEBUG &&
print " update_widget_activity(".
$self->get_name.
", show)\n";
$self->get_gtk_parent_widget->show;
$self->get_gtk_label_widget->show
if $self->get_gtk_label_widget;
} else {
$Gtk2::Ex::FormFactory::DEBUG &&
print " update_widget_activity(".
$self->get_name.
", sensitive)\n";
$self->get_gtk_parent_widget->show;
( run in 2.396 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )