32#include <QDesktopServices> 
   34#include <QApplication> 
   39#include <nlohmann/json.hpp> 
   44QgsProcessingAlgorithmDialogFeedback::QgsProcessingAlgorithmDialogFeedback()
 
   48void QgsProcessingAlgorithmDialogFeedback::setProgressText( 
const QString &text )
 
   51  emit progressTextChanged( text );
 
   54void QgsProcessingAlgorithmDialogFeedback::reportError( 
const QString &error, 
bool fatalError )
 
   57  emit errorReported( error, fatalError );
 
   60void QgsProcessingAlgorithmDialogFeedback::pushWarning( 
const QString &warning )
 
   63  emit warningPushed( warning );
 
   66void QgsProcessingAlgorithmDialogFeedback::pushInfo( 
const QString &info )
 
   69  emit infoPushed( info );
 
   72void QgsProcessingAlgorithmDialogFeedback::pushCommandInfo( 
const QString &info )
 
   75  emit commandInfoPushed( info );
 
   78void QgsProcessingAlgorithmDialogFeedback::pushDebugInfo( 
const QString &info )
 
   81  emit debugInfoPushed( info );
 
   84void QgsProcessingAlgorithmDialogFeedback::pushConsoleInfo( 
const QString &info )
 
   87  emit consoleInfoPushed( info );
 
   90void QgsProcessingAlgorithmDialogFeedback::pushFormattedMessage( 
const QString &html, 
const QString &text )
 
   93  emit formattedMessagePushed( html );
 
  100QgsProcessingAlgorithmDialogBase::QgsProcessingAlgorithmDialogBase( QWidget *parent, Qt::WindowFlags flags, DialogMode mode )
 
  101  : QDialog( parent, flags )
 
  107  splitter->setCollapsible( 0, 
false );
 
  110  QSplitterHandle *splitterHandle = splitter->handle( 1 );
 
  111  QVBoxLayout *handleLayout = 
new QVBoxLayout();
 
  112  handleLayout->setContentsMargins( 0, 0, 0, 0 );
 
  113  mButtonCollapse = 
new QToolButton( splitterHandle );
 
  114  mButtonCollapse->setAutoRaise( 
true );
 
  115  mButtonCollapse->setFixedSize( 12, 12 );
 
  116  mButtonCollapse->setCursor( Qt::ArrowCursor );
 
  117  handleLayout->addWidget( mButtonCollapse );
 
  118  handleLayout->addStretch();
 
  119  splitterHandle->setLayout( handleLayout );
 
  123  txtLog->setOpenLinks( 
false );
 
  124  connect( txtLog, &QTextBrowser::anchorClicked, 
this, &QgsProcessingAlgorithmDialogBase::urlClicked );
 
  127  splitter->restoreState( settings.
value( QStringLiteral( 
"/Processing/dialogBaseSplitter" ), QByteArray() ).toByteArray() );
 
  128  mSplitterState = splitter->saveState();
 
  129  splitterChanged( 0, 0 );
 
  132  mButtonRun = mButtonBox->button( QDialogButtonBox::Ok );
 
  133  mButtonRun->setText( tr( 
"Run" ) );
 
  136  mButtonChangeParameters = mButtonBox->button( QDialogButtonBox::Yes );
 
  137  mButtonChangeParameters->setText( tr( 
"Change Parameters" ) );
 
  139  buttonCancel->setEnabled( 
false );
 
  140  mButtonClose = mButtonBox->button( QDialogButtonBox::Close );
 
  144    case DialogMode::Single:
 
  146      mAdvancedButton = 
new QPushButton( tr( 
"Advanced" ) );
 
  147      mAdvancedMenu = 
new QMenu( 
this );
 
  148      mAdvancedButton->setMenu( mAdvancedMenu );
 
  150      mContextSettingsAction = 
