43#include "moc_qgsrelationeditorwidget.cpp"
45using namespace Qt::StringLiterals;
57 if ( mRequest.acceptFeature( layer->
getFeature( fid ) ) )
58 mSelectedFeatureIds << fid;
63const QgsFeatureIds &QgsFilteredSelectionManager::selectedFeatureIds()
const
67 return mSelectedFeatureIds;
70int QgsFilteredSelectionManager::selectedFeatureCount()
72 return mSelectedFeatureIds.count();
75void QgsFilteredSelectionManager::onSelectionChanged(
const QgsFeatureIds &selected,
const QgsFeatureIds &deselected,
bool clearAndSelect )
80 mSelectedFeatureIds.clear();
84 for (
const auto fid : deselected )
85 mSelectedFeatureIds.remove( fid );
88 for (
const auto fid : selected )
89 if ( mRequest.acceptFeature( layer()->getFeature( fid ) ) )
90 mSelectedFeatureIds << fid;
92 lselected.remove( fid );
94 emit selectionChanged( lselected, deselected, clearAndSelect );
102 , mShowFirstFeature(
config.value( u
"show_first_feature"_s, true ).toBool() )
103 , mAllowAddChildFeatureWithNoGeometry(
config.value( u
"allow_add_child_feature_with_no_geometry"_s, false ).toBool() )
104 , mFilterExpression(
config.value( u
"filter_expression"_s ).toString() )
106 QVBoxLayout *rootLayout =
new QVBoxLayout(
this );
107 rootLayout->setContentsMargins( 0, 9, 0, 0 );
110 QHBoxLayout *buttonLayout =
new QHBoxLayout();
111 buttonLayout->setContentsMargins( 0, 0, 0, 0 );
113 mToggleEditingButton =
new QToolButton(
this );
114 mToggleEditingButton->setObjectName( u
"mToggleEditingButton"_s );
116 mToggleEditingButton->setText( tr(
"Toggle Editing" ) );
117 mToggleEditingButton->setEnabled(
false );
118 mToggleEditingButton->setCheckable(
true );
119 mToggleEditingButton->setToolTip( tr(
"Toggle editing mode for child layer" ) );
120 buttonLayout->addWidget( mToggleEditingButton );
122 mSaveEditsButton =
new QToolButton(
this );
124 mSaveEditsButton->setText( tr(
"Save Child Layer Edits" ) );
125 mSaveEditsButton->setToolTip( tr(
"Save child layer edits" ) );
126 mSaveEditsButton->setEnabled(
true );
127 buttonLayout->addWidget( mSaveEditsButton );
129 mAddFeatureGeometryButton =
new QToolButton(
this );
130 mAddFeatureGeometryButton->setObjectName( u
"mAddFeatureGeometryButton"_s );
131 buttonLayout->addWidget( mAddFeatureGeometryButton );
133 mAddFeatureButton =
new QToolButton(
this );
135 mAddFeatureButton->setText( tr(
"Add Child Feature" ) );
136 mAddFeatureButton->setToolTip( tr(
"Add child feature" ) );
137 mAddFeatureButton->setObjectName( u
"mAddFeatureButton"_s );
138 buttonLayout->addWidget( mAddFeatureButton );
140 mDuplicateFeatureButton =
new QToolButton(
this );
142 mDuplicateFeatureButton->setText( tr(
"Duplicate Child Feature(s)" ) );
143 mDuplicateFeatureButton->setToolTip( tr(
"Duplicate selected child feature(s)" ) );
144 mDuplicateFeatureButton->setObjectName( u
"mDuplicateFeatureButton"_s );
145 buttonLayout->addWidget( mDuplicateFeatureButton );
147 mDeleteFeatureButton =
new QToolButton(
this );
149 mDeleteFeatureButton->setText( tr(
"Delete Child Feature(s)" ) );
150 mDeleteFeatureButton->setToolTip( tr(
"Delete selected child feature(s)" ) );
151 mDeleteFeatureButton->setObjectName( u
"mDeleteFeatureButton"_s );
152 buttonLayout->addWidget( mDeleteFeatureButton );
154 mLinkFeatureButton =
new QToolButton(
this );
156 mLinkFeatureButton->setText( tr(
"Link Existing Feature(s)" ) );
157 mLinkFeatureButton->setToolTip( tr(
"Link existing child feature(s)" ) );
158 mLinkFeatureButton->setObjectName( u
"mLinkFeatureButton"_s );
159 buttonLayout->addWidget( mLinkFeatureButton );
161 mUnlinkFeatureButton =
new QToolButton(
this );
163 mUnlinkFeatureButton->setText( tr(
"Unlink Feature(s)" ) );
164 mUnlinkFeatureButton->setToolTip( tr(
"Unlink selected child feature(s)" ) );
165 mUnlinkFeatureButton->setObjectName( u
"mUnlinkFeatureButton"_s );
166 buttonLayout->addWidget( mUnlinkFeatureButton );
168 mZoomToFeatureButton =
new QToolButton(
this );
170 mZoomToFeatureButton->setText( tr(
"Zoom To Feature(s)" ) );
171 mZoomToFeatureButton->setToolTip( tr(
"Zoom to selected child feature(s)" ) );
172 mZoomToFeatureButton->setObjectName( u
"mZoomToFeatureButton"_s );
173 buttonLayout->addWidget( mZoomToFeatureButton );
175 buttonLayout->addItem(
new QSpacerItem( 0, 0, QSizePolicy::Expanding ) );
177 mFormViewButton =
new QToolButton(
this );
178 mFormViewButton->setText( tr(
"Form View" ) );
179 mFormViewButton->setToolTip( tr(
"Switch to form view" ) );
181 mFormViewButton->setCheckable(
true );
183 buttonLayout->addWidget( mFormViewButton );
185 mTableViewButton =
new QToolButton(
this );
186 mTableViewButton->setText( tr(
"Table View" ) );
187 mTableViewButton->setToolTip( tr(
"Switch to table view" ) );
189 mTableViewButton->setCheckable(
true );
191 buttonLayout->addWidget( mTableViewButton );
193 mViewModeButtonGroup =
new QButtonGroup(
this );
197 mMultiEditInfoLabel =
new QLabel(
this );
198 buttonLayout->addWidget( mMultiEditInfoLabel );
201 rootLayout->addLayout( buttonLayout );
204 mStackedWidget =
new QStackedWidget(
this );
208 mDualView->setView( mViewMode );
212 mMultiEditStackedWidgetPage =
new QWidget(
this );
214 QVBoxLayout *vBoxLayout =
new QVBoxLayout();
215 vBoxLayout->setContentsMargins( 0, 0, 0, 0 );
217 mMultiEditTreeWidget =
new QTreeWidget(
this );
218 mMultiEditTreeWidget->setHeaderHidden(
true );
219 mMultiEditTreeWidget->setSelectionMode( QTreeWidget::ExtendedSelection );
220 vBoxLayout->addWidget( mMultiEditTreeWidget );
222 mMultiEditStackedWidgetPage->setLayout( vBoxLayout );
224 mStackedWidget->addWidget( mMultiEditStackedWidgetPage );
226 mStackedWidget->addWidget( mDualView );
228 rootLayout->addWidget( mStackedWidget );
231 connect( mToggleEditingButton, &QAbstractButton::clicked,
this, &QgsRelationEditorWidget::toggleEditing );
233 connect( mAddFeatureButton, &QAbstractButton::clicked,
this, &QgsRelationEditorWidget::addFeature );
234 connect( mAddFeatureGeometryButton, &QAbstractButton::clicked,
this, &QgsRelationEditorWidget::addFeatureGeometry );
237 connect( mLinkFeatureButton, &QAbstractButton::clicked,
this, &QgsRelationEditorWidget::linkFeature );
240 connect( mMultiEditTreeWidget, &QTreeWidget::itemSelectionChanged,
this, &QgsRelationEditorWidget::multiEditItemSelectionChanged );
245 setLayout( rootLayout );
258 mDualView->init( layer,
mEditorContext.mapCanvas(), request, ctx,
true, mShowFirstFeature );
259 mFeatureSelectionMgr =
new QgsFilteredSelectionManager( layer, request, mDualView );
260 mDualView->setFeatureSelectionManager( mFeatureSelectionMgr );
269 text = tr(
"Add Point Child Feature" );
274 text = tr(
"Add Line Child Feature" );
279 text = tr(
"Add Polygon Child Feature" );
282 mAddFeatureGeometryButton->setIcon( icon );
283 mAddFeatureGeometryButton->setText( text );
284 mAddFeatureGeometryButton->setToolTip( text );
296 mMapToolDigitize->setButton( mAddFeatureGeometryButton );
304 mDualView->setView( mode );
308void QgsRelationEditorWidget::updateButtons()
310 bool toggleEditingButtonEnabled =
false;
312 bool canAddGeometry =
false;
313 bool canRemove =
false;
314 bool canEdit =
false;
315 bool canLink =
false;
316 bool canUnlink =
false;
317 bool spatial =
false;
333 toggleEditingButtonEnabled |=
mNmRelation.referencedLayer()->supportsEditing();
334 canAdd =
mNmRelation.referencedLayer()->isEditable();
335 canAddGeometry =
mNmRelation.referencedLayer()->isEditable();
336 canRemove =
mNmRelation.referencedLayer()->isEditable();
337 canEdit =
mNmRelation.referencedLayer()->isEditable();
338 spatial =
mNmRelation.referencedLayer()->isSpatial();
341 const bool selectionNotEmpty = mFeatureSelectionMgr ? mFeatureSelectionMgr->selectedFeatureCount() :
false;
344 const bool multieditLinkedChildSelected = !selectedChildFeatureIds().isEmpty();
346 canAddGeometry =
false;
348 canRemove = canRemove && multieditLinkedChildSelected;
352 canUnlink = canUnlink && multieditLinkedChildSelected;
356 canRemove = canRemove && selectionNotEmpty;
357 canUnlink = canUnlink && selectionNotEmpty;
360 mToggleEditingButton->setEnabled( toggleEditingButtonEnabled );
361 mAddFeatureButton->setEnabled( canAdd );
362 mAddFeatureGeometryButton->setEnabled( canAddGeometry );
363 mDuplicateFeatureButton->setEnabled( canEdit && selectionNotEmpty );
364 mLinkFeatureButton->setEnabled( canLink );
365 mDeleteFeatureButton->setEnabled( canRemove );
366 mUnlinkFeatureButton->setEnabled( canUnlink );
367 mZoomToFeatureButton->setEnabled( selectionNotEmpty );
368 mToggleEditingButton->setChecked( canEdit );
369 mSaveEditsButton->setEnabled( canEdit || canLink || canUnlink );
383void QgsRelationEditorWidget::addFeature()
390 mMultiEditTreeWidget->blockSignals(
true );
391 mMultiEdit1NJustAddedIds = addedFeatures;
392 QTreeWidgetItemIterator treeWidgetItemIterator( mMultiEditTreeWidget );
393 while ( *treeWidgetItemIterator )
395 if ( ( *treeWidgetItemIterator )->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() !=
static_cast<int>( MultiEditFeatureType::Child ) )
397 ++treeWidgetItemIterator;
401 if ( addedFeatures.contains( ( *treeWidgetItemIterator )->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt() ) )
402 ( *treeWidgetItemIterator )->setSelected(
true );
404 ++treeWidgetItemIterator;
406 mMultiEditTreeWidget->blockSignals(
false );
412void QgsRelationEditorWidget::addFeatureGeometry()
416 QgsLogger::warning( tr(
"Adding a geometry feature is not supported in multiple edit mode" ) );
420 QgsVectorLayer *layer =
nullptr;
426 mMapToolDigitize->setLayer( layer );
429 if ( window()->objectName() !=
"QgisApp"_L1 )
431 window()->setVisible(
false );
433 setMapTool( mMapToolDigitize );
443 const QString title = tr(
"Create child feature for parent %1 \"%2\"" ).arg(
mRelation.referencedLayer()->name(), displayString );
444 const QString msg = tr(
"Digitize the geometry for the new feature on layer %1. Press <ESC> to cancel." ).arg( layer->
name() );
446 lMainMessageBar->pushItem( mMessageBarItem );
450void QgsRelationEditorWidget::onDigitizingCompleted(
const QgsFeature &feature )
453 digitizingFinished();
456void QgsRelationEditorWidget::multiEditItemSelectionChanged()
458 const QList<QTreeWidgetItem *> selectedItems = mMultiEditTreeWidget->selectedItems();
462 if ( selectedItems.size() == 1 && mMultiEditPreviousSelectedItems.size() <= 1 )
464 if ( selectedItems.first()->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() ==
static_cast<int>( MultiEditFeatureType::Child ) )
466 mMultiEditTreeWidget->blockSignals(
true );
468 const QgsFeatureId featureIdSelectedItem = selectedItems.first()->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt();
470 QTreeWidgetItemIterator treeWidgetItemIterator( mMultiEditTreeWidget );
471 while ( *treeWidgetItemIterator )
473 if ( ( *treeWidgetItemIterator )->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() !=
static_cast<int>( MultiEditFeatureType::Child ) )
475 ++treeWidgetItemIterator;
479 const QgsFeatureId featureIdCurrentItem = ( *treeWidgetItemIterator )->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt();
482 if ( featureIdSelectedItem == featureIdCurrentItem )
483 ( *treeWidgetItemIterator )->setSelected(
true );
487 if ( !mMultiEdit1NJustAddedIds.contains( featureIdSelectedItem ) )
490 if ( mMultiEdit1NJustAddedIds.contains( featureIdCurrentItem ) )
491 ( *treeWidgetItemIterator )->setSelected(
true );
494 ++treeWidgetItemIterator;
496 mMultiEditTreeWidget->blockSignals(
false );
499 mMultiEditPreviousSelectedItems = selectedItems;
503void QgsRelationEditorWidget::linkFeature()
508void QgsRelationEditorWidget::toggleEditing(
bool state )
526 updateUiSingleEdit();
531 mButtonsVisibility = buttons;
538 if ( mLinkFeatureButton->isVisible() )
540 if ( mUnlinkFeatureButton->isVisible() )
542 if ( mSaveEditsButton->isVisible() )
544 if ( mAddFeatureButton->isVisible() )
546 if ( mDuplicateFeatureButton->isVisible() )
548 if ( mDeleteFeatureButton->isVisible() )
550 if ( mZoomToFeatureButton->isVisible() )
557 mDualView->parentFormValueChanged( attribute, newValue );
564 QAction *qAction =
nullptr;
569 connect( qAction, &QAction::triggered,
this, [
this, fid]() {
deleteFeature( fid ); } );
575 connect( qAction, &QAction::triggered,
this, [
this, fid]() {
unlinkFeature( fid ); } );
580void QgsRelationEditorWidget::setMapTool(
QgsMapTool *mapTool )
585 mapCanvas->window()->raise();
586 mapCanvas->activateWindow();
587 mapCanvas->setFocus();
591void QgsRelationEditorWidget::unsetMapTool()
601QgsFeatureIds QgsRelationEditorWidget::selectedChildFeatureIds()
const
606 for ( QTreeWidgetItem *treeWidgetItem : mMultiEditTreeWidget->selectedItems() )
608 if (
static_cast<MultiEditFeatureType
>( treeWidgetItem->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() ) != MultiEditFeatureType::Child )
611 featureIds.insert( treeWidgetItem->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toLongLong() );
615 else if ( mFeatureSelectionMgr )
617 return mFeatureSelectionMgr->selectedFeatureIds();
625void QgsRelationEditorWidget::updateUiSingleEdit()
627 mFormViewButton->setVisible(
true );
628 mTableViewButton->setVisible(
true );
629 mMultiEditInfoLabel->setVisible(
false );
631 mStackedWidget->setCurrentWidget( mDualView );
634 QgsVectorLayer *layer =
nullptr;
638 QgsFeatureRequest nmRequest;
640 QgsFeatureIterator it =
mRelation.referencingLayer()->getFeatures( request );
645 QString filter =
mNmRelation.getReferencedFeatureRequest( fet ).filterExpression()->expression();
646 filters << filter.prepend(
'(' ).append(
')' );
649 QString reducedExpression;
659 request = std::move( nmRequest );
671 if ( !mDualView->masterModel() || layer != mDualView->masterModel()->layer() )
673 initDualView( layer, request );
677 mFeatureSelectionMgr =
new QgsFilteredSelectionManager( layer, request, mDualView );
678 mDualView->setFeatureSelectionManager( mFeatureSelectionMgr );
681 mDualView->setRequest( request );
682 mDualView->masterModel()->loadLayer();
688void QgsRelationEditorWidget::updateUiMultiEdit()
690 mFormViewButton->setVisible(
false );
691 mTableViewButton->setVisible(
false );
692 mMultiEditInfoLabel->setVisible(
true );
694 mStackedWidget->setCurrentWidget( mMultiEditStackedWidgetPage );
696 QList<QTreeWidgetItem *> parentTreeWidgetItems;
699 QMultiMap<QTreeWidgetItem *, QgsFeatureId> multimapChildFeatures;
701 mMultiEditTreeWidget->clear();
702 for (
const QgsFeature &featureParent : std::as_const(
mFeatureList ) )
704 QTreeWidgetItem *treeWidgetItem = createMultiEditTreeWidgetItem( featureParent,
mRelation.referencedLayer(), MultiEditFeatureType::Parent );
707 treeWidgetItem->setFlags( Qt::ItemIsEnabled );
709 parentTreeWidgetItems.append( treeWidgetItem );
713 QgsFeatureIterator featureIterator =
mRelation.referencingLayer()->getFeatures( request );
714 QgsFeature featureChild;
715 while ( featureIterator.
nextFeature( featureChild ) )
719 const QgsFeatureRequest requestFinalChild =
mNmRelation.getReferencedFeatureRequest( featureChild );
720 QgsFeatureIterator featureIteratorFinalChild =
mNmRelation.referencedLayer()->getFeatures( requestFinalChild );
721 QgsFeature featureChildChild;
722 while ( featureIteratorFinalChild.
nextFeature( featureChildChild ) )
724 QTreeWidgetItem *treeWidgetItemChild = createMultiEditTreeWidgetItem( featureChildChild,
mNmRelation.referencedLayer(), MultiEditFeatureType::Child );
726 treeWidgetItem->addChild( treeWidgetItemChild );
728 featureIdsMixedValues.insert( featureChildChild.
id() );
729 multimapChildFeatures.insert( treeWidgetItem, featureChildChild.
id() );
734 QTreeWidgetItem *treeWidgetItemChild = createMultiEditTreeWidgetItem( featureChild,
mRelation.referencingLayer(), MultiEditFeatureType::Child );
735 treeWidgetItem->addChild( treeWidgetItemChild );
737 featureIdsMixedValues.insert( featureChild.
id() );
741 mMultiEditTreeWidget->addTopLevelItem( treeWidgetItem );
742 treeWidgetItem->setExpanded(
true );
758 QgsFeatureIds::iterator iterator = featureIdsMixedValues.begin();
759 while ( iterator != featureIdsMixedValues.end() )
761 bool mixedValues =
false;
762 for ( QTreeWidgetItem *parentTreeWidgetItem : parentTreeWidgetItems )
764 if ( !multimapChildFeatures.values( parentTreeWidgetItem ).contains( *iterator ) )
773 iterator = featureIdsMixedValues.erase( iterator );
782 if ( featureIdsMixedValues.isEmpty() )
785 mMultiEditInfoLabel->setPixmap( icon.pixmap( mMultiEditInfoLabel->height(), mMultiEditInfoLabel->height() ) );
786 mMultiEditInfoLabel->setToolTip( tr(
"All features in selection have equal relations" ) );
791 mMultiEditInfoLabel->setPixmap( icon.pixmap( mMultiEditInfoLabel->height(), mMultiEditInfoLabel->height() ) );
792 mMultiEditInfoLabel->setToolTip( tr(
"Some features in selection have different relations" ) );
795 QFont fontItalic = mMultiEditTreeWidget->font();
796 fontItalic.setItalic(
true );
797 for ( QTreeWidgetItem *parentTreeWidgetItem : parentTreeWidgetItems )
799 for (
int childIndex = 0; childIndex < parentTreeWidgetItem->childCount(); ++childIndex )
801 QTreeWidgetItem *childItem = parentTreeWidgetItem->child( childIndex );
802 const QgsFeatureId featureIdCurrentItem = childItem->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt();
803 if ( featureIdsMixedValues.contains( featureIdCurrentItem ) )
804 childItem->setFont( 0, fontItalic );
810QTreeWidgetItem *QgsRelationEditorWidget::createMultiEditTreeWidgetItem(
const QgsFeature &feature,
QgsVectorLayer *layer, MultiEditFeatureType type )
812 QTreeWidgetItem *treeWidgetItem =
new QTreeWidgetItem();
815 treeWidgetItem->setData( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ),
static_cast<int>( type ) );
816 treeWidgetItem->setData( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ),
feature.id() );
817 return treeWidgetItem;
820void QgsRelationEditorWidget::onDigitizingCanceled()
822 digitizingFinished();
825void QgsRelationEditorWidget::digitizingFinished()
827 window()->setVisible(
true );
829 window()->activateWindow();
833void QgsRelationEditorWidget::mapToolDeactivated()
839 mMessageBarItem =
nullptr;
846 {
"show_first_feature", mShowFirstFeature },
847 {
"allow_add_child_feature_with_no_geometry", mAllowAddChildFeatureWithNoGeometry },
848 {
"filter_expression", mFilterExpression } }
855 mShowFirstFeature =
config.value( u
"show_first_feature"_s,
true ).toBool();
856 mAllowAddChildFeatureWithNoGeometry =
config.value( u
"allow_add_child_feature_with_no_geometry"_s,
false ).toBool();
857 mFilterExpression =
config.value( u
"filter_expression"_s ).toString();
863 Q_UNUSED( newRelation );
864 Q_UNUSED( newFeature );
887 initDualView(
mRelation.referencingLayer(), myRequest );
892 Q_UNUSED( newRelation );
893 Q_UNUSED( newNmRelation );
927 return mFeatureSelectionMgr;
932 const QgsFeatureIds selectedFids = selectedChildFeatureIds();
948 const QgsFeatureIds selectedFids = selectedChildFeatureIds();
971 filterExpressionLabel->setEnabled( mRelationShowLinkCheckBox->isChecked() );
972 mEditExpression->setEnabled( mRelationShowLinkCheckBox->isChecked() );
973 mFilterExpression->setEnabled( mRelationShowLinkCheckBox->isChecked() );
974 connect( mRelationShowLinkCheckBox, &QCheckBox::toggled, filterExpressionLabel, &QLabel::setEnabled );
975 connect( mRelationShowLinkCheckBox, &QCheckBox::toggled, mEditExpression, &QToolButton::setEnabled );
976 connect( mRelationShowLinkCheckBox, &QCheckBox::toggled, mFilterExpression, &QTextEdit::setEnabled );
979 mAllowAddChildFeatureWithNoGeometry->setEnabled( mRelationShowAddChildCheckBox->isChecked() );
980 connect( mRelationShowAddChildCheckBox, &QCheckBox::toggled, mAllowAddChildFeatureWithNoGeometry, &QCheckBox::setEnabled );
999 dlg.setWindowTitle( tr(
"Edit Filter Expression of Target Layer" ) );
1001 if ( dlg.exec() == QDialog::Accepted )
1020 {
"show_first_feature", mShowFirstFeature->isChecked() },
1021 {
"allow_add_child_feature_with_no_geometry", mAllowAddChildFeatureWithNoGeometry->isChecked() },
1022 {
"filter_expression", mFilterExpression->toPlainText() } }
1037 mShowFirstFeature->setChecked(
config.value( u
"show_first_feature"_s,
true ).toBool() );
1038 mAllowAddChildFeatureWithNoGeometry->setChecked(
config.value( u
"allow_add_child_feature_with_no_geometry"_s,
false ).toBool() );
1039 mFilterExpression->setPlainText(
config.value( u
"filter_expression"_s ).toString() );
1052 return u
"relation_editor"_s;
1057 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
constexpr QObjectUniquePtr< Tp > make_qobject_unique(Args &&...args)
Create an object owned by a QObjectUniquePtr.