[QGIS Commit] r12552 - in trunk/qgis: python src/app src/python

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sun Dec 20 17:12:18 EST 2009


Author: wonder
Date: 2009-12-20 17:12:16 -0500 (Sun, 20 Dec 2009)
New Revision: 12552

Modified:
   trunk/qgis/python/utils.py
   trunk/qgis/src/app/qgspluginmetadata.cpp
   trunk/qgis/src/app/qgspluginmetadata.h
   trunk/qgis/src/app/qgspluginregistry.cpp
   trunk/qgis/src/python/qgspythonutils.h
   trunk/qgis/src/python/qgspythonutilsimpl.cpp
   trunk/qgis/src/python/qgspythonutilsimpl.h
Log:
Manage python plugins loaded state in python utils.py module.
This allows seamless loading/unloading of plugins by plugin installer.


Modified: trunk/qgis/python/utils.py
===================================================================
--- trunk/qgis/python/utils.py	2009-12-20 21:07:20 UTC (rev 12551)
+++ trunk/qgis/python/utils.py	2009-12-20 22:12:16 UTC (rev 12552)
@@ -91,6 +91,9 @@
 # dictionary of plugins
 plugins = {}
 
+# list of active (started) plugins
+active_plugins = []
+
 def pluginMetadata(packageName, fct):
   """ fetch metadata from a plugin """
   try:
@@ -125,8 +128,10 @@
 
 def startPlugin(packageName):
   """ initialize the plugin """
-  global plugins, iface
+  global plugins, active_plugins, iface
 
+  if packageName in active_plugins: return False
+
   package = sys.modules[packageName]
 
   errMsg = QCoreApplication.translate("Python", "Couldn't load plugin %1" ).arg(packageName)
@@ -147,20 +152,32 @@
     showException(sys.exc_type, sys.exc_value, sys.exc_traceback, msg)
     return False
 
+  # add to active plugins
+  active_plugins.append(packageName)
+
   return True
 
 
 def unloadPlugin(packageName):
   """ unload and delete plugin! """
-  global plugins
+  global plugins, active_plugins
   
   if not plugins.has_key(packageName): return False
+  if packageName not in active_plugins: return False
 
   try:
     plugins[packageName].unload()
     del plugins[packageName]
+    active_plugins.remove(packageName)
     return True
   except Exception, e:
     msg = QCoreApplication.translate("Python", "Error while unloading plugin %1").arg(packageName)
     showException(sys.exc_type, sys.exc_value, sys.exc_traceback, msg)
     return False
+
+def isPluginLoaded(packageName):
+  """ find out whether a plugin is active (i.e. has been started) """
+  global plugins, active_plugins
+
+  if not plugins.has_key(packageName): return False
+  return (packageName in active_plugins)

Modified: trunk/qgis/src/app/qgspluginmetadata.cpp
===================================================================
--- trunk/qgis/src/app/qgspluginmetadata.cpp	2009-12-20 21:07:20 UTC (rev 12551)
+++ trunk/qgis/src/app/qgspluginmetadata.cpp	2009-12-20 22:12:16 UTC (rev 12552)
@@ -21,12 +21,10 @@
 #include "qgspluginmetadata.h"
 QgsPluginMetadata::QgsPluginMetadata( QString _libraryPath,
                                       QString _name,
-                                      QgisPlugin * _plugin,
-                                      bool _python ):
+                                      QgisPlugin * _plugin ):
     m_name( _name ),
     libraryPath( _libraryPath ),
-    m_plugin( _plugin ),
-    m_python( _python )
+    m_plugin( _plugin )
 {
 
 }
@@ -45,8 +43,3 @@
 {
   return m_plugin;
 }
-
-bool QgsPluginMetadata::isPython()
-{
-  return m_python;
-}

