[QGIS Commit] r9652 - trunk/qgis/src/app

svn_qgis at osgeo.org svn_qgis at osgeo.org
Mon Nov 17 10:35:45 EST 2008


Author: wonder
Date: 2008-11-17 10:35:45 -0500 (Mon, 17 Nov 2008)
New Revision: 9652

Modified:
   trunk/qgis/src/app/qgspluginmanager.cpp
   trunk/qgis/src/app/qgspluginregistry.cpp
   trunk/qgis/src/app/qgspluginregistry.h
Log:
Allow loading only compatible plugins, i.e. plugins implementing qgisMinimumVersion() metadata.
Incompatible plugins are disabled and can't be selected in plugin manager.

Example of new metadata: (plugin's __init__.py)

def qgisMinimumVersion():
  return "1.0"


Modified: trunk/qgis/src/app/qgspluginmanager.cpp
===================================================================
--- trunk/qgis/src/app/qgspluginmanager.cpp	2008-11-17 15:30:48 UTC (rev 9651)
+++ trunk/qgis/src/app/qgspluginmanager.cpp	2008-11-17 15:35:45 UTC (rev 9652)
@@ -147,6 +147,11 @@
     QString version     = mPythonUtils->getPluginMetadata( packageName, "version" );
 
     if ( pluginName == "???" || description == "???" || version == "???" ) continue;
+    
+    bool isCompatible = QgsPluginRegistry::instance()->isPythonPluginCompatible( packageName );
+    QString compatibleString; // empty by default
+    if (!isCompatible)
+      compatibleString = "  " + tr("[ incompatible ]");
 
     // filtering will be done on the display role so give it name and desription
     // user wont see this text since we are using a custome delegate
@@ -156,9 +161,11 @@
     mypDetailItem->setData( packageName, PLUGIN_BASE_NAME_ROLE ); //for matching in registry later
     mypDetailItem->setCheckable( false );
     mypDetailItem->setEditable( false );
+    mypDetailItem->setEnabled( isCompatible );
     // setData in the delegate with a variantised QgsDetailedItemData
     QgsDetailedItemData myData;
-    myData.setTitle( pluginName + " (" + version + ")" );
+    myData.setTitle( pluginName + " (" + version + ")" + compatibleString );
+    myData.setEnabled( isCompatible );
     myData.setDetail( description );
     //myData.setIcon(pixmap); //todo use a python logo here
     myData.setCheckable( true );
@@ -476,14 +483,10 @@
     QStandardItem* mypItem = mModelPlugins->itemFromIndex( realIndex );
     QgsDetailedItemData myData =
       qVariantValue<QgsDetailedItemData>( mypItem->data( PLUGIN_DATA_ROLE ) );
-    if ( myData.isChecked() )
+    if ( myData.isEnabled() )
     {
-      myData.setChecked( false );
+      myData.setChecked( ! myData.isChecked() );
     }
-    else
-    {
-      myData.setChecked( true );
-    }
     QVariant myVariant = qVariantFromValue( myData );
     mypItem->setData( myVariant, PLUGIN_DATA_ROLE );
   }

Modified: trunk/qgis/src/app/qgspluginregistry.cpp
===================================================================
--- trunk/qgis/src/app/qgspluginregistry.cpp	2008-11-17 15:30:48 UTC (rev 9651)
+++ trunk/qgis/src/app/qgspluginregistry.cpp	2008-11-17 15:35:45 UTC (rev 9652)
@@ -152,7 +152,49 @@
 }
 
 