new QAction( tr( 
"Algorithm Settingsā¦" ), mAdvancedMenu );
 
  152      mAdvancedMenu->addAction( mContextSettingsAction );
 
  154      connect( mContextSettingsAction, &QAction::triggered, 
this, [
this]
 
  158          mTabWidget->setCurrentIndex( 0 );
 
  160          if ( !mContextOptionsWidget )
 
  162            mContextOptionsWidget = 
new QgsProcessingContextOptionsWidget();
 
  163            mContextOptionsWidget->setFromContext( processingContext() );
 
  164            mContextOptionsWidget->setLogLevel( mLogLevel );
 
  165            panel->openPanel( mContextOptionsWidget );
 
  169              mOverrideDefaultContextSettings = 
true;
 
  170              mGeometryCheck = mContextOptionsWidget->invalidGeometryCheck();
 
  171              mDistanceUnits = mContextOptionsWidget->distanceUnit();
 
  172              mAreaUnits = mContextOptionsWidget->areaUnit();
 
  173              mTemporaryFolderOverride = mContextOptionsWidget->temporaryFolder();
 
  174              mMaximumThreads = mContextOptionsWidget->maximumThreads();
 
  175              mLogLevel = mContextOptionsWidget->logLevel();
 
  180      mAdvancedMenu->addSeparator();
 
  182      QAction *copyAsPythonCommand = 
new QAction( tr( 
"Copy as Python Command" ), mAdvancedMenu );
 
  185      mAdvancedMenu->addAction( copyAsPythonCommand );
 
  186      connect( copyAsPythonCommand, &QAction::triggered, 
this, [
this]
 
  194          const QString command = alg->asPythonCommand( createProcessingParameters(), *context );
 
  195          QMimeData *m = 
new QMimeData();
 
  196          m->setText( command );
 
  197          QClipboard *cb = QApplication::clipboard();
 
  200          cb->setMimeData( m, QClipboard::Selection );
 
  202          cb->setMimeData( m, QClipboard::Clipboard );
 
  206      mCopyAsQgisProcessCommand = 
new QAction( tr( 
"Copy as qgis_process Command" ), mAdvancedMenu );
 
  208      mAdvancedMenu->addAction( mCopyAsQgisProcessCommand );
 
  210      connect( mCopyAsQgisProcessCommand, &QAction::triggered, 
this, [
this]
 
  219          const QString command = alg->asQgisProcessCommand( createProcessingParameters(), *context, ok );
 
  222            mMessageBar->pushMessage( tr( 
"Current settings cannot be specified as arguments to qgis_process (Pipe parameters as JSON to qgis_process instead)" ), 
Qgis::MessageLevel::Warning );
 
  226            QMimeData *m = 
new QMimeData();
 
  227            m->setText( command );
 
  228            QClipboard *cb = QApplication::clipboard();
 
  231            cb->setMimeData( m, QClipboard::Selection );
 
  233            cb->setMimeData( m, QClipboard::Clipboard );
 
  238      mAdvancedMenu->addSeparator();
 
  240      QAction *copyAsJson = 
new QAction( tr( 
"Copy as JSON" ), mAdvancedMenu );
 
  243      mAdvancedMenu->addAction( copyAsJson );
 
  244      connect( copyAsJson, &QAction::triggered, 
this, [
this]
 
  252          const QVariantMap properties = alg->asMap( createProcessingParameters(), *context );
 
  255          QMimeData *m = 
new QMimeData();
 
  257          QClipboard *cb = QApplication::clipboard();
 
  260          cb->setMimeData( m, QClipboard::Selection );
 
  262          cb->setMimeData( m, QClipboard::Clipboard );
 
  266      mPasteJsonAction = 
new QAction( tr( 
"Paste Settings" ), mAdvancedMenu );
 
  269      mAdvancedMenu->addAction( mPasteJsonAction );
 
  270      connect( mPasteJsonAction, &QAction::triggered, 
this, [
this]
 
  272        const QString text = QApplication::clipboard()->text();
 
  273        if ( text.isEmpty() )
 
  276        const QVariantMap parameterValues = 
QgsJsonUtils::parseJson( text ).toMap().value( QStringLiteral( 
"inputs" ) ).toMap();
 
  277        if ( parameterValues.isEmpty() )
 
  284        setParameters( preparedValues );
 
  287      mButtonBox->addButton( mAdvancedButton, QDialogButtonBox::ResetRole );
 
  291    case DialogMode::Batch:
 
  297    connect( mAdvancedMenu, &QMenu::aboutToShow, 
this, [ = ]
 
  299      mCopyAsQgisProcessCommand->setEnabled( 
algorithm()
 
  301      mPasteJsonAction->setEnabled( !QApplication::clipboard()->text().isEmpty() );
 
  305  connect( mButtonRun, &QPushButton::clicked, 
this, &QgsProcessingAlgorithmDialogBase::runAlgorithm );
 
  306  connect( mButtonChangeParameters, &QPushButton::clicked, 
this, &QgsProcessingAlgorithmDialogBase::showParameters );
 
  307  connect( mButtonBox, &QDialogButtonBox::rejected, 
this, &QgsProcessingAlgorithmDialogBase::closeClicked );
 
  308  connect( mButtonBox, &QDialogButtonBox::helpRequested, 
this, &QgsProcessingAlgorithmDialogBase::openHelp );
 
  309  connect( mButtonCollapse, &QToolButton::clicked, 
this, &QgsProcessingAlgorithmDialogBase::toggleCollapsed );
 
  310  connect( splitter, &QSplitter::splitterMoved, 
this, &QgsProcessingAlgorithmDialogBase::splitterChanged );
 
  312  connect( mButtonSaveLog, &QToolButton::clicked, 
this, &QgsProcessingAlgorithmDialogBase::saveLog );
 
  313  connect( mButtonCopyLog, &QToolButton::clicked, 
this, &QgsProcessingAlgorithmDialogBase::copyLogToClipboard );
 
  314  connect( mButtonClearLog, &QToolButton::clicked, 
this, &QgsProcessingAlgorithmDialogBase::clearLog );
 
  316  connect( mTabWidget, &QTabWidget::currentChanged, 
this, &QgsProcessingAlgorithmDialogBase::mTabWidget_currentChanged );
 
  319  mMessageBar->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Fixed );
 
  320  verticalLayout->insertWidget( 0,  mMessageBar );
 
  325QgsProcessingAlgorithmDialogBase::~QgsProcessingAlgorithmDialogBase() = 
default;
 
  327void QgsProcessingAlgorithmDialogBase::setParameters( 
const QVariantMap & )
 
  340    title = QStringLiteral( 
"%1 - %2" ).arg( mAlgorithm->group(), mAlgorithm->displayName() );
 
  343  setWindowTitle( title );
 
  345  const QString algHelp = formatHelp( 
algorithm );
 
  346  if ( algHelp.isEmpty() )
 
  347    textShortHelp->hide();
 
  350    textShortHelp->document()->setDefaultStyleSheet( QStringLiteral( 
".summary { margin-left: 10px; margin-right: 10px; }\n" 
  351        "h2 { color: #555555; padding-bottom: 15px; }\n" 
  352        "a { text - decoration: none; color: #3498db; font-weight: bold; }\n" 
  353        "p { color: #666666; }\n" 
  354        "b { color: #333333; }\n" 
  355        "dl dd { margin - bottom: 5px; }" ) );
 
  356    textShortHelp->setHtml( algHelp );
 
  357    connect( textShortHelp, &QTextBrowser::anchorClicked, 
this, &QgsProcessingAlgorithmDialogBase::linkClicked );
 
  358    textShortHelp->show();
 
  363    mButtonBox->removeButton( mButtonBox->button( QDialogButtonBox::Help ) );
 
  367  if ( !warning.isEmpty() )
 
  375  return mAlgorithm.get();
 
  378void QgsProcessingAlgorithmDialogBase::setMainWidget( 
QgsPanelWidget *widget )
 
  382    mMainWidget->deleteLater();
 
  385  mPanelStack->setMainPanel( widget );
 
  388  mMainWidget = widget;
 
  397void QgsProcessingAlgorithmDialogBase::saveLogToFile( 
const QString &path, 
const LogFormat format )
 
  399  QFile logFile( path );
 
  400  if ( !logFile.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) )
 
  404  QTextStream fout( &logFile );
 
  408    case FormatPlainText:
 
  409      fout << txtLog->toPlainText();
 
  413      fout << txtLog->toHtml();
 
  420  auto feedback = std::make_unique< QgsProcessingAlgorithmDialogFeedback >();
 
  422  connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::commandInfoPushed, 
this, &QgsProcessingAlgorithmDialogBase::pushCommandInfo );
 
  423  connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::consoleInfoPushed, 
this, &QgsProcessingAlgorithmDialogBase::pushConsoleInfo );
 
  424  connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::debugInfoPushed, 
this, &QgsProcessingAlgorithmDialogBase::pushDebugInfo );
 
  425  connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::errorReported, 
this, &QgsProcessingAlgorithmDialogBase::reportError );
 
  426  connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::warningPushed, 
this, &QgsProcessingAlgorithmDialogBase::pushWarning );
 
  427  connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::infoPushed, 
