Gtk2-Ex-FormFactory

 view release on metacpan or  search on metacpan

lib/Gtk2/Ex/FormFactory/CheckButtonGroup.pm  view on Meta::CPAN


	if ( $self->get_attr_row_labels ) {
		$row_labels = $self->get_proxy->get_attr($self->get_attr_row_labels);
	}
	
	if ( $self->get_attr_column_labels ) {
		$column_labels = $self->get_proxy->get_attr($self->get_attr_column_labels);
	}

	if ( $max_rows ) {
		$rows = $max_rows;
		$rows = $cnt if $rows > $cnt;
		$columns = ceil($cnt / $rows);
	} else {
		$columns = $max_columns;
		$columns = $cnt if $columns > $cnt;
		$rows = ceil($cnt / $columns);
	}

	my %gtk_check_buttons;
	my $gtk_table = Gtk2::Table->new ($rows, $columns);
	$gtk_table->set ( homogeneous => $self->get_homogeneous );
	
	++$columns if $row_labels;
	++$rows    if $column_labels;
	
	my $i = 0;
	for ( my $c=0; $c < $columns && $i < $cnt; ++$c ) {
		for ( my $r=0; $r < $rows && $i < $cnt; ++$r ) {
			next if $column_labels && $c == 0 && $r == 0;
			if ( $row_labels && $c==0 && $r > 0 ) {
			    my $gtk_label = Gtk2::Label->new($row_labels->[$r-1]);
			    $gtk_table->attach_defaults($gtk_label, $c, $c+1, $r, $r+1);
			    next;
			}
			if ( $column_labels && $r==0 && $c > 0 ) {
			    my $gtk_label = Gtk2::Label->new($column_labels->[$c-1]);
			    $gtk_table->attach_defaults($gtk_label, $c, $c+1, $r, $r+1);
			    next;
			}
			my $checkbox = $checkboxes->[$i];
			my $gtk_check_button = Gtk2::CheckButton->new($checkbox->[1]);
			$gtk_check_buttons{$checkbox->[0]} = $gtk_check_button;
			$gtk_check_button->set_active(1) if $selected_href->{$checkbox->[0]};
			$gtk_table->attach_defaults($gtk_check_button, $c, $c+1, $r, $r+1);
			++$i;
		}
	}

	$hbox->pack_start($gtk_table, 0, 1, 0);
	$hbox->show_all;

	$self->set_gtk_check_buttons(\%gtk_check_buttons);
	$self->set_gtk_table($gtk_table);

	$self->connect_changed_signal_for_all_buttons;

	1;
}

sub update_selection {
	my $self = shift;
	
	$self->set_in_selection_update(1);
	
	my $selected_href     = $self->get_object_value;
	my $gtk_check_buttons = $self->get_gtk_check_buttons;
	
	while ( my ($value, $gtk_check_button) = each %{$gtk_check_buttons} ) {
		$gtk_check_button->set_active( $selected_href->{$value} );
	}
	
	$self->set_in_selection_update(0);

	1;
}

sub widget_to_object {
	my $self = shift;
	
	return if $self->get_in_selection_update;

	my $gtk_check_buttons = $self->get_gtk_check_buttons;
	my %selected;
	
	while ( my ($value, $gtk_check_button) = each %{$gtk_check_buttons} ) {
		$selected{$value} = 1 if $gtk_check_button->get_active;
	}
	
	$self->set_object_value(\%selected);

	1;
}

sub connect_changed_signal_for_all_buttons {
	my $self = shift;
	
	my $gtk_check_buttons = $self->get_gtk_check_buttons;
	
	while ( my ($value, $gtk_check_button) = each %{$gtk_check_buttons} ) {
		$gtk_check_button->signal_connect ( toggled => sub {
			return 1 if $self->get_in_selection_update;
			$self->set_last_toggled_value($value);
			$self->widget_value_changed;
			1;
		} );
	}

	1;
}

1;

__END__

=head1 NAME

Gtk2::Ex::FormFactory::CheckButtonGroup - A group of checkbuttons

=head1 SYNOPSIS



( run in 1.191 second using v1.01-cache-2.11-cpan-39bf76dae61 )