diff options
Diffstat (limited to 'bin/draknetprofile')
-rwxr-xr-x | bin/draknetprofile | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/bin/draknetprofile b/bin/draknetprofile new file mode 100755 index 0000000..49ca287 --- /dev/null +++ b/bin/draknetprofile @@ -0,0 +1,153 @@ +#!/usr/bin/perl + +# Copyright (C) 2006 Mandriva +# Olivier Blin <blino@mandriva.com> +# Thierry Vignaud <tvignaud@mandriva.com> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +use strict; + +use lib qw(/usr/lib/libDrakX); + +# i18n: IMPORTANT: to get correct namespace (drakx-net instead of libDrakX) +BEGIN { unshift @::textdomains, 'drakx-net' } +use standalone; + +use common; +use network::network; +use mygtk2; +use Gtk2::SimpleList; +use ugtk2 qw(:create :helpers :wrappers :dialogs); + +$ugtk2::wm_icon = 'draknetprofile-16'; +my $title = N("Network profiles"); +my $w = ugtk2->new($title); +$::main_window = $w->{real_window}; #- so that transient_for is defined for wait messages and dialogs + +my $net = {}; +my @profiles; +my $default_profile = "default"; +my %buttons; + +package Gtk2::CellRendererRadio; + +sub new { + my $renderer = Gtk2::CellRendererToggle->new; + $renderer->set_radio(1); + $renderer->set_property('mode', 'inert'); + $renderer; +} + +1; + +package main; + +Gtk2::SimpleList->add_column_type( + 'radio', + type => 'Glib::Boolean', + renderer => 'Gtk2::CellRendererRadio', + attr => 'active', +); + +my $profiles_list = Gtk2::SimpleList->new( + "" => 'radio', + N("Profile") => 'text', +); +$profiles_list->get_selection->signal_connect('changed' => sub { + my ($index) = $profiles_list->get_selected_indices; + $_->set_sensitive(defined $index) foreach values %buttons; + }); + +sub get_selected_profile() { + my ($index) = $profiles_list->get_selected_indices; + defined $index && $profiles_list->{data}[$index][1]; +} + +sub update_profiles() { + my $previous_profile = get_selected_profile(); + network::network::netprofile_read($net); + @profiles = network::network::netprofile_list(); + @{$profiles_list->{data}} = map { [ $_ eq $net->{PROFILE}, $_ ] } @profiles; + my $index = eval { find_index { $_ eq $previous_profile } @profiles }; + $profiles_list->select($index) if defined $index; +} + +sub set_selected_profile() { + my $profile = get_selected_profile(); + gtkset_mousecursor_wait($w->{window}->window); + gtkflush(); + network::network::netprofile_set($net, $profile); + gtkset_mousecursor_normal($w->{window}->window); + update_profiles(); +} + +sub clone_profile() { + my $source_profile = get_selected_profile(); + my $dialog = _create_dialog(N("New profile...")); + my $entry_dialog = Gtk2::Entry->new; + gtkpack($dialog->vbox, + Gtk2::WrappedLabel->new(N("Name of the profile to create (the new profile is created as a copy of the current one):")), + $entry_dialog, + ); + gtkpack($dialog->action_area, + gtksignal_connect(Gtk2::Button->new(N("Cancel")), + clicked => sub { $dialog->destroy }), + gtksignal_connect(my $bok = Gtk2::Button->new(N("Ok")), clicked => sub { + my $dest_profile = $entry_dialog->get_text; + # netprofile does not like spaces in profile names... + $dest_profile =~ s/ /_/g; + if (member($dest_profile, @profiles)) { + err_dialog(N("Error"), N("The \"%s\" profile already exists!", $dest_profile), { transient => $dialog }); + return 1; + } + $dialog->destroy; + network::network::netprofile_clone($source_profile, $dest_profile); + update_profiles(); + }), + ); + $bok->can_default(1); + $bok->grab_default; + $dialog->show_all; +} + +sub delete_selected_profile() { + my $profile = get_selected_profile(); + if ($profile eq $default_profile) { + warn_dialog(N("Warning"), N("You can not delete the default profile")); + } elsif ($profile eq $net->{PROFILE}) { + warn_dialog(N("Warning"), N("You can not delete the current profile")); + } else { + network::network::netprofile_delete($profile); + update_profiles(); + } +} + +gtkadd($w->{window}, + gtknew('VBox', spacing => 5, children => [ + $::isEmbedded ? () : (0, Gtk2::Banner->new('draknetprofile', $title)), + 0, gtknew('WrappedLabel', text => N("This tool allows to activate an existing network profile, and to manage (clone, delete) profiles.") . "\n\n" . N("To modify a profile, you have to activate it first.")), + 1, gtknew('ScrolledWindow', width => 300, height => 150, child => $profiles_list), + 0, gtknew('HButtonBox', children_loose => [ + $buttons{activate} = gtknew('Button', text => N("Activate"), clicked => \&set_selected_profile), + $buttons{clone} = gtknew('Button', text => N("Clone"), clicked => \&clone_profile), + $buttons{delete} = gtknew('Button', text => N("Delete"), clicked => \&delete_selected_profile), + gtknew('Button', text => N("Quit"), clicked => sub { Gtk2->main_quit }), + ]), + ]), + ); + +update_profiles(); +$w->main; |