Skip to content

Commit 273d3c8

Browse files
committed
Put topology check cancelation into its own routine
1 parent fe5a80c commit 273d3c8

File tree

2 files changed

+25
-19
lines changed

2 files changed

+25
-19
lines changed

src/app/qgsgeometryvalidationservice.cpp

+23-19
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,27 @@ void QgsGeometryValidationService::enableLayerChecks( QgsVectorLayer *layer )
174174
mLayerCheckStates[layer].topologyChecks = topologyChecks;
175175
}
176176

177+
void QgsGeometryValidationService::cancelTopologyCheck( QgsVectorLayer *layer )
178+
{
179+
QFutureWatcher<void> *futureWatcher = mLayerCheckStates[layer].topologyCheckFutureWatcher;
180+
if ( futureWatcher )
181+
{
182+
// Make sure no more checks are started first
183+
futureWatcher->cancel();
184+
185+
// Tell all checks to stop asap
186+
const auto feedbacks = mLayerCheckStates[layer].topologyCheckFeedbacks;
187+
for ( QgsFeedback *feedback : feedbacks )
188+
{
189+
if ( feedback )
190+
feedback->cancel();
191+
}
192+
193+
futureWatcher->waitForFinished();
194+
mLayerCheckStates[layer].topologyCheckFutureWatcher = nullptr;
195+
}
196+
}
197+
177198
void QgsGeometryValidationService::cancelChecks( QgsVectorLayer *layer, QgsFeatureId fid )
178199
{
179200

@@ -204,24 +225,7 @@ void QgsGeometryValidationService::processFeature( QgsVectorLayer *layer, QgsFea
204225
void QgsGeometryValidationService::triggerTopologyChecks( QgsVectorLayer *layer )
205226
{
206227
emit topologyChecksCleared( layer );
207-
208-
QFutureWatcher<void> *futureWatcher = mLayerCheckStates[layer].topologyCheckFutureWatcher;
209-
if ( futureWatcher )
210-
{
211-
// Make sure no more checks are started first
212-
futureWatcher->cancel();
213-
214-
// Tell all checks to stop asap
215-
const auto feedbacks = mLayerCheckStates[layer].topologyCheckFeedbacks;
216-
for ( QgsFeedback *feedback : feedbacks )
217-
{
218-
if ( feedback )
219-
feedback->cancel();
220-
}
221-
222-
// The future watcher will take care of deleting
223-
mLayerCheckStates[layer].topologyCheckFeedbacks.clear();
224-
}
228+
cancelTopologyCheck( layer );
225229

226230
QgsFeatureIds affectedFeatureIds = layer->editBuffer()->changedGeometries().keys().toSet();
227231
affectedFeatureIds.unite( layer->editBuffer()->addedFeatures().keys().toSet() );
@@ -282,7 +286,7 @@ void QgsGeometryValidationService::triggerTopologyChecks( QgsVectorLayer *layer
282286
errorLocker.unlock();
283287
} );
284288

285-
futureWatcher = new QFutureWatcher<void>();
289+
QFutureWatcher<void> *futureWatcher = new QFutureWatcher<void>();
286290
futureWatcher->setFuture( future );
287291

288292
connect( futureWatcher, &QFutureWatcherBase::finished, this, [&allErrors, layer, feedbacks, futureWatcher, this]()

src/app/qgsgeometryvalidationservice.h

+2
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ class QgsGeometryValidationService : public QObject
8787
private:
8888
void enableLayerChecks( QgsVectorLayer *layer );
8989

90+
void cancelTopologyCheck( QgsVectorLayer *layer );
91+
9092
void cancelChecks( QgsVectorLayer *layer, QgsFeatureId fid );
9193

9294
void processFeature( QgsVectorLayer *layer, QgsFeatureId fid );

0 commit comments

Comments
 (0)