this, &QgsProcessingAlgorithmDialogBase::pushInfo );
 
  428  connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::formattedMessagePushed, 
this, &QgsProcessingAlgorithmDialogBase::pushFormattedMessage );
 
  429  connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::progressTextChanged, 
this, &QgsProcessingAlgorithmDialogBase::setProgressText );
 
  431  return feedback.release();
 
  434QDialogButtonBox *QgsProcessingAlgorithmDialogBase::buttonBox()
 
  439QTabWidget *QgsProcessingAlgorithmDialogBase::tabWidget()
 
  444void QgsProcessingAlgorithmDialogBase::showLog()
 
  446  mTabWidget->setCurrentIndex( 1 );
 
  449void QgsProcessingAlgorithmDialogBase::showParameters()
 
  451  mTabWidget->setCurrentIndex( 0 );
 
  454QPushButton *QgsProcessingAlgorithmDialogBase::runButton()
 
  459QPushButton *QgsProcessingAlgorithmDialogBase::cancelButton()
 
  464QPushButton *QgsProcessingAlgorithmDialogBase::changeParametersButton()
 
  466  return mButtonChangeParameters;
 
  469void QgsProcessingAlgorithmDialogBase::clearProgress()
 
  471  progressBar->setMaximum( 0 );
 
  474void QgsProcessingAlgorithmDialogBase::setExecuted( 
bool executed )
 
  476  mExecuted = executed;
 
  479void QgsProcessingAlgorithmDialogBase::setExecutedAnyResult( 
bool executedAnyResult )
 
  481  mExecutedAnyResult = executedAnyResult;
 
  484void QgsProcessingAlgorithmDialogBase::setResults( 
const QVariantMap &results )
 
  494void QgsProcessingAlgorithmDialogBase::openHelp()
 
  496  QUrl algHelp = mAlgorithm->helpUrl();
 
  497  if ( algHelp.isEmpty() && mAlgorithm->provider() )
 
  499    algHelp = 
