added app list backup, helper shell scripts
[fapman] / packageview.cpp
index c0fe01b..8b78bc0 100644 (file)
@@ -52,7 +52,7 @@ void ListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti
        int statfilter = index.data(UserRoleCurrentStatFilter).toInt();
        int catfilter = index.data(UserRoleCurrentCatFilter).toInt();
        QString upg_version = index.data(UserRoleAvailVersion).toString();
-       BlacklistSelect::blackList blacklisted = (BlacklistSelect::blackList) index.data(UserRoleBlacklisted).toInt();
+       BlacklistSelect::blackList blacklisted = static_cast<BlacklistSelect::blackList>( index.data(UserRoleBlacklisted).toInt() );
 
        painter->save();
        QRect r = option.rect;
@@ -106,7 +106,7 @@ void ListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti
                statusicon = iIconPkgRemove;
        }
 
-       QString showVer = "";
+       QString showVer;
        if( upgradeable && (statfilter==Package::PkgStatUpgradeable ||
                                                (statfilter==Package::PkgStatUnknown && marked==Package::PkgOpInstallUpgrade) ||
                                                (catfilter==PackageView::CatFilterAllMarked && marked==Package::PkgOpInstallUpgrade) ))
@@ -126,7 +126,7 @@ void ListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti
                        painter->drawText(r, Qt::AlignTop|Qt::AlignRight, showVer, &r);
                        ver_w = r.width();
                } else if( blacklisted==BlacklistSelect::BlacklistThis ) {
-                       if( upgradeable && upg_version!="" ) {
+                       if( upgradeable && !upg_version.isEmpty() ) {
                                showVer = upg_version;
                        } else {
                                showVer = version;
@@ -260,6 +260,7 @@ PackageView::PackageView(QWidget *parent) : QMainWindow(parent), ui(new Ui::Pack
        iSearchDescLong = false;
 
        // fine-tune kinetic scrolling parameters
+#ifdef Q_WS_MAEMO_5
        QAbstractKineticScroller* listscroller = ui->listWidget->property("kineticScroller").value<QAbstractKineticScroller*>();
        if( listscroller )
        {
@@ -272,14 +273,15 @@ PackageView::PackageView(QWidget *parent) : QMainWindow(parent), ui(new Ui::Pack
                // not good because it alse sets horizontal overshoot:
                //listscroller->setOvershootPolicy( QAbstractKineticScroller::OvershootAlwaysOn );
        }
+#endif
 }
 
 PackageView::~PackageView()
 {
-       delete iListCoverLabel;
-       delete iKeyFilter;
-       delete iDimmer;
-    delete ui;
+       delete iListCoverLabel; iListCoverLabel=0;
+       delete iKeyFilter; iKeyFilter=0;
+       delete iDimmer; iDimmer=0;
+       delete ui; ui=0;
 }
 
 void PackageView::orientationChanged()
@@ -290,6 +292,10 @@ void PackageView::orientationChanged()
 
 void PackageView::resizeEvent(QResizeEvent* event)
 {
+       if( iDimmer ) {
+               iDimmer->resize( this->size() );
+       }
+
        iListCoverLabel->setGeometry( ui->listWidget->rect() );
        QWidget::resizeEvent(event);
 }
@@ -445,6 +451,12 @@ void PackageView::openWin()
                ui->actionRestore_all->setVisible(false);
        }
 
+       if( iSelectedStatFilter==Package::PkgStatInstalled ) {
+               ui->actionStore_list->setVisible(true);
+       } else {
+               ui->actionStore_list->setVisible(false);
+       }
+
        show();
 
        if( !ui->searchBar->isVisible() ) {
@@ -490,7 +502,7 @@ void PackageView::addListItem(Package* pkg_, QString listname_)
        if( pkg_ != 0 )
        {
                QString name = pkg_->name();
-               if( pkg_->maemoDisplayName()!="" )
+               if( !pkg_->maemoDisplayName().isEmpty() )
                        name = pkg_->maemoDisplayName();
                p->setData(UserRoleName, name);
        } else {
@@ -501,7 +513,7 @@ void PackageView::addListItem(Package* pkg_, QString listname_)
        {
                p->setData(UserRoleDescShort, pkg_->descShort());
                p->setData(UserRoleVersion, pkg_->version());
-               p->setData(UserRoleMarked, (int)pkg_->markedOperation());
+               p->setData(UserRoleMarked, static_cast<int>(pkg_->markedOperation()) );
                p->setData(UserRoleInstalled, pkg_->isInstalled());
                p->setData(UserRoleUpgradeable, pkg_->isUpgradeable());
                p->setData(UserRoleAvailVersion, pkg_->upgradeableVersion());
@@ -509,11 +521,11 @@ void PackageView::addListItem(Package* pkg_, QString listname_)
                p->setData(UserRoleCurrentCatFilter, iSelectedCatFilter);
 
                if( pkg_->availablePackage() )
-                       p->setData(UserRoleBlacklisted, (int)pkg_->availablePackage()->blacklisted());
+                       p->setData(UserRoleBlacklisted, static_cast<int>(pkg_->availablePackage()->blacklisted()) );
                else
-                       p->setData(UserRoleBlacklisted, (int)pkg_->blacklisted());
+                       p->setData(UserRoleBlacklisted, static_cast<int>(pkg_->blacklisted()) );
 
-               //qDebug()<<pkg_->name();
+               //qDebug() << pkg_->name();
 
                pkg_->convertIcon();
                p->setData(Qt::DecorationRole, *pkg_->icon());
@@ -535,7 +547,6 @@ void PackageView::closeEvent(QCloseEvent *event)
                return;
        }
 
-#ifdef Q_WS_MAEMO_5
        if( iAptInterface->numSelectedPackages() == 0 )
        {               
                resetWindow();
@@ -552,10 +563,6 @@ void PackageView::closeEvent(QCloseEvent *event)
                        event->ignore();
                }
        }
-#else  // for simulator
-       resetWindow();
-       event->accept();
-#endif
 }
 
 void PackageView::changeEvent(QEvent *e)
@@ -648,11 +655,31 @@ void PackageView::on_listWidget_itemClicked(QListWidgetItem* item)
        if( upg_pkg )
                bl_u = upg_pkg->isBlacklisted();
 
-       PackageSelector s(pkg, iAptInterface, this);
+       PackageSelector s(pkg, iAptInterface, iSettings, this);
        s.exec();
+       Package::operation op = s.selectedOperation();
 
-       pkg->setMarkedForOperation( s.selectedOperation() );
-       item->setData(UserRoleMarked, (int)s.selectedOperation());
+       QStringList confl = pkg->checkConflicts_RichText();
+       if( confl.count() > 0 && op != Package::PkgOpNone ) {
+               ConfirmDialog d(true, this);
+               QString t = "Package " + pkg->name() + " conflicts with another installed or marked package. Mark anyway?";
+               t += "<font size=\"-1\"><br><br>Conflicts: ";
+               t += confl.join(", ");
+               t += "</font>";
+               d.setText("Conflicting packages", t);
+               if( !d.exec() )
+                       op = Package::PkgOpNone;
+       }
+
+       if( pkg->isPinned() && op != Package::PkgOpNone ) {
+               ConfirmDialog d(true, this);
+               d.setText("Warning","Package has been pinned in apt preferences. Operation might not go as expected. Mark anyway?");
+               if( !d.exec() )
+                       op = Package::PkgOpNone;
+       }
+
+       pkg->setMarkedForOperation( op );
+       item->setData( UserRoleMarked, (int)op );
        updateLabel();
 
        if( pkg->isBlacklisted() != bl ) {
@@ -711,6 +738,14 @@ void PackageView::on_btn_CategoryFilter_clicked()
                iSortNoticeShown = false;
 
                openWin();
+
+               if( iSelectedCatFilter==CatFilterBlacklisted && iAptInterface->needListOrDateRefresh() )
+               {
+                       ConfirmDialog d(false, this);
+                       d.setText("Notice","Since you don't have all package lists currently loaded, not all blacklisted "
+                                         "packages are necessarily shown");
+                       d.exec();
+               }
        }
 }
 
@@ -742,10 +777,12 @@ void PackageView::on_btn_StatusFilter_clicked()
                if( oldfilter==Package::PkgStatInstalled && iSelectedStatFilter!=Package::PkgStatInstalled &&
                        iAptInterface->needListOrDateRefresh() )
                {
+                       iMainWindow->openNetworkConnection();
+
                        iMainWindow->setNextOperation(MainWindow::OpOpenPkgView);
                        iMainWindow->busyDialog(true,"Operation in progress","Reading the rest of the package lists");
 
-                       if( iAptInterface->needRepoRefresh() )
+                       if( iAptInterface->needRepoRefresh() && !iSettings->qsettings()->value("no_catalogs_autoupdate",false).toBool() )
                                iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate);
 
                        iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages);
@@ -757,12 +794,10 @@ void PackageView::on_btn_StatusFilter_clicked()
 
 void PackageView::resetWindow()
 {
-       iMainWindow->resetIdlingTime();
-
        iAptInterface->writeBlacklist();
 
        ui->btn_StatusFilter->setEnabled(true);
-       //iSelectedCatFilter = iDefaultCatFilter;
+       iSelectedCatFilter = iDefaultCatFilter;
        //iSortOrder = SortAlpha;
        iSortNoticeShown = false;
 
@@ -816,7 +851,7 @@ void PackageView::on_lineEdit_textEdited(QString text)
        if( !ui->searchBar->isVisible() )
                return;
 
-       if( text=="" ) {
+       if( text.isEmpty() ) {
                on_btn_searchClose_clicked();
                return;
        }
@@ -962,14 +997,19 @@ void PackageView::on_actionLoad_selections_triggered()
                        return;
        }
 
+       QString filename = QFileDialog::getOpenFileName(this, "Open selections list", KDefaultUserOpenSaveDir, "Selection lists (*.slist)");
+       if( filename.isNull() || filename.isEmpty() )
+               return;
+
        clearSelections();
 
        QStringList unknownList;
        QStringList wrongverList;
+       QStringList wrongstatusList;
        int success=0;
        int errors=0;
 
-       QFile f("/root/.fapman/selections.list");
+       QFile f( filename );
        if( f.open(QIODevice::ReadOnly | QIODevice::Text ) )
        {
                while(!f.atEnd()) {
@@ -983,14 +1023,18 @@ void PackageView::on_actionLoad_selections_triggered()
                                                unknownList << parts.at(0);
                                        }
                                        else if( pkgIn ) {
-                                               wrongverList << parts.at(0);
+                                               wrongstatusList << parts.at(0);
                                        }
                                        else if( pkgAv ) {
-                                               if( pkgAv->version() == parts.at(1) && !pkgAv->isInstalled() ) {
+                                               if( !pkgAv->isInstalled() )
+                                               {
                                                        pkgAv->setMarkedForOperation(Package::PkgOpInstallUpgrade);
                                                        success++;
+                                                       if( pkgAv->version() != parts.at(1) ) {
+                                                               wrongverList << parts.at(0);
+                                                       }
                                                } else {
-                                                       wrongverList << parts.at(0);
+                                                       wrongstatusList << parts.at(0);
                                                }
                                        }
 
@@ -999,14 +1043,18 @@ void PackageView::on_actionLoad_selections_triggered()
                                                unknownList << parts.at(0);
                                        }
                                        else if( (pkgAv && !pkgIn) || (pkgIn && !pkgAv) ) {
-                                               wrongverList << parts.at(0);
+                                               wrongstatusList << parts.at(0);
                                        }
                                        else if( pkgIn && pkgAv ) {
-                                               if( pkgIn->version() == parts.at(1) && pkgIn->isInstalled() && pkgIn->isUpgradeable() ) {
+                                               if( pkgIn->isInstalled() && pkgIn->isUpgradeable() )
+                                               {
                                                        pkgIn->setMarkedForOperation(Package::PkgOpInstallUpgrade);
                                                        success++;
+                                                       if( pkgIn->version() != parts.at(1) ) {
+                                                               wrongverList << parts.at(0);
+                                                       }
                                                } else {
-                                                       wrongverList << parts.at(0);
+                                                       wrongstatusList << parts.at(0);
                                                }
                                        }
 
@@ -1015,20 +1063,24 @@ void PackageView::on_actionLoad_selections_triggered()
                                                unknownList << parts.at(0);
                                        }
                                        else if( pkgAv && !pkgIn ) {
-                                               wrongverList << parts.at(0);
+                                               wrongstatusList << parts.at(0);
                                        }
                                        else if( pkgIn ) {
-                                               if( pkgIn->version() == parts.at(1) && pkgIn->isInstalled() ) {
+                                               if( pkgIn->isInstalled() )
+                                               {
                                                        pkgIn->setMarkedForOperation(Package::PkgOpRemove);
                                                        success++;
+                                                       if( pkgIn->version() != parts.at(1) ) {
+                                                               wrongverList << parts.at(0);
+                                                       }
                                                } else {
-                                                       wrongverList << parts.at(0);
+                                                       wrongstatusList << parts.at(0);
                                                }
                                        }
                                } else {
                                        errors++;
                                }
-                       } else if( line!="" ){
+                       } else if( !line.isEmpty() ){
                                errors++;
                        }
                }
@@ -1038,14 +1090,25 @@ void PackageView::on_actionLoad_selections_triggered()
        ConfirmDialog d(false, this);
        QString msg;
        msg += QString("<b>%1 successful</b><br>").arg(success);
+
        if( wrongverList.count() > 0 ) {
-               msg += QString("%1 wrong versions/changed statuses (not selected):<br>").arg(wrongverList.count());
+               msg += QString("%1 version mismatches (selected anyway):<br>").arg(wrongverList.count());
                msg += "<font size=\"-1\">";
                for( int i=0; i<wrongverList.count(); i++ ) {
                        msg += wrongverList.at(i) + " ";
                }
                msg += "</font><br>";
        }
+
+       if( wrongstatusList.count() > 0 ) {
+               msg += QString("%1 status mismatches (packages ignored):<br>").arg(wrongstatusList.count());
+               msg += "<font size=\"-1\">";
+               for( int i=0; i<wrongstatusList.count(); i++ ) {
+                       msg += wrongstatusList.at(i) + " ";
+               }
+               msg += "</font><br>";
+       }
+
        if( unknownList.count() > 0 ) {
                msg += QString("%1 unknown packages:<br>").arg(unknownList.count());
                msg += "<font size=\"-1\">";
@@ -1054,10 +1117,11 @@ void PackageView::on_actionLoad_selections_triggered()
                }
                msg += "</font><br>";
        }
