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

Daniel Burrows dburrows at costa.debian.org
Tue Sep 20 18:14:43 UTC 2005


Author: dburrows
Date: Tue Sep 20 18:14:40 2005
New Revision: 4131

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/solution_screen.cc
Log:
Set up a split-screen display of prospective solutions.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Tue Sep 20 18:14:40 2005
@@ -1,5 +1,11 @@
 2005-09-20  Daniel Burrows  <dburrows at debian.org>
 
+	* src/solution_screen.cc:
+
+	  Set up a split-screen display of prospective solutions; this
+	  will be used (in the future) to display alternatives to a given
+	  action.
+
 	* src/apt_options.cc:
 
 	  Fix button placement in the options dialog: the Ok/Cancel

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 18:14:40 2005
@@ -24,17 +24,23 @@
 #include "solution_fragment.h"
 #include "ui.h"
 
+#include <apt-pkg/pkgrecords.h>
+
 #include <generic/aptitude_resolver_universe.h>
 #include <generic/problemresolver/exceptions.h>
 #include <generic/problemresolver/solution.h>
 #include <generic/resolver_manager.h>
 #include <generic/util.h>
 
+#include <vscreen/config/keybindings.h>
+#include <vscreen/config/style.h>
 #include <vscreen/fragment.h>
 #include <vscreen/transcode.h>
+#include <vscreen/vs_label.h>
 #include <vscreen/vs_multiplex.h>
 #include <vscreen/vs_staticitem.h>
 #include <vscreen/vs_subtree.h>
+#include <vscreen/vs_table.h>
 #include <vscreen/vs_tree.h>
 #include <vscreen/vs_treeitem.h>
 
@@ -96,6 +102,65 @@
     }
 }
 
+/** Return a description of what will happen if the given version
+ *  is installed.
+ */
+static fragment *action_description(const aptitude_resolver_version &ver)
+{
+  pkgCache::PkgIterator pkg = ver.get_pkg();
+
+  switch(analyze_action(ver))
+    {
+    case action_remove:
+      return fragf(_("Remove %F [%s (%s)]"),
+		   text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
+		   pkg.CurrentVer().VerStr(),
+		   archives_text(pkg.CurrentVer()).c_str());
+      break;
+
+    case action_install:
+      return fragf(_("Install %F [%s (%s)]"),
+		   text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
+		   ver.get_ver().VerStr(),
+		   archives_text(ver.get_ver()).c_str());
+      break;
+
+    case action_keep:
+      if(ver.get_ver().end())
+	return fragf(_("Cancel the installation of %F"),
+		     text_fragment(pkg.Name(), style_attrs_on(A_BOLD)));
+      else if(ver.get_package().current_version().get_ver().end())
+	return fragf(_("Cancel the removal of %F"),
+		     text_fragment(pkg.Name(), style_attrs_on(A_BOLD)));
+      else
+	return fragf(_("Keep %F at version %s (%s)"),
+		     text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
+		     ver.get_ver().VerStr(),
+		     archives_text(ver.get_ver()).c_str());
+
+      break;
+
+    case action_upgrade:
+      return fragf(_("Upgrade %F [%s (%s) -> %s (%s)]"),
+		   text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
+		   pkg.CurrentVer().VerStr(),
+		   archives_text(pkg.CurrentVer()).c_str(),
+		   ver.get_ver().VerStr(), archives_text(ver.get_ver()).c_str());
+      break;
+
+
+    case action_downgrade:
+      return fragf(_("Downgrade %F [%s (%s) -> %s (%s)]"),
+		   text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
+		   pkg.CurrentVer().VerStr(), archives_text(pkg.CurrentVer()).c_str(),
+		   ver.get_ver().VerStr(), archives_text(ver.get_ver()).c_str());
+      break;
+    default:
+      // Impossible.
+      abort();
+    }
+}
+
 /** Partition the set of all packages into several vectors,
  *  according to the action to be performed on each package.
  *
@@ -235,9 +300,16 @@
 class solution_act_item : public solution_item
 {
   aptitude_universe::version ver;
+
+  /** A callback to be invoked with a fragment-based description of
+   *  this item.
+   */
+  sigc::slot1<void, fragment *> set_short_description;
+
 public:
-  solution_act_item(const aptitude_solution::action &act)
-    :ver(act.ver)
+  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)
   {
   }
 
@@ -276,6 +348,28 @@
     resman->unmandate_version(ver);
   }
 
