File 0015-Change-the-way-we-toggle-repos-so-that-we-can-report.patch of Package apper
From 856a72c2c4e9b30081093fbfc97eb3e40359bed5 Mon Sep 17 00:00:00 2001
From: Daniel Nicoletti <dantti12@gmail.com>
Date: Thu, 17 Jan 2013 18:42:02 -0200
Subject: [PATCH 15/20] Change the way we toggle repos so that we can report
that an error happened to the user
---
ApperKCM/Settings/OriginModel.cpp | 99 +++++++++++++++++----------------------
ApperKCM/Settings/OriginModel.h | 19 ++++++--
ApperKCM/Settings/Settings.cpp | 28 ++++-------
ApperKCM/Settings/Settings.h | 1 +
4 files changed, 69 insertions(+), 78 deletions(-)
diff --git a/ApperKCM/Settings/OriginModel.cpp b/ApperKCM/Settings/OriginModel.cpp
index 6cb4907..faae248 100644
--- a/ApperKCM/Settings/OriginModel.cpp
+++ b/ApperKCM/Settings/OriginModel.cpp
@@ -22,16 +22,13 @@
#include <PkStrings.h>
-#include <KDebug>
#include <KMessageBox>
#include <KLocale>
-#include <QEventLoop>
+#include <KDebug>
using namespace PackageKit;
-Q_DECLARE_METATYPE(Qt::CheckState)
-
OriginModel::OriginModel(QObject *parent) :
QStandardItemModel(parent),
m_finished(true)
@@ -44,6 +41,37 @@ OriginModel::~OriginModel()
{
}
+bool OriginModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+ if (role == Qt::CheckStateRole && index.isValid()) {
+ Transaction *transaction = new Transaction(this);
+ connect(transaction, SIGNAL(errorCode(PackageKit::Transaction::Error,QString)),
+ SLOT(errorCode(PackageKit::Transaction::Error,QString)));
+ connect(transaction, SIGNAL(finished(PackageKit::Transaction::Exit,uint)),
+ SLOT(setRepoFinished(PackageKit::Transaction::Exit)));
+
+ transaction->repoEnable(index.data(RepoId).toString(),
+ value.toBool());
+ if (transaction->error()) {
+ KMessageBox::sorry(0, PkStrings::daemonError(transaction->error()));
+ }
+ }
+ return false;
+}
+
+QVariantHash OriginModel::changes() const
+{
+ QVariantHash ret;
+ for (int i = 0; i < rowCount(); ++i) {
+ QStandardItem *repo = item(i);
+ bool currentState = repo->checkState();
+ if (currentState != repo->data(RepoInitialState).toBool()) {
+ ret[repo->data(RepoId).toString()] = currentState;
+ }
+ }
+ return ret;
+}
+
void OriginModel::addOriginItem(const QString &repo_id, const QString &details, bool enabled)
{
if (m_finished) {
@@ -52,12 +80,11 @@ void OriginModel::addOriginItem(const QString &repo_id, const QString &details,
m_finished = false;
}
- Qt::CheckState state = enabled ? Qt::Checked : Qt::Unchecked;
QStandardItem *item = new QStandardItem(details);
item->setCheckable(true);
- item->setCheckState(state);
- item->setData(repo_id, Qt::UserRole);
- item->setData(qVariantFromValue(state));
+ item->setCheckState(enabled ? Qt::Checked : Qt::Unchecked);
+ item->setData(repo_id, RepoId);
+ item->setData(enabled, RepoInitialState);
appendRow(item);
}
@@ -66,61 +93,19 @@ void OriginModel::finished()
m_finished = true;
}
-void OriginModel::clearChanges()
+void OriginModel::errorCode(PackageKit::Transaction::Error error, const QString &details)
{
- for (int i = 0; i < rowCount(); ++i) {
- QStandardItem *repo = item(i);
- if (repo->checkState() != repo->data().value<Qt::CheckState>()) {
- repo->setCheckState(repo->data().value<Qt::CheckState>());
- }
+ if (error != Transaction::ErrorTransactionCancelled) {
+ KMessageBox::detailedSorry(0, PkStrings::errorMessage(error), details, PkStrings::error(error), KMessageBox::Notify);
}
}
-bool OriginModel::changed() const
+void OriginModel::setRepoFinished(Transaction::Exit exit)
{
- for (int i = 0; i < rowCount(); ++i) {
- QStandardItem *repo = item(i);
- if (repo->checkState() != repo->data().value<Qt::CheckState>()) {
- return true;
- }
- }
- return false;
-}
-
-bool OriginModel::save()
-{
- bool changed = false;
- int rows = rowCount();
- QEventLoop loop;
- for (int i = 0; i < rows; ++i) {
- QStandardItem *repo = item(i);
- if (repo->checkState() != repo->data().value<Qt::CheckState>()) {
- Transaction *transaction = new Transaction(this);
- QWeakPointer<Transaction> pointer = transaction;
- connect(transaction, SIGNAL(finished(PackageKit::Transaction::Exit,uint)),
- &loop, SLOT(quit()));
- transaction->repoEnable(repo->data(Qt::UserRole).toString(),
- static_cast<bool>(repo->checkState()));
- if (transaction->error()) {
- KMessageBox::sorry(0, PkStrings::daemonError(transaction->error()));
- return false;
- }
- loop.exec();
- changed = true;
-
- if (pointer.isNull()) {
- // Avoid crashing when the application is quitting
- return false;
- }
- }
- }
-
- // refresh the user cache if he or she enables/disables any of it
- if (changed) {
- // TODO ask to refresh the cache
- // TODO emit refresh requested
+ if (exit == Transaction::ExitSuccess) {
+ emit refreshRepoList();
}
- return true;
+ sender()->deleteLater();
}
#include "OriginModel.moc"
diff --git a/ApperKCM/Settings/OriginModel.h b/ApperKCM/Settings/OriginModel.h
index 294baf2..318017c 100644
--- a/ApperKCM/Settings/OriginModel.h
+++ b/ApperKCM/Settings/OriginModel.h
@@ -23,21 +23,34 @@
#include <QStandardItemModel>
+#include <Transaction>
+
class OriginModel : public QStandardItemModel
{
Q_OBJECT
public:
+ enum {
+ RepoId = Qt::UserRole,
+ RepoInitialState
+ } RepoRole;
OriginModel(QObject *parent = 0);
~OriginModel();
- bool changed() const;
- bool save();
- void clearChanges();
+ bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
+
+ QVariantHash changes() const;
+
+signals:
+ void refreshRepoList();
public slots:
void addOriginItem(const QString &repo_id, const QString &details, bool enabled);
void finished();
+private slots:
+ void errorCode(PackageKit::Transaction::Error error, const QString &details);
+ void setRepoFinished(PackageKit::Transaction::Exit exit);
+
private:
bool m_finished;
};
diff --git a/ApperKCM/Settings/Settings.cpp b/ApperKCM/Settings/Settings.cpp
index 7f54adb..d526494 100644
--- a/ApperKCM/Settings/Settings.cpp
+++ b/ApperKCM/Settings/Settings.cpp
@@ -25,6 +25,7 @@
#include "OriginModel.h"
#include <Enum.h>
+#include <PkStrings.h>
#include <QTimer>
#include <QSortFilterProxyModel>
@@ -59,6 +60,8 @@ Settings::Settings(Transaction::Roles roles, QWidget *parent) :
}
m_originModel = new OriginModel(this);
+ connect(m_originModel, SIGNAL(refreshRepoList()),
+ SLOT(refreshRepoModel()));
QSortFilterProxyModel *proxy = new QSortFilterProxyModel(this);
proxy->setDynamicSortFilter(true);
proxy->setSourceModel(m_originModel);
@@ -67,11 +70,7 @@ Settings::Settings(Transaction::Roles roles, QWidget *parent) :
// This is needed to keep the oring right
ui->originTV->header()->setSortIndicator(0, Qt::AscendingOrder);
proxy->sort(0);
- if (m_roles & Transaction::RoleGetRepoList) {
- // The data will be loaded when Load is called
- connect(m_originModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
- this, SLOT(checkChanges()));
- } else {
+ if (!(m_roles & Transaction::RoleGetRepoList)) {
// Disables the group box
ui->originTV->setEnabled(false);
ui->showOriginsCB->setEnabled(false);
@@ -134,6 +133,11 @@ void Settings::on_editOriginsPB_clicked()
#endif //EDIT_ORIGNS_DESKTOP_NAME
}
+void Settings::refreshRepoModel()
+{
+ on_showOriginsCB_stateChanged(ui->showOriginsCB->checkState());
+}
+
// TODO update the repo list connecting to repo changed signal
void Settings::on_showOriginsCB_stateChanged(int state)
{
@@ -189,8 +193,6 @@ bool Settings::hasChanges() const
||
ui->installUpdatesMobileCB->isChecked() != checkUpdateGroup.readEntry(CFG_INSTALL_UP_MOBILE, DEFAULT_INSTALL_UP_MOBILE)
||
- ((m_roles & Transaction::RoleGetRepoList) ? m_originModel->changed() : false)
- ||
ui->autoConfirmCB->isChecked() != !requirementsDialog.readEntry("autoConfirm", false)
||
ui->appLauncherCB->isChecked() != transaction.readEntry("ShowApplicationLauncher", true)) {
@@ -264,7 +266,7 @@ void Settings::load()
KConfigGroup originsDialog(&config, "originsDialog");
bool showDevel = originsDialog.readEntry("showDevel", false);
ui->showOriginsCB->setChecked(showDevel);
- on_showOriginsCB_stateChanged(ui->showOriginsCB->checkState());
+ refreshRepoModel();
ui->originTV->setEnabled(true);
} else {
ui->originTV->setEnabled(false);
@@ -306,15 +308,6 @@ void Settings::save()
checkUpdateGroup.writeEntry("autoUpdate", ui->autoCB->itemData(ui->autoCB->currentIndex()).toUInt());
checkUpdateGroup.writeEntry("installUpdatesOnBattery", ui->installUpdatesBatteryCB->isChecked());
checkUpdateGroup.writeEntry("installUpdatesOnMobile", ui->installUpdatesMobileCB->isChecked());
- // check to see if the backend support this
- if (m_roles & Transaction::RoleGetRepoList) {
- on_showOriginsCB_stateChanged(ui->showOriginsCB->checkState());
- if (!m_originModel->save()) {
- KMessageBox::sorry(this,
- i18n("You do not have the necessary privileges to perform this action."),
- i18n("Failed to set origin data"));
- }
- }
}
void Settings::defaults()
@@ -324,7 +317,6 @@ void Settings::defaults()
ui->distroIntervalCB->setCurrentIndex(ui->distroIntervalCB->findData(Enum::DistroUpgradeDefault));
ui->intervalCB->setCurrentIndex(ui->intervalCB->findData(Enum::TimeIntervalDefault));
ui->autoCB->setCurrentIndex(ui->autoCB->findData(Enum::AutoUpdateDefault) );
- m_originModel->clearChanges();
checkChanges();
}
diff --git a/ApperKCM/Settings/Settings.h b/ApperKCM/Settings/Settings.h
index 2213f6e..f73d91d 100644
--- a/ApperKCM/Settings/Settings.h
+++ b/ApperKCM/Settings/Settings.h
@@ -53,6 +53,7 @@ signals:
void changed(bool state);
private slots:
+ void refreshRepoModel();
void on_showOriginsCB_stateChanged(int state);
void on_editOriginsPB_clicked();
void checkChanges();
--
1.8.1