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

List:       kde-commits
Subject:    playground/sysadmin/shaman
From:       Dario Freddi <drf () kde ! org>
Date:       2009-12-25 18:22:32
Message-ID: 1261765352.071676.20626.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1066088 by dafre:

Holy crap, that is more than awesome :D Now providers are correctly displayed in the \
main view, and the ABS plugin is a proof

Signed-off-by: Dario Freddi <drf@kde.org>

 M  +5 -3      libshaman/PluginLoader.cpp  
 M  +2 -2      libshaman/PluginLoader_p.h  
 M  +4 -4      libshaman/shamanbase.cpp  
 M  +3 -3      libshaman/shamanbase.h  
 M  +4 -4      libshaman/shamanbase_p.h  
 M  +1 -1      libshaman/shamancoreinterface.h  
 M  +1 -1      libshaman/shamanprovider.h  
 M  +2 -0      libshaman/shamanproviderplugin.cpp  
 M  +2 -2      plugins/abs/AbsPackage.cpp  
 M  +3 -0      plugins/abs/AbsPlugin.cpp  
 M  +1 -1      plugins/packagesview/PackagesModel.cpp  
 M  +85 -1     plugins/packagesview/PackagesViewWidget.cpp  
 M  +6 -0      plugins/packagesview/PackagesViewWidget.h  
 M  +4 -0      shaman/src/MainWindow.cpp  


--- trunk/playground/sysadmin/shaman/libshaman/PluginLoader.cpp #1066087:1066088
@@ -173,11 +173,13 @@
                 kDebug(5001) << "Gui-Plugin script" << scriptname;
             }*/
 
+            // Create a provider out of it BEFORE initializing it
+            Provider *provider = new Provider(plugin, q->parent());
+
+            // Now initialize
+            plugin->d_func()->setPluginName(offer->name());
             plugin->init();
-            plugin->d_func()->setPluginName(offer->name());
 
-            // Create a provider out of it
-            Provider *provider = new Provider(plugin, q->parent());
             providerPlugins.append(provider);
 
             emit q->providerCreated(provider);
--- trunk/playground/sysadmin/shaman/libshaman/PluginLoader_p.h #1066087:1066088
@@ -47,10 +47,10 @@
         KConfigGroup configGroupFor(const QString &interface) const;
 
     signals:
-        void backendPluginCreated(Backend *backend);
+        void backendPluginCreated(Shaman::Backend *backend);
         void corePluginCreated(CorePlugin *gui);
         void guiPluginCreated(GuiPlugin *gui);
-        void providerCreated(Provider *provider);
+        void providerCreated(Shaman::Provider *provider);
         void pluginsLoaded();
 
     private:
--- trunk/playground/sysadmin/shaman/libshaman/shamanbase.cpp #1066087:1066088
@@ -65,7 +65,7 @@
     Q_D(Base);
     //Initialize CoreInterface
     d->coreInterface = new CoreInterface(this);