QgsHelp::helpUrl( QStringLiteral( 
"processing_algs/%1/%2.html#%3" ).arg( mAlgorithm->provider()->helpId(), mAlgorithm->groupId(), QStringLiteral( 
"%1%2" ).arg( mAlgorithm->provider()->helpId() ).arg( mAlgorithm->name() ) ) );
 
  502  if ( !algHelp.isEmpty() )
 
  503    QDesktopServices::openUrl( algHelp );
 
  506void QgsProcessingAlgorithmDialogBase::toggleCollapsed()
 
  508  if ( mHelpCollapsed )
 
  510    splitter->restoreState( mSplitterState );
 
  511    mButtonCollapse->setArrowType( Qt::RightArrow );
 
  515    mSplitterState = splitter->saveState();
 
  516    splitter->setSizes( QList<int>() << 1 << 0 );
 
  517    mButtonCollapse->setArrowType( Qt::LeftArrow );
 
  519  mHelpCollapsed = !mHelpCollapsed;
 
  522void QgsProcessingAlgorithmDialogBase::splitterChanged( 
int, 
int )
 
  524  if ( splitter->sizes().at( 1 ) == 0 )
 
  526    mHelpCollapsed = 
true;
 
  527    mButtonCollapse->setArrowType( Qt::LeftArrow );
 
  531    mHelpCollapsed = 
false;
 
  532    mButtonCollapse->setArrowType( Qt::RightArrow );
 
  536void QgsProcessingAlgorithmDialogBase::mTabWidget_currentChanged( 
int )
 
  538  updateRunButtonVisibility();
 
  541void QgsProcessingAlgorithmDialogBase::linkClicked( 
const QUrl &url )
 
  543  QDesktopServices::openUrl( url.toString() );
 
  546void QgsProcessingAlgorithmDialogBase::algExecuted( 
bool successful, 
const QVariantMap & )
 
  548  mAlgorithmTask = 
nullptr;
 
  555    setWindowState( ( windowState() & ~Qt::WindowMinimized ) | Qt::WindowActive );
 
  561    if ( isFinalized() && successful )
 
  563      progressBar->setFormat( tr( 
"Complete" ) );
 
  567    if ( isFinalized() && !isVisible() )
 
  574void QgsProcessingAlgorithmDialogBase::taskTriggered( 
QgsTask *task )
 
  576  if ( task == mAlgorithmTask )
 
  580    setWindowState( ( windowState() & ~Qt::WindowMinimized ) | Qt::WindowActive );
 
  586void QgsProcessingAlgorithmDialogBase::closeClicked()
 
  592void QgsProcessingAlgorithmDialogBase::urlClicked( 
const QUrl &url )
 
  594  const QFileInfo file( url.toLocalFile() );
 
  595  if ( file.exists() && !file.isDir() )
 
  598    QDesktopServices::openUrl( url );
 
  611void QgsProcessingAlgorithmDialogBase::reportError( 
const QString &error, 
bool fatalError )
 
  613  setInfo( error, 
true );
 
  620void QgsProcessingAlgorithmDialogBase::pushWarning( 
const QString &warning )
 
  622  setInfo( warning, 
false, 
true, 
true );
 
  626void QgsProcessingAlgorithmDialogBase::pushInfo( 
const QString &info )
 
  632void QgsProcessingAlgorithmDialogBase::pushFormattedMessage( 
const QString &html )
 
  634  setInfo( html, 
false, 
false );
 
  638void QgsProcessingAlgorithmDialogBase::pushCommandInfo( 
const QString &command )
 
  640  txtLog->append( QStringLiteral( 
"<code>%1<code>" ).arg( formatStringForLog( command.toHtmlEscaped() ) ) );
 
  641  scrollToBottomOfLog();
 
  645void QgsProcessingAlgorithmDialogBase::pushDebugInfo( 
const QString &message )
 
  647  txtLog->append( QStringLiteral( 
"<span style=\"color:#777\">%1</span>" ).arg( formatStringForLog( message.toHtmlEscaped() ) ) );
 
  648  scrollToBottomOfLog();
 
  652void QgsProcessingAlgorithmDialogBase::pushConsoleInfo( 
const QString &info )
 
  654  txtLog->append( QStringLiteral( 
"<code style=\"color:#777\">%1</code>" ).arg( formatStringForLog( info.toHtmlEscaped() ) ) );
 
  655  scrollToBottomOfLog();
 
  659QDialog *QgsProcessingAlgorithmDialogBase::createProgressDialog()
 
  661  QgsProcessingAlgorithmProgressDialog *dialog = 
