mirror of
https://github.com/qgis/QGIS.git
synced 2025-03-04 00:30:59 -05:00
Filter selected feature to the related feature parent
This commit is contained in:
parent
3c24de55e1
commit
1e2abf9b59
@ -21,7 +21,7 @@ QgsVectorLayerSelectionManager::QgsVectorLayerSelectionManager( QgsVectorLayer *
|
|||||||
: QgsIFeatureSelectionManager( parent )
|
: QgsIFeatureSelectionManager( parent )
|
||||||
, mLayer( layer )
|
, mLayer( layer )
|
||||||
{
|
{
|
||||||
connect( mLayer, &QgsVectorLayer::selectionChanged, this, &QgsVectorLayerSelectionManager::selectionChanged );
|
connect( mLayer, &QgsVectorLayer::selectionChanged, this, &QgsVectorLayerSelectionManager::onSelectionChanged );
|
||||||
}
|
}
|
||||||
|
|
||||||
int QgsVectorLayerSelectionManager::selectedFeatureCount()
|
int QgsVectorLayerSelectionManager::selectedFeatureCount()
|
||||||
@ -48,3 +48,13 @@ const QgsFeatureIds &QgsVectorLayerSelectionManager::selectedFeatureIds() const
|
|||||||
{
|
{
|
||||||
return mLayer->selectedFeatureIds();
|
return mLayer->selectedFeatureIds();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QgsVectorLayer *QgsVectorLayerSelectionManager::layer() const
|
||||||
|
{
|
||||||
|
return mLayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QgsVectorLayerSelectionManager::onSelectionChanged( const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect )
|
||||||
|
{
|
||||||
|
emit selectionChanged( selected, deselected, clearAndSelect );
|
||||||
|
}
|
||||||
|
@ -41,6 +41,10 @@ class GUI_EXPORT QgsVectorLayerSelectionManager : public QgsIFeatureSelectionMan
|
|||||||
void deselect( const QgsFeatureIds &ids ) override;
|
void deselect( const QgsFeatureIds &ids ) override;
|
||||||
void setSelectedFeatures( const QgsFeatureIds &ids ) override;
|
void setSelectedFeatures( const QgsFeatureIds &ids ) override;
|
||||||
const QgsFeatureIds &selectedFeatureIds() const override;
|
const QgsFeatureIds &selectedFeatureIds() const override;
|
||||||
|
QgsVectorLayer *layer() const;
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
virtual void onSelectionChanged( const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QgsVectorLayer *mLayer = nullptr;
|
QgsVectorLayer *mLayer = nullptr;
|
||||||
|
@ -36,6 +36,64 @@
|
|||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
class QgsFilteredSelectionManager : public QgsVectorLayerSelectionManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QgsFilteredSelectionManager( QgsVectorLayer *layer, const QgsFeatureRequest &request, QObject *parent = nullptr )
|
||||||
|
: QgsVectorLayerSelectionManager( layer, parent )
|
||||||
|
, mRequest( request )
|
||||||
|
{
|
||||||
|
QgsFeature feature;
|
||||||
|
QgsFeatureIterator it = layer->getSelectedFeatures( mRequest );
|
||||||
|
while ( it.nextFeature( feature ) )
|
||||||
|
{
|
||||||
|
mSelectedFeatureIds << feature.id();
|
||||||
|
}
|
||||||
|
|
||||||
|
connect( layer, &QgsVectorLayer::selectionChanged, this, &QgsFilteredSelectionManager::onSelectionChanged );
|
||||||
|
}
|
||||||
|
|
||||||
|
const QgsFeatureIds &selectedFeatureIds() const override
|
||||||
|
{
|
||||||
|
return mSelectedFeatureIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int selectedFeatureCount() override
|
||||||
|
{
|
||||||
|
return mSelectedFeatureIds.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
|
||||||
|
void onSelectionChanged( const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect ) override
|
||||||
|
{
|
||||||
|
QgsFeatureIds lselected = selected;
|
||||||
|
if ( clearAndSelect )
|
||||||
|
{
|
||||||
|
mSelectedFeatureIds.clear();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for ( auto fid : deselected )
|
||||||
|
mSelectedFeatureIds.remove( fid );
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( auto fid : selected )
|
||||||
|
if ( mRequest.acceptFeature( layer()->getFeature( fid ) ) )
|
||||||
|
mSelectedFeatureIds << fid;
|
||||||
|
else
|
||||||
|
lselected.remove( fid );
|
||||||
|
|
||||||
|
emit selectionChanged( lselected, deselected, clearAndSelect );
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
QgsFeatureRequest mRequest;
|
||||||
|
QgsFeatureIds mSelectedFeatureIds;
|
||||||
|
};
|
||||||
|
|
||||||
QgsRelationEditorWidget::QgsRelationEditorWidget( QWidget *parent )
|
QgsRelationEditorWidget::QgsRelationEditorWidget( QWidget *parent )
|
||||||
: QgsCollapsibleGroupBox( parent )
|
: QgsCollapsibleGroupBox( parent )
|
||||||
{
|
{
|
||||||
@ -203,7 +261,7 @@ void QgsRelationEditorWidget::setRelationFeature( const QgsRelation &relation, c
|
|||||||
void QgsRelationEditorWidget::initDualView( QgsVectorLayer *layer, const QgsFeatureRequest &request )
|
void QgsRelationEditorWidget::initDualView( QgsVectorLayer *layer, const QgsFeatureRequest &request )
|
||||||
{
|
{
|
||||||
mDualView->init( layer, nullptr, request, mEditorContext );
|
mDualView->init( layer, nullptr, request, mEditorContext );
|
||||||
mFeatureSelectionMgr = new QgsVectorLayerSelectionManager( layer, mDualView );
|
mFeatureSelectionMgr = new QgsFilteredSelectionManager( layer, request, mDualView );
|
||||||
mDualView->setFeatureSelectionManager( mFeatureSelectionMgr );
|
mDualView->setFeatureSelectionManager( mFeatureSelectionMgr );
|
||||||
connect( mFeatureSelectionMgr, &QgsIFeatureSelectionManager::selectionChanged, this, &QgsRelationEditorWidget::updateButtons );
|
connect( mFeatureSelectionMgr, &QgsIFeatureSelectionManager::selectionChanged, this, &QgsRelationEditorWidget::updateButtons );
|
||||||
}
|
}
|
||||||
|
@ -255,6 +255,37 @@ class TestQgsRelationEditWidget(unittest.TestCase):
|
|||||||
self.assertEqual([2, 3], relation.referencingFields())
|
self.assertEqual([2, 3], relation.referencingFields())
|
||||||
self.assertEqual([0, 1], relation.referencedFields())
|
self.assertEqual([0, 1], relation.referencedFields())
|
||||||
|
|
||||||
|
def test_selection(self):
|
||||||
|
|
||||||
|
fbook = QgsFeature(self.vl_books.fields())
|
||||||
|
fbook.setAttributes([self.vl_books.dataProvider().defaultValueClause(0), 'The Hitchhiker\'s Guide to the Galaxy', 'Sputnik Editions', 1961])
|
||||||
|
self.vl_books.addFeature(fbook)
|
||||||
|
|
||||||
|
flink = QgsFeature(self.vl_link_books_authors.fields())
|
||||||
|
flink.setAttributes([fbook.id(), 5])
|
||||||
|
self.vl_link_books_authors.addFeature(flink)
|
||||||
|
|
||||||
|
self.createWrapper(self.vl_authors, '"name"=\'Douglas Adams\'')
|
||||||
|
|
||||||
|
self.zoomToButton = self.widget.findChild(QToolButton, "mDeleteFeatureButton")
|
||||||
|
self.assertTrue(self.zoomToButton)
|
||||||
|
self.assertTrue(not self.zoomToButton.isEnabled())
|
||||||
|
|
||||||
|
selectionMgr = self.widget.featureSelectionManager()
|
||||||
|
self.assertTrue(selectionMgr)
|
||||||
|
|
||||||
|
self.vl_books.select(fbook.id())
|
||||||
|
self.assertEqual([fbook.id()], selectionMgr.selectedFeatureIds())
|
||||||
|
self.assertTrue(self.zoomToButton.isEnabled())
|
||||||
|
|
||||||
|
selectionMgr.deselect([fbook.id()])
|
||||||
|
self.assertEqual([], selectionMgr.selectedFeatureIds())
|
||||||
|
self.assertTrue(not self.zoomToButton.isEnabled())
|
||||||
|
|
||||||
|
self.vl_books.select([1, fbook.id()])
|
||||||
|
self.assertEqual([fbook.id()], selectionMgr.selectedFeatureIds())
|
||||||
|
self.assertTrue(self.zoomToButton.isEnabled())
|
||||||
|
|
||||||
def startTransaction(self):
|
def startTransaction(self):
|
||||||
"""
|
"""
|
||||||
Start a new transaction and set all layers into transaction mode.
|
Start a new transaction and set all layers into transaction mode.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user