diff --git a/doc/api_break.dox b/doc/api_break.dox index 0d1ab6c3b45e..66bfee43cffb 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 f2e6d2fcf9b3..98ab54583918 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 3477ab7be9f0..c07c91196572 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 8e1e3ed2cff7..96683a9f5f54 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/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp index 66ac42986088..9940772ae527 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 ) diff --git a/src/core/qgsvectorlayerfeatureiterator.cpp b/src/core/qgsvectorlayerfeatureiterator.cpp index 9d66ca9a15aa..e3f120b142b9 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 1079fe4613a8..0616e609d547 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 961ae5f1537b..09415b5456d9 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 8fb30fa4049b..b55eb257e9b1 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 993f390deb3f..f019d12435fb 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 4a3c71c3c9a0..f6cf2e76f9d3 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;