diff options
Diffstat (limited to 'modules')
| -rwxr-xr-x | modules/rpmdragora/rpmdragora | 472 |
1 files changed, 222 insertions, 250 deletions
diff --git a/modules/rpmdragora/rpmdragora b/modules/rpmdragora/rpmdragora index e24b3865..29077b07 100755 --- a/modules/rpmdragora/rpmdragora +++ b/modules/rpmdragora/rpmdragora @@ -28,7 +28,7 @@ use File::ShareDir ':ALL'; -use MDK::Common::Func qw(any if_); +use MDK::Common::Func qw(any if_ before_leaving); use utf8; use MDK::Common::DataStructure qw(uniq intersection); @@ -73,46 +73,50 @@ my $loc = AdminPanel::rpmdragora::locale(); my %elems; -my $old_value; - -sub viewbox_callback { +sub _viewbox_callback { my ($selection, $options, $wanted_categories) = @_; - my $val = $selection; - $old_value="" if(!defined($old_value)); - return if $val eq $old_value; # workarounding gtk+ sending us sometimes twice events + state $old_index = -1; + + # TODO add a check on selection type YItem + my $curr_index = $selection->index(); + return 0 if $curr_index == $old_index; yui::YUI::app()->busyCursor(); - $old_value = $val; - $default_list_mode = $options->{rviews}{$val}; + $old_index = $curr_index; + $default_list_mode = $options->{rviews}->[$curr_index]; # NOTE an undef value assignment produces a an array containing undef that is not a valid value to pass to # join into writeconf() - @$mandrakeupdate_wanted_categories = $wanted_categories->{$options->{rviews}{$val}} ? - @{$wanted_categories->{$options->{rviews}{$val}}} : + @$mandrakeupdate_wanted_categories = $wanted_categories->{$options->{rviews}->[$curr_index]} ? + @{$wanted_categories->{$options->{rviews}->[$curr_index]}} : (); - if ($options->{tree_mode} ne $val) { - $tree_mode->[0] = $options->{tree_mode} = $options->{rviews}{$val}; + if ($options->{tree_mode} ne $options->{rviews}->[$curr_index]) { + $tree_mode->[0] = $options->{tree_mode} = $options->{rviews}->[$curr_index]; $tree_flat->[0] = $options->{state}{flat}; reset_search(); - switch_pkg_list_mode($options->{rviews}{$val}); + switch_pkg_list_mode($options->{rviews}->[$curr_index]); $options->{rebuild_tree}->(); } yui::YUI::app()->normalCursor(); + + return 1; } -sub filterbox_callback { +sub _filterbox_callback { my ($selection, $options, $rfilters) = @_; - state $oldval; - my $val = $selection; - return if $val eq $oldval; # workarounding gtk+ sending us sometimes twice events + state $old_index = -1; + + # TODO add a check on selection type YItem + my $curr_index = $selection->index(); + return 0 if $curr_index == $old_index; yui::YUI::app()->busyCursor(); - $oldval = $val; - $val = $$rfilters{$val}; + $old_index = $curr_index; + my $val = $rfilters->[$curr_index]; if ($filter->[0] ne $val) { $filter->[0] = $val; reset_search(); @@ -121,9 +125,37 @@ sub filterbox_callback { } yui::YUI::app()->normalCursor(); + + return 1; } + +sub _searchmenu_callback { + my ($selection, $options, $search_types, $current_search_type) = @_; + state $old_index = -1; + + # TODO add a check on selection type YItem + my $curr_index = $selection->index(); + return 0 if $curr_index == $old_index; + + yui::YUI::app()->busyCursor(); + + $old_index = $curr_index; + my $val = $search_types->[$curr_index]; + if ($$current_search_type ne $val) { + $$current_search_type = $val; + reset_search(); + slow_func(sub { switch_pkg_list_mode($default_list_mode) }); + $options->{rebuild_tree}->(); + } + + yui::YUI::app()->normalCursor(); + + return 1; +} + + my $current_group = -1; -sub tree_callback { +sub _tree_callback { my ($selection, $options) = @_; #OLD my ($model, $iter) = $tree->currentItem(); #OLD return if !$iter; @@ -154,7 +186,7 @@ sub tree_callback { return; } -sub detaillist_changeditem_callback { +sub _detaillist_changeditem_callback { my ($detail_list, $options) = @_; my $changedItem = $detail_list->changedItem(); return if (!$changedItem); @@ -227,8 +259,10 @@ sub _do_search($$$$$$) { my $searchw = $factory->createPopupDialog; my $vbox = $factory->createVBox($searchw); my $lblWIP = $factory->createLabel($vbox, $loc->N("Please wait, searching...")); - my $searchprogress = $factory->createProgressBar($vbox, 'ProgressBar'); - my $stop_button = $factory->createIconButton($vbox,"",$loc->N("Stop")); + my $searchprogress = $factory->createProgressBar($vbox, ''); + + my $replace_pnt = $factory->createReplacePoint($vbox); +# my $stop_button = $factory->createIconButton($vbox,"",$loc->N("Stop")); #gtkadd( #$searchw->{window}, @@ -246,86 +280,90 @@ sub _do_search($$$$$$) { #), #); #$searchw->sync; - $searchw->pollEvent(); $searchw->recalcLayout(); - $searchw->doneMultipleChanges(); + $searchw->pollEvent(); + # should probably not account backports packages or find a way to search them: - my $total_size = keys %$pkgs; - my $progresscount; - - my $update_search_pb = sub { - $progresscount++; - if (!($progresscount % 100)) { - $progresscount <= $total_size and $searchprogress->setValue($progresscount/$total_size); - $searchw->flush; # refresh and handle clicks - } - }; - foreach my $medium (grep { !$_->{ignore} } @{$urpm->{media}}) { - $searchstop and last; - my $gurpm; # per medium download progress bar (if needed) - my $_gurpm_clean_guard = 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); - download_callback($gurpm, @_) or do { - $searchstop = 1; - }; - }); - if (!$xml_info_file) { - $urpm->{error}($loc->N("no xml-info available for medium \"%s\"", $medium->{name})); - next; - } - $searchstop and last; - - require urpm::xml_info; - require urpm::xml_info_pkg; - - $urpm->{log}("getting information from $xml_info_file"); - if ($current_search_type eq 'files') { - # special version for speed (3x faster), hopefully fully compatible - my $F = urpm::xml_info::open_lzma($xml_info_file); - my $fn; - local $_; - while (<$F>) { - if ($searchstop) { - statusbar_msg($loc->N("Search aborted"), 1); - goto end_search; - } - if (m!^<!) { - ($fn) = /fn="(.*)"/; - $update_search_pb->(); - } elsif (/$entry_rx/) { - $fn or $urpm->{fatal}("fast algorithm is broken, please report a bug"); - push @search_results, $fn; - } - } - } else { - eval { - urpm::xml_info::do_something_with_nodes( - 'info', - $xml_info_file, - sub { - $searchstop and die 'search aborted'; - my ($node) = @_; - $update_search_pb->(); - push @search_results, $node->{fn} if $node->{description} =~ $entry_rx; - #$searchstop and last; - return 0 || $searchstop; - }, - ); - }; - my $err = $@; - if ($err =~ /search aborted/) { + my $total_size = scalar keys %$pkgs; + my $progresscount = 0; + + my $update_search_pb = sub { + $progresscount++; + my $val = int($progresscount * 100 / $total_size); + $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 $xml_info_file = + urpm::media::any_xml_info($urpm, $medium, + ($current_search_type eq 'files' ? 'files' : 'info'), + undef, + sub { + $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; + }; + }); + if (!$xml_info_file) { + $urpm->{error}($loc->N("no xml-info available for medium \"%s\"", $medium->{name})); + next; + } + $searchstop and last; + + require urpm::xml_info; + require urpm::xml_info_pkg; + + $urpm->{log}("getting information from $xml_info_file"); + if ($current_search_type eq 'files') { + # special version for speed (3x faster), hopefully fully compatible + my $F = urpm::xml_info::open_lzma($xml_info_file); + my $fn; + local $_; + while (<$F>) { + if ($searchstop) { statusbar_msg($loc->N("Search aborted"), 1); + goto end_search; } + if (m!^<!) { + ($fn) = /fn="(.*)"/; + $update_search_pb->(); + } elsif (/$entry_rx/) { + $fn or $urpm->{fatal}("fast algorithm is broken, please report a bug"); + push @search_results, $fn; + } + } + } else { + eval { + urpm::xml_info::do_something_with_nodes( + 'info', + $xml_info_file, + sub { + $searchstop and die 'search aborted'; + my ($node) = @_; + $update_search_pb->(); + push @search_results, $node->{fn} if $node->{description} =~ $entry_rx; + #$searchstop and last; + return 0 || $searchstop; + }, + ); + }; + my $err = $@; + if ($err =~ /search aborted/) { + statusbar_msg($loc->N("Search aborted"), 1); } } + } - end_search: + end_search: @search_results = uniq(@search_results); #- there can be multiple packages with same version/release for different arch's @search_results = intersection(\@search_results, \@filtered_pkgs); $searchw->destroy; @@ -358,11 +396,11 @@ sub _do_search($$$$$$) { my $tree_selection = $tree->currentItem(); } -sub quit { +sub _quit { real_quit(); } -sub run_treeview_dialog { +sub _run_treeview_dialog { my ($callback_action) = @_; my ($options, $tree, $detail_list, $detail_list_model); @@ -416,33 +454,8 @@ sub run_treeview_dialog { $tree = $factory->createTree($hbox_middle, ""); $tree->setWeight(0,20); $tree->setNotify(1); - #OLD $tree->get_selection->set_mode('browse'); - - #OLD $tree->append_column(Gtk2::TreeViewColumn->new_with_attributes(undef, Gtk2::MDV::CellRendererPixWithLabel->new, 'pixbuf' => $grp_columns{icon}, label => $grp_columns{label})); - #OLD $tree->set_headers_visible(0); - - #OLD $detail_list_model = Gtk2::ListStore->new("Glib::String", - # "Gtk2::Gdk::Pixbuf", - # "Glib::String", - # "Glib::Boolean", - # "Glib::String", - # "Glib::String", - # "Glib::String", - # "Glib::String", - # "Glib::Boolean"); - #OLD $detail_list = Gtk2::TreeView->new_with_model($detail_list_model); - my $detail_list_header = new yui::YTableHeader(); - #$detail_list->append_column( - # my $col_sel = Gtk2::TreeViewColumn->new_with_attributes( - # undef, - # Gtk2::CellRendererToggle->new, - # active => $pkg_columns{selected}, - # activatable => $pkg_columns{selectable} - # )); - #$col_sel->set_fixed_width(34); # w/o this the toggle cells are not displayed - #$col_sel->set_sizing('fixed'); - #$col_sel->set_sort_column_id($pkg_columns{selected}); + my $detail_list_header = new yui::YTableHeader(); my $display_arch_col = to_bool(arch() =~ /64/); my @columns = (qw(name summary version release), if_($display_arch_col, 'arch')); @@ -475,44 +488,14 @@ sub run_treeview_dialog { ## check column is first no title needed here, but we need to add it $detail_list_header->addColumn(""); foreach my $col (@columns{@columns}) { - #OLD $detail_list->append_column( - # $col->{widget} = - # Gtk2::TreeViewColumn->new_with_attributes( - # ' ' . $col->{title} . ' ', - # $col->{renderer} = Gtk2::CellRendererText->new, - # ($col->{markup} ? (markup => $col->{markup}) : (text => $col->{text})), - # ) - # ); - #$col->{widget}->set_sort_column_id($col->{markup} || $col->{text}); $detail_list_header->addColumn($col->{title}); } - #OLD $columns{$_}{widget}->set_sizing('autosize') foreach @columns; - #OLD $columns{name}{widget}->set_property('expand', '1'); - #OLD $columns{name}{renderer}->set_property('ellipsize', 'end'); - #OLD $columns{$_}{renderer}->set_property('xpad', '6') foreach @columns; - #OLD $columns{name}{widget}->set_resizable(1); - #OLD $detail_list_model->set_sort_column_id($pkg_columns{text}, 'ascending'); - #OLD $detail_list_model->set_sort_func($pkg_columns{version}, \&sort_callback); - #OLD $detail_list->set_rules_hint(1); - - #OLD $detail_list->append_column( - # my $pixcolumn = - # Gtk2::TreeViewColumn->new_with_attributes( - # #-PO: "Status" should be kept *small* !!! - # $loc->N("Status"), - # my $rdr = Gtk2::CellRendererPixbuf->new, - # 'pixbuf' => $pkg_columns{state_icon}) - # ); - #$rdr->set_fixed_size(34, 24); - #$pixcolumn->set_sort_column_id($pkg_columns{state}); $detail_list_header->addColumn($loc->N("Status")); - # it should be istanciated this way $detail_list = $mgaFactory->createCBTable($hbox_middle,$detail_list_header,$yui::YCBTableCheckBoxOnFirstColumn); $detail_list->setWeight(0,50); $detail_list->setImmediateMode(1); - #OLD compute_main_window_size($w); =for comment my $cursor_to_restore; @@ -548,13 +531,12 @@ sub run_treeview_dialog { my $is_backports = get_inactive_backport_media(fast_open_urpmi_db()); - my %filters = (all => $loc->N("All"), - installed => $loc->N("Installed"), - non_installed => $loc->N("Not installed"), - ); - - my %rfilters = reverse %filters; - + my %filters = ( + all => $loc->N("All"), + installed => $loc->N("Installed"), + non_installed => $loc->N("Not installed"), + ); + my @ordered_filters = (qw (all installed non_installed) ); # handle migrating config file from rpmdragora <= 4.9 if (exists $filters{$default_list_mode}) { @@ -574,21 +556,20 @@ sub run_treeview_dialog { by_source => $loc->N("All packages, by medium repository"), ); - - my %views = (all => $loc->N("All"), - if_($is_backports, backports => - #-PO: Backports media are newer but less-tested versions of some packages in main - #-PO: See http://wiki.mandriva.com/en/Policies/SoftwareMedia#.2Fmain.2Fbackports - $loc->N("Backports")), - meta_pkgs => $loc->N("Meta packages"), - gui_pkgs => $loc->N("Packages with GUI"), - all_updates => $loc->N("All updates"), - security => $loc->N("Security updates"), - bugfix => $loc->N("Bugfixes updates"), - normal => $loc->N("General updates") - ); - my %rviews = reverse %views; - $options->{rviews} = \%rviews; + my %views = ( + all => $loc->N("All"), + if_($is_backports, backports => $loc->N("Backports")), + meta_pkgs => $loc->N("Meta packages"), + gui_pkgs => $loc->N("Packages with GUI"), + all_updates => $loc->N("All updates"), + security => $loc->N("Security updates"), + bugfix => $loc->N("Bugfixes updates"), + normal => $loc->N("General updates") + ); + my @ordered_views = (qw (all meta_pkgs gui_pkgs all_updates security normal) ); + push @ordered_views, 'backports' if $is_backports; + + $options->{rviews} = \@ordered_views; my %default_mode = (install => 'all', # we want the new GUI by default instead of "non_installed" remove => 'installed', @@ -602,76 +583,52 @@ sub run_treeview_dialog { ); my $view_box = $factory->createComboBox($hbox_top,""); - $view_box->addItem($views{all}); - $view_box->addItem($views{meta_pkgs}); - $view_box->addItem($views{gui_pkgs}); - $view_box->addItem($views{all_updates}); - $view_box->addItem($views{security}); - $view_box->addItem($views{normal}); - $view_box->addItem($views{backports}) if($is_backports); + my $itemColl = new yui::YItemCollection; + + foreach (@ordered_views) { + my $item = yui::YItem->new("$views{$_}", 0); + $item->setSelected(1) if defined($views{$default_list_mode}) && $_ eq $default_list_mode; + $itemColl->push($item); + $item->DISOWN(); + } + $view_box->addItems($itemColl); $view_box->setNotify(1); - $view_box->selectItem($view_box->findItem($views{$default_list_mode})) if(defined($views{$default_list_mode})); $options->{tree_submode} ||= $default_list_mode; $options->{tree_subflat} ||= $options->{state}{flat}; -=for comment - * OLD * - my $filter_box = gtknew( - 'ComboBox', - list => [ qw(all installed non_installed) ], text => $filters{$filter->[0]}, - format => sub { $filters{$_[0]} }, - tip => $loc->N("Filter"), - changed => sub { - state $oldval; - my $val = $_[0]->get_text; - return if $val eq $oldval; # workarounding gtk+ sending us sometimes twice events - $oldval = $val; - $val = $rfilters{$val}; - if ($filter->[0] ne $val) { - $filter->[0] = $val; - reset_search(); - slow_func($::main_window->window, sub { switch_pkg_list_mode($default_list_mode) }); - $options->{rebuild_tree}->(); - } - } - ); - - my $view_callback = sub { - my ($val) = @_; - return if $val eq $old_value; # workarounding gtk+ sending us sometimes twice events - $old_value = $val; - return if $mode->[0] eq $val; - $mode->[0] = $val; - $tree_flat->[0] = $options->{state}{flat} = member($mode->[0], qw(flat by_leaves by_selection by_size)); - - if ($options->{tree_mode} ne $val) { - reset_search(); - $options->{rebuild_tree}->(); - } - }; -=cut my $filter_box = $factory->createComboBox($hbox_top,""); - $filter_box->addItem($filters{all}); - $filter_box->addItem($filters{installed}); - $filter_box->addItem($filters{non_installed}); - $filter_box->selectItem($filter_box->findItem($filters{$filter->[0]})) if(defined($filters{$filter->[0]})); + $itemColl = new yui::YItemCollection; + + foreach (@ordered_filters) { + my $item = yui::YItem->new("$filters{$_}", 0); + $item->setSelected(1) if defined($filters{$filter->[0]}) && $_ eq $filter->[0]; + $itemColl->push($item); + $item->DISOWN(); + } + $filter_box->addItems($itemColl); $filter_box->setNotify(1); - my @search_types = qw(normal descriptions summaries files); + + my %local_search_types = ( + normal => $loc->N("in names"), + descriptions => $loc->N("in descriptions"), + summaries => $loc->N("in summaries"), + files => $loc->N("in file names"), + ); + my @search_types = ( qw(normal descriptions summaries files) ); my $current_search_type = $search_types[0]; - #OLD my $search_menu = Gtk2::Menu->new; + my $search_menu = $factory->createComboBox($hbox_top,""); - my $i = 0; - my $previous; - foreach ($loc->N("in names"), $loc->N("in descriptions"), $loc->N("in summaries"), $loc->N("in file names")) { - my ($name, $val) = ($_, $i); - #OLD $search_menu->append(gtksignal_connect(gtkshow( - # $previous = Gtk2::RadioMenuItem->new_with_label($previous, $name)), - # activate => sub { $current_search_type = $search_types[$val] })); - $search_menu->addItem($name); - $i++; + $itemColl = new yui::YItemCollection; + foreach (@search_types) { + my $item = yui::YItem->new("$local_search_types{$_}", 0); + $item->setSelected(1) if defined($local_search_types{$current_search_type}) && $_ eq $current_search_type; + $itemColl->push($item); + $item->DISOWN(); } + $search_menu->addItems($itemColl); + $search_menu->setNotify(1); $find_entry = $factory->createInputField($hbox_top, ""); @@ -742,7 +699,7 @@ sub run_treeview_dialog { my $NVR_string = $loc->N("/_Options") . "/" . $loc->N("Search in _full package names"); my $regexp_search_string = $loc->N("/_Options") . "/" . $loc->N("Use _regular expressions in searches"); - my $itemColl = new yui::YItemCollection; + $itemColl = new yui::YItemCollection; # build File menu my %fileMenu = ( widget => $factory->createMenuButton($headbar,$loc->N("File")), @@ -1064,7 +1021,7 @@ sub run_treeview_dialog { my $info_options = {}; # select group and show items evenctually - tree_callback($tree->currentItem(),\%$options); + _tree_callback($tree->currentItem(),\%$options); ######## main loop #################### while(1) { @@ -1074,7 +1031,7 @@ sub run_treeview_dialog { #event type checking if ($eventType == $yui::YEvent::CancelEvent) { - last if quit(); + last if _quit(); } elsif ($eventType == $yui::YEvent::MenuEvent) { ### MENU ### @@ -1096,7 +1053,7 @@ sub run_treeview_dialog { print "Menu " . $menuLabel . " chosen\n"; if ($menuLabel eq $fileMenu{ quit }->label()) { #menu File->Quit - last if quit(); + last if _quit(); } elsif ($menuLabel eq $fileMenu{ update }->label()) { update_sources_interactive($urpm, transient => $my_win) @@ -1157,6 +1114,7 @@ print "Menu " . $menuLabel . " chosen\n"; # widget selected my $widget = $event->widget(); + my $perform_search = 0; if($widget == $reset_search_button) { $find_entry->setValue(''); @@ -1164,9 +1122,7 @@ print "Menu " . $menuLabel . " chosen\n"; $options->{rebuild_tree}->(); } elsif ($widget == $find_button) { - yui::YUI::app()->busyCursor(); - _do_search($find_entry, $tree, $options, $current_search_type, $urpm, $pkgs); - yui::YUI::app()->normalCursor(); + $perform_search = 1; } elsif ($widget == $select_all_button) { toggle_all($options, 1); @@ -1176,13 +1132,22 @@ print "Menu " . $menuLabel . " chosen\n"; do_action($options, $callback_action, $info); } elsif ($widget == $view_box) { - viewbox_callback($view_box->selectedItem()->label(), \%$options, \%wanted_categories); + if (_viewbox_callback($view_box->selectedItem(), \%$options, \%wanted_categories)) { + $perform_search = 1 if $find_entry->value(); + } } elsif ($widget == $filter_box) { - filterbox_callback($filter_box->selectedItem()->label(), \%$options, \%rfilters); + if (_filterbox_callback($filter_box->selectedItem(), \%$options, \@ordered_filters)) { + $perform_search = 1 if $find_entry->value(); + } + } + elsif ($widget == $search_menu) { + if (_searchmenu_callback($search_menu->selectedItem(), \%$options, \@search_types, \$current_search_type)) { + $perform_search = 1 if $find_entry->value(); + } } elsif ($widget == $tree) { - tree_callback($tree->currentItem(),\%$options); + _tree_callback($tree->currentItem(),\%$options); } elsif ($widget == $detail_list){ $info_options = {}; @@ -1190,14 +1155,21 @@ print "Menu " . $menuLabel . " chosen\n"; if ($wEvent->reason() == $yui::YEvent::ValueChanged) { yui::YUI::app()->busyCursor(); - detaillist_changeditem_callback($detail_list, \%$options); + _detaillist_changeditem_callback($detail_list, \%$options); yui::YUI::app()->normalCursor(); - tree_callback($tree->currentItem(),\%$options); + _tree_callback($tree->currentItem(),\%$options); } _detaillist_callback($detail_list->selectedItem(), $info, \%$options); } elsif ($widget == $QuitButton) { - last if quit(); + last if _quit(); + } + + if ($perform_search) { + yui::YUI::app()->busyCursor(); + _do_search($find_entry, $tree, $options, $current_search_type, $urpm, $pkgs); + yui::YUI::app()->normalCursor(); + $perform_search = 0; } } @@ -1238,7 +1210,7 @@ AdminPanel::Rpmdragora::rpmnew::do_merge_if_needed(); init(); -run_treeview_dialog(\&perform_installation); +_run_treeview_dialog(\&perform_installation); writeconf(); |
