File 0016-Show-how-much-download-is-left-and-use-QPointers-ins.patch of Package apper

From 6cecc3dc052b60f0a2bdc4893d38b5d8a83dd464 Mon Sep 17 00:00:00 2001
From: Daniel Nicoletti <dantti12@gmail.com>
Date: Fri, 18 Jan 2013 00:19:55 -0200
Subject: [PATCH 16/20] Show how much download is left and use QPointers
 instead of QWeakPointers for convenience

---
 ApperKCM/ApperKCM.cpp      | 14 +++++-----
 libapper/PkTransaction.cpp | 65 +++++++++++++++++++++++++++-------------------
 libapper/PkTransaction.h   |  4 ---
 libapper/Requirements.cpp  | 22 +++++++++++++++-
 libapper/Requirements.h    |  1 +
 5 files changed, 66 insertions(+), 40 deletions(-)

diff --git a/ApperKCM/ApperKCM.cpp b/ApperKCM/ApperKCM.cpp
index b18caec..6189149 100644
--- a/ApperKCM/ApperKCM.cpp
+++ b/ApperKCM/ApperKCM.cpp
@@ -750,8 +750,7 @@ void ApperKCM::refreshCache()
 
     PkTransactionWidget *transactionW = new PkTransactionWidget(this);
     connect(transactionW, SIGNAL(titleChangedProgress(QString)), this, SIGNAL(caption(QString)));
-    PkTransaction *transaction = new PkTransaction(transactionW);
-    QWeakPointer<PkTransaction> pointer = transaction;
+    QPointer<PkTransaction> transaction = new PkTransaction(transactionW);
     transactionW->setTransaction(transaction, Transaction::RoleRefreshCache);
 
     ui->stackedWidget->addWidget(transactionW);
@@ -768,7 +767,7 @@ void ApperKCM::refreshCache()
     // wait for the end of transaction
     if (!transaction->isFinished()) {
         loop.exec();
-        if (pointer.isNull()) {
+        if (!transaction) {
             // Avoid crashing
             return;
         }
@@ -791,8 +790,7 @@ void ApperKCM::save()
     } else {
         PkTransactionWidget *transactionW = new PkTransactionWidget(this);
         connect(transactionW, SIGNAL(titleChangedProgress(QString)), this, SIGNAL(caption(QString)));
-        PkTransaction *transaction = new PkTransaction(transactionW);
-        QWeakPointer<PkTransaction> pointer = transaction;
+        QPointer<PkTransaction> transaction = new PkTransaction(transactionW);
 
         ui->stackedWidget->addWidget(transactionW);
         ui->stackedWidget->setCurrentWidget(transactionW);
@@ -811,7 +809,7 @@ void ApperKCM::save()
             // wait for the end of transaction
             if (!transaction->isFinished()) {
                 loop.exec();
-                if (pointer.isNull()) {
+                if (!transaction) {
                     // Avoid crashing
                     return;
                 }
@@ -826,7 +824,7 @@ void ApperKCM::save()
                 // wait for the end of transaction
                 if (!transaction->isFinished()) {
                     loop.exec();
-                    if (pointer.isNull()) {
+                    if (!transaction) {
                         // Avoid crashing
                         return;
                     }
@@ -845,7 +843,7 @@ void ApperKCM::save()
                 // wait for the end of transaction
                 if (!transaction->isFinished()) {
                     loop.exec();
-                    if (pointer.isNull()) {
+                    if (!transaction) {
                         // Avoid crashing
                         return;
                     }
diff --git a/libapper/PkTransaction.cpp b/libapper/PkTransaction.cpp
index 9ab949b..1f6b4c0 100644
--- a/libapper/PkTransaction.cpp
+++ b/libapper/PkTransaction.cpp
@@ -55,6 +55,11 @@ class PkTransactionPrivate
 public:
     bool allowDeps;
     bool jobWatcher;
+    bool handlingActionRequired;
+    bool showingError; //This might replace the above
+    qulonglong downloadSizeRemaining;
+    PkTransaction::ExitStatus exitStatus;
+    Transaction::Status status;
     Transaction::TransactionFlags flags;
     Transaction::Role originalRole;
     Transaction::Error error;
@@ -70,22 +75,25 @@ public:
 
 PkTransaction::PkTransaction(QObject *parent) :
     Transaction(parent),
-    m_handlingActionRequired(false),
-    m_showingError(false),
-    m_exitStatus(Success),
-    m_status(Transaction::StatusUnknown),
     d(new PkTransactionPrivate)
 {
     // for sanity we are finished till some transaction is set
-    d->simulateModel = 0;
-    d->launcher = 0;
-    d->originalRole = Transaction::RoleUnknown;
-    d->parentWindow = qobject_cast<QWidget*>(parent);
+    d->allowDeps = false;
     d->jobWatcher = false;
-
+    d->handlingActionRequired = false;
+    d->showingError = false;
+    d->downloadSizeRemaining = 0;
+    d->exitStatus = Success;
+    d->status = Transaction::StatusUnknown;
     // for sanity we are trusted till an error is given and the user accepts
     d->flags = Transaction::TransactionFlagOnlyTrusted;
+    d->originalRole = Transaction::RoleUnknown;
+    d->error = Transaction::ErrorUnknown;
+    d->launcher = 0;
+    d->simulateModel = 0;
     d->progressModel = new PkTransactionProgressModel(this);
+    d->parentWindow = qobject_cast<QWidget*>(parent);
+
     connect(this, SIGNAL(repoDetail(QString,QString,bool)),
             d->progressModel, SLOT(currentRepo(QString,QString,bool)));
     connect(this, SIGNAL(package(PackageKit::Transaction::Info,QString,QString)),
@@ -313,7 +321,7 @@ void PkTransaction::slotErrorCode(Transaction::Error error, const QString &detai
     kDebug() << "errorCode: " << error << details;
     d->error = error;
 
-    if (m_handlingActionRequired) {
+    if (d->handlingActionRequired) {
         // We are already handling required actions
         // like eulaRequired() and repoSignatureRequired()
         return;
@@ -330,7 +338,7 @@ void PkTransaction::slotErrorCode(Transaction::Error error, const QString &detai
     case Transaction::ErrorCannotInstallRepoUnsigned:
     case Transaction::ErrorCannotUpdateRepoUnsigned:
     {
-        m_handlingActionRequired = true;
+        d->handlingActionRequired = true;
         int ret = KMessageBox::warningYesNo(d->parentWindow,
                                             i18n("You are about to install unsigned packages that can compromise your system, "
                                             "as it is impossible to verify if the software came from a trusted "
@@ -343,11 +351,11 @@ void PkTransaction::slotErrorCode(Transaction::Error error, const QString &detai
         } else {
             setExitStatus(Cancelled);
         }
-        m_handlingActionRequired = false;
+        d->handlingActionRequired = false;
         return;
     }
     default:
-        m_showingError = true;
+        d->showingError = true;
         showSorry(PkStrings::error(error), PkStrings::errorMessage(error), QString(details).replace('\n', "<br>"));
 
         // when we receive an error we are done
@@ -357,12 +365,12 @@ void PkTransaction::slotErrorCode(Transaction::Error error, const QString &detai
 
 void PkTransaction::slotEulaRequired(const QString &eulaID, const QString &packageID, const QString &vendor, const QString &licenseAgreement)
 {
-    if (m_handlingActionRequired) {
+    if (d->handlingActionRequired) {
         // if its true means that we alread passed here
-        m_handlingActionRequired = false;
+        d->handlingActionRequired = false;
         return;
     } else {
-        m_handlingActionRequired = true;
+        d->handlingActionRequired = true;
     }
 
     LicenseAgreement *eula = new LicenseAgreement(eulaID, packageID, vendor, licenseAgreement, d->parentWindow);
@@ -390,6 +398,8 @@ void PkTransaction::acceptEula()
 
 void PkTransaction::slotChanged()
 {
+    d->downloadSizeRemaining = downloadSizeRemaining();
+
     if (!d->jobWatcher) {
         return;
     }
@@ -416,13 +426,13 @@ void PkTransaction::slotMediaChangeRequired(Transaction::MediaType type, const Q
 {
     Q_UNUSED(id)
 
-    m_handlingActionRequired = true;
+    d->handlingActionRequired = true;
     int ret = KMessageBox::questionYesNo(d->parentWindow,
                                          PkStrings::mediaMessage(type, text),
                                          i18n("A media change is required"),
                                          KStandardGuiItem::cont(),
                                          KStandardGuiItem::cancel());
-    m_handlingActionRequired = false;
+    d->handlingActionRequired = false;
 
     // if the user clicked continue we got yes
     if (ret == KMessageBox::Yes) {
@@ -441,12 +451,12 @@ void PkTransaction::slotRepoSignature(const QString &packageID,
                                       const QString &keyTimestamp,
                                       Transaction::SigType type)
 {
-    if (m_handlingActionRequired) {
+    if (d->handlingActionRequired) {
         // if its true means that we alread passed here
-        m_handlingActionRequired = false;
+        d->handlingActionRequired = false;
         return;
     } else {
-        m_handlingActionRequired = true;
+        d->handlingActionRequired = true;
     }
 
     RepoSig *repoSig = new RepoSig(packageID, repoName, keyUrl, keyUserid, keyId, keyFingerprint, keyTimestamp, type, d->parentWindow);
@@ -508,6 +518,7 @@ void PkTransaction::slotFinished(Transaction::Exit status)
             d->newPackages = d->simulateModel->packagesWithInfo(Transaction::InfoInstalling);
 
             requires = new Requirements(d->simulateModel, d->parentWindow);
+            requires->setDownloadSizeRemaining(d->downloadSizeRemaining);
             connect(requires, SIGNAL(accepted()), this, SLOT(requeueTransaction()));
             connect(requires, SIGNAL(rejected()), this, SLOT(reject()));
             if (requires->shouldShow()) {
@@ -563,19 +574,19 @@ void PkTransaction::slotFinished(Transaction::Exit status)
     case Transaction::ExitEulaRequired:
     case Transaction::ExitMediaChangeRequired:
         kDebug() << "finished KeyRequired or EulaRequired: " << status;
-        if (!m_handlingActionRequired) {
+        if (!d->handlingActionRequired) {
             kDebug() << "Not Handling Required Action";
             setExitStatus(Failed);
         }
         break;
     case Transaction::ExitCancelled:
         // Avoid crash in case we are showing an error
-        if (!m_showingError) {
+        if (!d->showingError) {
             setExitStatus(Cancelled);
         }
         break;
     case Transaction::ExitFailed:
-        if (!m_handlingActionRequired && !m_showingError) {
+        if (!d->handlingActionRequired && !d->showingError) {
             kDebug() << "Yep, we failed.";
             setExitStatus(Failed);
         }
@@ -589,7 +600,7 @@ void PkTransaction::slotFinished(Transaction::Exit status)
 
 PkTransaction::ExitStatus PkTransaction::exitStatus() const
 {
-    return m_exitStatus;
+    return d->exitStatus;
 }
 
 bool PkTransaction::isFinished() const
@@ -620,8 +631,8 @@ void PkTransaction::setExitStatus(PkTransaction::ExitStatus status)
         d->launcher = 0;
     }
 
-    m_exitStatus = status;
-    if (!m_handlingActionRequired || !m_showingError) {
+    d->exitStatus = status;
+    if (!d->handlingActionRequired || !d->showingError) {
         emit finished(status);
     }
 }
diff --git a/libapper/PkTransaction.h b/libapper/PkTransaction.h
index 52e2b5f..c330988 100644
--- a/libapper/PkTransaction.h
+++ b/libapper/PkTransaction.h
@@ -107,10 +107,6 @@ private:
     void showError(const QString &title, const QString &description, const QString &details = QString());
     void showSorry(const QString &title, const QString &description, const QString &details = QString());
 
-    bool m_handlingActionRequired;
-    bool m_showingError; //This might replace the above
-    ExitStatus m_exitStatus;
-    Transaction::Status m_status;
     PkTransactionPrivate *d;
 };
 
diff --git a/libapper/Requirements.cpp b/libapper/Requirements.cpp
index 0788b9f..7faf52c 100644
--- a/libapper/Requirements.cpp
+++ b/libapper/Requirements.cpp
@@ -26,6 +26,7 @@
 #include "ApplicationSortFilterModel.h"
 
 #include <QToolButton>
+#include <KPushButton>
 #include <KDebug>
 
 Requirements::Requirements(PackageModel *model, QWidget *parent) :
@@ -54,7 +55,7 @@ Requirements::Requirements(PackageModel *model, QWidget *parent) :
 
     setCaption(i18n("Additional changes"));
     setWindowIcon(KIcon("dialog-warning"));
-    setButtons(KDialog::Ok | KDialog::Cancel);
+    setButtons(KDialog::Ok | KDialog::Cancel | KDialog::Help);
     setButtonText(KDialog::Ok, i18n("Continue"));
     // restore size
     setMinimumSize(QSize(600,480));
@@ -63,6 +64,10 @@ Requirements::Requirements(PackageModel *model, QWidget *parent) :
     KConfigGroup requirementsDialog(&config, "requirementsDialog");
     restoreDialogSize(requirementsDialog);
 
+    button(KDialog::Help)->setFlat(true);
+    button(KDialog::Help)->setEnabled(false);
+    button(KDialog::Help)->setIcon(KIcon("download"));
+
     m_buttonGroup = new QButtonGroup(this);
     connect(m_buttonGroup, SIGNAL(buttonClicked(int)), this, SLOT(actionClicked(int)));
 
@@ -187,6 +192,21 @@ void Requirements::setEmbedded(bool embedded)
     ui->label->setVisible(!embedded);
 }
 
+void Requirements::setDownloadSizeRemaining(qulonglong size)
+{
+    if (size) {
+        QString text;
+        text = i18nc("how many bytes are required for download",
+                     "Need to get %1 of archives",
+                     KGlobal::locale()->formatByteSize(size));
+        button(KDialog::Help)->setText(text);
+        button(KDialog::Help)->setToolTip(text);
+        button(KDialog::Help)->show();
+    } else {
+        button(KDialog::Help)->hide();
+    }
+}
+
 bool Requirements::trusted() const
 {
     // There are untrusted packages if the button was created...
diff --git a/libapper/Requirements.h b/libapper/Requirements.h
index 938cf9c..1bd1e8b 100644
--- a/libapper/Requirements.h
+++ b/libapper/Requirements.h
@@ -40,6 +40,7 @@ public:
 
     bool embedded() const;
     void setEmbedded(bool embedded);
+    void setDownloadSizeRemaining(qulonglong size);
     bool trusted() const;
 
 public slots:
-- 
1.8.1

openSUSE Build Service is sponsored by