+bool QgsPluginRegistry::checkQgisVersion(QString minVersion)
+{
+  QStringList minVersionParts = minVersion.split('.');
+  // qgis version must be in form x.y.z or just x.y
+  if (minVersionParts.count() != 2 && minVersionParts.count() != 3)
+    return false;
+  
+  int minVerMajor, minVerMinor, minVerBugfix=0;
+  bool ok;
+  minVerMajor = minVersionParts.at(0).toInt(&ok);
+  if (!ok) return false;
+  minVerMinor = minVersionParts.at(1).toInt(&ok);
+  if (!ok) return false;
+  if (minVersionParts.count() == 3)
+  {
+    minVerBugfix = minVersionParts.at(2).toInt(&ok);
+    if (!ok) return false;
+  }
+  
+  // our qgis version - cut release name after version number
+  QString qgisVersion = QString(QGis::QGIS_VERSION).section( '-', 0, 0 );
+  QStringList qgisVersionParts = qgisVersion.split( "." );
 
+  int qgisMajor = qgisVersionParts.at( 0 ).toInt();
+  int qgisMinor = qgisVersionParts.at( 1 ).toInt();
+  int qgisBugfix= qgisVersionParts.at( 2 ).toInt();
+
+  // first check major version
+  if (minVerMajor > qgisMajor) return false;
+  if (minVerMajor < qgisMajor) return true;
+  
+  // if same, check minor version
+  if (minVerMinor > qgisMinor) return false;
+  if (minVerMinor < qgisMinor) return true;
+  
+  // if still same, check bugfix version
+  if (minVerBugfix > qgisBugfix) return false;
+  
+  // looks like min version is the same as our version - that's fine
+  return true;
+}
+
+
 void QgsPluginRegistry::loadPythonPlugin( QString packageName )
 {
   if ( !mPythonUtils || !mPythonUtils->isEnabled() )
@@ -160,22 +202,30 @@
     QgsDebugMsg( "Python is not enabled in QGIS." );
     return;
   }
+  
+  QSettings settings;
 
   // is loaded already?
   if ( ! isLoaded( packageName ) )
   {
+    // if plugin is not compatible, disable it
+    if ( ! isPythonPluginCompatible( packageName ) )
+    {
+      settings.setValue( "/PythonPlugins/" + packageName, false );
+      return;
+    }
+    
     mPythonUtils->loadPlugin( packageName );
     mPythonUtils->startPlugin( packageName );
 
     // TODO: test success
-
+    
     QString pluginName = mPythonUtils->getPluginMetadata( packageName, "name" );
 
     // add to plugin registry
     addPlugin( packageName, QgsPluginMetadata( packageName, pluginName, NULL, true ) );
 
     // add to settings
-    QSettings settings;
     settings.setValue( "/PythonPlugins/" + packageName, true );
     std::cout << "Loaded : " << pluginName.toLocal8Bit().constData() << " (package: "
         << packageName.toLocal8Bit().constData() << ")" << std::endl; // OK
@@ -364,3 +414,17 @@
   
   return true;
 }
+
+bool QgsPluginRegistry::isPythonPluginCompatible( QString packageName )
+{
+  QString minVersion = mPythonUtils->getPluginMetadata( packageName, "qgisMinimumVersion" );
+  if (minVersion == "__error__" || !checkQgisVersion(minVersion))
+  {
+    //QMessageBox::information(mQgisInterface->mainWindow(),
+    //   QObject::tr("Incompatible plugin"),
+    //   QObject::tr("Plugin \"%1\" is not compatible with this version of Quantum GIS.\nIt will be disabled.").arg(pluginName));
+    //settings.setValue( "/PythonPlugins/" + packageName, false );
+    return false;
+  }
+  return true;
+}

Modified: trunk/qgis/src/app/qgspluginregistry.h
===================================================================
--- trunk/qgis/src/app/qgspluginregistry.h	2008-11-17 15:30:48 UTC (rev 9651)
+++ trunk/qgis/src/app/qgspluginregistry.h	2008-11-17 15:35:45 UTC (rev 9652)
@@ -81,6 +81,9 @@
     //! Load any plugins used in the last qgis session
     void restoreSessionPlugins( QString thePluginDirString );
 
+    //! Check whether plugin is compatible with current version of QGIS
+    bool isPythonPluginCompatible( QString packageName );
+  
   protected:
     //! protected constructor
     QgsPluginRegistry();
@@ -90,6 +93,9 @@
     //! Try to load and get metadata from Python plugin, return true on success
     bool checkPythonPlugin( QString packageName );
   
+    //! Check current QGIS version against plugin's minimal requested QGIS version
+    bool checkQgisVersion(QString minVersion);
+  
   private:
     static QgsPluginRegistry* _instance;
     QMap<QString, QgsPluginMetadata> mPlugins;



More information about the QGIS-commit mailing list