48 for (
const auto fid : layer->selectedFeatureIds() )
49 if ( mRequest.acceptFeature( layer->getFeature( fid ) ) )
50 mSelectedFeatureIds << fid;
55const QgsFeatureIds &QgsFilteredSelectionManager::selectedFeatureIds()
const
59 return mSelectedFeatureIds;
62int QgsFilteredSelectionManager::selectedFeatureCount()
64 return mSelectedFeatureIds.count();
67void QgsFilteredSelectionManager::onSelectionChanged(
const QgsFeatureIds &selected,
const QgsFeatureIds &deselected,
bool clearAndSelect )
72 mSelectedFeatureIds.clear();
76 for (
const auto fid : deselected )
77 mSelectedFeatureIds.remove( fid );
80 for (
const auto fid : selected )
81 if ( mRequest.acceptFeature( layer()->getFeature( fid ) ) )
82 mSelectedFeatureIds << fid;
84 lselected.remove( fid );
86 emit selectionChanged( lselected, deselected, clearAndSelect );
94 , mShowFirstFeature( config.value( QStringLiteral(
"show_first_feature" ), true ).toBool() )
95 , mAllowAddChildFeatureWithNoGeometry( config.value( QStringLiteral(
"allow_add_child_feature_with_no_geometry" ), false ).toBool() )
97 QVBoxLayout *rootLayout =
new QVBoxLayout(
this );
98 rootLayout->setContentsMargins( 0, 9, 0, 0 );
101 QHBoxLayout *buttonLayout =
new QHBoxLayout();
102 buttonLayout->setContentsMargins( 0, 0, 0, 0 );
104 mToggleEditingButton =
new QToolButton(
this );
105 mToggleEditingButton->setObjectName( QStringLiteral(
"mToggleEditingButton" ) );
107 mToggleEditingButton->setText( tr(
"Toggle Editing" ) );
108 mToggleEditingButton->setEnabled(
false );
109 mToggleEditingButton->setCheckable(
true );
110 mToggleEditingButton->setToolTip( tr(
"Toggle editing mode for child layer" ) );
111 buttonLayout->addWidget( mToggleEditingButton );
113 mSaveEditsButton =
new QToolButton(
this );
115 mSaveEditsButton->setText( tr(
"Save Child Layer Edits" ) );
116 mSaveEditsButton->setToolTip( tr(
"Save child layer edits" ) );
117 mSaveEditsButton->setEnabled(
true );
118 buttonLayout->addWidget( mSaveEditsButton );
120 mAddFeatureGeometryButton =
new QToolButton(
this );
121 mAddFeatureGeometryButton->setObjectName( QStringLiteral(
"mAddFeatureGeometryButton" ) );
122 buttonLayout->addWidget( mAddFeatureGeometryButton );
124 mAddFeatureButton =
new QToolButton(
this );
126 mAddFeatureButton->setText( tr(
"Add Child Feature" ) );
127 mAddFeatureButton->setToolTip( tr(
"Add child feature" ) );
128 mAddFeatureButton->setObjectName( QStringLiteral(
"mAddFeatureButton" ) );
129 buttonLayout->addWidget( mAddFeatureButton );
131 mDuplicateFeatureButton =
new QToolButton(
this );
133 mDuplicateFeatureButton->setText( tr(
"Duplicate Child Feature(s)" ) );
134 mDuplicateFeatureButton->setToolTip( tr(
"Duplicate selected child feature(s)" ) );
135 mDuplicateFeatureButton->setObjectName( QStringLiteral(
"mDuplicateFeatureButton" ) );
136 buttonLayout->addWidget( mDuplicateFeatureButton );
138 mDeleteFeatureButton =
new QToolButton(
this );
140 mDeleteFeatureButton->setText( tr(
"Delete Child Feature(s)" ) );
141 mDeleteFeatureButton->setToolTip( tr(
"Delete selected child feature(s)" ) );
142 mDeleteFeatureButton->setObjectName( QStringLiteral(
"mDeleteFeatureButton" ) );
143 buttonLayout->addWidget( mDeleteFeatureButton );
145 mLinkFeatureButton =
new QToolButton(
this );
147 mLinkFeatureButton->setText( tr(
"Link Existing Feature(s)" ) );
148 mLinkFeatureButton->setToolTip( tr(
"Link existing child feature(s)" ) );
149 mLinkFeatureButton->setObjectName( QStringLiteral(
"mLinkFeatureButton" ) );
150 buttonLayout->addWidget( mLinkFeatureButton );
152 mUnlinkFeatureButton =
new QToolButton(
this );
154 mUnlinkFeatureButton->setText( tr(
"Unlink Feature(s)" ) );
155 mUnlinkFeatureButton->setToolTip( tr(
"Unlink selected child feature(s)" ) );
156 mUnlinkFeatureButton->setObjectName( QStringLiteral(
"mUnlinkFeatureButton" ) );
157 buttonLayout->addWidget( mUnlinkFeatureButton );
159 mZoomToFeatureButton =
new QToolButton(
this );
161 mZoomToFeatureButton->setText( tr(
"Zoom To Feature(s)" ) );
162 mZoomToFeatureButton->setToolTip( tr(
"Zoom to selected child feature(s)" ) );
163 mZoomToFeatureButton->setObjectName( QStringLiteral(
"mZoomToFeatureButton" ) );
164 buttonLayout->addWidget( mZoomToFeatureButton );
166 buttonLayout->addItem(
new QSpacerItem( 0, 0, QSizePolicy::Expanding ) );
168 mFormViewButton =
new QToolButton(
this );
169 mFormViewButton->setText( tr(
"Form View" ) );
170 mFormViewButton->setToolTip( tr(
"Switch to form view" ) );
172 mFormViewButton->setCheckable(
true );
174 buttonLayout->addWidget( mFormViewButton );
176 mTableViewButton =
new QToolButton(
this );
177 mTableViewButton->setText( tr(
"Table View" ) );
178 mTableViewButton->setToolTip( tr(
"Switch to table view" ) );
180 mTableViewButton->setCheckable(
true );
182 buttonLayout->addWidget( mTableViewButton );
184 mViewModeButtonGroup =
new QButtonGroup(
this );
188 mMultiEditInfoLabel =
new QLabel(
this );
189 buttonLayout->addWidget( mMultiEditInfoLabel );
192 rootLayout->addLayout( buttonLayout );
195 mStackedWidget =
new QStackedWidget(
this );
199 mDualView->
setView( mViewMode );
203 mMultiEditStackedWidgetPage =
new QWidget(
this );
205 QVBoxLayout *vBoxLayout =
new QVBoxLayout();
206 vBoxLayout->setContentsMargins( 0, 0, 0, 0 );
208 mMultiEditTreeWidget =
new QTreeWidget(
this );
209 mMultiEditTreeWidget->setHeaderHidden(
true );
210 mMultiEditTreeWidget->setSelectionMode( QTreeWidget::ExtendedSelection );
211 vBoxLayout->addWidget( mMultiEditTreeWidget );
213 mMultiEditStackedWidgetPage->setLayout( vBoxLayout );
215 mStackedWidget->addWidget( mMultiEditStackedWidgetPage );
217 mStackedWidget->addWidget( mDualView );
219 rootLayout->addWidget( mStackedWidget );
221 connect( mViewModeButtonGroup, &QButtonGroup::idClicked,
223 connect( mToggleEditingButton, &QAbstractButton::clicked,
this, &QgsRelationEditorWidget::toggleEditing );
225 connect( mAddFeatureButton, &QAbstractButton::clicked,
this, &QgsRelationEditorWidget::addFeature );
226 connect( mAddFeatureGeometryButton, &QAbstractButton::clicked,
this, &QgsRelationEditorWidget::addFeatureGeometry );
232 connect( mMultiEditTreeWidget, &QTreeWidget::itemSelectionChanged,
this, &QgsRelationEditorWidget::multiEditItemSelectionChanged );
237 setLayout( rootLayout );
251 mFeatureSelectionMgr =
new QgsFilteredSelectionManager( layer, request, mDualView );
261 text = tr(
"Add Point Child Feature" );
266 text = tr(
"Add Line Child Feature" );
271 text = tr(
"Add Polygon Child Feature" );
274 mAddFeatureGeometryButton->setIcon( icon );
275 mAddFeatureGeometryButton->setText( text );
276 mAddFeatureGeometryButton->setToolTip( text );
288 mMapToolDigitize->
setButton( mAddFeatureGeometryButton );
300void QgsRelationEditorWidget::updateButtons()
302 bool toggleEditingButtonEnabled =
false;
304 bool canAddGeometry =
false;
305 bool canRemove =
false;
306 bool canEdit =
false;
307 bool canLink =
false;
308 bool canUnlink =
false;
309 bool spatial =
false;
333 const bool selectionNotEmpty = mFeatureSelectionMgr ? mFeatureSelectionMgr->
selectedFeatureCount() :
false;
336 const bool multieditLinkedChildSelected = ! selectedChildFeatureIds().isEmpty();
338 canAddGeometry =
false;
340 canRemove = canRemove && multieditLinkedChildSelected;
344 canUnlink = canUnlink && multieditLinkedChildSelected;
348 canRemove = canRemove && selectionNotEmpty;
349 canUnlink = canUnlink && selectionNotEmpty;
352 mToggleEditingButton->setEnabled( toggleEditingButtonEnabled );
353 mAddFeatureButton->setEnabled( canAdd );
354 mAddFeatureGeometryButton->setEnabled( canAddGeometry );
355 mDuplicateFeatureButton->setEnabled( canEdit && selectionNotEmpty );
356 mLinkFeatureButton->setEnabled( canLink );
357 mDeleteFeatureButton->setEnabled( canRemove );
358 mUnlinkFeatureButton->setEnabled( canUnlink );
359 mZoomToFeatureButton->setEnabled( selectionNotEmpty );
360 mToggleEditingButton->setChecked( canEdit );
361 mSaveEditsButton->setEnabled( canEdit || canLink || canUnlink );
375void QgsRelationEditorWidget::addFeature()
382 mMultiEditTreeWidget->blockSignals(
true );
383 mMultiEdit1NJustAddedIds = addedFeatures;
384 QTreeWidgetItemIterator treeWidgetItemIterator( mMultiEditTreeWidget );
385 while ( *treeWidgetItemIterator )
387 if ( ( *treeWidgetItemIterator )->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() !=
static_cast<int>( MultiEditFeatureType::Child ) )
389 ++treeWidgetItemIterator;
393 if ( addedFeatures.contains( ( *treeWidgetItemIterator )->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt() ) )
394 ( *treeWidgetItemIterator )->setSelected(
true );
396 ++treeWidgetItemIterator;
398 mMultiEditTreeWidget->blockSignals(
false );
404void QgsRelationEditorWidget::addFeatureGeometry()
408 QgsLogger::warning( tr(
"Adding a geometry feature is not supported in multiple edit mode" ) );
418 mMapToolDigitize->
setLayer( layer );
421 if ( window()->objectName() != QLatin1String(
"QgisApp" ) )
423 window()->setVisible(
false );
425 setMapTool( mMapToolDigitize );
436 const QString msg = tr(
"Digitize the geometry for the new feature on layer %1. Press <ESC> to cancel." )
437 .arg( layer->
name() );
439 lMainMessageBar->pushItem( mMessageBarItem );
443void QgsRelationEditorWidget::onDigitizingCompleted(
const QgsFeature &feature )
446 digitizingFinished();
449void QgsRelationEditorWidget::multiEditItemSelectionChanged()
451 const QList<QTreeWidgetItem *> selectedItems = mMultiEditTreeWidget->selectedItems();
455 if ( selectedItems.size() == 1
456 && mMultiEditPreviousSelectedItems.size() <= 1 )
458 if ( selectedItems.first()->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() ==
static_cast<int>( MultiEditFeatureType::Child ) )
460 mMultiEditTreeWidget->blockSignals(
true );
462 const QgsFeatureId featureIdSelectedItem = selectedItems.first()->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt();
464 QTreeWidgetItemIterator treeWidgetItemIterator( mMultiEditTreeWidget );
465 while ( *treeWidgetItemIterator )
467 if ( ( *treeWidgetItemIterator )->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() !=
static_cast<int>( MultiEditFeatureType::Child ) )
469 ++treeWidgetItemIterator;
473 const QgsFeatureId featureIdCurrentItem = ( *treeWidgetItemIterator )->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt();
476 if ( featureIdSelectedItem == featureIdCurrentItem )
477 ( *treeWidgetItemIterator )->setSelected(
true );
481 if ( ! mMultiEdit1NJustAddedIds.contains( featureIdSelectedItem ) )
484 if ( mMultiEdit1NJustAddedIds.contains( featureIdCurrentItem ) )
485 ( *treeWidgetItemIterator )->setSelected(
true );
488 ++treeWidgetItemIterator;
490 mMultiEditTreeWidget->blockSignals(
false );
493 mMultiEditPreviousSelectedItems = selectedItems;
497void QgsRelationEditorWidget::toggleEditing(
bool state )
515 updateUiSingleEdit();
520 mButtonsVisibility = buttons;
527 if ( mLinkFeatureButton->isVisible() )
529 if ( mUnlinkFeatureButton->isVisible() )
531 if ( mSaveEditsButton->isVisible() )
533 if ( mAddFeatureButton->isVisible() )
535 if ( mDuplicateFeatureButton->isVisible() )
537 if ( mDeleteFeatureButton->isVisible() )
539 if ( mZoomToFeatureButton->isVisible() )
553 QAction *qAction =
nullptr;
558 connect( qAction, &QAction::triggered,
this, [
this, fid]() {
deleteFeature( fid ); } );
564 connect( qAction, &QAction::triggered,
this, [
this, fid]() {
unlinkFeature( fid ); } );
569void QgsRelationEditorWidget::setMapTool(
QgsMapTool *mapTool )
574 mapCanvas->window()->raise();
575 mapCanvas->activateWindow();
576 mapCanvas->setFocus();
580void QgsRelationEditorWidget::unsetMapTool()
590QgsFeatureIds QgsRelationEditorWidget::selectedChildFeatureIds()
const
595 for ( QTreeWidgetItem *treeWidgetItem : mMultiEditTreeWidget->selectedItems() )
597 if (
static_cast<MultiEditFeatureType
>( treeWidgetItem->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ) ).toInt() ) != MultiEditFeatureType::Child )
600 featureIds.insert( treeWidgetItem->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toLongLong() );
608void QgsRelationEditorWidget::updateUiSingleEdit()
610 mFormViewButton->setVisible(
true );
611 mTableViewButton->setVisible(
true );
612 mMultiEditInfoLabel->setVisible(
false );
614 mStackedWidget->setCurrentWidget( mDualView );
627 filters << filter.prepend(
'(' ).append(
')' );
647 initDualView( layer, request );
651 mFeatureSelectionMgr =
new QgsFilteredSelectionManager( layer, request, mDualView );
662void QgsRelationEditorWidget::updateUiMultiEdit()
664 mFormViewButton->setVisible(
false );
665 mTableViewButton->setVisible(
false );
666 mMultiEditInfoLabel->setVisible(
true );
668 mStackedWidget->setCurrentWidget( mMultiEditStackedWidgetPage ) ;
670 QList<QTreeWidgetItem *> parentTreeWidgetItems;
673 QMultiMap<QTreeWidgetItem *, QgsFeatureId> multimapChildFeatures;
675 mMultiEditTreeWidget->clear();
678 QTreeWidgetItem *treeWidgetItem = createMultiEditTreeWidgetItem( featureParent,
mRelation.
referencedLayer(), MultiEditFeatureType::Parent );
681 treeWidgetItem->setFlags( Qt::ItemIsEnabled );
683 parentTreeWidgetItems.append( treeWidgetItem );
689 while ( featureIterator.
nextFeature( featureChild ) )
696 while ( featureIteratorFinalChild.
nextFeature( featureChildChild ) )
698 QTreeWidgetItem *treeWidgetItemChild = createMultiEditTreeWidgetItem( featureChildChild,
mNmRelation.
referencedLayer(), MultiEditFeatureType::Child );
700 treeWidgetItem->addChild( treeWidgetItemChild );
702 featureIdsMixedValues.insert( featureChildChild.
id() );
703 multimapChildFeatures.insert( treeWidgetItem, featureChildChild.
id() );
708 QTreeWidgetItem *treeWidgetItemChild = createMultiEditTreeWidgetItem( featureChild,
mRelation.
referencingLayer(), MultiEditFeatureType::Child );
709 treeWidgetItem->addChild( treeWidgetItemChild );
711 featureIdsMixedValues.insert( featureChild.
id() );
715 mMultiEditTreeWidget->addTopLevelItem( treeWidgetItem );
716 treeWidgetItem->setExpanded(
true );
732 QgsFeatureIds::iterator iterator = featureIdsMixedValues.begin();
733 while ( iterator != featureIdsMixedValues.end() )
735 bool mixedValues =
false;
736 for ( QTreeWidgetItem *parentTreeWidgetItem : parentTreeWidgetItems )
738 if ( ! multimapChildFeatures.values( parentTreeWidgetItem ).contains( *iterator ) )
747 iterator = featureIdsMixedValues.erase( iterator );
756 if ( featureIdsMixedValues.isEmpty() )
759 mMultiEditInfoLabel->setPixmap( icon.pixmap( mMultiEditInfoLabel->height(),
760 mMultiEditInfoLabel->height() ) );
761 mMultiEditInfoLabel->setToolTip( tr(
"All features in selection have equal relations" ) );
766 mMultiEditInfoLabel->setPixmap( icon.pixmap( mMultiEditInfoLabel->height(),
767 mMultiEditInfoLabel->height() ) );
768 mMultiEditInfoLabel->setToolTip( tr(
"Some features in selection have different relations" ) );
771 QFont fontItalic = mMultiEditTreeWidget->font();
772 fontItalic.setItalic(
true );
773 for ( QTreeWidgetItem *parentTreeWidgetItem : parentTreeWidgetItems )
775 for (
int childIndex = 0; childIndex < parentTreeWidgetItem->childCount(); ++childIndex )
777 QTreeWidgetItem *childItem = parentTreeWidgetItem->child( childIndex );
778 const QgsFeatureId featureIdCurrentItem = childItem->data( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ) ).toInt();
779 if ( featureIdsMixedValues.contains( featureIdCurrentItem ) )
780 childItem->setFont( 0, fontItalic );
786QTreeWidgetItem *QgsRelationEditorWidget::createMultiEditTreeWidgetItem(
const QgsFeature &feature,
QgsVectorLayer *layer, MultiEditFeatureType type )
788 QTreeWidgetItem *treeWidgetItem =
new QTreeWidgetItem();
791 treeWidgetItem->setData( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureType ),
static_cast<int>( type ) );
792 treeWidgetItem->setData( 0,
static_cast<int>( MultiEditTreeWidgetRole::FeatureId ),
feature.
id() );
793 return treeWidgetItem;
796void QgsRelationEditorWidget::onDigitizingCanceled( )
798 digitizingFinished();
801void QgsRelationEditorWidget::digitizingFinished( )
803 window()->setVisible(
true );
805 window()->activateWindow();
809void QgsRelationEditorWidget::mapToolDeactivated()
815 mMessageBarItem =
nullptr;
821 {
"show_first_feature", mShowFirstFeature},
822 {
"allow_add_child_feature_with_no_geometry", mAllowAddChildFeatureWithNoGeometry }
829 mShowFirstFeature =
config.value( QStringLiteral(
"show_first_feature" ),
true ).toBool();
830 mAllowAddChildFeatureWithNoGeometry =
config.value( QStringLiteral(
"allow_add_child_feature_with_no_geometry" ),
false ).toBool();
836 Q_UNUSED( newRelation );
837 Q_UNUSED( newFeature );
866 Q_UNUSED( newRelation );
867 Q_UNUSED( newNmRelation );
901 return mFeatureSelectionMgr;
906 const QgsFeatureIds selectedFids = selectedChildFeatureIds();
922 const QgsFeatureIds selectedFids = selectedChildFeatureIds();
949 QgsRelationEditorWidget::Buttons buttons;
961 {
"show_first_feature", mShowFirstFeature->isChecked()},
962 {
"allow_add_child_feature_with_no_geometry", mAllowAddChildFeatureWithNoGeometry->isChecked()}
977 mShowFirstFeature->setChecked(
config.value( QStringLiteral(
"show_first_feature" ),
true ).toBool() );
978 mAllowAddChildFeatureWithNoGeometry->setChecked(
config.value( QStringLiteral(
"allow_add_child_feature_with_no_geometry" ),
false ).toBool() );
993 return QStringLiteral(
"relation_editor" );
998 return QObject::tr(
"Relation Editor" );
void reset(T *p=nullptr)
Will reset the managed pointer to p.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
This class 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.
QgsMessageBar * mainMessageBar()
Returns the main message bar.
QgsVectorLayer * layer() const
Returns the layer this model uses as backend.
virtual void loadLayer()
Loads the layer into the model Preferably to be called, before using this model as source for any oth...
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...
void setFeatureSelectionManager(QgsIFeatureSelectionManager *featureSelectionManager)
Set the feature selection model.
void init(QgsVectorLayer *layer, QgsMapCanvas *mapCanvas, const QgsFeatureRequest &request=QgsFeatureRequest(), const QgsAttributeEditorContext &context=QgsAttributeEditorContext(), bool loadFeatures=true, bool showFirstFeature=true)
Has to be called to initialize the dual view.
void setRequest(const QgsFeatureRequest &request)
Set the request.
void parentFormValueChanged(const QString &attribute, const QVariant &value)
Called in embedded forms when an attribute value in the parent form has changed.
QgsAttributeTableModel * masterModel() const
Returns the model which has the information about all features (not only filtered)
void setView(ViewMode view)
Change the current view mode.
QString expression() const
Returns the original, unmodified expression string.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsExpression * filterExpression() const
Returns the filter expression (if set).
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 zoomToFeatureIds(QgsVectorLayer *layer, const QgsFeatureIds &ids)
Set canvas extent to the bounding box of a set of features.
void editingStopped()
Emitted when edited changes have been successfully written to the data provider.
void editingStarted()
Emitted when editing on this layer has started.
bool popWidget(QgsMessageBarItem *item)
Remove the specified item from the bar, and display the next most recent one in the stack.
static QgsMessageBarItem * createMessage(const QString &text, QWidget *parent=nullptr)
Creates message bar item widget containing a message text to be displayed on the bar.
QgsFeatureRequest getReferencedFeatureRequest(const QgsAttributes &attributes) const
Creates a request to return the feature on the referenced (parent) layer which is referenced by the p...
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...
int selectedFeatureCount() override
Returns the number of features that are selected in this layer.
const QgsFeatureIds & selectedFeatureIds() const override
Returns reference to identifiers of selected features.
static QString getFeatureDisplayString(const QgsVectorLayer *layer, const QgsFeature &feature)
Represents a vector layer which manages a vector based data sets.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
bool isEditable() const FINAL
Returns true if the provider is in editing mode.
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.
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