47 #define YUILogComponent "qt-pkg"
52 #include <QMessageBox>
56 #include <QHeaderView>
57 #include <QFontMetrics>
61 #include "YQPkgList.h"
64 #include "YQIconPool.h"
65 #include "YQApplication.h"
67 #define SINGLE_VERSION_COL 1
79 QString versionHeaderText;
80 QString instVersionHeaderText;
83 headers <<
""; _statusCol = numCol++;
84 headers << _(
"Package" ); _nameCol = numCol++;
85 headers << _(
"Summary" ); _summaryCol = numCol++;
89 #if SINGLE_VERSION_COL
90 versionHeaderText = _(
"Installed (Available)");
91 headers << versionHeaderText; _instVersionCol = numCol++;
92 _versionCol = _instVersionCol;
94 versionHeaderText = _(
"Avail. Ver." );
95 headers << versionHeaderText; _versionCol = numCol++;
97 instVersionHeaderText = _(
"Inst. Ver." );
98 headers << instVersionHeaderText; _instVersionCol = numCol++;
103 versionHeaderText = _(
"Version" );
104 headers << versionHeaderText; _versionCol = numCol++;
108 headers << _(
"Size" ); _sizeCol = numCol++;
110 setHeaderLabels( headers );
112 header()->setSortIndicatorShown(
true );
113 header()->setClickable(
true );
115 sortByColumn( statusCol(), Qt::AscendingOrder );
116 setAllColumnsShowFocus(
true );
117 setIconSize( QSize( 22, 16 ) );
119 header()->setResizeMode( QHeaderView::Interactive );
126 connect ( header(), SIGNAL( sectionClicked (
int) ),
127 this, SLOT( sortByColumn (
int) ) );
158 scheduleDelayedItemsLayout();
162 yuiError() <<
"NULL zypp::ui::Selectable!" << std::endl;
180 for ( ZyppPoolIterator it = zyppPkgBegin();
184 if ( (*it)->installedObj() )
194 QTreeWidgetItem * listViewItem,
198 if ( col == srpmStatusCol() )
204 if ( button == Qt::LeftButton )
210 else if ( button == Qt::RightButton )
216 if ( _sourceRpmContextMenu )
217 _sourceRpmContextMenu->popup( pos );
232 return QSize( 600, 350 );
239 _sourceRpmContextMenu =
new QMenu(
this );
241 _sourceRpmContextMenu->addAction(actionInstallSourceRpm);
242 _sourceRpmContextMenu->addAction(actionDontInstallSourceRpm);
244 QMenu * submenu =
new QMenu( _sourceRpmContextMenu );
245 Q_CHECK_PTR( submenu );
246 QAction *action = _sourceRpmContextMenu->addMenu( submenu );
247 action->setText(_(
"&All in This List" ));
249 submenu->addAction(actionInstallListSourceRpms);
250 submenu->addAction(actionDontInstallListSourceRpms);
255 YQPkgList::setInstallCurrentSourceRpm(
bool installSourceRpm,
256 bool selectNextItem )
259 QTreeWidgetItem * listViewItem = selectedItem();
261 if ( ! listViewItem )
270 if ( selectNextItem && item->nextSibling() )
272 item->setSelected(
false );
273 setSelected( item->nextSibling(), true );
281 YQPkgList::setInstallListSourceRpms(
bool installSourceRpm )
287 QTreeWidgetItem * listViewItem = firstChild();
289 while ( listViewItem )
298 listViewItem = listViewItem->nextSibling();
307 _optimalColWidth_statusIcon = 0;
308 _optimalColWidth_name = 0;
309 _optimalColWidth_summary = 0;
310 _optimalColWidth_version = 0;
311 _optimalColWidth_instVersion = 0;
312 _optimalColWidth_size = 0;
321 QFontMetrics fm( this->font() );
322 const ZyppObj candidate = selectable->candidateObj();
323 const ZyppObj installed = selectable->installedObj();
325 _optimalColWidth_statusIcon = 28;
327 qstr = QString::fromUtf8( zyppPkg->name().c_str() );
328 qstr_width = fm.boundingRect( qstr ).width() + 8;
329 if (qstr_width > _optimalColWidth_name)
330 _optimalColWidth_name = qstr_width;
332 qstr = QString::fromUtf8( zyppPkg->summary().c_str() );
333 qstr_width = fm.boundingRect( qstr ).width() + 8;
334 if (qstr_width > _optimalColWidth_summary)
335 _optimalColWidth_summary = qstr_width;
337 if ( instVersionCol() == versionCol() )
340 qstr = QString::fromUtf8( installed->edition().c_str() );
343 if (candidate && (!installed || (candidate->edition() != installed->edition())))
347 qstr +=
"(" + QString::fromUtf8( candidate->edition().c_str() ) +
")";
349 qstr_width = fm.boundingRect( qstr ).width() + 8;
350 if (qstr_width > _optimalColWidth_version)
351 _optimalColWidth_version = qstr_width;
357 qstr = QString::fromUtf8( candidate->edition().c_str() );
358 qstr_width = fm.boundingRect( qstr ).width() + 8;
359 if (qstr_width > _optimalColWidth_version)
360 _optimalColWidth_version = qstr_width;
364 qstr = QString::fromUtf8( installed->edition().c_str() );
365 qstr_width = fm.boundingRect( qstr ).width() + 8;
366 if (qstr_width > _optimalColWidth_instVersion)
367 _optimalColWidth_instVersion = qstr_width;
371 qstr = QString::fromUtf8( zyppPkg->installSize().asString().c_str() );
372 qstr_width = fm.boundingRect( qstr ).width() + 8;
373 if (qstr_width > _optimalColWidth_size)
374 _optimalColWidth_size = qstr_width;
381 int visibleSpace = 0;
382 int optimalWidthsSum = 0;
384 int statusIconColWidth = _optimalColWidth_statusIcon;
386 if (statusIconColWidth == 0)
387 statusIconColWidth = 28;
388 optimalWidthsSum = _optimalColWidth_statusIcon + _optimalColWidth_name + _optimalColWidth_summary + _optimalColWidth_version + _optimalColWidth_size;
389 if ( instVersionCol() != versionCol() )
391 optimalWidthsSum += _optimalColWidth_instVersion;
395 visibleSpace = this->viewport()->width();
396 if (visibleSpace < 0)
return;
397 if (optimalWidthsSum >= visibleSpace)
401 int reducedSummaryWidth = visibleSpace - optimalWidthsSum + _optimalColWidth_summary;
402 if (reducedSummaryWidth < 100)
403 reducedSummaryWidth = 100;
405 this->setColumnWidth( statusCol(), statusIconColWidth );
406 this->setColumnWidth( nameCol(), _optimalColWidth_name );
407 this->setColumnWidth( summaryCol(), reducedSummaryWidth);
408 this->setColumnWidth( versionCol(), _optimalColWidth_version );
409 if ( instVersionCol() != versionCol() )
410 this->setColumnWidth( instVersionCol(), _optimalColWidth_instVersion );
411 this->setColumnWidth( sizeCol(), _optimalColWidth_size);
417 int addSpace = (visibleSpace - optimalWidthsSum) / numOptCol;
418 int addSpaceR = (visibleSpace - optimalWidthsSum) % numOptCol;
420 this->setColumnWidth( statusCol(), statusIconColWidth );
421 this->setColumnWidth( nameCol(), _optimalColWidth_name + addSpace );
422 this->setColumnWidth( summaryCol(), _optimalColWidth_summary + addSpace );
423 this->setColumnWidth( versionCol(), _optimalColWidth_version + addSpace );
424 if ( instVersionCol() != versionCol() )
425 this->setColumnWidth( instVersionCol(), _optimalColWidth_instVersion + addSpace );
426 this->setColumnWidth( sizeCol(), _optimalColWidth_size + addSpace + addSpaceR );
443 int col = sortColumn();
444 Qt::SortOrder order = header()->sortIndicatorOrder();
445 sortByColumn(col, order);
452 if (event->size().width() !=
event->oldSize().width())
463 _notInstalledContextMenu =
new QMenu(
this );
464 Q_CHECK_PTR( _notInstalledContextMenu );
466 _notInstalledContextMenu->addAction(actionSetCurrentInstall);
467 _notInstalledContextMenu->addAction(actionSetCurrentDontInstall);
468 _notInstalledContextMenu->addAction(actionSetCurrentTaboo);
469 _notInstalledContextMenu->addAction(actionShowCurrentSolverInfo);
473 _notInstalledContextMenu->addSeparator();
474 _notInstalledContextMenu->addAction( _(
"Export This List to &Text File..." ),
482 _installedContextMenu =
new QMenu(
this );
483 Q_CHECK_PTR( _installedContextMenu );
485 _installedContextMenu->addAction(actionSetCurrentKeepInstalled);
486 _installedContextMenu->addAction(actionSetCurrentDelete);
487 _installedContextMenu->addAction(actionSetCurrentUpdate);
488 _installedContextMenu->addAction(actionSetCurrentUpdateForce);
489 _installedContextMenu->addAction(actionSetCurrentProtected);
490 _installedContextMenu->addAction(actionShowCurrentSolverInfo);
494 _installedContextMenu->addSeparator();
495 _installedContextMenu->addAction( _(
"Export This List to &Text File..." ),
503 QMenu * submenu =
new QMenu( menu );
504 Q_CHECK_PTR( submenu );
506 submenu->addAction(actionSetListInstall);
507 submenu->addAction(actionSetListDontInstall);
508 submenu->addAction(actionSetListKeepInstalled);
509 submenu->addAction(actionSetListDelete);
510 submenu->addAction(actionSetListDelete);
511 submenu->addAction(actionSetListUpdate);
512 submenu->addAction(actionSetListUpdateForce);
513 submenu->addAction(actionSetListTaboo);
514 submenu->addAction(actionSetListProtected);
516 QAction *action = menu->addMenu( submenu );
517 action->setText(_(
"&All in This List" ));
526 actionInstallSourceRpm =
createAction( _(
"&Install Source" ),
530 actionDontInstallSourceRpm =
createAction( _(
"Do &Not Install Source" ),
534 actionInstallListSourceRpms =
createAction( _(
"&Install All Available Sources" ),
540 actionDontInstallListSourceRpms =
createAction( _(
"Do &Not Install Any Sources" ),
546 connect( actionInstallSourceRpm, SIGNAL( activated() ),
this, SLOT( setInstallCurrentSourceRpm() ) );
547 connect( actionDontInstallSourceRpm, SIGNAL( activated() ),
this, SLOT( setDontInstallCurrentSourceRpm() ) );
549 connect( actionInstallListSourceRpms, SIGNAL( activated() ),
this, SLOT( setInstallListSourceRpms() ) );
550 connect( actionDontInstallListSourceRpms, SIGNAL( activated() ),
this, SLOT( setDontInstallListSourceRpms() ) );
563 actionInstallSourceRpm->setEnabled( item->
hasSourceRpm() );
564 actionDontInstallSourceRpm->setEnabled( item->
hasSourceRpm() );
568 actionInstallSourceRpm->setEnabled(
false );
569 actionDontInstallSourceRpm->setEnabled(
false );
577 QString filename = YQApplication::askForSaveFileName(
"pkglist.txt",
579 _(
"Export Package List" ) );
580 if ( ! filename.isEmpty() )
590 QFile file(filename);
591 file.open(QIODevice::WriteOnly);
593 if ( file.error() != QFile::NoError )
595 yuiError() <<
"Can't open file " << filename << std::endl;
601 QMessageBox::warning( 0,
603 _(
"Cannot open file %1" ).arg( filename ),
604 QMessageBox::Ok | QMessageBox::Default,
605 QMessageBox::NoButton,
606 QMessageBox::NoButton );
621 header.sprintf(
"# %-18s %-30s | %-40s | %-25s | %10s\n\n",
622 (
const char *) _(
"Status" ).toUtf8(),
623 (
const char *) _(
"Package" ).toUtf8(),
624 (
const char *) _(
"Summary" ).toUtf8(),
625 (
const char *) _(
"Installed (Available)" ).toUtf8(),
626 (
const char *) _(
"Size" ).toUtf8()
628 file.write(header.toUtf8());
633 QTreeWidgetItemIterator it((QTreeWidget*)
this);
637 const QTreeWidgetItem* item(*it);
642 QString version = pkg->text( versionCol() );
643 if ( version.isEmpty() ) version =
"---";
645 QString summary = pkg->text( summaryCol() );
646 if ( summary.isEmpty() ) summary =
"---";
647 if ( summary.size() > 40 )
649 summary.truncate(40-3);
655 format.sprintf(
"%-20s %-30s | %-40s | %-25s | %10s\n",
656 (
const char*) status.toUtf8(),
657 (
const char*) pkg->text( nameCol() ).toUtf8(),
658 (
const char*) summary.toUtf8(),
659 (
const char*) version.toUtf8(),
660 (
const char*) pkg->text( sizeCol() ).toUtf8()
662 file.write(format.toUtf8());
677 YQUI::ui()->busyCursor();
678 int changedCount = 0;
680 for ( ZyppPoolIterator it = zyppPkgBegin();
684 ZyppSel selectable = *it;
685 ZyppStatus oldStatus = selectable->status();
687 if ( newStatus != oldStatus )
689 bool doChange =
false;
693 case S_KeepInstalled:
697 doChange = !selectable->installedEmpty();
705 doChange = !selectable->installedEmpty();
709 const ZyppObj candidate = selectable->candidateObj();
710 const ZyppObj installed = selectable->installedObj();
712 if ( candidate && installed )
714 doChange = ( installed->edition() < candidate->edition() );
723 doChange = selectable->installedEmpty();
729 if ( ! countOnly && oldStatus != S_Protected )
730 selectable->setStatus( newStatus );
738 if ( changedCount > 0 && ! countOnly )
740 emit updateItemStates();
745 YQUI::ui()->normalCursor();
759 , _pkgList( pkgList )
760 , _zyppPkg( zyppPkg )
764 _zyppPkg = tryCastToZyppPkg( selectable->theObj() );
768 setTextAlignment( sizeCol(), Qt::AlignRight );
820 if ( srpmStatusCol() < 0 )
831 YQIconPool::pkgInstall() :
832 YQIconPool::pkgNoInst();
837 YQIconPool::disabledPkgInstall() :
838 YQIconPool::disabledPkgNoInst();
841 setData( srpmStatusCol(), Qt::DecorationRole, icon );
852 selectable()->set_source_install( installSourceRpm );
871 QString name = _zyppObj->name().c_str();
873 if ( col == statusCol() )
877 else if ( col == srpmStatusCol() )
879 text = name +
"\n\n";
884 _(
"Install Sources" ) :
885 _(
"Do Not Install Sources" );
889 text += _(
"No Sources Available" );
894 text = name +
"\n\n";
901 installed =
selectable()->installedObj()->edition().asString().c_str();
903 installed +=
selectable()->installedObj()->arch().asString().c_str();
904 installed = _(
"Installed Version: %1" ).arg( installed );
909 candidate =
selectable()->candidateObj()->edition().asString().c_str();
911 candidate +=
selectable()->candidateObj()->arch().asString().c_str();
916 text += installed +
"\n";
922 QString relation = _(
"same" );
924 if ( _candidateIsNewer ) relation = _(
"newer" );
925 if ( _installedIsNewer ) relation = _(
"older" );
928 text += _(
"Available Version: %1 (%2)" ).arg( candidate ).arg( relation );
932 text += _(
"Not available for installation" );
950 int col = treeWidget()->sortColumn();
951 if ( col == srpmStatusCol() )
959 return ( thisPoints < otherPoints );
969 YQPkgListItem::paintCell( QPainter * painter,
970 const QColorGroup & colorGroup,
976 if (
isDimmed() && ! YQUI::ui()->usingVisionImpairedPalette() )
978 QColorGroup cg = colorGroup;
979 cg.setColor( QColorGroup::Text, QColor( 0xA0, 0xA0, 0xA0 ) );
981 QTreeWidgetItem::paintCell( painter, cg, column, width, alignment );
987 QColorGroup cg = colorGroup;
989 if ( ! YQUI::ui()->usingVisionImpairedPalette() )
991 if ( column == instVersionCol() )
992 cg.setColor( QColorGroup::Base, QColor( 0xFF, 0x30, 0x30 ) );
994 cg.setColor( QColorGroup::Text, QColor( 0xFF, 0, 0 ) );
997 QTreeWidgetItem::paintCell( painter, cg, column, width, alignment );
1001 QColorGroup cg = colorGroup;
1003 if ( ! YQUI::ui()->usingVisionImpairedPalette() )
1005 cg.setColor( QColorGroup::Text, QColor( 0, 0, 0xC0 ) );
1007 if ( column == versionCol() )
1008 cg.setColor( QColorGroup::Base, QColor( 0xF0, 0xF0, 0xF0 ) );
1011 QTreeWidgetItem::paintCell( painter, cg, column, width, alignment );
1015 QTreeWidgetItem::paintCell( painter, colorGroup, column, width, alignment );
1023 #include "YQPkgList.moc"
ZyppSel selectable() const
Abstract base class to display a list of zypp::ResObjects. Handles most generic stuff like setting st...
void addPkgItem(ZyppSel selectable, ZyppPkg zyppPkg)
int globalSetPkgStatus(ZyppStatus newStatus, bool force, bool countOnly)
void toggleSourceRpmStatus()
virtual QPixmap statusIcon(ZyppStatus status, bool enabled=true, bool bySelection=false)
virtual void createInstalledContextMenu()
void resetOptimalColumnWidthValues()
virtual void pkgObjClicked(int button, QTreeWidgetItem *item, int col, const QPoint &pos)
virtual bool operator<(const QTreeWidgetItem &other) const
YQPkgListItem(YQPkgList *pkgList, ZyppSel selectable, ZyppPkg zyppPkg)
virtual void updateActions(YQPkgObjListItem *item)
static bool haveInstalledPkgs()
bool candidateIsNewer() const
virtual void updateData()
void optimizeColumnWidths()
void addPkgItemDimmed(ZyppSel selectable, ZyppPkg zyppPkg)
QAction * createAction(ZyppStatus status, const QString &key=QString::null, bool enabled=false)
virtual void pkgObjClicked(int button, QTreeWidgetItem *item, int col, const QPoint &pos)
virtual void updateActions(YQPkgObjListItem *item=0)
bool hasSourceRpm() const
virtual QSize sizeHint() const
virtual bool operator<(const QTreeWidgetItem &other) const
Display a list of zypp::Package objects.
virtual void updateData()
virtual void createNotInstalledContextMenu()
YQPkgList(QWidget *parent)
void exportList(const QString filename, bool interactive) const
void setDimmed(bool d=true)
virtual QString statusText(ZyppStatus status) const
void askExportList() const
virtual QString toolTip(int column)
void updateOptimalColumnWidthValues(ZyppSel selectable, ZyppPkg zyppPkg)
virtual QMenu * addAllInListSubMenu(QMenu *menu)
bool installedIsNewer() const
void setInstallSourceRpm(bool installSourceRpm)
virtual QString toolTip(int column)
void createSourceRpmContextMenu()
bool installSourceRpm() const
virtual ZyppStatus status() const
void resizeEvent(QResizeEvent *event)