1 /*---------------------------------------------------------------------\
3 | __ __ ____ _____ ____ |
4 | \ \ / /_ _/ ___|_ _|___ \ |
5 | \ V / _` \___ \ | | __) | |
6 | | | (_| |___) || | / __/ |
7 | |_|\__,_|____/ |_| |_____| |
11 \----------------------------------------------------------------------/
13 File: YQPkgPatternList.cc
15 Author: Stefan Hundhammer <sh@suse.de>
17 Textdomain "packages-qt"
22 #define y2log_component "qt-pkg"
23 #include <ycp/y2log.h>
25 #include <zypp/ZYppFactory.h>
26 #include <zypp/Resolver.h>
29 #include <zypp/ui/PatternContents.h>
33 #include "YQPkgPatternList.h"
34 #include "YQIconPool.h"
35 #include "YQApplication.h"
39 #define CATEGORY_BACKGROUND QColor( 0xFF, 0xC0, 0x50 )
42 YQPkgPatternList::YQPkgPatternList( QWidget * parent, bool autoFill, bool autoFilter )
43 : YQPkgObjList( parent )
45 y2debug( "Creating pattern list" );
49 addColumn( "" ); _statusCol = numCol++;
51 // Translators: "Pattern" refers to so-called "installation patterns",
52 // i.e., specific task-oriented groups of packages, like "everything that
53 // is needed to run a web server". The idea of patterns is that they also
54 // include the configuration workflow needed for that task, such of
55 // configuring the web server. For the scope of the package selector, this
56 // is only of little relevance, though.
58 addColumn( _( "Pattern" ) ); _summaryCol = numCol++;
60 // Can use the same colum for "broken" and "satisfied":
61 // Both states are mutually exclusive
63 _satisfiedIconCol = _summaryCol;
64 _brokenIconCol = _summaryCol;
66 header()->setStretchEnabled( _statusCol , false );
67 header()->setStretchEnabled( _summaryCol, true );
69 setAllColumnsShowFocus( true );
74 connect( this, SIGNAL( selectionChanged( QTreeWidgetItem * ) ),
75 this, SLOT ( filter() ) );
84 y2debug( "Creating pattern list done" );
88 YQPkgPatternList::~YQPkgPatternList()
95 YQPkgPatternList::fillList()
98 y2debug( "Filling pattern list" );
101 for ( ZyppPoolIterator it = zyppPatternsBegin();
102 it != zyppPatternsEnd();
105 ZyppPattern zyppPattern = tryCastToZyppPattern( (*it)->theObj() );
109 if ( zyppPattern->userVisible() )
111 addPatternItem( *it, zyppPattern );
114 y2debug( "Pattern %s is not user-visible", zyppPattern->name().c_str() );
118 y2error( "Found non-Pattern selectable" );
122 y2debug( "Pattern list filled" );
126 YQPkgPatternCategoryItem *
127 YQPkgPatternList::category( const QString & categoryName )
129 if ( categoryName.isEmpty() )
132 YQPkgPatternCategoryItem * cat = _categories[ categoryName ];
136 y2debug( "New pattern category \"%s\"", (const char *) categoryName );
138 cat = new YQPkgPatternCategoryItem( this, categoryName );
140 _categories.insert( categoryName, cat );
149 YQPkgPatternList::filterIfVisible()
157 YQPkgPatternList::filter()
161 if ( selection() ) // The seleted QListViewItem
163 ZyppPattern zyppPattern = selection()->zyppPattern();
167 zypp::ui::PatternContents patternContents( zyppPattern );
168 set<string> wanted = patternContents.install_packages();
170 for ( ZyppPoolIterator it = zyppPkgBegin();
174 string name = (*it)->theObj()->name();
176 if ( contains( wanted, name ) )
178 ZyppPkg zyppPkg = tryCastToZyppPkg( (*it)->theObj() );
182 emit filterMatch( *it, zyppPkg );
189 emit filterFinished();
194 YQPkgPatternList::addPatternItem( ZyppSel selectable,
195 ZyppPattern zyppPattern )
199 y2error( "NULL ZyppSelectable!" );
203 YQPkgPatternCategoryItem * cat = category( fromUTF8( zyppPattern->category() ) );
204 YQPkgPatternListItem * item = 0;
207 item = new YQPkgPatternListItem( this, cat, selectable, zyppPattern );
209 item = new YQPkgPatternListItem( this, selectable, zyppPattern );
211 applyExcludeRules( item );
215 YQPkgPatternListItem *
216 YQPkgPatternList::selection() const
219 QTreeWidgetItem * item = selectedItem();
224 return dynamic_cast<YQPkgPatternListItem *> (item);
232 YQPkgPatternList::pkgObjClicked( int button,
233 QTreeWidgetItem * listViewItem,
238 YQPkgPatternCategoryItem * categoryItem
239 = dynamic_cast<YQPkgPatternCategoryItem *> (listViewItem);
243 if ( button == Qt::LeftButton )
245 if ( col == statusCol() )
247 categoryItem->setOpen( ! categoryItem->isOpen() );
253 YQPkgObjList::pkgObjClicked( button, listViewItem, col, pos );
260 YQPkgPatternList::selectSomething()
263 QTreeWidgetItemIterator it( this );
267 QY2ListViewItem * item = dynamic_cast<QY2ListViewItem *> (*it);
268 YQPkgPatternCategoryItem * categoryItem =
269 dynamic_cast<YQPkgPatternCategoryItem *> (*it);
271 if ( item && item->isSelectable() && ! categoryItem )
273 setSelected( item, true ); // emits signal, too
287 YQPkgPatternListItem::YQPkgPatternListItem( YQPkgPatternList * patternList,
289 ZyppPattern zyppPattern )
290 : YQPkgObjListItem( patternList, selectable, zyppPattern )
291 , _patternList( patternList )
292 , _zyppPattern( zyppPattern )
298 YQPkgPatternListItem::YQPkgPatternListItem( YQPkgPatternList * patternList,
299 YQPkgPatternCategoryItem * parentCategory,
301 ZyppPattern zyppPattern )
302 : YQPkgObjListItem( patternList, parentCategory, selectable, zyppPattern )
303 , _patternList( patternList )
304 , _zyppPattern( zyppPattern )
307 parentCategory->addPattern( _zyppPattern );
312 YQPkgPatternListItem::init()
314 if ( ! _zyppPattern )
315 _zyppPattern = tryCastToZyppPattern( selectable()->theObj() );
322 YQPkgPatternListItem::~YQPkgPatternListItem()
329 YQPkgPatternListItem::applyChanges()
331 solveResolvableCollections();
337 * Comparison function used for sorting the list.
344 YQPkgPatternListItem::compare( QTreeWidgetItem * otherListViewItem,
346 bool ascending ) const
348 YQPkgPatternListItem * otherPatternListitem = dynamic_cast<YQPkgPatternListItem *>(otherListViewItem);
350 if ( _zyppPattern && otherPatternListitem && otherPatternListitem->zyppPattern() )
351 return _zyppPattern->order().compare( otherPatternListitem->zyppPattern()->order() );
353 YQPkgPatternCategoryItem * otherCategoryItem = dynamic_cast<YQPkgPatternCategoryItem *>(otherListViewItem);
355 if ( otherCategoryItem ) // Patterns without category should always be sorted
356 return -1; // before any category
358 return false; //FIXME QTreeWidgetItem::compare( otherListViewItem, col, ascending );
366 YQPkgPatternCategoryItem::YQPkgPatternCategoryItem( YQPkgPatternList * patternList,
367 const QString & category )
368 : QY2ListViewItem( patternList )
369 , _patternList( patternList )
371 setText( _patternList->summaryCol(), category );
372 setBackgroundColor( CATEGORY_BACKGROUND );
378 YQPkgPatternCategoryItem::~YQPkgPatternCategoryItem()
385 YQPkgPatternCategoryItem::paintCell( QPainter * painter,
386 const QColorGroup & colorGroup,
391 painter->setFont( YQUI::yqApp()->headingFont() );
392 //FIXME QY2ListViewItem::paintCell( painter, colorGroup, column, width, alignment );
398 YQPkgPatternCategoryItem::addPattern( ZyppPattern pattern )
400 if ( ! _firstPattern )
402 _firstPattern = pattern;
406 if ( _firstPattern->order().compare( pattern->order() ) < 0 )
407 _firstPattern = pattern;
413 YQPkgPatternCategoryItem::setOpen( bool open )
415 //FIXME QTreeWidgetItem::setOpen( open );
421 YQPkgPatternCategoryItem::setTreeIcon()
424 setPixmap( _patternList->statusCol(),
426 YQIconPool::treeMinus() :
427 YQIconPool::treePlus() );
434 * Comparison function used for sorting the list.
441 YQPkgPatternCategoryItem::compare( QTreeWidgetItem * otherListViewItem,
443 bool ascending ) const
445 YQPkgPatternCategoryItem * otherCategoryItem = dynamic_cast<YQPkgPatternCategoryItem *>(otherListViewItem);
447 if ( _firstPattern && otherCategoryItem && otherCategoryItem->firstPattern() )
448 return _firstPattern->order().compare( otherCategoryItem->firstPattern()->order() );
451 YQPkgPatternListItem * otherPatternListitem = dynamic_cast<YQPkgPatternListItem *>(otherListViewItem);
453 if ( otherPatternListitem ) // Patterns without category should always be sorted
454 return 1; // before any category
456 return false; // FIXME QTreeWidgetItem::compare( otherListViewItem, col, ascending );
461 #include "YQPkgPatternList.moc"