[Aptitude-svn-commit] r4138 - in branches/aptitude-0.3/aptitude: . src

Daniel Burrows dburrows at costa.debian.org
Tue Sep 20 20:49:40 UTC 2005


Author: dburrows
Date: Tue Sep 20 20:49:36 2005
New Revision: 4138

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/solution_screen.cc
Log:
Display a list of the alternatives to the currently selected action in a solution.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Tue Sep 20 20:49:36 2005
@@ -1,5 +1,10 @@
 2005-09-20  Daniel Burrows  <dburrows at debian.org>
 
+	* src/solution_screen.cc:
+
+	  Display a list of the possible resolutions of the dependency
+	  corresponding to each action.
+
 	* src/solution_fragment.cc, src/solution_fragment.h:
 
 	  Add a routine to display a description of a dependency that

Modified: branches/aptitude-0.3/aptitude/src/solution_screen.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/solution_screen.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/solution_screen.cc	Tue Sep 20 20:49:36 2005
@@ -32,6 +32,8 @@
 #include <generic/resolver_manager.h>
 #include <generic/util.h>
 
+#include <sigc++/adaptors/bind.h>
+
 #include <vscreen/config/keybindings.h>
 #include <vscreen/config/style.h>
 #include <vscreen/fragment.h>
@@ -212,10 +214,12 @@
   wstring my_label;
 public:
   label_tree(wstring _label, bool _expanded = true,
-	     bool selectable = true)
+	     bool selectable = true,
+	     int depth = 0)
     :vs_subtree_generic(_expanded), my_label(_label)
   {
     set_selectable(selectable);
+    set_depth(depth);
   }
 
   void paint(vs_tree *win, int y, bool hierarchical,
@@ -300,16 +304,23 @@
 class solution_act_item : public solution_item
 {
   aptitude_universe::version ver;
+  aptitude_universe::dep d;
 
   /** A callback to be invoked with a fragment-based description of
    *  this item.
    */
   sigc::slot1<void, fragment *> set_short_description;
 
+  /** A callback to be invoked with the dependency corresponding to this item. */
+  sigc::slot1<void, aptitude_resolver_dep> set_active_dep;
 public:
   solution_act_item(const aptitude_solution::action &act,
-		    const sigc::slot1<void, fragment *> &_set_short_description)
-    :ver(act.ver), set_short_description(_set_short_description)
+		    const sigc::slot1<void, fragment *> &_set_short_description,
+		    const sigc::slot1<void, aptitude_resolver_dep> &_set_active_dep)
+    :ver(act.ver),
+     d(act.d),
+     set_short_description(_set_short_description),
+     set_active_dep(_set_active_dep)
   {
   }
 
@@ -363,11 +374,15 @@
       set_short_description(fragf(""));
     else
       set_short_description(text_fragment(apt_package_records->Lookup(real_ver.FileList()).ShortDesc()));
+
+    set_active_dep(d);
   }
 
   void unhighlighted(vs_tree *win)
   {
     set_short_description(fragf(""));
+
+    set_active_dep(aptitude_resolver_dep());
   }
 
   aptitude_universe::version get_ver() const
@@ -485,8 +500,9 @@
 {
 public:
   solution_act_item_bare(const aptitude_solution::action &act,
-			 const sigc::slot1<void, fragment *> &set_short_description)
-    :solution_act_item(act, set_short_description)
+			 const sigc::slot1<void, fragment *> &set_short_description,
+			 const sigc::slot1<void, aptitude_resolver_dep> &set_active_dep)
+    :solution_act_item(act, set_short_description, set_active_dep)
   {
   }
 
@@ -610,9 +626,12 @@
 class solution_unresolved_item : public solution_item
 {
   aptitude_universe::dep d;
+
+  sigc::slot1<void, aptitude_resolver_dep> set_active_dep;
 public:
-  solution_unresolved_item(const aptitude_universe::dep &_d)
-    :d(_d)
+  solution_unresolved_item(const aptitude_universe::dep &_d,
+			   const sigc::slot1<void, aptitude_resolver_dep> &_set_active_dep)
+    :d(_d), set_active_dep(_set_active_dep)
   {
   }
 
@@ -628,6 +647,16 @@
     return false;
   }
 
+  void highlighted(vs_tree *win)
+  {
+    set_active_dep(d);
+  }
+
+  void unhighlighted(vs_tree *win)
+  {
+    set_active_dep(aptitude_resolver_dep());
+  }
+
   void reject()
   {
     resman->harden_dep(d);
@@ -701,8 +730,50 @@
   }
 };
 
