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 authored 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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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