libyui-gtk-pkg  2.42.9
 All Classes
ygtkpkgrpmgroupsview.cc
1 /********************************************************************
2  * YaST2-GTK - http://en.opensuse.org/YaST2-GTK *
3  ********************************************************************/
4 /* YGtkPkgRpmGroupsView, rpm-groups tree-view */
5 // check the header file for information about this widget
6 
7 /*
8  Textdomain "gtk"
9  */
10 
11 #include "YGi18n.h"
12 #include "YGUI.h"
13 #include "config.h"
14 #include "YGUtils.h"
15 #include "ygtkpkgrpmgroupsview.h"
16 #include "ygtkpkglistview.h"
17 #include <YRpmGroupsTree.h>
18 
19 enum {
20  TEXT_COLUMN, DATA_COLUMN, TOTAL_COLUMNS
21 };
22 
23 static void addNode (GtkTreeStore *store, GtkTreeIter *parent, const YStringTreeItem *item)
24 {
25  if (!item) return;
26 
27  GtkTreeIter iter;
28  gtk_tree_store_append (store, &iter, parent);
29  gtk_tree_store_set (store, &iter,
30  TEXT_COLUMN, item->value().translation().c_str(), DATA_COLUMN, item, -1);
31 
32  addNode (store, &iter, item->firstChild());
33  addNode (store, parent, item->next());
34 }
35 
37  GtkTreeStore *store;
38  YRpmGroupsTree *tree;
39 
40  GtkTreeModel *getModel()
41  { return GTK_TREE_MODEL (store); }
42 
44  {
45  store = gtk_tree_store_new (TOTAL_COLUMNS, G_TYPE_STRING, G_TYPE_POINTER);
46  tree = new YRpmGroupsTree();
47 
48  zypp::sat::LookupAttr rpmgroups (zypp::sat::SolvAttr::group);
49  for (zypp::sat::LookupAttr::iterator it = rpmgroups.begin();
50  it != rpmgroups.end(); it++)
51  tree->addRpmGroup (it.asString());
52 
53  GtkTreeIter iter;
54  gtk_tree_store_append (store, &iter, NULL);
55  gtk_tree_store_set (store, &iter,
56  TEXT_COLUMN, _("All packages"), DATA_COLUMN, NULL, -1);
57 
58  addNode (store, NULL, tree->root()->firstChild());
59  }
60 
62  {
63  delete tree;
64  g_object_unref (G_OBJECT (store));
65  }
66 
67  bool writeQuery (Ypp::PoolQuery &query, GtkTreeIter *iter)
68  {
69  gpointer data;
70  gtk_tree_model_get (getModel(), iter, DATA_COLUMN, &data, -1);
71  if (data) {
72  YStringTreeItem *group = (YStringTreeItem *) data;
73  std::string rpm_group (tree->rpmGroup (group));
74  query.addCriteria (new Ypp::RpmGroupMatch (rpm_group));
75  return true;
76  }
77  return false;
78  }
79 };
80 
81 
83  GtkWidget *scroll, *view;
84  YGtkPkgRpmGroupsModel *model;
85 
86  Impl (YGtkPkgRpmGroupsModel *model) : model (model) {}
87  ~Impl() { delete model; }
88 };
89 
90 static void selection_changed_cb (GtkTreeSelection *selection, YGtkPkgRpmGroupsView *pThis)
91 {
92  if (gtk_tree_selection_get_selected (selection, NULL, NULL))
93  pThis->notify();
94 }
95 
96 YGtkPkgRpmGroupsView::YGtkPkgRpmGroupsView()
97 : YGtkPkgQueryWidget(), impl (new Impl (new YGtkPkgRpmGroupsModel()))
98 {
99  impl->view = gtk_tree_view_new_with_model (impl->model->getModel());
100 
101  GtkTreeView *view = GTK_TREE_VIEW (impl->view);
102  gtk_tree_view_set_headers_visible (view, FALSE);
103  gtk_tree_view_set_search_column (view, TEXT_COLUMN);
104  gtk_tree_view_set_enable_tree_lines (view, TRUE);
105  gtk_tree_view_expand_all (view);
106 
107  GtkCellRenderer *renderer;
108  GtkTreeViewColumn *column;
109  renderer = gtk_cell_renderer_text_new();
110  column = gtk_tree_view_column_new_with_attributes (
111  NULL, renderer, "text", TEXT_COLUMN, NULL);
112  g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
113  gtk_tree_view_append_column (view, column);
114 
115  GtkTreeSelection *selection = gtk_tree_view_get_selection (view);
116  gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
117  g_signal_connect (G_OBJECT (selection), "changed",
118  G_CALLBACK (selection_changed_cb), this);
119  clearSelection();
120 
121  impl->scroll = gtk_scrolled_window_new (NULL, NULL);
122  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (impl->scroll),
123  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
124  gtk_scrolled_window_set_shadow_type (
125  GTK_SCROLLED_WINDOW (impl->scroll), GTK_SHADOW_IN);
126  gtk_container_add (GTK_CONTAINER (impl->scroll), impl->view);
127  gtk_widget_show_all (impl->scroll);
128 }
129 
130 YGtkPkgRpmGroupsView::~YGtkPkgRpmGroupsView()
131 { delete impl; }
132 
133 GtkWidget *YGtkPkgRpmGroupsView::getWidget()
134 { return impl->scroll; }
135 
136 void YGtkPkgRpmGroupsView::clearSelection()
137 {
138  GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->view));
139  g_signal_handlers_block_by_func (selection, (gpointer) selection_changed_cb, this);
140  {
141  GtkTreeIter iter;
142  gtk_tree_model_get_iter_first (impl->model->getModel(), &iter);
143  gtk_tree_selection_select_iter (selection, &iter);
144  }
145  g_signal_handlers_unblock_by_func (selection, (gpointer) selection_changed_cb, this);
146 }
147 
148 bool YGtkPkgRpmGroupsView::writeQuery (Ypp::PoolQuery &query)
149 {
150  GtkTreeModel *model;
151  GtkTreeIter iter;
152  GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->view));
153  if (gtk_tree_selection_get_selected (selection, &model, &iter))
154  return impl->model->writeQuery (query, &iter);
155  else {
156  GtkTreeIter iter;
157  if (gtk_tree_model_get_iter_first (model, &iter)) {
158  g_signal_handlers_block_by_func (selection, (gpointer) selection_changed_cb, this);
159  gtk_tree_selection_select_iter (selection, &iter);
160  g_signal_handlers_unblock_by_func (selection, (gpointer) selection_changed_cb, this);
161  }
162  }
163  return false;
164 }
165