libyui-qt-pkg  2.42.13
 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  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  // And then check the pick list which contain all availables and all objects for multi
297  // version packages and the installed obj if there isn't same version in a repo.
298  if ( !match )
299  {
300  zypp::ui::Selectable::picklist_iterator it = selectable->picklistBegin();
301  while ( it != selectable->picklistEnd() && !match )
302  {
303  check( selectable, tryCastToZyppPkg( *it ) );
304  ++it;
305  }
306  }
307  }
308  }
309  emit filterFinished();
310 }
311 
312 
313 void
314 YQPkgPackageKitGroupsFilterView::slotSelectionChanged( QTreeWidgetItem * newSelection )
315 {
316  YQPkgPackageKitGroup * sel = dynamic_cast<YQPkgPackageKitGroup *>( newSelection );
317 
318  if ( sel )
319  {
320  _selectedGroup = sel->group();
321  // for the list of reccommended packages, we need
322  // to solve first
323  if ( _selectedGroup == YPKG_GROUP_SUGGESTED ||
324  _selectedGroup == YPKG_GROUP_RECOMMENDED ||
325  _selectedGroup == YPKG_GROUP_ORPHANED ||
326  _selectedGroup == YPKG_GROUP_UNNEEDED )
327  {
328  // set the busy cursor for the solving
329  QApplication::setOverrideCursor(Qt::WaitCursor);
330  zypp::getZYpp()->resolver()->resolvePool();
331  QApplication::restoreOverrideCursor();
332  }
333 
334  }
335  else
336  {
337  _selectedGroup = YPKG_GROUP_ALL;
338  }
339 
340  filter();
341 }
342 
343 
344 bool
346  ZyppPkg pkg )
347 {
348  if ( ! pkg || ! selection() )
349  return false;
350 
351  if ( selection()->group() == YPKG_GROUP_ALL ) // Special case: All packages
352  {
353  emit filterMatch( selectable, pkg );
354  return true;
355  }
356 
357  YPkgGroupEnum pk_group = rpmGroupToPackageKitGroup( pkg->group() );
358 
359  if ( pk_group == selectedGroup() )
360  {
361  emit filterMatch( selectable, pkg );
362  return true;
363  }
364 
365  if ( selectedGroup() == YPKG_GROUP_RECOMMENDED &&
366  zypp::PoolItem(pkg).status().isRecommended() )
367  {
368  emit filterMatch( selectable, pkg );
369  return true;
370  }
371  if ( selectedGroup() == YPKG_GROUP_SUGGESTED &&
372  zypp::PoolItem(pkg).status().isSuggested() )
373  {
374  emit filterMatch( selectable, pkg );
375  return true;
376  }
377  if ( selectedGroup() == YPKG_GROUP_ORPHANED &&
378  zypp::PoolItem(pkg).status().isOrphaned() )
379  {
380  emit filterMatch( selectable, pkg );
381  return true;
382  }
383  if ( selectedGroup() == YPKG_GROUP_UNNEEDED &&
384  zypp::PoolItem(pkg).status().isUnneeded() )
385  {
386  emit filterMatch( selectable, pkg );
387  return true;
388  }
389 
390  if ( selectedGroup() == YPKG_GROUP_MULTIVERSION &&
391  selectable->multiversionInstall() )
392  {
393  emit filterMatch( selectable, pkg );
394  return true;
395  }
396 
397 
398  return false;
399 }
400 
401 
404 {
405  QTreeWidgetItem * item = currentItem();
406 
407  if ( ! item )
408  return 0;
409 
410  return dynamic_cast<YQPkgPackageKitGroup *> ( item );
411 }
412 
413 
414 
415 
416 YQPkgPackageKitGroup::YQPkgPackageKitGroup( YQPkgPackageKitGroupsFilterView * parentFilterView,
417  YPkgGroupEnum group )
418  : QTreeWidgetItem( parentFilterView )
419  , _filterView( parentFilterView )
420  , _group( group )
421 {
422  QFont f = font(0);
423  QFontMetrics fm(f);
424  f.setPixelSize( (int) ( fm.height() * 1.1 ) );
425  setFont(0,f);
426 
427  string iconName = groupIcon( group );
428  setText( 0, translatedText( group ) );
429  setIcon( 0, QIcon( QString( YQPackageSelector::iconPath( iconName, 32 ).c_str() ) ) );
430 }
431 
432 
433 YQPkgPackageKitGroup::~YQPkgPackageKitGroup()
434 {
435  // NOP
436 }
437 
438 
439 bool
440 YQPkgPackageKitGroup::operator< ( const QTreeWidgetItem & otherListViewItem ) const
441 {
442  const YQPkgPackageKitGroup * otherCategoryItem =
443  dynamic_cast<const YQPkgPackageKitGroup *>(&otherListViewItem);
444 
445  if ( otherCategoryItem )
446  return group() > otherCategoryItem->group();
447  else
448  return true;
449 }
450 
451 
452 #include "YQPkgPackageKitGroupsFilterView.moc"
void filterMatch(ZyppSel selectable, ZyppPkg pkg)
bool check(ZyppSel selectable, ZyppPkg pkg)
static std::string iconPath(const std::string &name, int size)