diff --git a/python/core/qgstaskmanager.sip b/python/core/qgstaskmanager.sip index 773c7807c2c..c93a54b59c1 100644 --- a/python/core/qgstaskmanager.sip +++ b/python/core/qgstaskmanager.sip @@ -126,19 +126,9 @@ class QgsTask : QObject void addSubTask( QgsTask* subTask /Transfer/, const QgsTaskList& dependencies = QgsTaskList(), SubTaskDependency subTaskDependency = SubTaskIndependent ); - /** - * Sets a list of layer IDs on which the task depends. The task will automatically - * be canceled if any of these layers are about to be removed. - * @see dependentLayerIds() - */ - void setDependentLayers( const QStringList& dependentLayerIds ); + void setDependentLayers( const QList& dependentLayers ); - /** - * Returns the list of layer IDs on which the task depends. The task will automatically - * be canceled if any of these layers are about to be removed. - * @see setDependentLayers() - */ - QStringList dependentLayerIds() const; + QList< QgsMapLayer* > dependentLayers() const; signals: @@ -317,19 +307,9 @@ class QgsTaskManager : QObject //! @note not available in Python bindings //QSet< long > dependencies( long taskId ) const; - /** Returns a list of layers on which as task is dependent. The task will automatically - * be canceled if any of these layers are above to be removed. - * @param taskId task ID - * @returns list of layer IDs - * @see tasksDependentOnLayer() - */ - QStringList dependentLayers( long taskId ) const; + QList< QgsMapLayer* > dependentLayers( long taskId ) const; - /** - * Returns a list of tasks which depend on a layer. - * @see dependentLayers() - */ - QList< QgsTask* > tasksDependentOnLayer( const QString& layerId ) const; + QList< QgsTask* > tasksDependentOnLayer( QgsMapLayer* layer ) const; /** Returns a list of the active (queued or running) tasks. * @see countActiveTasks() diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 6607cb9f31d..f543e8eb1bf 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -8444,7 +8444,7 @@ void QgisApp::removeLayer() QStringList activeTaskDescriptions; Q_FOREACH ( QgsMapLayer * layer, mLayerTreeView->selectedLayers() ) { - QList< QgsTask* > tasks = QgsApplication::taskManager()->tasksDependentOnLayer( layer->id() ); + QList< QgsTask* > tasks = QgsApplication::taskManager()->tasksDependentOnLayer( layer ); if ( !tasks.isEmpty() ) { Q_FOREACH ( QgsTask* task, tasks ) @@ -9649,7 +9649,7 @@ bool QgisApp::checkTasksDependOnProject() for ( ; layerIt != layers.constEnd(); ++layerIt ) { - QList< QgsTask* > tasks = QgsApplication::taskManager()->tasksDependentOnLayer( layerIt.key() ); + QList< QgsTask* > tasks = QgsApplication::taskManager()->tasksDependentOnLayer( layerIt.value() ); if ( !tasks.isEmpty() ) { Q_FOREACH ( QgsTask* task, tasks ) diff --git a/src/core/qgstaskmanager.cpp b/src/core/qgstaskmanager.cpp index 0df3dfda5d6..c37fb49dba2 100644 --- a/src/core/qgstaskmanager.cpp +++ b/src/core/qgstaskmanager.cpp @@ -17,6 +17,7 @@ #include "qgstaskmanager.h" #include "qgsproject.h" +#include "qgsmaplayerlistutils.h" #include @@ -136,9 +137,14 @@ void QgsTask::addSubTask( QgsTask* subTask, const QgsTaskList& dependencies, connect( subTask, &QgsTask::statusChanged, this, &QgsTask::subTaskStatusChanged ); } -void QgsTask::setDependentLayers( const QStringList& dependentLayerIds ) +QList QgsTask::dependentLayers() const { - mDependentLayerIds = dependentLayerIds; + return _qgis_listQPointerToRaw( mDependentLayers ); +} + +void QgsTask::setDependentLayers( const QList< QgsMapLayer* >& dependentLayers ) +{ + mDependentLayers = _qgis_listRawToQPointer( dependentLayers ); } void QgsTask::subTaskStatusChanged( int status ) @@ -325,8 +331,8 @@ QgsTaskManager::QgsTaskManager( QObject* parent ) , mTaskMutex( new QMutex( QMutex::Recursive ) ) , mNextTaskId( 0 ) { - connect( QgsProject::instance(), SIGNAL( layersWillBeRemoved( QStringList ) ), - this, SLOT( layersWillBeRemoved( QStringList ) ) ); + connect( QgsProject::instance(), static_cast < void ( QgsProject::* )( const QList< QgsMapLayer* >& ) > ( &QgsProject::layersWillBeRemoved ), + this, &QgsTaskManager::layersWillBeRemoved ); } QgsTaskManager::~QgsTaskManager() @@ -376,8 +382,8 @@ long QgsTaskManager::addTaskPrivate( QgsTask* task, QgsTaskList dependencies, bo { mParentTasks << task; } - if ( !task->dependentLayerIds().isEmpty() ) - mLayerDependencies.insert( taskId, task->dependentLayerIds() ); + if ( !task->dependentLayers().isEmpty() ) + mLayerDependencies.insert( taskId, _qgis_listRawToQPointer( task->dependentLayers() ) ); mTaskMutex->unlock(); connect( task, &QgsTask::statusChanged, this, &QgsTaskManager::taskStatusChanged ); @@ -546,20 +552,20 @@ bool QgsTaskManager::hasCircularDependencies( long taskId ) const return !resolveDependencies( taskId, taskId, d ); } -QStringList QgsTaskManager::dependentLayers( long taskId ) const +QList QgsTaskManager::dependentLayers( long taskId ) const { QMutexLocker ml( mTaskMutex ); - return mLayerDependencies.value( taskId, QStringList() ); + return _qgis_listQPointerToRaw( mLayerDependencies.value( taskId, QgsWeakMapLayerPointerList() ) ); } -QList QgsTaskManager::tasksDependentOnLayer( const QString& layerId ) const +QList QgsTaskManager::tasksDependentOnLayer( QgsMapLayer* layer ) const { QMutexLocker ml( mTaskMutex ); QList< QgsTask* > tasks; - QMap< long, QStringList >::const_iterator layerIt = mLayerDependencies.constBegin(); + QMap< long, QgsWeakMapLayerPointerList >::const_iterator layerIt = mLayerDependencies.constBegin(); for ( ; layerIt != mLayerDependencies.constEnd(); ++layerIt ) { - if ( layerIt.value().contains( layerId ) ) + if ( _qgis_listQPointerToRaw( layerIt.value() ).contains( layer ) ) { QgsTask* layerTask = task( layerIt.key() ); if ( layerTask ) @@ -648,21 +654,21 @@ void QgsTaskManager::taskStatusChanged( int status ) } -void QgsTaskManager::layersWillBeRemoved( const QStringList& layerIds ) +void QgsTaskManager::layersWillBeRemoved( const QList< QgsMapLayer* >& layers ) { mTaskMutex->lock(); // scan through layers to be removed - QMap< long, QStringList > layerDependencies = mLayerDependencies; + QMap< long, QgsWeakMapLayerPointerList > layerDependencies = mLayerDependencies; layerDependencies.detach(); mTaskMutex->unlock(); - Q_FOREACH ( const QString& layerId, layerIds ) + Q_FOREACH ( QgsMapLayer* layer, layers ) { // scan through tasks with layer dependencies - for ( QMap< long, QStringList >::const_iterator it = layerDependencies.constBegin(); + for ( QMap< long, QgsWeakMapLayerPointerList >::const_iterator it = layerDependencies.constBegin(); it != layerDependencies.constEnd(); ++it ) { - if ( !it.value().contains( layerId ) ) + if ( !( _qgis_listQPointerToRaw( it.value() ).contains( layer ) ) ) { //task not dependent on this layer continue; diff --git a/src/core/qgstaskmanager.h b/src/core/qgstaskmanager.h index 68d2f9998e1..57bc55cc977 100644 --- a/src/core/qgstaskmanager.h +++ b/src/core/qgstaskmanager.h @@ -24,6 +24,7 @@ #include #include "qgis_core.h" +#include "qgsmaplayer.h" class QgsTask; class QgsTaskRunnableWrapper; @@ -170,18 +171,18 @@ class CORE_EXPORT QgsTask : public QObject SubTaskDependency subTaskDependency = SubTaskIndependent ); /** - * Sets a list of layer IDs on which the task depends. The task will automatically + * Sets a list of layers on which the task depends. The task will automatically * be canceled if any of these layers are about to be removed. * @see dependentLayerIds() */ - void setDependentLayers( const QStringList& dependentLayerIds ); + void setDependentLayers( const QList& dependentLayers ); /** - * Returns the list of layer IDs on which the task depends. The task will automatically + * Returns the list of layers on which the task depends. The task will automatically * be canceled if any of these layers are about to be removed. * @see setDependentLayers() */ - QStringList dependentLayerIds() const { return mDependentLayerIds; } + QList< QgsMapLayer* > dependentLayers() const; signals: @@ -296,7 +297,7 @@ class CORE_EXPORT QgsTask : public QObject }; QList< SubTask > mSubTasks; - QStringList mDependentLayerIds; + QgsWeakMapLayerPointerList mDependentLayers; /** @@ -430,16 +431,16 @@ class CORE_EXPORT QgsTaskManager : public QObject /** Returns a list of layers on which as task is dependent. The task will automatically * be canceled if any of these layers are above to be removed. * @param taskId task ID - * @returns list of layer IDs + * @returns list of layers * @see tasksDependentOnLayer() */ - QStringList dependentLayers( long taskId ) const; + QList< QgsMapLayer* > dependentLayers( long taskId ) const; /** * Returns a list of tasks which depend on a layer. * @see dependentLayers() */ - QList< QgsTask* > tasksDependentOnLayer( const QString& layerId ) const; + QList< QgsTask* > tasksDependentOnLayer( QgsMapLayer* layer ) const; /** Returns a list of the active (queued or running) tasks. * @see countActiveTasks() @@ -489,7 +490,7 @@ class CORE_EXPORT QgsTaskManager : public QObject void taskProgressChanged( double progress ); void taskStatusChanged( int status ); - void layersWillBeRemoved( const QStringList& layerIds ); + void layersWillBeRemoved( const QList& layers ); private: @@ -506,7 +507,7 @@ class CORE_EXPORT QgsTaskManager : public QObject QMap< long, TaskInfo > mTasks; QMap< long, QgsTaskList > mTaskDependencies; - QMap< long, QStringList > mLayerDependencies; + QMap< long, QgsWeakMapLayerPointerList > mLayerDependencies; //! Tracks the next unique task ID long mNextTaskId; diff --git a/src/core/qgsvectorfilewritertask.cpp b/src/core/qgsvectorfilewritertask.cpp index 0da7797faeb..f25f6b003e1 100644 --- a/src/core/qgsvectorfilewritertask.cpp +++ b/src/core/qgsvectorfilewritertask.cpp @@ -30,7 +30,7 @@ QgsVectorFileWriterTask::QgsVectorFileWriterTask( QgsVectorLayer* layer, const Q mOptions.feedback = mOwnedFeedback.get(); } if ( mLayer ) - setDependentLayers( QStringList() << mLayer->id() ); + setDependentLayers( QList< QgsMapLayer* >() << mLayer ); } void QgsVectorFileWriterTask::cancel() diff --git a/tests/src/core/testqgstaskmanager.cpp b/tests/src/core/testqgstaskmanager.cpp index 92b643c622a..7e82559f4cb 100644 --- a/tests/src/core/testqgstaskmanager.cpp +++ b/tests/src/core/testqgstaskmanager.cpp @@ -1026,13 +1026,13 @@ void TestQgsTaskManager::layerDependencies() //test that remove layers cancels all tasks which are dependent on them TestTask* task = new TestTask(); task->hold(); - task->setDependentLayers( QStringList() << layer2->id() << layer3->id() ); - QCOMPARE( task->dependentLayerIds(), QStringList() << layer2->id() << layer3->id() ); + task->setDependentLayers( QList< QgsMapLayer* >() << layer2 << layer3 ); + QCOMPARE( task->dependentLayers(), QList< QgsMapLayer* >() << layer2 << layer3 ); long taskId = manager.addTask( task ); - QCOMPARE( manager.dependentLayers( taskId ), QStringList() << layer2->id() << layer3->id() ); - QVERIFY( manager.tasksDependentOnLayer( "xxx" ).isEmpty() ); - QCOMPARE( manager.tasksDependentOnLayer( layer2->id() ), QList< QgsTask* >() << task ); - QCOMPARE( manager.tasksDependentOnLayer( layer3->id() ), QList< QgsTask* >() << task ); + QCOMPARE( manager.dependentLayers( taskId ), QList< QgsMapLayer* >() << layer2 << layer3 ); + QVERIFY( manager.tasksDependentOnLayer( nullptr ).isEmpty() ); + QCOMPARE( manager.tasksDependentOnLayer( layer2 ), QList< QgsTask* >() << task ); + QCOMPARE( manager.tasksDependentOnLayer( layer3 ), QList< QgsTask* >() << task ); QCOMPARE( task->status(), QgsTask::OnHold ); //removing layer1 should have no effect