From 1014e5c7a12afa05d809ef76360097c59facf356 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Mon, 19 Feb 2018 10:16:48 +1000 Subject: [PATCH 1/2] Remove unused QgsVectorLayerInterruptionCheckerDuringCountSymbolFeatures class --- src/core/qgsvectorlayer.cpp | 40 ------------------------------------- 1 file changed, 40 deletions(-) diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp index 66ac4298608..9940772ae52 100644 --- a/src/core/qgsvectorlayer.cpp +++ b/src/core/qgsvectorlayer.cpp @@ -698,46 +698,6 @@ long QgsVectorLayer::featureCount( const QString &legendKey ) const return mSymbolFeatureCountMap.value( legendKey ); } -/** - * \ingroup core - * Used by QgsVectorLayer::countSymbolFeatures() to provide an interruption checker - * \note not available in Python bindings - */ -class QgsVectorLayerInterruptionCheckerDuringCountSymbolFeatures: public QgsInterruptionChecker -{ - public: - - //! Constructor - explicit QgsVectorLayerInterruptionCheckerDuringCountSymbolFeatures( QProgressDialog *dialog ) - : mDialog( dialog ) - { - } - - bool mustStop() const override - { - if ( mDialog->isVisible() ) - { - // So that we get a chance of hitting the Abort button -#ifdef Q_OS_LINUX - // For some reason on Windows hasPendingEvents() always return true, - // but one iteration is actually enough on Windows to get good interactivity - // whereas on Linux we must allow for far more iterations. - // For safety limit the number of iterations - int nIters = 0; - while ( QCoreApplication::hasPendingEvents() && ++nIters < 100 ) -#endif - { - QCoreApplication::processEvents(); - } - return mDialog->wasCanceled(); - } - return false; - } - - private: - QProgressDialog *mDialog = nullptr; -}; - QgsVectorLayerFeatureCounter *QgsVectorLayer::countSymbolFeatures() { if ( mSymbolFeatureCounted || mFeatureCounter ) From d830821b133dfc78ef46f98bfa47d848442c7753 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Mon, 19 Feb 2018 10:18:00 +1000 Subject: [PATCH 2/2] Remove QgsInterruptionChecker and replace with QgsFeedback use There's little need for two classes with similar goals here. --- doc/api_break.dox | 8 ++++++++ python/core/qgsfeatureiterator.sip.in | 2 -- src/core/CMakeLists.txt | 2 +- src/core/qgsfeatureiterator.cpp | 2 +- src/core/qgsfeatureiterator.h | 22 ++++----------------- src/core/qgsvectorlayerfeatureiterator.cpp | 2 +- src/core/qgsvectorlayerfeatureiterator.h | 4 ++-- src/core/qgsvectorlayerrenderer.cpp | 14 +++++++++---- src/core/qgsvectorlayerrenderer.h | 8 ++++++-- src/providers/wfs/qgswfsfeatureiterator.cpp | 11 ++++++----- src/providers/wfs/qgswfsfeatureiterator.h | 4 ++-- 11 files changed, 41 insertions(+), 38 deletions(-) diff --git a/doc/api_break.dox b/doc/api_break.dox index 0d1ab6c3b45..66bfee43cff 100644 --- a/doc/api_break.dox +++ b/doc/api_break.dox @@ -287,6 +287,7 @@ should now call QgsCoordinateReferenceSystem::invalidateCache() and QgsCoordinat - HalfEdge. - QgsHtmlAnnotationItem. Use QgsHtmlAnnotation instead. - QgsHttpTransaction. This class was outdated and code should be ported to native Qt or Python implementations. +- QgsInterruptionChecker. Use QgsFeedback instead. - QgsGenericProjectionSelector. Use QgsProjectionSelectionTreeWidget instead. - QgsGeometryCache. It got redundant after removal of old snapping classes (QgsSnapper + friends). - QgsLabel and QgsLabelAttributes. Replaced by labeling based on PAL library, see QgsLabelingEngine. @@ -1031,6 +1032,13 @@ None will need to be modified, as the method will return an empty geometry if th - fields() no longer returns a pointer, but instead a QgsFields value. - The duplicate method setFeatureId() was removed. Use setId() instead. + +QgsFeatureIterator {#qgis_api_break_3_0_QgsFeatureIterator} +------------------ + +- setInterruptionChecker now accepts a QgsFeedback object instead of a QgsInterruptionChecker. + + QgsFeatureListViewDelegate {#qgis_api_break_3_0_QgsFeatureListViewDelegate} -------------------------- diff --git a/python/core/qgsfeatureiterator.sip.in b/python/core/qgsfeatureiterator.sip.in index f2e6d2fcf9b..98ab5458391 100644 --- a/python/core/qgsfeatureiterator.sip.in +++ b/python/core/qgsfeatureiterator.sip.in @@ -8,8 +8,6 @@ - - class QgsAbstractFeatureIterator { %Docstring diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 3477ab7be9f..c07c9119657 100755 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -637,6 +637,7 @@ SET(QGIS_CORE_MOC_HDRS qgsvectorlayerexporter.h qgsvectorlayerfeaturecounter.h qgsvectorlayerjoinbuffer.h + qgsvectorlayerrenderer.h qgsvectorlayertools.h qgsmapthemecollection.h qgswebpage.h @@ -920,7 +921,6 @@ SET(QGIS_CORE_HDRS qgsvectorlayerjoininfo.h qgsvectorlayerlabelprovider.h qgsvectorlayerlabeling.h - qgsvectorlayerrenderer.h qgsvectorlayerundocommand.h qgsvectorlayerundopassthroughcommand.h qgsvectorlayerutils.h diff --git a/src/core/qgsfeatureiterator.cpp b/src/core/qgsfeatureiterator.cpp index 8e1e3ed2cff..96683a9f5f5 100644 --- a/src/core/qgsfeatureiterator.cpp +++ b/src/core/qgsfeatureiterator.cpp @@ -211,7 +211,7 @@ bool QgsAbstractFeatureIterator::prepareOrderBy( const QListsetInterruptionChecker( interruptionChecker ); diff --git a/src/core/qgsvectorlayerfeatureiterator.cpp b/src/core/qgsvectorlayerfeatureiterator.cpp index 9d66ca9a15a..e3f120b142b 100644 --- a/src/core/qgsvectorlayerfeatureiterator.cpp +++ b/src/core/qgsvectorlayerfeatureiterator.cpp @@ -402,7 +402,7 @@ bool QgsVectorLayerFeatureIterator::close() return true; } -void QgsVectorLayerFeatureIterator::setInterruptionChecker( QgsInterruptionChecker *interruptionChecker ) +void QgsVectorLayerFeatureIterator::setInterruptionChecker( QgsFeedback *interruptionChecker ) { mProviderIterator.setInterruptionChecker( interruptionChecker ); mInterruptionChecker = interruptionChecker; diff --git a/src/core/qgsvectorlayerfeatureiterator.h b/src/core/qgsvectorlayerfeatureiterator.h index 1079fe4613a..0616e609d54 100644 --- a/src/core/qgsvectorlayerfeatureiterator.h +++ b/src/core/qgsvectorlayerfeatureiterator.h @@ -119,7 +119,7 @@ class CORE_EXPORT QgsVectorLayerFeatureIterator : public QgsAbstractFeatureItera //! end of iterating: free the resources / lock bool close() override; - void setInterruptionChecker( QgsInterruptionChecker *interruptionChecker ) override SIP_SKIP; + void setInterruptionChecker( QgsFeedback *interruptionChecker ) override SIP_SKIP; /** * Join information prepared for fast attribute id mapping in QgsVectorLayerJoinBuffer::updateFeatureAttributes(). @@ -247,7 +247,7 @@ class CORE_EXPORT QgsVectorLayerFeatureIterator : public QgsAbstractFeatureItera std::unique_ptr mExpressionContext; - QgsInterruptionChecker *mInterruptionChecker = nullptr; + QgsFeedback *mInterruptionChecker = nullptr; QList< int > mPreparedFields; QList< int > mFieldsToPrepare; diff --git a/src/core/qgsvectorlayerrenderer.cpp b/src/core/qgsvectorlayerrenderer.cpp index 961ae5f1537..09415b5456d 100644 --- a/src/core/qgsvectorlayerrenderer.cpp +++ b/src/core/qgsvectorlayerrenderer.cpp @@ -549,10 +549,16 @@ void QgsVectorLayerRenderer::prepareDiagrams( QgsVectorLayer *layer, QSetstop(); + cancel(); + } + } ); + mTimer->start( 50 ); -bool QgsVectorLayerRendererInterruptionChecker::mustStop() const -{ - return mContext.renderingStopped(); } diff --git a/src/core/qgsvectorlayerrenderer.h b/src/core/qgsvectorlayerrenderer.h index 8fb30fa4049..b55eb257e9b 100644 --- a/src/core/qgsvectorlayerrenderer.h +++ b/src/core/qgsvectorlayerrenderer.h @@ -39,6 +39,7 @@ typedef QList QgsAttributeList; #include "qgsfeature.h" // QgsFeatureIds #include "qgsfeatureiterator.h" #include "qgsvectorsimplifymethod.h" +#include "qgsfeedback.h" #include "qgsmaplayerrenderer.h" @@ -50,14 +51,17 @@ class QgsVectorLayerDiagramProvider; * Interruption checker used by QgsVectorLayerRenderer::render() * \note not available in Python bindings */ -class QgsVectorLayerRendererInterruptionChecker: public QgsInterruptionChecker +class QgsVectorLayerRendererInterruptionChecker: public QgsFeedback { + Q_OBJECT + public: //! Constructor explicit QgsVectorLayerRendererInterruptionChecker( const QgsRenderContext &context ); - bool mustStop() const override; + private: const QgsRenderContext &mContext; + QTimer *mTimer = nullptr; }; /** diff --git a/src/providers/wfs/qgswfsfeatureiterator.cpp b/src/providers/wfs/qgswfsfeatureiterator.cpp index 993f390deb3..f019d12435f 100644 --- a/src/providers/wfs/qgswfsfeatureiterator.cpp +++ b/src/providers/wfs/qgswfsfeatureiterator.cpp @@ -27,6 +27,7 @@ #include "qgslogger.h" #include "qgssettings.h" #include "qgsexception.h" +#include "qgsfeedback.h" #include #include @@ -965,7 +966,7 @@ void QgsWFSFeatureIterator::endOfDownload( bool ) mLoop->quit(); } -void QgsWFSFeatureIterator::setInterruptionChecker( QgsInterruptionChecker *interruptionChecker ) +void QgsWFSFeatureIterator::setInterruptionChecker( QgsFeedback *interruptionChecker ) { mInterruptionChecker = interruptionChecker; } @@ -1018,7 +1019,7 @@ void QgsWFSFeatureIterator::checkInterruption() { //QgsDebugMsg("QgsWFSFeatureIterator::checkInterruption()"); - if ( mInterruptionChecker && mInterruptionChecker->mustStop() ) + if ( mInterruptionChecker && mInterruptionChecker->isCanceled() ) { mDownloadFinished = true; if ( mLoop ) @@ -1037,7 +1038,7 @@ bool QgsWFSFeatureIterator::fetchFeature( QgsFeature &f ) QgsFeature cachedFeature; while ( mCacheIterator.nextFeature( cachedFeature ) ) { - if ( mInterruptionChecker && mInterruptionChecker->mustStop() ) + if ( mInterruptionChecker && mInterruptionChecker->isCanceled() ) return false; //QgsDebugMsg(QString("QgsWFSSharedData::fetchFeature() : mCacheIterator.nextFeature(cachedFeature)") ); @@ -1134,7 +1135,7 @@ bool QgsWFSFeatureIterator::fetchFeature( QgsFeature &f ) { while ( !mReaderStream->atEnd() ) { - if ( mInterruptionChecker && mInterruptionChecker->mustStop() ) + if ( mInterruptionChecker && mInterruptionChecker->isCanceled() ) return false; QgsFeature feat; @@ -1186,7 +1187,7 @@ bool QgsWFSFeatureIterator::fetchFeature( QgsFeature &f ) if ( mDownloadFinished ) return false; - if ( mInterruptionChecker && mInterruptionChecker->mustStop() ) + if ( mInterruptionChecker && mInterruptionChecker->isCanceled() ) return false; //QgsDebugMsg("fetchFeature before loop"); diff --git a/src/providers/wfs/qgswfsfeatureiterator.h b/src/providers/wfs/qgswfsfeatureiterator.h index 4a3c71c3c9a..f6cf2e76f9d 100644 --- a/src/providers/wfs/qgswfsfeatureiterator.h +++ b/src/providers/wfs/qgswfsfeatureiterator.h @@ -206,7 +206,7 @@ class QgsWFSFeatureIterator : public QObject, bool close() override; - void setInterruptionChecker( QgsInterruptionChecker *interruptionChecker ) override; + void setInterruptionChecker( QgsFeedback *interruptionChecker ) override; //! Used by QgsWFSSharedData::registerToCache() void connectSignals( QgsWFSFeatureDownloader *downloader ); @@ -232,7 +232,7 @@ class QgsWFSFeatureIterator : public QObject, bool mDownloadFinished; QEventLoop *mLoop = nullptr; QgsFeatureIterator mCacheIterator; - QgsInterruptionChecker *mInterruptionChecker = nullptr; + QgsFeedback *mInterruptionChecker = nullptr; //! this mutex synchronizes the mWriterXXXX variables between featureReceivedSynchronous() and fetchFeature() QMutex mMutex;