Skip to content

Commit

Permalink
Merge pull request #5807 from nyalldawson/alg_background
Browse files Browse the repository at this point in the history
[processing] Add flag to indicate whether an algorithm is safe
  • Loading branch information
nyalldawson committed Jan 10, 2018
2 parents 6894c8e + 240c52a commit 0a3f9f6
Show file tree
Hide file tree
Showing 100 changed files with 515 additions and 20 deletions.
1 change: 1 addition & 0 deletions python/core/processing/qgsprocessingalgorithm.sip
Expand Up @@ -44,6 +44,7 @@ Abstract base class for processing algorithms.
FlagSupportsBatch,
FlagCanCancel,
FlagRequiresMatchingCrs,
FlagCanRunInBackground,
FlagDeprecated,
};
typedef QFlags<QgsProcessingAlgorithm::Flag> Flags;
Expand Down
7 changes: 7 additions & 0 deletions python/gui/processing/qgsprocessingalgorithmdialogbase.sip
Expand Up @@ -133,6 +133,12 @@ Sets a progress text message.
void pushConsoleInfo( const QString &info );
%Docstring
Pushes a console info string to the dialog's log.
%End

QDialog *createProgressDialog();
%Docstring
Creates a modal progress dialog showing progress and log messages
from this dialog.
%End

protected:
Expand Down Expand Up @@ -210,6 +216,7 @@ Called when the algorithm has finished executing.
};



