[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [Apper] a76bc26: Huge changes so now we don't have a dialog for the
From: Daniel Nicoletti <dantti85-pk () yahoo ! com ! br>
Date: 2011-01-13 15:28:42
Message-ID: 20110113152842.8F9BCA6090 () git ! kde ! org
[Download RAW message or body]
A libkpackagekit/PkTransactionDialog.h [License: UNKNOWN]
A libkpackagekit/PkTransactionDialog.cpp [License: UNKNOWN]
A libkpackagekit/PkTransaction.ui [License: Trivialfile.]
A libkpackagekit/PkTransaction.h [License: UNKNOWN]
A libkpackagekit/PkTransaction.cpp [License: UNKNOWN]
commit a76bc26047e0ecb9ba931b50f4c8f49fd3647390
Author: Daniel Nicoletti <dantti85-pk@yahoo.com.br>
Date: Thu Jan 13 13:26:28 2011 -0200
Huge changes so now we don't have a dialog for the transaction, it is embeded in \
the view
diff --git a/Apper/MainUi.cpp b/Apper/MainUi.cpp
index 91c5a46..ad2216b 100644
--- a/Apper/MainUi.cpp
+++ b/Apper/MainUi.cpp
@@ -20,6 +20,7 @@
#include "MainUi.h"
+#include <QLayout>
#include <KDebug>
#include <KConfig>
#include <KCModuleProxy>
diff --git a/ApperKCM/ApperKCM.cpp b/ApperKCM/ApperKCM.cpp
index 6e21eff..be40d53 100644
--- a/ApperKCM/ApperKCM.cpp
+++ b/ApperKCM/ApperKCM.cpp
@@ -48,6 +48,10 @@
#include <KDebug>
+#define BAR_SEARCH 0
+#define BAR_UPDATE 1
+#define BAR_TITLE 2
+
KCONFIGGROUP_DECLARE_ENUM_QOBJECT(Enum, Filter)
K_PLUGIN_FACTORY(KPackageKitFactory, registerPlugin<ApperKCM>();)
@@ -443,7 +447,8 @@ void ApperKCM::setPage(const QString &page)
emit changed(false);
stackedWidget->setCurrentWidget(m_settingsPage);
m_settingsPage->load();
- stackedWidgetBar->setCurrentIndex(2);
+ stackedWidgetBar->setCurrentIndex(BAR_TITLE);
+ titleL->clear();
backTB->setEnabled(true);
}
} else if (page == "updates" || page == "updatesSelected") {
@@ -465,7 +470,7 @@ void ApperKCM::setPage(const QString &page)
stackedWidget->setCurrentWidget(m_updaterPage);
m_updaterPage->setSelected(page == "updatesSelected");
m_updaterPage->load();
- stackedWidgetBar->setCurrentIndex(1);
+ stackedWidgetBar->setCurrentIndex(BAR_UPDATE);
backTB->setEnabled(true);
}
} else if (page == "home") {
@@ -500,7 +505,7 @@ void ApperKCM::on_backTB_clicked()
if (!canChangePage()) {
return;
}
- stackedWidgetBar->setCurrentIndex(0);
+ stackedWidgetBar->setCurrentIndex(BAR_SEARCH);
disconnect(m_updaterPage, SIGNAL(changed(bool)), this, \
SIGNAL(changed(bool))); checkChanged();
} else if (stackedWidget->currentWidget() == m_settingsPage) {
@@ -509,7 +514,7 @@ void ApperKCM::on_backTB_clicked()
}
setButtons(Apply);
emit changed(true); // THIS IS DUMB setButtons only take effect after \
changed goes true
- stackedWidgetBar->setCurrentIndex(0);
+ stackedWidgetBar->setCurrentIndex(BAR_SEARCH);
disconnect(m_settingsPage, SIGNAL(changed(bool)), this, \
SIGNAL(changed(bool))); checkChanged();
}
@@ -635,27 +640,98 @@ void ApperKCM::changed()
setCurrentActionEnabled(trans->allowCancel());
}
+void ApperKCM::updatePackages(PkTransaction *transaction)
+{
+ kDebug();
+ backTB->setEnabled(false);
+ stackedWidget->addWidget(transaction);
+ stackedWidgetBar->setCurrentIndex(BAR_TITLE);
+ connect(transaction, SIGNAL(titleChanged(const QString &)),
+ titleL, SLOT(setText(const QString &)));
+}
+
void ApperKCM::save()
{
kDebug() << stackedWidget->currentWidget() << m_updaterPage << m_settingsPage;
- if (stackedWidget->currentWidget() == m_updaterPage) {
- m_updaterPage->save();
- } else if (stackedWidget->currentWidget() == m_settingsPage) {
+
+ QWidget *currentWidget = stackedWidget->currentWidget();
+ if (currentWidget == m_settingsPage) {
m_settingsPage->save();
} else {
- QPointer<KpkReviewChanges> frm = new \
KpkReviewChanges(m_browseModel->selectedPackages(), this);
- connect(frm, SIGNAL(successfullyInstalled()), m_browseModel, \
SLOT(uncheckAvailablePackages()));
- connect(frm, SIGNAL(successfullyRemoved()), m_browseModel, \
SLOT(uncheckInstalledPackages())); + PkTransaction *transaction = new \
PkTransaction(0, this); + stackedWidget->addWidget(transaction);
+ stackedWidget->setCurrentWidget(transaction);
+ int oldBar = stackedWidgetBar->currentIndex();
+ stackedWidgetBar->setCurrentIndex(BAR_TITLE);
+ backTB->setEnabled(false);
+ connect(transaction, SIGNAL(titleChanged(const QString &)),
+ titleL, SLOT(setText(const QString &)));
+ emit changed(false);
+
+ QEventLoop loop;
+ connect(transaction, SIGNAL(finished(PkTransaction::ExitStatus)), &loop, \
SLOT(quit())); + if (currentWidget == m_updaterPage) {
+ transaction->updatePackages(m_updaterPage->packagesToUpdate());
+
+ // wait for the end of transaction
+ if (!transaction->isFinished()) {
+ loop.exec();
+ }
+ } else {
+ // install then remove packages
+ QList<QSharedPointer<PackageKit::Package> > removePackages;
+ QList<QSharedPointer<PackageKit::Package> > installPackages;
+ foreach (const QSharedPointer<PackageKit::Package> &p, \
m_browseModel->selectedPackages()) { + if (p->info() == \
Enum::InfoInstalled || + p->info() == \
Enum::InfoCollectionInstalled) { + // check what packages are \
installed and marked to be removed + removePackages << p;
+ } else if (p->info() == Enum::InfoAvailable ||
+ p->info() == Enum::InfoCollectionAvailable) {
+ // check what packages are available and marked to be installed
+ installPackages << p;
+ }
+ }
- frm->exec();
+ if (!installPackages.isEmpty()) {
+ transaction->installPackages(installPackages);
- // This avoid crashing as the above function does not always quit it's event \
loop
- if (!frm.isNull()) {
- frm->deleteLater();
+ // wait for the end of transaction
+ if (!transaction->isFinished()) {
+ loop.exec();
+ }
+
+ if (transaction->exitStatus() == PkTransaction::Success) {
+ m_browseModel->uncheckAvailablePackages();
+ }
+ }
+
+ if (!removePackages.isEmpty()) {
+ transaction->removePackages(removePackages);
+
+ // wait for the end of transaction
+ if (!transaction->isFinished()) {
+ loop.exec();
+ }
+ if (transaction->exitStatus() == PkTransaction::Success) {
+ m_browseModel->uncheckInstalledPackages();
+ }
+ }
+ }
+
+ // Finished setup old stuff
+ backTB->setEnabled(true);
+ stackedWidget->setCurrentWidget(currentWidget);
+ stackedWidgetBar->setCurrentIndex(oldBar);
+ transaction->deleteLater();
+ if (currentWidget == m_updaterPage) {
+ m_updaterPage->getUpdates();
+ } else {
+ // install then remove packages
search();
- QTimer::singleShot(0, this, SLOT(checkChanged()));
}
+ QTimer::singleShot(0, this, SLOT(checkChanged()));
}
}
diff --git a/ApperKCM/ApperKCM.h b/ApperKCM/ApperKCM.h
index 21b20fd..456eed4 100644
--- a/ApperKCM/ApperKCM.h
+++ b/ApperKCM/ApperKCM.h
@@ -23,6 +23,8 @@
#include "ui_ApperKCM.h"
+#include <PkTransaction.h>
+
#include <QtGui/QStandardItemModel>
#include <KCModule>
@@ -78,6 +80,8 @@ private slots:
void checkChanged();
void changed();
+
+ void updatePackages(PkTransaction *transaction);
private:
bool canChangePage();
diff --git a/ApperKCM/ApperKCM.ui b/ApperKCM/ApperKCM.ui
index 4b277e5..c6aef04 100644
--- a/ApperKCM/ApperKCM.ui
+++ b/ApperKCM/ApperKCM.ui
@@ -245,17 +245,11 @@
<number>0</number>
</property>
<item>
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>352</width>
- <height>20</height>
- </size>
+ <widget class="QLabel" name="titleL">
+ <property name="text">
+ <string notr="true">Some Title</string>
</property>
- </spacer>
+ </widget>
</item>
</layout>
</widget>
diff --git a/ApperKCM/Updater/Updater.cpp b/ApperKCM/Updater/Updater.cpp
index 09f3d1a..18d5bea 100644
--- a/ApperKCM/Updater/Updater.cpp
+++ b/ApperKCM/Updater/Updater.cpp
@@ -35,7 +35,6 @@
#include <ApplicationsDelegate.h>
#include <KpkStrings.h>
#include <KpkIcons.h>
-#include <KpkTransaction.h>
#include <KpkSimulateModel.h>
#include <KpkRequirements.h>
#include <KpkPackageModel.h>
@@ -200,83 +199,16 @@ void Updater::load()
}
}
-void Updater::getUpdatesFinished(Enum::Exit status)
+void Updater::getUpdatesFinished()
{
- Q_UNUSED(status)
m_updatesT = 0;
m_updatesModel->clearSelectedNotPresent();
checkEnableUpdateButton();
}
-void Updater::save()
+QList<QSharedPointer<PackageKit::Package> > Updater::packagesToUpdate() const
{
- // If the backend supports getRequires do it
- m_transDialog = 0;
- if (m_roles & Enum::RoleSimulateUpdatePackages) {
- QList<QSharedPointer<PackageKit::Package> > selectedPackages;
- selectedPackages = m_updatesModel->selectedPackages();
- Transaction *t = m_client->simulateUpdatePackages(selectedPackages);
- if (t->error()) {
- KMessageBox::sorry(this, KpkStrings::daemonError(t->error()));
- } else {
- m_transDialog = new KpkTransaction(0, KpkTransaction::Modal, this);
- m_transDialog->setPackages(selectedPackages);
- m_transDialog->setTransaction(t); // Set it after the packages so they \
get skiped
- connect(m_transDialog, SIGNAL(finished(KpkTransaction::ExitStatus)),
- this, SLOT(transactionFinished(KpkTransaction::ExitStatus)));
- m_transDialog->show();
- }
- } else {
- updatePackages();
- }
- QTimer::singleShot(0, this, SLOT(checkEnableUpdateButton()));
-}
-
-void Updater::transactionFinished(KpkTransaction::ExitStatus status)
-{
- if (status == KpkTransaction::Success &&
- m_transDialog->role() == Enum::RoleSimulateUpdatePackages) {
- if (m_transDialog->simulateModel()->rowCount() > 0) {
- KpkRequirements *req = new \
KpkRequirements(m_transDialog->simulateModel(),
- m_transDialog);
- connect(req, SIGNAL(accepted()), this, SLOT(updatePackages()));
- connect(req, SIGNAL(rejected()), m_transDialog, SLOT(reject()));
- req->show();
- } else {
- updatePackages();
- }
- } else {
- getUpdates();
- m_transDialog->deleteLater();
- checkEnableUpdateButton();
- }
-}
-
-void Updater::updatePackages()
-{
- QList<QSharedPointer<PackageKit::Package> > packages;
- if (m_transDialog) {
- packages = m_transDialog->packages();
- } else {
- packages = m_updatesModel->selectedPackages();
- m_transDialog = new KpkTransaction(0, KpkTransaction::Modal, this);
- connect(m_transDialog, SIGNAL(finished(KpkTransaction::ExitStatus)),
- this, SLOT(transactionFinished(KpkTransaction::ExitStatus)));
- m_transDialog->setPackages(packages); // Set Packages for requeue
- }
-
- SET_PROXY
- QString socket;
- socket = "/tmp/kpk_debconf_" + \
QString::number(QCoreApplication::applicationPid());
- m_client->setHints("frontend-socket=" + socket);
- Transaction *t = m_client->updatePackages(true, packages);
- if (t->error()) {
- KMessageBox::sorry(this, KpkStrings::daemonError(t->error()));
- } else {
- m_transDialog->setTransaction(t);
- m_transDialog->setupDebconfDialog(socket);
- m_transDialog->show();
- }
+ return m_updatesModel->selectedPackages();
}
void Updater::getUpdates()
@@ -301,7 +233,7 @@ void Updater::getUpdates()
connect(m_updatesT, SIGNAL(errorCode(PackageKit::Enum::Error, const QString &)),
this, SLOT(errorCode(PackageKit::Enum::Error, const QString &)));
connect(m_updatesT, SIGNAL(finished(PackageKit::Enum::Exit, uint)),
- this, SLOT(getUpdatesFinished(PackageKit::Enum::Exit)));
+ this, SLOT(getUpdatesFinished()));
connect(m_updatesT, SIGNAL(finished(PackageKit::Enum::Exit, uint)),
m_busySeq, SLOT(stop()));
connect(m_updatesT, SIGNAL(finished(PackageKit::Enum::Exit, uint)),
@@ -339,8 +271,8 @@ void Updater::refreshCache()
this, SLOT(getUpdates()));
t->refreshCache(true);
- KpkTransaction *frm = new KpkTransaction(t,
- KpkTransaction::Modal | \
KpkTransaction::CloseOnFinish, + PkTransactionDialog *frm = new \
PkTransactionDialog(t, + \
PkTransactionDialog::Modal | PkTransactionDialog::CloseOnFinish, this);
if (t->error()) {
KMessageBox::sorry(this, KpkStrings::daemonError(t->error()));
diff --git a/ApperKCM/Updater/Updater.h b/ApperKCM/Updater/Updater.h
index 69df439..8caa06e 100644
--- a/ApperKCM/Updater/Updater.h
+++ b/ApperKCM/Updater/Updater.h
@@ -23,7 +23,7 @@
#include "ui_Updater.h"
-#include <KpkTransaction.h>
+#include <PkTransactionDialog.h>
using namespace PackageKit;
@@ -39,25 +39,22 @@ public:
bool hasChanges() const;
void setSelected(bool selected);
+ QList<QSharedPointer<PackageKit::Package> > packagesToUpdate() const;
signals:
void changed(bool);
public slots:
void load();
- void save();
void refreshCache();
+ void getUpdates();
private slots:
void on_packageView_customContextMenuRequested(const QPoint &pos);
void distroUpgrade(PackageKit::Enum::DistroUpgrade type, const QString &name, \
const QString &description);
- void getUpdates();
- void getUpdatesFinished(PackageKit::Enum::Exit status);
-
- void updatePackages();
- void transactionFinished(KpkTransaction::ExitStatus status);
+ void getUpdatesFinished();
void on_packageView_clicked(const QModelIndex &index);
@@ -74,7 +71,7 @@ private:
CheckableHeader *m_header;
QAction *m_showPackageVersion;
QAction *m_showPackageArch;
- KpkTransaction *m_transDialog;
+ PkTransactionDialog *m_transDialog;
KPixmapSequenceOverlayPainter *m_busySeq;
Client *m_client;
Transaction *m_updatesT;
diff --git a/SmartIcon/KpkAbstractTask.cpp b/SmartIcon/KpkAbstractTask.cpp
index 5526b59..fd4db4b 100644
--- a/SmartIcon/KpkAbstractTask.cpp
+++ b/SmartIcon/KpkAbstractTask.cpp
@@ -66,10 +66,10 @@ KpkAbstractTask::KpkAbstractTask(uint xid, const QString \
&interaction, const QDB setExec(cmdline);
}
- m_transaction = new KpkTransaction(0, KpkTransaction::Modal);
+ m_transaction = new PkTransactionDialog(0, PkTransactionDialog::Modal);
KWindowSystem::setMainWindow(m_transaction, m_xid);
- connect(m_transaction, SIGNAL(finished(KpkTransaction::ExitStatus)),
- this, SLOT(transactionFinished(KpkTransaction::ExitStatus)));
+ connect(m_transaction, SIGNAL(finished(PkTransactionDialog::ExitStatus)),
+ this, SLOT(transactionFinished(PkTransactionDialog::ExitStatus)));
}
void KpkAbstractTask::setExec(const QString &exec)
@@ -212,7 +212,7 @@ uint KpkAbstractTask::parentWId() const
return m_xid;
}
-KpkTransaction* KpkAbstractTask::kTransaction() const
+PkTransactionDialog* KpkAbstractTask::kTransaction() const
{
return m_transaction;
}
@@ -283,7 +283,7 @@ void KpkAbstractTask::parseInteraction(const QString \
&interaction) }
}
-void KpkAbstractTask::transactionFinished(KpkTransaction::ExitStatus)
+void KpkAbstractTask::transactionFinished(PkTransaction::ExitStatus)
{
}
diff --git a/SmartIcon/KpkAbstractTask.h b/SmartIcon/KpkAbstractTask.h
index 0d4d045..0b41df2 100644
--- a/SmartIcon/KpkAbstractTask.h
+++ b/SmartIcon/KpkAbstractTask.h
@@ -23,7 +23,7 @@
#include <kdemacros.h>
#include <KpkReviewChanges.h>
-#include <KpkTransaction.h>
+#include <PkTransactionDialog.h>
#include <QDBusMessage>
#include <QWidget>
@@ -73,14 +73,14 @@ signals:
void finished();
protected slots:
- virtual void transactionFinished(KpkTransaction::ExitStatus status);
+ virtual void transactionFinished(PkTransaction::ExitStatus status);
protected:
void finishTaskOk();
void sendErrorFinished(DBusError error, const QString &msg);
bool sendMessageFinished(const QDBusMessage &message);
uint parentWId() const;
- KpkTransaction* kTransaction() const;
+ PkTransactionDialog* kTransaction() const;
QString parentTitle;
private:
@@ -89,7 +89,7 @@ private:
QDBusMessage m_message;
Interactions m_interactions;
uint m_timeout;
- KpkTransaction *m_transaction;
+ PkTransactionDialog *m_transaction;
void parseInteraction(const QString &interaction);
uint getPidSystem();
diff --git a/SmartIcon/KpkTransactionTrayIcon.cpp \
b/SmartIcon/KpkTransactionTrayIcon.cpp index bc881c1..2923613 100644
--- a/SmartIcon/KpkTransactionTrayIcon.cpp
+++ b/SmartIcon/KpkTransactionTrayIcon.cpp
@@ -23,7 +23,7 @@
#include "TransactionTrayIcon.h"
#include <KpkStrings.h>
-#include <KpkTransaction.h>
+#include <PkTransactionDialog.h>
#include <KpkIcons.h>
#include <KpkImportance.h>
#include <KpkEnum.h>
@@ -121,7 +121,7 @@ void \
KpkTransactionTrayIcon::createTransactionDialog(PackageKit::Transaction *t)
increaseRunning();
// we need to close on finish otherwise smart-icon will timeout
- KpkTransaction *trans = new KpkTransaction(t, KpkTransaction::CloseOnFinish);
+ PkTransactionDialog *trans = new PkTransactionDialog(t, \
PkTransactionDialog::CloseOnFinish); // Connect to finished since the transaction \
may fail // due to GPG or EULA and we can't handle this here..
connect(trans, SIGNAL(finished()),
@@ -133,8 +133,8 @@ void \
KpkTransactionTrayIcon::createTransactionDialog(PackageKit::Transaction *t)
void KpkTransactionTrayIcon::transactionDialogClosed()
{
- KpkTransaction *trans = qobject_cast<KpkTransaction*>(sender());
- m_transDialogs.remove(trans->tid());
+ PkTransactionDialog *trans = qobject_cast<PkTransactionDialog*>(sender());
+ m_transDialogs.remove(trans->transaction()->tid());
// DO NOT delete the kpkTransaction it might have errors to print
decreaseRunning();
}
diff --git a/SmartIcon/KpkTransactionTrayIcon.h b/SmartIcon/KpkTransactionTrayIcon.h
index 0f6e25b..cecc309 100644
--- a/SmartIcon/KpkTransactionTrayIcon.h
+++ b/SmartIcon/KpkTransactionTrayIcon.h
@@ -29,7 +29,7 @@
using namespace PackageKit;
-class KpkTransaction;
+class PkTransactionDialog;
class TransactionTrayIcon;
class KpkTransactionTrayIcon : public KpkAbstractIsRunning
{
@@ -68,7 +68,7 @@ private:
TransactionTrayIcon *m_trayIcon;
Client *m_client;
- QHash<QString, KpkTransaction *> m_transDialogs;
+ QHash<QString, PkTransactionDialog *> m_transDialogs;
Transaction *m_currentTransaction;
diff --git a/SmartIcon/PkInstallCatalogs.h b/SmartIcon/PkInstallCatalogs.h
index 5b973ff..7dd7329 100644
--- a/SmartIcon/PkInstallCatalogs.h
+++ b/SmartIcon/PkInstallCatalogs.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2010 by Daniel Nicoletti *
+ * Copyright (C) 2009-2011 by Daniel Nicoletti *
* dantti85-pk@yahoo.com.br *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -22,12 +22,10 @@
#define PK_INSTALL_CATALOGS_H
#include "KpkAbstractTask.h"
-#include <KpkTransaction.h>
+
#include <QPackageKit>
#include <QDBusMessage>
-class KpkTransaction;
-
using namespace PackageKit;
class PkInstallCatalogs : public KpkAbstractTask
diff --git a/SmartIcon/PkInstallFontconfigResources.cpp \
b/SmartIcon/PkInstallFontconfigResources.cpp index 57ab5b8..ce0a2a8 100644
--- a/SmartIcon/PkInstallFontconfigResources.cpp
+++ b/SmartIcon/PkInstallFontconfigResources.cpp
@@ -21,7 +21,6 @@
#include "PkInstallFontconfigResources.h"
#include <KpkReviewChanges.h>
-#include <KpkTransaction.h>
#include <KpkStrings.h>
#include <KLocale>
diff --git a/SmartIcon/PkInstallGStreamerResources.cpp \
b/SmartIcon/PkInstallGStreamerResources.cpp index c9c21f0..36c0a30 100644
--- a/SmartIcon/PkInstallGStreamerResources.cpp
+++ b/SmartIcon/PkInstallGStreamerResources.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2010 by Daniel Nicoletti *
+ * Copyright (C) 2009-2011 by Daniel Nicoletti *
* dantti85-pk@yahoo.com.br *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -21,7 +21,6 @@
#include "PkInstallGStreamerResources.h"
#include <KpkReviewChanges.h>
-#include <KpkTransaction.h>
#include <KpkStrings.h>
#include <KLocale>
diff --git a/SmartIcon/PkInstallMimeTypes.cpp b/SmartIcon/PkInstallMimeTypes.cpp
index 65f29a1..666307b 100644
--- a/SmartIcon/PkInstallMimeTypes.cpp
+++ b/SmartIcon/PkInstallMimeTypes.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2010 by Daniel Nicoletti *
+ * Copyright (C) 2009-2011 by Daniel Nicoletti *
* dantti85-pk@yahoo.com.br *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -21,7 +21,6 @@
#include "PkInstallMimeTypes.h"
#include <KpkReviewChanges.h>
-#include <KpkTransaction.h>
#include <KpkStrings.h>
#include <KLocale>
diff --git a/SmartIcon/PkInstallMimeTypes.h b/SmartIcon/PkInstallMimeTypes.h
index ec5db58..0163c31 100644
--- a/SmartIcon/PkInstallMimeTypes.h
+++ b/SmartIcon/PkInstallMimeTypes.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2010 by Daniel Nicoletti *
+ * Copyright (C) 2009-2011 by Daniel Nicoletti *
* dantti85-pk@yahoo.com.br *
* *
* This program is free software; you can redistribute it and/or modify *
diff --git a/SmartIcon/PkInstallPackageFiles.cpp \
b/SmartIcon/PkInstallPackageFiles.cpp index 0c89aea..f1e3383 100644
--- a/SmartIcon/PkInstallPackageFiles.cpp
+++ b/SmartIcon/PkInstallPackageFiles.cpp
@@ -170,6 +170,7 @@ void PkInstallPackageFiles::start()
void PkInstallPackageFiles::installFiles()
{
+ //TODO move to PkTransaction
SET_PROXY
QString socket;
socket = "/tmp/kpk_debconf_" + \
QString::number(QCoreApplication::applicationPid()); @@ -186,17 +187,17 @@ void \
PkInstallPackageFiles::installFiles() sendErrorFinished(Failed, \
KpkStrings::daemonError(t->error())); } else {
kTransaction()->setTransaction(t);
- kTransaction()->setupDebconfDialog(socket);
+// kTransaction()->setupDebconfDialog(socket);
kTransaction()->setFiles(m_files);
kTransaction()->show();
}
}
-void PkInstallPackageFiles::transactionFinished(KpkTransaction::ExitStatus status)
+void PkInstallPackageFiles::transactionFinished(PkTransaction::ExitStatus status)
{
kDebug() << "Finished.";
- if (kTransaction()->role() == Enum::RoleSimulateInstallFiles) {
- if (status == KpkTransaction::Success) {
+ if (kTransaction()->transaction()->role() == Enum::RoleSimulateInstallFiles) {
+ if (status == PkTransaction::Success) {
if (m_installFilesModel->rowCount() > 0) {
QPointer<KpkRequirements> frm = new \
KpkRequirements(m_installFilesModel); if (frm->exec() == QDialog::Accepted) {
@@ -209,32 +210,32 @@ void \
PkInstallPackageFiles::transactionFinished(KpkTransaction::ExitStatus statu \
installFiles(); }
} else {
- sendErrorFinished(Failed, kTransaction()->errorDetails());
+ sendErrorFinished(Failed, \
kTransaction()->transaction()->errorDetails()); }
} else {
switch (status) {
- case KpkTransaction::Success :
+ case PkTransaction::Success :
if (showFinished()) {
KMessageBox::informationWId(parentWId(),
i18np("File was installed successfully",
"Files were installed \
successfully",
- kTransaction()->files().count()),
+ \
kTransaction()->transaction()->files().count()),
i18np("File was installed successfully",
"Files were installed \
successfully",
- kTransaction()->files().count()));
+ \
kTransaction()->transaction()->files().count())); }
finishTaskOk();
break;
- case KpkTransaction::Cancelled :
+ case PkTransaction::Cancelled :
sendErrorFinished(Cancelled, "Aborted");
break;
- case KpkTransaction::Failed :
+ case PkTransaction::Failed :
if (showWarning()) {
KMessageBox::errorWId(parentWId(),
- kTransaction()->errorDetails(),
+ kTransaction()->transaction()->errorDetails(),
i18n("KPackageKit Error"));
}
- sendErrorFinished(Failed, kTransaction()->errorDetails());
+ sendErrorFinished(Failed, \
kTransaction()->transaction()->errorDetails()); break;
}
}
diff --git a/SmartIcon/PkInstallPackageFiles.h b/SmartIcon/PkInstallPackageFiles.h
index e4d2a54..610469a 100644
--- a/SmartIcon/PkInstallPackageFiles.h
+++ b/SmartIcon/PkInstallPackageFiles.h
@@ -22,6 +22,7 @@
#define PK_INSTALL_PACKAGE_FILES_H
#include "KpkAbstractTask.h"
+#include "PkTransactionDialog.h"
#include <QPackageKit>
using namespace PackageKit;
@@ -42,7 +43,7 @@ public slots:
void start();
private slots:
- void transactionFinished(KpkTransaction::ExitStatus status);
+ void transactionFinished(PkTransaction::ExitStatus status);
private:
void installFiles();
diff --git a/SmartIcon/PkInstallPackageNames.cpp \
b/SmartIcon/PkInstallPackageNames.cpp index 63534c8..9cc24be 100644
--- a/SmartIcon/PkInstallPackageNames.cpp
+++ b/SmartIcon/PkInstallPackageNames.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2010 by Daniel Nicoletti *
+ * Copyright (C) 2009-2011 by Daniel Nicoletti *
* dantti85-pk@yahoo.com.br *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -21,7 +21,6 @@
#include "PkInstallPackageNames.h"
#include <KpkReviewChanges.h>
-#include <KpkTransaction.h>
#include <KpkStrings.h>
#include <KLocale>
diff --git a/SmartIcon/PkInstallPrinterDrivers.cpp \
b/SmartIcon/PkInstallPrinterDrivers.cpp index 99379b2..9ca281a 100644
--- a/SmartIcon/PkInstallPrinterDrivers.cpp
+++ b/SmartIcon/PkInstallPrinterDrivers.cpp
@@ -1,5 +1,5 @@
/**************************************************************************
-* Copyright (C) 2009-2010 by Daniel Nicoletti *
+* Copyright (C) 2009-2011 by Daniel Nicoletti *
* dantti85-pk@yahoo.com.br *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -22,7 +22,6 @@
#include <KpkReviewChanges.h>
#include <KpkStrings.h>
-#include <KpkTransaction.h>
#include <KLocale>
#include <KMessageBox>
diff --git a/SmartIcon/PkInstallProvideFiles.cpp \
b/SmartIcon/PkInstallProvideFiles.cpp index 0d90f0d..4587255 100644
--- a/SmartIcon/PkInstallProvideFiles.cpp
+++ b/SmartIcon/PkInstallProvideFiles.cpp
@@ -21,7 +21,6 @@
#include "PkInstallProvideFiles.h"
#include <KpkReviewChanges.h>
-#include <KpkTransaction.h>
#include <KpkStrings.h>
#include <KLocale>
diff --git a/SmartIcon/PkIsInstalled.cpp b/SmartIcon/PkIsInstalled.cpp
index 043856b..d9895b8 100644
--- a/SmartIcon/PkIsInstalled.cpp
+++ b/SmartIcon/PkIsInstalled.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2010 by Daniel Nicoletti *
+ * Copyright (C) 2009-2011 by Daniel Nicoletti *
* dantti85-pk@yahoo.com.br *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -20,7 +20,6 @@
#include "PkIsInstalled.h"
-#include <KpkTransaction.h>
#include <KpkStrings.h>
#include <KMessageBox>
diff --git a/SmartIcon/PkIsInstalled.h b/SmartIcon/PkIsInstalled.h
index 5344129..719c25f 100644
--- a/SmartIcon/PkIsInstalled.h
+++ b/SmartIcon/PkIsInstalled.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2010 by Daniel Nicoletti *
+ * Copyright (C) 2009-2011 by Daniel Nicoletti *
* dantti85-pk@yahoo.com.br *
* *
* This program is free software; you can redistribute it and/or modify *
diff --git a/SmartIcon/PkRemovePackageByFiles.cpp \
b/SmartIcon/PkRemovePackageByFiles.cpp index 9169dd1..abf0adc 100644
--- a/SmartIcon/PkRemovePackageByFiles.cpp
+++ b/SmartIcon/PkRemovePackageByFiles.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2010 by Daniel Nicoletti *
+ * Copyright (C) 2009-2011 by Daniel Nicoletti *
* dantti85-pk@yahoo.com.br *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -22,6 +22,7 @@
#include <KpkReviewChanges.h>
#include <KpkStrings.h>
+#include <PkTransactionDialog.h>
#include <KLocale>
#include <KMessageBox>
diff --git a/SmartIcon/PkRemovePackageByFiles.h b/SmartIcon/PkRemovePackageByFiles.h
index 198f0e3..1206207 100644
--- a/SmartIcon/PkRemovePackageByFiles.h
+++ b/SmartIcon/PkRemovePackageByFiles.h
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2010 by Daniel Nicoletti *
+ * Copyright (C) 2009-2011 by Daniel Nicoletti *
* dantti85-pk@yahoo.com.br *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -21,7 +21,6 @@
#ifndef PK_REMOVE_PACKAGE_BY_FILES_H
#define PK_REMOVE_PACKAGE_BY_FILES_H
-#include <KpkTransaction.h>
#include <KpkAbstractTask.h>
#include <QPackageKit>
diff --git a/SmartIcon/PkSearchFile.cpp b/SmartIcon/PkSearchFile.cpp
index 59c6d79..be7d5cf 100644
--- a/SmartIcon/PkSearchFile.cpp
+++ b/SmartIcon/PkSearchFile.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2009-2010 by Daniel Nicoletti *
+ * Copyright (C) 2009-2011 by Daniel Nicoletti *
* dantti85-pk@yahoo.com.br *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -20,8 +20,6 @@
#include "PkSearchFile.h"
-#include <KpkTransaction.h>
-
#include <KpkStrings.h>
#include <KLocale>
diff --git a/libkpackagekit/CMakeLists.txt b/libkpackagekit/CMakeLists.txt
index 7428367..15ef8f3 100644
--- a/libkpackagekit/CMakeLists.txt
+++ b/libkpackagekit/CMakeLists.txt
@@ -8,7 +8,8 @@ set(libkpk_SRCS
KpkDelegate.cpp
TransactionDelegate.cpp
ProgressView.cpp
- KpkTransaction.cpp
+ PkTransaction.cpp
+ PkTransactionDialog.cpp
KpkRepoSig.cpp
KpkLicenseAgreement.cpp
KpkPackageModel.cpp
@@ -24,7 +25,7 @@ set(libkpk_SRCS
kde4_add_ui_files(libkpk_SRCS
ApplicationLauncher.ui
- KpkTransaction.ui
+ PkTransaction.ui
KpkRepoSig.ui
KpkLicenseAgreement.ui
KpkReviewChanges.ui
diff --git a/libkpackagekit/KpkReviewChanges.cpp \
b/libkpackagekit/KpkReviewChanges.cpp index 9671f95..48779b1 100644
--- a/libkpackagekit/KpkReviewChanges.cpp
+++ b/libkpackagekit/KpkReviewChanges.cpp
@@ -32,7 +32,7 @@
#include "KpkRequirements.h"
#include "KpkSimulateModel.h"
#include "KpkPackageModel.h"
-#include "KpkTransaction.h"
+#include "PkTransactionDialog.h"
#include "KpkDelegate.h"
#include "ui_KpkReviewChanges.h"
@@ -50,12 +50,11 @@ public:
QList<QSharedPointer<PackageKit::Package> > remPackages;
QList<QSharedPointer<PackageKit::Package> > addPackages;
- QList<QSharedPointer<PackageKit::Package> > reqDepPackages;
Enum::Roles actions;
uint parentWId;
- KpkTransaction *transactionDialog;
+ PkTransactionDialog *transactionDialog;
};
KpkReviewChanges::KpkReviewChanges(const QList<QSharedPointer<PackageKit::Package> > \
&packages, @@ -169,11 +168,11 @@ void KpkReviewChanges::doAction()
d->actions = d->client->actions();
if (!d->addPackages.isEmpty() || !d->remPackages.isEmpty()) {
- d->transactionDialog = new KpkTransaction(0,
- KpkTransaction::Modal,
+ d->transactionDialog = new PkTransactionDialog(0,
+ PkTransactionDialog::Modal,
transParent);
- connect(d->transactionDialog, SIGNAL(finished(KpkTransaction::ExitStatus)),
- this, SLOT(transactionFinished(KpkTransaction::ExitStatus)));
+ connect(d->transactionDialog, SIGNAL(finished(PkTransaction::ExitStatus)),
+ this, SLOT(transactionFinished(PkTransaction::ExitStatus)));
if (d->parentWId) {
KWindowSystem::setMainWindow(d->transactionDialog, d->parentWId);
}
@@ -187,143 +186,30 @@ void KpkReviewChanges::doAction()
void KpkReviewChanges::checkTask()
{
-// kDebug() << "AddPackages" << !d->addPackages.isEmpty()
-// << "RemovePackages" << !d->remPackages.isEmpty();
if (!d->remPackages.isEmpty()) {
- if (d->actions & Enum::RoleRemovePackages) {
- if (d->actions & Enum::RoleSimulateRemovePackages/* &&
- !(m_flags & HideConfirmDeps)*/) { //TODO we need admin to lock this \
down
- d->reqDepPackages = d->remPackages;
- d->removePkgModel = new KpkSimulateModel(this, d->reqDepPackages);
- // Create the requirements transaction and it's model
- Transaction *trans;
- trans = d->client->simulateRemovePackages(d->reqDepPackages, \
AUTOREMOVE);
- if (trans->error()) {
- KMessageBox::sorry(this,
- KpkStrings::daemonError(trans->error()),
- i18n("Failed to simulate package removal"));
- taskDone(Enum::RoleRemovePackages);
- } else {
- d->transactionDialog->setTransaction(trans);
- connect(trans, \
SIGNAL(package(QSharedPointer<PackageKit::Package>)),
- d->removePkgModel, \
SLOT(addPackage(QSharedPointer<PackageKit::Package>)));
- }
- } else {
- // As we can't check for requires don't allow deps removal
- removePackages(false);
- }
- } else {
- KMessageBox::error(this, i18n("The current backend does not support \
removing packages."), i18n("KPackageKit Error"));
- taskDone(Enum::RoleRemovePackages);
- }
+ d->transactionDialog->transaction()->removePackages(d->remPackages);
} else if (!d->addPackages.isEmpty()) {
- if (d->actions & Enum::RoleInstallPackages) {
- if (d->actions & Enum::RoleSimulateInstallPackages &&
- !(m_flags & HideConfirmDeps)) {
- d->reqDepPackages = d->addPackages;
- d->installPkgModel = new KpkSimulateModel(this, d->reqDepPackages);
- // Create the depends transaction and it's model
- Transaction *trans;
- trans = d->client->simulateInstallPackages(d->reqDepPackages);
- if (trans->error()) {
- KMessageBox::sorry(this,
- KpkStrings::daemonError(trans->error()),
- i18n("Failed to simulate package install"));
- taskDone(Enum::RoleInstallPackages);
- } else {
- d->transactionDialog->setTransaction(trans);
- connect(trans, \
SIGNAL(package(QSharedPointer<PackageKit::Package>)),
- d->installPkgModel, \
SLOT(addPackage(QSharedPointer<PackageKit::Package>)));
- }
- } else {
- installPackages();
- }
- } else {
- KMessageBox::error(this, i18n("Current backend does not support \
installing packages."), i18n("KPackageKit Error"));
- taskDone(Enum::RoleInstallPackages);
- }
+ d->transactionDialog->transaction()->installPackages(d->addPackages);
} else {
slotButtonClicked(KDialog::Ok);
}
}
-void KpkReviewChanges::installPackages()
-{
- SET_PROXY
- QString socket;
- socket = "/tmp/kpk_debconf_" + \
QString::number(QCoreApplication::applicationPid());
- d->client->setHints("frontend-socket=" + socket);
- Transaction *trans = d->client->installPackages(true, d->addPackages);
- if (trans->error()) {
- KMessageBox::sorry(this,
- KpkStrings::daemonError(trans->error()),
- i18n("Failed to install package"));
- taskDone(Enum::RoleInstallPackages);
- } else {
- d->transactionDialog->setTransaction(trans);
- d->transactionDialog->setupDebconfDialog(socket);
- d->transactionDialog->setPackages(d->addPackages);
- }
-}
-
-void KpkReviewChanges::removePackages(bool allowDeps)
+void KpkReviewChanges::transactionFinished(PkTransaction::ExitStatus status)
{
- SET_PROXY
- QString socket;
- socket = "/tmp/kpk_debconf_" + \
QString::number(QCoreApplication::applicationPid());
- d->client->setHints("frontend-socket=" + socket);
- Transaction *trans = d->client->removePackages(d->remPackages, allowDeps, \
AUTOREMOVE);
- if (trans->error()) {
- KMessageBox::sorry(this,
- KpkStrings::daemonError(trans->error()),
- i18n("Failed to remove package"));
- taskDone(Enum::RoleRemovePackages);
- } else {
- d->transactionDialog->setTransaction(trans);
- d->transactionDialog->setupDebconfDialog(socket);
- d->transactionDialog->setAllowDeps(allowDeps);
- d->transactionDialog->setPackages(d->remPackages);
- }
-}
-
-void KpkReviewChanges::transactionFinished(KpkTransaction::ExitStatus status)
-{
- KpkTransaction *trans = qobject_cast<KpkTransaction*>(sender());
- if (status == KpkTransaction::Success) {
- switch (trans->role()) {
- case Enum::RoleSimulateRemovePackages:
- if (d->removePkgModel->rowCount() > 0) {
- KpkRequirements *req = new KpkRequirements(d->removePkgModel,
- d->transactionDialog);
- connect(req, SIGNAL(accepted()), this, SLOT(removePackages()));
- connect(req, SIGNAL(rejected()), this, SLOT(reject()));
- req->show();
- } else {
- // As there was no requires don't allow deps removal
- removePackages(false);
- }
- break;
- case Enum::RoleSimulateInstallPackages:
- if (d->installPkgModel->rowCount() > 0) {
- KpkRequirements *req = new KpkRequirements(d->installPkgModel,
- d->transactionDialog);
- connect(req, SIGNAL(accepted()), this, SLOT(installPackages()));
- connect(req, SIGNAL(rejected()), this, SLOT(reject()));
- req->show();
- } else {
- installPackages();
- }
- break;
+ PkTransactionDialog *trans = qobject_cast<PkTransactionDialog*>(sender());
+ if (status == PkTransaction::Success) {
+ switch (trans->transaction()->role()) {
case Enum::RoleRemovePackages:
emit successfullyRemoved();
- taskDone(trans->role());
+ taskDone(trans->transaction()->role());
break;
case Enum::RoleInstallPackages:
emit successfullyInstalled();
- taskDone(trans->role());
+ taskDone(trans->transaction()->role());
break;
default:
- kWarning() << "Role not Handled" << trans->role();
+ kWarning() << "Role not Handled" << trans->transaction()->role();
break;
}
} else {
diff --git a/libkpackagekit/KpkReviewChanges.h b/libkpackagekit/KpkReviewChanges.h
index 1620b2c..03795e0 100644
--- a/libkpackagekit/KpkReviewChanges.h
+++ b/libkpackagekit/KpkReviewChanges.h
@@ -24,7 +24,7 @@
#include <KDialog>
#include <QPackageKit>
-#include "KpkTransaction.h"
+#include "PkTransactionDialog.h"
using namespace PackageKit;
@@ -56,10 +56,7 @@ signals:
void successfullyRemoved();
private slots:
- void installPackages();
- void removePackages(bool allow_deps = true);
-
- void transactionFinished(KpkTransaction::ExitStatus status);
+ void transactionFinished(PkTransaction::ExitStatus status);
void doAction();
void checkChanged();
diff --git a/libkpackagekit/KpkTransaction.cpp b/libkpackagekit/KpkTransaction.cpp
deleted file mode 100644
index 85d1fa3..0000000
--- a/libkpackagekit/KpkTransaction.cpp
+++ /dev/null
@@ -1,749 +0,0 @@
-/***************************************************************************
- * Copyright (C) 2008-2010 by Daniel Nicoletti *
- * dantti85-pk@yahoo.com.br *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; see the file COPYING. If not, write to *
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
- * Boston, MA 02110-1301, USA. *
- ***************************************************************************/
-
-#include <config.h>
-
-#include "KpkTransaction.h"
-
-#include <KLocale>
-#include <KMessageBox>
-#include <KPushButton>
-#include <KService>
-#include <KPixmapSequence>
-#include <KPixmapSequenceOverlayPainter>
-
-#include <KDebug>
-
-#include <QPropertyAnimation>
-#include <QtDBus/QDBusMessage>
-#include <QtDBus/QDBusConnection>
-#include <QtGui/QTreeView>
-
-#include "KpkMacros.h"
-#include "KpkEnum.h"
-#include "KpkStrings.h"
-#include "KpkRepoSig.h"
-#include "KpkLicenseAgreement.h"
-#include "KpkIcons.h"
-#include "ProgressView.h"
-#include "ApplicationLauncher.h"
-#include "KpkSimulateModel.h"
-
-#include "ui_KpkTransaction.h"
-
-class KpkTransactionPrivate
-{
-public:
- Ui::KpkTransaction ui;
-
- QString tid;
- bool showDetails;
- bool finished;
- bool allowDeps;
- bool onlyTrusted;
- Enum::Role role;
- Enum::Error error;
- QString errorDetails;
- QList<QSharedPointer<PackageKit::Package> > packages;
- QStringList files;
- QVector<KService*> applications;
- KpkSimulateModel *simulateModel;
- ProgressView *progressView;
- KPixmapSequenceOverlayPainter *busySeq;
-
- void clearApplications()
- {
- while (!applications.isEmpty()) {
- delete applications.at(0);
- applications.remove(0);
- }
- }
-};
-
-KpkTransaction::KpkTransaction(Transaction *trans, Behaviors flags, QWidget *parent)
- : KDialog(parent),
- m_trans(trans),
- m_handlingActionRequired(false),
- m_showingError(false),
- m_flags(flags),
- m_exitStatus(Success),
- m_status(Enum::UnknownStatus),
- d(new KpkTransactionPrivate)
-{
- d->ui.setupUi(mainWidget());
-
- d->busySeq = new KPixmapSequenceOverlayPainter(this);
- d->busySeq->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
- d->busySeq->setWidget(d->ui.label);
- d->ui.label->clear();
-
- d->finished = true; // for sanity we are finished till some transaction is set
- d->onlyTrusted = true; // for sanity we are trusted till an error is given and \
the user accepts
- d->simulateModel = 0;
-
- setButtons(KDialog::Details | KDialog::User1 | KDialog::Cancel);
- enableButton(KDialog::Details, false);
- button(KDialog::Details)->setCheckable(true);
- // Setup HIDE custom button
- setButtonText(KDialog::User1, i18n("Hide"));
- setButtonToolTip(KDialog::User1,
- i18n("Allows you to hide the window whilst keeping the \
transaction task running."));
- setEscapeButton(KDialog::User1);
-
- KConfig config("KPackageKit");
- KConfigGroup transactionGroup(&config, "Transaction");
-
- d->progressView = new ProgressView;
-
- if (m_flags & Modal) {
- setWindowModality(Qt::WindowModal);
- }
-
- // We need to track when the user close the dialog using the [X] button
- connect(this, SIGNAL(finished()), SLOT(finishedDialog()));
-
- // after ALL set, lets set the transaction
- setTransaction(m_trans);
-
- setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
- setMaximumSize(QWIDGETSIZE_MAX, size().height());
-
- KConfigGroup transactionDialog(&config, "TransactionDialog");
- restoreDialogSize(transactionDialog);
-}
-
-KpkTransaction::~KpkTransaction()
-{
- KConfig config("KPackageKit");
- if (isButtonEnabled(KDialog::Details)) {
- KConfigGroup transactionGroup(&config, "Transaction");
- transactionGroup.writeEntry("ShowDetails", d->showDetails);
- }
- KConfigGroup transactionDialog(&config, "TransactionDialog");
- saveDialogSize(transactionDialog);
-
- // DO NOT disconnect the transaction here,
- // it might not exist when this happen
- delete d->progressView;
- d->clearApplications()
-; delete d;
-}
-
-void KpkTransaction::slotButtonClicked(int bt)
-{
- switch(bt) {
- case KDialog::Cancel :
-// kDebug() << "KDialog::Cancel";
- m_trans->cancel();
- m_flags |= CloseOnFinish;
- break;
- case KDialog::User1 :
-// kDebug() << "KDialog::User1";
- // when we're done finishedDialog() is called
- done(KDialog::User1);
- break;
- case KDialog::Close :
-// kDebug() << "KDialog::Close";
- // Always disconnect BEFORE emitting finished
- unsetTransaction();
- setExitStatus(Cancelled);
- done(KDialog::Close);
- break;
- case KDialog::Details :
- {
- d->showDetails = !d->progressView->isVisible();
- button(KDialog::Details)->setChecked(d->showDetails);
- if (d->progressView->isVisible()) {
- QSize windowSize = size();
- windowSize.rheight() -= d->progressView->height();
- d->progressView->setVisible(false);
- setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
- setMaximumSize(QWIDGETSIZE_MAX, windowSize.height());
- d->ui.gridLayout->removeWidget(d->progressView);
- } else {
- QSize windowSize = size();
- windowSize.rheight() += d->progressView->height();
- setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
- d->ui.gridLayout->addWidget(d->progressView, 1, 0, 1, 2);
- d->progressView->setVisible(true);
- resize(windowSize);
- }
- }
- break;
- default : // Should be only details
- KDialog::slotButtonClicked(bt);
- }
-}
-
-void KpkTransaction::setTransaction(Transaction *trans)
-{
- if (!trans) {
- // 0 pointer passed
- return;
- }
-
- m_trans = trans;
- if (trans->role() != Enum::RoleInstallSignature &&
- trans->role() != Enum::RoleAcceptEula &&
- trans->role() != Enum::RoleGetFiles) {
- // We need to keep the original role for requeuing
- d->role = trans->role();
- }
- d->tid = trans->tid();
- d->finished = false;
- d->error = Enum::UnknownError;
- d->errorDetails.clear();
- d->progressView->clear();
- d->clearApplications();
-
- KConfig config("KPackageKit");
- KConfigGroup transactionGroup(&config, "Transaction");
- // enable the Details button just on these roles
- if (m_trans->role() == Enum::RoleInstallPackages ||
- m_trans->role() == Enum::RoleInstallFiles ||
- m_trans->role() == Enum::RoleRemovePackages ||
- m_trans->role() == Enum::RoleUpdatePackages ||
- m_trans->role() == Enum::RoleUpdateSystem) {
- // DISCONNECT THIS SIGNAL BEFORE SETTING A NEW ONE
- connect(m_trans, SIGNAL(package(const QSharedPointer<PackageKit::Package> \
&)),
- d->progressView, SLOT(currentPackage(const \
QSharedPointer<PackageKit::Package> &)));
- d->showDetails = transactionGroup.readEntry("ShowDetails", false);
- enableButton(KDialog::Details, true);
- if (d->showDetails != d->progressView->isVisible()) {
- slotButtonClicked(KDialog::Details);
- }
- } else {
- if (m_trans->role() == Enum::RoleSimulateInstallPackages ||
- m_trans->role() == Enum::RoleSimulateInstallFiles ||
- m_trans->role() == Enum::RoleSimulateRemovePackages ||
- m_trans->role() == Enum::RoleSimulateUpdatePackages) {
- // DISCONNECT THIS SIGNAL BEFORE SETTING A NEW ONE
- if (!d->simulateModel) {
- d->simulateModel = new KpkSimulateModel(this, d->packages);
- }
- d->simulateModel->clear();
- connect(m_trans, SIGNAL(package(QSharedPointer<PackageKit::Package>)),
- d->simulateModel, \
SLOT(addPackage(QSharedPointer<PackageKit::Package>)));
- }
-
- if (d->progressView->isVisible()) {
- slotButtonClicked(KDialog::Details);
- }
-// d->ui.gridLayout->removeWidget(d->progressView);
- enableButton(KDialog::Details, false);
- }
-
- // check to see if we can cancel
- enableButtonCancel(m_trans->allowCancel());
-
- // sets the action icon to be the window icon
- setWindowIcon(KpkIcons::actionIcon(m_trans->role()));
- // Sets the kind of transaction
- setCaption(KpkStrings::action(m_trans->role()));
-
- // Now sets the last package
- d->progressView->currentPackage(m_trans->lastPackage());
-
- // sets ui
- updateUi();
-
- // DISCONNECT ALL THESE SIGNALS BEFORE SETTING A NEW ONE
- connect(m_trans, SIGNAL(finished(PackageKit::Enum::Exit, uint)),
- this, SLOT(transactionFinished(PackageKit::Enum::Exit)));
- connect(m_trans, SIGNAL(errorCode(PackageKit::Enum::Error, const QString &)),
- this, SLOT(errorCode(PackageKit::Enum::Error, const QString &)));
- connect(m_trans, SIGNAL(changed()),
- this, SLOT(updateUi()));
- connect(m_trans, SIGNAL(eulaRequired(PackageKit::Client::EulaInfo)),
- this, SLOT(eulaRequired(PackageKit::Client::EulaInfo)));
- connect(m_trans, SIGNAL(mediaChangeRequired(PackageKit::Enum::MediaType, const \
QString &, const QString &)),
- this, SLOT(mediaChangeRequired(PackageKit::Enum::MediaType, const \
QString &, const QString &)));
- connect(m_trans, \
SIGNAL(repoSignatureRequired(PackageKit::Client::SignatureInfo)),
- this, SLOT(repoSignatureRequired(PackageKit::Client::SignatureInfo)));
- // DISCONNECT ALL THESE SIGNALS BEFORE SETTING A NEW ONE
-}
-
-void KpkTransaction::unsetTransaction()
-{
- disconnect(m_trans, SIGNAL(package(QSharedPointer<PackageKit::Package>)),
- d->simulateModel, \
SLOT(addPackage(QSharedPointer<PackageKit::Package>)));
- disconnect(m_trans, SIGNAL(finished(PackageKit::Enum::Exit, uint)),
- this, SLOT(transactionFinished(PackageKit::Enum::Exit)));
- disconnect(m_trans, SIGNAL(errorCode(PackageKit::Enum::Error, const QString &)),
- this, SLOT(errorCode(PackageKit::Enum::Error, const QString &)));
- disconnect(m_trans, SIGNAL(changed()),
- this, SLOT(updateUi()));
- disconnect(m_trans, SIGNAL(eulaRequired(PackageKit::Client::EulaInfo)),
- this, SLOT(eulaRequired(PackageKit::Client::EulaInfo)));
- disconnect(m_trans, SIGNAL(mediaChangeRequired(PackageKit::Enum::MediaType,
- const QString &, const QString \
&)),
- this, SLOT(mediaChangeRequired(PackageKit::Enum::MediaType, const \
QString &, const QString &)));
- disconnect(m_trans, \
SIGNAL(repoSignatureRequired(PackageKit::Client::SignatureInfo)),
- this, \
SLOT(repoSignatureRequired(PackageKit::Client::SignatureInfo)));
-}
-
-void KpkTransaction::requeueTransaction()
-{
- SET_PROXY
- Transaction *trans;
- Client *client = Client::instance();
- QString socket;
- socket = "/tmp/kpk_debconf_" + \
QString::number(QCoreApplication::applicationPid());
- client->setHints("frontend-socket=" + socket);
- switch (d->role) {
- case Enum::RoleRemovePackages :
- trans = client->removePackages(d->packages,
- d->allowDeps,
- AUTOREMOVE);
- break;
- case Enum::RoleInstallPackages :
- trans = client->installPackages(d->onlyTrusted,
- d->packages);
- break;
- case Enum::RoleInstallFiles :
- trans = client->installFiles(d->files,
- d->onlyTrusted);
- break;
- case Enum::RoleUpdatePackages :
- trans = client->updatePackages(d->onlyTrusted,
- d->packages);
- break;
- default :
- setExitStatus(Failed);
- return;
- }
-
- if (trans->error()) {
- KMessageBox::sorry(this,
- KpkStrings::daemonError(trans->error()),
- KpkStrings::action(trans->role()));
- setExitStatus(Failed);
- } else {
- setTransaction(trans);
- }
-}
-
-void KpkTransaction::updateUi()
-{
- uint percentage = m_trans->percentage();
- if (percentage <= 100) {
- d->ui.progressBar->setMaximum(100);
- d->ui.progressBar->setValue(percentage);
- } else if (d->ui.progressBar->maximum() != 0) {
- d->ui.progressBar->setMaximum(0);
- d->ui.progressBar->reset();
- }
-
- d->progressView->setSubProgress(m_trans->subpercentage());
- d->ui.progressBar->setRemaining(m_trans->remainingTime());
-
- // Status & Speed
- Enum::Status status = m_trans->status();
- if (m_status != status) {
- m_status = status;
- d->ui.currentL->setText(KpkStrings::status(status));
-
-// kDebug() << \
KIconLoader::global()->iconPath(KpkIcons::statusAnimation(status), \
-KIconLoader::SizeLarge);
- KPixmapSequence sequence = \
KPixmapSequence(KpkIcons::statusAnimation(status),
- KIconLoader::SizeLarge);
- if (sequence.isValid()) {
- d->busySeq->setSequence(sequence);
- d->busySeq->start();
- }
- } else if (status == Enum::StatusDownload && m_trans->speed() != 0) {
- uint speed = m_trans->speed();
- if (speed) {
- d->ui.currentL->setText(i18n("Downloading packages at %1/s",
- KGlobal::locale()->formatByteSize(speed)));
- }
- }
-
- // Allow cancel
- enableButtonCancel(m_trans->allowCancel());
-}
-
-// Return value: if the error code suggests to try with only_trusted %FALSE
-static bool untrustedIsNeed(Enum::Error error)
-{
- switch (error) {
- case Enum::ErrorGpgFailure:
- case Enum::ErrorBadGpgSignature:
- case Enum::ErrorMissingGpgSignature:
- case Enum::ErrorCannotInstallRepoUnsigned:
- case Enum::ErrorCannotUpdateRepoUnsigned:
- return true;
- default:
- return false;
- }
-}
-
-void KpkTransaction::errorCode(PackageKit::Enum::Error error, const QString \
&details)
-{
-// kDebug() << "errorCode: " << error << details;
- d->error = error;
- d->errorDetails = details;
- // obvious message, don't tell the user
- if (m_handlingActionRequired ||
- error == Enum::ErrorTransactionCancelled ||
- error == Enum::ErrorProcessKill) {
- return;
- }
-
- if (untrustedIsNeed(error)) {
- m_handlingActionRequired = true;
- int ret = KMessageBox::warningYesNo(this,
- 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 "
- "source.\n\nAre you sure you want to \
proceed with the installation?"),
- i18n("Installing unsigned software"));
- if (ret == KMessageBox::Yes) {
- // Set only trusted to false, to do as the user asked
- d->onlyTrusted = false;
- requeueTransaction();
- } else {
- setExitStatus(Cancelled);
- if (m_flags & CloseOnFinish) {
- done(QDialog::Rejected);
- }
- }
- m_handlingActionRequired = false;
- return;
- }
-
- // check to see if we are already handlying these errors
- if (error == Enum::ErrorNoLicenseAgreement ||
- error == Enum::ErrorMediaChangeRequired)
- {
- if (m_handlingActionRequired) {
- return;
- }
- }
-
- m_showingError = true;
- KMessageBox::detailedSorry(this,
- KpkStrings::errorMessage(error),
- QString(details).replace('\n', "<br />"),
- KpkStrings::error(error),
- KMessageBox::Notify);
- m_showingError = false;
-
- // when we receive an error we are done
- setExitStatus(Failed);
- // TODO maybe this should go in the above method
- if (m_flags & CloseOnFinish) {
- done(QDialog::Rejected);
- }
-}
-
-void KpkTransaction::eulaRequired(PackageKit::Client::EulaInfo info)
-{
- if (m_handlingActionRequired) {
- // if its true means that we alread passed here
- m_handlingActionRequired = false;
- return;
- } else {
- m_handlingActionRequired = true;
- }
-
- QPointer<KpkLicenseAgreement> frm = new KpkLicenseAgreement(info, true, this);
- if (frm->exec() == KDialog::Yes) {
- m_handlingActionRequired = false;
- Transaction *trans = \
Client::instance()->Client::instance()->acceptEula(info);
- if (trans->error()) {
- KMessageBox::sorry(this,
- KpkStrings::daemonError(trans->error()),
- i18n("Failed to accept EULA"));
- } else {
- setTransaction(trans);
- }
- } else {
- setExitStatus(Cancelled);
- m_handlingActionRequired = false;
- }
- delete frm;
-}
-
-void KpkTransaction::mediaChangeRequired(PackageKit::Enum::MediaType type, const \
QString &id, const QString &text)
-{
- Q_UNUSED(id)
-
- m_handlingActionRequired = true;
- int ret = KMessageBox::questionYesNo(this,
- KpkStrings::mediaMessage(type, text),
- i18n("A media change is required"),
- KStandardGuiItem::cont(),
- KStandardGuiItem::cancel());
- m_handlingActionRequired = false;
-
- // if the user clicked continue we got yes
- if (ret == KMessageBox::Yes) {
- requeueTransaction();
- } else {
- setExitStatus(Cancelled);
- }
-}
-
-void KpkTransaction::repoSignatureRequired(PackageKit::Client::SignatureInfo info)
-{
- if (m_handlingActionRequired) {
- // if its true means that we alread passed here
- m_handlingActionRequired = false;
- return;
- } else {
- m_handlingActionRequired = true;
- }
-
- QPointer<KpkRepoSig> frm = new KpkRepoSig(info, true, this);
- if (frm->exec() == KDialog::Yes) {
- m_handlingActionRequired = false;
- Transaction *trans = Client::instance()->installSignature(info.type, \
info.keyId, info.package);
- if (trans->error()) {
- KMessageBox::sorry(this,
- KpkStrings::daemonError(trans->error()),
- i18n("Failed to install signature"));
- } else {
- setTransaction(trans);
- }
- } else {
- setExitStatus(Cancelled);
- m_handlingActionRequired = false;
- }
- delete frm;
-}
-
-void KpkTransaction::files(QSharedPointer<PackageKit::Package> package, const \
QStringList &files)
-{
- Q_UNUSED(package)
- foreach (const QString &desktop, files.filter(".desktop")) {
- // we create a new KService because findByDestopPath
- // might fail because the Sycoca database is not up to date yet.
- KService *service = new KService(desktop);
- if (service->isApplication() &&
- !service->noDisplay() &&
- !service->exec().isEmpty())
- {
- d->applications << service;
- }
- }
-}
-
-void KpkTransaction::transactionFinished(PackageKit::Enum::Exit status)
-{
- Transaction *trans = qobject_cast<Transaction*>(sender());
-// kDebug() << status;
- d->finished = true;
- switch(status) {
- case Enum::ExitSuccess :
- d->ui.progressBar->setMaximum(100);
- d->ui.progressBar->setValue(100);
- if (trans->role() != Enum::RoleInstallSignature &&
- trans->role() != Enum::RoleAcceptEula &&
- trans->role() != Enum::RoleGetFiles) {
- KConfig config("KPackageKit");
- KConfigGroup transactionGroup(&config, "Transaction");
- if ((trans->role() == Enum::RoleInstallPackages ||
- trans->role() == Enum::RoleInstallFiles) &&
- transactionGroup.readEntry("ShowApplicationLauncher", true) &&
- Client::instance()->actions() & Enum::RoleGetFiles) {
- // Let's try to find some desktop files'
- Transaction *transaction;
- transaction = Client::instance()->getFiles(d->packages);
- if (!transaction->error()) {
- setTransaction(transaction);
- connect(transaction, \
SIGNAL(files(QSharedPointer<PackageKit::Package>, const QStringList \
&)),
- this, SLOT(files(QSharedPointer<PackageKit::Package>, \
const QStringList &)));
- return; // avoid the exit code
- }
- }
- setExitStatus(Success);
- } else if (trans->role() == Enum::RoleGetFiles) {
- if (!d->applications.isEmpty()) {
- ApplicationLauncher *launcher = new \
ApplicationLauncher(d->applications, this);
- launcher->exec();
- }
- setExitStatus(Success);
- } else {
- d->finished = false;
- requeueTransaction();
- }
- break;
- case Enum::ExitCancelled :
- d->ui.progressBar->setMaximum(100);
- d->ui.progressBar->setValue(100);
- // Avoid crash in case we are showing an error
- if (!m_showingError) {
- setExitStatus(Cancelled);
- }
- break;
- case Enum::ExitFailed :
- kDebug() << "Failed.";
- if (!m_handlingActionRequired && !m_showingError) {
- d->ui.progressBar->setMaximum(0);
- d->ui.progressBar->reset();
- kDebug() << "Yep, we failed.";
- setExitStatus(Failed);
- }
- break;
- case Enum::ExitKeyRequired :
- case Enum::ExitEulaRequired :
- case Enum::ExitMediaChangeRequired :
- case Enum::ExitNeedUntrusted :
- kDebug() << "finished KeyRequired or EulaRequired: " << status;
- d->ui.currentL->setText(KpkStrings::status(Enum::StatusSetup));
- if (!m_handlingActionRequired) {
- setExitStatus(Failed);
- }
- break;
- default :
- d->ui.progressBar->setMaximum(100);
- d->ui.progressBar->setValue(100);
- kDebug() << "finished default" << status;
- KDialog::slotButtonClicked(KDialog::Close);
- setExitStatus(Failed);
- break;
- }
- // if we're not showing an error or don't have the
- // CloseOnFinish flag don't close the dialog
- if (m_flags & CloseOnFinish && !m_handlingActionRequired && !m_showingError) {
-// kDebug() << "CloseOnFinish && !m_handlingActionRequired && \
!m_showingError";
- done(QDialog::Rejected);
- deleteLater();
- }
-}
-
-void KpkTransaction::finishedDialog()
-{
- if (!d->finished) {
- // We are going to hide the transaction,
- // which can make the user even close System Settings or KPackageKit
- // so we call the tray icon to keep watching the transaction so if the
- // transaction receives some error we can display them
- QDBusMessage message;
- message = QDBusMessage::createMethodCall("org.kde.KPackageKitSmartIcon",
- "/",
- "org.kde.KPackageKitSmartIcon",
- QLatin1String("WatchTransaction"));
- // Use our own cached tid to avoid crashes
- message << qVariantFromValue(d->tid);
- QDBusMessage reply = QDBusConnection::sessionBus().call(message);
- if (reply.type() != QDBusMessage::ReplyMessage) {
- kWarning() << "Message did not receive a reply";
- }
- // Always disconnect BEFORE emitting finished
- unsetTransaction();
-
- setExitStatus(Success);
- }
-}
-
-KpkTransaction::ExitStatus KpkTransaction::exitStatus() const
-{
- return m_exitStatus;
-}
-
-void KpkTransaction::setExitStatus(KpkTransaction::ExitStatus status)
-{
- m_exitStatus = status;
- emit finished(status);
-}
-
-QString KpkTransaction::tid() const
-{
- return d->tid;
-}
-
-bool KpkTransaction::allowDeps() const
-{
- return d->allowDeps;
-}
-
-bool KpkTransaction::onlyTrusted() const
-{
- return d->onlyTrusted;
-}
-
-Enum::Role KpkTransaction::role() const
-{
- return d->role;
-}
-
-Enum::Error KpkTransaction::error() const
-{
- return d->error;
-}
-
-QString KpkTransaction::errorDetails() const
-{
- return d->errorDetails;
-}
-
-QList<QSharedPointer<PackageKit::Package> > KpkTransaction::packages() const
-{
- return d->packages;
-}
-
-QStringList KpkTransaction::files() const
-{
- return d->files;
-}
-
-KpkSimulateModel* KpkTransaction::simulateModel() const
-{
- return d->simulateModel;
-}
-
-void KpkTransaction::setAllowDeps(bool allowDeps)
-{
- d->allowDeps = allowDeps;
-}
-
-void KpkTransaction::setPackages(const QList<QSharedPointer<PackageKit::Package> > \
&packages)
-{
- d->packages = packages;
-}
-
-void KpkTransaction::setFiles(const QStringList &files)
-{
- d->files = files;
-}
-
-
-void KpkTransaction::setupDebconfDialog(const QString &tid)
-{
-#ifdef HAVE_DEBCONFKDE
- QDBusMessage message;
- message = QDBusMessage::createMethodCall("org.kde.KPackageKitSmartIcon",
- "/",
- "org.kde.KPackageKitSmartIcon",
- QLatin1String("SetupDebconfDialog"));
- // Use our own cached tid to avoid crashes
- message << qVariantFromValue(tid);
- message << qVariantFromValue(static_cast<uint>(effectiveWinId()));
- QDBusMessage reply = QDBusConnection::sessionBus().call(message);
- if (reply.type() != QDBusMessage::ReplyMessage) {
- kWarning() << "Message did not receive a reply";
- }
-#else
- Q_UNUSED(tid)
-#endif //HAVE_DEBCONFKDE
-}
-
-#include "KpkTransaction.moc"
diff --git a/libkpackagekit/KpkTransaction.h b/libkpackagekit/KpkTransaction.h
deleted file mode 100644
index ee44cf3..0000000
--- a/libkpackagekit/KpkTransaction.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/***************************************************************************
- * Copyright (C) 2008-2010 by Daniel Nicoletti *
- * dantti85-pk@yahoo.com.br *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; see the file COPYING. If not, write to *
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
- * Boston, MA 02110-1301, USA. *
- ***************************************************************************/
-
-#ifndef KPK_TRANSACTION_H
-#define KPK_TRANSACTION_H
-
-#include <KDialog>
-
-#include <QPackageKit>
-
-using namespace PackageKit;
-
-class KpkSimulateModel;
-class KpkTransactionPrivate;
-class KDE_EXPORT KpkTransaction : public KDialog
-{
- Q_OBJECT
- Q_ENUMS(ExitStatus)
-public:
- enum BehaviorFlag {
- Modal = 1,
- CloseOnFinish = 2
- };
- Q_DECLARE_FLAGS(Behaviors, BehaviorFlag)
-
- explicit KpkTransaction(Transaction *trans, Behaviors flags = 0, QWidget *parent \
= 0);
- ~KpkTransaction();
-
- void setTransaction(Transaction *trans);
- // Do not create a method to retrieve the internal pointer
- // of Transaction, instead compare the tid with the tids from
- // Client::getTransaction(), to avoid deleted pointers.
- QString tid() const;
- bool allowDeps() const;
- bool onlyTrusted() const;
- QList<QSharedPointer<PackageKit::Package> > packages() const;
- QStringList files() const;
- KpkSimulateModel* simulateModel() const;
-
- Enum::Role role() const;
- Enum::Error error() const;
- QString errorDetails() const;
-
- void setAllowDeps(bool allowDeps);
- void setPackages(const QList<QSharedPointer<PackageKit::Package> > &packages);
- void setFiles(const QStringList &files);
- void setupDebconfDialog(const QString &tid);
-
- typedef enum {
- Success,
- Failed,
- Cancelled
- } ExitStatus;
-
- KpkTransaction::ExitStatus exitStatus() const;
-
-signals:
- void finished(KpkTransaction::ExitStatus status);
-
-private slots:
- void finishedDialog();
- void transactionFinished(PackageKit::Enum::Exit status);
- void errorCode(PackageKit::Enum::Error error, const QString &details);
- void updateUi();
- void eulaRequired(PackageKit::Client::EulaInfo info);
- void mediaChangeRequired(PackageKit::Enum::MediaType type, const QString &id, \
const QString &text);
- void repoSignatureRequired(PackageKit::Client::SignatureInfo info);
- void files(QSharedPointer<PackageKit::Package> package, const QStringList \
&files);
-
- void setExitStatus(KpkTransaction::ExitStatus status);
-
-private:
- void unsetTransaction();
- void requeueTransaction();
-
- Transaction *m_trans;
- bool m_handlingActionRequired;
- bool m_showingError; //This might replace the above
- Behaviors m_flags;
- ExitStatus m_exitStatus;
- Enum::Status m_status;
- KpkTransactionPrivate *d;
-
-protected slots:
- virtual void slotButtonClicked(int button);
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(KpkTransaction::Behaviors)
-
-#endif
diff --git a/libkpackagekit/KpkTransaction.ui b/libkpackagekit/KpkTransaction.ui
deleted file mode 100644
index c335357..0000000
--- a/libkpackagekit/KpkTransaction.ui
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>KpkTransaction</class>
- <widget class="QWidget" name="KpkTransaction">
- <property name="minimumSize">
- <size>
- <width>400</width>
- <height>0</height>
- </size>
- </property>
- <layout class="QGridLayout" name="gridLayout">
- <property name="margin">
- <number>0</number>
- </property>
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>48</width>
- <height>48</height>
- </size>
- </property>
- <property name="text">
- <string>icon</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="currentL">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <pointsize>11</pointsize>
- </font>
- </property>
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="text">
- <string>Downloading Packages</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignBottom|Qt::AlignHCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="KpkProgressBar" name="progressBar">
- <property name="locale">
- <locale language="English" country="UnitedStates"/>
- </property>
- <property name="maximum">
- <number>0</number>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <customwidgets>
- <customwidget>
- <class>KpkProgressBar</class>
- <extends>QProgressBar</extends>
- <header>KpkProgressBar.h</header>
- </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
diff --git a/libkpackagekit/PkTransaction.cpp b/libkpackagekit/PkTransaction.cpp
new file mode 100644
index 0000000..dd57421
--- /dev/null
+++ b/libkpackagekit/PkTransaction.cpp
@@ -0,0 +1,937 @@
+/***************************************************************************
+ * Copyright (C) 2008-2011 by Daniel Nicoletti *
+ * dantti85-pk@yahoo.com.br *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; see the file COPYING. If not, write to *
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
+ * Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include <config.h>
+
+#include "PkTransaction.h"
+
+#include <KLocale>
+#include <KMessageBox>
+#include <KPushButton>
+#include <KService>
+#include <KPixmapSequence>
+#include <KPixmapSequenceOverlayPainter>
+
+#include <KDebug>
+
+#include <QPropertyAnimation>
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusConnection>
+#include <QtGui/QTreeView>
+
+#include "KpkMacros.h"
+#include "KpkEnum.h"
+#include "KpkStrings.h"
+#include "KpkRepoSig.h"
+#include "KpkLicenseAgreement.h"
+#include "KpkIcons.h"
+#include "ProgressView.h"
+#include "ApplicationLauncher.h"
+#include "KpkSimulateModel.h"
+#include "KpkRequirements.h"
+
+#include "ui_PkTransaction.h"
+
+class PkTransactionPrivate
+{
+public:
+ QString tid;
+ bool showDetails;
+ bool finished;
+ bool allowDeps;
+ bool onlyTrusted;
+ Enum::Role role;
+ Enum::Error error;
+ QString errorDetails;
+ QList<QSharedPointer<PackageKit::Package> > packages;
+ QStringList files;
+ QVector<KService*> applications;
+ KpkSimulateModel *simulateModel;
+ KPixmapSequenceOverlayPainter *busySeq;
+
+ void clearApplications()
+ {
+ while (!applications.isEmpty()) {
+ delete applications.at(0);
+ applications.remove(0);
+ }
+ }
+};
+
+PkTransaction::PkTransaction(Transaction *trans, QWidget *parent)
+ : QWidget(parent),
+ m_trans(trans),
+ m_handlingActionRequired(false),
+ m_showingError(false),
+ m_exitStatus(Success),
+ m_status(Enum::UnknownStatus),
+ ui(new Ui::PkTransaction),
+ d(new PkTransactionPrivate)
+{
+ ui->setupUi(this);
+
+ d->busySeq = new KPixmapSequenceOverlayPainter(this);
+ d->busySeq->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
+ d->busySeq->setWidget(ui->label);
+ ui->label->clear();
+
+ d->finished = true; // for sanity we are finished till some transaction is set
+ d->onlyTrusted = true; // for sanity we are trusted till an error is given and \
the user accepts + d->simulateModel = 0;
+
+// setButtons(KDialog::Details | KDialog::User1 | KDialog::Cancel);
+// enableButton(KDialog::Details, false);
+// button(KDialog::Details)->setCheckable(true);
+ // Setup HIDE custom button
+// setButtonText(KDialog::User1, i18n("Hide"));
+// setButtonToolTip(KDialog::User1,
+// i18n("Allows you to hide the window whilst keeping the \
transaction task running.")); +// setEscapeButton(KDialog::User1);
+
+ KConfig config("KPackageKit");
+ KConfigGroup transactionGroup(&config, "Transaction");
+
+ connect(ui->cancelButton, SIGNAL(rejected()), this, SLOT(cancel()));
+
+ // We need to track when the user close the dialog using the [X] button
+// connect(this, SIGNAL(finished()), SLOT(finishedDialog()));
+
+ // after ALL set, lets set the transaction
+ setTransaction(m_trans);
+
+// setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
+// setMaximumSize(QWIDGETSIZE_MAX, size().height());
+
+// KConfigGroup transactionDialog(&config, "TransactionDialog");
+// restoreDialogSize(transactionDialog);
+}
+
+PkTransaction::~PkTransaction()
+{
+ KConfig config("KPackageKit");
+// if (isButtonEnabled(KDialog::Details)) {
+// KConfigGroup transactionGroup(&config, "Transaction");
+// transactionGroup.writeEntry("ShowDetails", d->showDetails);
+// }
+// KConfigGroup transactionDialog(&config, "TransactionDialog");
+// saveDialogSize(transactionDialog);
+
+ if (!d->finished) {
+ // We are going to hide the transaction,
+ // which can make the user even close System Settings or KPackageKit
+ // so we call the tray icon to keep watching the transaction so if the
+ // transaction receives some error we can display them
+ QDBusMessage message;
+ message = QDBusMessage::createMethodCall("org.kde.KPackageKitSmartIcon",
+ "/",
+ "org.kde.KPackageKitSmartIcon",
+ QLatin1String("WatchTransaction"));
+ // Use our own cached tid to avoid crashes
+ message << qVariantFromValue(d->tid);
+ QDBusMessage reply = QDBusConnection::sessionBus().call(message);
+ if (reply.type() != QDBusMessage::ReplyMessage) {
+ kWarning() << "Message did not receive a reply";
+ }
+ // Always disconnect BEFORE emitting finished
+ unsetTransaction();
+
+ setExitStatus(Success);
+ }
+
+ // DO NOT disconnect the transaction here,
+ // it might not exist when this happen
+ d->clearApplications();
+ delete d;
+}
+
+void PkTransaction::installPackages(const QList<QSharedPointer<PackageKit::Package> \
> &packages) +{
+ if (Client::instance()->actions() & Enum::RoleInstallPackages) {
+ if (Client::instance()->actions() & Enum::RoleSimulateInstallPackages/* &&
+ !(m_flags & HideConfirmDeps)*/) {
+ d->packages = packages;
+ d->simulateModel = new KpkSimulateModel(this, d->packages);
+
+ // Create the depends transaction and it's model
+ Transaction *trans = new Transaction(QString());
+ trans->simulateInstallPackages(d->packages);
+ if (trans->error()) {
+ KMessageBox::sorry(this,
+ KpkStrings::daemonError(trans->error()),
+ i18n("Failed to simulate package install"));
+// taskDone(Enum::RoleInstallPackages);
+ } else {
+ setTransaction(trans);
+ }
+ } else {
+ installPackages();
+ }
+ } else {
+ KMessageBox::error(this, i18n("Current backend does not support installing \
packages."), i18n("Error")); +// taskDone(Enum::RoleInstallPackages);
+ }
+}
+
+void PkTransaction::removePackages(const QList<QSharedPointer<PackageKit::Package> > \
&packages) +{
+ if (Client::instance()->actions() & Enum::RoleRemovePackages) {
+ if (Client::instance()->actions() & Enum::RoleSimulateRemovePackages/* &&
+ !(m_flags & HideConfirmDeps)*/) { //TODO we need admin to lock this down
+ d->packages = packages;
+ d->simulateModel = new KpkSimulateModel(this, d->packages);
+
+ // Create the requirements transaction and it's model
+ Transaction *trans = new Transaction(QString());
+ trans->simulateRemovePackages(d->packages, AUTOREMOVE);
+ if (trans->error()) {
+ KMessageBox::sorry(this,
+ KpkStrings::daemonError(trans->error()),
+ i18n("Failed to simulate package removal"));
+// taskDone(Enum::RoleRemovePackages);
+ } else {
+ setTransaction(trans);
+ }
+ } else {
+ // As we can't check for requires don't allow deps removal
+ removePackages(false);
+ }
+ } else {
+ KMessageBox::error(this, i18n("The current backend does not support removing \
packages."), i18n("Error")); +// taskDone(Enum::RoleRemovePackages);
+ }
+}
+
+void PkTransaction::updatePackages(const QList<QSharedPointer<PackageKit::Package> > \
&packages) +{
+ if (Client::instance()->actions() & Enum::RoleRemovePackages) {
+ if (Client::instance()->actions() & Enum::RoleSimulateUpdatePackages) {
+ d->packages = packages;
+ d->simulateModel = new KpkSimulateModel(this, d->packages);
+
+ Transaction *trans = new Transaction(QString());
+ trans->simulateUpdatePackages(d->packages);
+ if (trans->error()) {
+ KMessageBox::sorry(this, KpkStrings::daemonError(trans->error()),
+ i18n("Failed to simulate package update"));
+ } else {
+ setTransaction(trans);
+ }
+ } else {
+ updatePackages();
+ }
+ } else {
+ KMessageBox::error(this, i18n("The current backend does not support updating \
packages."), i18n("Error")); + }
+}
+
+void PkTransaction::installPackages()
+{
+ SET_PROXY
+ QString socket = "/tmp/kpk_debconf_" + \
QString::number(QCoreApplication::applicationPid()); + Transaction *trans = new \
Transaction(QString()); + trans->setHints("frontend-socket=" + socket);
+ trans->installPackages(true, d->packages);
+ if (trans->error()) {
+ KMessageBox::sorry(this,
+ KpkStrings::daemonError(trans->error()),
+ i18n("Failed to install package"));
+// taskDone(Enum::RoleInstallPackages);
+ } else {
+ setTransaction(trans);
+ setupDebconfDialog(socket);
+// d->transactionDialog->setPackages(d->addPackages);
+ }
+}
+
+void PkTransaction::removePackages(bool allow_deps)
+{
+ SET_PROXY
+ QString socket = "/tmp/kpk_debconf_" + \
QString::number(QCoreApplication::applicationPid()); + Transaction *trans = new \
Transaction(QString()); + trans->setHints("frontend-socket=" + socket);
+ trans->removePackages(d->packages, d->allowDeps, AUTOREMOVE);
+ if (trans->error()) {
+ KMessageBox::sorry(this,
+ KpkStrings::daemonError(trans->error()),
+ i18n("Failed to remove package"));
+// taskDone(Enum::RoleRemovePackages);
+ } else {
+ setTransaction(trans);
+ setupDebconfDialog(socket);
+// setAllowDeps(allowDeps);
+// d->transactionDialog->setAllowDeps(allowDeps);
+ }
+}
+
+void PkTransaction::updatePackages()
+{
+ SET_PROXY
+ QString socket = "/tmp/kpk_debconf_" + \
QString::number(QCoreApplication::applicationPid()); + Transaction *trans = new \
Transaction(QString()); + trans->setHints("frontend-socket=" + socket);
+ trans->updatePackages(true, d->packages);
+ if (trans->error()) {
+ KMessageBox::sorry(this,
+ KpkStrings::daemonError(trans->error()),
+ i18n("Failed to update package"));
+// taskDone(Enum::RoleRemovePackages);
+ } else {
+ setTransaction(trans);
+ setupDebconfDialog(socket);
+// d->transactionDialog->setAllowDeps(allowDeps);
+ }
+}
+
+void PkTransaction::cancel()
+{
+ m_trans->cancel();
+// m_flags |= CloseOnFinish;
+}
+
+void PkTransaction::slotButtonClicked(int bt)
+{
+// switch(bt) {
+// case KDialog::Cancel :
+// // kDebug() << "KDialog::Cancel";
+// m_trans->cancel();
+// // m_flags |= CloseOnFinish;
+// break;
+// case KDialog::User1 :
+// // kDebug() << "KDialog::User1";
+// // when we're done finishedDialog() is called
+// done(KDialog::User1);
+// break;
+// case KDialog::Close :
+// // kDebug() << "KDialog::Close";
+// // Always disconnect BEFORE emitting finished
+// unsetTransaction();
+// setExitStatus(Cancelled);
+// done(KDialog::Close);
+// break;
+// case KDialog::Details :
+// {
+// d->showDetails = !d->progressView->isVisible();
+// button(KDialog::Details)->setChecked(d->showDetails);
+// if (d->progressView->isVisible()) {
+// QSize windowSize = size();
+// windowSize.rheight() -= d->progressView->height();
+// d->progressView->setVisible(false);
+// setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
+// setMaximumSize(QWIDGETSIZE_MAX, windowSize.height());
+// ui->gridLayout->removeWidget(d->progressView);
+// } else {
+// QSize windowSize = size();
+// windowSize.rheight() += d->progressView->height();
+// setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+// setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
+// ui->gridLayout->addWidget(d->progressView, 1, 0, 1, 2);
+// d->progressView->setVisible(true);
+// resize(windowSize);
+// }
+// }
+// break;
+// default : // Should be only details
+// KDialog::slotButtonClicked(bt);
+// }
+}
+
+void PkTransaction::setTransaction(Transaction *trans)
+{
+ if (!trans) {
+ // 0 pointer passed
+ return;
+ }
+
+ m_trans = trans;
+ if (trans->role() != Enum::RoleInstallSignature &&
+ trans->role() != Enum::RoleAcceptEula &&
+ trans->role() != Enum::RoleGetFiles) {
+ // We need to keep the original role for requeuing
+ d->role = trans->role();
+ }
+ d->tid = trans->tid();
+ d->finished = false;
+ d->error = Enum::UnknownError;
+ d->errorDetails.clear();
+ ui->progressView->clear();
+ d->clearApplications();
+
+ KConfig config("KPackageKit");
+ KConfigGroup transactionGroup(&config, "Transaction");
+ // enable the Details button just on these roles
+ if (m_trans->role() == Enum::RoleInstallPackages ||
+ m_trans->role() == Enum::RoleInstallFiles ||
+ m_trans->role() == Enum::RoleRemovePackages ||
+ m_trans->role() == Enum::RoleUpdatePackages ||
+ m_trans->role() == Enum::RoleUpdateSystem) {
+ // DISCONNECT THIS SIGNAL BEFORE SETTING A NEW ONE
+ connect(m_trans, SIGNAL(package(const QSharedPointer<PackageKit::Package> \
&)), + ui->progressView, SLOT(currentPackage(const \
QSharedPointer<PackageKit::Package> &))); + d->showDetails = \
transactionGroup.readEntry("ShowDetails", false); +// \
enableButton(KDialog::Details, true); + if (d->showDetails != \
ui->progressView->isVisible()) { + slotButtonClicked(KDialog::Details);
+ }
+
+ d->simulateModel->deleteLater();
+ d->simulateModel = 0;
+ } else {
+ if (m_trans->role() == Enum::RoleSimulateInstallPackages ||
+ m_trans->role() == Enum::RoleSimulateInstallFiles ||
+ m_trans->role() == Enum::RoleSimulateRemovePackages ||
+ m_trans->role() == Enum::RoleSimulateUpdatePackages) {
+ // DISCONNECT THIS SIGNAL BEFORE SETTING A NEW ONE
+ if (!d->simulateModel) {
+ d->simulateModel = new KpkSimulateModel(this, d->packages);
+ }
+ d->simulateModel->clear();
+ connect(m_trans, SIGNAL(package(QSharedPointer<PackageKit::Package>)),
+ d->simulateModel, \
SLOT(addPackage(QSharedPointer<PackageKit::Package>))); + }
+
+ if (ui->progressView->isVisible()) {
+// slotButtonClicked(KDialog::Details);
+ }
+// ui->gridLayout->removeWidget(d->progressView);
+// enableButton(KDialog::Details, false);
+ }
+
+ // sets the action icon to be the window icon
+ setWindowIcon(KpkIcons::actionIcon(m_trans->role()));
+
+ // Sets the kind of transaction
+ emit titleChanged(KpkStrings::action(m_trans->role()));
+// setCaption(KpkStrings::action(m_trans->role()));
+
+ // Now sets the last package
+ ui->progressView->currentPackage(m_trans->lastPackage());
+
+ // sets ui
+ updateUi();
+
+ // DISCONNECT ALL THESE SIGNALS BEFORE SETTING A NEW ONE
+ connect(m_trans, SIGNAL(finished(PackageKit::Enum::Exit, uint)),
+ this, SLOT(transactionFinished(PackageKit::Enum::Exit)));
+ connect(m_trans, SIGNAL(errorCode(PackageKit::Enum::Error, const QString &)),
+ this, SLOT(errorCode(PackageKit::Enum::Error, const QString &)));
+ connect(m_trans, SIGNAL(changed()),
+ this, SLOT(updateUi()));
+ connect(m_trans, SIGNAL(eulaRequired(PackageKit::Client::EulaInfo)),
+ this, SLOT(eulaRequired(PackageKit::Client::EulaInfo)));
+ connect(m_trans, SIGNAL(mediaChangeRequired(PackageKit::Enum::MediaType, const \
QString &, const QString &)), + this, \
SLOT(mediaChangeRequired(PackageKit::Enum::MediaType, const QString &, const QString \
&))); + connect(m_trans, \
SIGNAL(repoSignatureRequired(PackageKit::Client::SignatureInfo)), + this, \
SLOT(repoSignatureRequired(PackageKit::Client::SignatureInfo))); + // DISCONNECT \
ALL THESE SIGNALS BEFORE SETTING A NEW ONE +}
+
+void PkTransaction::unsetTransaction()
+{
+ disconnect(m_trans, SIGNAL(package(QSharedPointer<PackageKit::Package>)),
+ d->simulateModel, \
SLOT(addPackage(QSharedPointer<PackageKit::Package>))); + disconnect(m_trans, \
SIGNAL(finished(PackageKit::Enum::Exit, uint)), + this, \
SLOT(transactionFinished(PackageKit::Enum::Exit))); + disconnect(m_trans, \
SIGNAL(errorCode(PackageKit::Enum::Error, const QString &)), + this, \
SLOT(errorCode(PackageKit::Enum::Error, const QString &))); + disconnect(m_trans, \
SIGNAL(changed()), + this, SLOT(updateUi()));
+ disconnect(m_trans, SIGNAL(eulaRequired(PackageKit::Client::EulaInfo)),
+ this, SLOT(eulaRequired(PackageKit::Client::EulaInfo)));
+ disconnect(m_trans, SIGNAL(mediaChangeRequired(PackageKit::Enum::MediaType, \
const QString &, const QString &)), + this, \
SLOT(mediaChangeRequired(PackageKit::Enum::MediaType, const QString &, const QString \
&))); + disconnect(m_trans, \
SIGNAL(repoSignatureRequired(PackageKit::Client::SignatureInfo)), + \
this, SLOT(repoSignatureRequired(PackageKit::Client::SignatureInfo))); +}
+
+void PkTransaction::requeueTransaction()
+{
+ SET_PROXY
+ Transaction *trans = new Transaction(QString());
+ Client *client = Client::instance();
+ QString socket;
+ socket = "/tmp/kpk_debconf_" + \
QString::number(QCoreApplication::applicationPid()); + \
client->setHints("frontend-socket=" + socket); + switch (d->role) {
+ case Enum::RoleRemovePackages :
+ trans->removePackages(d->packages, d->allowDeps, AUTOREMOVE);
+ break;
+ case Enum::RoleInstallPackages :
+ trans->installPackages(d->onlyTrusted, d->packages);
+ break;
+ case Enum::RoleInstallFiles :
+ trans->installFiles(d->files, d->onlyTrusted);
+ break;
+ case Enum::RoleUpdatePackages :
+ trans->updatePackages(d->onlyTrusted, d->packages);
+ break;
+ default :
+ setExitStatus(Failed);
+ return;
+ }
+
+ if (trans->error()) {
+ KMessageBox::sorry(this,
+ KpkStrings::daemonError(trans->error()),
+ KpkStrings::action(trans->role()));
+ setExitStatus(Failed);
+ } else {
+ setTransaction(trans);
+ }
+}
+
+void PkTransaction::updateUi()
+{
+ uint percentage = m_trans->percentage();
+ if (percentage <= 100) {
+ ui->progressBar->setMaximum(100);
+ ui->progressBar->setValue(percentage);
+ } else if (ui->progressBar->maximum() != 0) {
+ ui->progressBar->setMaximum(0);
+ ui->progressBar->reset();
+ }
+
+ ui->progressView->setSubProgress(m_trans->subpercentage());
+ ui->progressBar->setRemaining(m_trans->remainingTime());
+
+ // Status & Speed
+ Enum::Status status = m_trans->status();
+ if (m_status != status) {
+ m_status = status;
+ ui->currentL->setText(KpkStrings::status(status));
+
+// kDebug() << \
KIconLoader::global()->iconPath(KpkIcons::statusAnimation(status), \
-KIconLoader::SizeLarge); + KPixmapSequence sequence = \
KPixmapSequence(KpkIcons::statusAnimation(status), + \
KIconLoader::SizeLarge); + if (sequence.isValid()) {
+ d->busySeq->setSequence(sequence);
+ d->busySeq->start();
+ }
+ } else if (status == Enum::StatusDownload && m_trans->speed() != 0) {
+ uint speed = m_trans->speed();
+ if (speed) {
+ ui->currentL->setText(i18n("Downloading packages at %1/s",
+ KGlobal::locale()->formatByteSize(speed)));
+ }
+ }
+
+ // check to see if we can cancel
+ bool cancel = m_trans->allowCancel();
+ emit allowCancel(cancel);
+ ui->cancelButton->setEnabled(cancel);
+}
+
+// Return value: if the error code suggests to try with only_trusted %FALSE
+static bool untrustedIsNeed(Enum::Error error)
+{
+ switch (error) {
+ case Enum::ErrorGpgFailure:
+ case Enum::ErrorBadGpgSignature:
+ case Enum::ErrorMissingGpgSignature:
+ case Enum::ErrorCannotInstallRepoUnsigned:
+ case Enum::ErrorCannotUpdateRepoUnsigned:
+ return true;
+ default:
+ return false;
+ }
+}
+
+void PkTransaction::errorCode(PackageKit::Enum::Error error, const QString &details)
+{
+// kDebug() << "errorCode: " << error << details;
+ d->error = error;
+ d->errorDetails = details;
+ // obvious message, don't tell the user
+ if (m_handlingActionRequired ||
+ error == Enum::ErrorTransactionCancelled ||
+ error == Enum::ErrorProcessKill) {
+ return;
+ }
+
+ if (untrustedIsNeed(error)) {
+ m_handlingActionRequired = true;
+ int ret = KMessageBox::warningYesNo(this,
+ 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 " + \
"source.\n\nAre you sure you want to proceed with the installation?"), + \
i18n("Installing unsigned software")); + if (ret == KMessageBox::Yes) {
+ // Set only trusted to false, to do as the user asked
+ d->onlyTrusted = false;
+ requeueTransaction();
+ } else {
+ setExitStatus(Cancelled);
+// if (m_flags & CloseOnFinish) {
+// done(QDialog::Rejected);
+// }
+ }
+ m_handlingActionRequired = false;
+ return;
+ }
+
+ // check to see if we are already handlying these errors
+ if (error == Enum::ErrorNoLicenseAgreement ||
+ error == Enum::ErrorMediaChangeRequired)
+ {
+ if (m_handlingActionRequired) {
+ return;
+ }
+ }
+
+ m_showingError = true;
+ KMessageBox::detailedSorry(this,
+ KpkStrings::errorMessage(error),
+ QString(details).replace('\n', "<br />"),
+ KpkStrings::error(error),
+ KMessageBox::Notify);
+ m_showingError = false;
+
+ // when we receive an error we are done
+ setExitStatus(Failed);
+ // TODO maybe this should go in the above method
+// if (m_flags & CloseOnFinish) {
+// done(QDialog::Rejected);
+// }
+}
+
+void PkTransaction::eulaRequired(PackageKit::Client::EulaInfo info)
+{
+ if (m_handlingActionRequired) {
+ // if its true means that we alread passed here
+ m_handlingActionRequired = false;
+ return;
+ } else {
+ m_handlingActionRequired = true;
+ }
+
+ QPointer<KpkLicenseAgreement> frm = new KpkLicenseAgreement(info, true, this);
+ if (frm->exec() == KDialog::Yes) {
+ m_handlingActionRequired = false;
+ Transaction *trans = \
Client::instance()->Client::instance()->acceptEula(info); + if \
(trans->error()) { + KMessageBox::sorry(this,
+ KpkStrings::daemonError(trans->error()),
+ i18n("Failed to accept EULA"));
+ } else {
+ setTransaction(trans);
+ }
+ } else {
+ setExitStatus(Cancelled);
+ m_handlingActionRequired = false;
+ }
+ delete frm;
+}
+
+void PkTransaction::mediaChangeRequired(PackageKit::Enum::MediaType type, const \
QString &id, const QString &text) +{
+ Q_UNUSED(id)
+
+ m_handlingActionRequired = true;
+ int ret = KMessageBox::questionYesNo(this,
+ KpkStrings::mediaMessage(type, text),
+ i18n("A media change is required"),
+ KStandardGuiItem::cont(),
+ KStandardGuiItem::cancel());
+ m_handlingActionRequired = false;
+
+ // if the user clicked continue we got yes
+ if (ret == KMessageBox::Yes) {
+ requeueTransaction();
+ } else {
+ setExitStatus(Cancelled);
+ }
+}
+
+void PkTransaction::repoSignatureRequired(PackageKit::Client::SignatureInfo info)
+{
+ if (m_handlingActionRequired) {
+ // if its true means that we alread passed here
+ m_handlingActionRequired = false;
+ return;
+ } else {
+ m_handlingActionRequired = true;
+ }
+
+ QPointer<KpkRepoSig> frm = new KpkRepoSig(info, true, this);
+ frm->exec();
+ if (frm && frm->result() == KDialog::Yes) {
+ m_handlingActionRequired = false;
+ Transaction *trans = new Transaction(QString());
+ trans->installSignature(info.type, info.keyId, info.package);
+ if (trans->error()) {
+ KMessageBox::sorry(this,
+ KpkStrings::daemonError(trans->error()),
+ i18n("Failed to install signature"));
+ } else {
+ setTransaction(trans);
+ }
+ } else {
+ setExitStatus(Cancelled);
+ m_handlingActionRequired = false;
+ }
+ delete frm;
+}
+
+void PkTransaction::files(QSharedPointer<PackageKit::Package> package, const \
QStringList &files) +{
+ Q_UNUSED(package)
+ foreach (const QString &desktop, files.filter(".desktop")) {
+ // we create a new KService because findByDestopPath
+ // might fail because the Sycoca database is not up to date yet.
+ KService *service = new KService(desktop);
+ if (service->isApplication() &&
+ !service->noDisplay() &&
+ !service->exec().isEmpty())
+ {
+ d->applications << service;
+ }
+ }
+}
+
+void PkTransaction::transactionFinished(PackageKit::Enum::Exit status)
+{
+ Transaction *trans = qobject_cast<Transaction*>(sender());
+ Enum::Role role = trans->role();
+ KpkRequirements *requires = 0;
+
+// kDebug() << status;
+ d->finished = true;
+ switch(status) {
+ case Enum::ExitSuccess :
+ ui->progressBar->setMaximum(100);
+ ui->progressBar->setValue(100);
+
+ // If the simulate model exists we were simulating
+ if (d->simulateModel) {
+ if (d->simulateModel->rowCount() > 0) {
+ requires = new KpkRequirements(d->simulateModel, this);
+ connect(requires, SIGNAL(rejected()), this, SLOT(reject()));
+ requires->show();
+ }
+
+ switch (role) {
+ case Enum::RoleSimulateInstallPackages:
+ if (requires) {
+ connect(requires, SIGNAL(accepted()), this, \
SLOT(installPackages())); + } else {
+ installPackages();
+ }
+ return;
+ case Enum::RoleSimulateRemovePackages:
+ if (requires) {
+ connect(requires, SIGNAL(accepted()), this, \
SLOT(removePackages())); + } else {
+ // As there was no requires don't allow deps removal
+ removePackages(false);
+ }
+ return;
+ case Enum::RoleSimulateUpdatePackages:
+ if (requires) {
+ connect(requires, SIGNAL(accepted()), this, \
SLOT(updatePackages())); + } else {
+ updatePackages();
+ }
+ return;
+ case Enum::RoleSimulateInstallFiles:
+ // TODO
+ return;
+ default:
+ break;
+ }
+ }
+
+ if (role != Enum::RoleInstallSignature &&
+ role != Enum::RoleAcceptEula &&
+ role != Enum::RoleGetFiles) {
+ KConfig config("KPackageKit");
+ KConfigGroup transactionGroup(&config, "Transaction");
+ if ((role == Enum::RoleInstallPackages ||
+ role == Enum::RoleInstallFiles) &&
+ transactionGroup.readEntry("ShowApplicationLauncher", true) &&
+ Client::instance()->actions() & Enum::RoleGetFiles) {
+ // Let's try to find some desktop files'
+ Transaction *transaction = new Transaction(QString());
+ transaction->getFiles(d->packages);
+ if (!transaction->error()) {
+ setTransaction(transaction);
+ connect(transaction, \
SIGNAL(files(QSharedPointer<PackageKit::Package>, const QStringList &)), + \
this, SLOT(files(QSharedPointer<PackageKit::Package>, const QStringList &))); + \
return; // avoid the exit code + }
+ }
+ setExitStatus(Success);
+ } else if (role == Enum::RoleGetFiles) {
+ if (!d->applications.isEmpty()) {
+ ApplicationLauncher *launcher = new \
ApplicationLauncher(d->applications, this); + launcher->exec();
+ }
+ setExitStatus(Success);
+ } else {
+ d->finished = false;
+ requeueTransaction();
+ }
+ break;
+ case Enum::ExitCancelled :
+ ui->progressBar->setMaximum(100);
+ ui->progressBar->setValue(100);
+ // Avoid crash in case we are showing an error
+ if (!m_showingError) {
+ setExitStatus(Cancelled);
+ }
+ break;
+ case Enum::ExitFailed :
+ kDebug() << "Failed.";
+ if (!m_handlingActionRequired && !m_showingError) {
+ ui->progressBar->setMaximum(0);
+ ui->progressBar->reset();
+ kDebug() << "Yep, we failed.";
+ setExitStatus(Failed);
+ }
+ break;
+ case Enum::ExitKeyRequired :
+ case Enum::ExitEulaRequired :
+ case Enum::ExitMediaChangeRequired :
+ case Enum::ExitNeedUntrusted :
+ kDebug() << "finished KeyRequired or EulaRequired: " << status;
+ ui->currentL->setText(KpkStrings::status(Enum::StatusSetup));
+ if (!m_handlingActionRequired) {
+ setExitStatus(Failed);
+ }
+ break;
+ default :
+ ui->progressBar->setMaximum(100);
+ ui->progressBar->setValue(100);
+ kDebug() << "finished default" << status;
+// KDialog::slotButtonClicked(KDialog::Close);
+ setExitStatus(Failed);
+ break;
+ }
+ // if we're not showing an error or don't have the
+ // CloseOnFinish flag don't close the dialog
+ //TODO !!!!!!!!!
+// if (m_flags & CloseOnFinish && !m_handlingActionRequired && !m_showingError) \
{ +// // kDebug() << "CloseOnFinish && !m_handlingActionRequired && \
!m_showingError"; +// done(QDialog::Rejected);
+// deleteLater();
+// }
+}
+
+PkTransaction::ExitStatus PkTransaction::exitStatus() const
+{
+ return m_exitStatus;
+}
+
+bool PkTransaction::isFinished() const
+{
+ return d->finished;
+}
+
+void PkTransaction::setExitStatus(PkTransaction::ExitStatus status)
+{
+ m_exitStatus = status;
+ emit finished(status);
+}
+
+void PkTransaction::reject()
+{
+ d->finished = true;
+ setExitStatus(Cancelled);
+}
+
+QString PkTransaction::tid() const
+{
+ return d->tid;
+}
+
+bool PkTransaction::allowDeps() const
+{
+ return d->allowDeps;
+}
+
+bool PkTransaction::onlyTrusted() const
+{
+ return d->onlyTrusted;
+}
+
+Enum::Role PkTransaction::role() const
+{
+ return d->role;
+}
+
+Enum::Error PkTransaction::error() const
+{
+ return d->error;
+}
+
+QString PkTransaction::errorDetails() const
+{
+ return d->errorDetails;
+}
+
+QList<QSharedPointer<PackageKit::Package> > PkTransaction::packages() const
+{
+ return d->packages;
+}
+
+QStringList PkTransaction::files() const
+{
+ return d->files;
+}
+
+KpkSimulateModel* PkTransaction::simulateModel() const
+{
+ return d->simulateModel;
+}
+
+void PkTransaction::setAllowDeps(bool allowDeps)
+{
+ d->allowDeps = allowDeps;
+}
+
+void PkTransaction::setPackages(const QList<QSharedPointer<PackageKit::Package> > \
&packages) +{
+ d->packages = packages;
+}
+
+void PkTransaction::setFiles(const QStringList &files)
+{
+ d->files = files;
+}
+
+void PkTransaction::setupDebconfDialog(const QString &tid)
+{
+#ifdef HAVE_DEBCONFKDE
+ QDBusMessage message;
+ message = QDBusMessage::createMethodCall("org.kde.KPackageKitSmartIcon",
+ "/",
+ "org.kde.KPackageKitSmartIcon",
+ QLatin1String("SetupDebconfDialog"));
+ // Use our own cached tid to avoid crashes
+ message << qVariantFromValue(tid);
+ message << qVariantFromValue(static_cast<uint>(effectiveWinId()));
+ QDBusMessage reply = QDBusConnection::sessionBus().call(message);
+ if (reply.type() != QDBusMessage::ReplyMessage) {
+ kWarning() << "Message did not receive a reply";
+ }
+#else
+ Q_UNUSED(tid)
+#endif //HAVE_DEBCONFKDE
+}
+
+#include "PkTransaction.moc"
diff --git a/libkpackagekit/PkTransaction.h b/libkpackagekit/PkTransaction.h
new file mode 100644
index 0000000..8cc9bd5
--- /dev/null
+++ b/libkpackagekit/PkTransaction.h
@@ -0,0 +1,118 @@
+/***************************************************************************
+ * Copyright (C) 2008-2011 by Daniel Nicoletti *
+ * dantti85-pk@yahoo.com.br *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; see the file COPYING. If not, write to *
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
+ * Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef PK_TRANSACTION_H
+#define PK_TRANSACTION_H
+
+#include <QWidget>
+#include <kdemacros.h>
+
+#include <QPackageKit>
+
+using namespace PackageKit;
+
+namespace Ui {
+ class PkTransaction;
+}
+
+class KpkSimulateModel;
+class PkTransactionPrivate;
+class KDE_EXPORT PkTransaction : public QWidget
+{
+ Q_OBJECT
+ Q_ENUMS(ExitStatus)
+public:
+ explicit PkTransaction(Transaction *trans, QWidget *parent = 0);
+ ~PkTransaction();
+
+ void installPackages(const QList<QSharedPointer<PackageKit::Package> > \
&packages); + void removePackages(const QList<QSharedPointer<PackageKit::Package> \
> &packages); + void updatePackages(const \
> QList<QSharedPointer<PackageKit::Package> > &packages);
+
+ void setTransaction(Transaction *trans);
+ // Do not create a method to retrieve the internal pointer
+ // of Transaction, instead compare the tid with the tids from
+ // Client::getTransaction(), to avoid deleted pointers.
+ QString tid() const;
+ bool allowDeps() const;
+ bool onlyTrusted() const;
+ QList<QSharedPointer<PackageKit::Package> > packages() const;
+ QStringList files() const;
+ KpkSimulateModel* simulateModel() const;
+
+ Enum::Role role() const;
+ Enum::Error error() const;
+ QString errorDetails() const;
+
+ void setAllowDeps(bool allowDeps);
+ void setPackages(const QList<QSharedPointer<PackageKit::Package> > &packages);
+ void setFiles(const QStringList &files);
+ void setupDebconfDialog(const QString &tid);
+
+ typedef enum {
+ Success,
+ Failed,
+ Cancelled
+ } ExitStatus;
+
+ PkTransaction::ExitStatus exitStatus() const;
+ bool isFinished() const;
+
+signals:
+ void finished(PkTransaction::ExitStatus status);
+ void allowCancel(bool enable);
+ void titleChanged(const QString &title);
+
+public slots:
+ void cancel();
+
+private slots:
+ void installPackages();
+ void removePackages(bool allow_deps = true);
+ void updatePackages();
+
+ void transactionFinished(PackageKit::Enum::Exit status);
+ void errorCode(PackageKit::Enum::Error error, const QString &details);
+ void updateUi();
+ void eulaRequired(PackageKit::Client::EulaInfo info);
+ void mediaChangeRequired(PackageKit::Enum::MediaType type, const QString &id, \
const QString &text); + void \
repoSignatureRequired(PackageKit::Client::SignatureInfo info); + void \
files(QSharedPointer<PackageKit::Package> package, const QStringList &files); +
+ void setExitStatus(PkTransaction::ExitStatus status);
+ void reject();
+
+private:
+ void unsetTransaction();
+ void requeueTransaction();
+
+ Transaction *m_trans;
+ bool m_handlingActionRequired;
+ bool m_showingError; //This might replace the above
+ ExitStatus m_exitStatus;
+ Enum::Status m_status;
+ Ui::PkTransaction *ui;
+ PkTransactionPrivate *d;
+
+protected slots:
+ virtual void slotButtonClicked(int button);
+};
+
+#endif
diff --git a/libkpackagekit/PkTransaction.ui b/libkpackagekit/PkTransaction.ui
new file mode 100644
index 0000000..75299f1
--- /dev/null
+++ b/libkpackagekit/PkTransaction.ui
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PkTransaction</class>
+ <widget class="QWidget" name="PkTransaction">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>159</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>400</width>
+ <height>0</height>
+ </size>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>48</width>
+ <height>48</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>icon</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="currentL">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>11</pointsize>
+ </font>
+ </property>
+ <property name="locale">
+ <locale language="English" country="UnitedStates"/>
+ </property>
+ <property name="text">
+ <string>Downloading Packages</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignBottom|Qt::AlignHCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="KpkProgressBar" name="progressBar">
+ <property name="locale">
+ <locale language="English" country="UnitedStates"/>
+ </property>
+ <property name="maximum">
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="KDialogButtonBox" name="cancelButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="ProgressView" name="progressView"/>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>KDialogButtonBox</class>
+ <extends>QDialogButtonBox</extends>
+ <header>kdialogbuttonbox.h</header>
+ </customwidget>
+ <customwidget>
+ <class>KpkProgressBar</class>
+ <extends>QProgressBar</extends>
+ <header>KpkProgressBar.h</header>
+ </customwidget>
+ <customwidget>
+ <class>ProgressView</class>
+ <extends>QTreeView</extends>
+ <header>ProgressView.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/libkpackagekit/PkTransactionDialog.cpp \
b/libkpackagekit/PkTransactionDialog.cpp new file mode 100644
index 0000000..2fa41ed
--- /dev/null
+++ b/libkpackagekit/PkTransactionDialog.cpp
@@ -0,0 +1,202 @@
+/***************************************************************************
+ * Copyright (C) 2008-2011 by Daniel Nicoletti *
+ * dantti85-pk@yahoo.com.br *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; see the file COPYING. If not, write to *
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
+ * Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include <config.h>
+
+#include "PkTransactionDialog.h"
+
+#include <KLocale>
+#include <KMessageBox>
+#include <KPushButton>
+#include <KService>
+#include <KPixmapSequence>
+#include <KPixmapSequenceOverlayPainter>
+
+#include <KDebug>
+
+#include <QPropertyAnimation>
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusConnection>
+#include <QtGui/QTreeView>
+
+#include "KpkMacros.h"
+#include "KpkEnum.h"
+#include "KpkStrings.h"
+#include "KpkRepoSig.h"
+#include "KpkLicenseAgreement.h"
+#include "KpkIcons.h"
+#include "ProgressView.h"
+#include "ApplicationLauncher.h"
+#include "KpkSimulateModel.h"
+
+#include "PkTransaction.h"
+
+class PkTransactionDialogPrivate
+{
+public:
+ QString tid;
+ bool showDetails;
+ bool finished;
+ bool allowDeps;
+ bool onlyTrusted;
+ Enum::Role role;
+ Enum::Error error;
+ QString errorDetails;
+ QList<QSharedPointer<PackageKit::Package> > packages;
+ QStringList files;
+ KpkSimulateModel *simulateModel;
+ ProgressView *progressView;
+ KPixmapSequenceOverlayPainter *busySeq;
+};
+
+PkTransactionDialog::PkTransactionDialog(Transaction *trans, Behaviors flags, \
QWidget *parent) + : KDialog(parent),
+ m_flags(flags),
+ d(new PkTransactionDialogPrivate)
+{
+ m_ui = new PkTransaction(trans, parent);
+ connect(m_ui, SIGNAL(allowCancel(bool)), button(KDialog::Cancel), \
SLOT(setEnabled(bool))); + connect(m_ui, \
SIGNAL(finished(PkTransaction::ExitStatus)), + this, \
SIGNAL(finished(PkTransaction::ExitStatus))); + connect(m_ui, \
SIGNAL(finished(PkTransaction::ExitStatus)), + this, \
SLOT(finishedDialog(PkTransaction::ExitStatus))); +
+ setMainWidget(m_ui);
+
+// d->ui.setupUi(mainWidget());
+
+
+ setButtons(KDialog::Details | KDialog::User1 | KDialog::Cancel);
+ enableButton(KDialog::Details, false);
+ button(KDialog::Details)->setCheckable(true);
+
+ // Setup HIDE custom button
+ setButtonText(KDialog::User1, i18n("Hide"));
+ setButtonToolTip(KDialog::User1,
+ i18n("Allows you to hide the window whilst keeping the \
transaction task running.")); + setEscapeButton(KDialog::User1);
+
+ KConfig config("KPackageKit");
+ KConfigGroup transactionGroup(&config, "Transaction");
+
+ d->progressView = new ProgressView;
+
+ if (m_flags & Modal) {
+ setWindowModality(Qt::WindowModal);
+ }
+
+ // after ALL set, lets set the transaction
+ setTransaction(trans);
+
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
+ setMaximumSize(QWIDGETSIZE_MAX, size().height());
+
+ KConfigGroup transactionDialog(&config, "PkTransactionDialog");
+ restoreDialogSize(transactionDialog);
+}
+
+PkTransactionDialog::~PkTransactionDialog()
+{
+ KConfig config("KPackageKit");
+ if (isButtonEnabled(KDialog::Details)) {
+ KConfigGroup transactionGroup(&config, "Transaction");
+ transactionGroup.writeEntry("ShowDetails", d->showDetails);
+ }
+ KConfigGroup transactionDialog(&config, "PkTransactionDialog");
+ saveDialogSize(transactionDialog);
+
+ // DO NOT disconnect the transaction here,
+ // it might not exist when this happen
+ delete d->progressView;
+ delete d;
+}
+
+void PkTransactionDialog::slotButtonClicked(int bt)
+{
+ switch(bt) {
+ case KDialog::Cancel :
+// kDebug() << "KDialog::Cancel";
+ m_ui->cancel();
+/* m_flags |= CloseOnFinish;*/
+ break;
+ case KDialog::User1 :
+// kDebug() << "KDialog::User1";
+ // when we're done finishedDialog() is called
+ done(KDialog::User1);
+ break;
+ case KDialog::Close :
+// kDebug() << "KDialog::Close";
+ // Always disconnect BEFORE emitting finished
+// unsetTransaction();
+// setExitStatus(Cancelled);
+ done(KDialog::Close);
+ break;
+ case KDialog::Details :
+ {
+ d->showDetails = !d->progressView->isVisible();
+ button(KDialog::Details)->setChecked(d->showDetails);
+ if (d->progressView->isVisible()) {
+ QSize windowSize = size();
+ windowSize.rheight() -= d->progressView->height();
+ d->progressView->setVisible(false);
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
+ setMaximumSize(QWIDGETSIZE_MAX, windowSize.height());
+// d->ui.gridLayout->removeWidget(d->progressView);
+ } else {
+ QSize windowSize = size();
+ windowSize.rheight() += d->progressView->height();
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
+// d->ui.gridLayout->addWidget(d->progressView, 1, 0, 1, 2);
+ d->progressView->setVisible(true);
+ resize(windowSize);
+ }
+ }
+ break;
+ default : // Should be only details
+ KDialog::slotButtonClicked(bt);
+ }
+}
+
+void PkTransactionDialog::setTransaction(Transaction *trans)
+{
+ m_ui->setTransaction(trans);
+}
+
+PkTransaction* PkTransactionDialog::transaction() const
+{
+ return m_ui;
+}
+
+void PkTransactionDialog::finishedDialog(PkTransaction::ExitStatus status)
+{
+ if (status == PkTransaction::Cancelled) {
+ done(QDialog::Rejected);
+ } else {
+ done(QDialog::Accepted);
+ }
+}
+
+void PkTransactionDialog::setFiles(const QStringList &files)
+{
+ d->files = files;
+}
+
+#include "PkTransactionDialog.moc"
diff --git a/libkpackagekit/PkTransactionDialog.h \
b/libkpackagekit/PkTransactionDialog.h new file mode 100644
index 0000000..3e71ead
--- /dev/null
+++ b/libkpackagekit/PkTransactionDialog.h
@@ -0,0 +1,73 @@
+/***************************************************************************
+ * Copyright (C) 2008-2011 by Daniel Nicoletti *
+ * dantti85-pk@yahoo.com.br *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; see the file COPYING. If not, write to *
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
+ * Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef PK_TRANSACTION_DIALOG_H
+#define PK_TRANSACTION_DIALOG_H
+
+#include <KDialog>
+#include "PkTransaction.h"
+
+#include <QPackageKit>
+
+using namespace PackageKit;
+
+class KpkSimulateModel;
+class PkTransactionDialogPrivate;
+class KDE_EXPORT PkTransactionDialog : public KDialog
+{
+ Q_OBJECT
+ Q_ENUMS(ExitStatus)
+public:
+ enum BehaviorFlag {
+ Modal = 1,
+ CloseOnFinish = 2
+ };
+ Q_DECLARE_FLAGS(Behaviors, BehaviorFlag)
+
+ explicit PkTransactionDialog(Transaction *trans, Behaviors flags = 0, QWidget \
*parent = 0); + ~PkTransactionDialog();
+
+ void setTransaction(Transaction *trans);
+ PkTransaction* transaction() const;
+
+ KpkSimulateModel* simulateModel() const;
+
+ void setFiles(const QStringList &files);
+
+ PkTransaction::ExitStatus exitStatus() const;
+
+signals:
+ void finished(PkTransaction::ExitStatus status);
+
+private slots:
+ void finishedDialog(PkTransaction::ExitStatus status);
+
+private:
+ PkTransaction *m_ui;
+ Behaviors m_flags;
+ PkTransactionDialogPrivate *d;
+
+protected slots:
+ virtual void slotButtonClicked(int button);
+};
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(PkTransactionDialog::Behaviors)
+
+#endif
diff --git a/libkpackagekit/ProgressView.cpp b/libkpackagekit/ProgressView.cpp
index ce07dd5..5b6ea5b 100644
--- a/libkpackagekit/ProgressView.cpp
+++ b/libkpackagekit/ProgressView.cpp
@@ -33,21 +33,20 @@
#include "TransactionDelegate.h"
ProgressView::ProgressView(QWidget *parent)
- : QWidget(parent),
+ : QTreeView(parent),
m_keepScrollBarBottom(true)
{
m_model = new QStandardItemModel(this);
- m_packageView = new QTreeView(this);
- m_packageView->setModel(m_model);
- m_packageView->setItemDelegate(new TransactionDelegate(this));
- m_packageView->setRootIsDecorated(false);
- m_packageView->setHeaderHidden(true);
- m_packageView->setSelectionMode(QAbstractItemView::NoSelection);
- m_packageView->setEditTriggers(QAbstractItemView::NoEditTriggers);
-// m_packageView->verticalScrollBar()->value();
+ setModel(m_model);
+ setItemDelegate(new TransactionDelegate(this));
+ setRootIsDecorated(false);
+ setHeaderHidden(true);
+ setSelectionMode(QAbstractItemView::NoSelection);
+ setEditTriggers(QAbstractItemView::NoEditTriggers);
+// verticalScrollBar()->value();
- m_scrollBar = m_packageView->verticalScrollBar();
+ m_scrollBar = verticalScrollBar();
connect(m_scrollBar, SIGNAL(sliderMoved(int)),
this, SLOT(followBottom(int)));
connect(m_scrollBar, SIGNAL(valueChanged(int)),
@@ -55,14 +54,6 @@ ProgressView::ProgressView(QWidget *parent)
connect(m_scrollBar, SIGNAL(rangeChanged(int, int)),
this, SLOT(rangeChanged(int, int)));
- m_label = new QLabel(this);
- m_label->hide();
-
- QVBoxLayout *layout = new QVBoxLayout(this);
- layout->setContentsMargins(0, 0, 0, 0);
- layout->addWidget(m_packageView);
- layout->addWidget(m_label);
-
KConfig config("KPackageKit");
KConfigGroup transactionDialog(&config, "TransactionDialog");
@@ -99,9 +90,9 @@ void ProgressView::clear()
{
m_model->clear();
m_model->setColumnCount(3);
- m_packageView->header()->setResizeMode(0, QHeaderView::ResizeToContents);
- m_packageView->header()->setResizeMode(1, QHeaderView::ResizeToContents);
- m_packageView->header()->setStretchLastSection(true);
+ header()->setResizeMode(0, QHeaderView::ResizeToContents);
+ header()->setResizeMode(1, QHeaderView::ResizeToContents);
+ header()->setStretchLastSection(true);
}
void ProgressView::currentPackage(const QSharedPointer<PackageKit::Package> &p)
diff --git a/libkpackagekit/ProgressView.h b/libkpackagekit/ProgressView.h
index 6f1d4f6..1dd3e0b 100644
--- a/libkpackagekit/ProgressView.h
+++ b/libkpackagekit/ProgressView.h
@@ -21,7 +21,6 @@
#ifndef PROGRESS_VIEW_H
#define PROGRESS_VIEW_H
-#include <QWidget>
#include <QStandardItemModel>
#include <QTreeView>
#include <QLabel>
@@ -31,7 +30,7 @@
using namespace PackageKit;
-class ProgressView: public QWidget
+class ProgressView: public QTreeView
{
Q_OBJECT
public:
@@ -59,9 +58,7 @@ private:
QList<QStandardItem *> findItems(const QString &packageId);
QStandardItemModel *m_model;
- QTreeView *m_packageView;
QScrollBar *m_scrollBar;
- QLabel *m_label;
QString m_lastPackageId;
bool m_keepScrollBarBottom;
};
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic