libyui-qt-pkg  2.45.27
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 "YQUI.h"
55 #include "utf8.h"
56 
57 
58 QString
59 translatedText( YPkgGroupEnum group )
60 {
61  switch ( group )
62  {
63  case PK_GROUP_ENUM_ACCESSIBILITY: return _( "Accessibility" );
64  case PK_GROUP_ENUM_ACCESSORIES: return _( "Accessories" );
65  case PK_GROUP_ENUM_EDUCATION: return _( "Education" );
66  case PK_GROUP_ENUM_GAMES: return _( "Games" );
67  case PK_GROUP_ENUM_GRAPHICS: return _( "Graphics" );
68  case PK_GROUP_ENUM_INTERNET: return _( "Internet" );
69  case PK_GROUP_ENUM_OFFICE: return _( "Office" );
70  case PK_GROUP_ENUM_OTHER: return _( "Other" );
71  case PK_GROUP_ENUM_PROGRAMMING: return _( "Programming" );
72  case PK_GROUP_ENUM_MULTIMEDIA: return _( "Multimedia" );
73  case PK_GROUP_ENUM_SYSTEM: return _( "System" );
74  case PK_GROUP_ENUM_DESKTOP_GNOME: return _( "GNOME Desktop" );
75  case PK_GROUP_ENUM_DESKTOP_KDE: return _( "KDE Desktop" );
76  case PK_GROUP_ENUM_DESKTOP_XFCE: return _( "XFCE Desktop" );
77  case PK_GROUP_ENUM_DESKTOP_OTHER: return _( "Other Desktops" );
78  case PK_GROUP_ENUM_PUBLISHING: return _( "Publishing" );
79  case PK_GROUP_ENUM_SERVERS: return _( "Servers" );
80  case PK_GROUP_ENUM_FONTS: return _( "Fonts" );
81  case PK_GROUP_ENUM_ADMIN_TOOLS: return _( "Admin Tools" );
82  case PK_GROUP_ENUM_LEGACY: return _( "Legacy" );
83  case PK_GROUP_ENUM_LOCALIZATION: return _( "Localization" );
84  case PK_GROUP_ENUM_VIRTUALIZATION: return _( "Virtualization" );
85  case PK_GROUP_ENUM_SECURITY: return _( "Security" );
86  case PK_GROUP_ENUM_POWER_MANAGEMENT: return _( "Power Management" );
87  case PK_GROUP_ENUM_COMMUNICATION: return _( "Communication" );
88  case PK_GROUP_ENUM_NETWORK: return _( "Network" );
89  case PK_GROUP_ENUM_MAPS: return _( "Maps" );
90  case PK_GROUP_ENUM_REPOS: return _( "Software Sources" );
91  case PK_GROUP_ENUM_UNKNOWN: return _( "Unknown Group" );
92 
93  case YPKG_GROUP_ALL: return _( "All Packages" );
94  case YPKG_GROUP_SUGGESTED: return _( "Suggested Packages" );
95  case YPKG_GROUP_RECOMMENDED: return _( "Recommended Packages");
96  case YPKG_GROUP_ORPHANED: return _( "Orphaned Packages" );
97  case YPKG_GROUP_UNNEEDED: return _( "Unneeded Packages" );
98  case YPKG_GROUP_MULTIVERSION: return _( "Multiversion Packages" );
99 
100  // Intentionally omitting 'default' case so gcc can catch unhandled enums
101  }
102 
103  return _("Unknown Group");
104 }
105 
106 
107 string
108 groupIcon( YPkgGroupEnum group )
109 {
110  switch ( group )
111  {
112  case PK_GROUP_ENUM_ACCESSIBILITY: return( "preferences-other" );
113  case PK_GROUP_ENUM_ACCESSORIES: return( "applications-accessories" );
114  case PK_GROUP_ENUM_EDUCATION: return( "applications-science" );
115  case PK_GROUP_ENUM_GAMES: return( "applications-games" );
116  case PK_GROUP_ENUM_GRAPHICS: return( "applications-graphics" );
117  case PK_GROUP_ENUM_INTERNET: return( "applications-internet" );
118  case PK_GROUP_ENUM_OFFICE: return( "applications-office" );
119  case PK_GROUP_ENUM_OTHER: return( "applications-other" );
120  case PK_GROUP_ENUM_PROGRAMMING: return( "applications-development" );
121  case PK_GROUP_ENUM_MULTIMEDIA: return( "applications-multimedia" );
122  case PK_GROUP_ENUM_SYSTEM: return( "applications-system" );
123  case PK_GROUP_ENUM_DESKTOP_GNOME: return( "preferences-desktop" );
124  case PK_GROUP_ENUM_DESKTOP_KDE: return( "preferences-desktop" );
125  case PK_GROUP_ENUM_DESKTOP_XFCE: return( "preferences-desktop" );
126  case PK_GROUP_ENUM_DESKTOP_OTHER: return( "preferences-desktop" );
127  case PK_GROUP_ENUM_PUBLISHING: return( "applications-office" );
128  case PK_GROUP_ENUM_SERVERS: return( "applications-system" );
129  case PK_GROUP_ENUM_FONTS: return( "applications-graphics" );
130  case PK_GROUP_ENUM_ADMIN_TOOLS: return( "applications-utilities" );
131  case PK_GROUP_ENUM_LEGACY: return( "applications-other" );
132  case PK_GROUP_ENUM_LOCALIZATION: return( "preferences-desktop-locale" );
133  case PK_GROUP_ENUM_VIRTUALIZATION: return( "applications-system" );
134  case PK_GROUP_ENUM_SECURITY: return( "preferences-other" );
135  case PK_GROUP_ENUM_POWER_MANAGEMENT: return( "utilities-system-monitor" );
136  case PK_GROUP_ENUM_COMMUNICATION: return( "applications-internet" );
137  case PK_GROUP_ENUM_NETWORK: return( "applications-internet" );
138  case PK_GROUP_ENUM_MAPS: return( "preferences-desktop-locale" );
139  case PK_GROUP_ENUM_REPOS: return( "preferences-system-network" );
140  case PK_GROUP_ENUM_UNKNOWN: return( "preferences-other" );
141 
142  case YPKG_GROUP_SUGGESTED: return( "preferences-desktop-locale" );
143  case YPKG_GROUP_RECOMMENDED: return( "preferences-desktop-locale" );
144  case YPKG_GROUP_ORPHANED: return( "preferences-desktop-locale" );
145  case YPKG_GROUP_UNNEEDED: return( "preferences-desktop-locale" );
146  case YPKG_GROUP_MULTIVERSION: return( "preferences-desktop-locale" );
147  case YPKG_GROUP_ALL: return( "preferences-other" );
148 
149  // Intentionally omitting 'default' case so gcc can catch unhandled enums
150  }
151 
152  return( "" );
153 }
154 
155 
156 YPkgGroupEnum
157 rpmGroupToPackageKitGroup( const string & rpmGroup )
158 {
159  string group = zypp::str::toLower( rpmGroup );
160 
161  if ( group.find( "amusements/teaching" ) != string::npos ) return PK_GROUP_ENUM_EDUCATION;
162  if ( group.find( "amusements" ) != string::npos ) return PK_GROUP_ENUM_GAMES;
163  if ( group.find( "development" ) != string::npos ) return PK_GROUP_ENUM_PROGRAMMING;
164  if ( group.find( "hardware" ) != string::npos ) return PK_GROUP_ENUM_SYSTEM;
165  if ( group.find( "archiving" ) != string::npos ) return PK_GROUP_ENUM_ADMIN_TOOLS;
166  if ( group.find( "clustering" ) != string::npos ) return PK_GROUP_ENUM_ADMIN_TOOLS;
167  if ( group.find( "system/monitoring" ) != string::npos ) return PK_GROUP_ENUM_ADMIN_TOOLS;
168  if ( group.find( "databases" ) != string::npos ) return PK_GROUP_ENUM_ADMIN_TOOLS;
169  if ( group.find( "system/management" ) != string::npos ) return PK_GROUP_ENUM_ADMIN_TOOLS;
170  if ( group.find( "graphics" ) != string::npos ) return PK_GROUP_ENUM_GRAPHICS;
171  if ( group.find( "multimedia" ) != string::npos ) return PK_GROUP_ENUM_MULTIMEDIA;
172  if ( group.find( "network" ) != string::npos ) return PK_GROUP_ENUM_NETWORK;
173  if ( group.find( "office" ) != string::npos ) return PK_GROUP_ENUM_OFFICE;
174  if ( group.find( "text" ) != string::npos ) return PK_GROUP_ENUM_OFFICE;
175  if ( group.find( "editors" ) != string::npos ) return PK_GROUP_ENUM_OFFICE;
176  if ( group.find( "publishing" ) != string::npos ) return PK_GROUP_ENUM_PUBLISHING;
177  if ( group.find( "security" ) != string::npos ) return PK_GROUP_ENUM_SECURITY;
178  if ( group.find( "telephony" ) != string::npos ) return PK_GROUP_ENUM_COMMUNICATION;
179  if ( group.find( "gnome" ) != string::npos ) return PK_GROUP_ENUM_DESKTOP_GNOME;
180  if ( group.find( "kde" ) != string::npos ) return PK_GROUP_ENUM_DESKTOP_KDE;
181  if ( group.find( "xfce" ) != string::npos ) return PK_GROUP_ENUM_DESKTOP_XFCE;
182  if ( group.find( "gui/other" ) != string::npos ) return PK_GROUP_ENUM_DESKTOP_OTHER;
183  if ( group.find( "localization" ) != string::npos ) return PK_GROUP_ENUM_LOCALIZATION;
184  if ( group.find( "system" ) != string::npos ) return PK_GROUP_ENUM_SYSTEM;
185  if ( group.find( "scientific" ) != string::npos ) return PK_GROUP_ENUM_EDUCATION;
186 
187  return PK_GROUP_ENUM_UNKNOWN;
188 }
189 
190 
191 
192 
194  : QTreeWidget( parent )
195  , _selectedGroup(YPKG_GROUP_ALL)
196 {
197  setIconSize(QSize(32,32));
198  setHeaderLabels( QStringList(_( "Package Groups" )) );
199  setRootIsDecorated( false );
200  setSortingEnabled( true );
201  connect( this, SIGNAL( currentItemChanged ( QTreeWidgetItem *, QTreeWidgetItem * ) ),
202  this, SLOT ( slotSelectionChanged ( QTreeWidgetItem * ) ) );
203  fillGroups();
204 
205  selectSomething();
206 }
207 
208 
210 {
211 }
212 
213 
214 void
215 YQPkgPackageKitGroupsFilterView::fillGroups()
216 {
217  if ( _groupsMap.empty() )
218  {
219  zypp::sat::LookupAttr rpmgroups( zypp::sat::SolvAttr::group );
220  for ( zypp::sat::LookupAttr::iterator it = rpmgroups.begin();
221  it != rpmgroups.end();
222  ++it )
223  {
224  YPkgGroupEnum group;
225  std::map<std::string, YPkgGroupEnum>::const_iterator itg = _groupsCache.find(it.asString());
226  if ( itg == _groupsCache.end() )
227  {
228  group = rpmGroupToPackageKitGroup( it.asString() );
229  _groupsCache[it.asString()] = group;
230  }
231  else
232  {
233  group = itg->second;
234  }
235 
236  if ( _groupsMap.find(group) == _groupsMap.end() )
237  {
238  _groupsMap[group] = new YQPkgPackageKitGroup( this, group );
239  }
240  }
241 
242  _groupsMap[ YPKG_GROUP_ALL ] = new YQPkgPackageKitGroup( this, YPKG_GROUP_ALL );
243  _groupsMap[ YPKG_GROUP_RECOMMENDED ] = new YQPkgPackageKitGroup( this, YPKG_GROUP_RECOMMENDED );
244  _groupsMap[ YPKG_GROUP_SUGGESTED ] = new YQPkgPackageKitGroup( this, YPKG_GROUP_SUGGESTED );
245  _groupsMap[ YPKG_GROUP_ORPHANED ] = new YQPkgPackageKitGroup( this, YPKG_GROUP_ORPHANED );
246  _groupsMap[ YPKG_GROUP_UNNEEDED ] = new YQPkgPackageKitGroup( this, YPKG_GROUP_UNNEEDED );
247  if ( ! zypp::sat::Pool::instance().multiversion().empty() )
248  _groupsMap[ YPKG_GROUP_MULTIVERSION] = new YQPkgPackageKitGroup( this, YPKG_GROUP_MULTIVERSION );
249 
250  }
251 }
252 
253 
254 void
256 {
257 // FIXME
258 // QTreeWidgetItem * item = children().first();
259 //
260 // if ( item )
261 // setCurrentItem(item);
262 }
263 
264 
265 void
267 {
268  if ( isVisible() )
269  filter();
270 }
271 
272 
273 void
275 {
276  emit filterStart();
277  // yuiDebug() << "Filtering packages for RPM group \"" << selectedRpmGroup() << "\"" << endl;
278 
279  if ( selection() )
280  {
281  for ( ZyppPoolIterator it = zyppPkgBegin();
282  it != zyppPkgEnd();
283  ++it )
284  {
285  ZyppSel selectable = *it;
286  bool match = false;
287 
288  // If there is an installed obj, check this first. The bits are set for the installed
289  // obj only and the installed obj is not contained in the pick list if there in an
290  // identical candidate available from a repo.
291  if ( selectable->installedObj())
292  {
293  match = check( selectable, tryCastToZyppPkg( selectable->installedObj() ) );
294  }
295  if ( selectable->candidateObj() && !match)
296  {
297  match = check( selectable, tryCastToZyppPkg( selectable->candidateObj() ) );
298  }
299 
300  // And then check the pick list which contain all availables and all objects for multi
301  // version packages and the installed obj if there isn't same version in a repo.
302  if ( !match )
303  {
304  zypp::ui::Selectable::picklist_iterator it = selectable->picklistBegin();
305  while ( it != selectable->picklistEnd() && !match )
306  {
307  check( selectable, tryCastToZyppPkg( *it ) );
308  ++it;
309  }
310  }
311  }
312  }
313  emit filterFinished();
314 }
315 
316 
317 void
318 YQPkgPackageKitGroupsFilterView::slotSelectionChanged( QTreeWidgetItem * newSelection )
319 {
320  YQPkgPackageKitGroup * sel = dynamic_cast<YQPkgPackageKitGroup *>( newSelection );
321 
322  if ( sel )
323  {
324  _selectedGroup = sel->group();
325  // for the list of reccommended packages, we need
326  // to solve first
327  if ( _selectedGroup == YPKG_GROUP_SUGGESTED ||
328  _selectedGroup == YPKG_GROUP_RECOMMENDED ||
329  _selectedGroup == YPKG_GROUP_ORPHANED ||
330  _selectedGroup == YPKG_GROUP_UNNEEDED )
331  {
332  // set the busy cursor for the solving
333  QApplication::setOverrideCursor(Qt::WaitCursor);
334  zypp::getZYpp()->resolver()->resolvePool();
335  QApplication::restoreOverrideCursor();
336  }
337 
338  }
339  else
340  {
341  _selectedGroup = YPKG_GROUP_ALL;
342  }
343 
344  filter();
345 }
346 
347 
348 bool
350  ZyppPkg pkg )
351 {
352  if ( ! pkg || ! selection() )
353  return false;
354 
355  if ( selection()->group() == YPKG_GROUP_ALL ) // Special case: All packages
356  {
357  emit filterMatch( selectable, pkg );
358  return true;
359  }
360 
361  YPkgGroupEnum pk_group = rpmGroupToPackageKitGroup( pkg->group() );
362 
363  if ( pk_group == selectedGroup() )
364  {
365  emit filterMatch( selectable, pkg );
366  return true;
367  }
368 
369  if ( selectedGroup() == YPKG_GROUP_RECOMMENDED &&
370  zypp::PoolItem(pkg).status().isRecommended() )
371  {
372  emit filterMatch( selectable, pkg );
373  return true;
374  }
375  if ( selectedGroup() == YPKG_GROUP_SUGGESTED &&
376  zypp::PoolItem(pkg).status().isSuggested() )
377  {
378  emit filterMatch( selectable, pkg );
379  return true;
380  }
381  if ( selectedGroup() == YPKG_GROUP_ORPHANED &&
382  zypp::PoolItem(pkg).status().isOrphaned() )
383  {
384  emit filterMatch( selectable, pkg );
385  return true;
386  }
387  if ( selectedGroup() == YPKG_GROUP_UNNEEDED &&
388  zypp::PoolItem(pkg).status().isUnneeded() )
389  {
390  emit filterMatch( selectable, pkg );
391  return true;
392  }
393 
394  if ( selectedGroup() == YPKG_GROUP_MULTIVERSION &&
395  selectable->multiversionInstall() )
396  {
397  emit filterMatch( selectable, pkg );
398  return true;
399  }
400 
401 
402  return false;
403 }
404 
405 
408 {
409  QTreeWidgetItem * item = currentItem();
410 
411  if ( ! item )
412  return 0;
413 
414  return dynamic_cast<YQPkgPackageKitGroup *> ( item );
415 }
416 
417 
418 
419 
420 YQPkgPackageKitGroup::YQPkgPackageKitGroup( YQPkgPackageKitGroupsFilterView * parentFilterView,
421  YPkgGroupEnum group )
422  : QTreeWidgetItem( parentFilterView )
423  , _filterView( parentFilterView )
424  , _group( group )
425 {
426  QFont f = font(0);
427  QFontMetrics fm(f);
428  f.setPixelSize( (int) ( fm.height() * 1.1 ) );
429  setFont(0,f);
430 
431  string iconName = groupIcon( group );
432  setIcon( 0, YQUI::ui()->loadIcon( iconName ) );
433  setText( 0, translatedText( group ) );
434 }
435 
436 
437 YQPkgPackageKitGroup::~YQPkgPackageKitGroup()
438 {
439  // NOP
440 }
441 
442 
443 bool
444 YQPkgPackageKitGroup::operator< ( const QTreeWidgetItem & otherListViewItem ) const
445 {
446  const YQPkgPackageKitGroup * otherCategoryItem =
447  dynamic_cast<const YQPkgPackageKitGroup *>(&otherListViewItem);
448 
449  if ( otherCategoryItem )
450  return group() > otherCategoryItem->group();
451  else
452  return true;
453 }
454 
455 
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.
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.