QgsSelectByFormDialog::QgsSelectByFormDialog( QgsVectorLayer *layer, const QgsAttributeEditorContext &context, QWidget *parent, Qt::WindowFlags fl ) : QDialog( parent, fl ) , mLayer( layer ) , mMessageBar( nullptr ) { QgsAttributeEditorContext dlgContext = context; dlgContext.setFormMode( QgsAttributeEditorContext::StandaloneDialog ); dlgContext.setAllowCustomUi( false ); mForm = new QgsAttributeForm( layer, QgsFeature(), dlgContext, this ); mForm->setMode( QgsAttributeForm::SearchMode ); QVBoxLayout *vLayout = new QVBoxLayout(); vLayout->setMargin( 0 ); vLayout->setContentsMargins( 0, 0, 0, 0 ); setLayout( vLayout ); vLayout->addWidget( mForm ); connect( mForm, &QgsAttributeForm::closed, this, &QWidget::close ); QgsSettings settings; restoreGeometry( settings.value( QStringLiteral( "Windows/SelectByForm/geometry" ) ).toByteArray() ); setWindowTitle( tr( "Select features by value" ) ); }
void QgsAttributeDialog::init( QgsVectorLayer *layer, QgsFeature *feature, const QgsAttributeEditorContext &context, bool showDialogButtons ) { QgsAttributeEditorContext trackedContext = context; setWindowTitle( tr( "%1 - Feature Attributes" ).arg( layer->name() ) ); setLayout( new QGridLayout() ); layout()->setMargin( 0 ); mTrackedVectorLayerTools.setVectorLayerTools( trackedContext.vectorLayerTools() ); trackedContext.setVectorLayerTools( &mTrackedVectorLayerTools ); if ( showDialogButtons ) trackedContext.setFormMode( QgsAttributeEditorContext::StandaloneDialog ); mAttributeForm = new QgsAttributeForm( layer, *feature, trackedContext, this ); mAttributeForm->disconnectButtonBox(); layout()->addWidget( mAttributeForm ); QDialogButtonBox *buttonBox = mAttributeForm->findChild<QDialogButtonBox *>(); connect( buttonBox, &QDialogButtonBox::rejected, this, &QgsAttributeDialog::reject ); connect( buttonBox, &QDialogButtonBox::accepted, this, &QgsAttributeDialog::accept ); connect( layer, &QObject::destroyed, this, &QWidget::close ); mMenu = new QgsActionMenu( layer, mAttributeForm->feature(), QStringLiteral( "Feature" ), this ); if ( !mMenu->actions().isEmpty() ) { QMenuBar *menuBar = new QMenuBar( this ); menuBar->addMenu( mMenu ); layout()->setMenuBar( menuBar ); } restoreGeometry(); focusNextChild(); }
QgsAttributeDialog *QgsFeatureAction::newDialog( bool cloneFeature ) { QgsFeature *f = cloneFeature ? new QgsFeature( *mFeature ) : mFeature; QgsAttributeEditorContext context; QgsDistanceArea myDa; myDa.setSourceCrs( mLayer->crs() ); myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); context.setDistanceArea( myDa ); context.setVectorLayerTools( QgisApp::instance()->vectorLayerTools() ); context.setFormMode( QgsAttributeEditorContext::StandaloneDialog ); QgsAttributeDialog *dialog = new QgsAttributeDialog( mLayer, f, cloneFeature, parentWidget(), true, context ); dialog->setWindowFlags( dialog->windowFlags() | Qt::Tool ); dialog->setObjectName( QStringLiteral( "featureactiondlg:%1:%2" ).arg( mLayer->id() ).arg( f->id() ) ); QList<QgsAction> actions = mLayer->actions()->actions( QStringLiteral( "Feature" ) ); if ( !actions.isEmpty() ) { dialog->setContextMenuPolicy( Qt::ActionsContextMenu ); QAction *a = new QAction( tr( "Run actions" ), dialog ); a->setEnabled( false ); dialog->addAction( a ); Q_FOREACH ( const QgsAction &action, actions ) { if ( !action.runable() ) continue; QgsFeature &feat = const_cast<QgsFeature &>( *dialog->feature() ); QgsFeatureAction *a = new QgsFeatureAction( action.name(), feat, mLayer, action.id(), -1, dialog ); dialog->addAction( a ); connect( a, &QAction::triggered, a, &QgsFeatureAction::execute ); QAbstractButton *pb = dialog->findChild<QAbstractButton *>( action.name() ); if ( pb ) connect( pb, &QAbstractButton::clicked, a, &QgsFeatureAction::execute ); } }