libyui-qt-pkg  2.42.5
 All Classes Functions Variables Enumerations
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().multiversionEmpty() )
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 
288  // Multiple instances of this package may or may not be in the same
289  // group, so let's check both the installed version (if there
290  // is any) and the candidate version.
291  //
292  // Make sure we emit only one filterMatch() signal if both exist
293  // and both are in the same group. We don't want multiple list
294  // entries for the same package!
295 
296  bool match =
297  check( selectable, tryCastToZyppPkg( selectable->candidateObj() ) ) ||
298  check( selectable, tryCastToZyppPkg( selectable->installedObj() ) );
299 
300  // If there is neither an installed nor a candidate package, check
301  // any other instance.
302 
303  if ( ! match &&
304  ! selectable->candidateObj() &&
305  ! selectable->installedObj() )
306  check( selectable, tryCastToZyppPkg( selectable->theObj() ) );
307  }
308  }
309 
310  emit filterFinished();
311 }
312 
313 
314 void
315 YQPkgPackageKitGroupsFilterView::slotSelectionChanged( QTreeWidgetItem * newSelection )
316 {
317  YQPkgPackageKitGroup * sel = dynamic_cast<YQPkgPackageKitGroup *>( newSelection );
318 
319  if ( sel )
320  {
321  _selectedGroup = sel->group();
322  // for the list of reccommended packages, we need
323  // to solve first
324  if ( _selectedGroup == YPKG_GROUP_SUGGESTED ||
325  _selectedGroup == YPKG_GROUP_RECOMMENDED ||
326  _selectedGroup == YPKG_GROUP_ORPHANED ||
327  _selectedGroup == YPKG_GROUP_UNNEEDED )
328  {
329  // set the busy cursor for the solving
330  QApplication::setOverrideCursor(Qt::WaitCursor);
331  zypp::getZYpp()->resolver()->resolvePool();
332  QApplication::restoreOverrideCursor();
333  }
334 
335  }
336  else
337  {
338  _selectedGroup = YPKG_GROUP_ALL;
339  }
340 
341  filter();
342 }
343 
344 
345 bool
347  ZyppPkg pkg )
348 {
349  if ( ! pkg || ! selection() )
350  return false;
351 
352  if ( selection()->group() == YPKG_GROUP_ALL ) // Special case: All packages
353  {
354  emit filterMatch( selectable, pkg );
355  return true;
356  }
357 
358  YPkgGroupEnum pk_group = rpmGroupToPackageKitGroup( pkg->group() );
359 
360  if ( pk_group == selectedGroup() )
361  {
362  emit filterMatch( selectable, pkg );
363  return true;
364  }
365 
366  if ( selectedGroup() == YPKG_GROUP_RECOMMENDED &&
367  zypp::PoolItem(pkg).status().isRecommended() )
368  {
369  emit filterMatch( selectable, pkg );
370  return true;
371  }
372  if ( selectedGroup() == YPKG_GROUP_SUGGESTED &&
373  zypp::PoolItem(pkg).status().isSuggested() )
374  {
375  emit filterMatch( selectable, pkg );
376  return true;
377  }
378  if ( selectedGroup() == YPKG_GROUP_ORPHANED &&
379  zypp::PoolItem(pkg).status().isOrphaned() )
380  {
381  emit filterMatch( selectable, pkg );
382  return true;
383  }
384  if ( selectedGroup() == YPKG_GROUP_UNNEEDED &&
385  zypp::PoolItem(pkg).status().isUnneeded() )
386  {
387  emit filterMatch( selectable, pkg );
388  return true;
389  }
390 
391  if ( selectedGroup() == YPKG_GROUP_MULTIVERSION &&
392  selectable->multiversionInstall() )
393  {
394  emit filterMatch( selectable, pkg );
395  return true;
396  }
397 
398 
399  return false;
400 }
401 
402 
405 {
406  QTreeWidgetItem * item = currentItem();
407 
408  if ( ! item )
409  return 0;
410 
411  return dynamic_cast<YQPkgPackageKitGroup *> ( item );
412 }
413 
414 
415 
416 
417 YQPkgPackageKitGroup::YQPkgPackageKitGroup( YQPkgPackageKitGroupsFilterView * parentFilterView,
418  YPkgGroupEnum group )
419  : QTreeWidgetItem( parentFilterView )
420  , _filterView( parentFilterView )
421  , _group( group )
422 {
423  QFont f = font(0);
424  QFontMetrics fm(f);
425  f.setPixelSize( (int) ( fm.height() * 1.1 ) );
426  setFont(0,f);
427 
428  string iconName = groupIcon( group );
429  setText( 0, translatedText( group ) );
430  setIcon( 0, QIcon( QString( YQPackageSelector::iconPath( iconName, 32 ).c_str() ) ) );
431 }
432 
433 
434 YQPkgPackageKitGroup::~YQPkgPackageKitGroup()
435 {
436  // NOP
437 }
438 
439 
440 bool
441 YQPkgPackageKitGroup::operator< ( const QTreeWidgetItem & otherListViewItem ) const
442 {
443  const YQPkgPackageKitGroup * otherCategoryItem =
444  dynamic_cast<const YQPkgPackageKitGroup *>(&otherListViewItem);
445 
446  if ( otherCategoryItem )
447  return group() > otherCategoryItem->group();
448  else
449  return true;
450 }
451 
452 
453 #include "YQPkgPackageKitGroupsFilterView.moc"