+  void highlighted(vs_tree *win)
+  {
+    pkgCache::VerIterator real_ver = ver.get_ver();
+
+    if(real_ver.end())
+      real_ver = ver.get_package().current_version().get_ver();
+
+    if(real_ver.end())
+      real_ver = ver.get_pkg().VersionList();
+
+    if(real_ver.end() || real_ver.FileList().end() ||
+       apt_package_records == NULL)
+      set_short_description(fragf(""));
+    else
+      set_short_description(text_fragment(apt_package_records->Lookup(real_ver.FileList()).ShortDesc()));
+  }
+
+  void unhighlighted(vs_tree *win)
+  {
+    set_short_description(fragf(""));
+  }
+
   aptitude_universe::version get_ver() const
   {
     return ver;
@@ -355,61 +449,7 @@
 	++x;
       }
 
-    fragment *f = NULL;
-
-    pkgCache::PkgIterator pkg = ver.get_package().get_pkg();
-
-    switch(analyze_action(ver))
-      {
-      case action_remove:
-	f = fragf(_("Remove %F [%s (%s)]"),
-		  text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
-		  pkg.CurrentVer().VerStr(),
-		  archives_text(pkg.CurrentVer()).c_str());
-	break;
-
-      case action_install:
-	f = fragf(_("Install %F [%s (%s)]"),
-		  text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
-		  ver.get_ver().VerStr(),
-		  archives_text(ver.get_ver()).c_str());
-	break;
-
-      case action_keep:
-	if(ver.get_ver().end())
-	  f = fragf(_("Cancel the installation of %F"),
-		    text_fragment(pkg.Name(), style_attrs_on(A_BOLD)));
-	else if(ver.get_package().current_version().get_ver().end())
-	  f = fragf(_("Cancel the removal of %F"),
-		    text_fragment(pkg.Name(), style_attrs_on(A_BOLD)));
-	else
-	  f = fragf(_("Keep %F at version %s (%s)"),
-		    text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
-		    ver.get_ver().VerStr(),
-		    archives_text(ver.get_ver()).c_str());
-
-	break;
-
-      case action_upgrade:
-	f = fragf(_("Upgrade %F [%s (%s) -> %s (%s)]"),
-		  text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
-		  pkg.CurrentVer().VerStr(),
-		  archives_text(pkg.CurrentVer()).c_str(),
-		  ver.get_ver().VerStr(), archives_text(ver.get_ver()).c_str());
-	break;
-
-
-      case action_downgrade:
-	f = fragf(_("Downgrade %F [%s (%s) -> %s (%s)]"),
-		  text_fragment(pkg.Name(), style_attrs_on(A_BOLD)),
-		  pkg.CurrentVer().VerStr(), archives_text(pkg.CurrentVer()).c_str(),
-		  ver.get_ver().VerStr(), archives_text(ver.get_ver()).c_str());
-	break;
-      }
-
-    assert(f != NULL);
-
-    f = clipbox(f);
+    fragment *f = clipbox(action_description(ver));
     fragment_contents c = f->layout(width-x, width-x, st);
     delete f;
 
@@ -444,8 +484,9 @@
 class solution_act_item_bare : public solution_act_item
 {
 public:
-  solution_act_item_bare(const aptitude_solution::action &act)
-    :solution_act_item(act)
+  solution_act_item_bare(const aptitude_solution::action &act,
+			 const sigc::slot1<void, fragment *> &set_short_description)
+    :solution_act_item(act, set_short_description)
   {
   }
 
@@ -660,7 +701,8 @@
   }
 };
 
-vs_subtree_generic *make_story_tree(const aptitude_solution &sol)
+vs_subtree_generic *make_story_tree(const aptitude_solution &sol,
+				    const sigc::slot1<void, fragment *> &set_short_description)
 {
   vector<aptitude_solution::action> actions;
 
@@ -677,14 +719,15 @@
     {
       vs_subtree_generic *tree = new label_tree(dep_text(i->d.get_dep()), true, false);
 
-      tree->add_child(new solution_act_item(*i));
+      tree->add_child(new solution_act_item(*i, set_short_description));
       root->add_child(tree);
     }
 
   return root;
 }
 
-vs_subtree_generic *make_solution_tree(const aptitude_solution &sol)
+vs_subtree_generic *make_solution_tree(const aptitude_solution &sol,
+				       const sigc::slot1<void, fragment *> &set_short_description)
 {
   // Bin packages according to what will happen to them.
   vector<aptitude_solution::action> remove_actions;
@@ -715,7 +758,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));
+	remove_tree->add_child(new solution_act_item_bare(*i, set_short_description));
 
       root->add_child(remove_tree);
     }
