41#include "moc_qgsrelationeditorwidget.cpp"
53 if ( mRequest.acceptFeature( layer->
getFeature( fid ) ) )
54 mSelectedFeatureIds << fid;
59const QgsFeatureIds &QgsFilteredSelectionManager::selectedFeatureIds()
const
63 return mSelectedFeatureIds;
66int QgsFilteredSelectionManager::selectedFeatureCount()
68 return mSelectedFeatureIds.count();
71void QgsFilteredSelectionManager::onSelectionChanged(
const QgsFeatureIds &selected,
const QgsFeatureIds &deselected,
bool clearAndSelect )
76 mSelectedFeatureIds.clear();
80 for (
const auto fid : deselected )
81 mSelectedFeatureIds.remove( fid );
84 for (
const auto fid : selected )
85 if ( mRequest.acceptFeature( layer()->getFeature( fid ) ) )
86 mSelectedFeatureIds << fid;
88 lselected.remove( fid );
90 emit selectionChanged( lselected, deselected, clearAndSelect );
98 , mShowFirstFeature(
config.value( QStringLiteral(
"show_first_feature" ), true ).toBool() )
99 , mAllowAddChildFeatureWithNoGeometry(
config.value( QStringLiteral(
"allow_add_child_feature_with_no_geometry" ), false ).toBool() )
100 , mFilterExpression(
config.value( QStringLiteral(
"filter_expression" ) ).toString() )
102 QVBoxLayout *rootLayout =
new QVBoxLayout(
this );
103 rootLayout->setContentsMargins( 0, 9, 0, 0 );
106 QHBoxLayout *buttonLayout =
new QHBoxLayout();
107 buttonLayout->setContentsMargins( 0, 0, 0, 0 );
109 mToggleEditingButton =
new QToolButton(
this );
110 mToggleEditingButton->setObjectName( QStringLiteral(
"mToggleEditingButton" ) );
112 mToggleEditingButton->setText( tr(
"Toggle Editing" ) );
113 mToggleEditingButton->setEnabled(
false );
114 mToggleEditingButton->setCheckable(
true );
115 mToggleEditingButton->setToolTip( tr(
"Toggle editing mode for child layer" ) );
116 buttonLayout->addWidget( mToggleEditingButton );
118 mSaveEditsButton =
new QToolButton(
this );
120 mSaveEditsButton->setText( tr(
"Save Child Layer Edits" ) );
121 mSaveEditsButton->setToolTip( tr(
"Save child layer edits" ) );
122 mSaveEditsButton->setEnabled(
true );
123 buttonLayout->addWidget( mSaveEditsButton );
125 mAddFeatureGeometryButton =
new QToolButton(
this );
126 mAddFeatureGeometryButton->setObjectName( QStringLiteral(
"mAddFeatureGeometryButton" ) );
127 buttonLayout->addWidget( mAddFeatureGeometryButton );
129 mAddFeatureButton =
new QToolButton(
this );
131 mAddFeatureButton->setText( tr(
"Add Child Feature" ) );
132 mAddFeatureButton->setToolTip( tr(
"Add child feature" ) );
133 mAddFeatureButton->setObjectName( QStringLiteral(
"mAddFeatureButton" ) );
134 buttonLayout->addWidget( mAddFeatureButton );
136 mDuplicateFeatureButton =
new QToolButton(
this );
138 mDuplicateFeatureButton->setText( tr(
"Duplicate Child Feature(s)" ) );
139 mDuplicateFeatureButton->setToolTip( tr(
"Duplicate selected child feature(s)" ) );
140 mDuplicateFeatureButton->setObjectName( QStringLiteral(
"mDuplicateFeatureButton" ) );
141 buttonLayout->addWidget( mDuplicateFeatureButton );
143 mDeleteFeatureButton =
new QToolButton(
this );
145 mDeleteFeatureButton->setText( tr(
"Delete Child Feature(s)" ) );
146 mDeleteFeatureButton->setToolTip( tr(
"Delete selected child feature(s)" ) );
147 mDeleteFeatureButton->setObjectName( QStringLiteral(
"mDeleteFeatureButton" ) );
148 buttonLayout->addWidget( mDeleteFeatureButton );
150 mLinkFeatureButton =
new QToolButton(
this );
152 mLinkFeatureButton->setText( tr(
"Link Existing Feature(s)" ) );
153 mLinkFeatureButton->setToolTip( tr(
"Link existing child feature(s)" ) );
154 mLinkFeatureButton->setObjectName( QStringLiteral(
"mLinkFeatureButton" ) );
155 buttonLayout->addWidget( mLinkFeatureButton );
157 mUnlinkFeatureButton =
new QToolButton(
this );
159 mUnlinkFeatureButton->setText( tr(
"Unlink Feature(s)" ) );
160 mUnlinkFeatureButton->setToolTip( tr(
"Unlink selected child feature(s)" ) );
161 mUnlinkFeatureButton->setObjectName( QStringLiteral(
"mUnlinkFeatureButton" ) );
162 buttonLayout->addWidget( mUnlinkFeatureButton );
164 mZoomToFeatureButton =
new QToolButton(
this );
166 mZoomToFeatureButton->setText( tr(
"Zoom To Feature(s)" ) );
167 mZoomToFeatureButton->setToolTip( tr(
"Zoom to selected child feature(s)" ) );
168 mZoomToFeatureButton->setObjectName( QStringLiteral(
"mZoomToFeatureButton" ) );
169 buttonLayout->addWidget( mZoomToFeatureButton );
171 buttonLayout->addItem(
new QSpacerItem( 0, 0, QSizePolicy::Expanding ) );
173 mFormViewButton =
new QToolButton(
this );
174 mFormViewButton->setText( tr(
"Form View" ) );
175 mFormViewButton->setToolTip( tr(
"Switch to form view" ) );
177 mFormViewButton->setCheckable(
true );
179 buttonLayout->addWidget( mFormViewButton );
181 mTableViewButton =
new QToolButton(
this );
182 mTableViewButton->setText( tr(
"Table View" ) );
183 mTableViewButton->setToolTip( tr(
"Switch to table view" ) );
185 mTableViewButton->setCheckable(
true );
187 buttonLayout->addWidget( mTableViewButton );
189 mViewModeButtonGroup =
new QButtonGroup(
this );
193 mMultiEditInfoLabel =
new QLabel(
this );
194 buttonLayout->addWidget( mMultiEditInfoLabel );
197 rootLayout->addLayout( buttonLayout );
200 mStackedWidget =
new QStackedWidget(
this );
204 mDualView->setView( mViewMode );
208 mMultiEditStackedWidgetPage =
new QWidget(
this );
210 QVBoxLayout *vBoxLayout =
new QVBoxLayout();
211 vBoxLayout->setContentsMargins( 0, 0, 0, 0 );
213 mMultiEditTreeWidget =
new QTreeWidget(
this );
214 mMultiEditTreeWidget->setHeaderHidden(
true );
215 mMultiEditTreeWidget->setSelectionMode( QTreeWidget::ExtendedSelection );
216 vBoxLayout->addWidget( mMultiEditTreeWidget );
218 mMultiEditStackedWidgetPage->setLayout( vBoxLayout );
220 mStackedWidget->addWidget( mMultiEditStackedWidgetPage );
222 mStackedWidget->addWidget( mDualView );
224 rootLayout->addWidget( mStackedWidget );
227 connect( mToggleEditingButton, &QAbstractButton::clicked,
this, &QgsRelationEditorWidget::toggleEditing );
229 connect( mAddFeatureButton, &QAbstractButton::clicked,
this, &QgsRelationEditorWidget::addFeature );
230 connect( mAddFeatureGeometryButton, &QAbstractButton::clicked,
this, &QgsRelationEditorWidget::addFeatureGeometry );
233 connect( mLinkFeatureButton, &QAbstractButton::clicked,
this, &QgsRelationEditorWidget::linkFeature );
236 connect( mMultiEditTreeWidget, &QTreeWidget::itemSelectionChanged,
this, &QgsRelationEditorWidget::multiEditItemSelectionChanged );
241 setLayout( rootLayout );
254 mDualView->init( layer,
mEditorContext.mapCanvas(), request, ctx,
true, mShowFirstFeature );
255 mFeatureSelectionMgr =
new QgsFilteredSelectionManager( layer, request, mDualView );
256 mDualView->setFeatureSelectionManager( mFeatureSelectionMgr );
265 text = tr(
"Add Point Child Feature" );
270 text = tr(
"Add Line Child Feature" );
275 text = tr(
"Add Polygon Child Feature" );
278 mAddFeatureGeometryButton->setIcon( icon );
279 mAddFeatureGeometryButton->setText( text );
280 mAddFeatureGeometryButton->setToolTip( text );
292 mMapToolDigitize->setButton( mAddFeatureGeometryButton );
300 mDualView->setView( mode );
304void QgsRelationEditorWidget::updateButtons()
306 bool toggleEditingButtonEnabled =
false;
308 bool canAddGeometry =
false;
309 bool canRemove =
false;
310 bool canEdit =
false;
311 bool canLink =
false;
312 bool canUnlink =
false;
313 bool spatial =
false;
329 toggleEditingButtonEnabled |=
mNmRelation.referencedLayer()->supportsEditing();
330 canAdd =
mNmRelation.referencedLayer()->isEditable();
331 canAddGeometry =
mNmRelation.referencedLayer()->isEditable();
332 canRemove =
mNmRelation.referencedLayer()->isEditable();
333 canEdit =
mNmRelation.referencedLayer()->isEditable();
334 spatial =
mNmRelation.referencedLayer()->isSpatial();
337 const bool selectionNotEmpty = mFeatureSelectionMgr ? mFeatureSelectionMgr->selectedFeatureCount() :
false;
340 const bool multieditLinkedChildSelected = !selectedChildFeatureIds().isEmpty();
342 canAddGeometry =
false;
344 canRemove = canRemove && multieditLinkedChildSelected;
348 canUnlink = canUnlink && multieditLinkedChildSelected;
352 canRemove = canRemove && selectionNotEmpty;
353 canUnlink = canUnlink && selectionNotEmpty;
356 mToggleEditingButton->setEnabled( toggleEditingButtonEnabled );
357 mAddFeatureButton->setEnabled( canAdd );
358 mAddFeatureGeometryButton->setEnabled( canAddGeometry );
359 mDuplicateFeatureButton->setEnabled( canEdit && selectionNotEmpty );
360 mLinkFeatureButton->setEnabled( canLink );
361 mDeleteFeatureButton->setEnabled( canRemove );
362 mUnlinkFeatureButton->setEnabled( canUnlink );
363 mZoomToFeatureButton->setEnabled( selectionNotEmpty );
364 mToggleEditingButton->setChecked( canEdit );
365 mSaveEditsButton->setEnabled( canEdit || canLink || canUnlink );
379void QgsRelationEditorWidget::addFeature()
386 mMultiEditTreeWidget->blockSignals(
true );
387 mMultiEdit1NJustAddedIds = addedFeatures;
388 QTreeWidgetItemIterator treeWidgetItemIterator( mMultiEditTreeWidget );
389 while ( *treeWidgetItemIterator )
391 if ( ( *treeWidgetItemIterator )->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() !=
static_cast<int>( MultiEditFeatureType::Child ) )
393 ++treeWidgetItemIterator;
397 if ( addedFeatures.contains( ( *treeWidgetItemIterator )->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt() ) )
398 ( *treeWidgetItemIterator )->setSelected(
true );
400 ++treeWidgetItemIterator;
402 mMultiEditTreeWidget->blockSignals(
false );
408void QgsRelationEditorWidget::addFeatureGeometry()
412 QgsLogger::warning( tr(
"Adding a geometry feature is not supported in multiple edit mode" ) );
416 QgsVectorLayer *layer =
nullptr;
422 mMapToolDigitize->setLayer( layer );
425 if ( window()->objectName() != QLatin1String(
"QgisApp" ) )
427 window()->setVisible(
false );
429 setMapTool( mMapToolDigitize );
439 const QString title = tr(
"Create child feature for parent %1 \"%2\"" ).arg(
mRelation.referencedLayer()->name(), displayString );
440 const QString msg = tr(
"Digitize the geometry for the new feature on layer %1. Press <ESC> to cancel." )
441 .arg( layer->
name() );
443 lMainMessageBar->pushItem( mMessageBarItem );
447void QgsRelationEditorWidget::onDigitizingCompleted(
const QgsFeature &feature )
450 digitizingFinished();
453void QgsRelationEditorWidget::multiEditItemSelectionChanged()
455 const QList<QTreeWidgetItem *> selectedItems = mMultiEditTreeWidget->selectedItems();
459 if ( selectedItems.size() == 1
460 && mMultiEditPreviousSelectedItems.size() <= 1 )
462 if ( selectedItems.first()->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() ==
static_cast<int>( MultiEditFeatureType::Child ) )
464 mMultiEditTreeWidget->blockSignals(
true );
466 const QgsFeatureId featureIdSelectedItem = selectedItems.first()->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt();
468 QTreeWidgetItemIterator treeWidgetItemIterator( mMultiEditTreeWidget );
469 while ( *treeWidgetItemIterator )
471 if ( ( *treeWidgetItemIterator )->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() !=
static_cast<int>( MultiEditFeatureType::Child ) )
473 ++treeWidgetItemIterator;
477 const QgsFeatureId featureIdCurrentItem = ( *treeWidgetItemIterator )->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt();
480 if ( featureIdSelectedItem == featureIdCurrentItem )
481 ( *treeWidgetItemIterator )->setSelected(
true );
485 if ( !mMultiEdit1NJustAddedIds.contains( featureIdSelectedItem ) )
488 if ( mMultiEdit1NJustAddedIds.contains( featureIdCurrentItem ) )
489 ( *treeWidgetItemIterator )->setSelected(
true );
492 ++treeWidgetItemIterator;
494 mMultiEditTreeWidget->blockSignals(
false );
497 mMultiEditPreviousSelectedItems = selectedItems;
501void QgsRelationEditorWidget::linkFeature()
506void QgsRelationEditorWidget::toggleEditing(
bool state )
524 updateUiSingleEdit();
529 mButtonsVisibility = buttons;
536 if ( mLinkFeatureButton->isVisible() )
538 if ( mUnlinkFeatureButton->isVisible() )
540 if ( mSaveEditsButton->isVisible() )
542 if ( mAddFeatureButton->isVisible() )
544 if ( mDuplicateFeatureButton->isVisible() )
546 if ( mDeleteFeatureButton->isVisible() )
548 if ( mZoomToFeatureButton->isVisible() )
555 mDualView->parentFormValueChanged( attribute, newValue );
562 QAction *qAction =
nullptr;
567 connect( qAction, &QAction::triggered,
this, [
this, fid]() {
deleteFeature( fid ); } );
573 connect( qAction, &QAction::triggered,
this, [
this, fid]() {
unlinkFeature( fid ); } );
578void QgsRelationEditorWidget::setMapTool(
QgsMapTool *mapTool )
583 mapCanvas->window()->raise();
584 mapCanvas->activateWindow();
585 mapCanvas->setFocus();
589void QgsRelationEditorWidget::unsetMapTool()
599QgsFeatureIds QgsRelationEditorWidget::selectedChildFeatureIds()
const
604 for ( QTreeWidgetItem *treeWidgetItem : mMultiEditTreeWidget->selectedItems() )
606 if (
static_cast<MultiEditFeatureType
>( treeWidgetItem->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() ) != MultiEditFeatureType::Child )
609 featureIds.insert( treeWidgetItem->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toLongLong() );
613 else if ( mFeatureSelectionMgr )
615 return mFeatureSelectionMgr->selectedFeatureIds();
623void QgsRelationEditorWidget::updateUiSingleEdit()
625 mFormViewButton->setVisible(
true );
626 mTableViewButton->setVisible(
true );
627 mMultiEditInfoLabel->setVisible(
false );
629 mStackedWidget->setCurrentWidget( mDualView );
632 QgsVectorLayer *layer =
nullptr;
636 QgsFeatureRequest nmRequest;
638 QgsFeatureIterator it =
mRelation.referencingLayer()->getFeatures( request );
643 QString filter =
mNmRelation.getReferencedFeatureRequest( fet ).filterExpression()->expression();
644 filters << filter.prepend(
'(' ).append(
')' );
647 QString reducedExpression;
657 request = std::move( nmRequest );
669 if ( !mDualView->masterModel() || layer != mDualView->masterModel()->layer() )
671 initDualView( layer, request );
675 mFeatureSelectionMgr =
new QgsFilteredSelectionManager( layer, request, mDualView );
676 mDualView->setFeatureSelectionManager( mFeatureSelectionMgr );
679 mDualView->setRequest( request );
680 mDualView->masterModel()->loadLayer();
686void QgsRelationEditorWidget::updateUiMultiEdit()
688 mFormViewButton->setVisible(
false );
689 mTableViewButton->setVisible(
false );
690 mMultiEditInfoLabel->setVisible(
true );
692 mStackedWidget->setCurrentWidget( mMultiEditStackedWidgetPage );
694 QList<QTreeWidgetItem *> parentTreeWidgetItems;
697 QMultiMap<QTreeWidgetItem *, QgsFeatureId> multimapChildFeatures;
699 mMultiEditTreeWidget->clear();
700 for (
const QgsFeature &featureParent : std::as_const(
mFeatureList ) )
702 QTreeWidgetItem *treeWidgetItem = createMultiEditTreeWidgetItem( featureParent,
mRelation.referencedLayer(), MultiEditFeatureType::Parent );
705 treeWidgetItem->setFlags( Qt::ItemIsEnabled );
707 parentTreeWidgetItems.append( treeWidgetItem );
711 QgsFeatureIterator featureIterator =
mRelation.referencingLayer()->getFeatures( request );
712 QgsFeature featureChild;
713 while ( featureIterator.
nextFeature( featureChild ) )
717 const QgsFeatureRequest requestFinalChild =
mNmRelation.getReferencedFeatureRequest( featureChild );
718 QgsFeatureIterator featureIteratorFinalChild =
mNmRelation.referencedLayer()->getFeatures( requestFinalChild );
719 QgsFeature featureChildChild;
720 while ( featureIteratorFinalChild.
nextFeature( featureChildChild ) )
722 QTreeWidgetItem *treeWidgetItemChild = createMultiEditTreeWidgetItem( featureChildChild,
mNmRelation.referencedLayer(), MultiEditFeatureType::Child );
724 treeWidgetItem->addChild( treeWidgetItemChild );
726 featureIdsMixedValues.insert( featureChildChild.
id() );
727 multimapChildFeatures.insert( treeWidgetItem, featureChildChild.
id() );
732 QTreeWidgetItem *treeWidgetItemChild = createMultiEditTreeWidgetItem( featureChild,
mRelation.referencingLayer(), MultiEditFeatureType::Child );
733 treeWidgetItem->addChild( treeWidgetItemChild );
735 featureIdsMixedValues.insert( featureChild.
id() );
739 mMultiEditTreeWidget->addTopLevelItem( treeWidgetItem );
740 treeWidgetItem->setExpanded(
true );
756 QgsFeatureIds::iterator iterator = featureIdsMixedValues.begin();
757 while ( iterator != featureIdsMixedValues.end() )
759 bool mixedValues =
false;
760 for ( QTreeWidgetItem *parentTreeWidgetItem : parentTreeWidgetItems )
762 if ( !multimapChildFeatures.values( parentTreeWidgetItem ).contains( *iterator ) )
771 iterator = featureIdsMixedValues.erase( iterator );
780 if ( featureIdsMixedValues.isEmpty() )
783 mMultiEditInfoLabel->setPixmap( icon.pixmap( mMultiEditInfoLabel->height(), mMultiEditInfoLabel->height() ) );
784 mMultiEditInfoLabel->setToolTip( tr(
"All features in selection have equal relations" ) );
789 mMultiEditInfoLabel->setPixmap( icon.pixmap( mMultiEditInfoLabel->height(), mMultiEditInfoLabel->height() ) );
790 mMultiEditInfoLabel->setToolTip( tr(
"Some features in selection have different relations" ) );
793 QFont fontItalic = mMultiEditTreeWidget->font();
794 fontItalic.setItalic(
true );
795 for ( QTreeWidgetItem *parentTreeWidgetItem : parentTreeWidgetItems )
797 for (
int childIndex = 0; childIndex < parentTreeWidgetItem->childCount(); ++childIndex )
799 QTreeWidgetItem *childItem = parentTreeWidgetItem->child( childIndex );
800 const QgsFeatureId featureIdCurrentItem = childItem->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt();
801 if ( featureIdsMixedValues.contains( featureIdCurrentItem ) )
802 childItem->setFont( 0, fontItalic );
808QTreeWidgetItem *QgsRelationEditorWidget::createMultiEditTreeWidgetItem(
const QgsFeature &feature,
QgsVectorLayer *layer, MultiEditFeatureType type )
810 QTreeWidgetItem *treeWidgetItem =
new QTreeWidgetItem();
813 treeWidgetItem->setData( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ),
static_cast<int>( type ) );
814 treeWidgetItem->setData( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ),
feature.id() );
815 return treeWidgetItem;
818void QgsRelationEditorWidget::onDigitizingCanceled()
820 digitizingFinished();
823void QgsRelationEditorWidget::digitizingFinished()
825 window()->setVisible(
true );
827 window()->activateWindow();
831void QgsRelationEditorWidget::mapToolDeactivated()
837 mMessageBarItem =
nullptr;
842 return QVariantMap( { {
"buttons",
qgsFlagValueToKeys(
visibleButtons() ) }, {
"show_first_feature", mShowFirstFeature }, {
"allow_add_child_feature_with_no_geometry", mAllowAddChildFeatureWithNoGeometry }, {
"filter_expression", mFilterExpression } } );
848 mShowFirstFeature =
config.value( QStringLiteral(
"show_first_feature" ),
true ).toBool();
849 mAllowAddChildFeatureWithNoGeometry =
config.value( QStringLiteral(
"allow_add_child_feature_with_no_geometry" ),
false ).toBool();
850 mFilterExpression =
config.value( QStringLiteral(
"filter_expression" ) ).toString();
856 Q_UNUSED( newRelation );
857 Q_UNUSED( newFeature );
881 initDualView(
mRelation.referencingLayer(), myRequest );
886 Q_UNUSED( newRelation );
887 Q_UNUSED( newNmRelation );
921 return mFeatureSelectionMgr;
926 const QgsFeatureIds selectedFids = selectedChildFeatureIds();
942 const QgsFeatureIds selectedFids = selectedChildFeatureIds();
954 mFeatureSelectionMgr->selectedFeatureIds()
968 filterExpressionLabel->setEnabled( mRelationShowLinkCheckBox->isChecked() );
969 mEditExpression->setEnabled( mRelationShowLinkCheckBox->isChecked() );
970 mFilterExpression->setEnabled( mRelationShowLinkCheckBox->isChecked() );
971 connect( mRelationShowLinkCheckBox, &QCheckBox::toggled, filterExpressionLabel, &QLabel::setEnabled );
972 connect( mRelationShowLinkCheckBox, &QCheckBox::toggled, mEditExpression, &QToolButton::setEnabled );
973 connect( mRelationShowLinkCheckBox, &QCheckBox::toggled, mFilterExpression, &QTextEdit::setEnabled );
976 mAllowAddChildFeatureWithNoGeometry->setEnabled( mRelationShowAddChildCheckBox->isChecked() );
977 connect( mRelationShowAddChildCheckBox, &QCheckBox::toggled, mAllowAddChildFeatureWithNoGeometry, &QCheckBox::setEnabled );
996 dlg.setWindowTitle( tr(
"Edit Filter Expression of Target Layer" ) );
998 if ( dlg.exec() == QDialog::Accepted )
1017 {
"show_first_feature", mShowFirstFeature->isChecked() },
1018 {
"allow_add_child_feature_with_no_geometry", mAllowAddChildFeatureWithNoGeometry->isChecked() },
1019 {
"filter_expression", mFilterExpression->toPlainText() }
1035 mShowFirstFeature->setChecked(
config.value( QStringLiteral(
"show_first_feature" ),
true ).toBool() );
1036 mAllowAddChildFeatureWithNoGeometry->setChecked(
config.value( QStringLiteral(
"allow_add_child_feature_with_no_geometry" ),
false ).toBool() );
1037 mFilterExpression->setPlainText(
config.value( QStringLiteral(
"filter_expression" ) ).toString() );
1051 return QStringLiteral(
"relation_editor" );
1056 return QObject::tr(
"Relation Editor" );
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Contains context information for attribute editor widgets.
QgsMapCanvas * mapCanvas() const
Returns the associated map canvas (e.g.
QgsAdvancedDigitizingDockWidget * cadDockWidget() const
Returns the associated CAD dock widget (e.g.
void setParentFormFeature(const QgsFeature &feature)
Sets the feature of the currently edited parent form.
This widget is used to show the attributes of a set of features of a QgsVectorLayer.
void showContextMenuExternally(QgsActionMenu *menu, QgsFeatureId fid)
Emitted when selecting context menu on the feature list to create the context menu individually.
ViewMode
The view modes, in which this widget can present information.
@ AttributeTable
Shows the features and attributes in a table layout.
@ AttributeEditor
Show a list of the features, where one can be chosen and the according attribute dialog will be prese...
A generic dialog for building expression strings.
QgsExpressionBuilderWidget * expressionBuilder()
The builder widget that is used by the dialog.
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
static bool attemptReduceToInClause(const QStringList &expressions, QString &result)
Attempts to reduce a list of expressions to a single "field IN (val1, val2, ... )" type expression.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
Wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Is an interface class to abstract feature selection handling.
void selectionChanged(const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect)
Emitted when selection was changed.
static QIcon iconForLayer(const QgsMapLayer *layer)
Returns the icon corresponding to a specified map layer.
static void warning(const QString &msg)
Goes to qWarning.
Map canvas is a class for displaying all GIS data types on a canvas.
void unsetMapTool(QgsMapTool *mapTool)
Unset the current map tool or last non zoom tool.
void setMapTool(QgsMapTool *mapTool, bool clean=false)
Sets the map tool currently being used on the canvas.
void editingStopped()
Emitted when edited changes have been successfully written to the data provider.
void editingStarted()
Emitted when editing on this layer has started.
static QgsMessageBarItem * createMessage(const QString &text, QWidget *parent=nullptr)
Creates message bar item widget containing a message text to be displayed on the bar.
Represents a relationship between two vector layers.
QgsVectorLayer * referencedLayer
QgsVectorLayer * referencingLayer
QgsFeatureRequest getRelatedFeaturesRequest(const QgsFeature &feature) const
Creates a request to return all the features on the referencing (child) layer which have a foreign ke...
Manages vector layer selections.
static QString getFeatureDisplayString(const QgsVectorLayer *layer, const QgsFeature &feature)
Returns a descriptive string for a feature, suitable for displaying to the user.
Represents a vector layer which manages a vector based dataset.
bool isEditable() const final
Returns true if the provider is in editing mode.
bool isSpatial() const final
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
Q_INVOKABLE const QgsFeatureIds & selectedFeatureIds() const
Returns a list of the selected features IDs in this layer.
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
void selectionChanged(const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect)
Emitted when selection was changed.
Q_INVOKABLE QgsFeature getFeature(QgsFeatureId fid) const
Queries the layer for the feature with the given id.
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 c
QString qgsFlagValueToKeys(const T &value, bool *returnOk=nullptr)
Returns the value for the given keys of a flag.
T qgsFlagKeysToValue(const QString &keys, const T &defaultValue, bool tryValueAsKey=true, bool *returnOk=nullptr)
Returns the value corresponding to the given keys of a flag.
QSet< QgsFeatureId > QgsFeatureIds
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features