GappX-FileTree

 view release on metacpan or  search on metacpan

lib/GappX/FileTree.pm  view on Meta::CPAN

                    
                    my $textrender = Gtk2::CellRendererText->new();
                    $self->gobject->pack_start( $textrender, 1 );
                    $self->gobject->set_attributes( $textrender, 'markup', 1 );
                    
                },
            )
        ]
    },
    lazy => 1,
);

has 'filter_func' => (
    is => 'rw',
    isa => 'Maybe[CodeRef]',
);

has '+model' => (
    default => sub {
        Gapp::TreeStore->new(
            columns => [qw( Glib::String Glib::String Glib::String Glib::Boolean )],
            customize => sub {
                $_[0]->gobject->set_sort_func( 0, sub {
                    my ( $model, $itera, $iterb, $self ) = @_;
                    
                    my $dira = $model->get( $itera, 3 );
                    my $dirb = $model->get( $iterb, 3 );
                    my $texta = $model->get( $itera, 1 );
                    my $textb = $model->get( $iterb, 1 );
                    
                    no warnings;
                    $dirb <=> $dira || lc $texta cmp lc $textb;
                } );
                
                $_[0]->gobject->set_sort_column_id( 0, 'ascending' );
            },
        )
    },
    lazy => 1,
);

has 'path' => (
    is => 'rw',
    isa => 'Str',
    default => '.',
    trigger => sub {
        my ( $self, $newval, $oldval ) = @_;
        
        if ( $newval ne $oldval ) {
            $self->update if $self->has_gobject;
        }
        
    }
);

after _build_gobject => sub {
    #$_[0]->update;
};


sub update {
    my ( $self ) = @_;
    
    
    $self->model->gobject->clear;
    
    my $m = $self->model->gobject;
    
    my $base = $self->path;
    $base =~ s/(\/|\\)\s*$//; # remov trailing slash
    my $baserx = quotemeta $base;
    
    my @path;
    
    my $iter = undef;
    
    find (
        sub {
            return if $_ eq '.';
            
            if ( $self->filter_func ) {
                return if $self->filter_func->( $self, $_, $File::Find::name, $File::Find::dir );
            }
            
            my $dir = $File::Find::dir;
            $dir =~ s/^$baserx//;
            my @dirs = split /\/|\\/, $dir;
            shift @dirs if @dirs && ! $dirs[0];
            
            # if this is a directory
            if ( -d $_ ) {
                
                if ( @path ) {

                    if ( ! @dirs ) {
                        while ( @path ) {
                            $iter = $m->iter_parent( $iter ) if $iter;
                            pop @path;
                        }
                        
                    }
                    else {
                        no warnings;
                        while ( $path[-1] ne $dirs[-1] ) {
                            $iter = $m->iter_parent( $iter ) if $iter ;
                            pop @path;
                        }
                        
                        
                    }
                }
                
                
                if ( @path && ( ! @dirs || $path[-1] ne $dirs[-1] ) ) {
                    $iter = $m->iter_parent( $iter ) if $iter ;
                    pop @path;
                }
                
                my $i = $m->append( $iter );
                $m->set( $i, 0 => $File::Find::name , 1 => $_, 2 => 'gtk-directory', 3 => 1 );
                $iter = $i;



( run in 0.684 second using v1.01-cache-2.11-cpan-e1769b4cff6 )