@@ -726,7 +769,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));
+	keep_tree->add_child(new solution_act_item_bare(*i, set_short_description));
 
       root->add_child(keep_tree);
     }
@@ -737,7 +780,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));
+	install_tree->add_child(new solution_act_item_bare(*i, set_short_description));
 
       root->add_child(install_tree);
     }
@@ -748,7 +791,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));
+	upgrade_tree->add_child(new solution_act_item_bare(*i, set_short_description));
 
       root->add_child(upgrade_tree);
     }
@@ -759,7 +802,7 @@
 
       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));
+	downgrade_tree->add_child(new solution_act_item_bare(*i, set_short_description));
 
       root->add_child(downgrade_tree);
     }
@@ -781,17 +824,19 @@
   return root;
 }
 
-class solution_screen : public vs_multiplex
+class solution_examiner : public vs_multiplex
 {
   aptitude_solution last_sol;
 
   vs_tree_ref solution_tree;
   vs_tree_ref story_tree;
 
+  sigc::slot1<void, fragment *> set_short_description;
+
   void attach_apt_cache_signals()
   {
     if(apt_cache_file)
-      resman->state_changed.connect(sigc::mem_fun(*this, &solution_screen::update));
+      resman->state_changed.connect(sigc::mem_fun(*this, &solution_examiner::update));
   }
 
   /** Re-connects the signals attached to the apt cache file. */
@@ -809,9 +854,10 @@
   }
 
 protected:
-  solution_screen()
+  solution_examiner(const sigc::slot1<void, fragment *> &_set_short_description)
     : vs_multiplex(false),
-      solution_tree(vs_tree::create()), story_tree(vs_tree::create())
+      solution_tree(vs_tree::create()), story_tree(vs_tree::create()),
+      set_short_description(_set_short_description)
   {
     add_visible_widget(solution_tree, true);
     add_visible_widget(story_tree, true);
@@ -819,8 +865,8 @@
 
     attach_apt_cache_signals();
 
-    cache_closed.connect(sigc::mem_fun(*this, &solution_screen::update));
-    cache_reloaded.connect(sigc::mem_fun(*this, &solution_screen::handle_cache_reload));
+    cache_closed.connect(sigc::mem_fun(*this, &solution_examiner::update));
+    cache_reloaded.connect(sigc::mem_fun(*this, &solution_examiner::handle_cache_reload));
 
     update();
   }
@@ -835,9 +881,9 @@
     return true;
   }
 public:
-  static ref_ptr<solution_screen> create()
+  static ref_ptr<solution_examiner> create(const sigc::slot1<void, fragment *> &set_short_description)
   {
-    return new solution_screen;
+    return new solution_examiner(set_short_description);
   }
 
   void update()
@@ -882,13 +928,43 @@
       set_static_root(transcode(_("Internal error: unexpected null solution.")));
     else
       {
-	solution_tree->set_root(make_solution_tree(sol));
-	story_tree->set_root(make_story_tree(sol));
+	solution_tree->set_root(make_solution_tree(sol, set_short_description));
+	story_tree->set_root(make_story_tree(sol, set_short_description));
       }
   }
 };
+typedef ref_ptr<solution_examiner> solution_examiner_ref;
 
 vs_widget_ref make_solution_screen()
 {
-  return solution_screen::create();
+  vs_table_ref rval     = vs_table::create();
+
+  vs_label_ref l        = vs_label::create(L"");
+  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();
+
+  info_tree->connect_key("ShowHideDescription", &global_bindings,
+			 sigc::mem_fun(info_tree.unsafe_get_ref(),
+				       &vscreen_widget::toggle_visible));
+
+  l->set_bg_style(get_style("Status"));
+
+  rval->add_widget_opts(examiner,
+			0, 0, 1, 1, vs_table::EXPAND | vs_table::FILL,
+			vs_table::EXPAND | vs_table::FILL | vs_table::SHRINK);
+  rval->add_widget_opts(l,
+			1, 0, 1, 1, vs_table::EXPAND | vs_table::FILL,
+			0);
+
+  rval->add_widget_opts(info_tree,
+			2, 0, 1, 1, vs_table::EXPAND | vs_table::FILL,
+			vs_table::EXPAND | vs_table::FILL | vs_table::SHRINK);
+
+  l->show();
+  examiner->show();
+  info_tree->show();
+
+  return rval;
 }



More information about the Aptitude-svn-commit mailing list