# HG changeset patch # User Andre Heinecke # Date 1397555789 -7200 # Node ID 6cc124e79066e6bb2bc05d9af8531341233e2ea2 # Parent 6b78a89c1e17b44a064d0147b35f81713dd88870 Add save/load unselected and add role enumerator Explicitly naming the roles avoids confusion and makes the code more readable diff -r 6b78a89c1e17 -r 6cc124e79066 ui/certificateitemdelegate.cpp --- a/ui/certificateitemdelegate.cpp Tue Apr 15 11:04:34 2014 +0200 +++ b/ui/certificateitemdelegate.cpp Tue Apr 15 11:56:29 2014 +0200 @@ -1,6 +1,7 @@ #include #include "certificate.h" +#include "mainwindow.h" #include "certificateitemdelegate.h" void CertificateItemDelegate::paint(QPainter *painter, @@ -8,7 +9,7 @@ { // Save the current painter. painter->save(); - int status = index.data(Qt::UserRole + 1).toInt(); + int status = index.data(MainWindow::StatusRole).toInt(); if (status == 0) { // This status is not known, so draw the default item. QStyledItemDelegate::paint(painter, option, index); diff -r 6b78a89c1e17 -r 6cc124e79066 ui/mainwindow.cpp --- a/ui/mainwindow.cpp Tue Apr 15 11:04:34 2014 +0200 +++ b/ui/mainwindow.cpp Tue Apr 15 11:56:29 2014 +0200 @@ -56,6 +56,7 @@ if (!trayMode) { show(); } + loadUnselectedCertificates(); } void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason) @@ -316,7 +317,6 @@ void MainWindow::loadCertificateList() { - qDebug() << "display certificates"; mCertListWidget->clear(); int i = 0; foreach (const Certificate &cert, mListToInstall.getCertificates()) { @@ -326,18 +326,19 @@ } QListWidgetItem* item = new QListWidgetItem(cert.shortDescription()); SeparatorItemDelegate *separator = new SeparatorItemDelegate(); - item->setData(Qt::UserRole, cert.details()); + item->setData(DetailsRole, cert.details()); + item->setData(B64LineRole, cert.base64Line()); + Qt::CheckState checkedState = mPreviouslyUnselected.contains(cert.base64Line()) ? + Qt::Unchecked : Qt::Checked; if (cert.isInstallCert()) { // This if statements is for testing! @TODO Remove this! if (i <= 2) { - item->setData(Qt::UserRole + 1, Certificate::InstallOld); + item->setData(StatusRole, Certificate::InstallOld); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(Qt::Checked); } else { - item->setData(Qt::UserRole + 1, Certificate::InstallNew); + item->setData(StatusRole, Certificate::InstallNew); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(Qt::Checked); } if (i == 3) { QListWidgetItem *sep = new QListWidgetItem("New certificates"); @@ -345,16 +346,17 @@ mCertListWidget->addItem(sep); i++; } + item->setCheckState(checkedState); } else { // This if statements is for testing! @TODO Remove this! if (i > 35) { - item->setData(Qt::UserRole + 1, Certificate::RemoveNew); + item->setData(StatusRole, Certificate::RemoveNew); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(Qt::Checked); + item->setCheckState(checkedState); } else { - item->setData(Qt::UserRole + 1, Certificate::RemoveOld); + item->setData(StatusRole, Certificate::RemoveOld); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); } } @@ -391,7 +393,7 @@ void MainWindow::showDetails(QListWidgetItem *item) { - QString details = item->data(Qt::UserRole).toString(); + QString details = item->data(DetailsRole).toString(); certificateDetails->setPlainText(details); } @@ -411,10 +413,10 @@ for (int i = 0; i < mCertListWidget->count(); i++) { QListWidgetItem *item = mCertListWidget->item(i); if (item->checkState() == Qt::Checked) { - choices << item->data(Qt::UserRole).toString(); + choices << item->data(B64LineRole).toString(); continue; } - QString certLine = item->data(Qt::UserRole).toString(); + QString certLine = item->data(B64LineRole).toString(); if (certLine.startsWith("I:")) { certLine[0] = 'R'; choices << certLine; @@ -440,4 +442,34 @@ this, SLOT(installerError(const QString &))); instWrap->start(); + if (!saveUnselectedCertificates()) { + qWarning() << "Failed to save previosly unselected certificates."; + } } + +void MainWindow::loadUnselectedCertificates() +{ + mPreviouslyUnselected.clear(); + mSettings.beginGroup("unselected"); + QStringList keys = mSettings.allKeys(); + foreach (const QString &key, keys) { + mPreviouslyUnselected << mSettings.value(key, QString()).toString(); + } + mSettings.endGroup(); +} + +bool MainWindow::saveUnselectedCertificates() +{ + mSettings.beginGroup("unselected"); + mSettings.remove(""); /* Clears old choices */ + for (int i = 0; i < mCertListWidget->count(); i++) { + QListWidgetItem *item = mCertListWidget->item(i); + if (item->checkState() != Qt::Checked) { + mSettings.setValue(QString::fromLatin1("cert%1").arg(i), + item->data(B64LineRole).toString()); + } + } + mSettings.endGroup(); + mSettings.sync(); + return mSettings.status() == QSettings::NoError; +} diff -r 6b78a89c1e17 -r 6cc124e79066 ui/mainwindow.h --- a/ui/mainwindow.h Tue Apr 15 11:04:34 2014 +0200 +++ b/ui/mainwindow.h Tue Apr 15 11:56:29 2014 +0200 @@ -46,6 +46,12 @@ TransferError }; + enum ItemRole { + DetailsRole = Qt::UserRole, /* The certificate details for the window */ + StatusRole, /* Certificate status */ + B64LineRole /* The I:/R: line */ + }; + CurrentState getState() {return mCurState;} void setState(CurrentState state) {mCurState = state;} @@ -67,6 +73,27 @@ void installerError(const QString& errMsg); void installCerts(); + /** @brief saves the currently unselected certificates + * + * This creates / updates a qsettings section that + * [unselected] that contains the certificates that + * were unselected previously. + * + * Unselected are certificates that are unchecked + * in the certListWidget + * + * Returns false on error. + */ + bool saveUnselectedCertificates(); + + /** @brief loads previously unselected certificates from settings + * + * The certificates are strored in the list mPreviouslyUnselected. + * + * On error mPreviouslyUnselected is empty after this call. + */ + void loadUnselectedCertificates(); + private: /** @brief check the integrity of available files. * @@ -100,7 +127,11 @@ CurrentState mCurState; QMenuBar *mMenuBar; + /* The current list that should be installed */ CertificateList mListToInstall; + /* Previously made "unselect" choices in the form of + * base64lines with I:/R: prefix */ + QStringList mPreviouslyUnselected; QListWidget *mCertListWidget; QTextEdit *certificateDetails;