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

Daniel Burrows dburrows at costa.debian.org
Tue Aug 9 21:27:03 UTC 2005


Author: dburrows
Date: Tue Aug  9 21:26:58 2005
New Revision: 3791

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/solution_screen.cc
Log:
Write a first draft of a custom treeitem class for entries in a solution.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Tue Aug  9 21:26:58 2005
@@ -1,5 +1,10 @@
 2005-08-09  Daniel Burrows  <dburrows at debian.org>
 
+	* src/solution_screen.cc:
+
+	  Write a specialized treeitem class to represent the elements of
+	  a solution.
+
 	* src/Makefile.am, src/solution_screen.cc, src/solution_screen.h, src/ui.cc:
 
 	  Initial work towards a top-level solution examination screen.

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 Aug  9 21:26:58 2005
@@ -32,45 +32,35 @@
 
 using namespace std;
 
-struct pkg_name_lt
+struct act_name_lt
 {
 public:
-  bool operator()(const pkgCache::PkgIterator &p1,
-		  const pkgCache::PkgIterator &p2) const
+  bool operator()(const aptitude_resolver::action &v1,
+		  const aptitude_resolver::action &v2) const
   {
-    return strcmp(p1.Name(), p2.Name()) < 0;
-  }
-};
-
-struct ver_name_lt
-{
-public:
-  bool operator()(const pkgCache::VerIterator &v1,
-		  const pkgCache::VerIterator &v2) const
-  {
-    return strcmp(v1.ParentPkg().Name(), v2.ParentPkg().Name()) < 0;
+    return strcmp(v1.ver.get_pkg().Name(), v2.ver.get_pkg().Name()) < 0;
   }
 };
 
 /** Partition the set of all packages into several vectors,
  *  according to the action to be performed on each package.
  *
- *  \param remove_packages each package to be removed will be placed in this vector.
- *  \param keep_packages each package which is being kept will be placed
+ *  \param remove_actions each package to be removed will be placed in this vector.
+ *  \param keep_actions each package which is being kept will be placed
  *         in this vector.
- *  \param install_packages if a package is being newly installed,
+ *  \param install_actions if a package is being newly installed,
  *         its target version will be placed in this vector.
- *  \param downgrade_packages if a package is being downgraded,
+ *  \param downgrade_actions if a package is being downgraded,
  *         its target version will be placed in this vector.
- *  \param upgrade_packages if a package is being upgraded,
+ *  \param upgrade_actions if a package is being upgraded,
  *         its target version will be placed in this vector.
  */
-void bin_packages(const aptitude_solution &sol,
-		  vector<pkgCache::PkgIterator> &remove_packages,
-		  vector<pkgCache::PkgIterator> &keep_packages,
-		  vector<pkgCache::VerIterator> &install_packages,
-		  vector<pkgCache::VerIterator> &downgrade_packages,
-		  vector<pkgCache::VerIterator> &upgrade_packages)
+void bin_actions(const aptitude_solution &sol,
+		  vector<aptitude_resolver::action> &remove_actions,
+		  vector<aptitude_resolver::action> &keep_actions,
+		  vector<aptitude_resolver::action> &install_actions,
+		  vector<aptitude_resolver::action> &downgrade_actions,
+		  vector<aptitude_resolver::action> &upgrade_actions)
 {
 
   for(std::map<aptitude_resolver::package,
@@ -84,14 +74,14 @@
       if(curver.end())
 	{
 	  if(newver.end())
-	    keep_packages.push_back(pkg);
+	    keep_actions.push_back(i->second);
 	  else
-	    install_packages.push_back(newver);
+	    install_actions.push_back(i->second);
 	}
       else if(newver.end())
-	remove_packages.push_back(pkg);
+	remove_actions.push_back(i->second);
       else if(newver == curver)
-	keep_packages.push_back(pkg);
+	keep_actions.push_back(i->second);
       else
 	{
 	  int cmp=_system->VS->CmpVersion(curver.VerStr(),
@@ -106,9 +96,9 @@
 
 	  /** \todo indicate "sidegrades" separately? */
 	  if(cmp<=0)
-	    upgrade_packages.push_back(newver);
+	    upgrade_actions.push_back(i->second);
 	  else if(cmp>0)
-	    downgrade_packages.push_back(newver);
+	    downgrade_actions.push_back(i->second);
 	}
     }
 }
@@ -125,6 +115,7 @@
 	is_first = false;
       else
 	rval += ", ";
+
       if(vf.File().Archive())
 	rval += vf.File().Archive();
       else
@@ -160,131 +151,191 @@
   }
 };
 
