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 = mAlgorithm->displayName();
342 setWindowTitle( title );
344 const QString algHelp = formatHelp(
algorithm );
345 if ( algHelp.isEmpty() )
346 textShortHelp->hide();
349 textShortHelp->document()->setDefaultStyleSheet( QStringLiteral(
".summary { margin-left: 10px; margin-right: 10px; }\n"
350 "h2 { color: #555555; padding-bottom: 15px; }\n"
351 "a { text - decoration: none; color: #3498db; font-weight: bold; }\n"
352 "p { color: #666666; }\n"
353 "b { color: #333333; }\n"
354 "dl dd { margin - bottom: 5px; }" ) );
355 textShortHelp->setHtml( algHelp );
356 connect( textShortHelp, &QTextBrowser::anchorClicked,
this, &QgsProcessingAlgorithmDialogBase::linkClicked );
357 textShortHelp->show();
362 mButtonBox->removeButton( mButtonBox->button( QDialogButtonBox::Help ) );
366 if ( !warning.isEmpty() )
374 return mAlgorithm.get();
377void QgsProcessingAlgorithmDialogBase::setMainWidget(
QgsPanelWidget *widget )
381 mMainWidget->deleteLater();
384 mPanelStack->setMainPanel( widget );
387 mMainWidget = widget;
396void QgsProcessingAlgorithmDialogBase::saveLogToFile(
const QString &path,
const LogFormat format )
398 QFile logFile( path );
399 if ( !logFile.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) )
403 QTextStream fout( &logFile );
407 case FormatPlainText:
408 fout << txtLog->toPlainText();
412 fout << txtLog->toHtml();
419 auto feedback = std::make_unique< QgsProcessingAlgorithmDialogFeedback >();
421 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::commandInfoPushed,
this, &QgsProcessingAlgorithmDialogBase::pushCommandInfo );
422 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::consoleInfoPushed,
this, &QgsProcessingAlgorithmDialogBase::pushConsoleInfo );
423 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::debugInfoPushed,
this, &QgsProcessingAlgorithmDialogBase::pushDebugInfo );
424 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::errorReported,
this, &QgsProcessingAlgorithmDialogBase::reportError );
425 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::warningPushed,
this, &QgsProcessingAlgorithmDialogBase::pushWarning );
426 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::infoPushed,
this, &QgsProcessingAlgorithmDialogBase::pushInfo );
427 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::formattedMessagePushed,
this, &QgsProcessingAlgorithmDialogBase::pushFormattedMessage );
428 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::progressTextChanged,
this, &QgsProcessingAlgorithmDialogBase::setProgressText );
430 return feedback.release();
433QDialogButtonBox *QgsProcessingAlgorithmDialogBase::buttonBox()
438QTabWidget *QgsProcessingAlgorithmDialogBase::tabWidget()
443void QgsProcessingAlgorithmDialogBase::showLog()
445 mTabWidget->setCurrentIndex( 1 );
448void QgsProcessingAlgorithmDialogBase::showParameters()
450 mTabWidget->setCurrentIndex( 0 );
453QPushButton *QgsProcessingAlgorithmDialogBase::runButton()
458QPushButton *QgsProcessingAlgorithmDialogBase::cancelButton()
463QPushButton *QgsProcessingAlgorithmDialogBase::changeParametersButton()
465 return mButtonChangeParameters;
468void QgsProcessingAlgorithmDialogBase::clearProgress()
470 progressBar->setMaximum( 0 );
473void QgsProcessingAlgorithmDialogBase::setExecuted(
bool executed )
475 mExecuted = executed;
478void QgsProcessingAlgorithmDialogBase::setExecutedAnyResult(
bool executedAnyResult )
480 mExecutedAnyResult = executedAnyResult;
483void QgsProcessingAlgorithmDialogBase::setResults(
const QVariantMap &results )
493void QgsProcessingAlgorithmDialogBase::openHelp()
495 QUrl algHelp = mAlgorithm->helpUrl();
496 if ( algHelp.isEmpty() && mAlgorithm->provider() )
498 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() ) ) );
501 if ( !algHelp.isEmpty() )
502 QDesktopServices::openUrl( algHelp );
505void QgsProcessingAlgorithmDialogBase::toggleCollapsed()
507 if ( mHelpCollapsed )
509 splitter->restoreState( mSplitterState );
510 mButtonCollapse->setArrowType( Qt::RightArrow );
514 mSplitterState = splitter->saveState();
515 splitter->setSizes( QList<int>() << 1 << 0 );
516 mButtonCollapse->setArrowType( Qt::LeftArrow );
518 mHelpCollapsed = !mHelpCollapsed;
521void QgsProcessingAlgorithmDialogBase::splitterChanged(
int,
int )
523 if ( splitter->sizes().at( 1 ) == 0 )
525 mHelpCollapsed =
true;
526 mButtonCollapse->setArrowType( Qt::LeftArrow );
530 mHelpCollapsed =
false;
531 mButtonCollapse->setArrowType( Qt::RightArrow );
535void QgsProcessingAlgorithmDialogBase::mTabWidget_currentChanged(
int )
537 updateRunButtonVisibility();
540void QgsProcessingAlgorithmDialogBase::linkClicked(
const QUrl &url )
542 QDesktopServices::openUrl( url.toString() );
545void QgsProcessingAlgorithmDialogBase::algExecuted(
bool successful,
const QVariantMap & )
547 mAlgorithmTask =
nullptr;
554 setWindowState( ( windowState() & ~Qt::WindowMinimized ) | Qt::WindowActive );
560 if ( isFinalized() && successful )
562 progressBar->setFormat( tr(
"Complete" ) );
566 if ( isFinalized() && !isVisible() )
573void QgsProcessingAlgorithmDialogBase::taskTriggered(
QgsTask *task )
575 if ( task == mAlgorithmTask )
579 setWindowState( ( windowState() & ~Qt::WindowMinimized ) | Qt::WindowActive );
585void QgsProcessingAlgorithmDialogBase::closeClicked()
591void QgsProcessingAlgorithmDialogBase::urlClicked(
const QUrl &url )
593 const QFileInfo file( url.toLocalFile() );
594 if ( file.exists() && !file.isDir() )
597 QDesktopServices::openUrl( url );
610void QgsProcessingAlgorithmDialogBase::reportError(
const QString &error,
bool fatalError )
612 setInfo( error,
true );
619void QgsProcessingAlgorithmDialogBase::pushWarning(
const QString &warning )
621 setInfo( warning,
false,
true,
true );
625void QgsProcessingAlgorithmDialogBase::pushInfo(
const QString &info )
631void QgsProcessingAlgorithmDialogBase::pushFormattedMessage(
const QString &html )
633 setInfo( html,
false,
false );
637void QgsProcessingAlgorithmDialogBase::pushCommandInfo(
const QString &command )
639 txtLog->append( QStringLiteral(
"<code>%1<code>" ).arg( formatStringForLog( command.toHtmlEscaped() ) ) );
640 scrollToBottomOfLog();
644void QgsProcessingAlgorithmDialogBase::pushDebugInfo(
const QString &message )
646 txtLog->append( QStringLiteral(
"<span style=\"color:#777\">%1</span>" ).arg( formatStringForLog( message.toHtmlEscaped() ) ) );
647 scrollToBottomOfLog();
651void QgsProcessingAlgorithmDialogBase::pushConsoleInfo(
const QString &info )
653 txtLog->append( QStringLiteral(
"<code style=\"color:#777\">%1</code>" ).arg( formatStringForLog( info.toHtmlEscaped() ) ) );
654 scrollToBottomOfLog();
658QDialog *QgsProcessingAlgorithmDialogBase::createProgressDialog()
660 QgsProcessingAlgorithmProgressDialog *dialog =
new QgsProcessingAlgorithmProgressDialog(
this );
661 dialog->setWindowModality( Qt::ApplicationModal );
662 dialog->setWindowTitle( windowTitle() );
663 dialog->setGeometry( geometry() );
664 connect( progressBar, &QProgressBar::valueChanged, dialog->progressBar(), &QProgressBar::setValue );
665 connect( dialog->cancelButton(), &QPushButton::clicked, buttonCancel, &QPushButton::click );
666 dialog->logTextEdit()->setHtml( txtLog->toHtml() );
667 connect( txtLog, &QTextEdit::textChanged, dialog, [
this, dialog]()
669 dialog->logTextEdit()->setHtml( txtLog->toHtml() );
670 QScrollBar *sb = dialog->logTextEdit()->verticalScrollBar();
671 sb->setValue( sb->maximum() );
676void QgsProcessingAlgorithmDialogBase::clearLog()
681void QgsProcessingAlgorithmDialogBase::saveLog()
684 const QString lastUsedDir = settings.
value( QStringLiteral(
"/Processing/lastUsedLogDirectory" ), QDir::homePath() ).toString();
687 const QString txtExt = tr(
"Text files" ) + QStringLiteral(
" (*.txt *.TXT)" );
688 const QString htmlExt = tr(
"HTML files" ) + QStringLiteral(
" (*.html *.HTML)" );
690 const QString path = QFileDialog::getSaveFileName(
this, tr(
"Save Log to File" ), lastUsedDir, txtExt +
";;" + htmlExt, &filter );
694 if ( path.isEmpty() )
699 settings.
setValue( QStringLiteral(
"/Processing/lastUsedLogDirectory" ), QFileInfo( path ).path() );
701 LogFormat format = FormatPlainText;
702 if ( filter == htmlExt )
706 saveLogToFile( path, format );
709void QgsProcessingAlgorithmDialogBase::copyLogToClipboard()
711 QMimeData *m =
new QMimeData();
712 m->setText( txtLog->toPlainText() );
713 m->setHtml( txtLog->toHtml() );
714 QClipboard *cb = QApplication::clipboard();
717 cb->setMimeData( m, QClipboard::Selection );
719 cb->setMimeData( m, QClipboard::Clipboard );
722void QgsProcessingAlgorithmDialogBase::closeEvent( QCloseEvent *e )
724 if ( !mHelpCollapsed )
727 settings.
setValue( QStringLiteral(
"/Processing/dialogBaseSplitter" ), splitter->saveState() );
730 QDialog::closeEvent( e );
732 if ( !mAlgorithmTask && isFinalized() )
741void QgsProcessingAlgorithmDialogBase::runAlgorithm()
746void QgsProcessingAlgorithmDialogBase::setPercentage(
double percent )
749 if ( progressBar->maximum() == 0 )
750 progressBar->setMaximum( 100 );
751 progressBar->setValue( percent );
755void QgsProcessingAlgorithmDialogBase::setProgressText(
const QString &text )
757 lblProgress->setText( text );
758 setInfo( text,
false );
759 scrollToBottomOfLog();
766 if ( !text.isEmpty() )
768 const QStringList paragraphs = text.split(
'\n' );
770 for (
const QString ¶graph : paragraphs )
772 help += QStringLiteral(
"<p>%1</p>" ).arg( paragraph );
784void QgsProcessingAlgorithmDialogBase::processEvents()
786 if ( mAlgorithmTask )
802 while ( ++nIters < 100 )
805 QCoreApplication::processEvents();
809void QgsProcessingAlgorithmDialogBase::scrollToBottomOfLog()
811 QScrollBar *sb = txtLog->verticalScrollBar();
812 sb->setValue( sb->maximum() );
815void QgsProcessingAlgorithmDialogBase::resetGui()
817 lblProgress->clear();
818 progressBar->setMaximum( 100 );
819 progressBar->setValue( 0 );
820 mButtonRun->setEnabled(
true );
821 mButtonChangeParameters->setEnabled(
true );
822 mButtonClose->setEnabled(
true );
825 mMainWidget->setEnabled(
true );
827 updateRunButtonVisibility();
828 resetAdditionalGui();
831void QgsProcessingAlgorithmDialogBase::updateRunButtonVisibility()
834 const bool runButtonVisible = mTabWidget->currentIndex() == 0;
835 mButtonRun->setVisible( runButtonVisible );
836 if ( runButtonVisible )
837 progressBar->resetFormat();
838 mButtonChangeParameters->setVisible( !runButtonVisible && mExecutedAnyResult && mButtonChangeParameters->isEnabled() );
841void QgsProcessingAlgorithmDialogBase::resetAdditionalGui()
846void QgsProcessingAlgorithmDialogBase::blockControlsWhileRunning()
848 mButtonRun->setEnabled(
false );
849 mButtonChangeParameters->setEnabled(
false );
852 mMainWidget->setEnabled(
false );
854 blockAdditionalControlsWhileRunning();
857void QgsProcessingAlgorithmDialogBase::blockAdditionalControlsWhileRunning()
867void QgsProcessingAlgorithmDialogBase::hideShortHelp()
869 textShortHelp->setVisible(
false );
874 mAlgorithmTask = task;
879QString QgsProcessingAlgorithmDialogBase::formatStringForLog(
const QString &
string )
882 s.replace(
'\n', QLatin1String(
"<br>" ) );
886bool QgsProcessingAlgorithmDialogBase::isFinalized()
898 if ( mOverrideDefaultContextSettings )
908void QgsProcessingAlgorithmDialogBase::setInfo(
const QString &message,
bool isError,
bool escapeHtml,
bool isWarning )
910 constexpr int MESSAGE_COUNT_LIMIT = 10000;
912 if ( mMessageLoggedCount == MESSAGE_COUNT_LIMIT )
914 ++mMessageLoggedCount;
918 if ( mMessageLoggedCount == MESSAGE_COUNT_LIMIT )
919 txtLog->append( QStringLiteral(
"<span style=\"color:red\">%1</span>" ).arg( tr(
"Message log truncated" ) ) );
920 else if ( isError || isWarning )
921 txtLog->append( QStringLiteral(
"<span style=\"color:%1\">%2</span>" ).arg( isError ? QStringLiteral(
"red" ) : QStringLiteral(
"#b85a20" ), escapeHtml ? formatStringForLog( message.toHtmlEscaped() ) : formatStringForLog( message ) ) );
922 else if ( escapeHtml )
923 txtLog->append( QStringLiteral(
"<span>%1</span" ).arg( formatStringForLog( message.toHtmlEscaped() ) ) );
925 txtLog->append( QStringLiteral(
"<span>%1</span>" ).arg( formatStringForLog( message ) ) );
926 scrollToBottomOfLog();
930void QgsProcessingAlgorithmDialogBase::reject()
932 if ( !mAlgorithmTask && isFinalized() )
934 setAttribute( Qt::WA_DeleteOnClose );
943QgsProcessingAlgorithmProgressDialog::QgsProcessingAlgorithmProgressDialog( QWidget *parent )
949QProgressBar *QgsProcessingAlgorithmProgressDialog::progressBar()
954QPushButton *QgsProcessingAlgorithmProgressDialog::cancelButton()
956 return mButtonBox->button( QDialogButtonBox::Cancel );
959QTextEdit *QgsProcessingAlgorithmProgressDialog::logTextEdit()
964void QgsProcessingAlgorithmProgressDialog::reject()
974QgsProcessingContextOptionsWidget::QgsProcessingContextOptionsWidget( QWidget *parent )
978 setPanelTitle( tr(
"Algorithm Settings" ) );
984 mTemporaryFolderWidget->setDialogTitle( tr(
"Select Temporary Directory" ) );
986 mTemporaryFolderWidget->lineEdit()->setPlaceholderText( tr(
"Default" ) );
1017 mDistanceUnitsCombo->addItem( title, QVariant::fromValue( unit ) );
1047 mAreaUnitsCombo->addItem( title, QVariant::fromValue( unit ) );
1050 mThreadsSpinBox->setRange( 1, QThread::idealThreadCount() );
1062 whileBlocking( mComboInvalidFeatureFiltering )->setCurrentIndex( mComboInvalidFeatureFiltering->findData( QVariant::fromValue( context->
invalidGeometryCheck() ) ) );
1063 whileBlocking( mDistanceUnitsCombo )->setCurrentIndex( mDistanceUnitsCombo->findData( QVariant::fromValue( context->
distanceUnit() ) ) );
1064 whileBlocking( mAreaUnitsCombo )->setCurrentIndex( mAreaUnitsCombo->findData( QVariant::fromValue( context->
areaUnit() ) ) );
1067 whileBlocking( mLogLevelComboBox )->setCurrentIndex( mLogLevelComboBox->findData(
static_cast< int >( context->
logLevel() ) ) );
1080Qgis::AreaUnit QgsProcessingContextOptionsWidget::areaUnit()
const
1085QString QgsProcessingContextOptionsWidget::temporaryFolder()
1087 return mTemporaryFolderWidget->filePath();
1090int QgsProcessingContextOptionsWidget::maximumThreads()
const
1092 return mThreadsSpinBox->value();
1097 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.