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 )