diff options
-rw-r--r-- | lib/AdminPanel/Rpmdragora/gui.pm | 125 | ||||
-rwxr-xr-x | modules/rpmdragora/dragoraUpdate | 31 | ||||
-rwxr-xr-x | modules/rpmdragora/rpmdragora | 120 |
3 files changed, 207 insertions, 69 deletions
diff --git a/lib/AdminPanel/Rpmdragora/gui.pm b/lib/AdminPanel/Rpmdragora/gui.pm index 5606c7cb..6985b1a5 100644 --- a/lib/AdminPanel/Rpmdragora/gui.pm +++ b/lib/AdminPanel/Rpmdragora/gui.pm @@ -64,6 +64,7 @@ our @EXPORT = qw( $urpm %grp_columns %pkg_columns + %hidden_info @filtered_pkgs @initial_selection ask_browse_tree_given_widgets_for_rpmdragora @@ -95,6 +96,13 @@ my $loc = AdminPanel::rpmdragora::locale(); our ($descriptions, %filters, @filtered_pkgs, %filter_methods, $force_displaying_group, $force_rebuild, @initial_selection, $pkgs, $size_free, $size_selected, $urpm); our ($results_ok, $results_none) = ($loc->N("Search results"), $loc->N("Search results (none)")); +our %hidden_info = ( + details => "details", + changelog => "changelog", + files => "file", + new_deps => "new_deps", + +); our %grp_columns = ( label => 0, icon => 2, @@ -291,14 +299,42 @@ sub get_url_link { sub files_format { my ($files) = @_; - ugtk2::markup_to_TextView_format( +# ugtk2::markup_to_TextView_format( '<tt>' . $spacing #- to highlight information . join("\n$spacing", map { "\x{200e}$_" } @$files) - . '</tt>'); + . '</tt>'; +} + +#============================================================= + +=head2 format_link + +=head3 INPUT + + $description: Description to be shown as link + $url: to be reach when click on $description link + +=head3 OUTPUT + + $webref: href HTML tag + +=head3 DESCRIPTION + + This function returns an href string to be published + +=cut + +#============================================================= +sub format_link { + my ($description, $url) = @_; + + my $webref = "<a href=\"". $url ."\">". $description ."</a>"; + + return $webref; } sub format_pkg_simplifiedinfo { - my ($pkgs, $key, $urpm, $descriptions) = @_; + my ($pkgs, $key, $urpm, $descriptions, $options) = @_; my ($name) = split_fullname($key); my $pkg = $pkgs->{$key}; my $upkg = $pkg->{pkg}; @@ -323,16 +359,32 @@ sub format_pkg_simplifiedinfo { #push @$s, [ gtkadd(gtkshow(my $details_exp = Gtk2::Expander->new(format_field($loc->N("Details:")))), # gtknew('TextView', text => get_details($pkg, $upkg, $installed_version, $raw_medium))) ]; - my $details = get_details($pkg, $upkg, $installed_version, $raw_medium); - utf8::encode($details); - push @$s, join("\n", format_field($loc->N("Details:")). "\n" . $details); - #$details_exp->set_use_markup(1); - push @$s, [ "\n\n" ]; + my $detail_link = format_link(format_field($loc->N("Details:")), $hidden_info{details} ); + if ($options->{details}) { + my $details = get_details($pkg, $upkg, $installed_version, $raw_medium); + utf8::encode($details); + $detail_link .= "\n" . $details; + } + push @$s, join("\n", $detail_link, "\n"); + #push @$s, [ build_expander($pkg, $loc->N("Files:"), 'files', sub { files_format($pkg->{files}) }) ]; - push @$s, [ "\n\n" ]; + my $files_link = format_link(format_field($loc->N("Files:")), $hidden_info{files} ); + if ($options->{files}) { +# my $files = files_format($pkg->{files}); +# utf8::encode($files); +# $files_link .= "\n" . $files; + } + push @$s, join("\n", $files_link, "\n"); + #push @$s, [ build_expander($pkg, $loc->N("Changelog:"), 'changelog', sub { $pkg->{changelog} }, $installed_version) ]; + my $changelog_link = format_link(format_field($loc->N("Changelog:")), $hidden_info{changelog} ); + if ($options->{files}) { +# my $changelog = $pkg->{changelog}; +# utf8::encode($changelog); +# $changelog_link .= "\n" . $changelog; + } + push @$s, join("\n", $changelog_link, "\n"); - push @$s, [ "\n\n" ]; if ($upkg->id) { # If not installed # push @$s, get_new_deps($urpm, $upkg); } @@ -1018,7 +1070,7 @@ sub callback_choices { #============================================================= sub setInfoOnWidget { - my ($pkgname, $infoWidget) = @_; + my ($pkgname, $infoWidget, $options) = @_; return if( ref $infoWidget ne "yui::YRichText"); @@ -1026,7 +1078,7 @@ sub setInfoOnWidget { my $info_text ="<h2>" . $loc->N("Informations") . "</h2>"; - my @data = get_info($pkgname); + my @data = get_info($pkgname, $options); for(@{$data[0]}){ if(ref $_ ne "ARRAY"){ $info_text .= "<br />" . $_; @@ -1467,13 +1519,33 @@ or you already installed all of them.")); statusbar_msg_remove($wait) if defined $wait; } +#============================================================= + +=head2 get_info + +=head3 INPUT + + $key: package full name + $options: HASH reference containing: + details => show details + changelog => show changelog + files => show files + new_deps => show new dependencies + +=head3 DESCRIPTION + + return a format_pkg_simplifiedinfo + +=cut + +#============================================================= sub get_info { - my ($key, $widget) = @_; + my ($key, $options) = @_; #- the package information hasn't been loaded. Instead of rescanning the media, just give up. exists $pkgs->{$key} or return [ [ $loc->N("Description not available for this package\n") ] ]; #- get the description if needed: - exists $pkgs->{$key}{description} or slow_func($widget, sub { extract_header($pkgs->{$key}, $urpm, 'info', find_installed_version($pkgs->{$key}{pkg})) }); - format_pkg_simplifiedinfo($pkgs, $key, $urpm, $descriptions); + exists $pkgs->{$key}{description} or slow_func("", sub { extract_header($pkgs->{$key}, $urpm, 'info', find_installed_version($pkgs->{$key}{pkg})) }); + format_pkg_simplifiedinfo($pkgs, $key, $urpm, $descriptions, $options); } sub sort_callback { @@ -1488,6 +1560,29 @@ sub run_help_callback { run_program::raw({ detach => 1, as_user => 1 }, 'www-browser', $url); } +#============================================================= + +=head2 run_browser + +=head3 INPUT + + $url: url to be passed to the configured browser + +=head3 DESCRIPTION + + This function calls the browser with the given URL + +=cut + +#============================================================= +sub run_browser { + my $url = shift; + + my ($user) = grep { $_->[2] eq $ENV{USERHELPER_UID} } list_passwd(); + local $ENV{HOME} = $user->[7] if $user && $ENV{USERHELPER_UID}; + run_program::raw({ detach => 1, as_user => 1 }, 'www-browser', $url); +} + sub groups_tree { return %groups_tree; } diff --git a/modules/rpmdragora/dragoraUpdate b/modules/rpmdragora/dragoraUpdate index b0c4247d..cdc5c478 100755 --- a/modules/rpmdragora/dragoraUpdate +++ b/modules/rpmdragora/dragoraUpdate @@ -252,6 +252,8 @@ sub run_treeview_dialog { my $closeButton = $factory->createPushButton($hbox, $loc->N("Quit") ); $statusbar = $factory->createBusyIndicator($vbox, "" ); + my $info_options = {}; + while(1) { my $event = $dialog->waitForEvent(); my $eventType = $event->eventType(); @@ -260,6 +262,31 @@ sub run_treeview_dialog { if ($eventType == $yui::YEvent::CancelEvent) { last if quit(); } + elsif ($eventType == $yui::YEvent::MenuEvent) { + my $item = $event->item(); + if (!$item) { + #URL emitted or at least a ref into RichText widget + my $url = yui::toYMenuEvent($event)->id (); + $item = $packageTbl->selectedItem(); + my $pkg = $data{$item->index()}{fullname}; + if ($url eq $AdminPanel::Rpmdragora::gui::hidden_info{details}) { + $info_options->{details} = 1; + AdminPanel::Rpmdragora::gui::setInfoOnWidget($pkg, $infoBox, $info_options); + } + elsif ($url eq $AdminPanel::Rpmdragora::gui::hidden_info{files}) { + $info_options->{files} = 1; + AdminPanel::Rpmdragora::gui::setInfoOnWidget($pkg, $infoBox, $info_options); + } + elsif ($url eq $AdminPanel::Rpmdragora::gui::hidden_info{changelog}) { + $info_options->{changelog} = 1; + AdminPanel::Rpmdragora::gui::setInfoOnWidget($pkg, $infoBox, $info_options); + } + else { + # default it's really a URL + AdminPanel::Rpmdragora::gui::run_browser($url); + } + } + } elsif ($eventType == $yui::YEvent::WidgetEvent) { # widget selected my $widget = $event->widget(); @@ -295,6 +322,7 @@ sub run_treeview_dialog { my $item = $packageTbl->selectedItem(); if ($item) { my $pkg = $data{$item->index()}{fullname}; + $info_options = {}; AdminPanel::Rpmdragora::gui::setInfoOnWidget($pkg, $infoBox); } my $wEvent = yui::toYWidgetEvent($event); @@ -308,9 +336,6 @@ sub run_treeview_dialog { } yui::YUI::app()->normalCursor(); } - elsif ($widget == $infoBox) { - print "RichText widget Event\n"; - } elsif ($widget == $selectButton) { yui::YUI::app()->busyCursor(); $initialized = 0; diff --git a/modules/rpmdragora/rpmdragora b/modules/rpmdragora/rpmdragora index 51f2b55b..f566a76b 100755 --- a/modules/rpmdragora/rpmdragora +++ b/modules/rpmdragora/rpmdragora @@ -198,14 +198,14 @@ sub detaillist_changeditem_callback { } sub detaillist_callback { - my ($selection, $info, $options) = @_; + my ($selection, $info, $options, $show_options) = @_; $info->setValue(""); return if( ref $selection ne "yui::YItem"); my $info_text ="<h2>" . $loc->N("Informations") . "</h2>"; - my @data = get_info($options->{table_item_list}[$selection->index()],$info->parent()->parent()); + my @data = get_info($options->{table_item_list}[$selection->index()], $show_options); for(@{$data[0]}){ if(ref $_ ne "ARRAY"){ $info_text .= "<br />" . $_; @@ -1084,6 +1084,8 @@ sub run_treeview_dialog { ask_browse_tree_given_widgets_for_rpmdragora($options); + my $info_options = {}; + ######## main loop #################### while(1) { my $event = $my_win->waitForEvent(); @@ -1098,58 +1100,73 @@ sub run_treeview_dialog { elsif ($eventType == $yui::YEvent::MenuEvent) { ### MENU ### my $item = $event->item(); - my $menuLabel = $item->label(); - if ($menuLabel eq $fileMenu{ quit }->label()) { - #menu File->Quit - quit(); - last; - } - elsif ($menuLabel eq $fileMenu{ update }->label()) { - update_sources_interactive($urpm, transient => $my_win) - and $reload_db_and_clear_all->(); + if (!$item) { + #URL emitted or at least a ref into RichText widget + my $url = yui::toYMenuEvent($event)->id (); + $item = $detail_list->selectedItem(); + if ($url eq $AdminPanel::Rpmdragora::gui::hidden_info{details}) { + $info_options->{details} = 1; + detaillist_callback($item, $info, \%$options, $info_options); + } + else { + # default it's really a URL + AdminPanel::Rpmdragora::gui::run_browser($url); + } } - elsif ($menuLabel eq $fileMenu{ reset_sel }->label()) { - if ($MODE ne 'remove') { - my $db = eval { open_rpm_db() }; - if (!ref($db)) { - statusbar_msg($loc->N("Reset aborted (RPM DB is locked by another process)"), 1); - return; + else { + my $menuLabel = $item->label(); + if ($menuLabel eq $fileMenu{ quit }->label()) { + #menu File->Quit + quit(); + last; + } + elsif ($menuLabel eq $fileMenu{ update }->label()) { + update_sources_interactive($urpm, transient => $my_win) + and $reload_db_and_clear_all->(); + } + elsif ($menuLabel eq $fileMenu{ reset_sel }->label()) { + if ($MODE ne 'remove') { + my $db = eval { open_rpm_db() }; + if (!ref($db)) { + statusbar_msg($loc->N("Reset aborted (RPM DB is locked by another process)"), 1); + return; + } + $urpm->disable_selected( + $db, $urpm->{state}, + map { if_($pkgs->{$_}{selected}, $pkgs->{$_}{pkg}) } keys %$pkgs,); } - $urpm->disable_selected( - $db, $urpm->{state}, - map { if_($pkgs->{$_}{selected}, $pkgs->{$_}{pkg}) } keys %$pkgs,); + undef $pkgs->{$_}{selected} foreach keys %$pkgs; + reset_search(); + $size_selected = 0; + $force_displaying_group = 1; + my $tree_selection = $tree->currentItem(); + } + elsif ($menuLabel eq $fileMenu{ reload }->label()) { + $reload_db_and_clear_all->(); + } + elsif ($menuLabel eq $helpMenu{ about }->label()) { + my $translators = $loc->N("_: Translator(s) name(s) & email(s)\n"); + $translators =~ s/\</\<\;/g; + $translators =~ s/\>/\>\;/g; + my $sh_gui = AdminPanel::Shared::GUI->new(); + $sh_gui->AboutDialog({ name => "Rpmdragora", + version => "TODO", + credits => $loc->N("Copyright (C) %s Mageia community", '2013-2014'), + license => $loc->N("GPLv2"), + description => $loc->N("Rpmdragora is the Mageia package management tool."), + authors => $loc->N("<h3>Developers</h3> + <ul><li>%s</li> + <li>%s</li> + </ul> + <h3>Translators</h3> + <ul><li>%s</li></ul>", + "Angelo Naselli <anaselli\@linux.it>", + "Matteo Pasotti <matteo.pasotti\@gmail.com>", + $translators + ), + } + ); } - undef $pkgs->{$_}{selected} foreach keys %$pkgs; - reset_search(); - $size_selected = 0; - $force_displaying_group = 1; - my $tree_selection = $tree->currentItem(); - } - elsif ($menuLabel eq $fileMenu{ reload }->label()) { - $reload_db_and_clear_all->(); - } - elsif ($menuLabel eq $helpMenu{ about }->label()) { - my $translators = $loc->N("_: Translator(s) name(s) & email(s)\n"); - $translators =~ s/\</\<\;/g; - $translators =~ s/\>/\>\;/g; - my $sh_gui = AdminPanel::Shared::GUI->new(); - $sh_gui->AboutDialog({ name => "Rpmdragora", - version => "TODO", - credits => $loc->N("Copyright (C) %s Mageia community", '2013-2014'), - license => $loc->N("GPLv2"), - description => $loc->N("Rpmdragora is the Mageia package management tool."), - authors => $loc->N("<h3>Developers</h3> - <ul><li>%s</li> - <li>%s</li> - </ul> - <h3>Translators</h3> - <ul><li>%s</li></ul>", - "Angelo Naselli <anaselli\@linux.it>", - "Matteo Pasotti <matteo.pasotti\@gmail.com>", - $translators - ), - } - ); } } elsif ($eventType == $yui::YEvent::WidgetEvent) { @@ -1180,6 +1197,7 @@ sub run_treeview_dialog { tree_callback($tree->currentItem(),\%$options); } elsif ($widget == $detail_list){ + $info_options = {}; detaillist_callback($detail_list->selectedItem(), $info, \%$options); detaillist_changeditem_callback($detail_list, \%$options); } |