Skip to content

Commit 93d9700

Browse files
committedJul 12, 2020
Capture copies in lambda
1 parent 82f36c0 commit 93d9700

File tree

6 files changed

+50
-17
lines changed

6 files changed

+50
-17
lines changed
 

‎python/core/auto_generated/qgsabstractdatabaseproviderconnection.sip.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ This information is calculated from the geometry columns types.
235235
SpatialIndexExists,
236236
DeleteSpatialIndex,
237237
DeleteField,
238+
DeleteFieldCascade,
238239
AddField,
239240
};
240241

@@ -374,6 +375,8 @@ Raises a QgsProviderConnectionException if any errors are encountered.
374375
it is responsibility of the caller to handle open layers and registry entries.
375376

376377
:raises :: py:class:`QgsProviderConnectionException`
378+
379+
.. versionadded:: 3.16
377380
%End
378381

379382
virtual void addField( const QgsField &field, const QString &schema, const QString &tableName ) const throw( QgsProviderConnectionException );
@@ -390,6 +393,8 @@ Raises a QgsProviderConnectionException if any errors are encountered.
390393
it is responsibility of the caller to handle open layers and registry entries.
391394

392395
:raises :: py:class:`QgsProviderConnectionException`
396+
397+
.. versionadded:: 3.16
393398
%End
394399

395400

‎src/app/browser/qgsinbuiltdataitemproviders.cpp

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -715,36 +715,42 @@ void QgsFieldsItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *me
715715
if ( conn && conn->capabilities().testFlag( QgsAbstractDatabaseProviderConnection::Capability::AddField ) )
716716
{
717717
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 ]
719725
{
720-
std::unique_ptr<QgsVectorLayer> layer { fieldsItem->layer( ) };
726+
std::unique_ptr<QgsVectorLayer> layer { itemLayer };
721727
if ( layer )
722728
{
723729
QgsAddAttrDialog dialog( layer.get(), menu );
724730
if ( dialog.exec() == QDialog::Accepted )
725731
{
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, {} ) ) };
727733
try
728734
{
729-
conn2->addField( dialog.field(), fieldsItem->schema(), fieldsItem->tableName() );
730-
item->refresh();
735+
conn2->addField( dialog.field(), schema, tableName );
736+
// FIXME!!! item->refresh();
731737
}
732738
catch ( const QgsProviderConnectionException &ex )
733739
{
734740
if ( context.messageBar() )
735741
{
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() ) );
737743
}
738744
else
739745
{
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() ) );
741747
}
742748
}
743749
}
744750
}
745751
else
746752
{
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 ) };
748754
if ( context.messageBar() )
749755
{
750756
context.messageBar()->pushCritical( tr( "Add Field" ), message );
@@ -787,25 +793,42 @@ void QgsFieldItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu *men
787793
if ( conn && conn->capabilities().testFlag( QgsAbstractDatabaseProviderConnection::Capability::DeleteField ) )
788794
{
789795
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 ]
791803
{
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 )
793816
{
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, {} ) ) };
795818
try
796819
{
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();
799822
}
800823
catch ( const QgsProviderConnectionException &ex )
801824
{
802825
if ( context.messageBar() )
803826
{
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() ) );
805828
}
806829
else
807830
{
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() ) );
809832
}
810833
}
811834
}

‎src/core/providers/ogr/qgsogrdataitems.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ QgsOgrLayerItem::QgsOgrLayerItem( QgsDataItem *parent,
5757
mIsSubLayer = isSubLayer;
5858
mToolTip = uri;
5959
const bool isIndex { QRegularExpression( R"(=idx_[^_]+_[^_]+.*$)" ).match( uri ).hasMatch() };
60-
setState( ( driverName == QStringLiteral( "SQLite" ) && ! isIndex ) ? NotPopulated : Populated ); // children are not expected except for sqlite
60+
setState( ( driverName == QStringLiteral( "SQLite" ) && ! isIndex ) ? NotPopulated : Populated ); // children are accepted except for sqlite
6161
}
6262

6363

‎src/core/qgsabstractdatabaseproviderconnection.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,8 @@ class CORE_EXPORT QgsAbstractDatabaseProviderConnection : public QgsAbstractProv
294294
SpatialIndexExists = 1 << 17, //!< The connection can determine if a spatial index exists
295295
DeleteSpatialIndex = 1 << 18, //!< The connection can delete spatial indices for tables
296296
DeleteField = 1 << 19, //!< Can delete an existing field/column
297-
AddField = 1 << 20, //!< Can add a new field/column
297+
DeleteFieldCascade = 1 << 20, //!< Can delete an existing field/column with cascade
298+
AddField = 1 << 21, //!< Can add a new field/column
298299
};
299300

300301
Q_ENUM( Capability )
@@ -403,6 +404,7 @@ class CORE_EXPORT QgsAbstractDatabaseProviderConnection : public QgsAbstractProv
403404
* \param force if TRUE, a DROP CASCADE will drop all related objects
404405
* \note it is responsibility of the caller to handle open layers and registry entries.
405406
* \throws QgsProviderConnectionException
407+
* \since QGIS 3.16
406408
*/
407409
virtual void deleteField( const QString &fieldName, const QString &schema, const QString &tableName, bool force = false ) const SIP_THROW( QgsProviderConnectionException );
408410

@@ -414,6 +416,7 @@ class CORE_EXPORT QgsAbstractDatabaseProviderConnection : public QgsAbstractProv
414416
* \param tableName name of the table
415417
* \note it is responsibility of the caller to handle open layers and registry entries.
416418
* \throws QgsProviderConnectionException
419+
* \since QGIS 3.16
417420
*/
418421
virtual void addField( const QgsField &field, const QString &schema, const QString &tableName ) const SIP_THROW( QgsProviderConnectionException );
419422

‎src/providers/mssql/qgsmssqlproviderconnection.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ void QgsMssqlProviderConnection::setDefaultCapabilities()
8585
Capability::Spatial,
8686
Capability::TableExists,
8787
Capability::DeleteField,
88+
Capability::DeleteFieldCascade,
8889
Capability::AddField
8990
};
9091
}

‎src/providers/postgres/qgspostgresproviderconnection.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ void QgsPostgresProviderConnection::setDefaultCapabilities()
6969
Capability::SpatialIndexExists,
7070
Capability::DeleteSpatialIndex,
7171
Capability::DeleteField,
72+
Capability::DeleteFieldCascade,
7273
Capability::AddField
7374
};
7475
}

0 commit comments

Comments
 (0)
Please sign in to comment.