2 This file is part of Faster Application Manager.
4 Faster Application Manager is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 Faster Application Manager is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with Faster Application Manager. If not, see <http://www.gnu.org/licenses/>.
17 (C) Heikki Holstila 2010
20 #include "packageview.h"
21 #include "ui_packageview.h"
23 #include "filterselect.h"
24 #include "confirmdialog.h"
26 #include "packageselector.h"
28 #include "aaptinterface.h"
30 #include "sortselector.h"
32 #include "searchoptions.h"
33 #include "blacklistselect.h"
35 PackageListWidgetItem::PackageListWidgetItem(Package* p_, QString name_) : QListWidgetItem(name_)
41 void ListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
46 QString name = index.data(UserRoleName).toString();
47 QString version = index.data(UserRoleVersion).toString();
48 QString desc = index.data(UserRoleDescShort).toString();
49 Package::operation marked = (Package::operation) index.data(UserRoleMarked).toInt();
50 bool installed = index.data(UserRoleInstalled).toBool();
51 bool upgradeable = index.data(UserRoleUpgradeable).toBool();
52 int statfilter = index.data(UserRoleCurrentStatFilter).toInt();
53 int catfilter = index.data(UserRoleCurrentCatFilter).toInt();
54 QString upg_version = index.data(UserRoleAvailVersion).toString();
55 BlacklistSelect::blackList blacklisted = (BlacklistSelect::blackList) index.data(UserRoleBlacklisted).toInt();
58 QRect r = option.rect;
60 QLinearGradient gradientBase(r.topLeft(), r.bottomLeft());
61 QColor base = option.palette.color(QPalette::Window);
64 int g1=base.green()+15;
65 int b1=base.blue()+15;
69 int r2=base2.red()-20;
70 int g2=base2.green()-20;
71 int b2=base2.blue()-20;
75 base.setRgb( r1, g1, b1 );
76 base2.setRgb( r2, g2, b2 );
77 gradientBase.setColorAt(0, base);
78 gradientBase.setColorAt(1, base2);
80 painter->fillRect(r, gradientBase);
81 painter->drawLine(QPoint(r.left(),r.bottom()), QPoint(r.right(),r.bottom()));
83 QPixmap icon = index.data(Qt::DecorationRole).value<QPixmap>();
86 painter->drawPixmap( r.left(), r.top()+4, 48, 48, iDefaultIcon );
88 painter->drawPixmap( r.left(), r.top()+4, 48, 48, icon );
92 if( marked == Package::PkgOpNone )
94 if( installed && upgradeable )
95 statusicon = iIconPkgNoOpInstalledUpgradeable;
97 statusicon = iIconPkgNoOpInstalled;
99 statusicon = iIconPkgNoOpNotInstalled;
100 } else if( marked == Package::PkgOpInstallUpgrade ) {
102 statusicon = iIconPkgUpgrade;
104 statusicon = iIconPkgInstall;
105 } else if( marked == Package::PkgOpRemove ) {
106 statusicon = iIconPkgRemove;
109 QString showVer = "";
110 if( upgradeable && (statfilter==Package::PkgStatUpgradeable ||
111 (statfilter==Package::PkgStatUnknown && marked==Package::PkgOpInstallUpgrade) ||
112 (catfilter==PackageView::CatFilterAllMarked && marked==Package::PkgOpInstallUpgrade) ))
114 showVer = upg_version;
120 if( QApplication::desktop()->width() > QApplication::desktop()->height() )
123 r.setRight( r.right()-statusicon.width()-4 );
125 if( catfilter != PackageView::CatFilterBlacklisted ) {
126 painter->drawText(r, Qt::AlignTop|Qt::AlignRight, showVer, &r);
128 } else if( blacklisted==BlacklistSelect::BlacklistThis ) {
129 if( upgradeable && upg_version!="" ) {
130 showVer = upg_version;
134 painter->drawText(r, Qt::AlignTop|Qt::AlignRight, showVer, &r);
140 r.setRight( r.right()-statusicon.width()-4-ver_w ); //does not work as it should?
141 QFont f = painter->font();
144 painter->drawText(r.left()+iDefaultIcon.width()+2, r.top(), r.width(), r.height(), Qt::AlignTop|Qt::AlignLeft, name, &r);
148 f.setPointSize( f.pointSize()-4 );
151 painter->drawText(r.left()+iDefaultIcon.width()+2, r.top(), r.width(), r.height(), Qt::AlignBottom|Qt::AlignLeft, desc, &r);
154 painter->drawPixmap(r.right()-statusicon.width()-2, r.top()+4, 24, 24, statusicon);
158 //if( t.elapsed()>=100 )
159 //qDebug() << name << t.elapsed();
162 void ListItemDelegate::loadIcons()
164 iDefaultIcon = QPixmap(":/icons/icons/appdefault.png");
165 iIconPkgInstall = QPixmap(":/icons/icons/pkg_install.png");
166 iIconPkgUpgrade = QPixmap(":/icons/icons/pkg_upgrade.png");
167 iIconPkgRemove = QPixmap(":/icons/icons/pkg_remove.png");
168 iIconPkgNoOpInstalled = QPixmap(":/icons/icons/pkg_nop_installed.png");
169 iIconPkgNoOpNotInstalled = QPixmap(":/icons/icons/pkg_nop_notinstalled.png");
170 iIconPkgNoOpInstalledUpgradeable = QPixmap(":/icons/icons/pkg_nop_instupgr.png");
174 QSize ListItemDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex&) const
176 return QSize(400, 58);
180 PackageView::PackageView(QWidget *parent) : QMainWindow(parent), ui(new Ui::PackageView)
182 iMainWindow = dynamic_cast<MainWindow*>(parent);
185 this->setAttribute(Qt::WA_Maemo5StackedWindow);
186 this->setWindowFlags(Qt::Window);
187 this->setAttribute(Qt::WA_Maemo5AutoOrientation);
192 connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(orientationChanged()));
195 << tr("All marked packages") // a special case
196 << tr("All user categories")
201 << tr("\tInternet & Networking")
202 << tr("\tLocation & Navigation")
203 << tr("\tMultimedia")
206 << tr("\tProgramming")
210 << tr("All packages (ADVANCED)")
211 << tr("Blacklisted packages"); // a special case
225 << "user/development"
232 iDefaultCatFilter = CatFilterAllUser;
233 iSelectedCatFilter = iDefaultCatFilter;
237 << tr("Not installed")
241 iSelectedStatFilter = Package::PkgStatUnknown;
242 iSortOrder = SortAlpha;
244 iDimmer = new dimmer(this);
246 ui->searchBar->hide();
248 iListCoverLabel = new QLabel(ui->listWidget);
249 iListCoverLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
250 iListCoverLabel->setAlignment(Qt::AlignCenter);
252 iKeyFilter = new KeyEventGrabber(this);
253 ui->listWidget->installEventFilter(iKeyFilter);
255 iSortNoticeShown = false;
257 iSearchPkgName = true;
258 iSearchDisplayName = true;
259 iSearchDescShort = true;
260 iSearchDescLong = false;
262 // fine-tune kinetic scrolling parameters
263 QAbstractKineticScroller* listscroller = ui->listWidget->property("kineticScroller").value<QAbstractKineticScroller*>();
266 //qDebug() << listscroller->dragInertia() << listscroller->decelerationFactor()
267 // << listscroller->minimumVelocity() << listscroller->maximumVelocity();
268 listscroller->setDecelerationFactor(0.75); // default is 0.85
269 listscroller->setDragInertia(0.60); // default is 0.85
270 listscroller->setMaximumVelocity(1800); // default is 3500
272 // not good because it alse sets horizontal overshoot:
273 //listscroller->setOvershootPolicy( QAbstractKineticScroller::OvershootAlwaysOn );
277 PackageView::~PackageView()
279 delete iListCoverLabel;
285 void PackageView::orientationChanged()
287 ui->listWidget->scroll(1,1); // this causes all items to be repainted
288 iListCoverLabel->setGeometry( ui->listWidget->rect() );
291 void PackageView::resizeEvent(QResizeEvent* event)
293 iListCoverLabel->setGeometry( ui->listWidget->rect() );
294 QWidget::resizeEvent(event);
297 bool PackageView::doFilterCategory(Package* pkg)
299 if( pkg->section()=="user/hidden" && iSelectedStatFilter!=Package::PkgStatInstalled && iSelectedStatFilter!=Package::PkgStatUnknown )
301 if( pkg->section()=="user/hidden" && !pkg->isInstalled() )
304 Package* upg_pkg = pkg->availablePackage();
306 if( iSelectedStatFilter==Package::PkgStatUpgradeable && iSelectedCatFilter!=CatFilterBlacklisted &&
307 pkg->isUpgradeable() && upg_pkg && upg_pkg->isBlacklisted() )
310 if( pkg->isBlacklisted() || (upg_pkg && upg_pkg->isBlacklisted()) )
312 if( iSelectedCatFilter == CatFilterBlacklisted )
314 if( pkg->isInstalled() && (iSelectedStatFilter==Package::PkgStatInstalled || iSelectedStatFilter==Package::PkgStatUnknown) )
316 if( pkg->isBlacklisted() && iSelectedCatFilter != CatFilterBlacklisted )
318 } else if( !pkg->isBlacklisted() && iSelectedCatFilter == CatFilterBlacklisted )
321 if( iSelectedCatFilter==CatFilterAllMarked ) {
322 if( pkg->isMarkedForOperation() )
327 if( pkg->section().startsWith( iCatFilterStrings.at(iSelectedCatFilter) ) )
333 QString PackageView::generateSortString(Package* pkg)
337 if( iSortOrder==SortAlpha ) {
338 sortstr = pkg->displayName();
340 else if( iSortOrder==SortDateDesc ) {
342 if( pkg->isUpgradeable() )
343 upg = pkg->availablePackage();
345 if( (!upg && pkg->date().isValid()) || iSelectedStatFilter==Package::PkgStatInstalled )
346 sortstr = pkg->date().toString("yyyy-MM-dd hh:mm:ss");
347 else if( upg && upg->date().isValid() ) {
348 sortstr = upg->date().toString("yyyy-MM-dd hh:mm:ss");
351 iPackagesEmptySort++;
354 else if( iSortOrder==SortSizeDesc ) {
355 if( pkg->isInstalled() )
356 sortstr = QString("%1").arg(pkg->installedSize()*1024, 12 );
358 sortstr = QString("%1").arg(pkg->size(), 12 );
361 //qDebug() << sortstr;
366 void PackageView::openWin()
368 ui->listWidget->clear();
369 ui->listWidget->setSortingEnabled(true);
370 iPackagesEmptySort = 0;
373 iMainWindow->busyDialog(false);
374 iListCoverLabel->setText("Loading...");
375 iListCoverLabel->setAutoFillBackground(true);
376 iListCoverLabel->show();
378 QApplication::processEvents();
381 if( iSortOrder==SortDateDesc || iSortOrder==SortSizeDesc )
382 ui->listWidget->sortItems(Qt::DescendingOrder);
384 ui->listWidget->sortItems(Qt::AscendingOrder);
386 delete ui->listWidget->itemDelegate();
387 ListItemDelegate* delegate = new ListItemDelegate(ui->listWidget);
388 delegate->loadIcons();
389 ui->listWidget->setItemDelegate( delegate );
391 if( !ui->searchBar->isVisible() )
393 if( iSelectedStatFilter == Package::PkgStatNotInstalled || iSelectedStatFilter == Package::PkgStatUnknown ||
394 iSelectedCatFilter == CatFilterAllMarked || iSelectedCatFilter == CatFilterBlacklisted )
396 QHashIterator<QString, Package*> i( *iAptInterface->packagesAvailable() );
400 Package* inst = iAptInterface->packagesInstalled()->value(i.value()->name(),0);
401 if( doFilterCategory(i.value()) && !inst )
402 addListItem(i.value(), generateSortString(i.value()));
405 if( iSelectedStatFilter == Package::PkgStatInstalled || iSelectedStatFilter == Package::PkgStatUpgradeable ||
406 iSelectedStatFilter == Package::PkgStatUnknown || iSelectedCatFilter == CatFilterAllMarked ||
407 iSelectedCatFilter == CatFilterBlacklisted )
409 QHashIterator<QString, Package*> i( *iAptInterface->packagesInstalled() );
413 if( iSelectedStatFilter == Package::PkgStatUpgradeable && iSelectedCatFilter != CatFilterBlacklisted ) {
414 if( i.value()->isUpgradeable() && doFilterCategory(i.value()) )
415 addListItem(i.value(), generateSortString(i.value()));
417 if( doFilterCategory(i.value()) )
418 addListItem(i.value(), generateSortString(i.value()));
423 for( int j=0; j<iSearchResults.count(); j++ )
425 addListItem(iSearchResults.at(j), generateSortString( iSearchResults.at(j) ));
429 iListCoverLabel->hide();
430 iListCoverLabel->setAutoFillBackground(false);
434 if( iSelectedStatFilter==Package::PkgStatUpgradeable && ui->listWidget->count()>0 &&
435 iSelectedCatFilter != CatFilterAllMarked && iSelectedCatFilter != CatFilterBlacklisted )
437 ui->actionUpgrade_all->setVisible(true);
439 ui->actionUpgrade_all->setVisible(false);
442 if( iSelectedCatFilter == CatFilterBlacklisted && ui->listWidget->count()>0 ) {
443 ui->actionRestore_all->setVisible(true);
445 ui->actionRestore_all->setVisible(false);
450 if( !ui->searchBar->isVisible() ) {
451 ui->listWidget->setFocusPolicy(Qt::StrongFocus);
452 ui->listWidget->setFocus();
454 ui->listWidget->setFocusPolicy(Qt::NoFocus);
455 ui->lineEdit->setFocus();
458 if( ui->listWidget->count() == 0 )
460 iListCoverLabel->setGeometry( ui->listWidget->rect() );
461 iListCoverLabel->setText("No packages");
462 iListCoverLabel->show();
465 if( ui->listWidget->count()>1 && iPackagesEmptySort == ui->listWidget->count() && !iSortNoticeShown ) {
466 ConfirmDialog d(false, this);
467 QString msg = "No shown packages currently have the required information for sorting by this criterion. The list is unsorted.";
468 if( iSortOrder == SortDateDesc && !iSettings->qsettings()->value("fetch_dates",false).toBool() )
469 msg += " You can enable date fetching in the options menu.";
470 d.setText("Notice", msg);
472 iSortNoticeShown = true;
476 void PackageView::enableMenu()
478 ui->menuMenu->setEnabled(true);
481 void PackageView::disableMenu()
483 ui->menuMenu->setEnabled(false);
486 void PackageView::addListItem(Package* pkg_, QString listname_)
488 PackageListWidgetItem* p = new PackageListWidgetItem( pkg_, listname_ );
492 QString name = pkg_->name();
493 if( pkg_->maemoDisplayName()!="" )
494 name = pkg_->maemoDisplayName();
495 p->setData(UserRoleName, name);
497 p->setData(UserRoleName, listname_);
502 p->setData(UserRoleDescShort, pkg_->descShort());
503 p->setData(UserRoleVersion, pkg_->version());
504 p->setData(UserRoleMarked, (int)pkg_->markedOperation());
505 p->setData(UserRoleInstalled, pkg_->isInstalled());
506 p->setData(UserRoleUpgradeable, pkg_->isUpgradeable());
507 p->setData(UserRoleAvailVersion, pkg_->upgradeableVersion());
508 p->setData(UserRoleCurrentStatFilter, iSelectedStatFilter);
509 p->setData(UserRoleCurrentCatFilter, iSelectedCatFilter);
511 if( pkg_->availablePackage() )
512 p->setData(UserRoleBlacklisted, (int)pkg_->availablePackage()->blacklisted());
514 p->setData(UserRoleBlacklisted, (int)pkg_->blacklisted());
516 //qDebug()<<pkg_->name();
519 p->setData(Qt::DecorationRole, *pkg_->icon());
521 ui->listWidget->addItem( p );
524 void PackageView::closeEvent(QCloseEvent *event)
526 if( !iAptInterface ) {
531 if( iDimmer->busy() )
533 iAptInterface->cancel();
539 if( iAptInterface->numSelectedPackages() == 0 )
545 c.setNum( iAptInterface->numSelectedPackages() );
546 ConfirmDialog d(true, this);
547 d.setText("Returning to main menu", QString("Clear %1 package selection(s) and lose all the pending changes?").arg(iAptInterface->numSelectedPackages()));
555 #else // for simulator
561 void PackageView::changeEvent(QEvent *e)
563 QMainWindow::changeEvent(e);
565 case QEvent::LanguageChange:
566 ui->retranslateUi(this);
573 void PackageView::on_btn_Commit_clicked()
575 QStringList pkgnames;
577 QHashIterator<QString, Package*> i( *iAptInterface->packagesAvailable() );
582 if( i.value()->markedOperation() == Package::PkgOpInstallUpgrade )
583 pkgnames << i.value()->name();
584 if( i.value()->markedOperation() == Package::PkgOpRemove ) {
585 qDebug() << "warning: trying to add package marked from the wrong list";
586 //pkgnames << i.value()->name() + "-";
590 QHashIterator<QString, Package*> r( *iAptInterface->packagesInstalled() );
595 if( r.value()->markedOperation() == Package::PkgOpInstallUpgrade )
596 pkgnames << r.value()->name();
597 if( r.value()->markedOperation() == Package::PkgOpRemove )
598 pkgnames << r.value()->name() + "-";
601 iMainWindow->busyDialog(true, "Operation in progress", "Reading dependencies");
603 iAptInterface->setProcessPackages(pkgnames);
604 iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetSimulate);
605 iAptInterface->run(iDimmer);
608 void PackageView::on_actionClear_selections_triggered()
611 c.setNum( iAptInterface->numSelectedPackages() );
612 ConfirmDialog d(true, this);
613 d.setText(tr("Confirmation"), tr("Clear ") + c + tr(" package selection(s) and lose all the pending changes?"));
621 void PackageView::clearSelections()
623 QHashIterator<QString, Package*> i( *iAptInterface->packagesInstalled() );
627 i.value()->setMarkedForOperation(Package::PkgOpNone);
629 QHashIterator<QString, Package*> a( *iAptInterface->packagesAvailable() );
633 a.value()->setMarkedForOperation(Package::PkgOpNone);
635 iAptInterface->setNumSelectedPackages(0);
638 void PackageView::on_listWidget_itemClicked(QListWidgetItem* item)
640 Package* pkg = dynamic_cast<PackageListWidgetItem*>(item)->package();
644 bool bl = pkg->isBlacklisted();
647 Package* upg_pkg = pkg->availablePackage();
649 bl_u = upg_pkg->isBlacklisted();
651 PackageSelector s(pkg, iAptInterface, iSettings, this);
653 Package::operation op = s.selectedOperation();
655 QStringList confl = pkg->checkConflicts_RichText();
656 if( confl.count() > 0 && op != Package::PkgOpNone ) {
657 ConfirmDialog d(true, this);
658 QString t = "Package " + pkg->name() + " conflicts with another installed or marked package. Mark anyway?";
659 t += "<font size=\"-1\"><br><br>Conflicts: ";
660 t += confl.join(", ");
662 d.setText("Conflicting packages", t);
664 op = Package::PkgOpNone;
667 pkg->setMarkedForOperation( op );
668 item->setData( UserRoleMarked, (int)op );
671 if( pkg->isBlacklisted() != bl ) {
674 else if( upg_pkg && upg_pkg->isBlacklisted() != bl_u ) {
679 void PackageView::updateLabel()
682 s.setNum( iAptInterface->numSelectedPackages() );
684 s2.setNum( ui->listWidget->count() );
685 QString statlabel = iStatFilterLabels.at(iSelectedStatFilter);
686 if( iSelectedCatFilter == CatFilterAllMarked || iSelectedCatFilter == CatFilterBlacklisted )
688 ui->label->setText("<font size=\"-2\"><b>" + s + "</b> package(s) marked<br>"
689 + "Showing: <b>" + statlabel + "</b><br>"
690 + "Filter: " + iCatFilterLabels.at(iSelectedCatFilter) + " - " + s2 + " package(s)</font>");
692 if( iAptInterface->numSelectedPackages()==0 ) {
693 ui->btn_Commit->setEnabled(false);
694 ui->actionClear_selections->setVisible(false);
695 ui->actionSave_selections->setVisible(false);
697 ui->btn_Commit->setEnabled(true);
698 ui->actionClear_selections->setVisible(true);
699 ui->actionSave_selections->setVisible(true);
703 void PackageView::on_btn_CategoryFilter_clicked()
705 FilterSelect f("Category filter", this);
706 f.setList( iCatFilterLabels, iSelectedCatFilter );
711 iSelectedCatFilter = f.selection();
713 if( iSelectedCatFilter == CatFilterAllMarked || iSelectedCatFilter == CatFilterBlacklisted ) {
714 ui->btn_StatusFilter->setEnabled(false);
716 ui->btn_StatusFilter->setEnabled(true);
720 iListCoverLabel->setText("Loading...");
721 iListCoverLabel->setAutoFillBackground(true);
722 iListCoverLabel->show();
723 QApplication::processEvents();
724 iSortNoticeShown = false;
730 void PackageView::setStatFilter(Package::packageStatus f_)
732 iSelectedStatFilter = f_;
735 void PackageView::on_btn_StatusFilter_clicked()
737 FilterSelect f("Status filter", this);
738 f.setList( iStatFilterLabels, iSelectedStatFilter );
740 int oldfilter = iSelectedStatFilter;
745 iSelectedStatFilter = (Package::packageStatus)f.selection();
747 iListCoverLabel->setText("Loading...");
748 iListCoverLabel->setAutoFillBackground(true);
749 iListCoverLabel->show();
750 QApplication::processEvents();
751 iSortNoticeShown = false;
755 if( oldfilter==Package::PkgStatInstalled && iSelectedStatFilter!=Package::PkgStatInstalled &&
756 iAptInterface->needListOrDateRefresh() )
758 iMainWindow->setNextOperation(MainWindow::OpOpenPkgView);
759 iMainWindow->busyDialog(true,"Operation in progress","Reading the rest of the package lists");
761 if( iAptInterface->needRepoRefresh() && !iSettings->qsettings()->value("no_catalogs_autoupdate",false).toBool() )
762 iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate);
764 iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages);
765 iAptInterface->addQueuedOperation(AAptInterface::ModeFetchDates);
766 iAptInterface->run(iDimmer);
771 void PackageView::resetWindow()
773 iAptInterface->writeBlacklist();
775 ui->btn_StatusFilter->setEnabled(true);
776 //iSelectedCatFilter = iDefaultCatFilter;
777 //iSortOrder = SortAlpha;
778 iSortNoticeShown = false;
784 void PackageView::on_actionHelp_triggered()
790 void PackageView::on_btn_searchClose_clicked()
794 iListCoverLabel->setText("Loading...");
795 iListCoverLabel->setAutoFillBackground(true);
796 iListCoverLabel->show();
797 QApplication::processEvents();
802 void PackageView::clearSearch()
804 ui->lineEdit->clear();
805 ui->searchBar->hide();
807 ui->listWidget->setFocusPolicy(Qt::StrongFocus);
809 iSearchResults.clear();
812 void PackageView::on_actionSearch_triggered()
814 if( ui->searchBar->isVisible() )
817 ui->listWidget->setFocusPolicy(Qt::NoFocus);
818 ui->searchLabel->setText( QString("%1 results").arg(ui->listWidget->count()) );
820 ui->searchBar->show();
821 ui->lineEdit->setFocus();
822 iPrevSearchText = "";
825 void PackageView::on_lineEdit_textEdited(QString text)
827 if( !ui->searchBar->isVisible() )
831 on_btn_searchClose_clicked();
835 if( iPrevSearchText.length() > text.length() )
837 iListCoverLabel->setText("Loading...");
838 iListCoverLabel->setAutoFillBackground(true);
839 iListCoverLabel->show();
840 QApplication::processEvents();
842 ui->searchBar->hide();
844 ui->searchBar->show();
845 ui->toolBar->hide(); // ensure it stays hidden
846 ui->lineEdit->setFocus();
849 iPrevSearchText = text;
851 QList<Package*> packages;
852 iSearchResults.clear();
854 for( int i=0; i<(ui->listWidget->count()); i++ ) {
855 packages.append( dynamic_cast<PackageListWidgetItem*>( ui->listWidget->item(i) )->package() );
858 if( text.startsWith(":") ) {
859 for( int i=0; i<packages.count(); i++ ) {
860 if( packages.at(i) ) {
861 if( (iSearchPkgName && packages.at(i)->name().startsWith(text.mid(1), Qt::CaseInsensitive)) ||
862 (iSearchDisplayName && packages.at(i)->displayName().startsWith(text.mid(1), Qt::CaseInsensitive)) ||
863 (iSearchDescShort && packages.at(i)->descShort().startsWith(text.mid(1), Qt::CaseInsensitive)) ||
864 (iSearchDescLong && packages.at(i)->descLong().startsWith(text.mid(1), Qt::CaseInsensitive)) )
866 iSearchResults.append( packages.at(i) );
871 for( int i=0; i<packages.count(); i++ ) {
872 if( packages.at(i) ) {
873 if( (iSearchPkgName && packages.at(i)->name().contains(text, Qt::CaseInsensitive)) ||
874 (iSearchDisplayName && packages.at(i)->displayName().contains(text, Qt::CaseInsensitive)) ||
875 (iSearchDescShort && packages.at(i)->descShort().contains(text, Qt::CaseInsensitive)) ||
876 (iSearchDescLong && packages.at(i)->descLong().contains(text, Qt::CaseInsensitive)) )
878 iSearchResults.append( packages.at(i) );
884 ui->searchLabel->setText( QString("%1 results").arg( iSearchResults.count()) );
889 void PackageView::setSearchText(QString text)
891 ui->lineEdit->setText(text);
892 on_lineEdit_textEdited(text);
895 KeyEventGrabber::KeyEventGrabber(QObject* parent) : QObject(parent)
899 bool KeyEventGrabber::eventFilter(QObject *obj, QEvent *event)
901 if( event->type() == QEvent::KeyPress ) {
902 QString text = dynamic_cast<QKeyEvent*>(event)->text();
903 int key = dynamic_cast<QKeyEvent*>(event)->key();
904 if( (text.trimmed() != "" || text==" ") && key!=Qt::Key_Backspace ) {
905 dynamic_cast<PackageView*>(this->parent())->on_actionSearch_triggered();
906 dynamic_cast<PackageView*>(this->parent())->setSearchText( text );
910 return QObject::eventFilter(obj, event);
913 void PackageView::on_pushButton_searchOptions_clicked()
915 SearchOptions s(this);
916 s.setSelections(iSearchPkgName, iSearchDisplayName, iSearchDescShort, iSearchDescLong);
919 iSearchPkgName = s.searchPkgName();
920 iSearchDisplayName = s.searchDisplayName();
921 iSearchDescShort = s.searchDescShort();
922 iSearchDescLong = s.searchDescLong();
924 iPrevSearchText += " ";
925 on_lineEdit_textEdited( ui->lineEdit->text() );
929 void PackageView::setSearchOptions(bool pkgname, bool dispname, bool dshort, bool dlong)
931 iSearchPkgName = pkgname;
932 iSearchDisplayName = dispname;
933 iSearchDescShort = dshort;
934 iSearchDescLong = dlong;
937 void PackageView::on_actionUpgrade_all_triggered()
939 for( int i=0; i<ui->listWidget->count(); i++ )
941 Package* pkg = dynamic_cast<PackageListWidgetItem*>(ui->listWidget->item(i))->package();
942 if( pkg && pkg->isUpgradeable() ) {
943 pkg->setMarkedForOperation( Package::PkgOpInstallUpgrade );
944 ui->listWidget->item(i)->setData(UserRoleMarked, (int)Package::PkgOpInstallUpgrade);
950 void PackageView::on_actionView_log_triggered()
952 QByteArray log = iAptInterface->readLogFile();
953 LogView l(log, this);
957 void PackageView::on_btn_Sort_clicked()
959 SortSelector s(iSortOrder, this);
961 iSortOrder = s.selectedOperation();
962 iSortNoticeShown = false;
967 void PackageView::on_actionLoad_selections_triggered()
969 if( iAptInterface->numSelectedPackages() > 0 ) {
970 ConfirmDialog d(true, this);
971 d.setText("Confirmation", "Proceed loading selections? All current selections will be cleared.");
978 QStringList unknownList;
979 QStringList wrongverList;
983 QFile f("/root/.fapman/selections.list");
984 if( f.open(QIODevice::ReadOnly | QIODevice::Text ) )
987 QString line = f.readLine().trimmed();
988 QStringList parts = line.split(' ');
989 if( parts.count()==3 ) {
990 Package* pkgAv = iAptInterface->packagesAvailable()->value(parts.at(0),0);
991 Package* pkgIn = iAptInterface->packagesInstalled()->value(parts.at(0),0);
992 if( parts.at(2)=="install" ) {
993 if( !pkgAv && !pkgIn ) {
994 unknownList << parts.at(0);
997 wrongverList << parts.at(0);
1000 if( pkgAv->version() == parts.at(1) && !pkgAv->isInstalled() ) {
1001 pkgAv->setMarkedForOperation(Package::PkgOpInstallUpgrade);
1004 wrongverList << parts.at(0);
1008 } else if( parts.at(2)=="upgrade" ) {
1009 if( !pkgAv && !pkgIn ) {
1010 unknownList << parts.at(0);
1012 else if( (pkgAv && !pkgIn) || (pkgIn && !pkgAv) ) {
1013 wrongverList << parts.at(0);
1015 else if( pkgIn && pkgAv ) {
1016 if( pkgIn->version() == parts.at(1) && pkgIn->isInstalled() && pkgIn->isUpgradeable() ) {
1017 pkgIn->setMarkedForOperation(Package::PkgOpInstallUpgrade);
1020 wrongverList << parts.at(0);
1024 } else if( parts.at(2)=="remove" ) {
1025 if( !pkgAv && !pkgIn ) {
1026 unknownList << parts.at(0);
1028 else if( pkgAv && !pkgIn ) {
1029 wrongverList << parts.at(0);
1032 if( pkgIn->version() == parts.at(1) && pkgIn->isInstalled() ) {
1033 pkgIn->setMarkedForOperation(Package::PkgOpRemove);
1036 wrongverList << parts.at(0);
1042 } else if( line!="" ){
1049 ConfirmDialog d(false, this);
1051 msg += QString("<b>%1 successful</b><br>").arg(success);
1052 if( wrongverList.count() > 0 ) {
1053 msg += QString("%1 wrong versions/changed statuses (not selected):<br>").arg(wrongverList.count());
1054 msg += "<font size=\"-1\">";
1055 for( int i=0; i<wrongverList.count(); i++ ) {
1056 msg += wrongverList.at(i) + " ";
1058 msg += "</font><br>";
1060 if( unknownList.count() > 0 ) {
1061 msg += QString("%1 unknown packages:<br>").arg(unknownList.count());
1062 msg += "<font size=\"-1\">";
1063 for( int i=0; i<unknownList.count(); i++ ) {
1064 msg += unknownList.at(i) + " ";
1066 msg += "</font><br>";
1068 if( errors>0 || (wrongverList.count()==0 && unknownList.count()==0) ) {
1069 msg += QString("%1 errors<br>").arg(errors);
1071 if( success==0 && wrongverList.count()==0 && unknownList.count()==0 )
1072 msg = "No stored selections";
1075 title = "Selections loaded";
1077 title = "No selections loaded";
1078 d.setText(title, msg);
1082 ui->btn_StatusFilter->setEnabled(false);
1083 iSelectedCatFilter = CatFilterAllMarked;
1088 void PackageView::on_actionSave_selections_triggered()
1090 if( iAptInterface->numSelectedPackages() == 0 )
1093 QFile f("/root/.fapman/selections.list");
1096 if( f.open(QIODevice::WriteOnly | QIODevice::Text) )
1098 QTextStream out(&f);
1100 QHashIterator<QString, Package*> i( *iAptInterface->packagesAvailable() );
1105 if( i.value()->markedOperation() == Package::PkgOpInstallUpgrade ) {
1106 out << i.value()->name() << " " << i.value()->version() << " install\n";
1109 if( i.value()->markedOperation() == Package::PkgOpRemove )
1110 qDebug() << "Warning: package is marked for removal in the wrong list";
1113 QHashIterator<QString, Package*> r( *iAptInterface->packagesInstalled() );
1118 if( r.value()->markedOperation() == Package::PkgOpInstallUpgrade ) {
1119 out << r.value()->name() << " " << r.value()->version() << " upgrade\n";
1122 if( r.value()->markedOperation() == Package::PkgOpRemove ) {
1123 out << r.value()->name() << " " << r.value()->version() << " remove\n";
1133 ConfirmDialog d(false, this);
1135 d.setText( "Error", "Failed to write package selections" );
1137 d.setText( "Selections stored", QString("Stored %1 selections").arg(count) );
1141 void PackageView::on_actionRestore_all_triggered()
1143 ConfirmDialog d(true, this);
1144 d.setText("Confirmation","Restore all shown blacklisted packages?");
1148 for( int i=0; i<ui->listWidget->count(); i++ )
1150 Package* pkg = dynamic_cast<PackageListWidgetItem*>(ui->listWidget->item(i))->package();
1151 Package* p1 = iAptInterface->packagesInstalled()->value(pkg->name(),0);
1152 Package* p2 = iAptInterface->packagesAvailable()->value(pkg->name(),0);
1153 if( p1 && p1->isBlacklisted() ) {
1154 BlacklistSelect::blackList old = p1->blacklisted();
1155 p1->setBlacklisted(BlacklistSelect::BlacklistNone);
1156 iAptInterface->removeFromBlacklist(p1, old);
1158 if( p2 && p2->isBlacklisted() ) {
1159 BlacklistSelect::blackList old = p2->blacklisted();
1160 p2->setBlacklisted(BlacklistSelect::BlacklistNone);
1161 iAptInterface->removeFromBlacklist(p2, old);
1164 iAptInterface->writeBlacklist();