package Gapp::TreeViewColumn; { $Gapp::TreeViewColumn::VERSION = '0.483'; } use Moose; extends 'Gapp::Object'; use Gapp::CellRenderer; use Gapp::Util; use Gapp::Types qw( GappCellRenderer GappTreeViewColumn ); use Moose::Util; use MooseX::Types::Moose qw( Str ArrayRef HashRef CodeRef Undef ); has '+gclass' => ( default => 'Gtk2::TreeViewColumn', ); has 'name' => ( is => 'rw', isa => 'Str', default => '', ); has 'renderer' => ( is => 'rw', isa => GappCellRenderer|Undef, default => sub { Gapp::CellRenderer->new( gclass => 'Gtk2::CellRendererText', property => 'markup' ) }, coerce => 1, ); has 'data_column' => ( is => 'rw', isa => 'Int|Undef', default => 0, ); has 'data_func' => ( is => 'rw', isa => 'Str|CodeRef|Undef', ); has 'sort_enabled' => ( is => 'rw', isa => 'Bool', default => 0, trigger => sub { my ( $self ) = @_; if ( $self->has_gobject ) { $self->gobject->set_clickable( 1 ); $self->gobject->signal_connect( 'clicked', sub { $self->gobject->get_tree_view->get_model->set_default_sort_func( sub { my ( $model, $itera, $iterb, $self ) = @_; my $a = $model->get( $itera, $self->data_column ); my $b = $model->get( $iterb, $self->data_column ); $self->sort_func->( $self, $a, $b ); }, $self) } ); } } ); has 'sort_func' => ( is => 'rw', isa => 'Maybe[CodeRef]', default => sub { sub { my ( $self, $a, $b ) = @_; lc $self->get_cell_value( $a ) cmp lc $self->get_cell_value( $b ); }; }, ); sub BUILDARGS { my $class = shift; my %args = @_ == 1 && is_HashRef( $_[0] ) ? %{$_[0]} : @_; for my $att ( qw(alignment clickable expand fixed_width min_width reordable resizable sizing), qw(sort_column_id sort_indicator sort_order spacing title visible width') ) { $args{properties}{$att} = delete $args{$att} if exists $args{$att}; } __PACKAGE__->SUPER::BUILDARGS( %args ); } sub get_cell_value { my ( $self, $input ) = @_; local $_ = $input; my $value = $input; if ( is_CodeRef( $self->data_func ) ) { $value = &{ $self->data_func }( @_ ); } elsif ( is_Str( $self->data_func ) ) { my $method = $self->data_func; $value = $_ ? $_->$method : ''; } return $value; } 1; __END__ =pod =head1 NAME Gapp::TreeViewColumn - TreeViewColumn Widget =head1 OBJECT HIERARCHY =over 4 =item L =item +-- L =back =head1 PROVIDED ATTRIBUTES =over 4 =item B =over 4 =item isa: Int =item default: 0 =back The column in the model that to pull data from. This is what will be displayed within the renderer. You can use the C attribute to manipulate the data before it is rendered in the cell. =item B =over 4 =item isa: Str|CodeRef|Undef =back Use this to manipulate the data from C before rendering it in the cell. The return value is what will be passed to the renderer. The <$_> variable will be set to the data from C within the callback. =item B =over 4 =item isa: Str =item default: undef =back By naming your column you can use C<$treeview->find_column( $name )> to retrieve them later. =item B =over 4 =item isa: L =item default: Gapp::CellRenderer->new( gclass => 'Gtk2::CellRendererText', property => 'markup' ); =back =head1 DELEGATED PROPERIES =over 4 =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B =item B<visible_width> =back =head1 AUTHORS Jeffrey Ray Hallock E<lt>jeffrey.hallock at gmail dot comE<gt> =head1 COPYRIGHT & LICENSE Copyright (c) 2011-2012 Jeffrey Ray Hallock. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut