Author: rpmcruz
Date: Thu Mar 13 23:16:53 2008
New Revision: 45444
URL: http://svn.opensuse.org/viewcvs/yast?rev=45444&view=rev
Log:
* src/ygtkwizard.h/c: added support for an extra button.
* src/yzyppwrapper.h/cc: added functions to import/exportList, and
createSolverTestcase.
* src/YGPackageSelector.cc: added Tools button with the options to
import and export the patterns/packages list, and to output a solver
testcase to a file.
* src/yzyppwrapper.h/cc: splitted Ypp::Pool into QueryPool and TreePool.
The first is the usual live pool that filters packages to the specified
query. TreePool lays the packages of a specified type (like Patterns)
under category nodes.
* src/YGPackageSelector.cc & src/ygtkzyppwrapper.cc/h: modified PackagesView,
Collections::Pool (ie. Patterns) and zypp model to support the TreePool.
Modified:
trunk/gtk/ChangeLog
trunk/gtk/src/YGPackageSelector.cc
trunk/gtk/src/ygtkwizard.c
trunk/gtk/src/ygtkwizard.h
trunk/gtk/src/ygtkzyppwrapper.cc
trunk/gtk/src/ygtkzyppwrapper.h
trunk/gtk/src/yzyppwrapper.cc
trunk/gtk/src/yzyppwrapper.h
Modified: trunk/gtk/ChangeLog
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/ChangeLog?rev=45444&r1=45443&r2=45444&view=diff
==============================================================================
--- trunk/gtk/ChangeLog (original)
+++ trunk/gtk/ChangeLog Thu Mar 13 23:16:53 2008
@@ -1,3 +1,22 @@
+2008-03-13 Ricardo Cruz
+
+ * src/ygtkwizard.h/c: added support for an extra button.
+
+ * src/yzyppwrapper.h/cc: added functions to import/exportList, and
+ createSolverTestcase.
+
+ * src/YGPackageSelector.cc: added Tools button with the options to
+ import and export the patterns/packages list, and to output a solver
+ testcase to a file.
+
+ * src/yzyppwrapper.h/cc: splitted Ypp::Pool into QueryPool and TreePool.
+ The first is the usual live pool that filters packages to the specified
+ query. TreePool lays the packages of a specified type (like Patterns)
+ under category nodes.
+
+ * src/YGPackageSelector.cc & src/ygtkzyppwrapper.cc/h: modified PackagesView,
+ Collections::Pool (ie. Patterns) and zypp model to support the TreePool.
+
2008-03-10 Ricardo Cruz
* src/YGUtils.cc: replaced specific GtkTextView-scroll set function by a
Modified: trunk/gtk/src/YGPackageSelector.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/YGPackageSelector.cc?rev=45444&r1=45443&r2=45444&view=diff
==============================================================================
--- trunk/gtk/src/YGPackageSelector.cc (original)
+++ trunk/gtk/src/YGPackageSelector.cc Thu Mar 13 23:16:53 2008
@@ -253,7 +253,8 @@
gtk_tree_model_get (model, &iter, YGtkZyppModel::PTR_COLUMN, &package, -1);
gtk_tree_path_free (path);
- packages.push (package);
+ if (package)
+ packages.push (package);
}
g_list_free (paths);
return packages;
@@ -366,12 +367,13 @@
};
struct ListView : public View
{
- ListView (PackagesView *parent)
- : View (parent)
+ bool m_isTree;
+ ListView (bool isTree, PackagesView *parent)
+ : View (parent), m_isTree (isTree)
{
GtkTreeView *view = GTK_TREE_VIEW (m_widget = gtk_tree_view_new());
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view), FALSE);
- gtk_tree_view_set_search_column (GTK_TREE_VIEW (view), YGtkZyppModel::NAME_COLUMN);
+ gtk_tree_view_set_headers_visible (view, FALSE);
+ gtk_tree_view_set_search_column (view, YGtkZyppModel::NAME_COLUMN);
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
renderer = gtk_cell_renderer_pixbuf_new();
@@ -379,7 +381,7 @@
"pixbuf", YGtkZyppModel::ICON_COLUMN, NULL);
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
gtk_tree_view_column_set_fixed_width (column, 38);
- gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
+ gtk_tree_view_append_column (view, column);
renderer = gtk_cell_renderer_text_new();
g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
column = gtk_tree_view_column_new_with_attributes ("", renderer,
@@ -387,13 +389,17 @@
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
gtk_tree_view_column_set_fixed_width (column, 50 /* it will expand */);
gtk_tree_view_column_set_expand (column, TRUE);
- gtk_tree_view_append_column (GTK_TREE_VIEW (view), column);
- gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW (view), TRUE);
+ gtk_tree_view_append_column (view, column);
+ if (!isTree)
+ gtk_tree_view_set_fixed_height_mode (view, TRUE);
+ gtk_tree_view_set_show_expanders (view, FALSE);
- GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (view);
gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
g_signal_connect (G_OBJECT (selection), "changed",
G_CALLBACK (packages_selected_cb), this);
+ gtk_tree_selection_set_select_function (selection, can_select_row_cb,
+ this, NULL);
gtk_widget_show (m_widget);
g_signal_connect (G_OBJECT (m_widget), "popup-menu",
@@ -404,9 +410,12 @@
virtual void setModel (GtkTreeModel *model)
{
- gtk_tree_view_set_model (GTK_TREE_VIEW (m_widget), model);
+ GtkTreeView *view = GTK_TREE_VIEW (m_widget);
+ gtk_tree_view_set_model (view, model);
+ if (m_isTree)
+ gtk_tree_view_expand_all (view);
if (GTK_WIDGET_REALIZED (m_widget))
- gtk_tree_view_scroll_to_point (GTK_TREE_VIEW (m_widget), 0, 0);
+ gtk_tree_view_scroll_to_point (view, 0, 0);
}
GtkTreeSelection *getTreeSelection()
@@ -443,6 +452,16 @@
}
return FALSE;
}
+
+ static gboolean can_select_row_cb (GtkTreeSelection *selection, GtkTreeModel *model,
+ GtkTreePath *path, gboolean path_currently_selected, gpointer data)
+ {
+ void *package;
+ GtkTreeIter iter;
+ gtk_tree_model_get_iter (model, &iter, path);
+ gtk_tree_model_get (model, &iter, YGtkZyppModel::PTR_COLUMN, &package, -1);
+ return package != NULL;
+ }
};
struct IconView : public View
{
@@ -500,22 +519,28 @@
GtkWidget *m_bin;
GtkTreeModel *m_model;
View *m_view;
+bool m_isTree;
public:
GtkWidget *getWidget()
{ return m_bin; }
- PackagesView() : m_listener (NULL), m_model (NULL), m_view (NULL)
+ PackagesView (bool isTree)
+ : m_listener (NULL), m_model (NULL), m_view (NULL), m_isTree (isTree)
{
- GtkWidget *buttons = gtk_vbox_new (FALSE, 0), *button;
- button = create_toggle_button (pkg_list_mode_xpm, "List view", NULL);
- gtk_box_pack_start (GTK_BOX (buttons), button, FALSE, TRUE, 0);
- button = create_toggle_button (pkg_tiles_mode_xpm, "Tiles view", button);
- gtk_box_pack_start (GTK_BOX (buttons), button, FALSE, TRUE, 0);
- gtk_widget_show_all (buttons);
-
m_bin = ygtk_scrolled_window_new();
- ygtk_scrolled_window_set_corner_widget (YGTK_SCROLLED_WINDOW (m_bin), buttons);
+
+ if (!isTree) {
+ GtkWidget *buttons = gtk_vbox_new (FALSE, 0), *button;
+ button = create_toggle_button (pkg_list_mode_xpm, "List view", NULL);
+ gtk_box_pack_start (GTK_BOX (buttons), button, FALSE, TRUE, 0);
+ button = create_toggle_button (pkg_tiles_mode_xpm, "Tiles view", button);
+ gtk_box_pack_start (GTK_BOX (buttons), button, FALSE, TRUE, 0);
+ gtk_widget_show_all (buttons);
+
+ ygtk_scrolled_window_set_corner_widget (YGTK_SCROLLED_WINDOW (m_bin), buttons);
+ }
+
setMode (LIST_MODE);
}
@@ -538,7 +563,7 @@
gtk_container_remove (GTK_CONTAINER (m_bin), m_view->m_widget);
delete m_view;
if (mode == LIST_MODE)
- m_view = new ListView (this);
+ m_view = new ListView (m_isTree, this);
else
m_view = new IconView (this);
gtk_container_add (GTK_CONTAINER (m_bin), m_view->m_widget);
@@ -549,7 +574,7 @@
normalCursor();
}
- void setQuery (Ypp::Query *query)
+ void setPool (Ypp::Pool *pool)
{
if (GTK_WIDGET_REALIZED (m_bin))
busyCursor();
@@ -557,7 +582,7 @@
if (m_model)
g_object_unref (G_OBJECT (m_model));
- YGtkZyppModel *zmodel = ygtk_zypp_model_new (query);
+ YGtkZyppModel *zmodel = ygtk_zypp_model_new (pool);
m_model = GTK_TREE_MODEL (zmodel);
if (m_view) {
m_view->setModel (m_model);
@@ -566,6 +591,12 @@
normalCursor();
}
+ void setQuery (Ypp::QueryPool::Query *query)
+ {
+ Ypp::QueryPool *pool = new Ypp::QueryPool (query);
+ setPool (pool);
+ }
+
PkgList getSelected()
{ return m_view->getSelected(); }
@@ -713,14 +744,14 @@
g_signal_connect_after (G_OBJECT (port), "style-set",
G_CALLBACK (style_set_cb), NULL);
- Ypp::Query *query = new Ypp::Query();
+ Ypp::QueryPool::Query *query = new Ypp::QueryPool::Query();
query->setIsModified (true);
if (update_mode) {
query->addType (Ypp::Package::PATCH_TYPE);
- m_pool = new Ypp::Pool (query);
+ m_pool = new Ypp::QueryPool (query);
}
else
- m_pool = new Ypp::Pool (query, true);
+ m_pool = new Ypp::QueryPool (query, true);
// initialize list -- there could already be packages modified
for (Ypp::Pool::Iter it = m_pool->getFirst(); it; it = m_pool->getNext (it))
ChangesPane::entryInserted (it, m_pool->get (it));
@@ -752,7 +783,7 @@
{
Entry *entry = new Entry (package);
gtk_box_pack_start (GTK_BOX (m_entries_box), entry->getWidget(), FALSE, TRUE, 0);
- int index = m_pool->getIndex (iter);
+ int index = m_pool->toPath (iter).front();
m_entries = g_list_insert (m_entries, entry, index);
if (m_container)
gtk_widget_show (m_container);
@@ -760,7 +791,7 @@
virtual void entryDeleted (Ypp::Pool::Iter iter, Ypp::Package *package)
{
- int index = m_pool->getIndex (iter);
+ int index = m_pool->toPath (iter).front();
GList *i = g_list_nth (m_entries, index);
Entry *entry = (Entry *) i->data;
gtk_container_remove (GTK_CONTAINER (m_entries_box), entry->getWidget());
@@ -772,7 +803,7 @@
virtual void entryChanged (Ypp::Pool::Iter iter, Ypp::Package *package)
{
- int index = m_pool->getIndex (iter);
+ int index = m_pool->toPath (iter).front();
Entry *entry = (Entry *) g_list_nth_data (m_entries, index);
entry->modified (package);
}
@@ -813,288 +844,307 @@
#include "icons/pkg-installed-upgradable.xpm"
#include "icons/pkg-available.xpm"
-class Filters
+class Collections
{
- class Collections
+public:
+ struct Listener {
+ virtual void collectionChanged() = 0;
+ };
+
+private:
+ struct View
{
- struct View
- {
- virtual GtkWidget *getWidget() = 0;
- virtual void writeQuery (Ypp::Query *query) = 0;
+ virtual GtkWidget *getWidget() = 0;
+ virtual void writeQuery (Ypp::QueryPool::Query *query) = 0;
- Filters *m_filters;
- View (Filters *filters)
- : m_filters (filters)
- {}
- };
+ Collections::Listener *m_listener;
+ View (Collections::Listener *listener)
+ : m_listener (listener)
+ {}
+ virtual ~View() {}
+
+ void signalChanged()
+ { m_listener->collectionChanged(); }
+ };
+
+ struct Categories : public View
+ {
+ GtkWidget *m_scroll, *m_view;
+ public:
+ virtual GtkWidget *getWidget()
+ { return m_scroll; }
- struct Categories : public View
+ Categories (Collections::Listener *listener, Ypp::Package::Type type)
+ : View (listener)
{
- GtkWidget *m_scroll, *m_view;
- public:
- virtual GtkWidget *getWidget()
- { return m_scroll; }
+ GtkTreeViewColumn *column;
+ GtkCellRenderer *renderer;
- Categories (Filters *filters, Ypp::Package::Type type)
- : View (filters)
- {
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
+ m_view = gtk_tree_view_new();
+ GtkTreeView *view = GTK_TREE_VIEW (m_view);
+ gtk_tree_view_set_headers_visible (view, FALSE);
+ gtk_tree_view_set_search_column (view, 0);
+ renderer = gtk_cell_renderer_pixbuf_new();
+ column = gtk_tree_view_column_new_with_attributes ("",
+ renderer, "pixbuf", 2, NULL);
+ gtk_tree_view_column_set_expand (column, FALSE);
+ gtk_tree_view_append_column (view, column);
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes ("",
+ renderer, "text", 0, NULL);
+ gtk_tree_view_column_set_expand (column, TRUE);
+ gtk_tree_view_append_column (view, column);
+ if (type != Ypp::Package::PACKAGE_TYPE)
+ gtk_tree_view_set_show_expanders (view, FALSE);
+ else
+ gtk_tree_view_set_expander_column (view, column);
- m_view = gtk_tree_view_new();
- GtkTreeView *view = GTK_TREE_VIEW (m_view);
- gtk_tree_view_set_headers_visible (view, FALSE);
- gtk_tree_view_set_search_column (view, 0);
- renderer = gtk_cell_renderer_pixbuf_new();
- column = gtk_tree_view_column_new_with_attributes ("",
- renderer, "pixbuf", 2, NULL);
- gtk_tree_view_column_set_expand (column, FALSE);
- gtk_tree_view_append_column (view, column);
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes ("",
- renderer, "text", 0, NULL);
- gtk_tree_view_column_set_expand (column, TRUE);
- gtk_tree_view_append_column (view, column);
- if (type == Ypp::Package::PATCH_TYPE)
- gtk_tree_view_set_show_expanders (view, FALSE);
- else
- gtk_tree_view_set_expander_column (view, column);
-
- GtkTreeSelection *selection = gtk_tree_view_get_selection (view);
- gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
- g_signal_connect (G_OBJECT (selection), "changed",
- G_CALLBACK (selection_cb), this);
-
- m_scroll = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (m_scroll),
- GTK_SHADOW_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (m_scroll),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_widget_set_size_request (m_scroll, -1, 200);
- gtk_container_add (GTK_CONTAINER (m_scroll), m_view);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (view);
+ gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
+ g_signal_connect (G_OBJECT (selection), "changed",
+ G_CALLBACK (selection_cb), this);
- build (type);
- }
+ m_scroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (m_scroll),
+ GTK_SHADOW_IN);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (m_scroll),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+ gtk_widget_set_size_request (m_scroll, -1, 200);
+ gtk_container_add (GTK_CONTAINER (m_scroll), m_view);
- void build (Ypp::Package::Type type)
- {
- GtkTreeModel *model = NULL;
+ build (type);
+ }
+
+ void build (Ypp::Package::Type type)
+ {
+ GtkTreeModel *model = NULL;
- struct inner {
- static void populate (GtkTreeStore *store, GtkTreeIter *parent,
- Ypp::Node *category)
- {
- if (!category)
- return;
- GtkTreeIter iter;
- gtk_tree_store_append (store, &iter, parent);
- const std::string &name = category->name;
- gtk_tree_store_set (store, &iter, 0, name.c_str(), 1, category, -1);
- if (!parent) {
- const gchar *icon = 0;
- for (unsigned int i = 0; i < CAT_SIZE; i++)
- if (name == catIconMap[i].category) {
- icon = catIconMap[i].icon;
- break;
- }
- if (icon) {
- GtkIconTheme *icons = gtk_icon_theme_get_default();
- GdkPixbuf *pixbuf;
- pixbuf = gtk_icon_theme_load_icon (icons, icon, 22,
- GtkIconLookupFlags (0), NULL);
- gtk_tree_store_set (store, &iter, 2, pixbuf, -1);
+ struct inner {
+ static void populate (GtkTreeStore *store, GtkTreeIter *parent,
+ Ypp::Node *category)
+ {
+ if (!category)
+ return;
+ GtkTreeIter iter;
+ gtk_tree_store_append (store, &iter, parent);
+ const std::string &name = category->name;
+ gtk_tree_store_set (store, &iter, 0, name.c_str(), 1, category, -1);
+ if (!parent) {
+ const gchar *icon = 0;
+ for (unsigned int i = 0; i < CAT_SIZE; i++)
+ if (name == catIconMap[i].category) {
+ icon = catIconMap[i].icon;
+ break;
}
+ if (icon) {
+ GtkIconTheme *icons = gtk_icon_theme_get_default();
+ GdkPixbuf *pixbuf;
+ pixbuf = gtk_icon_theme_load_icon (icons, icon, 22,
+ GtkIconLookupFlags (0), NULL);
+ gtk_tree_store_set (store, &iter, 2, pixbuf, -1);
}
- populate (store, &iter, category->child());
- populate (store, parent, category->next());
}
- };
-
- GtkTreeStore *store = gtk_tree_store_new (3, G_TYPE_STRING, G_TYPE_POINTER,
- GDK_TYPE_PIXBUF);
- model = GTK_TREE_MODEL (store);
+ populate (store, &iter, category->child());
+ populate (store, parent, category->next());
+ }
+ };
- GtkTreeView *view = GTK_TREE_VIEW (m_view);
- GtkTreeSelection *selection = gtk_tree_view_get_selection (view);
+ GtkTreeStore *store = gtk_tree_store_new (3, G_TYPE_STRING, G_TYPE_POINTER,
+ GDK_TYPE_PIXBUF);
+ model = GTK_TREE_MODEL (store);
- g_signal_handlers_block_by_func (selection, (gpointer) selection_cb, this);
+ GtkTreeView *view = GTK_TREE_VIEW (m_view);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (view);
- GtkTreeIter iter;
- gtk_tree_store_append (store, &iter, NULL);
- gtk_tree_store_set (store, &iter, 0, _("All"), 1, NULL, -1);
+ g_signal_handlers_block_by_func (selection, (gpointer) selection_cb, this);
- inner::populate (store, NULL, Ypp::get()->getFirstCategory (type));
+ GtkTreeIter iter;
+ gtk_tree_store_append (store, &iter, NULL);
+ gtk_tree_store_set (store, &iter, 0, _("All"), 1, NULL, -1);
- gtk_tree_view_set_model (view, model);
- g_object_unref (G_OBJECT (model));
- selectFirstItem();
+ inner::populate (store, NULL, Ypp::get()->getFirstCategory (type));
- g_signal_handlers_unblock_by_func (selection, (gpointer) selection_cb, this);
- }
+ gtk_tree_view_set_model (view, model);
+ g_object_unref (G_OBJECT (model));
+ selectFirstItem();
- Ypp::Node *getActive()
- {
- GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (m_view));
- GtkTreeModel *model;
- GtkTreeIter iter;
- Ypp::Node *category = 0;
- if (gtk_tree_selection_get_selected (selection, &model, &iter))
- gtk_tree_model_get (model, &iter, 1, &category, -1);
- return category;
- }
+ g_signal_handlers_unblock_by_func (selection, (gpointer) selection_cb, this);
+ }
- void selectFirstItem()
- {
- GtkTreeView *view = GTK_TREE_VIEW (m_view);
- GtkTreeSelection *selection = gtk_tree_view_get_selection (view);
+ Ypp::Node *getActive()
+ {
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (m_view));
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ Ypp::Node *category = 0;
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ gtk_tree_model_get (model, &iter, 1, &category, -1);
+ return category;
+ }
- g_signal_handlers_block_by_func (selection, (gpointer) selection_cb, this);
+ void selectFirstItem()
+ {
+ GtkTreeView *view = GTK_TREE_VIEW (m_view);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (view);
- /* we use gtk_tree_view_set_cursor(), rather than gtk_tree_selection_select_iter()
- because that one is buggy in that when the user first interacts with the treeview,
- a change signal is sent, even if he was just expanding one node... */
- GtkTreePath *path = gtk_tree_path_new_first();
- gtk_tree_view_set_cursor (view, path, NULL, FALSE);
- gtk_tree_path_free (path);
+ g_signal_handlers_block_by_func (selection, (gpointer) selection_cb, this);
- g_signal_handlers_unblock_by_func (selection, (gpointer) selection_cb, this);
- }
+ /* we use gtk_tree_view_set_cursor(), rather than gtk_tree_selection_select_iter()
+ because that one is buggy in that when the user first interacts with the treeview,
+ a change signal is sent, even if he was just expanding one node... */
+ GtkTreePath *path = gtk_tree_path_new_first();
+ gtk_tree_view_set_cursor (view, path, NULL, FALSE);
+ gtk_tree_path_free (path);
- static void selection_cb (GtkTreeSelection *selection, Categories *pThis)
- {
- pThis->m_filters->signalChanged();
+ g_signal_handlers_unblock_by_func (selection, (gpointer) selection_cb, this);
+ }
- // if item unselected, make sure "All" is
- if (!gtk_tree_selection_get_selected (selection, NULL, NULL))
- pThis->selectFirstItem();
- }
+ static void selection_cb (GtkTreeSelection *selection, Categories *pThis)
+ {
+ pThis->signalChanged();
- virtual void writeQuery (Ypp::Query *query)
- {
- Ypp::Node *node = getActive();
- if (node)
- query->addCategory (node);
- }
- };
+ // if item unselected, make sure "All" is
+ if (!gtk_tree_selection_get_selected (selection, NULL, NULL))
+ pThis->selectFirstItem();
+ }
- struct Pool : public View, public PackagesView::Listener
+ virtual void writeQuery (Ypp::QueryPool::Query *query)
{
- PackagesView *m_view;
- GtkWidget *m_box, *m_buttons_box;
- public:
- virtual GtkWidget *getWidget()
- { return m_box; }
+ Ypp::Node *node = getActive();
+ if (node)
+ query->addCategory (node);
+ }
+ };
- Pool (Filters *filters, Ypp::Package::Type type)
- : View (filters)
- {
- m_view = new PackagesView();
- Ypp::Query *query = new Ypp::Query();
- query->addType (type);
- m_view->setQuery (query);
- m_view->setListener (this);
-
- m_buttons_box = gtk_hbox_new (TRUE, 2);
- GtkWidget *image, *button;
- button = gtk_button_new_with_label (_("Install All"));
- image = gtk_image_new_from_stock (GTK_STOCK_SAVE, GTK_ICON_SIZE_BUTTON);
- gtk_button_set_image (GTK_BUTTON (button), image);
- g_signal_connect (G_OBJECT (button), "clicked",
- G_CALLBACK (install_cb), this);
- gtk_box_pack_start (GTK_BOX (m_buttons_box), button, TRUE, TRUE, 0);
- button = gtk_button_new_with_label (_("Remove All"));
- image = gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_BUTTON);
- gtk_button_set_image (GTK_BUTTON (button), image);
- g_signal_connect (G_OBJECT (button), "clicked",
- G_CALLBACK (remove_cb), this);
- gtk_box_pack_start (GTK_BOX (m_buttons_box), button, TRUE, TRUE, 0);
- gtk_widget_set_sensitive (m_buttons_box, FALSE);
-
- m_box = gtk_vbox_new (FALSE, 4);
- gtk_box_pack_start (GTK_BOX (m_box), m_view->getWidget(), TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (m_box), m_buttons_box, FALSE, TRUE, 0);
- }
+ struct Pool : public View, public PackagesView::Listener
+ {
+ PackagesView * m_view;
+ GtkWidget *m_box, *m_buttons_box;
+ Ypp::Package::Type m_type;
- virtual void packagesSelected (const PkgList &selection)
- {
- gtk_widget_set_sensitive (m_buttons_box, !selection.empty());
- m_filters->signalChanged();
- }
+ public:
+ virtual GtkWidget *getWidget()
+ { return m_box; }
- virtual void writeQuery (Ypp::Query *query)
- {
- PkgList selected = m_view->getSelected();
- for (PkgList::const_iterator it = selected.begin();
- it != selected.end(); it++)
- query->addCollection (*it);
- }
+ Pool (Collections::Listener *listener, Ypp::Package::Type type)
+ : View (listener)
+ {
+ m_type = type;
- void doAll (bool install /*or remove*/)
- {
- // we just need to mark the collections themselves
- PkgList selected = m_view->getSelected();
- install ? selected.install() : selected.remove();
- }
+ m_view = new PackagesView (true);
+ m_view->setPool (new Ypp::TreePool (type));
+ m_view->setListener (this);
+
+ // control buttons
+ m_buttons_box = gtk_hbox_new (TRUE, 2);
+ GtkWidget *image, *button;
+ button = gtk_button_new_with_label (_("Install All"));
+ image = gtk_image_new_from_stock (GTK_STOCK_SAVE, GTK_ICON_SIZE_BUTTON);
+ gtk_button_set_image (GTK_BUTTON (button), image);
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (install_cb), this);
+ gtk_box_pack_start (GTK_BOX (m_buttons_box), button, TRUE, TRUE, 0);
+ button = gtk_button_new_with_label (_("Remove All"));
+ image = gtk_image_new_from_stock (GTK_STOCK_DELETE, GTK_ICON_SIZE_BUTTON);
+ gtk_button_set_image (GTK_BUTTON (button), image);
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (remove_cb), this);
+ gtk_box_pack_start (GTK_BOX (m_buttons_box), button, TRUE, TRUE, 0);
+ gtk_widget_set_sensitive (m_buttons_box, FALSE);
+
+ // layout
+ m_box = gtk_vbox_new (FALSE, 4);
+ gtk_box_pack_start (GTK_BOX (m_box), m_view->getWidget(), TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (m_box), m_buttons_box, FALSE, TRUE, 0);
+ }
- static void install_cb (GtkButton *button, Pool *pThis)
- { pThis->doAll (true); }
- static void remove_cb (GtkButton *button, Pool *pThis)
- { pThis->doAll (false); }
- };
+ virtual ~Pool()
+ {
+ delete m_view;
+ }
- View *m_view;
- GtkWidget *m_bin;
- Filters *m_filters;
+ virtual void packagesSelected (const PkgList &selection)
+ {
+ gtk_widget_set_sensitive (m_buttons_box, !selection.empty());
+ signalChanged();
+ }
- public:
- Collections (Filters *filters)
- : m_view (NULL), m_filters (filters)
+ virtual void writeQuery (Ypp::QueryPool::Query *query)
{
- m_bin = gtk_event_box_new();
+ PkgList selected = m_view->getSelected();
+ for (PkgList::const_iterator it = selected.begin();
+ it != selected.end(); it++)
+ query->addCollection (*it);
}
- ~Collections()
+ void doAll (bool install /*or remove*/)
{
- delete m_view;
+ // we just need to mark the collections themselves
+ PkgList selected = m_view->getSelected();
+ install ? selected.install() : selected.remove();
}
- GtkWidget *getWidget()
- { return m_bin; }
+ static void install_cb (GtkButton *button, Pool *pThis)
+ { pThis->doAll (true); }
+ static void remove_cb (GtkButton *button, Pool *pThis)
+ { pThis->doAll (false); }
+ };
- void setType (Ypp::Package::Type type)
- {
- if (m_view)
- gtk_container_remove (GTK_CONTAINER (m_bin), m_view->getWidget());
- delete m_view;
+ View *m_view;
+ GtkWidget *m_bin;
+ Collections::Listener *m_listener;
- switch (type)
- {
- case Ypp::Package::PACKAGE_TYPE:
- case Ypp::Package::PATCH_TYPE:
- m_view = new Categories (m_filters, type);
- break;
- case Ypp::Package::PATTERN_TYPE:
- //case Ypp::Package::LANGUAGE_TYPE:
- m_view = new Pool (m_filters, type);
- break;
- default:
- m_view = NULL;
- break;
- }
+ public:
+ Collections (Collections::Listener *listener)
+ : m_view (NULL), m_listener (listener)
+ {
+ m_bin = gtk_event_box_new();
+ }
- if (m_view) {
- gtk_widget_show_all (m_view->getWidget());
- gtk_container_add (GTK_CONTAINER (m_bin), m_view->getWidget());
- }
- }
+ ~Collections()
+ {
+ delete m_view;
+ }
+
+ GtkWidget *getWidget()
+ { return m_bin; }
+
+ void setType (Ypp::Package::Type type)
+ {
+ if (m_view)
+ gtk_container_remove (GTK_CONTAINER (m_bin), m_view->getWidget());
+ delete m_view;
- void writeQuery (Ypp::Query *query)
+ switch (type)
{
- if (m_view)
- m_view->writeQuery (query);
+ case Ypp::Package::PACKAGE_TYPE:
+ case Ypp::Package::PATCH_TYPE:
+ m_view = new Categories (m_listener, type);
+ break;
+ case Ypp::Package::PATTERN_TYPE:
+ //case Ypp::Package::LANGUAGE_TYPE:
+ m_view = new Pool (m_listener, type);
+ break;
+ default:
+ m_view = NULL;
+ break;
}
- };
+ if (m_view) {
+ gtk_widget_show_all (m_view->getWidget());
+ gtk_container_add (GTK_CONTAINER (m_bin), m_view->getWidget());
+ }
+ }
+
+ void writeQuery (Ypp::QueryPool::Query *query)
+ {
+ if (m_view)
+ m_view->writeQuery (query);
+ }
+};
+
+class Filters : public Collections::Listener
+{
class StatusButtons
{
public:
@@ -1161,7 +1211,7 @@
public:
struct Listener {
- virtual void doQuery (Ypp::Query *query) = 0;
+ virtual void doQuery (Ypp::QueryPool::Query *query) = 0;
};
void setListener (Listener *listener)
{ m_listener = listener; signalChanged(); }
@@ -1208,8 +1258,8 @@
gtk_combo_box_append_text (GTK_COMBO_BOX (m_repos), repo_name.c_str());
}
gtk_combo_box_set_active (GTK_COMBO_BOX (m_repos), 0);
- g_signal_connect (G_OBJECT (m_repos), "changed",
- G_CALLBACK (combo_changed_cb), this);
+ g_signal_connect_after (G_OBJECT (m_repos), "changed",
+ G_CALLBACK (combo_changed_cb), this);
m_type = gtk_combo_box_new_text();
if (update_mode)
@@ -1244,6 +1294,8 @@
{ pThis->signalChangedDelay(); }
static void combo_changed_cb (GtkComboBox *combo, Filters *pThis)
{ pThis->signalChanged(); }
+ virtual void collectionChanged()
+ { signalChanged(); }
void signalChanged()
{
@@ -1262,7 +1314,7 @@
}
// create query
- Ypp::Query *query = new Ypp::Query();
+ Ypp::QueryPool::Query *query = new Ypp::QueryPool::Query();
if (type == Ypp::Package::PATCH_TYPE)
query->addType (Ypp::Package::PATCH_TYPE);
else
@@ -1655,8 +1707,8 @@
PackageDetails (bool update_mode)
{
- GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
- setWhiteBackground (vbox);
+ GtkWidget *vbox;
+ m_widget = createWhiteViewPort (&vbox);
GtkWidget *hbox = gtk_hbox_new (FALSE, 6);
m_description = ygtk_html_wrap_new();
@@ -1681,12 +1733,6 @@
m_filelist = m_changelog = m_authors = NULL;
m_dependencies = NULL;
}
-
- GtkWidget *scroll = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
- GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scroll), vbox);
- m_widget = scroll;
}
~PackageDetails()
@@ -1787,22 +1833,31 @@
return align;
}
- static gboolean expose_cb (GtkWidget *widget, GdkEventExpose *event)
+ static GtkWidget *createWhiteViewPort (GtkWidget **vbox)
{
- cairo_t *cr = gdk_cairo_create (widget->window);
- GdkColor color = { 0, 255 << 8, 255 << 8, 255 << 8 };
- gdk_cairo_set_source_color (cr, &color);
- cairo_rectangle (cr, event->area.x, event->area.y,
- event->area.width, event->area.height);
- cairo_fill (cr);
- cairo_destroy (cr);
- return FALSE;
- }
+ struct inner {
+ static gboolean expose_cb (GtkWidget *widget, GdkEventExpose *event)
+ {
+ cairo_t *cr = gdk_cairo_create (widget->window);
+ GdkColor color = { 0, 255 << 8, 255 << 8, 255 << 8 };
+ gdk_cairo_set_source_color (cr, &color);
+ cairo_rectangle (cr, event->area.x, event->area.y,
+ event->area.width, event->area.height);
+ cairo_fill (cr);
+ cairo_destroy (cr);
+ return FALSE;
+ }
+ };
- static void setWhiteBackground (GtkWidget *widget)
- {
- g_signal_connect (G_OBJECT (widget), "expose-event",
- G_CALLBACK (expose_cb), NULL);
+ *vbox = gtk_vbox_new (FALSE, 0);
+ g_signal_connect (G_OBJECT (*vbox), "expose-event",
+ G_CALLBACK (inner::expose_cb), NULL);
+
+ GtkWidget *scroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scroll), *vbox);
+ return scroll;
}
};
@@ -1998,7 +2053,7 @@
PackageSelector (bool update_mode)
{
- m_packages = new PackagesView();
+ m_packages = new PackagesView (false);
m_filters = new Filters (update_mode);
m_control = new PackageControl (m_filters);
m_details = new PackageDetails (update_mode);
@@ -2060,7 +2115,7 @@
delete m_changes;
}
- virtual void doQuery (Ypp::Query *query)
+ virtual void doQuery (Ypp::QueryPool::Query *query)
{
m_packages->setQuery (query);
}
@@ -2084,7 +2139,8 @@
#include "YPackageSelector.h"
#include "pkg-selector-help.h"
-class YGPackageSelector : public YPackageSelector, public YGWidget, public Ypp::Interface
+class YGPackageSelector : public YPackageSelector, public YGWidget,
+ public Ypp::Interface, public Ypp::PkgListener
{
PackageSelector *m_package_selector;
@@ -2117,6 +2173,7 @@
busyCursor();
ygtk_wizard_set_help_text (wizard, onlineUpdateMode() ? patch_help : pkg_help);
+ createToolsButton();
YGDialog *dialog = YGDialog::currentDialog();
dialog->setCloseCallback (confirm_cb, this);
@@ -2125,6 +2182,7 @@
gtk_container_add (GTK_CONTAINER (wizard), m_package_selector->getWidget());
Ypp::get()->setInterface (this);
+ Ypp::get()->addPkgListener (this);
}
virtual ~YGPackageSelector()
@@ -2367,10 +2425,137 @@
virtual void packageModified (Ypp::Package *package)
{
+ // FIXME: this is mostly a hack; the thing is that GtkTreeSelection doesn't
+ // signal when a selected row changes values. Anyway, to be done differently.
m_package_selector->packageModified (package);
}
YGWIDGET_IMPL_COMMON
+
+ // Utilities
+ void createToolsButton()
+ {
+ struct inner {
+ static void errorMsg (const std::string &header, const std::string &message)
+ {
+ GtkWidget *dialog = gtk_message_dialog_new (YGDialog::currentWindow(),
+ GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ header.c_str(), NULL);
+ gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog),
+ message.c_str());
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ }
+ static void import_file_cb (GtkMenuItem *item, YGPackageSelector *pThis)
+ {
+ GtkWidget *dialog;
+ dialog = gtk_file_chooser_dialog_new (_("Import Package List"),
+ YGDialog::currentWindow(), GTK_FILE_CHOOSER_ACTION_OPEN,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+ GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
+
+ int ret = gtk_dialog_run (GTK_DIALOG (dialog));
+ if (ret == GTK_RESPONSE_ACCEPT) {
+ char *filename;
+ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+ if (!Ypp::get()->importList (filename)) {
+ std::string error = _("Couldn't load package list from: ");
+ error += filename;
+ errorMsg (_("Import Failed"), error);
+ }
+ g_free (filename);
+ }
+ gtk_widget_destroy (dialog);
+ }
+ static void export_file_cb (GtkMenuItem *item, YGPackageSelector *pThis)
+ {
+ GtkWidget *dialog;
+ dialog = gtk_file_chooser_dialog_new (_("Export Package List"),
+ YGDialog::currentWindow(), GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+ GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
+
+ int ret = gtk_dialog_run (GTK_DIALOG (dialog));
+ if (ret == GTK_RESPONSE_ACCEPT) {
+ char *filename;
+ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+ if (!Ypp::get()->exportList (filename)) {
+ std::string error = _("Couldn't save package list to: ");
+ error += filename;
+ errorMsg (_("Export Failed"), error);
+ }
+ g_free (filename);
+ }
+ gtk_widget_destroy (dialog);
+ }
+ static void create_solver_testcase_cb (GtkMenuItem *item)
+ {
+ const char *dirname = "/var/log/YaST2/solverTestcase";
+ std::string msg = _("Use this to generate extensive logs to help tracking down "
+ "bugs in the dependency resolver.\nThe logs will be stored in "
+ "directory: ");
+ msg += dirname;
+
+ GtkWidget *dialog = gtk_message_dialog_new (YGDialog::currentWindow(),
+ GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK_CANCEL,
+ _("Create Dependency Resolver Test Case"), NULL);
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ msg.c_str());
+ int ret = gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+
+ if (ret == GTK_RESPONSE_OK) {
+ if (Ypp::get()->createSolverTestcase (dirname)) {
+ GtkWidget *dialog = gtk_message_dialog_new (YGDialog::currentWindow(),
+ GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_YES_NO, _("Success"), NULL);
+ msg = _("Dependency resolver test case written to");
+ msg += " <tt>";
+ msg += dirname;
+ msg += "</tt>\n";
+ msg += _("Prepare <tt>y2logs.tgz tar</tt> archive to attach to Bugzilla?");
+ gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog),
+ msg.c_str());
+ ret = gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+ if (ret == GTK_RESPONSE_YES)
+ YGUI::ui()->askSaveLogs();
+ }
+ else {
+ msg = _( "Failed to create dependency resolver test case.\n"
+ "Please check disk space and permissions for");
+ msg += " <tt>";
+ msg += dirname;
+ msg += "</tt>";
+ errorMsg ("Error", msg.c_str());
+ }
+ }
+ }
+ };
+
+ GtkWidget *button, *popup, *item;
+ button = ygtk_menu_button_new_with_label (_("Tools"));
+ popup = gtk_menu_new();
+
+ item = gtk_menu_item_new_with_label (_("Import List..."));
+ gtk_menu_shell_append (GTK_MENU_SHELL (popup), item);
+ g_signal_connect (G_OBJECT (item), "activate",
+ G_CALLBACK (inner::import_file_cb), this);
+ item = gtk_menu_item_new_with_label (_("Export List..."));
+ gtk_menu_shell_append (GTK_MENU_SHELL (popup), item);
+ g_signal_connect (G_OBJECT (item), "activate",
+ G_CALLBACK (inner::export_file_cb), this);
+ gtk_menu_shell_append (GTK_MENU_SHELL (popup), gtk_separator_menu_item_new());
+ item = gtk_menu_item_new_with_label (_("Generate Dependency Testcase..."));
+ gtk_menu_shell_append (GTK_MENU_SHELL (popup), item);
+ g_signal_connect (G_OBJECT (item), "activate",
+ G_CALLBACK (inner::create_solver_testcase_cb), this);
+
+ ygtk_menu_button_set_popup (YGTK_MENU_BUTTON (button), popup);
+ ygtk_wizard_set_extra_button (YGTK_WIZARD (getWidget()), button);
+ gtk_widget_show (button);
+ gtk_widget_show_all (popup);
+ }
};
#else
Modified: trunk/gtk/src/ygtkwizard.c
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkwizard.c?rev=45444&r1=45443&r2=45444&view=diff
==============================================================================
--- trunk/gtk/src/ygtkwizard.c (original)
+++ trunk/gtk/src/ygtkwizard.c Thu Mar 13 23:16:53 2008
@@ -752,6 +752,11 @@
gtk_widget_grab_focus (wizard->m_back_button);
}
+void ygtk_wizard_set_extra_button (YGtkWizard *wizard, GtkWidget *widget)
+{
+ gtk_box_pack_start (GTK_BOX (wizard->m_buttons), widget, FALSE, TRUE, 0);
+}
+
void ygtk_wizard_add_menu (YGtkWizard *wizard, const char *text,
const char *id)
{
Modified: trunk/gtk/src/ygtkwizard.h
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkwizard.h?rev=45444&r1=45443&r2=45444&view=diff
==============================================================================
--- trunk/gtk/src/ygtkwizard.h (original)
+++ trunk/gtk/src/ygtkwizard.h Thu Mar 13 23:16:53 2008
@@ -147,6 +147,8 @@
void ygtk_wizard_focus_next_button (YGtkWizard *wizard);
void ygtk_wizard_focus_back_button (YGtkWizard *wizard);
+void ygtk_wizard_set_extra_button (YGtkWizard *wizard, GtkWidget *widget);
+
void ygtk_wizard_add_menu (YGtkWizard *wizard, const char *text,
const char *id);
gboolean ygtk_wizard_add_menu_entry (YGtkWizard *wizard, const char *parent_id,
Modified: trunk/gtk/src/ygtkzyppwrapper.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkzyppwrapper.cc?rev=45444&r1=45443&r2=45444&view=diff
==============================================================================
--- trunk/gtk/src/ygtkzyppwrapper.cc (original)
+++ trunk/gtk/src/ygtkzyppwrapper.cc Thu Mar 13 23:16:53 2008
@@ -21,6 +21,9 @@
#include "icons/pkg-remove-auto.xpm"
// bridge as we don't want to mix c++ class polymorphism and gobject
+static void ygtk_zypp_model_entry_changed (YGtkZyppModel *model, Ypp::Pool::Iter iter);
+static void ygtk_zypp_model_entry_inserted (YGtkZyppModel *model, Ypp::Pool::Iter iter);
+static void ygtk_zypp_model_entry_deleted (YGtkZyppModel *model, Ypp::Pool::Iter iter);
struct YGtkZyppModel::PoolNotify : public Ypp::Pool::Listener {
YGtkZyppModel *model;
virtual void entryChanged (Ypp::Pool::Iter iter, Ypp::Package *package)
@@ -65,7 +68,7 @@
};
static PackageIcons *icons = NULL;
-void ygtk_zypp_model_finish()
+void ygtk_zypp_model_finish (void)
{
delete icons; icons = NULL;
Ypp::finish();
@@ -92,28 +95,38 @@
G_OBJECT_CLASS (ygtk_zypp_model_parent_class)->finalize (object);
}
-static GtkTreeModelFlags ygtk_zypp_model_get_flags (GtkTreeModel *)
+static GtkTreeModelFlags ygtk_zypp_model_get_flags (GtkTreeModel *model)
{
- return GtkTreeModelFlags (GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY);
+ YGtkZyppModel *zmodel = YGTK_ZYPP_MODEL (model);
+ int flags = GTK_TREE_MODEL_ITERS_PERSIST;
+ if (zmodel->pool->isPlainList())
+ flags |= (GtkTreeModelFlags) GTK_TREE_MODEL_LIST_ONLY;
+ return (GtkTreeModelFlags) flags;
}
static gboolean ygtk_zypp_model_get_iter (GtkTreeModel *model, GtkTreeIter *iter,
GtkTreePath *path)
{
YGtkZyppModel *zmodel = YGTK_ZYPP_MODEL (model);
- gint row = gtk_tree_path_get_indices (path)[0];
+ gint *indices = gtk_tree_path_get_indices (path);
+ gint depth = gtk_tree_path_get_depth (path);
+
+ Ypp::Pool::Path zpath;
+ for (gint i = 0; i < depth; i++)
+ zpath.push_back (indices[i]);
- iter->user_data = (gpointer) zmodel->pool->getIter (row);
+ iter->user_data = (gpointer) zmodel->pool->fromPath (zpath);
return iter->user_data != NULL;
}
static GtkTreePath *ygtk_zypp_model_get_path (GtkTreeModel *model, GtkTreeIter *iter)
{
YGtkZyppModel *zmodel = YGTK_ZYPP_MODEL (model);
- int row = zmodel->pool->getIndex (iter->user_data);
+ Ypp::Pool::Path zpath = zmodel->pool->toPath (iter->user_data);
GtkTreePath *path = gtk_tree_path_new();
- gtk_tree_path_append_index (path, row);
+ for (Ypp::Pool::Path::const_iterator it = zpath.begin(); it != zpath.end(); it++)
+ gtk_tree_path_append_index (path, *it);
return path;
}
@@ -124,10 +137,65 @@
return iter->user_data != NULL;
}
-void ygtk_zypp_model_entry_changed (YGtkZyppModel *model, Ypp::Pool::Iter it)
+static gboolean ygtk_zypp_model_iter_parent (GtkTreeModel *model, GtkTreeIter *iter,
+ GtkTreeIter *child)
+{
+ YGtkZyppModel *zmodel = YGTK_ZYPP_MODEL (model);
+ iter->user_data = zmodel->pool->getParent (child->user_data);
+ return iter->user_data != NULL;
+}
+
+static gboolean ygtk_zypp_model_iter_has_child (GtkTreeModel *model, GtkTreeIter *iter)
+{
+ YGtkZyppModel *zmodel = YGTK_ZYPP_MODEL (model);
+ return zmodel->pool->getChild (iter->user_data) != NULL;
+}
+
+static gint ygtk_zypp_model_iter_n_children (GtkTreeModel *model, GtkTreeIter *iter)
+{
+ YGtkZyppModel *zmodel = YGTK_ZYPP_MODEL (model);
+ Ypp::Pool::Iter ziter;
+ if (iter == NULL) /* root */
+ ziter = zmodel->pool->getFirst();
+ else {
+ ziter = (Ypp::Pool::Iter) iter->user_data;
+ ziter = zmodel->pool->getChild (ziter);
+ }
+ if (!ziter)
+ return 0;
+ int children = 1;
+ while ((ziter = zmodel->pool->getNext (ziter)))
+ children++;
+ return children;
+}
+
+static gboolean ygtk_zypp_model_iter_nth_child (GtkTreeModel *model, GtkTreeIter *iter,
+ GtkTreeIter *parent, gint n)
+{
+ YGtkZyppModel *zmodel = YGTK_ZYPP_MODEL (model);
+ Ypp::Pool::Iter ziter;
+ if (parent == NULL) /* root */
+ ziter = zmodel->pool->getFirst();
+ else
+ ziter = zmodel->pool->getChild (parent->user_data);
+ if (!ziter)
+ return FALSE;
+ for (int c = 0; c < n; c++)
+ ziter = zmodel->pool->getNext (ziter);
+ iter->user_data = ziter;
+ return iter->user_data != NULL;
+}
+
+static gboolean ygtk_zypp_model_iter_children (GtkTreeModel *model, GtkTreeIter *iter,
+ GtkTreeIter *parent)
+{
+ return ygtk_zypp_model_iter_nth_child (model, iter, parent, 0);
+}
+
+void ygtk_zypp_model_entry_changed (YGtkZyppModel *model, Ypp::Pool::Iter ziter)
{
GtkTreeIter iter;
- iter.user_data = it;
+ iter.user_data = ziter;
GtkTreePath *path = ygtk_zypp_model_get_path (GTK_TREE_MODEL (model), &iter);
gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter);
gtk_tree_path_free (path);
@@ -178,6 +246,18 @@
Ypp::Package *package = zmodel->pool->get (iter->user_data);
g_value_init (value, ygtk_zypp_model_get_column_type (model, column));
+
+ if (!package) {
+ if (column == YGtkZyppModel::NAME_COLUMN ||
+ column == YGtkZyppModel::NAME_DESCRIPTION_COLUMN) {
+ std::string name = zmodel->pool->getName (iter->user_data);
+ if (column == YGtkZyppModel::NAME_DESCRIPTION_COLUMN)
+ name = "<b>" + name + "</b>";
+ g_value_set_string (value, g_strdup (name.c_str()));
+ }
+ return;
+ }
+
switch (column)
{
case YGtkZyppModel::ICON_COLUMN:
@@ -220,12 +300,7 @@
}
case YGtkZyppModel::NAME_COLUMN:
{
- std::string name = package->name();
- const unsigned int max_width = 15;
- if (name.size() > max_width) {
- name.erase (max_width-3);
- name += "...";
- }
+ std::string name = YGUtils::truncate (package->name(), 15);
g_value_set_string (value, g_strdup (name.c_str()));
break;
}
@@ -253,57 +328,12 @@
}
}
-static gboolean ygtk_zypp_model_iter_has_child (GtkTreeModel *model, GtkTreeIter *iter)
-{
- return FALSE;
-}
-
-static gboolean ygtk_zypp_model_iter_parent (GtkTreeModel *model, GtkTreeIter *iter,
- GtkTreeIter *child)
-{
- return FALSE;
-}
-
-static gint ygtk_zypp_model_iter_n_children (GtkTreeModel *model, GtkTreeIter *iter)
-{
- if (iter == NULL) { // special case: root
- YGtkZyppModel *zmodel = YGTK_ZYPP_MODEL (model);
- int length = 0;
- Ypp::Pool::Iter iter = zmodel->pool->getFirst();
- while (iter) {
- length++;
- iter = zmodel->pool->getNext (iter);
- }
- return length;
- }
- return 0;
-}
-
-static gboolean ygtk_zypp_model_iter_nth_child (GtkTreeModel *model, GtkTreeIter *iter,
- GtkTreeIter *parent, gint n)
-{
- if (parent == NULL) {
- gboolean ret;
- GtkTreePath *path = gtk_tree_path_new_from_indices (n, -1);
- ret = ygtk_zypp_model_get_iter (model, iter, path);
- gtk_tree_path_free (path);
- return ret;
- }
- return FALSE;
-}
-
-static gboolean ygtk_zypp_model_iter_children (GtkTreeModel *model, GtkTreeIter *iter,
- GtkTreeIter *parent)
-{
- return ygtk_zypp_model_iter_nth_child (model, iter, parent, 0);
-}
-
-YGtkZyppModel *ygtk_zypp_model_new (Ypp::Query *query)
+YGtkZyppModel *ygtk_zypp_model_new (Ypp::Pool *pool)
{
YGtkZyppModel *zmodel = (YGtkZyppModel *) g_object_new (YGTK_TYPE_ZYPP_MODEL, NULL);
zmodel->notify = new YGtkZyppModel::PoolNotify();
zmodel->notify->model = zmodel;
- zmodel->pool = new Ypp::Pool (query);
+ zmodel->pool = pool;
zmodel->pool->setListener (zmodel->notify);
return zmodel;
}
Modified: trunk/gtk/src/ygtkzyppwrapper.h
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/ygtkzyppwrapper.h?rev=45444&r1=45443&r2=45444&view=diff
==============================================================================
--- trunk/gtk/src/ygtkzyppwrapper.h (original)
+++ trunk/gtk/src/ygtkzyppwrapper.h Thu Mar 13 23:16:53 2008
@@ -40,14 +40,11 @@
GObjectClass parent_class;
};
-YGtkZyppModel *ygtk_zypp_model_new (Ypp::Query *query);
+YGtkZyppModel *ygtk_zypp_model_new (Ypp::Pool *pool);
GType ygtk_zypp_model_get_type (void) G_GNUC_CONST;
-// besides calling Ypp for cleaning, it also cleans the icons of this hook
-void ygtk_zypp_model_finish();
-void ygtk_zypp_model_entry_changed (YGtkZyppModel *model, Ypp::Pool::Iter iter);
-void ygtk_zypp_model_entry_inserted (YGtkZyppModel *model, Ypp::Pool::Iter iter);
-void ygtk_zypp_model_entry_deleted (YGtkZyppModel *model, Ypp::Pool::Iter iter);
+// besides calling Ypp for cleaning, it also cleans the icons of this hook
+void ygtk_zypp_model_finish (void);
#endif /*YGTK_ZYPP_WRAPPER_H*/
Modified: trunk/gtk/src/yzyppwrapper.cc
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/yzyppwrapper.cc?rev=45444&r1=45443&r2=45444&view=diff
==============================================================================
--- trunk/gtk/src/yzyppwrapper.cc (original)
+++ trunk/gtk/src/yzyppwrapper.cc Thu Mar 13 23:16:53 2008
@@ -150,9 +150,7 @@
bool acceptLicense (Ypp::Package *package, const std::string &license);
void packageModified (Ypp::Package *package);
- // for Pools
- void addPool (Pool::Impl *pool);
- void removePool (Pool::Impl *pool);
+ // for the Primitive Pools
GSList *getPackages (Package::Type type);
private:
@@ -169,7 +167,7 @@
GSList *repos;
Disk *disk;
Interface *interface;
- GSList *pools;
+ GSList *pkg_listeners;
bool inTransaction;
GSList *transactions;
};
@@ -784,7 +782,7 @@
//** Query
-struct Ypp::Query::Impl
+struct Ypp::QueryPool::Query::Impl
{
template <typename T>
struct Key
@@ -898,14 +896,14 @@
}
};
-Ypp::Query::Query()
+Ypp::QueryPool::Query::Query()
{ impl = new Impl(); }
-Ypp::Query::~Query()
+Ypp::QueryPool::Query::~Query()
{ delete impl; }
-void Ypp::Query::addType (Ypp::Package::Type value)
+void Ypp::QueryPool::Query::addType (Ypp::Package::Type value)
{ impl->types.add (value); }
-void Ypp::Query::addNames (std::string value, char separator)
+void Ypp::QueryPool::Query::addNames (std::string value, char separator)
{
if (separator) {
std::list std::string values = YGUtils::splitString (value, separator);
@@ -916,76 +914,151 @@
else
impl->names.add (value);
}
-void Ypp::Query::addCategory (Ypp::Node *value)
+void Ypp::QueryPool::Query::addCategory (Ypp::Node *value)
{ impl->categories.add (value); }
-void Ypp::Query::addCollection (Ypp::Package *value)
+void Ypp::QueryPool::Query::addCollection (Ypp::Package *value)
{ impl->collections.add (value); }
-void Ypp::Query::addRepository (int value)
+void Ypp::QueryPool::Query::addRepository (int value)
{ impl->repositories.add (value); }
-void Ypp::Query::setIsInstalled (bool value)
+void Ypp::QueryPool::Query::setIsInstalled (bool value)
{ impl->isInstalled.set (value); }
-void Ypp::Query::setHasUpgrade (bool value)
+void Ypp::QueryPool::Query::setHasUpgrade (bool value)
{ impl->hasUpgrade.set (value); }
-void Ypp::Query::setIsModified (bool value)
+void Ypp::QueryPool::Query::setIsModified (bool value)
{ impl->isModified.set (value); }
//** Pool
-struct Ypp::Pool::Impl
+struct Ypp::Pool::Impl : public Ypp::PkgListener
+{
+Pool::Listener *listener;
+
+ Impl() : listener (NULL)
+ { ypp->addPkgListener (this); }
+ virtual ~Impl()
+ { ypp->removePkgListener (this); }
+
+ virtual bool matches (Package *package) = 0;
+
+ virtual Iter find (Package *package) = 0;
+ virtual Iter insert (Package *package) = 0;
+ virtual void remove (Iter iter, Package *package) = 0;
+
+ virtual void packageModified (Package *package)
+ {
+ bool match = matches (package);
+ Iter iter = find (package);
+ if (iter) { // is on the pool
+ if (match) { // modified
+ if (listener)
+ listener->entryChanged (iter, package);
+ }
+ else { // removed
+ if (listener)
+ listener->entryDeleted (iter, package);
+ remove (iter, package);
+ }
+ }
+ else { // not on pool
+ if (match) { // inserted
+ iter = insert (package);
+ if (listener)
+ listener->entryInserted (iter, package);
+ }
+ }
+ }
+};
+
+Ypp::Pool::Pool (Ypp::Pool::Impl *impl)
+: impl (impl)
+{}
+Ypp::Pool::~Pool()
+{ delete impl; }
+
+void Ypp::Pool::setListener (Ypp::Pool::Listener *listener)
+{ impl->listener = listener; }
+
+Ypp::Pool::Iter Ypp::Pool::fromPath (const Ypp::Pool::Path &path)
+{
+ Iter iter = 0;
+ for (Path::const_iterator it = path.begin(); it != path.end(); it++) {
+ if (iter == NULL)
+ iter = getFirst();
+ else
+ iter = getChild (iter);
+ int row = *it;
+ for (int r = 0; r < row; r++)
+ iter = getNext (iter);
+ }
+ return iter;
+}
+
+Ypp::Pool::Path Ypp::Pool::toPath (Ypp::Pool::Iter iter)
+{
+ Path path;
+ Iter parent, sibling;
+ bool done = false;
+ while (!done) {
+ parent = getParent (iter);
+ if (parent)
+ sibling = getChild (parent);
+ else {
+ sibling = getFirst();
+ done = true;
+ }
+ int row = 0;
+ for (; sibling != iter; sibling = getNext (sibling))
+ row++;
+ path.push_front (row);
+ iter = parent;
+ }
+ return path;
+}
+
+//** QueryPool
+
+struct Ypp::QueryPool::Impl : public Ypp::Pool::Impl
{
Query *query;
GSList *packages;
-Pool::Listener *listener;
Impl (Query *query, bool startEmpty)
- : query (query), packages (NULL), listener (NULL)
+ : Pool::Impl(), query (query), packages (NULL)
{
if (!startEmpty)
packages = buildPool (query);
- ypp->impl->addPool (this);
}
-
- ~Impl()
+ virtual ~Impl()
{
- ypp->impl->removePool (this);
delete query;
g_slist_free (packages);
}
- void packageModified (Package *package)
+ virtual bool matches (Package *package)
+ {
+ return query->impl->match (package);
+ }
+
+ virtual Iter find (Package *package)
{
- bool match = query->impl->match (package);
GSList *i;
for (i = packages; i; i = i->next) {
if (package == i->data)
break;
}
- if (i) { // is on pool
- if (match) { // modified
- if (listener)
- listener->entryChanged ((Iter) i, package);
- }
- else { // removed
- if (listener)
- listener->entryDeleted ((Iter) i, package);
- packages = g_slist_delete_link (packages, i);
- }
- }
- else { // not on pool
- if (match) { // inserted
- if (i == NULL) {
- packages = g_slist_append (packages, (gpointer) package);
- i = g_slist_last (packages);
- }
- else {
- packages = g_slist_insert_before (packages, i, (gpointer) package);
- int index = g_slist_position (packages, i) - 1;
- i = g_slist_nth (packages, index);
- }
- if (listener)
- listener->entryInserted ((Iter) i, package);
- }
- }
+ return (Iter) i;
+ }
+
+ virtual Iter insert (Package *package)
+ {
+ packages = g_slist_append (packages, (gpointer) package);
+ Iter iter = (Iter) g_slist_last (packages);
+ return iter;
+ }
+
+ virtual void remove (Iter iter, Package *package)
+ {
+ packages = g_slist_delete_link (packages, (GSList *) iter);
}
private:
@@ -1006,28 +1079,100 @@
}
};
-Ypp::Pool::Pool (Query *query, bool startEmpty)
-{ impl = new Impl (query, startEmpty); }
-Ypp::Pool::~Pool()
-{ delete impl; }
+Ypp::QueryPool::QueryPool (Query *query, bool startEmpty)
+: Ypp::Pool ((impl = new Ypp::QueryPool::Impl (query, startEmpty)))
+{}
-Ypp::Pool::Iter Ypp::Pool::getFirst()
+Ypp::Pool::Iter Ypp::QueryPool::getFirst()
{ return impl->packages; }
-Ypp::Pool::Iter Ypp::Pool::getNext (Ypp::Pool::Iter iter)
+Ypp::Pool::Iter Ypp::QueryPool::getNext (Ypp::Pool::Iter iter)
{ return ((GSList *) iter)->next; }
-Ypp::Package *Ypp::Pool::get (Ypp::Pool::Iter iter)
+Ypp::Package *Ypp::QueryPool::get (Ypp::Pool::Iter iter)
{ return (Ypp::Package *) ((GSList *) iter)->data; }
-int Ypp::Pool::getIndex (Ypp::Pool::Iter iter)
-{ return g_slist_position (impl->packages, (GSList *) iter); }
+//** TreePool
-Ypp::Pool::Iter Ypp::Pool::getIter (int index)
-{ return g_slist_nth (impl->packages, index); }
+struct Ypp::TreePool::Impl : public Ypp::Pool::Impl
+{
+Package::Type type;
+GNode *root;
-void Ypp::Pool::setListener (Ypp::Pool::Listener *listener)
-{ impl->listener = listener; }
+ Impl (Package::Type type)
+ : Pool::Impl(), type (type)
+ {
+ root = g_node_new (NULL);
+ buildPool (root);
+ }
+ virtual ~Impl()
+ {
+ g_node_destroy (root);
+ }
+
+ virtual bool matches (Package *package)
+ {
+ return package->type() == type;
+ }
+
+ virtual Iter find (Package *package)
+ {
+ return (Iter) g_node_find (root, G_PRE_ORDER, G_TRAVERSE_LEAVES, package);
+ }
+
+ virtual Iter insert (Package *package) { return 0; }
+ virtual void remove (Iter iter, Package *package) {}
+
+private:
+ void buildPool (GNode *root) // at construction
+ {
+ GSList *packages = ypp->impl->getPackages (type);
+ for (Ypp::Node *i = ypp->getFirstCategory (type); i; i = i->next()) {
+ GNode *cat = g_node_append_data (root, i);
+ for (GSList *p = packages; p; p = p->next) {
+ Ypp::Package *pkg = (Ypp::Package *) p->data;
+ if (pkg->category() == i) {
+ g_node_append_data (cat, pkg);
+ }
+ }
+ }
+ }
+};
+
+Ypp::TreePool::TreePool (Ypp::Package::Type type)
+: Ypp::Pool ((impl = new Ypp::TreePool::Impl (type)))
+{}
+
+Ypp::Pool::Iter Ypp::TreePool::getFirst()
+{ return impl->root->children; }
+
+Ypp::Pool::Iter Ypp::TreePool::getNext (Ypp::Pool::Iter iter)
+{ return ((GNode *) iter)->next; }
+
+Ypp::Pool::Iter Ypp::TreePool::getParent (Ypp::Pool::Iter iter)
+{
+ GNode *parent = ((GNode *) iter)->parent;
+ if (parent == impl->root)
+ return NULL;
+ return parent;
+}
+
+Ypp::Pool::Iter Ypp::TreePool::getChild (Ypp::Pool::Iter iter)
+{ return ((GNode *) iter)->children; }
+
+Ypp::Package *Ypp::TreePool::get (Ypp::Pool::Iter iter)
+{
+ GNode *node = (GNode *) iter;
+ return node->children ? NULL : (Ypp::Package *) node->data;
+}
+
+std::string Ypp::TreePool::getName (Ypp::Pool::Iter iter)
+{
+ Ypp::Package *package = get (iter);
+ if (package)
+ return package->name();
+ return ((Ypp::Node *) ((GNode *) iter)->data)->name;
+}
//** Misc
@@ -1173,7 +1318,7 @@
//** Ypp top methods & internal connections
Ypp::Impl::Impl()
-: repos (NULL), disk (NULL), interface (NULL), pools (NULL),
+: repos (NULL), disk (NULL), interface (NULL), pkg_listeners (NULL),
inTransaction (false), transactions (NULL)
{
for (int i = 0; i < Package::TOTAL_TYPES; i++) {
@@ -1201,7 +1346,7 @@
g_slist_free (repos);
// don't delete pools as they don't actually belong to Ypp, just listeners
- g_slist_free (pools);
+ g_slist_free (pkg_listeners);
delete disk;
}
@@ -1316,10 +1461,8 @@
void Ypp::Impl::packageModified (Ypp::Package *package)
{
// notify listeners of package change
- for (GSList *i = pools; i; i = i->next)
+ for (GSList *i = pkg_listeners; i; i = i->next)
((Pool::Impl *) i->data)->packageModified (package);
- if (interface)
- interface->packageModified (package);
if (!g_slist_find (transactions, package)) /* could be a result of undo */
transactions = g_slist_append (transactions, package);
@@ -1341,8 +1484,8 @@
for (GSList *p = packages [Ypp::Package::PACKAGE_TYPE]; p; p = p->next) {
Ypp::Package *pkg = (Ypp::Package *) p->data;
if (pkg->impl->isModified()) {
- for (GSList *i = pools; i; i = i->next)
- ((Pool::Impl *) i->data)->packageModified (pkg);
+ for (GSList *i = pkg_listeners; i; i = i->next)
+ ((PkgListener *) i->data)->packageModified (pkg);
pkg->impl->setUnmodified();
}
}
@@ -1360,11 +1503,6 @@
disk->impl->packageModified();
}
-void Ypp::Impl::addPool (Pool::Impl *pool)
-{ pools = g_slist_append (pools, pool); }
-void Ypp::Impl::removePool (Pool::Impl *pool)
-{ pools = g_slist_remove (pools, pool); }
-
GSList *Ypp::Impl::getPackages (Ypp::Package::Type type)
{
if (!packages[type]) {
@@ -1476,6 +1614,11 @@
void Ypp::setInterface (Ypp::Interface *interface)
{ impl->interface = interface; }
+void Ypp::addPkgListener (PkgListener *listener)
+{ impl->pkg_listeners = g_slist_append (impl->pkg_listeners, listener); }
+void Ypp::removePkgListener (PkgListener *listener)
+{ impl->pkg_listeners = g_slist_remove (impl->pkg_listeners, listener); }
+
bool Ypp::isModified()
{
return zyppPool().diffState() ||
@@ -1490,3 +1633,78 @@
void Ypp::finishTransactions()
{ impl->finishTransactions(); }
+static Ypp::Package *findPackage (GSList *list, std::string name)
+{
+ for (GSList *i = list; i; i = i->next) {
+ Ypp::Package *pkg = (Ypp::Package *) i->data;
+ if (pkg->impl->zyppSel->name() == name)
+ return pkg;
+ }
+ return NULL;
+}
+
+#include <fstream>
+#include
+
+bool Ypp::importList (const char *filename)
+{
+ bool ret = true;
+ startTransactions();
+ try {
+ std::ifstream importFile (filename);
+ zypp::syscontent::Reader reader (importFile);
+
+ for (zypp::syscontent::Reader::const_iterator it = reader.begin();
+ it != reader.end(); it++) {
+ std::string kind = it->kind(), name = it->name();
+
+ GSList *list = 0;
+ if (kind == "package")
+ list = impl->getPackages (Ypp::Package::PACKAGE_TYPE);
+ else if (kind == "pattern")
+ list = impl->getPackages (Ypp::Package::PATTERN_TYPE);
+
+ Ypp::Package *pkg = findPackage (list, name);
+ if (pkg && !pkg->isInstalled())
+ pkg->install (0);
+ }
+ }
+ catch (const zypp::Exception &exception) {
+ ret = false;
+ }
+ finishTransactions();
+ return ret;
+}
+
+bool Ypp::exportList (const char *filename)
+{
+ bool ret = true;
+ zypp::syscontent::Writer writer;
+ const zypp::ResPool &pool = zypp::getZYpp()->pool();
+
+ // from yast-qt:
+ for_each (pool.begin(), pool.end(),
+ boost::bind (&zypp::syscontent::Writer::addIf, boost::ref (writer), _1));
+
+ try {
+ std::ofstream exportFile (filename);
+ exportFile.exceptions (std::ios_base::badbit | std::ios_base::failbit);
+ exportFile << writer;
+
+ yuiMilestone() << "Package list exported to " << filename << endl;
+ }
+ catch (std::exception &exception) {
+ ret = false;
+ }
+ return ret;
+}
+
+bool Ypp::createSolverTestcase (const char *dirname)
+{
+ bool success;
+ yuiMilestone() << "Generating solver test case START" << endl;
+ success = zypp::getZYpp()->resolver()->createSolverTestcase (dirname);
+ yuiMilestone() << "Generating solver test case END" << endl;
+ return success;
+}
+
Modified: trunk/gtk/src/yzyppwrapper.h
URL: http://svn.opensuse.org/viewcvs/yast/trunk/gtk/src/yzyppwrapper.h?rev=45444&r1=45443&r2=45444&view=diff
==============================================================================
--- trunk/gtk/src/yzyppwrapper.h (original)
+++ trunk/gtk/src/yzyppwrapper.h Thu Mar 13 23:16:53 2008
@@ -91,35 +91,21 @@
void startTransactions();
void finishTransactions();
- // Query
- struct Query {
- Query();
- void addType (Package::Type type);
- void addNames (std::string name, char separator = 0);
- void addCategory (Ypp::Node *category);
- void addCollection (Ypp::Package *package);
- void addRepository (int repositories);
- void setIsInstalled (bool installed);
- void setHasUpgrade (bool upgradable);
- void setIsModified (bool modified);
-
- ~Query();
- struct Impl;
- Impl *impl;
- };
-
// Pool
struct Pool {
- Pool (Query *query, bool startEmpty = false);
- // startEmpty is an optimization when you know the pool won't have
- // elements at creations.
-
typedef void * Iter;
- Iter getFirst();
- Iter getNext (Iter it);
- Package *get (Iter it);
- int getIndex (Iter it);
- Iter getIter (int index);
+ virtual Iter getFirst() = 0;
+ virtual Iter getNext (Iter it) = 0;
+ virtual Iter getParent (Iter it) = 0;
+ virtual Iter getChild (Iter it) = 0;
+ virtual bool isPlainList() const = 0;
+
+ typedef std::list <int> Path;
+ Iter fromPath (const Path &path);
+ Path toPath (Iter it);
+
+ virtual std::string getName (Iter it) = 0;
+ virtual Package *get (Iter it) = 0; /* may be NULL */
struct Listener {
virtual void entryInserted (Iter iter, Package *package) = 0;
@@ -128,7 +114,63 @@
};
void setListener (Listener *listener);
- ~Pool();
+ struct Impl;
+ Impl *impl;
+ Pool (Impl *impl);
+ virtual ~Pool();
+ };
+
+ // plain listing of packages as filtered
+ // this is a live pool -- entries can be inserted and removed
+ struct QueryPool : public Pool {
+ struct Query {
+ Query();
+ void addType (Package::Type type);
+ void addNames (std::string name, char separator = 0);
+ void addCategory (Ypp::Node *category);
+ void addCollection (Ypp::Package *package);
+ void addRepository (int repositories);
+ void setIsInstalled (bool installed);
+ void setHasUpgrade (bool upgradable);
+ void setIsModified (bool modified);
+
+ ~Query();
+ struct Impl;
+ Impl *impl;
+ };
+
+ // startEmpty is an optimization when you know the pool won't have
+ // elements at creations.
+ QueryPool (Query *query, bool startEmpty = false);
+
+ virtual Pool::Iter getFirst();
+ virtual Pool::Iter getNext (Pool::Iter it);
+ virtual Pool::Iter getParent (Pool::Iter it) { return NULL; }
+ virtual Pool::Iter getChild (Pool::Iter it) { return NULL; }
+ virtual bool isPlainList() const { return true; }
+
+ virtual Package *get (Pool::Iter it);
+ virtual std::string getName (Pool::Iter it)
+ { return get (it)->name(); }
+
+ struct Impl;
+ Impl *impl;
+ };
+
+ // Pool of categories with the packages as leaves -- only for 1D categories
+ // this is a dead pool -- entries can be changed, but not inserted or removed
+ struct TreePool : public Pool {
+ TreePool (Ypp::Package::Type type);
+
+ virtual Pool::Iter getFirst();
+ virtual Pool::Iter getNext (Pool::Iter it);
+ virtual Pool::Iter getParent (Pool::Iter it);
+ virtual Pool::Iter getChild (Pool::Iter it);
+ virtual bool isPlainList() const { return false; }
+
+ virtual std::string getName (Pool::Iter it);
+ virtual Package *get (Pool::Iter it); /* may be NULL */
+
struct Impl;
Impl *impl;
};
@@ -153,14 +195,14 @@
virtual bool acceptLicense (Package *package, const std::string &license) = 0;
// resolveProblems = false to cancel the action that had that effect
virtual bool resolveProblems (std::list problems) = 0;
-
- // FIXME: this is mostly a hack; the thing is that GtkTreeSelection doesn't
- // signal when a selected row changes values. Anyway, to be done differently.
- virtual void packageModified (Package *package) = 0;
};
void setInterface (Interface *interface);
- bool isModified(); // any change made?
+ struct PkgListener {
+ virtual void packageModified (Package *package) = 0;
+ };
+ void addPkgListener (PkgListener *listener);
+ void removePkgListener (PkgListener *listener);
// Misc
struct Repository {
@@ -190,6 +232,12 @@
};
Disk *getDisk();
+ bool isModified(); // any change made?
+
+ bool importList (const char *filename);
+ bool exportList (const char *filename);
+ bool createSolverTestcase (const char *dirname);
+
Ypp();
~Ypp();
struct Impl;
--
To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org
For additional commands, e-mail: yast-commit+help@opensuse.org