diff options
-rw-r--r-- | lib/AdminPanel/Rpmdragora/gurpm.pm | 372 | ||||
-rw-r--r-- | lib/AdminPanel/Rpmdragora/pkg.pm | 25 | ||||
-rw-r--r-- | lib/AdminPanel/rpmdragora.pm | 5 | ||||
-rwxr-xr-x | modules/rpmdragora/rpmdragora | 21 |
4 files changed, 289 insertions, 134 deletions
diff --git a/lib/AdminPanel/Rpmdragora/gurpm.pm b/lib/AdminPanel/Rpmdragora/gurpm.pm index 9c0ea43..d1a24df 100644 --- a/lib/AdminPanel/Rpmdragora/gurpm.pm +++ b/lib/AdminPanel/Rpmdragora/gurpm.pm @@ -1,152 +1,294 @@ # vim: set et ts=4 sw=4: package AdminPanel::Rpmdragora::gurpm; -#***************************************************************************** -# -# Copyright (c) 2002 Guillaume Cottenceau -# Copyright (c) 2002-2007 Thierry Vignaud <tvignaud@mandriva.com> -# Copyright (c) 2003, 2004, 2005 MandrakeSoft SA -# Copyright (c) 2005-2007 Mandriva SA -# Copyright (c) 2013 Matteo Pasotti <matteo.pasotti@gmail.com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2, as -# published by the Free Software Foundation. -# -# 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. -# -#***************************************************************************** -# -# $Id: gurpm.pm 255450 2009-04-03 16:00:16Z tv $ -use strict; +#============================================================= -*-perl-*- -use yui; +=head1 NAME + + AdminPanel::Rpmdragora::gurpm - Module that shows the urpmi + progress status + +=head1 SYNOPSIS + + my %option = (title => "Urpmi action ivoked", text => "Please wait", ); + my $gurpmi = AdminPanel::Rpmdragora::gurpm->new(%option); + $gurpmi->progress(45); + + #add to an existing dialog + %option = (title => "Urpmi action ivoked", text => "Please wait", main_dialog => $dialog, parent => $parent_container); + $gurpmi = AdminPanel::Rpmdragora::gurpm->new(%option); + $gurpmi->progress(20); + +=head1 DESCRIPTION + + This class is used to show the progress of an urpmi operation on + its progress bar. It can be istantiated as a popup dialog or used + to add label and progress bar into a YLayoutBox container. + +=head1 SUPPORT + + You can find documentation for this module with the perldoc command: + + perldoc AdminPanel::Rpmdragora::gurpm + +=head1 AUTHOR + + Angelo Naselli <anaselli@linux.it> + +=head1 COPYRIGHT and LICENSE + + Copyright (c) 2002 Guillaume Cottenceau + Copyright (c) 2002-2007 Thierry Vignaud <tvignaud@mandriva.com> + Copyright (c) 2003, 2004, 2005 MandrakeSoft SA + Copyright (c) 2005-2007 Mandriva SA + Copyright (c) 2013 Matteo Pasotti <matteo.pasotti@gmail.com> + Copyright (C) 2015, Angelo Naselli <anaselli@linux.it> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License version 2, as + published by the Free Software Foundation. + + 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 + +=cut + + +use Moose; +use Carp; use Time::HiRes; + +use yui; use feature 'state'; -sub new { - my ($class, $title, $initializing, %options) = @_; - my $self = { - my $label = 0, - my $factory = 0, - my $mainw = 0, - my $vbox = 0, - my $progressbar = 0, - my $cancel = 0 - }; - bless $self, 'AdminPanel::Rpmdragora::gurpm'; - #my $mainw = bless(ugtk2->new($title, %options, default_width => 600, width => 600), $self); - $self->{factory} = yui::YUI::widgetFactory; - $self->{mainw} = $self->{factory}->createPopupDialog(); - - $self->{mainw}->startMultipleChanges(); - - #$::main_window = $self->{mainw}; - $self->{vbox} = $self->{factory}->createVBox($self->{mainw}); - #OLD $mainw->{label} = gtknew('Label', text => $initializing, alignment => [ 0.5, 0 ]); - $self->{label} = $self->{factory}->createLabel($self->{vbox}, $initializing); - $self->{label}->setStretchable( $yui::YD_HORIZ, 1 ); - # size label's heigh to 2 lines in order to prevent dummy vertical resizing: - #my $context = $mainw->{label}->get_layout->get_context; - #my $metrics = $context->get_metrics($mainw->{label}->style->font_desc, $context->get_language); - #$mainw->{label}->set_size_request(-1, 2 * Gtk2::Pango->PANGO_PIXELS($metrics->get_ascent + $metrics->get_descent)); - - #OLD $mainw->{progressbar} = gtknew('ProgressBar'); - $self->{progressbar} = $self->{factory}->createProgressBar($self->{vbox}, ""); - #gtkadd($mainw->{window}, $mainw->{vbox} = gtknew('VBox', spacing => 5, border_width => 6, children_tight => [ - # $mainw->{label}, - # $mainw->{progressbar} - #])); - #$mainw->{rwindow}->set_position('center-on-parent'); - #$mainw->{real_window}->show_all; - #select(undef, undef, undef, 0.1); #- hackish :-( - #$mainw->SUPER::sync; - $self->{mainw}->pollEvent(); - $self->flush(); - $self; +has 'title' => ( + is => 'rw', + isa => 'Str', +); + +has 'text' => ( + is => 'rw', + isa => 'Str', +); + +has 'main_dialog' => ( + is => 'rw', + isa => 'yui::YDialog', +); + +has 'parent' => ( + is => 'rw', + isa => 'yui::YReplacePoint', +); + +has 'label_widget' => ( + is => 'rw', + isa => 'yui::YLabel', + init_arg => undef, +); + +has 'progressbar' => ( + is => 'rw', + isa => 'yui::YProgressBar', + init_arg => undef, +); + +#============================================================= + +=head2 BUILD + +=head3 DESCRIPTION + + The BUILD method is called after a Moose object is created, + in this methods Services loads all the service information. + +=cut + +#============================================================= +sub BUILD { + my $self = shift; + + my $factory = yui::YUI::widgetFactory; + my $vbox; +$DB::single = 1; + + if (! $self->main_dialog) { + if ($self->parent) { + carp "WARNING: parent parameter is skipped without main_dialog set\n" ; + $self->parent(undef); + } + $self->main_dialog($factory->createPopupDialog()); + $vbox = $factory->createVBox($self->main_dialog); + } + else { + die "parent parameter is mandatory with main_dialog" if !$self->parent; + $self->main_dialog->startMultipleChanges(); + $self->parent->deleteChildren(); + $vbox = $factory->createVBox($self->parent); + $factory->createVSpacing($vbox, 0.5); + } + + $self->label_widget( $factory->createLabel($vbox, $self->text) ); + $self->label_widget->setStretchable( $yui::YD_HORIZ, 1 ); + $self->progressbar( $factory->createProgressBar($vbox, "") ); + + if ($self->parent) { + $factory->createVSpacing($vbox, 0.5); + $self->parent->showChild(); + $self->main_dialog->recalcLayout(); + $self->main_dialog->doneMultipleChanges(); + } + + $self->main_dialog->pollEvent(); + $self->flush(); } + +#============================================================= + +=head2 flush + +=head3 DESCRIPTION + + Polls a dialog event to refresh the dialog + +=cut + +#============================================================= sub flush { my ($self) = @_; - $self->{mainw}->recalcLayout(); - $self->{mainw}->doneMultipleChanges(); - $self->{mainw}->waitForEvent(10); + $self->main_dialog->startMultipleChanges(); + $self->main_dialog->recalcLayout(); + $self->main_dialog->doneMultipleChanges(); - $self->{mainw}->pollEvent(); + if ($self->main_dialog->isTopmostDialog()) { + $self->main_dialog->waitForEvent(10); + $self->main_dialog->pollEvent(); + } + else { + carp "This dialog is not a top most dialog\n"; + } yui::YUI::app()->redrawScreen(); } +#============================================================= + +=head2 label + +=head3 INPUT + + $text: text to be shown on label + +=head3 DESCRIPTION + + Sets the label text + +=cut + +#============================================================= sub label { - my ($self, $label) = @_; + my ($self, $text) = @_; + + $self->main_dialog->startMultipleChanges(); + $self->label_widget->setValue($text) if $text; + $self->main_dialog->doneMultipleChanges(); - $self->{mainw}->startMultipleChanges(); - $self->{label}->setValue($label) if $label; - #select(undef, undef, undef, 0.1); #- hackish :-( $self->flush(); } +#============================================================= + +=head2 progress + +=head3 INPUT + + $value: integer value in the range 0..100 + +=head3 DESCRIPTION + + Sets the progress bar percentage value + +=cut + +#============================================================= sub progress { my ($self, $value) = @_; - state $time; - $time = 0 if(!defined($time)); + state $time = 0; + $value = 0 if !defined($value) || $value < 0; $value = 100 if 100 < $value; - $self->{progressbar}->setValue($value); + + $self->progressbar->setValue($value); return if Time::HiRes::clock_gettime() - $time < 0.333; $time = Time::HiRes::clock_gettime(); - $self->{mainw}->startMultipleChanges(); + $self->flush(); } -sub DESTROY { - my ($self) = @_; - #mygtk2::may_destroy($self); - $self and $self->{mainw}->destroy; - #$self = undef; - $self->{cancel} = undef; #- in case we'll do another one later -} +#============================================================= -sub validate_cancel { - my ($self, $cancel_msg, $cancel_cb) = @_; - $self->{mainw}->startMultipleChanges(); - if (!$self->{cancel}) { - $self->{cancel} = $self->{factory}->createIconButton($self->{vbox},"",$cancel_msg); - #gtkpack__( - #$self->{vbox}, - #$self->{hbox_cancel} = gtkpack__( - #gtknew('HButtonBox'), - #$self->{cancel} = gtknew('Button', text => $cancel_msg, clicked => \&$cancel_cb), - #), - #); - } - #$self->{cancel}->set_sensitive(1); - #$self->{cancel}->show; - $self->flush(); -} +=head2 DEMOLISH -sub invalidate_cancel { - my ($self) = @_; - $self->{cancel} and $self->{cancel}->setEnabled(0); -} +=head3 INPUT -sub invalidate_cancel_forever { - my ($self) = @_; - #$self->{hbox_cancel} or return; - #$self->{hbox_cancel}->destroy; - # FIXME: temporary workaround that prevents - # Gtk2::Label::set_text() set_text_internal() -> queue_resize() -> - # size_allocate() call chain to mess up when ->shrink_topwindow() - # has been called (#32613): - #$self->shrink_topwindow; + $val: boolean value indicating whether or not this method + was called as part of the global destruction process + (when the Perl interpreter exits) + +=head3 DESCRIPTION + + Moose provides a hook for object destruction with the + DEMOLISH method as it does for construtor with BUILD + +=cut + +#============================================================= +sub DEMOLISH { + my ($self, $val) = @_; + + $self->main_dialog->destroy if !$self->parent; } +# sub validate_cancel { +# my ($self, $cancel_msg, $cancel_cb) = @_; +# $self->{main_dialog}->startMultipleChanges(); +# if (!$self->{cancel}) { +# $self->{cancel} = $self->{factory}->createIconButton($self->{vbox},"",$cancel_msg); +# #gtkpack__( +# #$self->{vbox}, +# #$self->{hbox_cancel} = gtkpack__( +# #gtknew('HButtonBox'), +# #$self->{cancel} = gtknew('Button', text => $cancel_msg, clicked => \&$cancel_cb), +# #), +# #); +# } +# #$self->{cancel}->set_sensitive(1); +# #$self->{cancel}->show; +# $self->flush(); +# } +# +# sub invalidate_cancel { +# my ($self) = @_; +# $self->{cancel} and $self->{cancel}->setEnabled(0); +# } +# +# sub invalidate_cancel_forever { +# my ($self) = @_; +# #$self->{hbox_cancel} or return; +# #$self->{hbox_cancel}->destroy; +# # FIXME: temporary workaround that prevents +# # Gtk2::Label::set_text() set_text_internal() -> queue_resize() -> +# # size_allocate() call chain to mess up when ->shrink_topwindow() +# # has been called (#32613): +# #$self->shrink_topwindow; +# } + 1; diff --git a/lib/AdminPanel/Rpmdragora/pkg.pm b/lib/AdminPanel/Rpmdragora/pkg.pm index 96e5b54..f849518 100644 --- a/lib/AdminPanel/Rpmdragora/pkg.pm +++ b/lib/AdminPanel/Rpmdragora/pkg.pm @@ -141,9 +141,9 @@ sub extract_header { $bar_id = statusbar_msg($loc->N("Getting '%s' from XML meta-data...", $xml_info), 0); my $_gurpm_clean_guard = MDK::Common::Func::before_leaving { undef $gurpm }; if (my $xml_info_file = eval { urpm::media::any_xml_info($urpm, $medium, $xml_info, undef, sub { - $gurpm ||= AdminPanel::Rpmdragora::gurpm->new($loc->N("Please wait"), - '', # FIXME: add a real string after cooker - transient => $::main_window); + $gurpm ||= AdminPanel::Rpmdragora::gurpm->new( + text => $loc->N("Please wait"), + ); download_callback($gurpm, @_) or goto header_non_available; }) }) { @@ -213,7 +213,7 @@ sub download_callback { if ($mode eq 'start') { $gurpm->label($loc->N("Downloading package `%s'...", urpm::util::basename($file))); - $gurpm->validate_cancel(but($loc->N("Cancel")), sub { $canceled = 1 }); +# $gurpm->validate_cancel(but($loc->N("Cancel")), sub { $canceled = 1 }); } elsif ($mode eq 'progress') { $gurpm->label( join("\n", @@ -228,7 +228,7 @@ sub download_callback { $gurpm->progress(ceil($percent)); } elsif ($mode eq 'end') { $gurpm->progress(100); - $gurpm->invalidate_cancel; +# $gurpm->invalidate_cancel; } !$canceled; } @@ -457,7 +457,9 @@ sub get_pkgs { myexit (-1) if (warn_about_media($w, %options) == -1); - my $gurpm = AdminPanel::Rpmdragora::gurpm->new(1 ? $loc->N("Please wait") : $loc->N("Package installation..."), $loc->N("Initializing..."), transient => $::main_window); + my $gurpm = AdminPanel::Rpmdragora::gurpm->new( + text => $loc->N("Please wait"), + ); my $_gurpm_clean_guard = MDK::Common::Func::before_leaving { undef $gurpm }; my $urpm = open_urpmi_db(update => $probe_only_for_updates && !is_it_a_devel_distro()); @@ -815,7 +817,10 @@ sub perform_installation { #- (partially) duplicated from /usr/sbin/urpmi :-( # select packages to uninstall for !update mode: perform_removal($urpm, { map { $_ => $pkgs->{$_} } @to_remove }) if !$probe_only_for_updates; - $gurpm = AdminPanel::Rpmdragora::gurpm->new($loc->N("Please wait"), $loc->N("Initializing..."), transient => $::main_window); + $gurpm = AdminPanel::Rpmdragora::gurpm->new( + text => $loc->N("Please wait"), + title => $loc->N("Initializing..."), + ); # my $_gurpm_clean_guard = MDK::Common::Func::before_leaving { undef $gurpm }; my $something_installed; @@ -925,7 +930,7 @@ sub perform_installation { #- (partially) duplicated from /usr/sbin/urpmi :-( }, post_download => sub { $canceled and goto return_with_exit_code; - $gurpm->invalidate_cancel_forever; +# $gurpm->invalidate_cancel_forever; }, need_restart => sub { my ($need_restart_formatted) = @_; @@ -1025,7 +1030,9 @@ sub perform_removal { my ($urpm, $pkgs) = @_; my @toremove = map { MDK::Common::Func::if_($pkgs->{$_}{selected}, $pkgs->{$_}{urpm_name}) } keys %$pkgs; return if !@toremove; - my $gurpm = AdminPanel::Rpmdragora::gurpm->new(1 ? $loc->N("Please wait") : $loc->N("Please wait, removing packages..."), $loc->N("Initializing..."), transient => $::main_window); + my $gurpm = AdminPanel::Rpmdragora::gurpm->new( + text => $loc->N("Please wait") + ); my $_gurpm_clean_guard = MDK::Common::Func::before_leaving { undef $gurpm }; my $may_be_orphans = 1; diff --git a/lib/AdminPanel/rpmdragora.pm b/lib/AdminPanel/rpmdragora.pm index 09c62d8..fd6f5e0 100644 --- a/lib/AdminPanel/rpmdragora.pm +++ b/lib/AdminPanel/rpmdragora.pm @@ -1091,8 +1091,9 @@ sub mirrors { dir => $cachedir, callback => sub { $gurpm ||= - AdminPanel::Rpmdragora::gurpm->new($loc->N("Please wait"), - transient => $::main_window); + AdminPanel::Rpmdragora::gurpm->new( + text => $loc->N("Please wait"), + ); $canceled ||= !AdminPanel::Rpmdragora::pkg::download_callback($gurpm, @_); $gurpm->flush(); diff --git a/modules/rpmdragora/rpmdragora b/modules/rpmdragora/rpmdragora index bc6f706..34b9fc8 100755 --- a/modules/rpmdragora/rpmdragora +++ b/modules/rpmdragora/rpmdragora @@ -254,6 +254,8 @@ sub _do_search($$$$$$) { my $vbox = $factory->createVBox($searchw); my $lblWIP = $factory->createLabel($vbox, $loc->N("Please wait, searching...")); my $searchprogress = $factory->createProgressBar($vbox, ''); + + my $replace_pnt = $factory->createReplacePoint($vbox); # my $stop_button = $factory->createIconButton($vbox,"",$loc->N("Stop")); #gtkadd( @@ -282,22 +284,25 @@ sub _do_search($$$$$$) { my $update_search_pb = sub { $progresscount++; my $val = int($progresscount * 100 / $total_size); - if (!($progresscount % 100)) { - $progresscount <= $total_size and $searchprogress->setValue($val); - $searchw->pollEvent() if $searchw->isTopmostDialog(); # refresh only if top most or crashing - } + $searchprogress->setValue($val); + $searchw->pollEvent() if $searchw->isTopmostDialog(); # refresh only if top most or crashing }; + my $gurpm; # per medium download progress bar (if needed) + my $_gurpm_clean_guard = MDK::Common::Func::before_leaving { undef $gurpm }; foreach my $medium (grep { !$_->{ignore} } @{$urpm->{media}}) { $searchstop and last; - my $gurpm; # per medium download progress bar (if needed) - my $_gurpm_clean_guard = MDK::Common::Func::before_leaving { undef $gurpm }; + my $xml_info_file = urpm::media::any_xml_info($urpm, $medium, ($current_search_type eq 'files' ? 'files' : 'info'), undef, sub { - $gurpm ||= AdminPanel::Rpmdragora::gurpm->new($loc->N("Please wait"), - transient => $::main_window); + $gurpm ||= AdminPanel::Rpmdragora::gurpm->new( + text => $loc->N("Please wait"), + main_dialog => $searchw, + parent => $replace_pnt, + ); + $gurpm->progress(0); download_callback($gurpm, @_) or do { $searchstop = 1; }; |