new QgsProcessingAlgorithmProgressDialog( 
this );
 
  662  dialog->setWindowModality( Qt::ApplicationModal );
 
  663  dialog->setWindowTitle( windowTitle() );
 
  664  dialog->setGeometry( geometry() ); 
 
  665  connect( progressBar, &QProgressBar::valueChanged, dialog->progressBar(), &QProgressBar::setValue );
 
  666  connect( dialog->cancelButton(), &QPushButton::clicked, buttonCancel, &QPushButton::click );
 
  667  dialog->logTextEdit()->setHtml( txtLog->toHtml() );
 
  668  connect( txtLog, &QTextEdit::textChanged, dialog, [
this, dialog]()
 
  670    dialog->logTextEdit()->setHtml( txtLog->toHtml() );
 
  671    QScrollBar *sb = dialog->logTextEdit()->verticalScrollBar();
 
  672    sb->setValue( sb->maximum() );
 
  677void QgsProcessingAlgorithmDialogBase::clearLog()
 
  682void QgsProcessingAlgorithmDialogBase::saveLog()
 
  685  const QString lastUsedDir = settings.
value( QStringLiteral( 
"/Processing/lastUsedLogDirectory" ), QDir::homePath() ).toString();
 
  688  const QString txtExt = tr( 
"Text files" ) + QStringLiteral( 
" (*.txt *.TXT)" );
 
  689  const QString htmlExt = tr( 
"HTML files" ) + QStringLiteral( 
" (*.html *.HTML)" );
 
  691  const QString path = QFileDialog::getSaveFileName( 
this, tr( 
"Save Log to File" ), lastUsedDir, txtExt + 
";;" + htmlExt, &filter );
 
  695  if ( path.isEmpty() )
 
  700  settings.
setValue( QStringLiteral( 
"/Processing/lastUsedLogDirectory" ), QFileInfo( path ).path() );
 
  702  LogFormat format = FormatPlainText;
 
  703  if ( filter == htmlExt )
 
  707  saveLogToFile( path, format );
 
  710void QgsProcessingAlgorithmDialogBase::copyLogToClipboard()
 
  712  QMimeData *m = 
new QMimeData();
 
  713  m->setText( txtLog->toPlainText() );
 
  714  m->setHtml( txtLog->toHtml() );
 
  715  QClipboard *cb = QApplication::clipboard();
 
  718  cb->setMimeData( m, QClipboard::Selection );
 
  720  cb->setMimeData( m, QClipboard::Clipboard );
 
  723void QgsProcessingAlgorithmDialogBase::closeEvent( QCloseEvent *e )
 
  725  if ( !mHelpCollapsed )
 
  728    settings.
setValue( QStringLiteral( 
"/Processing/dialogBaseSplitter" ), splitter->saveState() );
 
  731  QDialog::closeEvent( e );
 
  733  if ( !mAlgorithmTask && isFinalized() )
 
  742void QgsProcessingAlgorithmDialogBase::runAlgorithm()
 
  747void QgsProcessingAlgorithmDialogBase::setPercentage( 
double percent )
 
  750  if ( progressBar->maximum() == 0 )
 
  751    progressBar->setMaximum( 100 );
 
  752  progressBar->setValue( percent );
 
  756void QgsProcessingAlgorithmDialogBase::setProgressText( 
const QString &text )
 
  758  lblProgress->setText( text );
 
  759  setInfo( text, 
false );
 
  760  scrollToBottomOfLog();
 
  767  if ( !text.isEmpty() )
 
  769    const QStringList paragraphs = text.split( 
'\n' );
 
  771    for ( 
const QString ¶graph : paragraphs )
 
  773      help += QStringLiteral( 
"<p>%1</p>" ).arg( paragraph );
 
  785void QgsProcessingAlgorithmDialogBase::processEvents()
 
  787  if ( mAlgorithmTask )
 
  803  while ( ++nIters < 100 )
 
  806    QCoreApplication::processEvents();
 
  810void QgsProcessingAlgorithmDialogBase::scrollToBottomOfLog()
 
  812  QScrollBar *sb = txtLog->verticalScrollBar();
 
  813  sb->setValue( sb->maximum() );
 
  816void QgsProcessingAlgorithmDialogBase::resetGui()
 
  818  lblProgress->clear();
 
  819  progressBar->setMaximum( 100 );
 
  820  progressBar->setValue( 0 );
 
  821  mButtonRun->setEnabled( 
true );
 
  822  mButtonChangeParameters->setEnabled( 
true );
 
  823  mButtonClose->setEnabled( 
true );
 
  826    mMainWidget->setEnabled( 
true );
 
  828  updateRunButtonVisibility();
 
  829  resetAdditionalGui();
 
  832void QgsProcessingAlgorithmDialogBase::updateRunButtonVisibility()
 
  835  const bool runButtonVisible = mTabWidget->currentIndex() == 0;
 
  836  mButtonRun->setVisible( runButtonVisible );
 
  837  if ( runButtonVisible )
 
  838    progressBar->resetFormat();
 
  839  mButtonChangeParameters->setVisible( !runButtonVisible && mExecutedAnyResult && mButtonChangeParameters->isEnabled() );
 
  842void QgsProcessingAlgorithmDialogBase::resetAdditionalGui()
 
  847void QgsProcessingAlgorithmDialogBase::blockControlsWhileRunning()
 
  849  mButtonRun->setEnabled( 
false );
 
  850  mButtonChangeParameters->setEnabled( 
false );
 
  853    mMainWidget->setEnabled( 
false );
 
  855  blockAdditionalControlsWhileRunning();
 
  858void QgsProcessingAlgorithmDialogBase::blockAdditionalControlsWhileRunning()
 
  868void QgsProcessingAlgorithmDialogBase::hideShortHelp()
 
  870  textShortHelp->setVisible( 
false );
 
  875  mAlgorithmTask = task;
 
  880QString QgsProcessingAlgorithmDialogBase::formatStringForLog( 
const QString &
string )
 
  883  s.replace( 
'\n', QLatin1String( 
"<br>" ) );
 
  887bool QgsProcessingAlgorithmDialogBase::isFinalized()
 
  899  if ( mOverrideDefaultContextSettings )
 
  909void QgsProcessingAlgorithmDialogBase::setInfo( 
const QString &message, 
bool isError, 
bool escapeHtml, 
bool isWarning )
 
  911  constexpr int MESSAGE_COUNT_LIMIT = 10000;
 
  913  if ( mMessageLoggedCount == MESSAGE_COUNT_LIMIT )
 
  915  ++mMessageLoggedCount;
 
  919  if ( mMessageLoggedCount == MESSAGE_COUNT_LIMIT )
 
  920    txtLog->append( QStringLiteral( 
"<span style=\"color:red\">%1</span>" ).arg( tr( 
"Message log truncated" ) ) );
 
  921  else if ( isError || isWarning )
 
  922    txtLog->append( QStringLiteral( 
"<span style=\"color:%1\">%2</span>" ).arg( isError ? QStringLiteral( 
"red" ) : QStringLiteral( 
"#b85a20" ), escapeHtml ? formatStringForLog( message.toHtmlEscaped() ) : formatStringForLog( message ) ) );
 
  923  else if ( escapeHtml )
 
  924    txtLog->append( QStringLiteral( 
"<span>%1</span" ).arg( formatStringForLog( message.toHtmlEscaped() ) ) );
 
  926    txtLog->append( QStringLiteral( 
"<span>%1</span>" ).arg( formatStringForLog( message ) ) );
 
  927  scrollToBottomOfLog();
 
  931void QgsProcessingAlgorithmDialogBase::reject()
 
  933  if ( !mAlgorithmTask && isFinalized() )
 
  935    setAttribute( Qt::WA_DeleteOnClose );
 
  944QgsProcessingAlgorithmProgressDialog::QgsProcessingAlgorithmProgressDialog( QWidget *parent )
 
  950QProgressBar *QgsProcessingAlgorithmProgressDialog::progressBar()
 
  955QPushButton *QgsProcessingAlgorithmProgressDialog::cancelButton()
 
  957  return mButtonBox->button( QDialogButtonBox::Cancel );
 
  960QTextEdit *QgsProcessingAlgorithmProgressDialog::logTextEdit()
 
  965void QgsProcessingAlgorithmProgressDialog::reject()
 
  975QgsProcessingContextOptionsWidget::QgsProcessingContextOptionsWidget( QWidget *parent )
 
  979  setPanelTitle( tr( 
"Algorithm Settings" ) );
 
  985  mTemporaryFolderWidget->setDialogTitle( tr( 
"Select Temporary Directory" ) );
 
  987  mTemporaryFolderWidget->lineEdit()->setPlaceholderText( tr( 
"Default" ) );
 
 1018    mDistanceUnitsCombo->addItem( title, QVariant::fromValue( unit ) );
 
 1048    mAreaUnitsCombo->addItem( title, QVariant::fromValue( unit ) );
 
 1051  mThreadsSpinBox->setRange( 1, QThread::idealThreadCount() );
 
 1063  whileBlocking( mComboInvalidFeatureFiltering )->setCurrentIndex( mComboInvalidFeatureFiltering->findData( QVariant::fromValue( context->
invalidGeometryCheck() ) ) );
 
 1064  whileBlocking( mDistanceUnitsCombo )->setCurrentIndex( mDistanceUnitsCombo->findData( QVariant::fromValue( context->
distanceUnit() ) ) );
 
 1065  whileBlocking( mAreaUnitsCombo )->setCurrentIndex( mAreaUnitsCombo->findData( QVariant::fromValue( context->
areaUnit() ) ) );
 
 1068  whileBlocking( mLogLevelComboBox )->setCurrentIndex( mLogLevelComboBox->findData( 
static_cast< int >( context->
logLevel() ) ) );
 
 1081Qgis::AreaUnit QgsProcessingContextOptionsWidget::areaUnit()
 const 
 1086QString QgsProcessingContextOptionsWidget::temporaryFolder()
 
 1088  return mTemporaryFolderWidget->filePath();
 
 1091int QgsProcessingContextOptionsWidget::maximumThreads()
 const 
 1093  return mThreadsSpinBox->value();
 
 1098  whileBlocking( mLogLevelComboBox )->setCurrentIndex( mLogLevelComboBox->findData( 
static_cast< int >( level ) ) );
 
DistanceUnit
Units of distance.
 
@ Centimeters
Centimeters.
 
@ Millimeters
Millimeters.
 
@ Miles
Terrestrial miles.
 
@ Unknown
Unknown distance unit.
 
@ Degrees
Degrees, for planar geographic CRS distance measurements.
 
@ Inches
Inches (since QGIS 3.32)
 
@ NauticalMiles
Nautical miles.
 
@ SquareCentimeters
Square centimeters.
 
@ SquareInches
Square inches (since QGIS 3.32)
 
@ SquareNauticalMiles
Square nautical miles.
 
@ SquareMillimeters
Square millimeters.
 
@ SquareYards
Square yards.
 
@ SquareKilometers
Square kilometers.
 
@ SquareMeters
Square meters.
 
@ Unknown
Unknown areal unit.
 
@ SquareDegrees
Square degrees, for planar geographic CRS area measurements.
 
@ SquareMiles
Square miles.
 
@ Warning
Warning message.
 
@ TitleCase
Simple title case conversion - does not fully grammatically parse the text and uses simple rules only...
 
InvalidGeometryCheck
Methods for handling of features with invalid geometries.
 
@ NoCheck
No invalid geometry checking.
 
@ AbortOnInvalid
Close iterator on encountering any features with invalid geometry. This requires a slow geometry vali...
 
@ SkipInvalid
Skip any features with invalid geometry. This requires a slow geometry validity check for every featu...
 
@ NotAvailableInStandaloneTool
Algorithm should not be available from the standalone "qgis_process" tool. Used to flag algorithms wh...
 
@ DisplayNameIsLiteral
Algorithm's display name is a static literal string, and should not be translated or automatically fo...
 
ProcessingLogLevel
Logging level for algorithms to use when pushing feedback messages.
 
@ DefaultLevel
Default logging level.
 
@ Verbose
Verbose logging.
 
@ ModelDebug
Model debug level logging. Includes verbose logging and other outputs useful for debugging models (si...
 
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
 
static QgsTaskManager * taskManager()
Returns the application's task manager, used for managing application wide background task handling.
 
void progressChanged(double progress)
Emitted when the feedback object reports a progress change.
 
void cancel()
Tells the internal routines that the current operation should be canceled. This should be run by the ...
 
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
 
@ HigDialogTitleIsTitleCase
Dialog titles should be title case.
 
static QgsNative * nativePlatformInterface()
Returns the global native interface, which offers abstraction to the host OS's underlying public inte...
 
static QgsGui::HigFlags higFlags()
Returns the platform's HIG flags.
 
static QUrl helpUrl(const QString &key)
Returns URI of the help topic for the given key.
 
static QVariant parseJson(const std::string &jsonString)
Converts JSON jsonString to a QVariant, in case of parsing error an invalid QVariant is returned and ...
 
static json jsonFromVariant(const QVariant &v)
Converts a QVariant v to a json object.
 
A bar for displaying non-blocking messages to the user.
 
QgsTask task which runs a QgsProcessingAlgorithm in a background task.
 
void executed(bool successful, const QVariantMap &results)
Emitted when the algorithm has finished execution.
 
Abstract base class for processing algorithms.
 
virtual QString helpUrl() const
Returns a url pointing to the algorithm's help page.
 
virtual QString shortHelpString() const
Returns a localised short helper string for the algorithm.
 
virtual QString shortDescription() const
Returns an optional translated short description of the algorithm.
 
virtual QString displayName() const =0
Returns the translated algorithm name, which should be used for any user-visible display of the algor...
 
QgsProcessingProvider * provider() const
Returns the provider to which this algorithm belongs.
 
Contains information about the context in which a processing algorithm is executed.
 
Qgis::AreaUnit areaUnit() const
Returns the area unit to use for area calculations.
 
void setLogLevel(Qgis::ProcessingLogLevel level)
Sets the logging level for algorithms to use when pushing feedback messages to users.
 
void setMaximumThreads(int threads)
Sets the (optional) number of threads to use when running algorithms.
 
void setDistanceUnit(Qgis::DistanceUnit unit)
Sets the unit to use for distance calculations.
 
void setInvalidGeometryCheck(Qgis::InvalidGeometryCheck check)
Sets the behavior used for checking invalid geometries in input layers.
 
void setAreaUnit(Qgis::AreaUnit areaUnit)
Sets the unit to use for area calculations.
 
Qgis::DistanceUnit distanceUnit() const
Returns the distance unit to use for distance calculations.
 
Qgis::ProcessingLogLevel logLevel() const
Returns the logging level for algorithms to use when pushing feedback messages to users.
 
Qgis::InvalidGeometryCheck invalidGeometryCheck() const
Returns the behavior used for checking invalid geometries in input layers.
 
void setTemporaryFolder(const QString &folder)
Sets the (optional) temporary folder to use when running algorithms.
 
QString temporaryFolder() const
Returns the (optional) temporary folder to use when running algorithms.
 
int maximumThreads() const
Returns the (optional) number of threads to use when running algorithms.
 
Qgis::ProcessingAlgorithmFlags flags() const override
Returns the flags indicating how and when the algorithm operates and should be exposed to users.
 
Base class for providing feedback from a processing algorithm.
 
virtual void pushCommandInfo(const QString &info)
Pushes an informational message containing a command from the algorithm.
 
virtual void pushInfo(const QString &info)
Pushes a general informational message from the algorithm.
 
virtual void pushWarning(const QString &warning)
Pushes a warning informational message from the algorithm.
 
virtual void pushDebugInfo(const QString &info)
Pushes an informational message containing debugging helpers from the algorithm.
 
virtual void pushFormattedMessage(const QString &html, const QString &text)
Pushes a pre-formatted message from the algorithm.
 
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
 
virtual void pushConsoleInfo(const QString &info)
Pushes a console feedback message from the algorithm.
 
virtual void setProgressText(const QString &text)
Sets a progress report text string.
 
virtual QString helpId() const
Returns the provider help id string, used for creating QgsHelp urls for algorithms belong to this pro...
 
virtual QString warningMessage() const
Returns an optional warning message to show users when running algorithms from this provider.
 
static QVariantMap preprocessQgisProcessParameters(const QVariantMap ¶meters, bool &ok, QString &error)
Pre-processes a set of parameter values for the qgis_process command.
 
This class is a composition of two QSettings instances:
 
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
 
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
 
static QString capitalize(const QString &string, Qgis::Capitalization capitalization)
Converts a string by applying capitalization rules to the string.
 
long addTask(QgsTask *task, int priority=0)
Adds a task to the manager.
 
void taskTriggered(QgsTask *task)
Emitted when a task is triggered.
 
Abstract base class for long running background tasks.
 
static Q_INVOKABLE QString toString(Qgis::DistanceUnit unit)
Returns a translated string representing a distance unit.
 
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into allowing algorithms to be written in pure substantial changes are required in order to port existing x Processing algorithms for QGIS x The most significant changes are outlined not GeoAlgorithm For algorithms which operate on features one by consider subclassing the QgsProcessingFeatureBasedAlgorithm class This class allows much of the boilerplate code for looping over features from a vector layer to be bypassed and instead requires implementation of a processFeature method Ensure that your algorithm(or algorithm 's parent class) implements the new pure virtual createInstance(self) call
 
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.