libyui-qt-pkg  2.45.15
YQPkgPackageKitGroupsFilterView.cc
1 /**************************************************************************
2 Copyright (C) 2000 - 2010 Novell, Inc.
3 All Rights Reserved.
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 
19 **************************************************************************/
20 
21 
22 /*---------------------------------------------------------------------\
23 | |
24 | __ __ ____ _____ ____ |
25 | \ \ / /_ _/ ___|_ _|___ \ |
26 | \ V / _` \___ \ | | __) | |
27 | | | (_| |___) || | / __/ |
28 | |_|\__,_|____/ |_| |_____| |
29 | |
30 | core system |
31 | (C) SuSE GmbH |
32 \----------------------------------------------------------------------/
33 
34  File: YQPkgPackageKitGroupsFilterView.cc
35 
36  Authors: Duncan Mac-Vicar Prett <duncan@suse.de>
37  Stefan Hundhammer <sh@suse.de>
38 
39  Textdomain "qt-pkg"
40 
41 /-*/
42 
43 
44 #define YUILogComponent "qt-pkg"
45 #include "YUILog.h"
46 
47 #include <QApplication>
48 
49 #include "YQPackageSelector.h"
50 #include "zypp/sat/LookupAttr.h"
51 
52 #include "YQPkgPackageKitGroupsFilterView.h"
53 #include "YQi18n.h"
54 #include "utf8.h"
55 
56 
57 QString
58 translatedText( YPkgGroupEnum group )
59 {
60  switch ( group )
61  {
62  case PK_GROUP_ENUM_ACCESSIBILITY: return _( "Accessibility" );
63  case PK_GROUP_ENUM_ACCESSORIES: return _( "Accessories" );
64  case PK_GROUP_ENUM_EDUCATION: return _( "Education" );
65  case PK_GROUP_ENUM_GAMES: return _( "Games" );
66  case PK_GROUP_ENUM_GRAPHICS: return _( "Graphics" );
67  case PK_GROUP_ENUM_INTERNET: return _( "Internet" );
68  case PK_GROUP_ENUM_OFFICE: return _( "Office" );
69  case PK_GROUP_ENUM_OTHER: return _( "Other" );
70  case PK_GROUP_ENUM_PROGRAMMING: return _( "Programming" );
71  case PK_GROUP_ENUM_MULTIMEDIA: return _( "Multimedia" );
72  case PK_GROUP_ENUM_SYSTEM: return _( "System" );
73  case PK_GROUP_ENUM_DESKTOP_GNOME: return _( "GNOME Desktop" );
74  case PK_GROUP_ENUM_DESKTOP_KDE: return _( "KDE Desktop" );
75  case PK_GROUP_ENUM_DESKTOP_XFCE: return _( "XFCE Desktop" );
76  case PK_GROUP_ENUM_DESKTOP_OTHER: return _( "Other Desktops" );
77  case PK_GROUP_ENUM_PUBLISHING: return _( "Publishing" );
78  case PK_GROUP_ENUM_SERVERS: return _( "Servers" );
79  case PK_GROUP_ENUM_FONTS: return _( "Fonts" );
80  case PK_GROUP_ENUM_ADMIN_TOOLS: return _( "Admin Tools" );
81  case PK_GROUP_ENUM_LEGACY: return _( "Legacy" );
82  case PK_GROUP_ENUM_LOCALIZATION: return _( "Localization" );
83  case PK_GROUP_ENUM_VIRTUALIZATION: return _( "Virtualization" );
84  case PK_GROUP_ENUM_SECURITY: return _( "Security" );
85  case PK_GROUP_ENUM_POWER_MANAGEMENT: return _( "Power Management" );
86  case PK_GROUP_ENUM_COMMUNICATION: return _( "Communication" );
87  case PK_GROUP_ENUM_NETWORK: return _( "Network" );
88  case PK_GROUP_ENUM_MAPS: return _( "Maps" );
89  case PK_GROUP_ENUM_REPOS: return _( "Software Sources" );
90  case PK_GROUP_ENUM_UNKNOWN: return _( "Unknown Group" );
91 
92  case YPKG_GROUP_ALL: return _( "All Packages" );
93  case YPKG_GROUP_SUGGESTED: return _( "Suggested Packages" );
94  case YPKG_GROUP_RECOMMENDED: return _( "Recommended Packages");
95  case YPKG_GROUP_ORPHANED: return _( "Orphaned Packages" );
96  case YPKG_GROUP_UNNEEDED: return _( "Unneeded Packages" );
97  case YPKG_GROUP_MULTIVERSION: return _( "Multiversion Packages" );
98 
99  // Intentionally omitting 'default' case so gcc can catch unhandled enums
100  }
101 
102  return _("Unknown Group");
103 }
104 
105 
106 string
107 groupIcon( YPkgGroupEnum group )
108 {
109  switch ( group )
110  {
111  case PK_GROUP_ENUM_ACCESSIBILITY: return( "package_main" );
112  case PK_GROUP_ENUM_ACCESSORIES: return( "package_applications" );
113  case PK_GROUP_ENUM_EDUCATION: return( "package_edutainment" );
114  case PK_GROUP_ENUM_GAMES: return( "package_games" );
115  case PK_GROUP_ENUM_GRAPHICS: return( "package_graphics" );
116  case PK_GROUP_ENUM_INTERNET: return( "package_network" );
117  case PK_GROUP_ENUM_OFFICE: return( "package_office_addressbook" );
118  case PK_GROUP_ENUM_OTHER: return( "package_main" );
119  case PK_GROUP_ENUM_PROGRAMMING: return( "package_development" );
120  case PK_GROUP_ENUM_MULTIMEDIA: return( "package_multimedia" );
121  case PK_GROUP_ENUM_SYSTEM: return( "yast-system" );
122  case PK_GROUP_ENUM_DESKTOP_GNOME: return( "pattern-gnome" );
123  case PK_GROUP_ENUM_DESKTOP_KDE: return( "pattern-kde" );
124  case PK_GROUP_ENUM_DESKTOP_XFCE: return( "package_utility_desktop" );
125  case PK_GROUP_ENUM_DESKTOP_OTHER: return( "package_utility_desktop" );
126  case PK_GROUP_ENUM_PUBLISHING: return( "package_main" );
127  case PK_GROUP_ENUM_SERVERS: return( "package_editors" );
128  case PK_GROUP_ENUM_FONTS: return( "package_main" );
129  case PK_GROUP_ENUM_ADMIN_TOOLS: return( "yast-sysconfig" );
130  case PK_GROUP_ENUM_LEGACY: return( "package_main" );
131  case PK_GROUP_ENUM_LOCALIZATION: return( "yast-language" );
132  case PK_GROUP_ENUM_VIRTUALIZATION: return( "yast-create-new-vm" );
133  case PK_GROUP_ENUM_SECURITY: return( "yast-security" );
134  case PK_GROUP_ENUM_POWER_MANAGEMENT: return( "package_settings_power" );
135  case PK_GROUP_ENUM_COMMUNICATION: return( "yast-modem" );
136  case PK_GROUP_ENUM_NETWORK: return( "package_network" );
137  case PK_GROUP_ENUM_MAPS: return( "package_main" );
138  case PK_GROUP_ENUM_REPOS: return( "package_main" );
139  case PK_GROUP_ENUM_UNKNOWN: return( "package_main" );
140 
141  case YPKG_GROUP_SUGGESTED: return( "package_edutainment_languages" );
142  case YPKG_GROUP_RECOMMENDED: return( "package_edutainment_languages" );
143  case YPKG_GROUP_ORPHANED: return( "package_edutainment_languages" );
144  case YPKG_GROUP_UNNEEDED: return( "package_edutainment_languages" );
145  case YPKG_GROUP_MULTIVERSION: return( "package_edutainment_languages" );
146  case YPKG_GROUP_ALL: return( "package_main" );
147 
148  // Intentionally omitting 'default' case so gcc can catch unhandled enums
149  }
150 
151  return( "" );
152 }
153 
154 
155 YPkgGroupEnum
156 rpmGroupToPackageKitGroup( const string & rpmGroup )
157 {
158  string group = zypp::str::toLower( rpmGroup );
159 
160  if ( group.find( "amusements/teaching" ) != string::npos ) return PK_GROUP_ENUM_EDUCATION;
161  if ( group.find( "amusements" ) != string::npos ) return PK_GROUP_ENUM_GAMES;
162  if ( group.find( "development" ) != string::npos ) return PK_GROUP_ENUM_PROGRAMMING;
163  if ( group.find( "hardware" ) != string::npos ) return PK_GROUP_ENUM_SYSTEM;
164  if ( group.find( "archiving" ) != string::npos ) return PK_GROUP_ENUM_ADMIN_TOOLS;
165  if ( group.find( "clustering" ) != string::npos ) return PK_GROUP_ENUM_ADMIN_TOOLS;
166  if ( group.find( "system/monitoring" ) != string::npos ) return PK_GROUP_ENUM_ADMIN_TOOLS;
167  if ( group.find( "databases" ) != string::npos ) return PK_GROUP_ENUM_ADMIN_TOOLS;
168  if ( group.find( "system/management" ) != string::npos ) return PK_GROUP_ENUM_ADMIN_TOOLS;
169  if ( group.find( "graphics" ) != string::npos ) return PK_GROUP_ENUM_GRAPHICS;
170  if ( group.find( "multimedia" ) != string::npos ) return PK_GROUP_ENUM_MULTIMEDIA;
171  if ( group.find( "network" ) != string::npos ) return PK_GROUP_ENUM_NETWORK;
172  if ( group.find( "office" ) != string::npos ) return PK_GROUP_ENUM_OFFICE;
173  if ( group.find( "text" ) != string::npos ) return PK_GROUP_ENUM_OFFICE;
174  if ( group.find( "editors" ) != string::npos ) return PK_GROUP_ENUM_OFFICE;
175  if ( group.find( "publishing" ) != string::npos ) return PK_GROUP_ENUM_PUBLISHING;
176  if ( group.find( "security" ) != string::npos ) return PK_GROUP_ENUM_SECURITY;
177  if ( group.find( "telephony" ) != string::npos ) return PK_GROUP_ENUM_COMMUNICATION;
178  if ( group.find( "gnome" ) != string::npos ) return PK_GROUP_ENUM_DESKTOP_GNOME;
179  if ( group.find( "kde" ) != string::npos ) return PK_GROUP_ENUM_DESKTOP_KDE;
180  if ( group.find( "xfce" ) != string::npos ) return PK_GROUP_ENUM_DESKTOP_XFCE;
181  if ( group.find( "gui/other" ) != string::npos ) return PK_GROUP_ENUM_DESKTOP_OTHER;
182  if ( group.find( "localization" ) != string::npos ) return PK_GROUP_ENUM_LOCALIZATION;
183  if ( group.find( "system" ) != string::npos ) return PK_GROUP_ENUM_SYSTEM;
184  if ( group.find( "scientific" ) != string::npos ) return PK_GROUP_ENUM_EDUCATION;
185 
186  return PK_GROUP_ENUM_UNKNOWN;
187 }
188 
189 
190 
191 
193  : QTreeWidget( parent )
194  , _selectedGroup(YPKG_GROUP_ALL)
195 {
196  setIconSize(QSize(32,32));
197  setHeaderLabels( QStringList(_( "Package Groups" )) );
198  setRootIsDecorated( false );
199  setSortingEnabled( true );
200  connect( this, SIGNAL( currentItemChanged ( QTreeWidgetItem *, QTreeWidgetItem * ) ),
201  this, SLOT ( slotSelectionChanged ( QTreeWidgetItem * ) ) );
202  fillGroups();
203 
204  selectSomething();
205 }
206 
207 
209 {
210 }
211 
212 
213 void
214 YQPkgPackageKitGroupsFilterView::fillGroups()
215 {
216  if ( _groupsMap.empty() )
217  {
218  zypp::sat::LookupAttr rpmgroups( zypp::sat::SolvAttr::group );
219  for ( zypp::sat::LookupAttr::iterator it = rpmgroups.begin();
220  it != rpmgroups.end();
221  ++it )
222  {
223  YPkgGroupEnum group;
224  std::map<std::string, YPkgGroupEnum>::const_iterator itg = _groupsCache.find(it.asString());
225  if ( itg == _groupsCache.end() )
226  {
227  group = rpmGroupToPackageKitGroup( it.asString() );
228  _groupsCache[it.asString()] = group;
229  }
230  else
231  {
232  group = itg->second;
233  }
234 
235  //std::cout << it.asString() << std::endl;
236 
237  if ( _groupsMap.find(group) == _groupsMap.end() )
238  {
239  _groupsMap[group] = new YQPkgPackageKitGroup( this, group );
240  }
241  }
242 
243  _groupsMap[ YPKG_GROUP_ALL ] = new YQPkgPackageKitGroup( this, YPKG_GROUP_ALL );
244  _groupsMap[ YPKG_GROUP_RECOMMENDED ] = new YQPkgPackageKitGroup( this, YPKG_GROUP_RECOMMENDED );
245  _groupsMap[ YPKG_GROUP_SUGGESTED ] = new YQPkgPackageKitGroup( this, YPKG_GROUP_SUGGESTED );
246  _groupsMap[ YPKG_GROUP_ORPHANED ] = new YQPkgPackageKitGroup( this, YPKG_GROUP_ORPHANED );
247  _groupsMap[ YPKG_GROUP_UNNEEDED ] = new YQPkgPackageKitGroup( this, YPKG_GROUP_UNNEEDED );
248  if ( ! zypp::sat::Pool::instance().multiversion().empty() )
249  _groupsMap[ YPKG_GROUP_MULTIVERSION] = new YQPkgPackageKitGroup( this, YPKG_GROUP_MULTIVERSION );
250 
251  }
252 }
253 
254 
255 void
257 {
258 // FIXME
259 // QTreeWidgetItem * item = children().first();
260 //
261 // if ( item )
262 // setCurrentItem(item);
263 }
264 
265 
266 void
268 {
269  if ( isVisible() )
270  filter();
271 }
272 
273 
274 void
276 {
277  emit filterStart();
278  // yuiDebug() << "Filtering packages for RPM group \"" << selectedRpmGroup() << "\"" << endl;
279 
280  if ( selection() )
281  {
282  for ( ZyppPoolIterator it = zyppPkgBegin();
283  it != zyppPkgEnd();
284  ++it )
285  {
286  ZyppSel selectable = *it;
287  bool match = false;
288 
289  // If there is an installed obj, check this first. The bits are set for the installed
290  // obj only and the installed obj is not contained in the pick list if there in an
291  // identical candidate available from a repo.
292  if ( selectable->installedObj())
293  {
294  match = check( selectable, tryCastToZyppPkg( selectable->installedObj() ) );
295  }
296  if ( selectable->candidateObj() && !match)
297  {
298  match = check( selectable, tryCastToZyppPkg( selectable->candidateObj() ) );
299  }
300 
301  // And then check the pick list which contain all availables and all objects for multi
302  // version packages and the installed obj if there isn't same version in a repo.
303  if ( !match )
304  {
305  zypp::ui::Selectable::picklist_iterator it = selectable->picklistBegin();
306  while ( it != selectable->picklistEnd() && !match )
307  {
308  check( selectable, tryCastToZyppPkg( *it ) );
309  ++it;
310  }
311  }
312  }
313  }
314  emit filterFinished();
315 }
316 
317 
318 void
319 YQPkgPackageKitGroupsFilterView::slotSelectionChanged( QTreeWidgetItem * newSelection )
320 {
321  YQPkgPackageKitGroup * sel = dynamic_cast<YQPkgPackageKitGroup *>( newSelection );
322 
323  if ( sel )
324  {
325  _selectedGroup = sel->group();
326  // for the list of reccommended packages, we need
327  // to solve first
328  if ( _selectedGroup == YPKG_GROUP_SUGGESTED ||
329  _selectedGroup == YPKG_GROUP_RECOMMENDED ||
330  _selectedGroup == YPKG_GROUP_ORPHANED ||
331  _selectedGroup == YPKG_GROUP_UNNEEDED )
332  {
333  // set the busy cursor for the solving
334  QApplication::setOverrideCursor(Qt::WaitCursor);
335  zypp::getZYpp()->resolver()->resolvePool();
336  QApplication::restoreOverrideCursor();
337  }
338 
339  }
340  else
341  {
342  _selectedGroup = YPKG_GROUP_ALL;
343  }
344 
345  filter();
346 }
347 
348 
349 bool
351  ZyppPkg pkg )
352 {
353  if ( ! pkg || ! selection() )
354  return false;
355 
356  if ( selection()->group() == YPKG_GROUP_ALL ) // Special case: All packages
357  {
358  emit filterMatch( selectable, pkg );
359  return true;
360  }
361 
362  YPkgGroupEnum pk_group = rpmGroupToPackageKitGroup( pkg->group() );
363 
364  if ( pk_group == selectedGroup() )
365  {
366  emit filterMatch( selectable, pkg );
367  return true;
368  }
369 
370  if ( selectedGroup() == YPKG_GROUP_RECOMMENDED &&
371  zypp::PoolItem(pkg).status().isRecommended() )
372  {
373  emit filterMatch( selectable, pkg );
374  return true;
375  }
376  if ( selectedGroup() == YPKG_GROUP_SUGGESTED &&
377  zypp::PoolItem(pkg).status().isSuggested() )
378  {
379  emit filterMatch( selectable, pkg );
380  return true;
381  }
382  if ( selectedGroup() == YPKG_GROUP_ORPHANED &&
383  zypp::PoolItem(pkg).status().isOrphaned() )
384  {
385  emit filterMatch( selectable, pkg );
386  return true;
387  }
388  if ( selectedGroup() == YPKG_GROUP_UNNEEDED &&
389  zypp::PoolItem(pkg).status().isUnneeded() )
390  {
391  emit filterMatch( selectable, pkg );
392  return true;
393  }
394 
395  if ( selectedGroup() == YPKG_GROUP_MULTIVERSION &&
396  selectable->multiversionInstall() )
397  {
398  emit filterMatch( selectable, pkg );
399  return true;
400  }
401 
402 
403  return false;
404 }
405 
406 
409 {
410  QTreeWidgetItem * item = currentItem();
411 
412  if ( ! item )
413  return 0;
414 
415  return dynamic_cast<YQPkgPackageKitGroup *> ( item );
416 }
417 
418 
419 
420 
421 YQPkgPackageKitGroup::YQPkgPackageKitGroup( YQPkgPackageKitGroupsFilterView * parentFilterView,
422  YPkgGroupEnum group )
423  : QTreeWidgetItem( parentFilterView )
424  , _filterView( parentFilterView )
425  , _group( group )
426 {
427  QFont f = font(0);
428  QFontMetrics fm(f);
429  f.setPixelSize( (int) ( fm.height() * 1.1 ) );
430  setFont(0,f);
431 
432  string iconName = groupIcon( group );
433  QString icon = QString::fromStdString(iconName);
434  if ( QIcon::hasThemeIcon(icon) )
435  {
436  setIcon( 0, QIcon::fromTheme(icon) );
437  }
438  else
439  {
440  setIcon( 0, QIcon( QString( YQPackageSelector::iconPath( iconName, 32 ).c_str() ) ) );
441  }
442  setText( 0, translatedText( group ) );
443 }
444 
445 
446 YQPkgPackageKitGroup::~YQPkgPackageKitGroup()
447 {
448  // NOP
449 }
450 
451 
452 bool
453 YQPkgPackageKitGroup::operator< ( const QTreeWidgetItem & otherListViewItem ) const
454 {
455  const YQPkgPackageKitGroup * otherCategoryItem =
456  dynamic_cast<const YQPkgPackageKitGroup *>(&otherListViewItem);
457 
458  if ( otherCategoryItem )
459  return group() > otherCategoryItem->group();
460  else
461  return true;
462 }
463 
464 
465 #include "YQPkgPackageKitGroupsFilterView.moc"
void filterMatch(ZyppSel selectable, ZyppPkg pkg)
Emitted during filtering for each pkg that matches the filter.
YPkgGroupEnum selectedGroup() const
Returns the (untranslated!) currently selected group enum.
Filter view for PackageKit groups.
bool check(ZyppSel selectable, ZyppPkg pkg)
Check if &#39;pkg&#39; matches the selected group.
static std::string iconPath(const std::string &name, int size)
returns the full path for an icon of a given size
YQPkgPackageKitGroupsFilterView(QWidget *parent)
Constructor.
void filterStart()
Emitted when the filtering starts.
void filterIfVisible()
Same as filter(), but only if this widget is currently visible.
void filter()
Filter according to the view&#39;s rules and current selection.
YQPkgPackageKitGroup * selection() const
Returns the currently selected item or 0 if there is none.
void selectSomething()
Select a list entry (if there is any).
void filterFinished()
Emitted when filtering is finished.