[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