package LDFM::MainController; use utf8; use warnings; use strict; use base 'Gtk2::GladeXML::Simple'; use Gtk2::Ex::Simple::List; use LDFM::DialogController; use Readonly; use Path::Class; use File::MMagic; our $VERSION = '0.01'; sub new { my ($class,%params)=@_; my $glade_file=dir($params{glade_dir})->file('ldfm-main.glade'); my $self=$class->SUPER::new($glade_file); $self->{glade_dir}=$params{glade_dir}; # inizializzo il sistema di riconoscimento tipi file $self->{filetype}=File::MMagic->new('/usr/share/file/magic.mime'); # cambio le liste con qualcosa di piĆ¹ comodo $self->simplify_list('left'); $self->simplify_list('right'); # imposto i path $self->update_list_with_path('left',$ENV{HOME}); $self->update_list_with_path('right','/'); return $self; } sub simplify_list { my ($self,$side)=@_; my $list_name="${side}_list"; $self->{$list_name}=Gtk2::Ex::Simple::List->new_from_treeview( $self->{$list_name}, 'File' => 'text', 'Type' => 'text', 'Size' => 'int', ); $self->{$list_name}->get_selection->set_mode('multiple'); $self->{"${side}_data"}=$self->{$list_name}->{data}; return; } sub update_list_with_path { my ($self,$side,$path)=@_; my $newpath; if ($path eq '..') { $newpath=$self->{"cur_${side}_path"}->parent; } else { $newpath=dir($path)->absolute($self->{"cur_${side}_path"})->cleanup; } return unless -d $newpath; $self->{"cur_${side}_path"}=$newpath; $self->{"${side}_path"}->set_text($newpath->stringify); my @dir_list=(); for my $item ($newpath->children(all=>1)) { my @row=($item->relative($newpath)->stringify); if ($item->isa('Class::Path::Dir')) { push @row,'DIR',0; } else { push @row,$self->{filetype}->checktype_filename($item),-s $item; } push @dir_list,[@row]; } @{$self->{"${side}_data"}}=@dir_list; } sub set_left_path { my ($self,$widget)=@_; $self->update_list_with_path('left',$widget->get_text()); return; } sub set_right_path { my ($self,$widget)=@_; $self->update_list_with_path('right',$widget->get_text()); return; } sub use_a_row { my ($self,$side,$tree_path)=@_; #my $row_ref=$widget->get_row_data_from_path($tree_path); my ($row_num)=$tree_path->get_indices(); my $row_ref=$self->{"${side}_data"}->[$row_num]; my $relpath=$row_ref->[0]; $self->update_list_with_path($side,$relpath); } sub use_left_row { my ($self,$widget,$tree_path)=@_; $self->use_a_row('left',$tree_path); return; } sub use_right_row { my ($self,$widget,$tree_path)=@_; $self->use_a_row('right',$tree_path); return; } sub get_selected_side { my ($self)=@_; return $self->{left_list}->has_focus() || $self->{left_path}->has_focus() ? 'left' : 'right'; } sub get_files_from_list { my ($self,$side)=@_; my $path=$self->{"cur_${side}_path"}; my @files=map { $self->{"cur_${side}_path"}->file($self->{"${side}_data"}->[$_]->[0]); } $self->{"${side}_list"}->get_selected_indices(); return @files; } sub get_selected_files { my ($self)=@_; my $side=$self->get_selected_side(); return $self->get_files_from_list($side); } sub mkdir { my ($self)=@_; my $side=$self->get_selected_side(); my $path=$self->{"cur_${side}_path"}; my $dialog=LDFM::DialogController->new( glade_dir => $self->{glade_dir}, domanda => "Nuova directory in $path:", ); my $response=$dialog->run(); if ($response) { warn "Creerei la dir $response in $path\n"; } return; } sub delete { my ($self)=@_; my @files=$self->get_selected_files(); my $num_files=scalar @files; my $dialog=Gtk2::MessageDialog->new( $self->{main_window}, 'modal', 'warning', 'yes-no', "Cancellare veramente i $num_files file?", ); my $response=$dialog->run(); $dialog->destroy(); return unless $response eq 'yes'; for my $file (@files) { if (-d $file) { warn "Cancellerei la directory $file\n"; } else { warn "Cancellerei il file $file\n"; } } return; } sub rename { my ($self)=@_; my @files=$self->get_selected_files(); if (@files==1) { my $dialog=LDFM::DialogController->new( glade_dir => $self->{glade_dir}, domanda => "Rinomino $files[0] in:", ); my $response=$dialog->run(); if ($response) { warn "Rinominerei $files[0] in $response\n"; } } else { warn "Troppa roba selezionata\n"; } return; } sub copy_lr { my ($self)=@_; my @files=$self->get_files_from_list('left'); my $destpath=$self->{cur_right_path}; $self->copy_files(@files,$destpath); return; } sub copy_rl { my ($self)=@_; my @files=$self->get_files_from_list('right'); my $destpath=$self->{cur_left_path}; $self->copy_files(@files,$destpath); return; } sub copy_files { my $self=shift; my $destdir=pop; my @files=@_; for my $file (@files) { warn "Copierei $file in $destdir\n"; } return; } sub move_lr { my ($self)=@_; my @files=$self->get_files_from_list('left'); my $destpath=$self->{cur_right_path}; $self->move_files(@files,$destpath); return; } sub move_rl { my ($self)=@_; my @files=$self->get_files_from_list('right'); my $destpath=$self->{cur_left_path}; $self->move_files(@files,$destpath); return; } sub move_files { my $self=shift; my $destdir=pop; my @files=@_; for my $file (@files) { warn "Sposterei $file in $destdir\n"; } return; } sub quit { Gtk2->main_quit; } 1;