+vs_subtree_generic *make_dep_solvers_tree(const aptitude_resolver_dep &d)
+{
+  pkgCache::DepIterator real_dep = d.get_dep();
+  pkgCache::PrvIterator prv = d.get_prv();
+
+  vs_subtree_generic *root = new label_tree(L"", true, true, -1);
+
+  vs_staticitem *conflict_item = new vs_staticitem(conflict_text(real_dep, prv), L"");
+  root->add_child(conflict_item);
+
+  vs_subtree_generic *resolvers = new label_tree(transcode(_("The following actions will resolve this dependency:")), true, false);
+
+  root->add_child(resolvers);
+
+  for(aptitude_resolver_package::version_iterator
+	vi = d.get_source().get_package().versions_begin(); !vi.end(); ++vi)
+    if(*vi != d.get_source())
+      {
+	aptitude_solution::action act(*vi, d, true, 0);
+
+	resolvers->add_child(new solution_act_item(act,
+						   sigc::slot1<void, fragment *>(),
+						   sigc::slot1<void, aptitude_resolver_dep>()));
+      }
+
+  for(aptitude_resolver_dep::solver_iterator
+	si = d.solvers_begin(); !si.end(); ++si)
+    {
+      aptitude_solution::action act(*si, d, false, 0);
+
+      resolvers->add_child(new solution_act_item(act,
+						 sigc::slot1<void, fragment *>(),
+						 sigc::slot1<void, aptitude_resolver_dep>()));
+    }
+
+  if(d.get_dep()->Type == pkgCache::Dep::Recommends)
+    resolvers->add_child(new solution_unresolved_item(d, sigc::slot1<void, aptitude_resolver_dep>()));
+
+  return root;
+}
+
 vs_subtree_generic *make_story_tree(const aptitude_solution &sol,
-				    const sigc::slot1<void, fragment *> &set_short_description)
+				    const sigc::slot1<void, fragment *> &set_short_description,
+				    const sigc::slot1<void, aptitude_resolver_dep> &set_active_dep)
 {
   vector<aptitude_solution::action> actions;
 
@@ -719,7 +790,7 @@
     {
       vs_subtree_generic *tree = new label_tree(dep_text(i->d.get_dep()), true, false);
 
-      tree->add_child(new solution_act_item(*i, set_short_description));
+      tree->add_child(new solution_act_item(*i, set_short_description, set_active_dep));
       root->add_child(tree);
     }
 
@@ -727,7 +798,8 @@
 }
 
 vs_subtree_generic *make_solution_tree(const aptitude_solution &sol,
-				       const sigc::slot1<void, fragment *> &set_short_description)
+				       const sigc::slot1<void, fragment *> &set_short_description,
+				       const sigc::slot1<void, aptitude_resolver_dep> &set_active_dep)
 {
   // Bin packages according to what will happen to them.
   vector<aptitude_solution::action> remove_actions;
@@ -758,7 +830,7 @@
 
       for(vector<aptitude_solution::action>::const_iterator i = remove_actions.begin();
 	  i != remove_actions.end(); ++i)
-	remove_tree->add_child(new solution_act_item_bare(*i, set_short_description));
+	remove_tree->add_child(new solution_act_item_bare(*i, set_short_description, set_active_dep));
 
       root->add_child(remove_tree);
     }
@@ -769,7 +841,7 @@
 
       for(vector<aptitude_solution::action>::const_iterator i = keep_actions.begin();
 	  i != keep_actions.end(); ++i)
-	keep_tree->add_child(new solution_act_item_bare(*i, set_short_description));
+	keep_tree->add_child(new solution_act_item_bare(*i, set_short_description, set_active_dep));
 
       root->add_child(keep_tree);
     }
@@ -780,7 +852,7 @@
 
       for(vector<aptitude_solution::action>::const_iterator i = install_actions.begin();
 	  i != install_actions.end(); ++i)
-	install_tree->add_child(new solution_act_item_bare(*i, set_short_description));
+	install_tree->add_child(new solution_act_item_bare(*i, set_short_description, set_active_dep));
 
       root->add_child(install_tree);
     }
@@ -791,7 +863,7 @@
 
       for(vector<aptitude_solution::action>::const_iterator i = upgrade_actions.begin();
 	  i != upgrade_actions.end(); ++i)
