[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