Modified: trunk/qgis/src/app/qgspluginmetadata.h
===================================================================
--- trunk/qgis/src/app/qgspluginmetadata.h	2009-12-20 21:07:20 UTC (rev 12551)
+++ trunk/qgis/src/app/qgspluginmetadata.h	2009-12-20 22:12:16 UTC (rev 12552)
@@ -30,16 +30,14 @@
 class QgsPluginMetadata
 {
   public:
-    QgsPluginMetadata( QString _libraryPath, QString _name, QgisPlugin *_plugin, bool _python = false );
+    QgsPluginMetadata( QString _libraryPath, QString _name, QgisPlugin *_plugin );
     QString name();
     QString library();
     QgisPlugin *plugin();
-    bool isPython();
   private:
     QString m_name;
     QString libraryPath;
     QgisPlugin *m_plugin;
-    bool m_python;
 };
 #endif //QGSPLUGINMETADATA_H
 

Modified: trunk/qgis/src/app/qgspluginregistry.cpp
===================================================================
--- trunk/qgis/src/app/qgspluginregistry.cpp	2009-12-20 21:07:20 UTC (rev 12551)
+++ trunk/qgis/src/app/qgspluginregistry.cpp	2009-12-20 22:12:16 UTC (rev 12552)
@@ -68,16 +68,30 @@
 bool QgsPluginRegistry::isLoaded( QString key )
 {
   QMap<QString, QgsPluginMetadata>::iterator it = mPlugins.find( key );
-  return ( it != mPlugins.end() );
+  if ( it != mPlugins.end() ) // found a c++ plugin?
+    return true;
+
+  if ( mPythonUtils && mPythonUtils->isEnabled() )
+  {
+    return mPythonUtils->isPluginLoaded( key );
+  }
+
+  return false;
 }
 
 QString QgsPluginRegistry::library( QString key )
 {
   QMap<QString, QgsPluginMetadata>::iterator it = mPlugins.find( key );
-  if ( it == mPlugins.end() )
-    return QString();
+  if ( it != mPlugins.end() )
+    return it->library();
 
-  return it->library();
+  if ( mPythonUtils && mPythonUtils->isEnabled() )
+  {
+    if ( mPythonUtils->isPluginLoaded( key ) )
+      return key;
+  }
+
+  return QString();
 }
 
 QgisPlugin *QgsPluginRegistry::plugin( QString key )
@@ -86,15 +100,19 @@
   if ( it == mPlugins.end() )
     return NULL;
 
+  // note: not used by python plugins
+
   return it->plugin();
 }
 
 bool QgsPluginRegistry::isPythonPlugin( QString key )
 {
-  QMap<QString, QgsPluginMetadata>::iterator it = mPlugins.find( key );
-  if ( it == mPlugins.end() )
-    return false;
-  return it->isPython();
+  if ( mPythonUtils && mPythonUtils->isEnabled() )
+  {
+    if ( mPythonUtils->isPluginLoaded( key ) )
+      return true;
+  }
+  return false;
 }
 
 void QgsPluginRegistry::addPlugin( QString key, QgsPluginMetadata metadata )
@@ -104,17 +122,25 @@
 
 void QgsPluginRegistry::dump()
 {
-  QgsDebugMsg( "PLUGINS IN REGISTRY: key -> (name, library, isPython)" );
+  QgsDebugMsg( "PLUGINS IN REGISTRY: key -> (name, library)" );
   for ( QMap<QString, QgsPluginMetadata>::iterator it = mPlugins.begin();
         it != mPlugins.end();
         it++ )
   {
-    QgsDebugMsg( QString( "PLUGIN: %1 -> (%2, %3, %4)" )
+    QgsDebugMsg( QString( "PLUGIN: %1 -> (%2, %3)" )
                  .arg( it.key() )
                  .arg( it->name() )
-                 .arg( it->library() )
-                 .arg( it->isPython() ) );
+                 .arg( it->library() ) );
   }
+
+  if ( mPythonUtils && mPythonUtils->isEnabled() )
+  {
+    QgsDebugMsg( "PYTHON PLUGINS IN REGISTRY:" );
+    foreach( QString pluginName, mPythonUtils->listActivePlugins() )
+    {
+      QgsDebugMsg( pluginName );
+    }
+  }
 }
 
 
@@ -126,6 +152,8 @@
   {
     mPlugins.erase( it );
   }
