libyui-qt-pkg  2.45.6
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  // 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)
Emitted during filtering for each pkg that matches the filter.
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.
YPkgGroupEnum selectedGroup() const
Returns the (untranslated!) currently selected group enum.
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.