package LDFM::MainController;
use utf8;
use warnings;
use strict;
use base 'Gtk2::GladeXML::Simple';
use Gtk2::Ex::Simple::List;
use Readonly;
use Path::Class;
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->simplify_list('left');
$self->simplify_list('right');
$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,'FILE',-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_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"};
warn "Creerei una dir in $path\n";
return;
}
sub delete {
my ($self)=@_;
my @files=$self->get_selected_files();
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) {
warn "Rinominerei $files[0]\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;