/************************************************************************
* This file has been generated automatically from *
* *
Expand Down
39 changes: 28 additions & 11 deletions python/plugins/processing/gui/AlgorithmDialog.py
Expand Up @@ -28,7 +28,7 @@
from pprint import pformat
import time

from qgis.PyQt.QtCore import QCoreApplication
from qgis.PyQt.QtCore import QCoreApplication, Qt
from qgis.PyQt.QtWidgets import QMessageBox, QPushButton, QSizePolicy, QDialogButtonBox
from qgis.PyQt.QtGui import QColor, QPalette

Expand All @@ -53,7 +53,7 @@
from processing.gui.ParametersPanel import ParametersPanel
from processing.gui.BatchAlgorithmDialog import BatchAlgorithmDialog
from processing.gui.AlgorithmDialogBase import AlgorithmDialogBase
from processing.gui.AlgorithmExecutor import executeIterating
from processing.gui.AlgorithmExecutor import executeIterating, execute
from processing.gui.Postprocessing import handleAlgorithmResults

from processing.tools import dataobjects
Expand All @@ -63,6 +63,7 @@ class AlgorithmDialog(QgsProcessingAlgorithmDialogBase):

def __init__(self, alg):
super().__init__()
self.feedback_dialog = None

self.setAlgorithm(alg)
self.setMainWidget(self.getParametersPanel(alg, self))
Expand Down Expand Up @@ -196,12 +197,6 @@ def accept(self):

self.clearProgress()
self.setProgressText(self.tr('Processing algorithm...'))
# Make sure the Log tab is visible before executing the algorithm
try:
self.showLog()
self.repaint()
except:
pass

self.setInfo(
self.tr('<b>Algorithm \'{0}\' starting...</b>').format(self.algorithm().displayName()), escapeHtml=False)
Expand All @@ -215,6 +210,13 @@ def accept(self):
start_time = time.time()

if self.iterateParam:
# Make sure the Log tab is visible before executing the algorithm
try:
self.showLog()
self.repaint()
except:
pass

self.cancelButton().setEnabled(self.algorithm().flags() & QgsProcessingAlgorithm.FlagCanCancel)
if executeIterating(self.algorithm(), parameters, self.iterateParam, context, feedback):
feedback.pushInfo(
Expand All @@ -240,12 +242,27 @@ def on_complete(ok, results):
self.tr('Execution failed after {0:0.2f} seconds'.format(time.time() - start_time)))
feedback.pushInfo('')

if self.feedback_dialog is not None:
self.feedback_dialog.close()
self.feedback_dialog.deleteLater()
self.feedback_dialog = None

self.cancelButton().setEnabled(False)

self.finish(ok, results, context, feedback)

task = QgsProcessingAlgRunnerTask(self.algorithm(), parameters, context, feedback)
task.executed.connect(on_complete)
QgsApplication.taskManager().addTask(task)
if self.algorithm().flags() & QgsProcessingAlgorithm.FlagCanRunInBackground:
# Make sure the Log tab is visible before executing the algorithm
self.showLog()

task = QgsProcessingAlgRunnerTask(self.algorithm(), parameters, context, feedback)
task.executed.connect(on_complete)
QgsApplication.taskManager().addTask(task)
else:
self.feedback_dialog = self.createProgressDialog()
self.feedback_dialog.show()
ok, results = execute(self.algorithm(), parameters, context, feedback)
on_complete(ok, results)

except AlgorithmDialogBase.InvalidParameterValue as e:
try:
Expand Down
5 changes: 5 additions & 0 deletions src/3d/processing/qgsalgorithmtessellate.cpp
Expand Up @@ -31,6 +31,11 @@ QString QgsTessellateAlgorithm::displayName() const
return QObject::tr( "Tessellate" );
}

QgsProcessingAlgorithm::Flags QgsTessellateAlgorithm::flags() const
{
return QgsProcessingFeatureBasedAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

QStringList QgsTessellateAlgorithm::tags() const
{
return QObject::tr( "3d,triangle" ).split( ',' );
Expand Down
1 change: 1 addition & 0 deletions src/3d/processing/qgsalgorithmtessellate.h
Expand Up @@ -36,6 +36,7 @@ class QgsTessellateAlgorithm : public QgsProcessingFeatureBasedAlgorithm
QgsTessellateAlgorithm() = default;
QString name() const override;
QString displayName() const override;
Flags flags() const override;
QStringList tags() const override;
QString group() const override;
QString shortHelpString() const override;
Expand Down
6 changes: 6 additions & 0 deletions src/analysis/network/qgsgraphanalyzer.cpp
Expand Up @@ -24,6 +24,12 @@

void QgsGraphAnalyzer::dijkstra( const QgsGraph *source, int startPointIdx, int criterionNum, QVector<int> *resultTree, QVector<double> *resultCost )
{
if ( startPointIdx < 0 || startPointIdx >= source->vertexCount() )
{
// invalid start point
return;
}

QVector< double > *result = nullptr;
if ( resultCost )
{
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmaddincrementalfield.cpp
Expand Up @@ -19,6 +19,11 @@

///@cond PRIVATE

QgsProcessingAlgorithm::Flags QgsAddIncrementalFieldAlgorithm::flags() const
{
return QgsProcessingFeatureBasedAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

QString QgsAddIncrementalFieldAlgorithm::name() const
{
return QStringLiteral( "addautoincrementalfield" );
Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmaddincrementalfield.h
Expand Up @@ -34,6 +34,7 @@ class QgsAddIncrementalFieldAlgorithm : public QgsProcessingFeatureBasedAlgorith
public:

QgsAddIncrementalFieldAlgorithm() = default;
Flags flags() const override;
QString name() const override;
QString displayName() const override;
QStringList tags() const override;
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmassignprojection.cpp
Expand Up @@ -19,6 +19,11 @@

///@cond PRIVATE

QgsProcessingAlgorithm::Flags QgsAssignProjectionAlgorithm::flags() const
{
return QgsProcessingFeatureBasedAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

QString QgsAssignProjectionAlgorithm::name() const
{
return QStringLiteral( "assignprojection" );
Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmassignprojection.h
Expand Up @@ -34,6 +34,7 @@ class QgsAssignProjectionAlgorithm : public QgsProcessingFeatureBasedAlgorithm
public:

QgsAssignProjectionAlgorithm() = default;
Flags flags() const override;
QString name() const override;
QString displayName() const override;
QStringList tags() const override;
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmboundary.cpp
Expand Up @@ -19,6 +19,11 @@

///@cond PRIVATE

QgsProcessingAlgorithm::Flags QgsBoundaryAlgorithm::flags() const
{
return QgsProcessingFeatureBasedAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

QString QgsBoundaryAlgorithm::name() const
{
return QStringLiteral( "boundary" );
Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmboundary.h
Expand Up @@ -34,6 +34,7 @@ class QgsBoundaryAlgorithm : public QgsProcessingFeatureBasedAlgorithm
public:

QgsBoundaryAlgorithm() = default;
Flags flags() const override;
QString name() const override;
QString displayName() const override;
QStringList tags() const override;
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmboundingbox.cpp
Expand Up @@ -19,6 +19,11 @@

///@cond PRIVATE

QgsProcessingAlgorithm::Flags QgsBoundingBoxAlgorithm::flags() const
{
return QgsProcessingFeatureBasedAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

QString QgsBoundingBoxAlgorithm::name() const
{
return QStringLiteral( "boundingboxes" );
Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmboundingbox.h
Expand Up @@ -34,6 +34,7 @@ class QgsBoundingBoxAlgorithm : public QgsProcessingFeatureBasedAlgorithm
public:

QgsBoundingBoxAlgorithm() = default;
Flags flags() const override;
QString name() const override;
QString displayName() const override;
QStringList tags() const override;
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmbuffer.cpp
Expand Up @@ -63,6 +63,11 @@ void QgsBufferAlgorithm::initAlgorithm( const QVariantMap & )
addParameter( new QgsProcessingParameterFeatureSink( QStringLiteral( "OUTPUT" ), QObject::tr( "Buffered" ), QgsProcessing::TypeVectorPolygon ) );
}

QgsProcessingAlgorithm::Flags QgsBufferAlgorithm::flags() const
{
return QgsProcessingAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

QString QgsBufferAlgorithm::shortHelpString() const
{
return QObject::tr( "This algorithm computes a buffer area for all the features in an input layer, using a fixed or dynamic distance.\n\n"
Expand Down
2 changes: 1 addition & 1 deletion src/analysis/processing/qgsalgorithmbuffer.h
Expand Up @@ -35,7 +35,7 @@ class QgsBufferAlgorithm : public QgsProcessingAlgorithm

QgsBufferAlgorithm() = default;
void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override;

Flags flags() const override;
QString name() const override;
QString displayName() const override;
QStringList tags() const override;
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmcentroid.cpp
Expand Up @@ -49,6 +49,11 @@ QString QgsCentroidAlgorithm::outputName() const
return QObject::tr( "Centroids" );
}

QgsProcessingAlgorithm::Flags QgsCentroidAlgorithm::flags() const
{
return QgsProcessingFeatureBasedAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

void QgsCentroidAlgorithm::initAlgorithm( const QVariantMap & )
{
addParameter( new QgsProcessingParameterFeatureSource( QStringLiteral( "INPUT" ), QObject::tr( "Input layer" ) ) );
Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmcentroid.h
Expand Up @@ -34,6 +34,7 @@ class QgsCentroidAlgorithm : public QgsProcessingFeatureBasedAlgorithm
public:

QgsCentroidAlgorithm() = default;
Flags flags() const override;
void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override;
QString name() const override;
QString displayName() const override;
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmclip.cpp
Expand Up @@ -40,6 +40,11 @@ QString QgsClipAlgorithm::group() const
return QObject::tr( "Vector overlay" );
}

QgsProcessingAlgorithm::Flags QgsClipAlgorithm::flags() const
{
return QgsProcessingAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

QString QgsClipAlgorithm::groupId() const
{
return QStringLiteral( "vectoroverlay" );
Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmclip.h
Expand Up @@ -34,6 +34,7 @@ class QgsClipAlgorithm : public QgsProcessingAlgorithm
public:

QgsClipAlgorithm() = default;
Flags flags() const override;
void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override;
QString name() const override;
QString displayName() const override;
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmconvexhull.cpp
Expand Up @@ -19,6 +19,11 @@

///@cond PRIVATE

QgsProcessingAlgorithm::Flags QgsConvexHullAlgorithm::flags() const
{
return QgsProcessingFeatureBasedAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

QString QgsConvexHullAlgorithm::name() const
{
return QStringLiteral( "convexhull" );
Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmconvexhull.h
Expand Up @@ -35,6 +35,7 @@ class QgsConvexHullAlgorithm : public QgsProcessingFeatureBasedAlgorithm
public:

QgsConvexHullAlgorithm() = default;
Flags flags() const override;
QString name() const override;
QString displayName() const override;
QStringList tags() const override;
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmdissolve.cpp
Expand Up @@ -23,6 +23,11 @@
// QgsCollectorAlgorithm
//

QgsProcessingAlgorithm::Flags QgsCollectorAlgorithm::flags() const
{
return QgsProcessingAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

QVariantMap QgsCollectorAlgorithm::processCollection( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback,
const std::function<QgsGeometry( const QVector< QgsGeometry >& )> &collector, int maxQueueLength )
{
Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmdissolve.h
Expand Up @@ -32,6 +32,7 @@ class QgsCollectorAlgorithm : public QgsProcessingAlgorithm
{
protected:

Flags flags() const override;
QVariantMap processCollection( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback,
const std::function<QgsGeometry( const QVector<QgsGeometry>& )> &collector, int maxQueueLength = 0 );
};
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmdropgeometry.cpp
Expand Up @@ -19,6 +19,11 @@

///@cond PRIVATE

QgsProcessingAlgorithm::Flags QgsDropGeometryAlgorithm::flags() const
{
return QgsProcessingFeatureBasedAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

QString QgsDropGeometryAlgorithm::name() const
{
return QStringLiteral( "dropgeometries" );
Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmdropgeometry.h
Expand Up @@ -34,6 +34,7 @@ class QgsDropGeometryAlgorithm : public QgsProcessingFeatureBasedAlgorithm
public:

QgsDropGeometryAlgorithm() = default;
Flags flags() const override;
QString name() const override;
QString displayName() const override;
QStringList tags() const override;
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmdropmzvalues.cpp
Expand Up @@ -19,6 +19,11 @@

///@cond PRIVATE

QgsProcessingAlgorithm::Flags QgsDropMZValuesAlgorithm::flags() const
{
return QgsProcessingFeatureBasedAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

QString QgsDropMZValuesAlgorithm::name() const
{
return QStringLiteral( "dropmzvalues" );
Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmdropmzvalues.h
Expand Up @@ -34,6 +34,7 @@ class QgsDropMZValuesAlgorithm : public QgsProcessingFeatureBasedAlgorithm
public:

QgsDropMZValuesAlgorithm() = default;
Flags flags() const override;
QString name() const override;
QString displayName() const override;
QStringList tags() const override;
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmextenttolayer.cpp
Expand Up @@ -24,6 +24,11 @@ QString QgsExtentToLayerAlgorithm::name() const
return QStringLiteral( "extenttolayer" );
}

QgsProcessingAlgorithm::Flags QgsExtentToLayerAlgorithm::flags() const
{
return QgsProcessingAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

void QgsExtentToLayerAlgorithm::initAlgorithm( const QVariantMap & )
{
addParameter( new QgsProcessingParameterExtent( QStringLiteral( "INPUT" ), QObject::tr( "Extent" ) ) );
Expand Down
1 change: 1 addition & 0 deletions src/analysis/processing/qgsalgorithmextenttolayer.h
Expand Up @@ -34,6 +34,7 @@ class QgsExtentToLayerAlgorithm : public QgsProcessingAlgorithm
public:

QgsExtentToLayerAlgorithm() = default;
Flags flags() const override;
void initAlgorithm( const QVariantMap &configuration = QVariantMap() ) override;
QString name() const override;
QString displayName() const override { return QObject::tr( "Create layer from extent" ); }
Expand Down
5 changes: 5 additions & 0 deletions src/analysis/processing/qgsalgorithmextractbyattribute.cpp
Expand Up @@ -39,6 +39,11 @@ QString QgsExtractByAttributeAlgorithm::group() const
return QObject::tr( "Vector selection" );
}

QgsProcessingAlgorithm::Flags QgsExtractByAttributeAlgorithm::flags() const
{
return QgsProcessingAlgorithm::flags() | QgsProcessingAlgorithm::FlagCanRunInBackground;
}

QString QgsExtractByAttributeAlgorithm::groupId() const
{
return QStringLiteral( "vectorselection" );
Expand Down

0 comments on commit 0a3f9f6

Please sign in to comment.