-       if( errors>0 || (wrongverList.count()==0 && unknownList.count()==0) ) {
+
+       if( errors>0 || (wrongstatusList.count()==0 && unknownList.count()==0) ) {
                msg += QString("%1 errors<br>").arg(errors);
        }
-       if( success==0 && wrongverList.count()==0 && unknownList.count()==0 )
+       if( success==0 && wrongstatusList.count()==0 && unknownList.count()==0 )
                msg = "No stored selections";
        QString title;
        if( success > 0 )
@@ -1067,6 +1131,14 @@ void PackageView::on_actionLoad_selections_triggered()
        d.setText(title, msg);
        d.exec();
 
+       if( unknownList.count()>0 && iAptInterface->needListOrDateRefresh() )
+       {
+               ConfirmDialog f(false, this);
+               f.setText("About Unknown packages","You encountered unknown packages. You might want to try "
+                                 "loading the selections again after loading the full package lists (by selecting install or upgrade view)");
+               f.exec();
+       }
+
        if( success > 0 ) {
                ui->btn_StatusFilter->setEnabled(false);
                iSelectedCatFilter = CatFilterAllMarked;
@@ -1079,7 +1151,14 @@ void PackageView::on_actionSave_selections_triggered()
        if( iAptInterface->numSelectedPackages() == 0 )
                return;
 
-       QFile f("/root/.fapman/selections.list");
+       QString filename = QFileDialog::getSaveFileName(this, "Save selections to...", KDefaultUserOpenSaveDir, "Selection lists (*.slist)");
+       if( filename.isNull() || filename.isEmpty() )
+               return;
+
+       if( !filename.endsWith(".slist") )
+               filename.append(".slist");
+
+       QFile f( filename );
        bool fail = false;
        int count = 0;
        if( f.open(QIODevice::WriteOnly | QIODevice::Text) )
@@ -1153,3 +1232,44 @@ void PackageView::on_actionRestore_all_triggered()
        iAptInterface->writeBlacklist();
        openWin();
 }
+
+void PackageView::on_actionStore_list_triggered()
+{
+       QString filename = QFileDialog::getSaveFileName(this, "Save application list to...", KDefaultUserOpenSaveDir, "Selection lists (*.slist)");
+       if( filename.isNull() || filename.isEmpty() )
+               return;
+
+       if( !filename.endsWith(".slist") )
+               filename.append(".slist");
+
+       QFile f( filename );
+       bool fail = false;
+       int count = 0;
+       if( f.open(QIODevice::WriteOnly | QIODevice::Text) )
+       {
+               QTextStream out(&f);
+
+               QHashIterator<QString, Package*> r( *iAptInterface->packagesInstalled() );
+               while (r.hasNext())
+               {
+                       r.next();
+
+                       if( r.value()->isInstalled() && r.value()->section().startsWith("user/") ) {
+                               out << r.value()->name() << " " << r.value()->version() << " install\n";
+                               count++;
+                       }
+               }
+
+               f.close();
+       } else {
+               fail = true;
+       }
+
+       ConfirmDialog d(false, this);
+       if( fail )
+               d.setText( "Error", "Failed to write application list" );
+       else
+               d.setText( "List stored", QString("Stored %1 selections.").arg(count) + "<br>"
+                                  "The list can be used to restore removed applications later." );
+       d.exec();
+}