[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    Re: [muon] updater: Port muon-updater to backends
From:       Aleix Pol <aleixpol () kde ! org>
Date:       2012-12-17 4:53:07
Message-ID: CACcA1RrNBQa1aVbXfNRMiSxvGbunpPPY2OkDtNOF=KwSkk7wdw () mail ! gmail ! com
[Download RAW message or body]

On Mon, Dec 17, 2012 at 5:44 AM, Aleix Pol <aleixpol@kde.org> wrote:

> Git commit 7b8475c75cb04a472a9a350c3078632d4fd3594a by Aleix Pol.
> Committed on 17/12/2012 at 05:44.
> Pushed by apol into branch 'master'.
>
> Port muon-updater to backends
>
> Linking was terribly broken since the port. Now we use the
> ApplicationBackend for instantiating all backends.
>
> CCMAIL: echidnaman@kubuntu.org
>
> M  +1    -1    updater/CMakeLists.txt
> M  +20   -37   updater/MainWindow.cpp
> M  +4    -3    updater/MainWindow.h
> M  +23   -15   updater/UpdateModel/UpdateItem.cpp
> M  +8    -4    updater/UpdateModel/UpdateItem.h
> M  +1    -4    updater/UpdateModel/UpdateModel.cpp
> M  +2    -2    updater/UpdateModel/UpdateModel.h
> M  +43   -73   updater/UpdaterWidget.cpp
> M  +7    -4    updater/UpdaterWidget.h
>
> http://commits.kde.org/muon/7b8475c75cb04a472a9a350c3078632d4fd3594a
>
> diff --git a/updater/CMakeLists.txt b/updater/CMakeLists.txt
> index e97ae49..0a9f743 100644
> --- a/updater/CMakeLists.txt
> +++ b/updater/CMakeLists.txt
> @@ -13,7 +13,7 @@ set(muon_updater_SRCS
>
>  kde4_add_executable(muon-updater ${muon_updater_SRCS})
>
> -target_link_libraries(muon-updater muonprivate muon-appsbackend
> +target_link_libraries(muon-updater muonprivate muonapt
>                                     ${KDE4_KIO_LIBS}
>                                     ${KDE4_SOLID_LIBS}
>                                     ${QAPT_LIBRARY})
> diff --git a/updater/MainWindow.cpp b/updater/MainWindow.cpp
> index f983b5b..78ab152 100644
> --- a/updater/MainWindow.cpp
> +++ b/updater/MainWindow.cpp
> @@ -42,6 +42,8 @@
>  #include <LibQApt/Transaction>
>
>  // Own includes
> +#include <MuonBackendsFactory.h>
> +#include <resources/AbstractResourcesBackend.h>
>  #include "../libmuonapt/HistoryView/HistoryView.h"
>  #include "../libmuonapt/MuonStrings.h"
>  #include "../libmuonapt/QAptActions.h"
> @@ -57,7 +59,10 @@ MainWindow::MainWindow()
>      , m_checkerProcess(nullptr)
>  {
>      initGUI();
> -    QTimer::singleShot(10, this, SLOT(initObject()));
> +
> +    MuonBackendsFactory f;
> +    m_apps = f.backend("muon-appsbackend");
> +    connect(m_apps, SIGNAL(backendReady()), SLOT(initBackend()));
>  }
>
>  void MainWindow::initGUI()
> @@ -84,13 +89,9 @@ void MainWindow::initGUI()
>      m_progressWidget->hide();
>
>      m_updaterWidget = new UpdaterWidget(mainWidget);
> -    connect(this, SIGNAL(backendReady(QApt::Backend*)),
> -            m_updaterWidget, SLOT(setBackend(QApt::Backend*)));
>
>      m_changelogWidget = new ChangelogWidget(this);
>      m_changelogWidget->hide();
> -    connect(this, SIGNAL(backendReady(QApt::Backend*)),
> -            m_changelogWidget, SLOT(setBackend(QApt::Backend*)));
>      connect(m_updaterWidget, SIGNAL(packageChanged(QApt::Package*)),
>              m_changelogWidget, SLOT(setPackage(QApt::Package*)));
>
> @@ -100,10 +101,8 @@ void MainWindow::initGUI()
>      mainLayout->addWidget(m_updaterWidget);
>      mainLayout->addWidget(m_changelogWidget);
>
> -    m_backend = new QApt::Backend(this);
>      QAptActions *actions = QAptActions::self();
>      actions->setMainWindow(this);
> -    connect(actions, SIGNAL(checkForUpdates()), this,
> SLOT(checkForUpdates()));
>      setupActions();
>
>      mainWidget->setLayout(mainLayout);
> @@ -112,22 +111,6 @@ void MainWindow::initGUI()
>      checkDistUpgrade();
>  }
>
> -void MainWindow::initObject()
> -{
> -    if (!m_backend->init())
> -        QAptActions::self()->initError();
> -
> -    if (m_backend->xapianIndexNeedsUpdate()) {
> -        m_backend->updateXapianIndex();
> -    }
> -
> -    emit backendReady(m_backend);
> -    QAptActions::self()->setBackend(m_backend);
> -    setCanExit(true);
> -
> -    setActionsEnabled(); //Get initial enabled/disabled state
> -}
> -
>  void MainWindow::setupActions()
>  {
>      MuonMainWindow::setupActions();
> @@ -155,6 +138,13 @@ void MainWindow::setupActions()
>      setupGUI((StandardWindowOption)(KXmlGuiWindow::Default &
> ~KXmlGuiWindow::StatusBar));
>  }
>
> +void MainWindow::initBackend()
> +{
> +    m_updaterWidget->setBackend(m_apps);
> +    m_changelogWidget->setBackend(backend());
> +    m_apps->integrateMainWindow(this);
> +}
> +
>  void MainWindow::transactionStatusChanged(QApt::TransactionStatus status)
>  {
>      // FIXME: better support for transactions that do/don't need reloads
> @@ -220,19 +210,7 @@ void MainWindow::setActionsEnabled(bool enabled)
>          return;
>      }
>
> -    m_applyAction->setEnabled(m_backend->areChangesMarked());
> -    m_updaterWidget->setEnabled(true);
> -}
> -
> -void MainWindow::checkForUpdates()
> -{
> -    setActionsEnabled(false);
> -    m_updaterWidget->setEnabled(false);
> -    QApplication::setOverrideCursor(Qt::WaitCursor);
> -    m_changelogWidget->animatedHide();
> -    m_changelogWidget->stopPendingJobs();
> -
> -    m_trans = m_backend->updateCache();
> +    m_applyAction->setEnabled(backend()->updateCache());
>      setupTransaction(m_trans);
>      m_trans->run();
>  }
> @@ -245,7 +223,7 @@ void MainWindow::startCommit()
>      m_changelogWidget->animatedHide();
>      m_changelogWidget->stopPendingJobs();
>
> -    m_trans = m_backend->commitChanges();
> +    m_trans = backend()->commitChanges();
>      setupTransaction(m_trans);
>      m_trans->run();
>  }
> @@ -365,3 +343,8 @@ void MainWindow::launchDistUpgrade()
>      KProcess::startDetached(QStringList() << "python"
>                              <<
> "/usr/share/pyshared/UpdateManager/DistUpgradeFetcherKDE.py");
>  }
> +
> +QApt::Backend* MainWindow::backend() const
> +{
> +    return
> qobject_cast<QApt::Backend*>(m_apps->property("backend").value<QObject*>());
> +}
> diff --git a/updater/MainWindow.h b/updater/MainWindow.h
> index 8319a44..8f7e3f0 100644
> --- a/updater/MainWindow.h
> +++ b/updater/MainWindow.h
> @@ -27,6 +27,7 @@
>  // Own includes
>  #include "../libmuon/MuonMainWindow.h"
>
> +class AbstractResourcesBackend;
>  class KAction;
>  class KDialog;
>  class KMessageWidget;
> @@ -49,7 +50,7 @@ public:
>      MainWindow();
>
>  private:
> -    QApt::Backend *m_backend;
> +    QApt::Backend* backend() const;
>      QApt::Transaction *m_trans;
>      QString m_pipe;
>
> @@ -70,16 +71,16 @@ private:
>      KAction *m_historyAction;
>
>      KProcess *m_checkerProcess;
> +    AbstractResourcesBackend* m_apps;
>
>  private Q_SLOTS:
>      void initGUI();
> -    void initObject();
> +    void initBackend();
>      void setupActions();
>      void transactionStatusChanged(QApt::TransactionStatus status);
>      void errorOccurred(QApt::ErrorCode error);
>      void reload();
>      void setActionsEnabled(bool enabled = true);
> -    void checkForUpdates();
>      void startCommit();
>      void setupTransaction(QApt::Transaction *trans);
>      void editSettings();
> diff --git a/updater/UpdateModel/UpdateItem.cpp
> b/updater/UpdateModel/UpdateItem.cpp
> index cba307d..6d578ff 100644
> --- a/updater/UpdateModel/UpdateItem.cpp
> +++ b/updater/UpdateModel/UpdateItem.cpp
> @@ -19,10 +19,13 @@
>
> ***************************************************************************/
>
>  #include "UpdateItem.h"
> +#include <resources/AbstractResource.h>
> +#include <resources/AbstractResourcesBackend.h>
>
>  #include <QtCore/QStringBuilder>
> -
> -#include <backends/ApplicationBackend/Application.h>
> +#include <KLocalizedString>
> +#include <LibQApt/Package>
> +#include <LibQApt/Backend>
>
>  UpdateItem::UpdateItem()
>      : m_app(0)
> @@ -41,7 +44,7 @@ UpdateItem::UpdateItem(const QString &categoryName,
>  {
>  }
>
> -UpdateItem::UpdateItem(Application *app, UpdateItem *parent)
> +UpdateItem::UpdateItem(AbstractResource *app, UpdateItem *parent)
>      : m_app(app)
>      , m_parent(parent)
>      , m_type(ItemType::ApplicationItem)
> @@ -50,7 +53,6 @@ UpdateItem::UpdateItem(Application *app, UpdateItem
> *parent)
>
>  UpdateItem::~UpdateItem()
>  {
> -    delete m_app;
>      qDeleteAll(m_children);
>  }
>
> @@ -110,7 +112,7 @@ void UpdateItem::sort()
>            [](UpdateItem *a, UpdateItem *b) { return a->name() <
> b->name(); });
>  }
>
> -Application *UpdateItem::app() const
> +AbstractResource *UpdateItem::app() const
>  {
>      return m_app;
>  }
> @@ -120,12 +122,12 @@ QString UpdateItem::name() const
>      switch (type()) {
>      case ItemType::CategoryItem:
>          return m_categoryName;
> -    case ItemType::ApplicationItem:
> -        if (m_app->package()->isForeignArch()) {
> -            return QString(m_app->name() % QLatin1String(" (")
> -                    % m_app->package()->architecture() % ')');
> +    case ItemType::ApplicationItem: {
> +        QApt::Package* p = retrievePackage();
> +        if (p->isForeignArch()) {
> +            return i18n("%1 (%2)", m_app->name(), p->architecture());
>          }
> -        return m_app->name();
> +    }   return m_app->name();
>      default:
>          break;
>      }
> @@ -137,7 +139,7 @@ QString UpdateItem::version() const
>  {
>      switch (type()) {
>      case ItemType::ApplicationItem:
> -        return m_app->package()->availableVersion();
> +        return m_app->availableVersion();
>      case ItemType::CategoryItem:
>      default:
>          break;
> @@ -166,10 +168,10 @@ qint64 UpdateItem::size() const
>      int size = 0;
>
>      if (itemType == ItemType::ApplicationItem) {
> -        size = m_app->package()->downloadSize();
> +        size = retrievePackage()->downloadSize();
>      } else if (itemType == ItemType::CategoryItem) {
>          foreach (UpdateItem *item, m_children) {
> -            if (item->app()->package()->state() &
> QApt::Package::ToUpgrade) {
> +            if (item->app()->state() & AbstractResource::Upgradeable) {
>                  size += item->size();
>              }
>          }
> @@ -189,7 +191,7 @@ Qt::CheckState UpdateItem::checked() const
>          int uncheckedCount = 0;
>
>          foreach (UpdateItem *child, m_children) {
> -            (child->app()->package()->state() & QApt::Package::ToUpgrade)
> ?
> +            (child->app()->state() & AbstractResource::Upgradeable) ?
>                          checkedCount++ : uncheckedCount++;
>          }
>
> @@ -206,7 +208,7 @@ Qt::CheckState UpdateItem::checked() const
>          break;
>      }
>      case ItemType::ApplicationItem:
> -        (app()->package()->state() & QApt::Package::ToUpgrade) ?
> +        (app()->state() & AbstractResource::Upgradeable) ?
>                      checkState = Qt::Checked : checkState = Qt::Unchecked;
>          break;
>      case ItemType::RootItem:
> @@ -221,3 +223,9 @@ UpdateItem::ItemType UpdateItem::type() const
>  {
>      return m_type;
>  }
> +
> +QApt::Package* UpdateItem::retrievePackage() const
> +{
> +    QApt::Backend* backend =
> qobject_cast<QApt::Backend*>(m_app->backend()->property("backend").value<QObject*>());
> +    return backend->package(m_app->packageName());
> +}
> diff --git a/updater/UpdateModel/UpdateItem.h
> b/updater/UpdateModel/UpdateItem.h
> index 8afd141..59ecd35 100644
> --- a/updater/UpdateModel/UpdateItem.h
> +++ b/updater/UpdateModel/UpdateItem.h
> @@ -27,8 +27,11 @@
>
>  #include <KIcon>
>
> -class Application;
> +namespace QApt {
> +class Package;
> +}
>
> +class AbstractResource;
>  class UpdateItem
>  {
>  public:
> @@ -42,7 +45,7 @@ public:
>      UpdateItem();
>      UpdateItem(const QString &categoryName,
>                 const KIcon &categoryIcon);
> -    explicit UpdateItem(Application *app, UpdateItem *parent = 0);
> +    explicit UpdateItem(AbstractResource *app, UpdateItem *parent = 0);
>
>      ~UpdateItem();
>
> @@ -57,7 +60,7 @@ public:
>      int row() const;
>      void sort();
>
> -    Application *app() const;
> +    AbstractResource *app() const;
>      QString name() const;
>      QString version() const;
>      KIcon icon() const;
> @@ -66,7 +69,8 @@ public:
>      ItemType type() const;
>
>  private:
> -    Application *m_app;
> +    QApt::Package* retrievePackage() const;
> +    AbstractResource *m_app;
>
>      UpdateItem *m_parent;
>      ItemType m_type;
> diff --git a/updater/UpdateModel/UpdateModel.cpp
> b/updater/UpdateModel/UpdateModel.cpp
> index c21687f..7199c3f 100644
> --- a/updater/UpdateModel/UpdateModel.cpp
> +++ b/updater/UpdateModel/UpdateModel.cpp
> @@ -29,9 +29,6 @@
>  #include <KLocale>
>  #include <KDebug>
>
> -// Libmuon includes
> -#include <backends/ApplicationBackend/Application.h>
> -
>  // Own includes
>  #include "UpdateItem.h"
>
> @@ -229,7 +226,7 @@ bool UpdateModel::setData(const QModelIndex &index,
> const QVariant &value, int r
>          bool newValue = value.toBool();
>          UpdateItem::ItemType type = item->type();
>
> -        QList<Application *> apps;
> +        QList<AbstractResource *> apps;
>          if (type == UpdateItem::ItemType::CategoryItem) {
>              // Collect items to (un)check
>              foreach (UpdateItem *child, item->children()) {
> diff --git a/updater/UpdateModel/UpdateModel.h
> b/updater/UpdateModel/UpdateModel.h
> index 9694b4b..ec985b6 100644
> --- a/updater/UpdateModel/UpdateModel.h
> +++ b/updater/UpdateModel/UpdateModel.h
> @@ -23,7 +23,7 @@
>
>  #include <QtCore/QAbstractItemModel>
>
> -class Application;
> +class AbstractResource;
>  class UpdateItem;
>
>  class UpdateModel : public QAbstractItemModel
> @@ -65,7 +65,7 @@ public Q_SLOTS:
>      void packageChanged();
>
>  Q_SIGNALS:
> -    void checkApps(QList<Application *> apps, bool checked);
> +    void checkApps(QList<AbstractResource*> apps, bool checked);
>  };
>
>  #endif // UPDATEMODEL_H
> diff --git a/updater/UpdaterWidget.cpp b/updater/UpdaterWidget.cpp
> index 0babfaa..1766126 100644
> --- a/updater/UpdaterWidget.cpp
> +++ b/updater/UpdaterWidget.cpp
> @@ -41,7 +41,8 @@
>  #include <LibQApt/Backend>
>
>  // Libmuon includes
> -#include <backends/ApplicationBackend/Application.h>
> +#include <resources/AbstractResourcesBackend.h>
> +#include <resources/AbstractResource.h>
>
>  //libmuonapt includes
>  #include "../libmuonapt/ChangesDialog.h"
> @@ -65,8 +66,8 @@ UpdaterWidget::UpdaterWidget(QWidget *parent) :
>
>      m_updateModel = new UpdateModel(page1);
>
> -    connect(m_updateModel, SIGNAL(checkApps(QList<Application*>,bool)),
> -            this, SLOT(checkApps(QList<Application*>,bool)));
> +    connect(m_updateModel,
> SIGNAL(checkApps(QList<AbstractResource*>,bool)),
> +            this, SLOT(checkApps(QList<AbstractResource*>,bool)));
>
>      m_updateView = new QTreeView(page1);
>      m_updateView->setAlternatingRowColors(true);
> @@ -117,9 +118,10 @@ UpdaterWidget::UpdaterWidget(QWidget *parent) :
>      setCurrentWidget(page1);
>  }
>
> -void UpdaterWidget::setBackend(QApt::Backend *backend)
> +void UpdaterWidget::setBackend(AbstractResourcesBackend *backend)
>  {
> -    m_backend = backend;
> +    m_appsBackend = backend;
> +    m_backend =
> qobject_cast<QApt::Backend*>(backend->property("backend").value<QObject*>());
>      connect(m_backend, SIGNAL(packageChanged()),
>              m_updateModel, SLOT(packageChanged()));
>
> @@ -137,9 +139,7 @@ void UpdaterWidget::reload()
>
>  void UpdaterWidget::populateUpdateModel()
>  {
> -    QApt::PackageList upgradeList = m_backend->upgradeablePackages();
> -
> -    if (upgradeList.isEmpty()) {
> +    if (m_appsBackend->updatesCount()==0) {
>          QApplication::restoreOverrideCursor();
>          m_busyWidget->stop();
>          checkUpToDate();
> @@ -154,69 +154,35 @@ void UpdaterWidget::populateUpdateModel()
>
>      UpdateItem *systemItem = new UpdateItem(i18nc("@item:inlistbox",
> "System Updates"),
>
> KIcon("applications-system"));
> -
> -    QDir appDir("/usr/share/app-install/desktop/");
> -    QStringList fileList = appDir.entryList(QDir::Files);
> -
> -    foreach(const QString &fileName, fileList) {
> -        if (fileName.endsWith(QLatin1String(".menu"))) // Skip
> non-desktop files that can slip in
> -            continue;
> -        Application *app = new
> Application("/usr/share/app-install/desktop/" + fileName, m_backend);
> -        QApt::Package *package = app->package();
> -        if (!package || !upgradeList.contains(package)) {
> -            delete app;
> -            continue;
> -        }
> -        int state = package->state();
> -
> -        if (!(state & QApt::Package::Upgradeable)) {
> -            delete app;
> -            continue;
> -        }
> -
> -        UpdateItem *updateItem = new UpdateItem(app);
> -
> -        // Set update type
> -        bool securityFound = false;
> -        for (const QString &archive : package->archives()) {
> -            if (archive.contains(QLatin1String("security"))) {
> -                securityFound = true;
> -                break;
> +
> +    QVector<AbstractResource*> resources = m_appsBackend->allResources();
> +    foreach(AbstractResource* res, resources) {
> +        if(res->state()==AbstractResource::Upgradeable) {
> +            UpdateItem *updateItem = new UpdateItem(res);
> +            QApt::Package* package = retrievePackage(res);
> +
> +            bool securityFound = false;
> +            for (const QString &archive : package->archives()) {
> +                if (archive.contains(QLatin1String("security"))) {
> +                    securityFound = true;
> +                    break;
> +                }
>              }
> -        }
> -
> -        if (securityFound) {
> -            securityItem->appendChild(updateItem);
> -        } else {
> -            appItem->appendChild(updateItem);
> -        }
> -
> -        m_upgradeableApps.append(app);
> -
> -        upgradeList.removeAll(package);
> -    }
> -
> -    // Remaining packages in the upgrade list aren't applications
> -    foreach (QApt::Package *package, upgradeList) {
> -        Application *app = new Application(package, m_backend);
> -        UpdateItem *updateItem = new UpdateItem(app);
> -
> -        // Set update type
> -        bool securityFound = false;
> -        for (const QString &archive : package->archives()) {
> -            if (archive.contains(QLatin1String("security"))) {
> -                securityFound = true;
> -                break;
> +
> +            if(!res->isTechnical()) {
> +                if (securityFound) {
> +                    securityItem->appendChild(updateItem);
> +                } else {
> +                    appItem->appendChild(updateItem);
> +                }
> +            } else {
> +                if (securityFound) {
> +                    securityItem->appendChild(updateItem);
> +                } else {
> +                    systemItem->appendChild(updateItem);
> +                }
>              }
>          }
> -
> -        if (securityFound) {
> -            securityItem->appendChild(updateItem);
> -        } else {
> -            systemItem->appendChild(updateItem);
> -        }
> -
> -        m_upgradeableApps.append(app);
>      }
>
>      // Add populated items to the model
> @@ -252,11 +218,11 @@ void UpdaterWidget::populateUpdateModel()
>      checkUpToDate();
>  }
>
> -void UpdaterWidget::checkApps(QList<Application *> apps, bool checked)
> +void UpdaterWidget::checkApps(QList<AbstractResource*> apps, bool checked)
>  {
>      QApt::PackageList list;
> -    foreach (Application *app, apps) {
> -        list << app->package();
> +    foreach (AbstractResource *app, apps) {
> +        list << retrievePackage(app);
>      }
>
>      QApt::Package::State action = checked ? QApt::Package::ToInstall :
> QApt::Package::ToKeep;
> @@ -303,8 +269,7 @@ void UpdaterWidget::selectionChanged(const
> QItemSelection &selected,
>          return;
>      }
>
> -    Application *app =
> m_updateModel->itemFromIndex(indexes.first())->app();
> -    package = app ? app->package() : 0;
> +    package =
> retrievePackage(m_updateModel->itemFromIndex(indexes.first())->app());
>
>      emit packageChanged(package);
>  }
> @@ -378,3 +343,8 @@ void UpdaterWidget::checkUpToDate()
>          }
>      }
>  }
> +
> +QApt::Package* UpdaterWidget::retrievePackage(AbstractResource* res)
> +{
> +    return res ? m_backend->package(res->packageName()) : 0;
> +}
> diff --git a/updater/UpdaterWidget.h b/updater/UpdaterWidget.h
> index 20e6b17..9a3f95a 100644
> --- a/updater/UpdaterWidget.h
> +++ b/updater/UpdaterWidget.h
> @@ -27,6 +27,8 @@
>  #include <LibQApt/Globals>
>  #include <LibQApt/Package>
>
> +class AbstractResource;
> +class AbstractResourcesBackend;
>  class QItemSelection;
>  class QLabel;
>  class QStandardItemModel;
> @@ -38,7 +40,6 @@ namespace QApt {
>      class Backend;
>  }
>
> -class Application;
>  class UpdateModel;
>
>  class UpdaterWidget : public QStackedWidget
> @@ -48,24 +49,26 @@ public:
>      explicit UpdaterWidget(QWidget *parent = 0);
>
>  private:
> +    QApt::Package* retrievePackage(AbstractResource* res);
> +
>      QApt::Backend *m_backend;
>      QApt::CacheState m_oldCacheState;
>      UpdateModel *m_updateModel;
> -    QList<Application *> m_upgradeableApps;
>
>      QTreeView *m_updateView;
>      KPixmapSequenceOverlayPainter *m_busyWidget;
>      QLabel *m_updateStatusIcon;
>      QLabel *m_notifyTitle;
>      QLabel *m_notifyDesc;
> +    AbstractResourcesBackend* m_appsBackend;
>
>  public Q_SLOTS:
> -    void setBackend(QApt::Backend *backend);
> +    void setBackend(AbstractResourcesBackend* backend);
>      void reload();
>
>  private Q_SLOTS:
>      void populateUpdateModel();
> -    void checkApps(QList<Application *> apps, bool checked);
> +    void checkApps(QList<AbstractResource*> apps, bool checked);
>      void checkChanges(const QHash<QApt::Package::State,
> QApt::PackageList> &removals);
>      void selectionChanged(const QItemSelection &selected,
>                            const QItemSelection &deselected);
>
>
Hey Jonathan,
I ended up doing this before starting to think further about how to work a
new updater, if you could take a look at least, that would help as well.

I'd like to think some things through though. Why do we need such a
fine-grained GUI for updates? I don't think anybody needs this features...
For me it makes total sense to update everything at the same time, and if
the user wants something to stay like it is specifically, he can always go
to muon and pin the current version, which is similar to what you'd do if
you use apt-get.

Does that even make sense? :)

Cheers!
Aleix

[Attachment #3 (text/html)]

On Mon, Dec 17, 2012 at 5:44 AM, Aleix Pol <span dir="ltr">&lt;<a \
href="mailto:aleixpol@kde.org" target="_blank">aleixpol@kde.org</a>&gt;</span> \
wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 \
0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Git commit 7b8475c75cb04a472a9a350c3078632d4fd3594a by Aleix Pol.<br>
Committed on 17/12/2012 at 05:44.<br>
Pushed by apol into branch &#39;master&#39;.<br>
<br>
Port muon-updater to backends<br>
<br>
Linking was terribly broken since the port. Now we use the<br>
ApplicationBackend for instantiating all backends.<br>
<br>
CCMAIL: <a href="mailto:echidnaman@kubuntu.org">echidnaman@kubuntu.org</a><br>
<br>
M   +1      -1      updater/CMakeLists.txt<br>
M   +20    -37    updater/MainWindow.cpp<br>
M   +4      -3      updater/MainWindow.h<br>
M   +23    -15    updater/UpdateModel/UpdateItem.cpp<br>
M   +8      -4      updater/UpdateModel/UpdateItem.h<br>
M   +1      -4      updater/UpdateModel/UpdateModel.cpp<br>
M   +2      -2      updater/UpdateModel/UpdateModel.h<br>
M   +43    -73    updater/UpdaterWidget.cpp<br>
M   +7      -4      updater/UpdaterWidget.h<br>
<br>
<a href="http://commits.kde.org/muon/7b8475c75cb04a472a9a350c3078632d4fd3594a" \
target="_blank">http://commits.kde.org/muon/7b8475c75cb04a472a9a350c3078632d4fd3594a</a><br>
 <br>
diff --git a/updater/CMakeLists.txt b/updater/CMakeLists.txt<br>
index e97ae49..0a9f743 100644<br>
--- a/updater/CMakeLists.txt<br>
+++ b/updater/CMakeLists.txt<br>
@@ -13,7 +13,7 @@ set(muon_updater_SRCS<br>
<br>
  kde4_add_executable(muon-updater ${muon_updater_SRCS})<br>
<br>
-target_link_libraries(muon-updater muonprivate muon-appsbackend<br>
+target_link_libraries(muon-updater muonprivate muonapt<br>
                                                      ${KDE4_KIO_LIBS}<br>
                                                      ${KDE4_SOLID_LIBS}<br>
                                                      ${QAPT_LIBRARY})<br>
diff --git a/updater/MainWindow.cpp b/updater/MainWindow.cpp<br>
index f983b5b..78ab152 100644<br>
--- a/updater/MainWindow.cpp<br>
+++ b/updater/MainWindow.cpp<br>
@@ -42,6 +42,8 @@<br>
  #include &lt;LibQApt/Transaction&gt;<br>
<br>
  // Own includes<br>
+#include &lt;MuonBackendsFactory.h&gt;<br>
+#include &lt;resources/AbstractResourcesBackend.h&gt;<br>
  #include &quot;../libmuonapt/HistoryView/HistoryView.h&quot;<br>
  #include &quot;../libmuonapt/MuonStrings.h&quot;<br>
  #include &quot;../libmuonapt/QAptActions.h&quot;<br>
@@ -57,7 +59,10 @@ MainWindow::MainWindow()<br>
        , m_checkerProcess(nullptr)<br>
  {<br>
        initGUI();<br>
-      QTimer::singleShot(10, this, SLOT(initObject()));<br>
+<br>
+      MuonBackendsFactory f;<br>
+      m_apps = f.backend(&quot;muon-appsbackend&quot;);<br>
+      connect(m_apps, SIGNAL(backendReady()), SLOT(initBackend()));<br>
  }<br>
<br>
  void MainWindow::initGUI()<br>
@@ -84,13 +89,9 @@ void MainWindow::initGUI()<br>
        m_progressWidget-&gt;hide();<br>
<br>
        m_updaterWidget = new UpdaterWidget(mainWidget);<br>
-      connect(this, SIGNAL(backendReady(QApt::Backend*)),<br>
-                  m_updaterWidget, SLOT(setBackend(QApt::Backend*)));<br>
<br>
        m_changelogWidget = new ChangelogWidget(this);<br>
        m_changelogWidget-&gt;hide();<br>
-      connect(this, SIGNAL(backendReady(QApt::Backend*)),<br>
-                  m_changelogWidget, SLOT(setBackend(QApt::Backend*)));<br>
        connect(m_updaterWidget, SIGNAL(packageChanged(QApt::Package*)),<br>
                    m_changelogWidget, SLOT(setPackage(QApt::Package*)));<br>
<br>
@@ -100,10 +101,8 @@ void MainWindow::initGUI()<br>
        mainLayout-&gt;addWidget(m_updaterWidget);<br>
        mainLayout-&gt;addWidget(m_changelogWidget);<br>
<br>
-      m_backend = new QApt::Backend(this);<br>
        QAptActions *actions = QAptActions::self();<br>
        actions-&gt;setMainWindow(this);<br>
-      connect(actions, SIGNAL(checkForUpdates()), this, \
SLOT(checkForUpdates()));<br>  setupActions();<br>
<br>
        mainWidget-&gt;setLayout(mainLayout);<br>
@@ -112,22 +111,6 @@ void MainWindow::initGUI()<br>
        checkDistUpgrade();<br>
  }<br>
<br>
-void MainWindow::initObject()<br>
-{<br>
-      if (!m_backend-&gt;init())<br>
-            QAptActions::self()-&gt;initError();<br>
-<br>
-      if (m_backend-&gt;xapianIndexNeedsUpdate()) {<br>
-            m_backend-&gt;updateXapianIndex();<br>
-      }<br>
-<br>
-      emit backendReady(m_backend);<br>
-      QAptActions::self()-&gt;setBackend(m_backend);<br>
-      setCanExit(true);<br>
-<br>
-      setActionsEnabled(); //Get initial enabled/disabled state<br>
-}<br>
-<br>
  void MainWindow::setupActions()<br>
  {<br>
        MuonMainWindow::setupActions();<br>
@@ -155,6 +138,13 @@ void MainWindow::setupActions()<br>
        setupGUI((StandardWindowOption)(KXmlGuiWindow::Default &amp; \
~KXmlGuiWindow::StatusBar));<br>  }<br>
<br>
+void MainWindow::initBackend()<br>
+{<br>
+      m_updaterWidget-&gt;setBackend(m_apps);<br>
+      m_changelogWidget-&gt;setBackend(backend());<br>
+      m_apps-&gt;integrateMainWindow(this);<br>
+}<br>
+<br>
  void MainWindow::transactionStatusChanged(QApt::TransactionStatus status)<br>
  {<br>
        // FIXME: better support for transactions that do/don&#39;t need reloads<br>
@@ -220,19 +210,7 @@ void MainWindow::setActionsEnabled(bool enabled)<br>
              return;<br>
        }<br>
<br>
-      m_applyAction-&gt;setEnabled(m_backend-&gt;areChangesMarked());<br>
-      m_updaterWidget-&gt;setEnabled(true);<br>
-}<br>
-<br>
-void MainWindow::checkForUpdates()<br>
-{<br>
-      setActionsEnabled(false);<br>
-      m_updaterWidget-&gt;setEnabled(false);<br>
-      QApplication::setOverrideCursor(Qt::WaitCursor);<br>
-      m_changelogWidget-&gt;animatedHide();<br>
-      m_changelogWidget-&gt;stopPendingJobs();<br>
-<br>
-      m_trans = m_backend-&gt;updateCache();<br>
+      m_applyAction-&gt;setEnabled(backend()-&gt;updateCache());<br>
        setupTransaction(m_trans);<br>
        m_trans-&gt;run();<br>
  }<br>
@@ -245,7 +223,7 @@ void MainWindow::startCommit()<br>
        m_changelogWidget-&gt;animatedHide();<br>
        m_changelogWidget-&gt;stopPendingJobs();<br>
<br>
-      m_trans = m_backend-&gt;commitChanges();<br>
+      m_trans = backend()-&gt;commitChanges();<br>
        setupTransaction(m_trans);<br>
        m_trans-&gt;run();<br>
  }<br>
@@ -365,3 +343,8 @@ void MainWindow::launchDistUpgrade()<br>
        KProcess::startDetached(QStringList() &lt;&lt; &quot;python&quot;<br>
                                            &lt;&lt; \
&quot;/usr/share/pyshared/UpdateManager/DistUpgradeFetcherKDE.py&quot;);<br>  }<br>
+<br>
+QApt::Backend* MainWindow::backend() const<br>
+{<br>
+      return qobject_cast&lt;QApt::Backend*&gt;(m_apps-&gt;property(&quot;backend&quot;).value&lt;QObject*&gt;());<br>
 +}<br>
diff --git a/updater/MainWindow.h b/updater/MainWindow.h<br>
index 8319a44..8f7e3f0 100644<br>
--- a/updater/MainWindow.h<br>
+++ b/updater/MainWindow.h<br>
@@ -27,6 +27,7 @@<br>
  // Own includes<br>
  #include &quot;../libmuon/MuonMainWindow.h&quot;<br>
<br>
+class AbstractResourcesBackend;<br>
  class KAction;<br>
  class KDialog;<br>
  class KMessageWidget;<br>
@@ -49,7 +50,7 @@ public:<br>
        MainWindow();<br>
<br>
  private:<br>
-      QApt::Backend *m_backend;<br>
+      QApt::Backend* backend() const;<br>
        QApt::Transaction *m_trans;<br>
        QString m_pipe;<br>
<br>
@@ -70,16 +71,16 @@ private:<br>
        KAction *m_historyAction;<br>
<br>
        KProcess *m_checkerProcess;<br>
+      AbstractResourcesBackend* m_apps;<br>
<br>
  private Q_SLOTS:<br>
        void initGUI();<br>
-      void initObject();<br>
+      void initBackend();<br>
        void setupActions();<br>
        void transactionStatusChanged(QApt::TransactionStatus status);<br>
        void errorOccurred(QApt::ErrorCode error);<br>
        void reload();<br>
        void setActionsEnabled(bool enabled = true);<br>
-      void checkForUpdates();<br>
        void startCommit();<br>
        void setupTransaction(QApt::Transaction *trans);<br>
        void editSettings();<br>
diff --git a/updater/UpdateModel/UpdateItem.cpp \
b/updater/UpdateModel/UpdateItem.cpp<br> index cba307d..6d578ff 100644<br>
--- a/updater/UpdateModel/UpdateItem.cpp<br>
+++ b/updater/UpdateModel/UpdateItem.cpp<br>
@@ -19,10 +19,13 @@<br>
   ***************************************************************************/<br>
<br>
  #include &quot;UpdateItem.h&quot;<br>
+#include &lt;resources/AbstractResource.h&gt;<br>
+#include &lt;resources/AbstractResourcesBackend.h&gt;<br>
<br>
  #include &lt;QtCore/QStringBuilder&gt;<br>
-<br>
-#include &lt;backends/ApplicationBackend/Application.h&gt;<br>
+#include &lt;KLocalizedString&gt;<br>
+#include &lt;LibQApt/Package&gt;<br>
+#include &lt;LibQApt/Backend&gt;<br>
<br>
  UpdateItem::UpdateItem()<br>
        : m_app(0)<br>
@@ -41,7 +44,7 @@ UpdateItem::UpdateItem(const QString &amp;categoryName,<br>
  {<br>
  }<br>
<br>
-UpdateItem::UpdateItem(Application *app, UpdateItem *parent)<br>
+UpdateItem::UpdateItem(AbstractResource *app, UpdateItem *parent)<br>
        : m_app(app)<br>
        , m_parent(parent)<br>
        , m_type(ItemType::ApplicationItem)<br>
@@ -50,7 +53,6 @@ UpdateItem::UpdateItem(Application *app, UpdateItem *parent)<br>
<br>
  UpdateItem::~UpdateItem()<br>
  {<br>
-      delete m_app;<br>
        qDeleteAll(m_children);<br>
  }<br>
<br>
@@ -110,7 +112,7 @@ void UpdateItem::sort()<br>
                 [](UpdateItem *a, UpdateItem *b) { return a-&gt;name() &lt; \
b-&gt;name(); });<br>  }<br>
<br>
-Application *UpdateItem::app() const<br>
+AbstractResource *UpdateItem::app() const<br>
  {<br>
        return m_app;<br>
  }<br>
@@ -120,12 +122,12 @@ QString UpdateItem::name() const<br>
        switch (type()) {<br>
        case ItemType::CategoryItem:<br>
              return m_categoryName;<br>
-      case ItemType::ApplicationItem:<br>
-            if (m_app-&gt;package()-&gt;isForeignArch()) {<br>
-                  return QString(m_app-&gt;name() % QLatin1String(&quot; \
                (&quot;)<br>
-                              % m_app-&gt;package()-&gt;architecture() % \
&#39;)&#39;);<br> +      case ItemType::ApplicationItem: {<br>
+            QApt::Package* p = retrievePackage();<br>
+            if (p-&gt;isForeignArch()) {<br>
+                  return i18n(&quot;%1 (%2)&quot;, m_app-&gt;name(), \
p-&gt;architecture());<br>  }<br>
-            return m_app-&gt;name();<br>
+      }    return m_app-&gt;name();<br>
        default:<br>
              break;<br>
        }<br>
@@ -137,7 +139,7 @@ QString UpdateItem::version() const<br>
  {<br>
        switch (type()) {<br>
        case ItemType::ApplicationItem:<br>
-            return m_app-&gt;package()-&gt;availableVersion();<br>
+            return m_app-&gt;availableVersion();<br>
        case ItemType::CategoryItem:<br>
        default:<br>
              break;<br>
@@ -166,10 +168,10 @@ qint64 UpdateItem::size() const<br>
        int size = 0;<br>
<br>
        if (itemType == ItemType::ApplicationItem) {<br>
-            size = m_app-&gt;package()-&gt;downloadSize();<br>
+            size = retrievePackage()-&gt;downloadSize();<br>
        } else if (itemType == ItemType::CategoryItem) {<br>
              foreach (UpdateItem *item, m_children) {<br>
-                  if (item-&gt;app()-&gt;package()-&gt;state() &amp; \
QApt::Package::ToUpgrade) {<br> +                  if (item-&gt;app()-&gt;state() \
&amp; AbstractResource::Upgradeable) {<br>  size += item-&gt;size();<br>
                    }<br>
              }<br>
@@ -189,7 +191,7 @@ Qt::CheckState UpdateItem::checked() const<br>
              int uncheckedCount = 0;<br>
<br>
              foreach (UpdateItem *child, m_children) {<br>
-                  (child-&gt;app()-&gt;package()-&gt;state() &amp; \
QApt::Package::ToUpgrade) ?<br> +                  (child-&gt;app()-&gt;state() &amp; \
                AbstractResource::Upgradeable) ?<br>
                                      checkedCount++ : uncheckedCount++;<br>
              }<br>
<br>
@@ -206,7 +208,7 @@ Qt::CheckState UpdateItem::checked() const<br>
              break;<br>
        }<br>
        case ItemType::ApplicationItem:<br>
-            (app()-&gt;package()-&gt;state() &amp; QApt::Package::ToUpgrade) ?<br>
+            (app()-&gt;state() &amp; AbstractResource::Upgradeable) ?<br>
                                checkState = Qt::Checked : checkState = \
Qt::Unchecked;<br>  break;<br>
        case ItemType::RootItem:<br>
@@ -221,3 +223,9 @@ UpdateItem::ItemType UpdateItem::type() const<br>
  {<br>
        return m_type;<br>
  }<br>
+<br>
+QApt::Package* UpdateItem::retrievePackage() const<br>
+{<br>
+      QApt::Backend* backend = \
qobject_cast&lt;QApt::Backend*&gt;(m_app-&gt;backend()-&gt;property(&quot;backend&quot;).value&lt;QObject*&gt;());<br>
 +      return backend-&gt;package(m_app-&gt;packageName());<br>
+}<br>
diff --git a/updater/UpdateModel/UpdateItem.h b/updater/UpdateModel/UpdateItem.h<br>
index 8afd141..59ecd35 100644<br>
--- a/updater/UpdateModel/UpdateItem.h<br>
+++ b/updater/UpdateModel/UpdateItem.h<br>
@@ -27,8 +27,11 @@<br>
<br>
  #include &lt;KIcon&gt;<br>
<br>
-class Application;<br>
+namespace QApt {<br>
+class Package;<br>
+}<br>
<br>
+class AbstractResource;<br>
  class UpdateItem<br>
  {<br>
  public:<br>
@@ -42,7 +45,7 @@ public:<br>
        UpdateItem();<br>
        UpdateItem(const QString &amp;categoryName,<br>
                        const KIcon &amp;categoryIcon);<br>
-      explicit UpdateItem(Application *app, UpdateItem *parent = 0);<br>
+      explicit UpdateItem(AbstractResource *app, UpdateItem *parent = 0);<br>
<br>
        ~UpdateItem();<br>
<br>
@@ -57,7 +60,7 @@ public:<br>
        int row() const;<br>
        void sort();<br>
<br>
-      Application *app() const;<br>
+      AbstractResource *app() const;<br>
        QString name() const;<br>
        QString version() const;<br>
        KIcon icon() const;<br>
@@ -66,7 +69,8 @@ public:<br>
        ItemType type() const;<br>
<br>
  private:<br>
-      Application *m_app;<br>
+      QApt::Package* retrievePackage() const;<br>
+      AbstractResource *m_app;<br>
<br>
        UpdateItem *m_parent;<br>
        ItemType m_type;<br>
diff --git a/updater/UpdateModel/UpdateModel.cpp \
b/updater/UpdateModel/UpdateModel.cpp<br> index c21687f..7199c3f 100644<br>
--- a/updater/UpdateModel/UpdateModel.cpp<br>
+++ b/updater/UpdateModel/UpdateModel.cpp<br>
@@ -29,9 +29,6 @@<br>
  #include &lt;KLocale&gt;<br>
  #include &lt;KDebug&gt;<br>
<br>
-// Libmuon includes<br>
-#include &lt;backends/ApplicationBackend/Application.h&gt;<br>
-<br>
  // Own includes<br>
  #include &quot;UpdateItem.h&quot;<br>
<br>
@@ -229,7 +226,7 @@ bool UpdateModel::setData(const QModelIndex &amp;index, const \
QVariant &amp;value, int r<br>  bool newValue = value.toBool();<br>
              UpdateItem::ItemType type = item-&gt;type();<br>
<br>
-            QList&lt;Application *&gt; apps;<br>
+            QList&lt;AbstractResource *&gt; apps;<br>
              if (type == UpdateItem::ItemType::CategoryItem) {<br>
                    // Collect items to (un)check<br>
                    foreach (UpdateItem *child, item-&gt;children()) {<br>
diff --git a/updater/UpdateModel/UpdateModel.h \
b/updater/UpdateModel/UpdateModel.h<br> index 9694b4b..ec985b6 100644<br>
--- a/updater/UpdateModel/UpdateModel.h<br>
+++ b/updater/UpdateModel/UpdateModel.h<br>
@@ -23,7 +23,7 @@<br>
<br>
  #include &lt;QtCore/QAbstractItemModel&gt;<br>
<br>
-class Application;<br>
+class AbstractResource;<br>
  class UpdateItem;<br>
<br>
  class UpdateModel : public QAbstractItemModel<br>
@@ -65,7 +65,7 @@ public Q_SLOTS:<br>
        void packageChanged();<br>
<br>
  Q_SIGNALS:<br>
-      void checkApps(QList&lt;Application *&gt; apps, bool checked);<br>
+      void checkApps(QList&lt;AbstractResource*&gt; apps, bool checked);<br>
  };<br>
<br>
  #endif // UPDATEMODEL_H<br>
diff --git a/updater/UpdaterWidget.cpp b/updater/UpdaterWidget.cpp<br>
index 0babfaa..1766126 100644<br>
--- a/updater/UpdaterWidget.cpp<br>
+++ b/updater/UpdaterWidget.cpp<br>
@@ -41,7 +41,8 @@<br>
  #include &lt;LibQApt/Backend&gt;<br>
<br>
  // Libmuon includes<br>
-#include &lt;backends/ApplicationBackend/Application.h&gt;<br>
+#include &lt;resources/AbstractResourcesBackend.h&gt;<br>
+#include &lt;resources/AbstractResource.h&gt;<br>
<br>
  //libmuonapt includes<br>
  #include &quot;../libmuonapt/ChangesDialog.h&quot;<br>
@@ -65,8 +66,8 @@ UpdaterWidget::UpdaterWidget(QWidget *parent) :<br>
<br>
        m_updateModel = new UpdateModel(page1);<br>
<br>
-      connect(m_updateModel, SIGNAL(checkApps(QList&lt;Application*&gt;,bool)),<br>
-                  this, SLOT(checkApps(QList&lt;Application*&gt;,bool)));<br>
+      connect(m_updateModel, \
SIGNAL(checkApps(QList&lt;AbstractResource*&gt;,bool)),<br> +                  this, \
SLOT(checkApps(QList&lt;AbstractResource*&gt;,bool)));<br> <br>
        m_updateView = new QTreeView(page1);<br>
        m_updateView-&gt;setAlternatingRowColors(true);<br>
@@ -117,9 +118,10 @@ UpdaterWidget::UpdaterWidget(QWidget *parent) :<br>
        setCurrentWidget(page1);<br>
  }<br>
<br>
-void UpdaterWidget::setBackend(QApt::Backend *backend)<br>
+void UpdaterWidget::setBackend(AbstractResourcesBackend *backend)<br>
  {<br>
-      m_backend = backend;<br>
+      m_appsBackend = backend;<br>
+      m_backend = qobject_cast&lt;QApt::Backend*&gt;(backend-&gt;property(&quot;backend&quot;).value&lt;QObject*&gt;());<br>
  connect(m_backend, SIGNAL(packageChanged()),<br>
                    m_updateModel, SLOT(packageChanged()));<br>
<br>
@@ -137,9 +139,7 @@ void UpdaterWidget::reload()<br>
<br>
  void UpdaterWidget::populateUpdateModel()<br>
  {<br>
-      QApt::PackageList upgradeList = m_backend-&gt;upgradeablePackages();<br>
-<br>
-      if (upgradeList.isEmpty()) {<br>
+      if (m_appsBackend-&gt;updatesCount()==0) {<br>
              QApplication::restoreOverrideCursor();<br>
              m_busyWidget-&gt;stop();<br>
              checkUpToDate();<br>
@@ -154,69 +154,35 @@ void UpdaterWidget::populateUpdateModel()<br>
<br>
        UpdateItem *systemItem = new UpdateItem(i18nc(&quot;@item:inlistbox&quot;, \
                &quot;System Updates&quot;),<br>
                                                                     \
                KIcon(&quot;applications-system&quot;));<br>
-<br>
-      QDir appDir(&quot;/usr/share/app-install/desktop/&quot;);<br>
-      QStringList fileList = appDir.entryList(QDir::Files);<br>
-<br>
-      foreach(const QString &amp;fileName, fileList) {<br>
-            if (fileName.endsWith(QLatin1String(&quot;.menu&quot;))) // Skip \
                non-desktop files that can slip in<br>
-                  continue;<br>
-            Application *app = new \
                Application(&quot;/usr/share/app-install/desktop/&quot; + fileName, \
                m_backend);<br>
-            QApt::Package *package = app-&gt;package();<br>
-            if (!package || !upgradeList.contains(package)) {<br>
-                  delete app;<br>
-                  continue;<br>
-            }<br>
-            int state = package-&gt;state();<br>
-<br>
-            if (!(state &amp; QApt::Package::Upgradeable)) {<br>
-                  delete app;<br>
-                  continue;<br>
-            }<br>
-<br>
-            UpdateItem *updateItem = new UpdateItem(app);<br>
-<br>
-            // Set update type<br>
-            bool securityFound = false;<br>
-            for (const QString &amp;archive : package-&gt;archives()) {<br>
-                  if (archive.contains(QLatin1String(&quot;security&quot;))) {<br>
-                        securityFound = true;<br>
-                        break;<br>
+<br>
+      QVector&lt;AbstractResource*&gt; resources = \
m_appsBackend-&gt;allResources();<br> +      foreach(AbstractResource* res, \
resources) {<br> +            if(res-&gt;state()==AbstractResource::Upgradeable) \
{<br> +                  UpdateItem *updateItem = new UpdateItem(res);<br>
+                  QApt::Package* package = retrievePackage(res);<br>
+<br>
+                  bool securityFound = false;<br>
+                  for (const QString &amp;archive : package-&gt;archives()) {<br>
+                        if (archive.contains(QLatin1String(&quot;security&quot;))) \
{<br> +                              securityFound = true;<br>
+                              break;<br>
+                        }<br>
                    }<br>
-            }<br>
-<br>
-            if (securityFound) {<br>
-                  securityItem-&gt;appendChild(updateItem);<br>
-            } else {<br>
-                  appItem-&gt;appendChild(updateItem);<br>
-            }<br>
-<br>
-            m_upgradeableApps.append(app);<br>
-<br>
-            upgradeList.removeAll(package);<br>
-      }<br>
-<br>
-      // Remaining packages in the upgrade list aren&#39;t applications<br>
-      foreach (QApt::Package *package, upgradeList) {<br>
-            Application *app = new Application(package, m_backend);<br>
-            UpdateItem *updateItem = new UpdateItem(app);<br>
-<br>
-            // Set update type<br>
-            bool securityFound = false;<br>
-            for (const QString &amp;archive : package-&gt;archives()) {<br>
-                  if (archive.contains(QLatin1String(&quot;security&quot;))) {<br>
-                        securityFound = true;<br>
-                        break;<br>
+<br>
+                  if(!res-&gt;isTechnical()) {<br>
+                        if (securityFound) {<br>
+                              securityItem-&gt;appendChild(updateItem);<br>
+                        } else {<br>
+                              appItem-&gt;appendChild(updateItem);<br>
+                        }<br>
+                  } else {<br>
+                        if (securityFound) {<br>
+                              securityItem-&gt;appendChild(updateItem);<br>
+                        } else {<br>
+                              systemItem-&gt;appendChild(updateItem);<br>
+                        }<br>
                    }<br>
              }<br>
-<br>
-            if (securityFound) {<br>
-                  securityItem-&gt;appendChild(updateItem);<br>
-            } else {<br>
-                  systemItem-&gt;appendChild(updateItem);<br>
-            }<br>
-<br>
-            m_upgradeableApps.append(app);<br>
        }<br>
<br>
        // Add populated items to the model<br>
@@ -252,11 +218,11 @@ void UpdaterWidget::populateUpdateModel()<br>
        checkUpToDate();<br>
  }<br>
<br>
-void UpdaterWidget::checkApps(QList&lt;Application *&gt; apps, bool checked)<br>
+void UpdaterWidget::checkApps(QList&lt;AbstractResource*&gt; apps, bool checked)<br>
  {<br>
        QApt::PackageList list;<br>
-      foreach (Application *app, apps) {<br>
-            list &lt;&lt; app-&gt;package();<br>
+      foreach (AbstractResource *app, apps) {<br>
+            list &lt;&lt; retrievePackage(app);<br>
        }<br>
<br>
        QApt::Package::State action = checked ? QApt::Package::ToInstall : \
QApt::Package::ToKeep;<br> @@ -303,8 +269,7 @@ void \
UpdaterWidget::selectionChanged(const QItemSelection &amp;selected,<br>  return;<br>
        }<br>
<br>
-      Application *app = \
                m_updateModel-&gt;itemFromIndex(indexes.first())-&gt;app();<br>
-      package = app ? app-&gt;package() : 0;<br>
+      package = retrievePackage(m_updateModel-&gt;itemFromIndex(indexes.first())-&gt;app());<br>
 <br>
        emit packageChanged(package);<br>
  }<br>
@@ -378,3 +343,8 @@ void UpdaterWidget::checkUpToDate()<br>
              }<br>
        }<br>
  }<br>
+<br>
+QApt::Package* UpdaterWidget::retrievePackage(AbstractResource* res)<br>
+{<br>
+      return res ? m_backend-&gt;package(res-&gt;packageName()) : 0;<br>
+}<br>
diff --git a/updater/UpdaterWidget.h b/updater/UpdaterWidget.h<br>
index 20e6b17..9a3f95a 100644<br>
--- a/updater/UpdaterWidget.h<br>
+++ b/updater/UpdaterWidget.h<br>
@@ -27,6 +27,8 @@<br>
  #include &lt;LibQApt/Globals&gt;<br>
  #include &lt;LibQApt/Package&gt;<br>
<br>
+class AbstractResource;<br>
+class AbstractResourcesBackend;<br>
  class QItemSelection;<br>
  class QLabel;<br>
  class QStandardItemModel;<br>
@@ -38,7 +40,6 @@ namespace QApt {<br>
        class Backend;<br>
  }<br>
<br>
-class Application;<br>
  class UpdateModel;<br>
<br>
  class UpdaterWidget : public QStackedWidget<br>
@@ -48,24 +49,26 @@ public:<br>
        explicit UpdaterWidget(QWidget *parent = 0);<br>
<br>
  private:<br>
+      QApt::Package* retrievePackage(AbstractResource* res);<br>
+<br>
        QApt::Backend *m_backend;<br>
        QApt::CacheState m_oldCacheState;<br>
        UpdateModel *m_updateModel;<br>
-      QList&lt;Application *&gt; m_upgradeableApps;<br>
<br>
        QTreeView *m_updateView;<br>
        KPixmapSequenceOverlayPainter *m_busyWidget;<br>
        QLabel *m_updateStatusIcon;<br>
        QLabel *m_notifyTitle;<br>
        QLabel *m_notifyDesc;<br>
+      AbstractResourcesBackend* m_appsBackend;<br>
<br>
  public Q_SLOTS:<br>
-      void setBackend(QApt::Backend *backend);<br>
+      void setBackend(AbstractResourcesBackend* backend);<br>
        void reload();<br>
<br>
  private Q_SLOTS:<br>
        void populateUpdateModel();<br>
-      void checkApps(QList&lt;Application *&gt; apps, bool checked);<br>
+      void checkApps(QList&lt;AbstractResource*&gt; apps, bool checked);<br>
        void checkChanges(const QHash&lt;QApt::Package::State, QApt::PackageList&gt; \
&amp;removals);<br>  void selectionChanged(const QItemSelection &amp;selected,<br>
                                         const QItemSelection &amp;deselected);<br>
<br>
</blockquote></div><br><div>Hey Jonathan,</div><div>I ended up doing this before \
starting to think further about how to work a new updater, if you could take a look \
at least, that would help as well.</div><div><br></div>

<div>I&#39;d like to think some things through though. Why do we need such a \
fine-grained GUI for updates? I don&#39;t think anybody needs this features... For me \
it makes total sense to update everything at the same time, and if the user wants \
something to stay like it is specifically, he can always go to muon and pin the \
current version, which is similar to what you&#39;d do if you use apt-get.</div>

<div><br></div><div>Does that even make sense? \
:)</div><div><br></div><div>Cheers!</div><div>Aleix</div>



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic