[QGIS Commit] r10090 - trunk/qgis/src/providers/wfs

svn_qgis at osgeo.org svn_qgis at osgeo.org
Mon Feb 2 10:08:08 EST 2009


Author: mhugent
Date: 2009-02-02 10:08:08 -0500 (Mon, 02 Feb 2009)
New Revision: 10090

Modified:
   trunk/qgis/src/providers/wfs/qgswfsdata.cpp
   trunk/qgis/src/providers/wfs/qgswfsdata.h
Log:
Show a progress dialog for wfs if there is a main window (to not crash non-graphical applications using wfs provider)

Modified: trunk/qgis/src/providers/wfs/qgswfsdata.cpp
===================================================================
--- trunk/qgis/src/providers/wfs/qgswfsdata.cpp	2009-02-02 07:44:46 UTC (rev 10089)
+++ trunk/qgis/src/providers/wfs/qgswfsdata.cpp	2009-02-02 15:08:08 UTC (rev 10090)
@@ -19,6 +19,7 @@
 #include <QBuffer>
 #include <QUrl>
 #include <QList>
+#include <QProgressDialog>
 #include <QSet>
 
 //just for a test
@@ -92,6 +93,21 @@
 
   QgsHttpTransaction::applyProxySettings( mHttp, mUri );
 
+   //find out if there is a QGIS main window. If yes, display a progress dialog
+  QProgressDialog* progressDialog = 0;
+  QWidget* mainWindow = findMainWindow();
+
+  if(mainWindow)
+  {
+      progressDialog = new QProgressDialog(tr("Loading WFS data"), tr("Abort"), 0, 0, mainWindow);
+      progressDialog->setWindowModality(Qt::ApplicationModal);
+      connect(&mHttp, SIGNAL(dataReadProgress(int, int)), this, SLOT(handleProgressEvent(int, int)));
+      connect(this, SIGNAL(dataReadProgress(int)), progressDialog, SLOT(setValue(int)));
+      connect(this, SIGNAL(totalStepsUpdate(int)), progressDialog, SLOT(setMaximum(int)));
+      connect(progressDialog, SIGNAL(canceled()), &mHttp, SLOT(abort()));
+      progressDialog->show();
+  }
+
   //mHttp.get( mUri );
   mHttp.get( requestUrl.path() + "?" + QString( requestUrl.encodedQuery() ) );
 
@@ -111,9 +127,11 @@
       readData = mHttp.readAll();
       XML_Parse( p, readData.data(), readData.size(), atEnd );
     }
-    qApp->processEvents( QEventLoop::ExcludeUserInputEvents );
+    qApp->processEvents();
   }
-  qWarning( "Left loop" );
+
+ delete progressDialog;
+
   return 0; //soon
 }
 
@@ -131,6 +149,12 @@
   mFinished = true;
 }
 
+void QgsWFSData::handleProgressEvent(int progress, int totalSteps)
+{
+    emit dataReadProgress(progress);
+    emit totalStepsUpdate(totalSteps);
+}
+
 void QgsWFSData::startElement( const XML_Char* el, const XML_Char** attr )
 {
   QString elementName( el );
@@ -755,3 +779,20 @@
   }
   return result;
 }
+
+QWidget* QgsWFSData::findMainWindow() const
+{
+    QWidget* mainWindow = 0;
+
+    QWidgetList topLevelWidgets = qApp->topLevelWidgets();
+    QWidgetList::iterator it = topLevelWidgets.begin();
+    for ( ; it != topLevelWidgets.end(); ++it )
+    {
+        if (( *it )->objectName() == "QgisApp" )
+        {
+        mainWindow = *it;
+        break;
+        }
+    }
+    return mainWindow;
+}

Modified: trunk/qgis/src/providers/wfs/qgswfsdata.h
===================================================================
--- trunk/qgis/src/providers/wfs/qgswfsdata.h	2009-02-02 07:44:46 UTC (rev 10089)
+++ trunk/qgis/src/providers/wfs/qgswfsdata.h	2009-02-02 15:08:08 UTC (rev 10090)
@@ -57,6 +57,13 @@
   private slots:
     void setFinished( bool error );
 
+    /**Takes progress value and total steps and emit signals 'dataReadProgress' and 'totalStepUpdate'*/
+  void handleProgressEvent(int progress, int totalSteps);
+
+  signals:
+  void dataReadProgress(int progress);
+  void totalStepsUpdate(int totalSteps);
+
   private:
 
     enum parseMode
@@ -126,6 +133,9 @@
     /**Adds all the integers contained in mCurrentWKBFragmentSizes*/
     int totalWKBFragmentSize() const;
 
+     /**Returns pointer to main window or 0 if it does not exist*/
+    QWidget* findMainWindow() const;
+
     QString mUri;
     //results are members such that handler routines are able to manipulate them
     /**Bounding box of the layer*/



More information about the QGIS-commit mailing list