[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