QGIS/src/gui/processing/qgsprocessingalgorithmdialogbase.h
2023-03-21 03:50:08 +10:00

574 lines
15 KiB
C++

/***************************************************************************
qgsprocessingalgorithmdialogbase.h
----------------------------------
Date : November 2017
Copyright : (C) 2017 Nyall Dawson
Email : nyall dot dawson at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSPROCESSINGALGORITHMDIALOGBASE_H
#define QGSPROCESSINGALGORITHMDIALOGBASE_H
#include "qgis.h"
#include "qgis_gui.h"
#include "ui_qgsprocessingalgorithmdialogbase.h"
#include "ui_qgsprocessingalgorithmprogressdialogbase.h"
#include "ui_qgsprocessingcontextoptionsbase.h"
#include "qgsprocessingcontext.h"
#include "qgsprocessingfeedback.h"
#include "qgsprocessingwidgetwrapper.h"
///@cond NOT_STABLE
class QgsProcessingAlgorithm;
class QToolButton;
class QgsProcessingAlgorithmDialogBase;
class QgsProcessingContextOptionsWidget;
class QgsMessageBar;
class QgsProcessingAlgRunnerTask;
class QgsTask;
#ifndef SIP_RUN
/**
* \ingroup gui
* \brief QgsProcessingFeedback subclass linked to a QgsProcessingAlgorithmDialogBase
* \note Not stable API
* \since QGIS 3.0
*/
class QgsProcessingAlgorithmDialogFeedback : public QgsProcessingFeedback
{
Q_OBJECT
public:
/**
* Constructor for QgsProcessingAlgorithmDialogFeedback.
*/
QgsProcessingAlgorithmDialogFeedback();
signals:
void progressTextChanged( const QString &text );
void errorReported( const QString &text, bool fatalError );
void warningPushed( const QString &text );
void infoPushed( const QString &text );
void commandInfoPushed( const QString &text );
void debugInfoPushed( const QString &text );
void consoleInfoPushed( const QString &text );
public slots:
void setProgressText( const QString &text ) override;
void reportError( const QString &error, bool fatalError ) override;
void pushWarning( const QString &info ) override;
void pushInfo( const QString &info ) override;
void pushCommandInfo( const QString &info ) override;
void pushDebugInfo( const QString &info ) override;
void pushConsoleInfo( const QString &info ) override;
};
#endif
/**
* \ingroup gui
* \brief Base class for processing algorithm dialogs.
* \note This is not considered stable API and may change in future QGIS versions.
* \since QGIS 3.0
*/
class GUI_EXPORT QgsProcessingAlgorithmDialogBase : public QDialog, public QgsProcessingParametersGenerator, public QgsProcessingContextGenerator, private Ui::QgsProcessingDialogBase
{
Q_OBJECT
public:
/**
* Log format options.
* \since QGIS 3.2
*/
enum LogFormat
{
FormatPlainText, //!< Plain text file (.txt)
FormatHtml, //!< HTML file (.html)
};
/**
* Dialog modes.
*
* \since QGIS 3.24
*/
enum class DialogMode : int
{
Single, //!< Single algorithm execution mode
Batch, //!< Batch processing mode
};
Q_ENUM( QgsProcessingAlgorithmDialogBase::DialogMode )
/**
* Constructor for QgsProcessingAlgorithmDialogBase.
*/
QgsProcessingAlgorithmDialogBase( QWidget *parent SIP_TRANSFERTHIS = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), QgsProcessingAlgorithmDialogBase::DialogMode mode = QgsProcessingAlgorithmDialogBase::DialogMode::Single );
~QgsProcessingAlgorithmDialogBase() override;
/**
* Sets the \a algorithm to run in the dialog.
*
* Ownership of the algorithm instance is transferred to the dialog.
*
* \see algorithm()
*/
void setAlgorithm( QgsProcessingAlgorithm *algorithm SIP_TRANSFER );
/**
* Returns the algorithm running in the dialog.
* \see setAlgorithm()
*/
QgsProcessingAlgorithm *algorithm();
/**
* Sets the main \a widget for the dialog, usually a panel for configuring algorithm parameters.
* \see mainWidget()
*/
void setMainWidget( QgsPanelWidget *widget SIP_TRANSFER );
/**
* Returns the main widget for the dialog, usually a panel for configuring algorithm parameters.
* \see setMainWidget()
*/
QgsPanelWidget *mainWidget();
/**
* Switches the dialog to the log page.
*/
void showLog();
/**
* Returns TRUE if an algorithm was executed in the dialog.
* \see results()
* \see setExecuted()
*/
bool wasExecuted() const { return mExecuted; }
/**
* Returns the results returned by the algorithm executed.
* \see wasExecuted()
* \see setResults()
*/
QVariantMap results() const { return mResults; }
/**
* Creates a new processing feedback object, automatically connected to the appropriate
* slots in this dialog.
*/
QgsProcessingFeedback *createFeedback() SIP_FACTORY;
/**
* Saves the log contents to a text file (specified by the file \a path), in
* the given \a format.
* \see saveLog()
* \since QGIS 3.2
*/
void saveLogToFile( const QString &path, LogFormat format = FormatPlainText );
/**
* Returns the logging level to use when running algorithms from the dialog.
*
* \see setLogLevel()
* \since QGIS 3.20
*/
QgsProcessingContext::LogLevel logLevel() const;
/**
* Sets the logging \a level to use when running algorithms from the dialog.
*
* \see logLevel()
* \since QGIS 3.20
*/
void setLogLevel( QgsProcessingContext::LogLevel level );
/**
* Sets the parameter \a values to show in the dialog.
*
* \since QGIS 3.24
*/
virtual void setParameters( const QVariantMap &values );
public slots:
/**
* Reports an \a error string to the dialog's log.
*
* If \a fatalError is TRUE, the error prevented the algorithm from executing.
*/
void reportError( const QString &error, bool fatalError );
/**
* Pushes a warning information string to the dialog's log.
*/
void pushWarning( const QString &warning );
/**
* Pushes an information string to the dialog's log.
*/
void pushInfo( const QString &info );
/**
* Pushes a debug info string to the dialog's log.
*/
void pushDebugInfo( const QString &message );
/**
* Pushes command info to the dialog's log.
*/
void pushCommandInfo( const QString &info );
/**
* Sets the percentage progress for the dialog, between 0 and 100.
*/
void setPercentage( double percent );
/**
* Sets a progress text message.
*/
void setProgressText( const QString &text );
/**
* Pushes a console info string to the dialog's log.
*/
void pushConsoleInfo( const QString &info );
/**
* Creates a modal progress dialog showing progress and log messages
* from this dialog.
*/
QDialog *createProgressDialog();
/**
* Clears the current log contents.
* \since QGIS 3.2
*/
void clearLog();
/**
* Opens a dialog allowing users to save the current log contents.
* \see saveLogToFile()
* \since QGIS 3.2
*/
void saveLog();
/**
* Copies the current log contents to the clipboard.
* \since QGIS 3.2
*/
void copyLogToClipboard();
/**
* Switches the dialog to the parameters page.
*/
void showParameters();
void reject() override;
protected:
void closeEvent( QCloseEvent *e ) override;
/**
* Returns the dialog's run button.
*/
QPushButton *runButton();
/**
* Returns the dialog's cancel button.
*/
QPushButton *cancelButton();
/**
* Returns the dialog's change parameters button.
*/
QPushButton *changeParametersButton();
/**
* Returns the dialog's button box.
*/
QDialogButtonBox *buttonBox();
/**
* Returns the dialog's tab widget.
*/
QTabWidget *tabWidget();
/**
* Clears any current progress from the dialog.
*/
void clearProgress();
/**
* Sets whether the algorithm was executed through the dialog.
* \see wasExecuted()
* \see setResults()
*/
void setExecuted( bool executed );
/**
* Sets whether the algorithm was executed through the dialog (no matter the result).
*/
void setExecutedAnyResult( bool executedAnyResult );
/**
* Sets the algorithm results.
* \see results()
* \see setExecuted()
*/
void setResults( const QVariantMap &results );
/**
* Displays an info \a message in the dialog's log.
*/
void setInfo( const QString &message, bool isError = false, bool escapeHtml = true, bool isWarning = false );
/**
* Resets the dialog's gui, ready for another algorithm execution.
*/
void resetGui();
/**
* For subclasses to register their own GUI controls to be reset, ready
* for another algorithm execution.
*/
virtual void resetAdditionalGui();
/**
* Sets visibility for mutually exclusive buttons Run and Change Parameters.
*/
void updateRunButtonVisibility();
/**
* Blocks run and changeParameters buttons and parameters tab while the
* algorithm is running.
*/
void blockControlsWhileRunning();
/**
* For subclasses to register their own GUI controls to be blocked while
* the algorithm is running.
*/
virtual void blockAdditionalControlsWhileRunning();
/**
* Returns the dialog's message bar.
*/
QgsMessageBar *messageBar();
/**
* Hides the short help panel.
*/
void hideShortHelp();
/**
* Sets the current \a task running in the dialog. The task will automatically be started
* by the dialog. Ownership of \a task is transferred to the dialog.
*/
void setCurrentTask( QgsProcessingAlgRunnerTask *task SIP_TRANSFER );
/**
* Formats an input \a string for display in the log tab.
*
* \since QGIS 3.0.1
*/
static QString formatStringForLog( const QString &string );
/**
* Returns TRUE if the dialog is all finalized and can be safely deleted.
*
* \since QGIS 3.26
*/
virtual bool isFinalized();
/**
* Applies any defined overrides for Processing context settings to the specified \a context.
*
* This allows the dialog to override default Processing settings for an individual algorithm execution.
*
* \since QGIS 3.32
*/
void applyContextOverrides( QgsProcessingContext *context );
signals:
/**
* Emitted whenever an algorithm has finished executing in the dialog.
*
* \since QGIS 3.14
*/
void algorithmFinished( bool successful, const QVariantMap &result );
protected slots:
/**
* Called when the algorithm has finished executing.
*/
virtual void finished( bool successful, const QVariantMap &result, QgsProcessingContext &context, QgsProcessingFeedback *feedback );
/**
* Called when the dialog's algorithm should be run. Must be overridden by subclasses.
*/
virtual void runAlgorithm();
/**
* Called when an algorithm task has completed.
*
* \since QGIS 3.26
*/
virtual void algExecuted( bool successful, const QVariantMap &results );
private slots:
void openHelp();
void toggleCollapsed();
void splitterChanged( int pos, int index );
void mTabWidget_currentChanged( int index );
void linkClicked( const QUrl &url );
void taskTriggered( QgsTask *task );
void closeClicked();
private:
DialogMode mMode = DialogMode::Single;
QPushButton *mButtonRun = nullptr;
QPushButton *mButtonClose = nullptr;
QPushButton *mButtonChangeParameters = nullptr;
QByteArray mSplitterState;
QToolButton *mButtonCollapse = nullptr;
QgsMessageBar *mMessageBar = nullptr;
QPushButton *mAdvancedButton = nullptr;
QMenu *mAdvancedMenu = nullptr;
QAction *mCopyAsQgisProcessCommand = nullptr;
QAction *mPasteJsonAction = nullptr;
QAction *mContextSettingsAction = nullptr;
bool mExecuted = false;
bool mExecutedAnyResult = false;
QVariantMap mResults;
QgsPanelWidget *mMainWidget = nullptr;
std::unique_ptr< QgsProcessingAlgorithm > mAlgorithm;
QgsProcessingAlgRunnerTask *mAlgorithmTask = nullptr;
bool mHelpCollapsed = false;
int mMessageLoggedCount = 0;
QgsProcessingContext::LogLevel mLogLevel = QgsProcessingContext::DefaultLevel;
QPointer< QgsProcessingContextOptionsWidget > mContextOptionsWidget;
bool mOverrideDefaultContextSettings = false;
QgsFeatureRequest::InvalidGeometryCheck mGeometryCheck = QgsFeatureRequest::InvalidGeometryCheck::GeometryAbortOnInvalid;
Qgis::DistanceUnit mDistanceUnits = Qgis::DistanceUnit::Unknown;
Qgis::AreaUnit mAreaUnits = Qgis::AreaUnit::Unknown;
QString mTemporaryFolderOverride;
QString formatHelp( QgsProcessingAlgorithm *algorithm );
void scrollToBottomOfLog();
void processEvents();
};
#ifndef SIP_RUN
/**
* \ingroup gui
* \brief A modal dialog for showing algorithm progress and log messages.
* \note This is not considered stable API and may change in future QGIS versions.
* \since QGIS 3.0
*/
class QgsProcessingAlgorithmProgressDialog : public QDialog, private Ui::QgsProcessingProgressDialogBase
{
Q_OBJECT
public:
/**
* Constructor for QgsProcessingAlgorithmProgressDialog.
*/
QgsProcessingAlgorithmProgressDialog( QWidget *parent = nullptr );
/**
* Returns the dialog's progress bar.
*/
QProgressBar *progressBar();
/**
* Returns the dialog's cancel button.
*/
QPushButton *cancelButton();
/**
* Returns the dialog's text log.
*/
QTextEdit *logTextEdit();
public slots:
void reject() override;
};
/**
* \ingroup gui
* \brief Widget for configuring settings for a Processing context.
* \note Not stable API
* \since QGIS 3.32
*/
class GUI_EXPORT QgsProcessingContextOptionsWidget : public QgsPanelWidget, private Ui::QgsProcessingContextOptionsBase
{
Q_OBJECT
public:
/**
* Constructor for QgsProcessingContextOptionsWidget, with the specified \a parent widget.
*/
QgsProcessingContextOptionsWidget( QWidget *parent SIP_TRANSFERTHIS = nullptr );
/**
* Sets the widget state using the specified \a context.
*/
void setFromContext( const QgsProcessingContext *context );
/**
* Returns the invalid geometry check selected in the widget.
*/
QgsFeatureRequest::InvalidGeometryCheck invalidGeometryCheck() const;
/**
* Returns the distance unit selected in the widget.
*/
Qgis::DistanceUnit distanceUnit() const;
/**
* Returns the area unit selected in the widget.
*/
Qgis::AreaUnit areaUnit() const;
/**
* Returns the optional temporary folder override location.
*/
QString temporaryFolder();
};
#endif
///@endcond
#endif // QGSPROCESSINGALGORITHMDIALOGBASE_H