31#include <QDesktopServices>
33#include <QApplication>
38#include <nlohmann/json.hpp>
43QgsProcessingAlgorithmDialogFeedback::QgsProcessingAlgorithmDialogFeedback()
47void QgsProcessingAlgorithmDialogFeedback::setProgressText(
const QString &text )
50 emit progressTextChanged( text );
53void QgsProcessingAlgorithmDialogFeedback::reportError(
const QString &error,
bool fatalError )
56 emit errorReported( error, fatalError );
59void QgsProcessingAlgorithmDialogFeedback::pushWarning(
const QString &warning )
62 emit warningPushed( warning );
65void QgsProcessingAlgorithmDialogFeedback::pushInfo(
const QString &info )
68 emit infoPushed( info );
71void QgsProcessingAlgorithmDialogFeedback::pushCommandInfo(
const QString &info )
74 emit commandInfoPushed( info );
77void QgsProcessingAlgorithmDialogFeedback::pushDebugInfo(
const QString &info )
80 emit debugInfoPushed( info );
83void QgsProcessingAlgorithmDialogFeedback::pushConsoleInfo(
const QString &info )
86 emit consoleInfoPushed( info );
93QgsProcessingAlgorithmDialogBase::QgsProcessingAlgorithmDialogBase( QWidget *parent, Qt::WindowFlags flags, DialogMode mode )
94 : QDialog( parent, flags )
100 splitter->setCollapsible( 0,
false );
103 QSplitterHandle *splitterHandle = splitter->handle( 1 );
104 QVBoxLayout *handleLayout =
new QVBoxLayout();
105 handleLayout->setContentsMargins( 0, 0, 0, 0 );
106 mButtonCollapse =
new QToolButton( splitterHandle );
107 mButtonCollapse->setAutoRaise(
true );
108 mButtonCollapse->setFixedSize( 12, 12 );
109 mButtonCollapse->setCursor( Qt::ArrowCursor );
110 handleLayout->addWidget( mButtonCollapse );
111 handleLayout->addStretch();
112 splitterHandle->setLayout( handleLayout );
117 splitter->restoreState( settings.
value( QStringLiteral(
"/Processing/dialogBaseSplitter" ), QByteArray() ).toByteArray() );
118 mSplitterState = splitter->saveState();
119 splitterChanged( 0, 0 );
122 mButtonRun = mButtonBox->button( QDialogButtonBox::Ok );
123 mButtonRun->setText( tr(
"Run" ) );
126 mButtonChangeParameters = mButtonBox->button( QDialogButtonBox::Yes );
127 mButtonChangeParameters->setText( tr(
"Change Parameters" ) );
129 buttonCancel->setEnabled(
false );
130 mButtonClose = mButtonBox->button( QDialogButtonBox::Close );
134 case DialogMode::Single:
136 mAdvancedButton =
new QPushButton( tr(
"Advanced" ) );
137 mAdvancedMenu =
new QMenu(
this );
138 mAdvancedButton->setMenu( mAdvancedMenu );
140 mContextSettingsAction =
new QAction( tr(
"Algorithm Settings…" ), mAdvancedMenu );
142 mAdvancedMenu->addAction( mContextSettingsAction );
144 connect( mContextSettingsAction, &QAction::triggered,
this, [
this]
148 mTabWidget->setCurrentIndex( 0 );
150 if ( !mContextOptionsWidget )
152 mContextOptionsWidget =
new QgsProcessingContextOptionsWidget();
153 mContextOptionsWidget->setFromContext( processingContext() );
154 panel->openPanel( mContextOptionsWidget );
158 mOverrideDefaultContextSettings =
true;
159 mGeometryCheck = mContextOptionsWidget->invalidGeometryCheck();
160 mDistanceUnits = mContextOptionsWidget->distanceUnit();
161 mAreaUnits = mContextOptionsWidget->areaUnit();
162 mTemporaryFolderOverride = mContextOptionsWidget->temporaryFolder();
163 mMaximumThreads = mContextOptionsWidget->maximumThreads();
168 mAdvancedMenu->addSeparator();
170 QAction *copyAsPythonCommand =
new QAction( tr(
"Copy as Python Command" ), mAdvancedMenu );
173 mAdvancedMenu->addAction( copyAsPythonCommand );
174 connect( copyAsPythonCommand, &QAction::triggered,
this, [
this]
182 const QString command = alg->asPythonCommand( createProcessingParameters(), *context );
183 QMimeData *m =
new QMimeData();
184 m->setText( command );
185 QClipboard *cb = QApplication::clipboard();
188 cb->setMimeData( m, QClipboard::Selection );
190 cb->setMimeData( m, QClipboard::Clipboard );
194 mCopyAsQgisProcessCommand =
new QAction( tr(
"Copy as qgis_process Command" ), mAdvancedMenu );
196 mAdvancedMenu->addAction( mCopyAsQgisProcessCommand );
198 connect( mCopyAsQgisProcessCommand, &QAction::triggered,
this, [
this]
207 const QString command = alg->asQgisProcessCommand( createProcessingParameters(), *context, ok );
210 mMessageBar->pushMessage( tr(
"Current settings cannot be specified as arguments to qgis_process (Pipe parameters as JSON to qgis_process instead)" ), Qgis::MessageLevel::Warning );
214 QMimeData *m =
new QMimeData();
215 m->setText( command );
216 QClipboard *cb = QApplication::clipboard();
219 cb->setMimeData( m, QClipboard::Selection );
221 cb->setMimeData( m, QClipboard::Clipboard );
226 mAdvancedMenu->addSeparator();
228 QAction *copyAsJson =
new QAction( tr(
"Copy as JSON" ), mAdvancedMenu );
231 mAdvancedMenu->addAction( copyAsJson );
232 connect( copyAsJson, &QAction::triggered,
this, [
this]
240 const QVariantMap properties = alg->asMap( createProcessingParameters(), *context );
243 QMimeData *m =
new QMimeData();
245 QClipboard *cb = QApplication::clipboard();
248 cb->setMimeData( m, QClipboard::Selection );
250 cb->setMimeData( m, QClipboard::Clipboard );
254 mPasteJsonAction =
new QAction( tr(
"Paste Settings" ), mAdvancedMenu );
257 mAdvancedMenu->addAction( mPasteJsonAction );
258 connect( mPasteJsonAction, &QAction::triggered,
this, [
this]
260 const QString text = QApplication::clipboard()->text();
261 if ( text.isEmpty() )
264 const QVariantMap parameterValues =
QgsJsonUtils::parseJson( text ).toMap().value( QStringLiteral(
"inputs" ) ).toMap();
265 if ( parameterValues.isEmpty() )
272 setParameters( preparedValues );
275 mButtonBox->addButton( mAdvancedButton, QDialogButtonBox::ResetRole );
279 case DialogMode::Batch:
285 connect( mAdvancedMenu, &QMenu::aboutToShow,
this, [ = ]
287 mCopyAsQgisProcessCommand->setEnabled(
algorithm()
289 mPasteJsonAction->setEnabled( !QApplication::clipboard()->text().isEmpty() );
293 connect( mButtonRun, &QPushButton::clicked,
this, &QgsProcessingAlgorithmDialogBase::runAlgorithm );
294 connect( mButtonChangeParameters, &QPushButton::clicked,
this, &QgsProcessingAlgorithmDialogBase::showParameters );
295 connect( mButtonBox, &QDialogButtonBox::rejected,
this, &QgsProcessingAlgorithmDialogBase::closeClicked );
296 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsProcessingAlgorithmDialogBase::openHelp );
297 connect( mButtonCollapse, &QToolButton::clicked,
this, &QgsProcessingAlgorithmDialogBase::toggleCollapsed );
298 connect( splitter, &QSplitter::splitterMoved,
this, &QgsProcessingAlgorithmDialogBase::splitterChanged );
300 connect( mButtonSaveLog, &QToolButton::clicked,
this, &QgsProcessingAlgorithmDialogBase::saveLog );
301 connect( mButtonCopyLog, &QToolButton::clicked,
this, &QgsProcessingAlgorithmDialogBase::copyLogToClipboard );
302 connect( mButtonClearLog, &QToolButton::clicked,
this, &QgsProcessingAlgorithmDialogBase::clearLog );
304 connect( mTabWidget, &QTabWidget::currentChanged,
this, &QgsProcessingAlgorithmDialogBase::mTabWidget_currentChanged );
307 mMessageBar->setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Fixed );
308 verticalLayout->insertWidget( 0, mMessageBar );
313QgsProcessingAlgorithmDialogBase::~QgsProcessingAlgorithmDialogBase() =
default;
315void QgsProcessingAlgorithmDialogBase::setParameters(
const QVariantMap & )
328 title = mAlgorithm->displayName();
330 setWindowTitle( title );
332 const QString algHelp = formatHelp(
algorithm );
333 if ( algHelp.isEmpty() )
334 textShortHelp->hide();
337 textShortHelp->document()->setDefaultStyleSheet( QStringLiteral(
".summary { margin-left: 10px; margin-right: 10px; }\n"
338 "h2 { color: #555555; padding-bottom: 15px; }\n"
339 "a { text - decoration: none; color: #3498db; font-weight: bold; }\n"
340 "p { color: #666666; }\n"
341 "b { color: #333333; }\n"
342 "dl dd { margin - bottom: 5px; }" ) );
343 textShortHelp->setHtml( algHelp );
344 connect( textShortHelp, &QTextBrowser::anchorClicked,
this, &QgsProcessingAlgorithmDialogBase::linkClicked );
345 textShortHelp->show();
350 mButtonBox->removeButton( mButtonBox->button( QDialogButtonBox::Help ) );
354 if ( !warning.isEmpty() )
356 mMessageBar->pushMessage( warning, Qgis::MessageLevel::Warning );
362 return mAlgorithm.get();
365void QgsProcessingAlgorithmDialogBase::setMainWidget(
QgsPanelWidget *widget )
369 mMainWidget->deleteLater();
372 mPanelStack->setMainPanel( widget );
375 mMainWidget = widget;
384void QgsProcessingAlgorithmDialogBase::saveLogToFile(
const QString &path,
const LogFormat format )
386 QFile logFile( path );
387 if ( !logFile.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) )
391 QTextStream fout( &logFile );
395 case FormatPlainText:
396 fout << txtLog->toPlainText();
400 fout << txtLog->toHtml();
407 auto feedback = std::make_unique< QgsProcessingAlgorithmDialogFeedback >();
409 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::commandInfoPushed,
this, &QgsProcessingAlgorithmDialogBase::pushCommandInfo );
410 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::consoleInfoPushed,
this, &QgsProcessingAlgorithmDialogBase::pushConsoleInfo );
411 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::debugInfoPushed,
this, &QgsProcessingAlgorithmDialogBase::pushDebugInfo );
412 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::errorReported,
this, &QgsProcessingAlgorithmDialogBase::reportError );
413 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::warningPushed,
this, &QgsProcessingAlgorithmDialogBase::pushWarning );
414 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::infoPushed,
this, &QgsProcessingAlgorithmDialogBase::pushInfo );
415 connect( feedback.get(), &QgsProcessingAlgorithmDialogFeedback::progressTextChanged,
this, &QgsProcessingAlgorithmDialogBase::setProgressText );
417 return feedback.release();
420QDialogButtonBox *QgsProcessingAlgorithmDialogBase::buttonBox()
425QTabWidget *QgsProcessingAlgorithmDialogBase::tabWidget()
430void QgsProcessingAlgorithmDialogBase::showLog()
432 mTabWidget->setCurrentIndex( 1 );
435void QgsProcessingAlgorithmDialogBase::showParameters()
437 mTabWidget->setCurrentIndex( 0 );
440QPushButton *QgsProcessingAlgorithmDialogBase::runButton()
445QPushButton *QgsProcessingAlgorithmDialogBase::cancelButton()
450QPushButton *QgsProcessingAlgorithmDialogBase::changeParametersButton()
452 return mButtonChangeParameters;
455void QgsProcessingAlgorithmDialogBase::clearProgress()
457 progressBar->setMaximum( 0 );
460void QgsProcessingAlgorithmDialogBase::setExecuted(
bool executed )
462 mExecuted = executed;
465void QgsProcessingAlgorithmDialogBase::setExecutedAnyResult(
bool executedAnyResult )
467 mExecutedAnyResult = executedAnyResult;
470void QgsProcessingAlgorithmDialogBase::setResults(
const QVariantMap &results )
480void QgsProcessingAlgorithmDialogBase::openHelp()
482 QUrl algHelp = mAlgorithm->helpUrl();
483 if ( algHelp.isEmpty() && mAlgorithm->provider() )
485 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() ) ) );
488 if ( !algHelp.isEmpty() )
489 QDesktopServices::openUrl( algHelp );
492void QgsProcessingAlgorithmDialogBase::toggleCollapsed()
494 if ( mHelpCollapsed )
496 splitter->restoreState( mSplitterState );
497 mButtonCollapse->setArrowType( Qt::RightArrow );
501 mSplitterState = splitter->saveState();
502 splitter->setSizes( QList<int>() << 1 << 0 );
503 mButtonCollapse->setArrowType( Qt::LeftArrow );
505 mHelpCollapsed = !mHelpCollapsed;
508void QgsProcessingAlgorithmDialogBase::splitterChanged(
int,
int )
510 if ( splitter->sizes().at( 1 ) == 0 )
512 mHelpCollapsed =
true;
513 mButtonCollapse->setArrowType( Qt::LeftArrow );
517 mHelpCollapsed =
false;
518 mButtonCollapse->setArrowType( Qt::RightArrow );
522void QgsProcessingAlgorithmDialogBase::mTabWidget_currentChanged(
int )
524 updateRunButtonVisibility();
527void QgsProcessingAlgorithmDialogBase::linkClicked(
const QUrl &url )
529 QDesktopServices::openUrl( url.toString() );
532void QgsProcessingAlgorithmDialogBase::algExecuted(
bool successful,
const QVariantMap & )
534 mAlgorithmTask =
nullptr;
541 setWindowState( ( windowState() & ~Qt::WindowMinimized ) | Qt::WindowActive );
547 if ( isFinalized() && successful )
549 progressBar->setFormat( tr(
"Complete" ) );
553 if ( isFinalized() && !isVisible() )
560void QgsProcessingAlgorithmDialogBase::taskTriggered(
QgsTask *task )
562 if ( task == mAlgorithmTask )
566 setWindowState( ( windowState() & ~Qt::WindowMinimized ) | Qt::WindowActive );
572void QgsProcessingAlgorithmDialogBase::closeClicked()
588void QgsProcessingAlgorithmDialogBase::reportError(
const QString &error,
bool fatalError )
590 setInfo( error,
true );
597void QgsProcessingAlgorithmDialogBase::pushWarning(
const QString &warning )
599 setInfo( warning,
false,
true,
true );
603void QgsProcessingAlgorithmDialogBase::pushInfo(
const QString &info )
609void QgsProcessingAlgorithmDialogBase::pushCommandInfo(
const QString &command )
611 txtLog->append( QStringLiteral(
"<code>%1<code>" ).arg( formatStringForLog( command.toHtmlEscaped() ) ) );
612 scrollToBottomOfLog();
616void QgsProcessingAlgorithmDialogBase::pushDebugInfo(
const QString &message )
618 txtLog->append( QStringLiteral(
"<span style=\"color:#777\">%1</span>" ).arg( formatStringForLog( message.toHtmlEscaped() ) ) );
619 scrollToBottomOfLog();
623void QgsProcessingAlgorithmDialogBase::pushConsoleInfo(
const QString &info )
625 txtLog->append( QStringLiteral(
"<code style=\"color:#777\">%1</code>" ).arg( formatStringForLog( info.toHtmlEscaped() ) ) );
626 scrollToBottomOfLog();
630QDialog *QgsProcessingAlgorithmDialogBase::createProgressDialog()
632 QgsProcessingAlgorithmProgressDialog *dialog =
new QgsProcessingAlgorithmProgressDialog(
this );
633 dialog->setWindowModality( Qt::ApplicationModal );
634 dialog->setWindowTitle( windowTitle() );
635 dialog->setGeometry( geometry() );
636 connect( progressBar, &QProgressBar::valueChanged, dialog->progressBar(), &QProgressBar::setValue );
637 connect( dialog->cancelButton(), &QPushButton::clicked, buttonCancel, &QPushButton::click );
638 dialog->logTextEdit()->setHtml( txtLog->toHtml() );
639 connect( txtLog, &QTextEdit::textChanged, dialog, [
this, dialog]()
641 dialog->logTextEdit()->setHtml( txtLog->toHtml() );
642 QScrollBar *sb = dialog->logTextEdit()->verticalScrollBar();
643 sb->setValue( sb->maximum() );
648void QgsProcessingAlgorithmDialogBase::clearLog()
653void QgsProcessingAlgorithmDialogBase::saveLog()
656 const QString lastUsedDir = settings.
value( QStringLiteral(
"/Processing/lastUsedLogDirectory" ), QDir::homePath() ).toString();
659 const QString txtExt = tr(
"Text files" ) + QStringLiteral(
" (*.txt *.TXT)" );
660 const QString htmlExt = tr(
"HTML files" ) + QStringLiteral(
" (*.html *.HTML)" );
662 const QString path = QFileDialog::getSaveFileName(
this, tr(
"Save Log to File" ), lastUsedDir, txtExt +
";;" + htmlExt, &filter );
663 if ( path.isEmpty() )
668 settings.
setValue( QStringLiteral(
"/Processing/lastUsedLogDirectory" ), QFileInfo( path ).path() );
670 LogFormat format = FormatPlainText;
671 if ( filter == htmlExt )
675 saveLogToFile( path, format );
678void QgsProcessingAlgorithmDialogBase::copyLogToClipboard()
680 QMimeData *m =
new QMimeData();
681 m->setText( txtLog->toPlainText() );
682 m->setHtml( txtLog->toHtml() );
683 QClipboard *cb = QApplication::clipboard();
686 cb->setMimeData( m, QClipboard::Selection );
688 cb->setMimeData( m, QClipboard::Clipboard );
691void QgsProcessingAlgorithmDialogBase::closeEvent( QCloseEvent *e )
693 if ( !mHelpCollapsed )
696 settings.
setValue( QStringLiteral(
"/Processing/dialogBaseSplitter" ), splitter->saveState() );
699 QDialog::closeEvent( e );
701 if ( !mAlgorithmTask && isFinalized() )
710void QgsProcessingAlgorithmDialogBase::runAlgorithm()
715void QgsProcessingAlgorithmDialogBase::setPercentage(
double percent )
718 if ( progressBar->maximum() == 0 )
719 progressBar->setMaximum( 100 );
720 progressBar->setValue( percent );
724void QgsProcessingAlgorithmDialogBase::setProgressText(
const QString &text )
726 lblProgress->setText( text );
727 setInfo( text,
false );
728 scrollToBottomOfLog();
735 if ( !text.isEmpty() )
737 const QStringList paragraphs = text.split(
'\n' );
739 for (
const QString ¶graph : paragraphs )
741 help += QStringLiteral(
"<p>%1</p>" ).arg( paragraph );
753void QgsProcessingAlgorithmDialogBase::processEvents()
755 if ( mAlgorithmTask )
771 while ( ++nIters < 100 )
774 QCoreApplication::processEvents();
778void QgsProcessingAlgorithmDialogBase::scrollToBottomOfLog()
780 QScrollBar *sb = txtLog->verticalScrollBar();
781 sb->setValue( sb->maximum() );
784void QgsProcessingAlgorithmDialogBase::resetGui()
786 lblProgress->clear();
787 progressBar->setMaximum( 100 );
788 progressBar->setValue( 0 );
789 mButtonRun->setEnabled(
true );
790 mButtonChangeParameters->setEnabled(
true );
791 mButtonClose->setEnabled(
true );
794 mMainWidget->setEnabled(
true );
796 updateRunButtonVisibility();
797 resetAdditionalGui();
800void QgsProcessingAlgorithmDialogBase::updateRunButtonVisibility()
803 const bool runButtonVisible = mTabWidget->currentIndex() == 0;
804 mButtonRun->setVisible( runButtonVisible );
805 if ( runButtonVisible )
806 progressBar->resetFormat();
807 mButtonChangeParameters->setVisible( !runButtonVisible && mExecutedAnyResult && mButtonChangeParameters->isEnabled() );
810void QgsProcessingAlgorithmDialogBase::resetAdditionalGui()
815void QgsProcessingAlgorithmDialogBase::blockControlsWhileRunning()
817 mButtonRun->setEnabled(
false );
818 mButtonChangeParameters->setEnabled(
false );
821 mMainWidget->setEnabled(
false );
823 blockAdditionalControlsWhileRunning();
826void QgsProcessingAlgorithmDialogBase::blockAdditionalControlsWhileRunning()
836void QgsProcessingAlgorithmDialogBase::hideShortHelp()
838 textShortHelp->setVisible(
false );
843 mAlgorithmTask = task;
848QString QgsProcessingAlgorithmDialogBase::formatStringForLog(
const QString &
string )
851 s.replace(
'\n', QLatin1String(
"<br>" ) );
855bool QgsProcessingAlgorithmDialogBase::isFinalized()
867 if ( mOverrideDefaultContextSettings )
877void QgsProcessingAlgorithmDialogBase::setInfo(
const QString &message,
bool isError,
bool escapeHtml,
bool isWarning )
879 constexpr int MESSAGE_COUNT_LIMIT = 10000;
881 if ( mMessageLoggedCount == MESSAGE_COUNT_LIMIT )
883 ++mMessageLoggedCount;
887 if ( mMessageLoggedCount == MESSAGE_COUNT_LIMIT )
888 txtLog->append( QStringLiteral(
"<span style=\"color:red\">%1</span>" ).arg( tr(
"Message log truncated" ) ) );
889 else if ( isError || isWarning )
890 txtLog->append( QStringLiteral(
"<span style=\"color:%1\">%2</span>" ).arg( isError ? QStringLiteral(
"red" ) : QStringLiteral(
"#b85a20" ), escapeHtml ? formatStringForLog( message.toHtmlEscaped() ) : formatStringForLog( message ) ) );
891 else if ( escapeHtml )
892 txtLog->append( QStringLiteral(
"<span>%1</span" ).arg( formatStringForLog( message.toHtmlEscaped() ) ) );
894 txtLog->append( QStringLiteral(
"<span>%1</span>" ).arg( formatStringForLog( message ) ) );
895 scrollToBottomOfLog();
899void QgsProcessingAlgorithmDialogBase::reject()
901 if ( !mAlgorithmTask && isFinalized() )
903 setAttribute( Qt::WA_DeleteOnClose );
912QgsProcessingAlgorithmProgressDialog::QgsProcessingAlgorithmProgressDialog( QWidget *parent )
918QProgressBar *QgsProcessingAlgorithmProgressDialog::progressBar()
923QPushButton *QgsProcessingAlgorithmProgressDialog::cancelButton()
925 return mButtonBox->button( QDialogButtonBox::Cancel );
928QTextEdit *QgsProcessingAlgorithmProgressDialog::logTextEdit()
933void QgsProcessingAlgorithmProgressDialog::reject()
943QgsProcessingContextOptionsWidget::QgsProcessingContextOptionsWidget( QWidget *parent )
947 setPanelTitle( tr(
"Algorithm Settings" ) );
953 mTemporaryFolderWidget->setDialogTitle( tr(
"Select Temporary Directory" ) );
955 mTemporaryFolderWidget->lineEdit()->setPlaceholderText( tr(
"Default" ) );
957 mDistanceUnitsCombo->addItem( tr(
"Default" ), QVariant::fromValue( Qgis::DistanceUnit::Unknown ) );
960 Qgis::DistanceUnit::Meters,
961 Qgis::DistanceUnit::Kilometers,
962 Qgis::DistanceUnit::Centimeters,
963 Qgis::DistanceUnit::Millimeters,
964 Qgis::DistanceUnit::Feet,
965 Qgis::DistanceUnit::Miles,
966 Qgis::DistanceUnit::NauticalMiles,
967 Qgis::DistanceUnit::Yards,
969 Qgis::DistanceUnit::Degrees,
982 mDistanceUnitsCombo->addItem( title, QVariant::fromValue( unit ) );
985 mAreaUnitsCombo->addItem( tr(
"Default" ), QVariant::fromValue( Qgis::AreaUnit::Unknown ) );
988 Qgis::AreaUnit::SquareMeters,
989 Qgis::AreaUnit::Hectares,
990 Qgis::AreaUnit::SquareKilometers,
991 Qgis::AreaUnit::SquareCentimeters,
992 Qgis::AreaUnit::SquareMillimeters,
993 Qgis::AreaUnit::SquareFeet,
994 Qgis::AreaUnit::SquareMiles,
995 Qgis::AreaUnit::SquareNauticalMiles,
996 Qgis::AreaUnit::SquareYards,
998 Qgis::AreaUnit::Acres,
999 Qgis::AreaUnit::SquareDegrees,
1012 mAreaUnitsCombo->addItem( title, QVariant::fromValue( unit ) );
1015 mThreadsSpinBox->setRange( 1, QThread::idealThreadCount() );
1026 whileBlocking( mComboInvalidFeatureFiltering )->setCurrentIndex( mComboInvalidFeatureFiltering->findData(
static_cast< int >( context->
invalidGeometryCheck() ) ) );
1027 whileBlocking( mDistanceUnitsCombo )->setCurrentIndex( mDistanceUnitsCombo->findData( QVariant::fromValue( context->
distanceUnit() ) ) );
1028 whileBlocking( mAreaUnitsCombo )->setCurrentIndex( mAreaUnitsCombo->findData( QVariant::fromValue( context->
areaUnit() ) ) );
1043Qgis::AreaUnit QgsProcessingContextOptionsWidget::areaUnit()
const
1048QString QgsProcessingContextOptionsWidget::temporaryFolder()
1050 return mTemporaryFolderWidget->filePath();
1053int QgsProcessingContextOptionsWidget::maximumThreads()
const
1055 return mThreadsSpinBox->value();
DistanceUnit
Units of distance.
@ Inches
Inches (since QGIS 3.32)
@ SquareInches
Square inches (since QGIS 3.32)
@ TitleCase
Simple title case conversion - does not fully grammatically parse the text and uses simple rules only...
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.
InvalidGeometryCheck
Handling of features with invalid geometries.
@ GeometryNoCheck
No invalid geometry checking.
@ GeometryAbortOnInvalid
Close iterator on encountering any features with invalid geometry. This requires a slow geometry vali...
@ GeometrySkipInvalid
Skip any features with invalid geometry. This requires a slow geometry validity check for every featu...
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 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.
@ FlagNotAvailableInStandaloneTool
Algorithm should not be available from the standalone "qgis_process" tool. Used to flag algorithms wh...
@ FlagDisplayNameIsLiteral
Algorithm's display name is a static literal string, and should not be translated or automatically fo...
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.
LogLevel
Logging level for algorithms to use when pushing feedback messages.
Qgis::AreaUnit areaUnit() const
Returns the area unit to use for area calculations.
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 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.
void setLogLevel(LogLevel level)
Sets the logging level for algorithms to use when pushing feedback messages to users.
void setInvalidGeometryCheck(QgsFeatureRequest::InvalidGeometryCheck check)
Sets the behavior used for checking invalid geometries in input layers.
QgsFeatureRequest::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.
QgsProcessingAlgorithm::Flags 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 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.