+
+  // python plugins are removed when unloaded
 }
 
 void QgsPluginRegistry::unloadAll()
@@ -134,19 +162,17 @@
         it != mPlugins.end();
         it++ )
   {
-    if ( isPythonPlugin( it.key() ) )
-    {
-      if ( mPythonUtils )
-        mPythonUtils->unloadPlugin( it->library() );
-      else
-        QgsDebugMsg( "warning: python utils is NULL" );
-    }
+    if ( it->plugin() )
+      it->plugin()->unload();
     else
+      QgsDebugMsg( "warning: plugin is NULL:" + it.key() );
+  }
+
+  if ( mPythonUtils && mPythonUtils->isEnabled() )
+  {
+    foreach( QString pluginName, mPythonUtils->listActivePlugins() )
     {
-      if ( it->plugin() )
-        it->plugin()->unload();
-      else
-        QgsDebugMsg( "warning: plugin is NULL:" + it.key() );
+      mPythonUtils->unloadPlugin( pluginName );
     }
   }
 }
@@ -222,9 +248,6 @@
 
     QString pluginName = mPythonUtils->getPluginMetadata( packageName, "name" );
 
-    // add to plugin registry
-    addPlugin( packageName, QgsPluginMetadata( packageName, pluginName, NULL, true ) );
-
     // add to settings
     settings.setValue( "/PythonPlugins/" + packageName, true );
     std::cout << "Loaded : " << pluginName.toLocal8Bit().constData() << " (package: "

Modified: trunk/qgis/src/python/qgspythonutils.h
===================================================================
--- trunk/qgis/src/python/qgspythonutils.h	2009-12-20 21:07:20 UTC (rev 12551)
+++ trunk/qgis/src/python/qgspythonutils.h	2009-12-20 22:12:16 UTC (rev 12552)
@@ -76,6 +76,12 @@
     //! return list of all available python plugins
     virtual QStringList pluginList() = 0;
 
+    //! return whether the plugin is loaded (active)
+    virtual bool isPluginLoaded( QString packageName ) = 0;
+
+    //! return a list of active plugins
+    virtual QStringList listActivePlugins() = 0;
+
     //! load python plugin (import)
     virtual bool loadPlugin( QString packageName ) = 0;
 

Modified: trunk/qgis/src/python/qgspythonutilsimpl.cpp
===================================================================
--- trunk/qgis/src/python/qgspythonutilsimpl.cpp	2009-12-20 21:07:20 UTC (rev 12551)
+++ trunk/qgis/src/python/qgspythonutilsimpl.cpp	2009-12-20 22:12:16 UTC (rev 12552)
@@ -475,3 +475,17 @@
   evalString( "qgis.utils.unloadPlugin('" + packageName + "')", output );
   return ( output == "True" );
 }
+
+bool QgsPythonUtilsImpl::isPluginLoaded( QString packageName )
+{
+  QString output;
+  evalString( "qgis.utils.isPluginLoaded('" + packageName + "')", output );
+  return ( output == "True" );
+}
+
+QStringList QgsPythonUtilsImpl::listActivePlugins()
+{
+  QString output;
+  evalString( "'\\n'.join(qgis.utils.active_plugins)", output );
+  return output.split( QChar( '\n' ) );
+}

Modified: trunk/qgis/src/python/qgspythonutilsimpl.h
===================================================================
--- trunk/qgis/src/python/qgspythonutilsimpl.h	2009-12-20 21:07:20 UTC (rev 12551)
+++ trunk/qgis/src/python/qgspythonutilsimpl.h	2009-12-20 22:12:16 UTC (rev 12552)
@@ -98,6 +98,12 @@
     //! return list of all available python plugins
     QStringList pluginList();
 
+    //! return whether the plugin is loaded (active)
+    virtual bool isPluginLoaded( QString packageName );
+
+    //! return a list of active plugins
+    virtual QStringList listActivePlugins();
+
     //! load python plugin (import)
     bool loadPlugin( QString packageName );
 



More information about the QGIS-commit mailing list