@@ -715,36 +715,42 @@ void QgsFieldsItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *me
715
715
if ( conn && conn->capabilities ().testFlag ( QgsAbstractDatabaseProviderConnection::Capability::AddField ) )
716
716
{
717
717
QAction *addColumnAction = new QAction ( tr ( " Add New Field…" ), menu );
718
- connect ( addColumnAction, &QAction::triggered, this , [ = ]
718
+ const QString itemName { item->name () };
719
+ const QString tableName { fieldsItem->name () };
720
+ const QString schema { fieldsItem->schema () };
721
+ QgsVectorLayer *itemLayer { fieldsItem->layer ( ) };
722
+ const QString connectionUri { fieldsItem->connectionUri () };
723
+
724
+ connect ( addColumnAction, &QAction::triggered, this , [ md, connectionUri, itemLayer, schema, tableName, context, menu ]
719
725
{
720
- std::unique_ptr<QgsVectorLayer> layer { fieldsItem-> layer ( ) };
726
+ std::unique_ptr<QgsVectorLayer> layer { itemLayer };
721
727
if ( layer )
722
728
{
723
729
QgsAddAttrDialog dialog ( layer.get (), menu );
724
730
if ( dialog.exec () == QDialog::Accepted )
725
731
{
726
- std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn2 { static_cast <QgsAbstractDatabaseProviderConnection *>( md->createConnection ( fieldsItem-> connectionUri () , {} ) ) };
732
+ std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn2 { static_cast <QgsAbstractDatabaseProviderConnection *>( md->createConnection ( connectionUri, {} ) ) };
727
733
try
728
734
{
729
- conn2->addField ( dialog.field (), fieldsItem-> schema (), fieldsItem-> tableName () );
730
- item->refresh ();
735
+ conn2->addField ( dialog.field (), schema, tableName );
736
+ // FIXME!!! item->refresh();
731
737
}
732
738
catch ( const QgsProviderConnectionException &ex )
733
739
{
734
740
if ( context.messageBar () )
735
741
{
736
- context.messageBar ()->pushCritical ( tr ( " New Field" ), tr ( " Failed to add the new field to '%1': %2" ).arg ( fieldsItem-> tableName () , ex.what () ) );
742
+ context.messageBar ()->pushCritical ( tr ( " New Field" ), tr ( " Failed to add the new field to '%1': %2" ).arg ( tableName, ex.what () ) );
737
743
}
738
744
else
739
745
{
740
- QMessageBox::critical ( menu, tr ( " New Field" ), tr ( " Failed to a add new field to '%1': %2" ).arg ( fieldsItem-> tableName () , ex.what () ) );
746
+ QMessageBox::critical ( menu, tr ( " New Field" ), tr ( " Failed to a add new field to '%1': %2" ).arg ( tableName, ex.what () ) );
741
747
}
742
748
}
743
749
}
744
750
}
745
751
else
746
752
{
747
- const QString message { tr ( " Failed to create layer '%1'. Check application logs and user permissions." ).arg ( fieldsItem-> tableName () ) };
753
+ const QString message { tr ( " Failed to create layer '%1'. Check application logs and user permissions." ).arg ( tableName ) };
748
754
if ( context.messageBar () )
749
755
{
750
756
context.messageBar ()->pushCritical ( tr ( " Add Field" ), message );
@@ -787,25 +793,42 @@ void QgsFieldItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *men
787
793
if ( conn && conn->capabilities ().testFlag ( QgsAbstractDatabaseProviderConnection::Capability::DeleteField ) )
788
794
{
789
795
QAction *deleteFieldAction = new QAction ( tr ( " Delete Field…" ), menu );
790
- connect ( deleteFieldAction, &QAction::triggered, this , [ = ]
796
+ const bool supportsCascade { conn->capabilities ().testFlag ( QgsAbstractDatabaseProviderConnection::Capability::DeleteFieldCascade ) };
797
+ const QString itemName { item->name () };
798
+ const QString tableName { fieldsItem->name () };
799
+ const QString schema { fieldsItem->schema () };
800
+ const QString connectionUri { fieldsItem->connectionUri () };
801
+
802
+ connect ( deleteFieldAction, &QAction::triggered, this , [ md, itemName, connectionUri, tableName, schema, context, supportsCascade, menu ]
791
803
{
792
- if ( QMessageBox::warning ( menu, tr ( " Delete Field" ), tr ( " Delete '%1' permanently (with CASCADE)?" ).arg ( item->name () ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Ok )
804
+ // Confirmation dialog
805
+ QMessageBox msgbox{QMessageBox::Icon::Question, tr ( " Delete Field" ), tr ( " Delete '%1' permanently?" ).arg ( itemName ), QMessageBox::Ok | QMessageBox::Cancel };
806
+ QCheckBox *cb = new QCheckBox ( tr ( " Delete all related objects (CASCADE)?" ) );
807
+ msgbox.setCheckBox ( cb );
808
+ msgbox.setDefaultButton ( QMessageBox::Cancel );
809
+
810
+ if ( ! supportsCascade )
811
+ {
812
+ cb->hide ();
813
+ }
814
+
815
+ if ( msgbox.exec () == QMessageBox::Ok )
793
816
{
794
- std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn2 { static_cast <QgsAbstractDatabaseProviderConnection *>( md->createConnection ( fieldsItem-> connectionUri () , {} ) ) };
817
+ std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn2 { static_cast <QgsAbstractDatabaseProviderConnection *>( md->createConnection ( connectionUri, {} ) ) };
795
818
try
796
819
{
797
- conn2->deleteField ( item-> name (), fieldsItem-> schema (), fieldsItem-> tableName (), true );
798
- fieldsItem->refresh ();
820
+ conn2->deleteField ( itemName, schema, tableName, supportsCascade && cb-> isChecked () );
821
+ // FIXME!!! fieldsItem->refresh();
799
822
}
800
823
catch ( const QgsProviderConnectionException &ex )
801
824
{
802
825
if ( context.messageBar () )
803
826
{
804
- context.messageBar ()->pushCritical ( tr ( " Delete Field" ), tr ( " Failed to delete field '%1': %2" ).arg ( item-> name () , ex.what () ) );
827
+ context.messageBar ()->pushCritical ( tr ( " Delete Field" ), tr ( " Failed to delete field '%1': %2" ).arg ( itemName , ex.what () ) );
805
828
}
806
829
else
807
830
{
808
- QMessageBox::critical ( menu, tr ( " Delete Field" ), tr ( " Failed to delete field '%1': %2" ).arg ( item-> name () , ex.what () ) );
831
+ QMessageBox::critical ( menu, tr ( " Delete Field" ), tr ( " Failed to delete field '%1': %2" ).arg ( itemName , ex.what () ) );
809
832
}
810
833
}
811
834
}
0 commit comments