-	upgrade_tree->add_child(new solution_act_item_bare(*i, set_short_description));
+	upgrade_tree->add_child(new solution_act_item_bare(*i, set_short_description, set_active_dep));
 
       root->add_child(upgrade_tree);
     }
@@ -802,12 +874,11 @@
 
       for(vector<aptitude_solution::action>::const_iterator i = downgrade_actions.begin();
 	  i != downgrade_actions.end(); ++i)
-	downgrade_tree->add_child(new solution_act_item_bare(*i, set_short_description));
+	downgrade_tree->add_child(new solution_act_item_bare(*i, set_short_description, set_active_dep));
 
       root->add_child(downgrade_tree);
     }
 
-  
   const imm::set<aptitude_universe::dep> &unresolved = sol.get_unresolved_soft_deps();
 
   if(!unresolved.empty())
@@ -816,7 +887,7 @@
 
       for(imm::set<aptitude_universe::dep>::const_iterator i = unresolved.begin();
 	  i != unresolved.end(); ++i)
-	unresolved_tree->add_child(new solution_unresolved_item(*i));
+	unresolved_tree->add_child(new solution_unresolved_item(*i, set_active_dep));
 
       root->add_child(unresolved_tree);
     }
@@ -832,6 +903,7 @@
   vs_tree_ref story_tree;
 
   sigc::slot1<void, fragment *> set_short_description;
+  sigc::slot1<void, aptitude_resolver_dep> set_active_dep;
 
   void attach_apt_cache_signals()
   {
@@ -871,10 +943,12 @@
   }
 
 protected:
-  solution_examiner(const sigc::slot1<void, fragment *> &_set_short_description)
+  solution_examiner(const sigc::slot1<void, fragment *> &_set_short_description,
+		    const sigc::slot1<void, aptitude_resolver_dep> &_set_active_dep)
     : vs_multiplex(false),
       solution_tree(vs_tree::create()), story_tree(vs_tree::create()),
-      set_short_description(_set_short_description)
+      set_short_description(_set_short_description),
+      set_active_dep(_set_active_dep)
   {
     add_visible_widget(solution_tree, true);
     add_visible_widget(story_tree, true);
@@ -900,9 +974,10 @@
     return true;
   }
 public:
-  static ref_ptr<solution_examiner> create(const sigc::slot1<void, fragment *> &set_short_description)
+  static ref_ptr<solution_examiner> create(const sigc::slot1<void, fragment *> &set_short_description,
+					   const sigc::slot1<void, aptitude_resolver_dep> &set_active_dep)
   {
-    return new solution_examiner(set_short_description);
+    return new solution_examiner(set_short_description, set_active_dep);
   }
 
   void update()
@@ -947,8 +1022,8 @@
       set_static_root(transcode(_("Internal error: unexpected null solution.")));
     else
       {
-	solution_tree->set_root(make_solution_tree(sol, set_short_description));
-	story_tree->set_root(make_story_tree(sol, set_short_description));
+	solution_tree->set_root(make_solution_tree(sol, set_short_description, set_active_dep));
+	story_tree->set_root(make_story_tree(sol, set_short_description, set_active_dep));
       }
 
     update_highlights();
@@ -956,15 +1031,31 @@
 };
 typedef ref_ptr<solution_examiner> solution_examiner_ref;
 
+static
+void update_dep_display(aptitude_resolver_dep d, vs_tree *tBare)
+{
+  vs_tree_ref t(tBare);
+
+  if(d.get_dep().end())
+    t->set_root(NULL);
+  else
+    t->set_root(make_dep_solvers_tree(d));
+}
+
 vs_widget_ref make_solution_screen()
 {
   vs_table_ref rval     = vs_table::create();
 
   vs_label_ref l        = vs_label::create(L"");
+  vs_tree_ref info_tree = vs_tree::create();
+
   solution_examiner_ref examiner
     = solution_examiner::create(sigc::mem_fun(l.unsafe_get_ref(),
-					      (void (vs_label::*) (fragment *)) &vs_label::set_text));
-  vs_tree_ref info_tree = vs_tree::create();
+					      (void (vs_label::*) (fragment *)) &vs_label::set_text),
+				sigc::bind(sigc::ptr_fun(update_dep_display),
+					   info_tree.unsafe_get_ref()));
+
+
 
   info_tree->connect_key("ShowHideDescription", &global_bindings,
 			 sigc::mem_fun(info_tree.unsafe_get_ref(),



More information about the Aptitude-svn-commit mailing list