diff options
Diffstat (limited to 'perl-install/diskdrake/smbnfs_gtk.pm')
| -rw-r--r-- | perl-install/diskdrake/smbnfs_gtk.pm | 195 | 
1 files changed, 100 insertions, 95 deletions
| diff --git a/perl-install/diskdrake/smbnfs_gtk.pm b/perl-install/diskdrake/smbnfs_gtk.pm index 862132d05..b2417ce83 100644 --- a/perl-install/diskdrake/smbnfs_gtk.pm +++ b/perl-install/diskdrake/smbnfs_gtk.pm @@ -1,28 +1,25 @@ -package diskdrake::smbnfs_gtk; # $Id$ +package diskdrake::smbnfs_gtk;  use diagnostics;  use strict; -use any; -use fs; +use fs::get;  use diskdrake::interactive;  use common;  use interactive; -use network::smb; -use network::nfs; -use my_gtk qw(:helpers :wrappers :ask); +use fs::remote::smb; +use fs::remote::nfs; +use mygtk3 qw(gtknew gtkset); +use ugtk3 qw(:helpers :wrappers :create); -my ($all_hds, $in, $tree, $current_entry, $current_leaf, %icons); +my ($all_hds, $in, $tree_model, $current_entry, $current_leaf, %icons);  sub main {      ($in, $all_hds, my $type) = @_;      my ($kind) = $type eq 'smb' ? smb2kind() : nfs2kind(); -    { -	local $my_gtk::pop_it = 1; -	$kind->check($in) or return; -    } +    $kind->check($in) or return; -    my $w = my_gtk->new('DiskDrake'); +    my $w = ugtk3->new(N("Partitioning"));      add_smbnfs($w->{window}, $kind);      $w->{rwindow}->set_default_size(400, 300) if $w->{rwindow}->can('set_default_size'); @@ -36,63 +33,61 @@ sub main {  sub try {      my ($kind, $name, @args) = @_;      my $f = $diskdrake::interactive::{$name} or die "unknown function $name"; -    try_($kind, $name, \&{$f}, @args); +    try_($kind, $name, \&$f, @args);  }  sub try_ {      my ($kind, $name, $f, @args) = @_;      eval { $f->($in, @args, $all_hds) };      if (my $err = $@) { -	$in->ask_warn(_("Error"), formatError($err)); +	$in->ask_warn(N("Error"), formatError($err));      }      update($kind); -    Gtk->main_quit if member($name, 'Cancel', 'Done'); +    Gtk3->main_quit if member($name, 'Cancel', 'Done');  }  sub raw_hd_options {      my ($in, $raw_hd) = @_; -    diskdrake::interactive::Options($in, {}, $raw_hd); +    diskdrake::interactive::Options($in, {}, $raw_hd, fs::get::empty_all_hds());  }  sub raw_hd_mount_point {      my ($in, $raw_hd) = @_;      my ($default) = $raw_hd->{device} =~ m|([^/]+)$|;      $default =~ s/\s+/-/g; -    diskdrake::interactive::Mount_point_raw_hd($in, $raw_hd, $all_hds, [ "/mnt/$default" ]); +    diskdrake::interactive::Mount_point_raw_hd($in, $raw_hd, $all_hds, "/mnt/$default");  }  sub per_entry_info_box {      my ($box, $kind, $entry) = @_; -    $_->isa('Gtk::Button') or $_->destroy foreach map { $_->widget } $box->children; -    my $info; -    if ($entry) { -	$info = diskdrake::interactive::format_raw_hd_info($entry); -    } -    gtkpack($box, gtkadd(new Gtk::Frame(_("Details")), gtkset_justify(new Gtk::Label($info), 'left'))); +    my $info = $entry ? diskdrake::interactive::format_raw_hd_info($entry) : ''; +    $kind->{per_entry_info_box}->destroy if $kind->{per_entry_info_box}; +    gtkpack($box, $kind->{per_entry_info_box} = gtknew('Frame', text => N("Details"), child => gtknew('Label', text => $info, justify => 'left')));  }  sub per_entry_action_box {      my ($box, $kind, $entry) = @_; -    $_->widget->destroy foreach $box->children; +    $_->destroy foreach $box->get_children;      my @buttons;      push @buttons, map {  	  my $s = $_; -	  gtksignal_connect(new Gtk::Button(translate($s)), clicked => sub { try($kind, $s, {}, $entry) }); -      } (if_($entry->{isMounted}, __("Unmount")), -	 if_($entry->{mntpoint} && !$entry->{isMounted}, __("Mount"))) if $entry; +	  gtknew('Button', text => translate($s), clicked => sub { try($kind, $s, {}, $entry) }); +      } (if_($entry->{isMounted}, N_("Unmount")), +	 if_($entry->{mntpoint} && !$entry->{isMounted}, N_("Mount"))) if $entry;      my @l = ( -	     if_($entry, __("Mount point") => \&raw_hd_mount_point), -	     if_($entry && $entry->{mntpoint}, __("Options") => \&raw_hd_options), -	     __("Cancel") => sub {}, -	     __("Done") => \&done, +	     if_($entry, N_("Mount point") => \&raw_hd_mount_point), +	     if_($entry && $entry->{mntpoint}, N_("Options") => \&raw_hd_options), +	     N_("Cancel") => sub {}, +	     N_("Done") => \&done,  	    );      push @buttons, map { -	my ($txt, $f) = @$_; -	gtksignal_connect(new Gtk::Button(translate($txt)), clicked => sub { try_($kind, $txt, $f, $entry) }); +        my ($txt, $f) = @$_; +        $f ? gtknew('Button', text => translate($txt), clicked => sub { try_($kind, $txt, $f, $entry) }) +          : gtknew('Label', text => "");      } group_by2(@l); - -    gtkadd($box, gtkpack(new Gtk::HBox(0,0), @buttons)); +     +    gtkadd($box, gtknew('HBox', children_loose => \@buttons));  }  sub done { @@ -100,28 +95,27 @@ sub done {      diskdrake::interactive::Done($in, $all_hds);  } -sub set_export_icon { -    my ($entry, $w) = @_; +sub export_icon { +    my ($entry) = @_;      $entry ||= {}; -    my $icon = $icons{$entry->{isMounted} ? 'mounted' : $entry->{mntpoint} ? 'has_mntpoint' : 'default'}; -    ugtk::ctree_set_icon($tree, $w, @$icon); +    $icons{$entry->{isMounted} ? 'mounted' : $entry->{mntpoint} ? 'has_mntpoint' : 'default'};  }  sub update {      my ($kind) = @_;      per_entry_action_box($kind->{action_box}, $kind, $current_entry);      per_entry_info_box($kind->{info_box}, $kind, $current_entry); -    set_export_icon($current_entry, $current_leaf) if $current_entry; +    $tree_model->set($current_leaf, 0 => export_icon($current_entry)) if $current_entry;  }  sub find_fstab_entry { -    my ($kind, $e, $add_or_not) = @_; +    my ($kind, $e, $b_add_or_not) = @_;      my $fs_entry = $kind->to_fstab_entry($e); -    if (my ($fs_entry_) = grep { $fs_entry->{device} eq $_->{device} } @{$kind->{val}}) { +    if (my $fs_entry_ = find { $fs_entry->{device} eq $_->{device} } @{$kind->{val}}) {  	$fs_entry_; -    } elsif ($add_or_not) { +    } elsif ($b_add_or_not) {  	push @{$kind->{val}}, $fs_entry;  	$fs_entry;      } else { @@ -129,26 +123,34 @@ sub find_fstab_entry {      }  } -sub import_ctree { +sub import_tree {      my ($kind, $info_box) = @_; -    my (%servers_displayed, %wservers, %wexports, $inside); +    my (%servers_displayed, %wservers, %wexports); + +    $tree_model = Gtk3::TreeStore->new("Gtk3::Gdk::Pixbuf", "Glib::String"); +    my $tree = Gtk3::TreeView->new_with_model($tree_model); +    $tree->get_selection->set_mode('browse'); -    $tree = Gtk::CTree->new(1, 0); -    $tree->set_column_auto_resize(0, 1); -    $tree->set_selection_mode('browse'); -    $tree->set_row_height($tree->style->font->ascent + $tree->style->font->descent + 1); +    my $col = Gtk3::TreeViewColumn->new; +    $col->pack_start(my $pixrender = Gtk3::CellRendererPixbuf->new, 0); +    $col->add_attribute($pixrender, 'pixbuf', 0); +    $col->pack_start(my $texrender = Gtk3::CellRendererText->new, 1); +    $col->add_attribute($texrender, 'text', 1); +    $tree->append_column($col); + +    $tree->set_headers_visible(0);      foreach ('default', 'server', 'has_mntpoint', 'mounted') { -	$icons{$_} = [ gtkcreate_png("smbnfs_$_") ]; +	$icons{$_} = gtknew('Pixbuf', file => "smbnfs_$_");      }      my $add_server = sub {  	my ($server) = @_; +	my $identifier = $server->{ip} || $server->{name};  	my $name = $server->{name} || $server->{ip}; -	$servers_displayed{$name} ||= do { -	    my $w = $tree->insert_node(undef, undef, [$name], 5, (undef) x 4, 0, 0); -	    ugtk::ctree_set_icon($tree, $w, @{$icons{server}}); -	    $wservers{$w->{_gtk}} = $server; +	$servers_displayed{$identifier} ||= do { +	    my $w = $tree_model->append_set(undef, [ 0 => $icons{server}, 1 => $name ]); +	    $wservers{$tree_model->get_path_str($w)} = $server;  	    $w;  	};      }; @@ -159,25 +161,25 @@ sub import_ctree {  	return @l if !$@;  	if ($server->{username}) { -	    $in->ask_warn('', _("Can't login using username %s (bad password?)", $server->{username})); -	    network::smb::remove_bad_credentials($server); +	    $in->ask_warn('', N("Cannot login using username %s (bad password?)", $server->{username})); +	    fs::remote::smb::remove_bad_credentials($server);  	} else { -	    if (my @l = network::smb::authentifications_available($server)) { -		my $user = $in->ask_from_list_(_("Domain Authentication Required"), -					       _("Which username"), [ @l, __("Another one") ]) or return; +	    if (my @l = fs::remote::smb::authentications_available($server)) { +		my $user = $in->ask_from_list_(N("Domain Authentication Required"), +					       N("Which username"), [ @l, N_("Another one") ]) or return;  		if ($user ne 'Another one') { -		    network::smb::read_credentials($server, $user); +		    fs::remote::smb::read_credentials($server, $user);  		    goto $find_exports;  		}  	    }  	} -	if ($in->ask_from(_("Domain Authentication Required"), -		      _("Please enter your username, password and domain name to access this host."), +	if ($in->ask_from(N("Domain Authentication Required"), +		      N("Please enter your username, password and domain name to access this host."),  		      [  -		       { label => _("Username"), val => \$server->{username} }, -		       { label => _("Password"), val => \$server->{password} }, -		       { label => _("Domain"), val => \$server->{domain} }, +		       { label => N("Username"), val => \$server->{username} }, +		       { label => N("Password"), val => \$server->{password}, hidden => 1 }, +		       { label => N("Domain"), val => \$server->{domain} },  		      ])) {  	    goto $find_exports;  	} else { @@ -188,21 +190,25 @@ sub import_ctree {      my $add_exports = sub {  	my ($node) = @_; -	$tree->expand($node); -	foreach ($find_exports->($wservers{$node->{_gtk}} || return)) { #- can't die here since insert_node provoque a tree_select_row before the %wservers is filled -	    my $w = $tree->insert_node($node, undef, [$kind->to_string($_)], 5, (undef) x 4, 1, 0); -	    set_export_icon(find_fstab_entry($kind, $_), $w); -	    $wexports{$w->{_gtk}} = $_; + +	my $path = $tree_model->get_path($node); +	$tree->expand_row($path, 0); + +	foreach ($find_exports->($wservers{$tree_model->get_path_str($node)} || return)) { #- cannot die here since insert_node provoque a tree_select_row before the %wservers is filled +	    my $s = $kind->to_string($_); +	    my $w = $tree_model->append_set($node, [ 0 => export_icon(find_fstab_entry($kind, $_)),  +						     1 => $s ]); +	    $wexports{$tree_model->get_path_str($w)} = $_;  	}      };      {  -	my $search = new Gtk::Button(_("Search servers")); +	my $search = gtknew('Button', text => N("Search servers"));  	gtkpack__($info_box,   		  gtksignal_connect($search,  				    clicked => sub {  					$add_server->($_) foreach sort { $a->{name} cmp $b->{name} } $kind->find_servers; -					$search->destroy; +					gtkset($search, text => N("Search for new servers"));  				    }));      } @@ -211,24 +217,23 @@ sub import_ctree {  	$add_exports->($node);      } -    $tree->signal_connect(tree_select_row => sub {  -	my $curr = $_[1]; -	$inside and return; -	$inside = 1; -	if ($curr->row->is_leaf) { +    $tree->get_selection->signal_connect(changed => sub { +	my ($_model, $curr) = $_[0]->get_selected; +	$curr or return; + +	if ($tree_model->iter_parent($curr)) {  	    $current_leaf = $curr; -	    $current_entry = find_fstab_entry($kind, $wexports{$curr->{_gtk}} || die(''), 'add'); +	    $current_entry = find_fstab_entry($kind, $wexports{$tree_model->get_path_str($curr)} || die(''), 'add');  	} else { -	    if (!$curr->row->children) { -		gtkset_mousecursor_wait($tree->window); -		my_gtk::flush(); +	    if (!$tree_model->iter_has_child($curr)) { +		gtkset_mousecursor_wait($tree->get_window); +		ugtk3::flush();  		$add_exports->($curr);		 -		gtkset_mousecursor_normal($tree->window); +		gtkset_mousecursor_normal($tree->get_window);  	    }  	    $current_entry = undef;  	}  	update($kind); -	$inside = 0;      });      $tree;  } @@ -237,16 +242,16 @@ sub add_smbnfs {      my ($widget, $kind) = @_;      die if $kind->{main_box}; -    $kind->{info_box} = new Gtk::VBox(0,0); -    $kind->{display_box} = createScrolledWindow(import_ctree($kind, $kind->{info_box})); -    $kind->{action_box} = new Gtk::HBox(0,0); +    $kind->{info_box} = gtknew('VBox'); +    $kind->{display_box} = gtknew('ScrolledWindow', child => import_tree($kind, $kind->{info_box})); +    $kind->{action_box} = gtknew('HBox');      $kind->{main_box} = -      gtkpack_(new Gtk::VBox(0,7), -	       1, gtkpack(new Gtk::HBox(0,7), -			  gtkset_usize($kind->{display_box}, 200, 0), -			  $kind->{info_box}), +      gtknew('VBox', spacing => 7, children => [ +	       1, gtknew('HBox', spacing => 7, children_loose => [ +			  gtkset($kind->{display_box}, width => 200), +			  $kind->{info_box} ]),  	       0, $kind->{action_box}, -	     ); +	     ]);      $widget->add($kind->{main_box});      $current_entry = undef; @@ -254,12 +259,12 @@ sub add_smbnfs {      $kind;  } -sub nfs2kind { -    network::nfs->new({ type => 'nfs', name => 'NFS', val => $all_hds->{nfss}, no_auto => 1 }); +sub nfs2kind() { +    fs::remote::nfs->new({ type => 'nfs', name => 'NFS', val => $all_hds->{nfss}, no_auto => 1 });  } -sub smb2kind { -    network::smb->new({ type => 'smb', name => 'Samba', val => $all_hds->{smbs}, no_auto => 1 }); +sub smb2kind() { +    fs::remote::smb->new({ type => 'smb', name => 'Samba', val => $all_hds->{smbs}, no_auto => 1 });  } | 
