20#include "qgsattributetypedialog.h"
41#include <QPlainTextEdit>
48#include "moc_qgsattributesformview.cpp"
50using namespace Qt::StringLiterals;
59 if ( selectionModel()->selectedRows( 0 ).count() == 0 )
62 return mModel->mapToSource( selectionModel()->selectedRows( 0 ).at( 0 ) );
81 QModelIndex index =
mModel->mapFromSource( model->firstRecursiveMatchingModelIndex( itemType, itemId ) );
83 if ( index.isValid() )
87 const QModelIndexList selectedIndexes = selectionModel()->selectedRows( 0 );
88 if ( !( selectedIndexes.count() == 1 && selectedIndexes.at( 0 ) == index ) )
90 selectionModel()->setCurrentIndex( index, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows );
95 selectionModel()->clearSelection();
101 mModel->setFilterText( text );
122 viewport()->repaint();
125 viewport()->repaint();
137 const QList<QgsAttributesFormItem *> keys =
mIndicators.keys();
149 return mModel->sourceAttributesFormModel();
159 mModel = qobject_cast<QgsAttributesFormProxyModel *>( model );
163 QTreeView::setModel(
mModel );
175 connect(
this, &QTreeView::doubleClicked,
this, &QgsAttributesFormLayoutView::onItemDoubleClicked );
180 mModel = qobject_cast<QgsAttributesFormProxyModel *>( model );
184 QTreeView::setModel(
mModel );
192void QgsAttributesFormLayoutView::selectDroppedItems(
const QModelIndexList &indexes )
194 if ( indexes.isEmpty() )
197 QItemSelection selection;
198 for (
const QModelIndex &index : indexes )
200 const QModelIndex proxyIndex =
mModel->mapFromSource( index );
201 selection.select( proxyIndex, proxyIndex );
206 selectionModel()->setCurrentIndex(
mModel->mapFromSource( indexes.constLast() ), QItemSelectionModel::NoUpdate );
207 selectionModel()->select( selection, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows );
210void QgsAttributesFormLayoutView::handleExternalDroppedItems(
const QModelIndexList &indexes )
212 selectDroppedItems( indexes );
214 for (
const QModelIndex &index : indexes )
225 onItemDoubleClicked(
mModel->mapFromSource( index ) );
238void QgsAttributesFormLayoutView::handleInternalDroppedItems(
const QModelIndexList &indexes )
240 selectDroppedItems( indexes );
244 const int topLevelRows =
mModel->sourceModel()->rowCount( QModelIndex() );
245 for (
int row = 0; row < topLevelRows; ++row )
247 restoreExpandedState(
mModel->sourceModel()->index( row, 0, QModelIndex() ) );
249 mDraggedExpandedState.clear();
252void QgsAttributesFormLayoutView::storeExpandedState(
const QModelIndex &sourceIndex )
254 if ( !sourceIndex.isValid() )
257 if (
auto *item =
static_cast< QgsAttributesFormItem *
>( sourceIndex.internalPointer() ) )
258 mDraggedExpandedState.insert( item, isExpanded(
mModel->mapFromSource( sourceIndex ) ) );
260 const int rows =
mModel->sourceModel()->rowCount( sourceIndex );
261 for (
int row = 0; row < rows; ++row )
263 storeExpandedState(
mModel->sourceModel()->index( row, 0, sourceIndex ) );
267void QgsAttributesFormLayoutView::restoreExpandedState(
const QModelIndex &sourceIndex )
269 if ( !sourceIndex.isValid() )
273 if (
auto *item =
static_cast< QgsAttributesFormItem *
>( sourceIndex.internalPointer() ) )
274 setExpanded(
mModel->mapFromSource( sourceIndex ), mDraggedExpandedState.value( item,
true ) );
276 const int rows =
mModel->sourceModel()->rowCount( sourceIndex );
277 for (
int row = 0; row < rows; ++row )
279 restoreExpandedState(
mModel->sourceModel()->index( row, 0, sourceIndex ) );
285 const QMimeData *data =
event->mimeData();
287 if ( data->hasFormat( u
"application/x-qgsattributesformavailablewidgetsrelement"_s ) || data->hasFormat( u
"application/x-qgsattributesformlayoutelement"_s ) )
290 if ( event->source() ==
this )
292 event->setDropAction( Qt::MoveAction );
300 QTreeView::dragEnterEvent( event );
309 const QMimeData *data =
event->mimeData();
311 if ( data->hasFormat( u
"application/x-qgsattributesformavailablewidgetsrelement"_s ) || data->hasFormat( u
"application/x-qgsattributesformlayoutelement"_s ) )
314 if ( event->source() ==
this )
316 event->setDropAction( Qt::MoveAction );
324 QTreeView::dragMoveEvent( event );
329 if ( !( event->mimeData()->hasFormat( u
"application/x-qgsattributesformavailablewidgetsrelement"_s ) || event->mimeData()->hasFormat( u
"application/x-qgsattributesformlayoutelement"_s ) ) )
332 const bool internalMove =
event->source() ==
this &&
event->mimeData()->hasFormat( u
"application/x-qgsattributesformlayoutelement"_s );
339 mDraggedExpandedState.clear();
340 const int topLevelRows =
mModel->sourceModel()->rowCount( QModelIndex() );
341 for (
int row = 0; row < topLevelRows; ++row )
343 storeExpandedState(
mModel->sourceModel()->index( row, 0, QModelIndex() ) );
347 if ( event->source() ==
this )
349 event->setDropAction( Qt::MoveAction );
352 QTreeView::dropEvent( event );
354 if ( internalMove && event->isAccepted() )
357 event->setDropAction( Qt::CopyAction );
362void QgsAttributesFormLayoutView::onItemDoubleClicked(
const QModelIndex &index )
364 QModelIndex sourceIndex =
mModel->mapToSource( index );
369 QGroupBox *baseData =
new QGroupBox( tr(
"Base configuration" ) );
371 QFormLayout *baseLayout =
new QFormLayout();
372 baseData->setLayout( baseLayout );
373 QCheckBox *showLabelCheckbox =
new QCheckBox( u
"Show label"_s );
374 showLabelCheckbox->setChecked( itemData.
showLabel() );
375 baseLayout->addRow( showLabelCheckbox );
376 QWidget *baseWidget =
new QWidget();
377 baseWidget->setLayout( baseLayout );
391 dlg.setObjectName(
"QML Form Configuration Widget" );
393 dlg.setWindowTitle( tr(
"Configure QML Widget" ) );
395 QVBoxLayout *mainLayout =
new QVBoxLayout( &dlg );
396 QSplitter *qmlSplitter =
new QSplitter();
397 QWidget *qmlConfigWiget =
new QWidget();
398 QVBoxLayout *layout =
new QVBoxLayout( qmlConfigWiget );
399 layout->setContentsMargins( 0, 0, 0, 0 );
400 mainLayout->addWidget( qmlSplitter );
401 qmlSplitter->addWidget( qmlConfigWiget );
402 layout->addWidget( baseWidget );
404 QLineEdit *title =
new QLineEdit( itemName );
417 QComboBox *qmlObjectTemplate =
new QComboBox();
418 qmlObjectTemplate->addItem( tr(
"Free Text…" ) );
419 qmlObjectTemplate->addItem( tr(
"Rectangle" ) );
420 qmlObjectTemplate->addItem( tr(
"Pie Chart" ) );
421 qmlObjectTemplate->addItem( tr(
"Bar Chart" ) );
422 connect( qmlObjectTemplate, qOverload<int>( &QComboBox::currentIndexChanged ), qmlCode, [qmlCode](
int index ) {
433 qmlCode->
setText( QStringLiteral(
434 "import QtQuick 2.0\n"
439 " color: \"steelblue\"\n"
440 " Text{ text: \"A rectangle\" }\n"
447 qmlCode->
setText( QStringLiteral(
448 "import QtQuick 2.0\n"
449 "import QtCharts 2.0\n"
457 " PieSlice { label: \"First slice\"; value: 25 }\n"
458 " PieSlice { label: \"Second slice\"; value: 45 }\n"
459 " PieSlice { label: \"Third slice\"; value: 30 }\n"
467 qmlCode->
setText( QStringLiteral(
468 "import QtQuick 2.0\n"
469 "import QtCharts 2.0\n"
472 " title: \"Bar series\"\n"
475 " legend.alignment: Qt.AlignBottom\n"
476 " antialiasing: true\n"
485 " axisY: valueAxisY\n"
486 " axisX: BarCategoryAxis { categories: [\"2007\", \"2008\", \"2009\", \"2010\", \"2011\", \"2012\" ] }\n"
487 " BarSet { label: \"Bob\"; values: [2, 2, 3, 4, 5, 6] }\n"
488 " BarSet { label: \"Susan\"; values: [5, 1, 2, 4, 1, 7] }\n"
489 " BarSet { label: \"James\"; values: [3, 5, 8, 13, 5, 8] }\n"
500 QgsFieldExpressionWidget *expressionWidget =
new QgsFieldExpressionWidget;
501 expressionWidget->setButtonVisible(
false );
502 expressionWidget->registerExpressionContextGenerator(
this );
503 expressionWidget->setLayer(
mLayer );
504 QToolButton *addFieldButton =
new QToolButton();
507 QToolButton *editExpressionButton =
new QToolButton();
509 editExpressionButton->setToolTip( tr(
"Insert/Edit Expression" ) );
511 connect( addFieldButton, &QAbstractButton::clicked,
this, [expressionWidget, qmlCode] {
512 QString expression = expressionWidget->expression().trimmed().replace(
'"',
"\\\""_L1 );
513 if ( !expression.isEmpty() )
514 qmlCode->
insertText( u
"expression.evaluate(\"%1\")"_s.arg( expression ) );
517 connect( editExpressionButton, &QAbstractButton::clicked,
this, [
this, qmlCode] {
519 expression.replace(
"\\\""_L1,
"\""_L1 );
521 QgsExpressionBuilderDialog exprDlg(
mLayer, expression,
this, u
"generic"_s, context );
523 exprDlg.setWindowTitle( tr(
"Insert Expression" ) );
524 if ( exprDlg.exec() == QDialog::Accepted && !exprDlg.expressionText().trimmed().isEmpty() )
526 QString expression = exprDlg.expressionText().trimmed().replace(
'"',
"\\\""_L1 );
527 if ( !expression.isEmpty() )
528 qmlCode->
insertText( u
"expression.evaluate(\"%1\")"_s.arg( expression ) );
532 layout->addWidget(
new QLabel( tr(
"Title" ) ) );
533 layout->addWidget( title );
534 QGroupBox *qmlCodeBox =
new QGroupBox( tr(
"QML Code" ) );
535 qmlCodeBox->setLayout(
new QVBoxLayout );
536 qmlCodeBox->layout()->addWidget( qmlObjectTemplate );
537 QWidget *expressionWidgetBox =
new QWidget();
538 qmlCodeBox->layout()->addWidget( expressionWidgetBox );
539 expressionWidgetBox->setLayout(
new QHBoxLayout );
540 expressionWidgetBox->layout()->setContentsMargins( 0, 0, 0, 0 );
541 expressionWidgetBox->layout()->addWidget( expressionWidget );
542 expressionWidgetBox->layout()->addWidget( addFieldButton );
543 expressionWidgetBox->layout()->addWidget( editExpressionButton );
544 layout->addWidget( qmlCodeBox );
545 layout->addWidget( qmlCode );
547 QTextEdit *errorFeedbackWidget =
new QTextEdit();
548 errorFeedbackWidget->setMaximumHeight( 90 );
549 layout->addWidget( errorFeedbackWidget );
553 QQuickWidget *qmlWidget =
dynamic_cast<QQuickWidget *
>( qmlWrapper->
widget() );
554 if ( qmlCode->text().trimmed().isEmpty() )
556 errorFeedbackWidget->setText( QObject::tr(
"No QML code" ) );
559 qmlWidget->setSource( QUrl() );
568 const QList<QQmlError> errors = qmlWidget->errors();
569 if ( !errors.isEmpty() )
571 QStringList errorStrings;
572 for (
const QQmlError &error : errors )
574 errorStrings << u
"%1:%2: %3"_s.arg( QString::number( error.line() ), QString::number( error.column() ), error.description() );
576 errorFeedbackWidget->setText( errorStrings.join(
"\n" ) );
580 errorFeedbackWidget->setText( QObject::tr(
"Valid code" ) );
585 QScrollArea *qmlPreviewBox =
new QgsScrollArea();
586 qmlPreviewBox->setMinimumWidth( 200 );
587 qmlPreviewBox->setWidget( qmlWrapper->
widget() );
590 qmlSplitter->addWidget( qmlPreviewBox );
591 qmlSplitter->setChildrenCollapsible(
false );
592 qmlSplitter->setHandleWidth( 6 );
593 qmlSplitter->setSizes( QList<int>() << 1 << 1 );
595 QDialogButtonBox *buttonBox =
new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help );
597 connect( buttonBox, &QDialogButtonBox::accepted, &dlg, &QDialog::accept );
598 connect( buttonBox, &QDialogButtonBox::rejected, &dlg, &QDialog::reject );
599 connect( buttonBox, &QDialogButtonBox::helpRequested, &dlg, [] {
QgsHelp::openHelp( u
"working_with_vector/vector_properties.html#other-widgets"_s ); } );
601 mainLayout->addWidget( buttonBox );
605 QgsAttributesFormData::QmlElementEditorConfiguration qmlEdCfg;
606 qmlEdCfg.
qmlCode = qmlCode->text();
608 itemData.
setShowLabel( showLabelCheckbox->isChecked() );
619 dlg.setObjectName(
"HTML Form Configuration Widget" );
621 dlg.setWindowTitle( tr(
"Configure HTML Widget" ) );
623 QVBoxLayout *mainLayout =
new QVBoxLayout( &dlg );
624 QSplitter *htmlSplitter =
new QSplitter();
625 QWidget *htmlConfigWiget =
new QWidget();
626 QVBoxLayout *layout =
new QVBoxLayout( htmlConfigWiget );
627 layout->setContentsMargins( 0, 0, 0, 0 );
628 mainLayout->addWidget( htmlSplitter );
629 htmlSplitter->addWidget( htmlConfigWiget );
630 htmlSplitter->setChildrenCollapsible(
false );
631 htmlSplitter->setHandleWidth( 6 );
632 htmlSplitter->setSizes( QList<int>() << 1 << 1 );
633 layout->addWidget( baseWidget );
635 QLineEdit *title =
new QLineEdit( itemName );
638 QgsCodeEditorHTML *htmlCode =
new QgsCodeEditorHTML();
639 htmlCode->setSizePolicy( QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding );
642 QgsHtmlWidgetWrapper *htmlWrapper =
new QgsHtmlWidgetWrapper(
mLayer,
nullptr,
this );
643 QgsFeature previewFeature;
644 mLayer->getFeatures().nextFeature( previewFeature );
647 connect( htmlCode, &QgsCodeEditorHTML::textChanged,
this, [htmlWrapper, htmlCode, previewFeature] {
653 QgsFieldExpressionWidget *expressionWidget =
new QgsFieldExpressionWidget;
654 expressionWidget->setButtonVisible(
false );
655 expressionWidget->registerExpressionContextGenerator(
this );
656 expressionWidget->setLayer(
mLayer );
657 QToolButton *addFieldButton =
new QToolButton();
660 QToolButton *editExpressionButton =
new QToolButton();
662 editExpressionButton->setToolTip( tr(
"Insert/Edit Expression" ) );
664 connect( addFieldButton, &QAbstractButton::clicked,
this, [expressionWidget, htmlCode] {
665 QString expression = expressionWidget->expression().trimmed().replace(
'"',
"\\\""_L1 );
666 if ( !expression.isEmpty() )
667 htmlCode->
insertText( u
"<script>document.write(expression.evaluate(\"%1\"));</script>"_s.arg( expression ) );
670 connect( editExpressionButton, &QAbstractButton::clicked,
this, [
this, htmlCode] {
673 expression.replace(
"\\\""_L1,
"\""_L1 );
675 QgsExpressionBuilderDialog exprDlg(
mLayer, expression,
this, u
"generic"_s, context );
677 exprDlg.setWindowTitle( tr(
"Insert Expression" ) );
678 if ( exprDlg.exec() == QDialog::Accepted && !exprDlg.expressionText().trimmed().isEmpty() )
680 QString expression = exprDlg.expressionText().trimmed().replace(
'"',
"\\\""_L1 );
681 if ( !expression.isEmpty() )
682 htmlCode->
insertText( u
"<script>document.write(expression.evaluate(\"%1\"));</script>"_s.arg( expression ) );
686 layout->addWidget(
new QLabel( tr(
"Title" ) ) );
687 layout->addWidget( title );
688 QGroupBox *expressionWidgetBox =
new QGroupBox( tr(
"HTML Code" ) );
689 layout->addWidget( expressionWidgetBox );
690 expressionWidgetBox->setLayout(
new QHBoxLayout );
691 expressionWidgetBox->layout()->addWidget( expressionWidget );
692 expressionWidgetBox->layout()->addWidget( addFieldButton );
693 expressionWidgetBox->layout()->addWidget( editExpressionButton );
694 layout->addWidget( htmlCode );
695 QScrollArea *htmlPreviewBox =
new QgsScrollArea();
696 htmlPreviewBox->setLayout(
new QGridLayout );
697 htmlPreviewBox->setMinimumWidth( 200 );
698 htmlPreviewBox->layout()->addWidget( htmlWrapper->
widget() );
700 emit htmlCode->textChanged();
701 htmlSplitter->addWidget( htmlPreviewBox );
702 htmlSplitter->setChildrenCollapsible(
false );
703 htmlSplitter->setHandleWidth( 6 );
704 htmlSplitter->setSizes( QList<int>() << 1 << 1 );
706 QDialogButtonBox *buttonBox =
new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help );
708 connect( buttonBox, &QDialogButtonBox::accepted, &dlg, &QDialog::accept );
709 connect( buttonBox, &QDialogButtonBox::rejected, &dlg, &QDialog::reject );
710 connect( buttonBox, &QDialogButtonBox::helpRequested, &dlg, [] {
QgsHelp::openHelp( u
"working_with_vector/vector_properties.html#other-widgets"_s ); } );
712 mainLayout->addWidget( buttonBox );
716 QgsAttributesFormData::HtmlElementEditorConfiguration htmlEdCfg;
717 htmlEdCfg.
htmlCode = htmlCode->text();
719 itemData.
setShowLabel( showLabelCheckbox->isChecked() );
730 dlg.setObjectName(
"Text Form Configuration Widget" );
732 dlg.setWindowTitle( tr(
"Configure Text Widget" ) );
734 QVBoxLayout *mainLayout =
new QVBoxLayout( &dlg );
735 QSplitter *textSplitter =
new QSplitter();
736 QWidget *textConfigWiget =
new QWidget();
737 QVBoxLayout *layout =
new QVBoxLayout( textConfigWiget );
738 layout->setContentsMargins( 0, 0, 0, 0 );
739 mainLayout->addWidget( textSplitter );
740 textSplitter->addWidget( textConfigWiget );
741 layout->addWidget( baseWidget );
743 QLineEdit *title =
new QLineEdit( itemName );
745 QgsCodeEditorHTML *text =
new QgsCodeEditorHTML();
746 text->setSizePolicy( QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding );
749 QgsTextWidgetWrapper *textWrapper =
new QgsTextWidgetWrapper(
mLayer,
nullptr,
this );
750 QgsFeature previewFeature;
751 ( void )
mLayer->getFeatures( QgsFeatureRequest().setLimit( 1 ) ).nextFeature( previewFeature );
754 connect( text, &QgsCodeEditorExpression::textChanged,
this, [textWrapper, previewFeature, text] {
755 textWrapper->
setText( text->text() );
760 QgsFieldExpressionWidget *expressionWidget =
new QgsFieldExpressionWidget;
761 expressionWidget->setButtonVisible(
false );
762 expressionWidget->registerExpressionContextGenerator(
this );
763 expressionWidget->setLayer(
mLayer );
764 QToolButton *addFieldButton =
new QToolButton();
767 QToolButton *editExpressionButton =
new QToolButton();
769 editExpressionButton->setToolTip( tr(
"Insert/Edit Expression" ) );
771 connect( addFieldButton, &QAbstractButton::clicked,
this, [expressionWidget, text] {
772 QString expression = expressionWidget->expression().trimmed();
773 if ( !expression.isEmpty() )
774 text->
insertText( u
"[%%1%]"_s.arg( expression ) );
776 connect( editExpressionButton, &QAbstractButton::clicked,
this, [
this, text] {
780 QgsExpressionBuilderDialog exprDlg(
mLayer, expression,
this, u
"generic"_s, context );
782 exprDlg.setWindowTitle( tr(
"Insert Expression" ) );
783 if ( exprDlg.exec() == QDialog::Accepted && !exprDlg.expressionText().trimmed().isEmpty() )
785 QString expression = exprDlg.expressionText().trimmed();
786 if ( !expression.isEmpty() )
787 text->
insertText( u
"[%%1%]"_s.arg( expression ) );
791 layout->addWidget(
new QLabel( tr(
"Title" ) ) );
792 layout->addWidget( title );
793 QGroupBox *expressionWidgetBox =
new QGroupBox( tr(
"Text" ) );
794 layout->addWidget( expressionWidgetBox );
795 expressionWidgetBox->setLayout(
new QHBoxLayout );
796 expressionWidgetBox->layout()->addWidget( expressionWidget );
797 expressionWidgetBox->layout()->addWidget( addFieldButton );
798 expressionWidgetBox->layout()->addWidget( editExpressionButton );
799 layout->addWidget( text );
800 QScrollArea *textPreviewBox =
new QgsScrollArea();
801 textPreviewBox->setWidgetResizable(
true );
802 textPreviewBox->setMinimumWidth( 200 );
803 textPreviewBox->setWidget( textWrapper->
widget() );
805 emit text->textChanged();
806 textSplitter->addWidget( textPreviewBox );
807 textSplitter->setChildrenCollapsible(
false );
808 textSplitter->setHandleWidth( 6 );
809 textSplitter->setSizes( QList<int>() << 1 << 1 );
811 QDialogButtonBox *buttonBox =
new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help );
813 connect( buttonBox, &QDialogButtonBox::accepted, &dlg, &QDialog::accept );
814 connect( buttonBox, &QDialogButtonBox::rejected, &dlg, &QDialog::reject );
815 connect( buttonBox, &QDialogButtonBox::helpRequested, &dlg, [] {
QgsHelp::openHelp( u
"working_with_vector/vector_properties.html#other-widgets"_s ); } );
817 mainLayout->addWidget( buttonBox );
821 QgsAttributesFormData::TextElementEditorConfiguration textEdCfg;
822 textEdCfg.
text = text->text();
824 itemData.
setShowLabel( showLabelCheckbox->isChecked() );
835 dlg.setObjectName(
"Spacer Form Configuration Widget" );
837 dlg.setWindowTitle( tr(
"Configure Spacer Widget" ) );
839 QVBoxLayout *mainLayout =
new QVBoxLayout();
840 mainLayout->addWidget(
new QLabel( tr(
"Title" ) ) );
841 QLineEdit *title =
new QLineEdit( itemName );
842 mainLayout->addWidget( title );
844 QHBoxLayout *cbLayout =
new QHBoxLayout();
845 mainLayout->addLayout( cbLayout );
846 dlg.setLayout( mainLayout );
847 QCheckBox *cb =
new QCheckBox { &dlg };
849 cbLayout->addWidget(
new QLabel( tr(
"Draw horizontal line" ), &dlg ) );
850 cbLayout->addWidget( cb );
852 QDialogButtonBox *buttonBox =
new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help );
854 connect( buttonBox, &QDialogButtonBox::accepted, &dlg, &QDialog::accept );
855 connect( buttonBox, &QDialogButtonBox::rejected, &dlg, &QDialog::reject );
856 connect( buttonBox, &QDialogButtonBox::helpRequested, &dlg, [] {
QgsHelp::openHelp( u
"working_with_vector/vector_properties.html#other-widgets"_s ); } );
858 mainLayout->addWidget( buttonBox );
862 QgsAttributesFormData::SpacerElementEditorConfiguration spacerEdCfg;
863 spacerEdCfg.
drawLine = cb->isChecked();
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
A text editor based on QScintilla2.
@ ScriptEditor
Standard mode, allows for display and edit of entire scripts.
void setText(const QString &text) override
void setEditingTimeoutInterval(int timeout)
Sets the timeout (in milliseconds) threshold for the editingTimeout() signal to be emitted after an e...
@ CodeFolding
Indicates that code folding should be enabled for the editor.
void insertText(const QString &text)
Insert text at cursor position, or replace any selected text if user has made a selection.
void setLineNumbersVisible(bool visible)
Sets whether line numbers should be visible in the editor.
void editingTimeout()
Emitted when either:
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
static QgsExpressionContextScope * formScope(const QgsFeature &formFeature=QgsFeature(), const QString &formMode=QString())
Creates a new scope which contains functions and variables from the current attribute form/table form...
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
static QString findAndSelectActiveExpression(QgsCodeEditor *editor, const QString &pattern=QString())
Find the expression under the cursor in the given editor and select it.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
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...
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
static QgsProject * instance()
Returns the QgsProject singleton instance.
void setText(const QString &text)
Sets the text code to htmlCode.
void reinitWidget()
Clears the content and makes new initialization.
void setFeature(const QgsFeature &feature) override
Represents a vector layer which manages a vector based dataset.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const final
Queries the layer for features specified in request.