+class solution_item : public vs_treeitem
+{
+  aptitude_universe::version ver;
+public:
+  solution_item(const aptitude_resolver::action &act)
+    :ver(act.ver)
+  {
+  }
+
+  const wchar_t *tag()
+  {
+    return L"";
+  }
+
+  const wchar_t *label()
+  {
+    return L"";
+  }
+
+  void paint(vs_tree *win, int y, bool hierarchical, const style &st)
+  {
+    unsigned int basex = hierarchical ? 2*get_depth() : 0;
+    unsigned int width = win->getmaxx();
+
+    unsigned int x = 0;
+
+    win->move(y, 0);
+    while(x < width && x < basex)
+      {
+	win->addch(' ');
+	++x;
+      }
+
+    win->apply_style(st+style_attrs_flip(A_BOLD));
+    const char *name = ver.get_pkg().Name();
+    while(x < width && *name)
+      {
+	win->addch(*name);
+	++name;
+	++x;
+      }
+
+    // Ensure that at least one space separates the two columns.
+    if(x < width)
+      {
+	win->addch(' ');
+	++x;
+      }
+
+    win->apply_style(st);
+    string righttext;
+
+    pkgCache::VerIterator currver = ver.get_pkg().CurrentVer();
+
+    if(currver.end() || ver.get_ver().end() || currver == ver.get_ver())
+      {
+	pkgCache::VerIterator dispv = currver;
+
+	if(dispv.end())
+	  dispv = ver.get_ver();
+
+	if(dispv.end())
+	  righttext = "[UNINST]";
+	else
+	  righttext = ssprintf("[%s (%s)]",
+			       dispv.VerStr(), archives(dispv).c_str());
+      }
+    else
+      {
+	righttext = "[";
+
+	if(currver.end())
+	  righttext += "UNINST";
+	else
+	  {
+	    righttext += currver.VerStr();
+	    righttext += " ";
+	    righttext += archives(currver);
+	  }
+
+	righttext += " -> ";
+
+	if(ver.get_ver().end())
+	  righttext += "UNINST";
+	else
+	  {
+	    righttext += ver.get_ver().VerStr();
+	    righttext += " ";
+	    righttext += archives(ver.get_ver());
+	  }
+
+	righttext += "]";
+      }
+
+    unsigned int startx;
+    if(x+righttext.size() >= width)
+      startx = x;
+    else
+      startx = width-righttext.size();
+    while(x < startx)
+      {
+	win->addch(' ');
+	++x;
+      }
+
+    win->addnstr(righttext, width-startx);
+  }
+};
+
 vs_subtree_generic *make_solution_tree(const aptitude_solution &sol)
 {
   // Bin packages according to what will happen to them.
-  vector<pkgCache::PkgIterator> remove_packages;
-  vector<pkgCache::PkgIterator> keep_packages;
-  vector<pkgCache::VerIterator> install_packages;
-  vector<pkgCache::VerIterator> downgrade_packages;
-  vector<pkgCache::VerIterator> upgrade_packages;
-
-  bin_packages(sol, remove_packages, keep_packages, install_packages,
-	       downgrade_packages, upgrade_packages);
-
-  sort(remove_packages.begin(), remove_packages.end(),
-       pkg_name_lt());
-  sort(keep_packages.begin(), keep_packages.end(),
-       pkg_name_lt());
-  sort(install_packages.begin(), install_packages.end(),
-       ver_name_lt());
-  sort(downgrade_packages.begin(), downgrade_packages.end(),
-       ver_name_lt());
-  sort(upgrade_packages.begin(), upgrade_packages.end(),
-       ver_name_lt());
+  vector<aptitude_resolver::action> remove_actions;
+  vector<aptitude_resolver::action> keep_actions;
+  vector<aptitude_resolver::action> install_actions;
+  vector<aptitude_resolver::action> downgrade_actions;
+  vector<aptitude_resolver::action> upgrade_actions;
+
+  bin_actions(sol, remove_actions, keep_actions, install_actions,
+	       downgrade_actions, upgrade_actions);
+
+  sort(remove_actions.begin(), remove_actions.end(),
+       act_name_lt());
+  sort(keep_actions.begin(), keep_actions.end(),
+       act_name_lt());
+  sort(install_actions.begin(), install_actions.end(),
+       act_name_lt());
+  sort(downgrade_actions.begin(), downgrade_actions.end(),
+       act_name_lt());
+  sort(upgrade_actions.begin(), upgrade_actions.end(),
+       act_name_lt());
 
   vs_subtree_generic *root = new label_tree(L"");
 
-  if(!remove_packages.empty())
+  if(!remove_actions.empty())
     {
       vs_subtree_generic *remove_tree = new label_tree(transcode(_("Remove the following packages:")));
 
-      for(vector<pkgCache::PkgIterator>::const_iterator i = remove_packages.begin();
-	  i != remove_packages.end(); ++i)
-	{
-	  assert(!i->CurrentVer().end());
-
-	  remove_tree->add_child(new vs_staticitem(transcode(i->Name()), L""));
-	}
+      for(vector<aptitude_resolver::action>::const_iterator i = remove_actions.begin();
+	  i != remove_actions.end(); ++i)
+	remove_tree->add_child(new solution_item(*i));
 
       root->add_child(remove_tree);
     }
 
-  if(!keep_packages.empty())
+  if(!keep_actions.empty())
     {
       vs_subtree_generic *keep_tree = new label_tree(transcode(_("Keep the following packages at their current version:")));
 
-      for(vector<pkgCache::PkgIterator>::const_iterator i = keep_packages.begin();
-	  i != keep_packages.end(); ++i)
-	{
-	  wstring text;
-
-	  if(i->CurrentVer().end())
-	    text = swsprintf(L"%s [UNINST]", i->Name());
-	  else
-	    text = swsprintf(L"%s [%s (%s)]",
-			     i->Name(), i->CurrentVer().VerStr(),
-			     archives(i->CurrentVer()).c_str());
-
-	  keep_tree->add_child(new vs_staticitem(text, L""));
-	}
+      for(vector<aptitude_resolver::action>::const_iterator i = keep_actions.begin();
+	  i != keep_actions.end(); ++i)
+	keep_tree->add_child(new solution_item(*i));
 
       root->add_child(keep_tree);
     }
 
-  if(!install_packages.empty())
+  if(!install_actions.empty())
     {
       vs_subtree_generic *install_tree = new label_tree(transcode(_("Install the following packages:")));
 
-      for(vector<pkgCache::VerIterator>::const_iterator i = install_packages.begin();
-	  i != install_packages.end(); ++i)
-	{
-	  pkgCache::PkgIterator p = i->ParentPkg();
-
-	  wstring text = swsprintf(L"%s [%s (%s)]",
-				   p.Name(), i->VerStr(),
-				   archives(*i).c_str());
-
-	  install_tree->add_child(new vs_staticitem(text, L""));
-	}
+      for(vector<aptitude_resolver::action>::const_iterator i = install_actions.begin();
+	  i != install_actions.end(); ++i)
+	install_tree->add_child(new solution_item(*i));
 
       root->add_child(install_tree);
     }
 
-  if(!upgrade_packages.empty())
+  if(!upgrade_actions.empty())
     {
       vs_subtree_generic *upgrade_tree = new label_tree(transcode(_("Upgrade the following packages:")));
 
-      for(vector<pkgCache::VerIterator>::const_iterator i = upgrade_packages.begin();
-	  i != upgrade_packages.end(); ++i)
-	{
-	  pkgCache::PkgIterator p = i->ParentPkg();
-	  pkgCache::VerIterator currver = p.CurrentVer();
-	  pkgCache::VerIterator instver = (*apt_cache_file)[p].InstVerIter(*apt_cache_file);
-
-	  assert(!currver.end());
-	  assert(!instver.end());
-
-	  wstring text = swsprintf(L"%s [%s (%s) -> %s (%s)]",
-				   p.Name(),
-				   currver.VerStr(), archives(currver).c_str(),
-				   instver.VerStr(), archives(instver).c_str());
-
-	  upgrade_tree->add_child(new vs_staticitem(text, L""));
-	}
+      for(vector<aptitude_resolver::action>::const_iterator i = upgrade_actions.begin();
+	  i != upgrade_actions.end(); ++i)
+	upgrade_tree->add_child(new solution_item(*i));
 
       root->add_child(upgrade_tree);
     }
 
-  if(!downgrade_packages.empty())
+  if(!downgrade_actions.empty())
     {
       vs_subtree_generic *downgrade_tree = new label_tree(transcode(_("Downgrade the following packages:")));
 
-      for(vector<pkgCache::VerIterator>::const_iterator i = downgrade_packages.begin();
-	  i != downgrade_packages.end(); ++i)
-	{
-	  pkgCache::PkgIterator p = i->ParentPkg();
-	  pkgCache::VerIterator currver = p.CurrentVer();
-
-	  assert(!currver.end());
-
-	  wstring text = swsprintf(L"%s [%s (%s) -> %s (%s)]",
-				   p.Name(),
-				   currver.VerStr(), archives(currver).c_str(),
-				   i->VerStr(), archives(*i).c_str());
-
-	  downgrade_tree->add_child(new vs_staticitem(text, L""));
-	}
+      for(vector<aptitude_resolver::action>::const_iterator i = downgrade_actions.begin();
+	  i != downgrade_actions.end(); ++i)
+	downgrade_tree->add_child(new solution_item(*i));
 
       root->add_child(downgrade_tree);
     }



More information about the Aptitude-svn-commit mailing list