-    
+
     if (gui) {
         if (!d->statusBarInterface) {
             kWarning() << "No StatusBar set!";
@@ -82,8 +82,8 @@
 
     //Initialize PluginLoader
     d->pluginLoader = new PluginLoader(d->config, this);
-    connect(d->pluginLoader, SIGNAL(backendPluginCreated(Backend*)), \
                SLOT(__k__slotBackendCreated(Backend*)));
-    connect(d->pluginLoader, SIGNAL(providerPluginCreated(ProviderPlugin*)), \
SLOT(__k__slotProviderPluginCreated(ProviderPlugin*))); +    connect(d->pluginLoader, \
SIGNAL(backendPluginCreated(Shaman::Backend*)), \
SLOT(__k__slotBackendCreated(Shaman::Backend*))); +    connect(d->pluginLoader, \
SIGNAL(providerCreated(Shaman::Provider*)), \
                SLOT(__k__slotProviderCreated(Shaman::Provider*)));
     connect(d->pluginLoader, SIGNAL(pluginsLoaded()), \
                SLOT(__k__slotSetProviderPlugins()));
     connect(d->pluginLoader, SIGNAL(pluginsLoaded()), this, \
SLOT(__k__initCompleted()));  
@@ -159,7 +159,7 @@
     coreInterface->d_func()->setBackend(backend);
 }
 
-void BasePrivate::__k__slotProviderPluginCreated(ProviderPlugin *provider)
+void BasePrivate::__k__slotProviderCreated(Provider *provider)
 {
     Q_Q(Base);
     q->connect(q, SIGNAL(destroyed()), provider, SLOT(deleteLater()));
--- trunk/playground/sysadmin/shaman/libshaman/shamanbase.h #1066087:1066088
@@ -26,7 +26,7 @@
 class CoreInterface;
 class StatusBarInterface;
 class Backend;
-class ProviderPlugin;
+class Provider;
 
 class BasePrivate;
 /** \class Base shamanbase.h
@@ -57,8 +57,8 @@
     friend class BackendPrivate;
     friend class PluginConfig;
 
-    Q_PRIVATE_SLOT(d_func(), void __k__slotBackendCreated(Backend *backend))
-    Q_PRIVATE_SLOT(d_func(), void __k__slotProviderPluginCreated(ProviderPlugin \
*provider)) +    Q_PRIVATE_SLOT(d_func(), void \
__k__slotBackendCreated(Shaman::Backend *backend)) +    Q_PRIVATE_SLOT(d_func(), void \
__k__slotProviderCreated(Shaman::Provider *provider))  Q_PRIVATE_SLOT(d_func(), void \
__k__slotSetProviderPlugins())  Q_PRIVATE_SLOT(d_func(), void __k__initCompleted())
     public:
--- trunk/playground/sysadmin/shaman/libshaman/shamanbase_p.h #1066087:1066088
@@ -18,7 +18,7 @@
 #include "shamancoreinterface.h"
 #include "shamanstatusbarinterface.h"
 #include "shamanbackend.h"
-#include "shamanproviderplugin.h"
+#include "shamanprovider.h"
 
 namespace Shaman {
 class PluginLoader;
@@ -36,7 +36,7 @@
         {}
         ~BasePrivate()
         {}
-        
+
         Q_DECLARE_PUBLIC(Base)
         Base *q_ptr;
 
@@ -47,9 +47,9 @@
         KSharedConfig::Ptr config;
         Base::PluginTypes pluginTypes;
         QStringList plugins;
-        
+
         void __k__slotBackendCreated(Backend *backend);
-        void __k__slotProviderPluginCreated(ProviderPlugin *provider);
+        void __k__slotProviderCreated(Provider *provider);
         void __k__slotSetProviderPlugins();
         void __k__initCompleted();
 };
--- trunk/playground/sysadmin/shaman/libshaman/shamancoreinterface.h #1066087:1066088
@@ -88,7 +88,7 @@
          * This gets emitted when the list of ProviderPlugins changed.
          * @see providerPlugins()
          */
-        void providersChanged(Provider::List providerPlugins);
+        void providersChanged(Shaman::Provider::List providerPlugins);
 
         /**
          * This gets emitted when the current Package changed.
--- trunk/playground/sysadmin/shaman/libshaman/shamanprovider.h #1066087:1066088
@@ -54,7 +54,7 @@
         void search(const QString &search);
 
     Q_SIGNALS:
-        void queueChanged(const Shaman::ProviderPackage::List &packages);
+        void availablePackagesChanged(const Shaman::AbstractPackage::List \
                &packages);
         void additionalTargetsRetrieved(const Shaman::AbstractPackage::List \
&additionalProvider);  void stateChanged(Shaman::Backend::State state);
         //void errorTriggered(Shaman::Provider::Error error, const QString \
                &details);
--- trunk/playground/sysadmin/shaman/libshaman/shamanproviderplugin.cpp \
#1066087:1066088 @@ -63,6 +63,7 @@
     if (d->provider->capabilities() & \
Provider::RetrieveAdditionalPackagesOnSearchCapability) {  // Then we need to \
populate the cache as well  d->searchCache = d->searchCache.unite(result.toSet());
+        emit d->provider->availablePackagesChanged(d->provider->allAvailablePackages().toList());
  }
     emit d->provider->searchCompleted(search, result);
     setState(Backend::Idling);
@@ -84,6 +85,7 @@
 {
     Q_D(ProviderPlugin);
     d->provider->d_func()->packages = packages;
+    emit d->provider->availablePackagesChanged(d->provider->allAvailablePackages().toList());
  }
 
 }
--- trunk/playground/sysadmin/shaman/plugins/abs/AbsPackage.cpp #1066087:1066088
@@ -23,12 +23,12 @@
 
 QList< Shaman::PackageGroup* > AbsPackage::packageGroups()
 {
-return Shaman::ProviderPackage::packageGroups();
+    return QList< Shaman::PackageGroup* >();
 }
 
 QList< Shaman::Repository* > AbsPackage::repositories()
 {
-return Shaman::ProviderPackage::repositories();
+    return QList< Shaman::Repository* >();
 }
 
 void AbsPackage::cacheValue(Shaman::AbstractPackage::CachedValue value)
--- trunk/playground/sysadmin/shaman/plugins/abs/AbsPlugin.cpp #1066087:1066088
@@ -13,6 +13,7 @@
 
 #include <aqpm/AbsBackend.h>
 #include "AbsPackage.h"
+#include <KDebug>
 
 SHAMAN_PLUGIN_EXPORT(AbsPlugin)
 
@@ -38,6 +39,8 @@
     foreach (const QString &package, Aqpm::Abs::Backend::instance()->allPackages()) \
{  newPackages << new AbsPackage(package, this);
     }
+    // Now setting packages
+    kDebug() << "Setting Packages of ABS";
     setPackages(newPackages);
     qDeleteAll(oldPackages);
     setState(Shaman::Backend::Idling);
--- trunk/playground/sysadmin/shaman/plugins/packagesview/PackagesModel.cpp \
#1066087:1066088 @@ -300,7 +300,7 @@
         }
         if (found)
             continue;
-        kDebug() << "Create" << package->name();
+        //kDebug() << "Create" << package->name();
         //We didn't find a corresponding Item
         Item * item = new Item(package->name());
         item->append(new PackageItem(package, item));
--- trunk/playground/sysadmin/shaman/plugins/packagesview/PackagesViewWidget.cpp \
#1066087:1066088 @@ -17,6 +17,9 @@
 #include <KIcon>
 #include <QTimer>
 #include <QDebug>
+#include <shamanbase.h>
+#include <shamancoreinterface.h>
+#include <KDebug>
 
 PackagesViewWidget::PackagesViewWidget(Shaman::Backend * backend, QWidget * parent)
   : QWidget(parent),
@@ -50,8 +53,26 @@
     connect(addFavouriteSearchButton, SIGNAL(clicked()), \
                SLOT(addFavouriteSearch()));
     connect(treeView, SIGNAL(currentPackageChanged(Shaman::AbstractPackage *)),
             SIGNAL(currentPackageChanged(Shaman::AbstractPackage*)));
+
+    kDebug() << "Starting watch package routine";
+    // Handle packages in the model. Before connecting, actually assure ourself that \
we cache the packages +    // that might have been already loaded
+    if (!backend->packages().isEmpty()) {
+        kDebug() << "The backend already had some packages in";
+        m_packages[backend] = backend->packages();
+    }
+
     connect(backend, SIGNAL(packagesChanged(Shaman::AbstractPackage::List)),
-            m_model, SLOT(setPackages(Shaman::AbstractPackage::List)));
+            this, SLOT(slotPackagesChanged(Shaman::AbstractPackage::List)));
+
+    // Force calling the slot
+    slotProvidersChanged(Shaman::Base::instance()->core()->providers());
+
+    // Now watch over creation of providerplugins
+    connect(Shaman::Base::instance()->core(), \
SIGNAL(providersChanged(Shaman::Provider::List)), +            this, \
SLOT(slotProvidersChanged(Shaman::Provider::List))); +
+    kDebug() << "Packages are being watched";
 }
 
 PackagesViewWidget::~PackagesViewWidget()
@@ -102,3 +123,66 @@
     treeView->setEnabled(false);
     m_proxyModel->setSearchText(searchLine->text());
 }
+
+void PackagesViewWidget::slotPackagesChanged(const AbstractPackage::List &packages)
+{
+    QObject *owner = sender();
+    if (!owner) {
+        return;
+    }
+
+    kDebug() << "Packages changed from " << owner;
+
+    // Ok, let's associate the packages to the key in our hash
+    m_packages[owner] = packages;
+
+    Shaman::AbstractPackage::List allPackages;
+    // Now join all packages in a big list and set it in the model
+    {
+        QHash<QObject*, Shaman::AbstractPackage::List>::const_iterator i;
+        for (i = m_packages.constBegin(); i != m_packages.constEnd(); ++i) {
+            allPackages.append(i.value());
+        }
+    }
+
+    m_model->setPackages(allPackages);
+}
+
+void PackagesViewWidget::slotProvidersChanged(const Shaman::Provider::List& \
providers) +{
+    kDebug() << "Providers changed";
+
+    // Remove old providers
+    foreach (Shaman::Provider *provider, m_watchedProviders) {
+        m_packages.remove(provider);
+        disconnect(provider, \
SIGNAL(availablePackagesChanged(Shaman::AbstractPackage::List)), +                   \
this, SLOT(slotPackagesChanged(Shaman::AbstractPackage::List))); +    }
+
+    // Now back to the add routine again
+    foreach (Shaman::Provider *provider, providers) {
+        kDebug() << "Listening to " << provider;
+        m_watchedProviders.append(provider);
+        if (!provider->allAvailablePackages().isEmpty()) {
+            kDebug() << "The provider " << provider << " already had some packages \
in"; +            m_packages[provider] = provider->allAvailablePackages().toList();
+        }
+
+        connect(provider, \
SIGNAL(availablePackagesChanged(Shaman::AbstractPackage::List)), +                \
this, SLOT(slotPackagesChanged(Shaman::AbstractPackage::List))); +    }
+
+    if (m_packages.count() > 0) {
+        kDebug() << "Some packages need to be added to the model already";
+        // Now join all packages in a big list and set it in the model
+        Shaman::AbstractPackage::List allPackages;
+        {
+            QHash<QObject*, Shaman::AbstractPackage::List>::const_iterator i;
+            for (i = m_packages.constBegin(); i != m_packages.constEnd(); ++i) {
+                allPackages.append(i.value());
+            }
+        }
+
+        m_model->setPackages(allPackages);
+    }
+}
--- trunk/playground/sysadmin/shaman/plugins/packagesview/PackagesViewWidget.h \
#1066087:1066088 @@ -15,6 +15,7 @@
 #include "SearchModel.h"
 
 #include <QWidget>
+#include <shamanprovider.h>
 
 class QTimer;
 namespace Shaman {
@@ -22,6 +23,7 @@
     class PackageGroup;
     class Repository;
     class BackendPackage;
+class Provider;
 }
 
 class PackagesModel;
@@ -46,6 +48,8 @@
         void searchComboIndexChanged(int index);
         void addFavouriteSearch();
         void startSearch();
+        void slotPackagesChanged(const Shaman::AbstractPackage::List &packages);
+        void slotProvidersChanged(const Shaman::Provider::List &providers);
 
     signals:
         void currentPackageChanged(Shaman::AbstractPackage * package);
@@ -58,6 +62,8 @@
         PackagesSortFilterProxyModel * m_proxyModel;
         PackageStateModel * m_stateModel;
         SearchModel * m_searchModel;
+        QHash<QObject*, Shaman::AbstractPackage::List> m_packages;
+        QList<Shaman::Provider*> m_watchedProviders;
 };
 
 #endif
--- trunk/playground/sysadmin/shaman/shaman/src/MainWindow.cpp #1066087:1066088
@@ -309,6 +309,10 @@
             m_isFirstReload = false;
         }
         m_isReloading = false;
+        // TODO: Move reloading of providerplugins elsewhere
+        foreach (Shaman::Provider *provider, m_shaman->core()->providers()) {
+            provider->reload();
+        }
     }
 }
 


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

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