Skip to content

Commit

Permalink
do not show Edit, Duplicate and Refresh context menu items when multiple
Browse files Browse the repository at this point in the history
connection items are selected in the Browser dock (fix #31928)
  • Loading branch information
alexbruy authored and nyalldawson committed Feb 17, 2025
1 parent be5b238 commit 358408d
Show file tree
Hide file tree
Showing 11 changed files with 196 additions and 139 deletions.
17 changes: 10 additions & 7 deletions src/gui/providers/gdal/qgsgdalclouddataitemguiprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,18 @@ void QgsGdalCloudDataItemGuiProvider::populateContextMenu( QgsDataItem *item, QM
{
if ( QgsGdalCloudConnectionItem *providerItem = qobject_cast<QgsGdalCloudConnectionItem *>( item ) )
{
QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
connect( actionEdit, &QAction::triggered, this, [providerItem] { editConnection( providerItem ); } );
menu->addAction( actionEdit );
const QList<QgsGdalCloudConnectionItem *> stConnectionItems = QgsDataItem::filteredItems<QgsGdalCloudConnectionItem>( selection );
if ( stConnectionItems.size() == 1 )
{
QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
connect( actionEdit, &QAction::triggered, this, [providerItem] { editConnection( providerItem ); } );
menu->addAction( actionEdit );

QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
connect( actionDuplicate, &QAction::triggered, this, [providerItem] { duplicateConnection( providerItem ); } );
menu->addAction( actionDuplicate );
QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
connect( actionDuplicate, &QAction::triggered, this, [providerItem] { duplicateConnection( providerItem ); } );
menu->addAction( actionDuplicate );
}

const QList<QgsGdalCloudConnectionItem *> stConnectionItems = QgsDataItem::filteredItems<QgsGdalCloudConnectionItem>( selection );
QAction *actionDelete = new QAction( stConnectionItems.size() > 1 ? tr( "Remove Connections…" ) : tr( "Remove Connection…" ), menu );
connect( actionDelete, &QAction::triggered, this, [stConnectionItems, item, context] {
QgsDataItemGuiProviderUtils::deleteConnections( stConnectionItems, []( const QString &connectionName ) { QgsGdalCloudProviderConnection( QString() ).remove( connectionName ); }, context );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,19 @@ void QgsSensorThingsDataItemGuiProvider::populateContextMenu( QgsDataItem *item,
{
if ( QgsSensorThingsConnectionItem *connectionItem = qobject_cast<QgsSensorThingsConnectionItem *>( item ) )
{
QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
connect( actionEdit, &QAction::triggered, this, [connectionItem] { editConnection( connectionItem ); } );
menu->addAction( actionEdit );
const QList<QgsSensorThingsConnectionItem *> stConnectionItems = QgsDataItem::filteredItems<QgsSensorThingsConnectionItem>( selection );

QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
connect( actionDuplicate, &QAction::triggered, this, [connectionItem] { duplicateConnection( connectionItem ); } );
menu->addAction( actionDuplicate );
if ( stConnectionItems.size() == 1 )
{
QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
connect( actionEdit, &QAction::triggered, this, [connectionItem] { editConnection( connectionItem ); } );
menu->addAction( actionEdit );

QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
connect( actionDuplicate, &QAction::triggered, this, [connectionItem] { duplicateConnection( connectionItem ); } );
menu->addAction( actionDuplicate );
}

const QList<QgsSensorThingsConnectionItem *> stConnectionItems = QgsDataItem::filteredItems<QgsSensorThingsConnectionItem>( selection );
QAction *actionDelete = new QAction( stConnectionItems.size() > 1 ? tr( "Remove Connections…" ) : tr( "Remove Connection…" ), menu );
connect( actionDelete, &QAction::triggered, this, [stConnectionItems, context] {
QgsDataItemGuiProviderUtils::deleteConnections( stConnectionItems, []( const QString &connectionName ) { QgsSensorThingsProviderConnection( QString() ).remove( connectionName ); }, context );
Expand Down
17 changes: 10 additions & 7 deletions src/gui/tiledscene/qgstiledscenedataitemguiprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,18 @@ void QgsTiledSceneDataItemGuiProvider::populateContextMenu( QgsDataItem *item, Q
{
if ( QgsTiledSceneLayerItem *layerItem = qobject_cast<QgsTiledSceneLayerItem *>( item ) )
{
QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
connect( actionEdit, &QAction::triggered, this, [layerItem] { editConnection( layerItem ); } );
menu->addAction( actionEdit );
const QList<QgsTiledSceneLayerItem *> sceneConnectionItems = QgsDataItem::filteredItems<QgsTiledSceneLayerItem>( selection );
if ( sceneConnectionItems.size() == 1 )
{
QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
connect( actionEdit, &QAction::triggered, this, [layerItem] { editConnection( layerItem ); } );
menu->addAction( actionEdit );

QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
connect( actionDuplicate, &QAction::triggered, this, [layerItem] { duplicateConnection( layerItem ); } );
menu->addAction( actionDuplicate );
QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
connect( actionDuplicate, &QAction::triggered, this, [layerItem] { duplicateConnection( layerItem ); } );
menu->addAction( actionDuplicate );
}

const QList<QgsTiledSceneLayerItem *> sceneConnectionItems = QgsDataItem::filteredItems<QgsTiledSceneLayerItem>( selection );
QAction *actionDelete = new QAction( sceneConnectionItems.size() > 1 ? tr( "Remove Connections…" ) : tr( "Remove Connection…" ), menu );
connect( actionDelete, &QAction::triggered, this, [sceneConnectionItems, context] {
QgsDataItemGuiProviderUtils::deleteConnections( sceneConnectionItems, []( const QString &connectionName ) { QgsTiledSceneProviderConnection( QString() ).remove( connectionName ); }, context );
Expand Down
18 changes: 11 additions & 7 deletions src/gui/vectortile/qgsvectortiledataitemguiprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,19 @@ void QgsVectorTileDataItemGuiProvider::populateContextMenu( QgsDataItem *item, Q
{
if ( QgsVectorTileLayerItem *layerItem = qobject_cast<QgsVectorTileLayerItem *>( item ) )
{
QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
connect( actionEdit, &QAction::triggered, this, [layerItem] { editConnection( layerItem ); } );
menu->addAction( actionEdit );
const QList<QgsVectorTileLayerItem *> vtConnectionItems = QgsDataItem::filteredItems<QgsVectorTileLayerItem>( selection );

QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
connect( actionDuplicate, &QAction::triggered, this, [layerItem] { duplicateConnection( layerItem ); } );
menu->addAction( actionDuplicate );
if ( vtConnectionItems.size() == 1 )
{
QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
connect( actionEdit, &QAction::triggered, this, [layerItem] { editConnection( layerItem ); } );
menu->addAction( actionEdit );

QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
connect( actionDuplicate, &QAction::triggered, this, [layerItem] { duplicateConnection( layerItem ); } );
menu->addAction( actionDuplicate );
}

const QList<QgsVectorTileLayerItem *> vtConnectionItems = QgsDataItem::filteredItems<QgsVectorTileLayerItem>( selection );
QAction *actionDelete = new QAction( vtConnectionItems.size() > 1 ? tr( "Remove Connections…" ) : tr( "Remove Connection…" ), menu );
connect( actionDelete, &QAction::triggered, this, [vtConnectionItems, context] {
QgsDataItemGuiProviderUtils::deleteConnections( vtConnectionItems, []( const QString &connectionName ) { QgsVectorTileProviderConnection::deleteConnection( connectionName ); }, context );
Expand Down
39 changes: 23 additions & 16 deletions src/providers/arcgisrest/qgsarcgisrestdataitemguiprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,32 +49,39 @@ void QgsArcGisRestDataItemGuiProvider::populateContextMenu( QgsDataItem *item, Q
}
else if ( QgsArcGisRestConnectionItem *connectionItem = qobject_cast<QgsArcGisRestConnectionItem *>( item ) )
{
QAction *actionRefresh = new QAction( tr( "Refresh" ), menu );
connect( actionRefresh, &QAction::triggered, this, [connectionItem] { refreshConnection( connectionItem ); } );
menu->addAction( actionRefresh );
const QList<QgsArcGisRestConnectionItem *> arcgisConnectionItems = QgsDataItem::filteredItems<QgsArcGisRestConnectionItem>( selection );

menu->addSeparator();
if ( arcgisConnectionItems.size() == 1 )
{
QAction *actionRefresh = new QAction( tr( "Refresh" ), menu );
connect( actionRefresh, &QAction::triggered, this, [connectionItem] { refreshConnection( connectionItem ); } );
menu->addAction( actionRefresh );

QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
connect( actionEdit, &QAction::triggered, this, [connectionItem] { editConnection( connectionItem ); } );
menu->addAction( actionEdit );
menu->addSeparator();

QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
connect( actionDuplicate, &QAction::triggered, this, [connectionItem] { duplicateConnection( connectionItem ); } );
menu->addAction( actionDuplicate );
QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
connect( actionEdit, &QAction::triggered, this, [connectionItem] { editConnection( connectionItem ); } );
menu->addAction( actionEdit );

QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
connect( actionDuplicate, &QAction::triggered, this, [connectionItem] { duplicateConnection( connectionItem ); } );
menu->addAction( actionDuplicate );
}

const QList<QgsArcGisRestConnectionItem *> arcgisConnectionItems = QgsDataItem::filteredItems<QgsArcGisRestConnectionItem>( selection );
QAction *actionDelete = new QAction( arcgisConnectionItems.size() > 1 ? tr( "Remove Connections…" ) : tr( "Remove Connection…" ), menu );
connect( actionDelete, &QAction::triggered, this, [arcgisConnectionItems, context] {
QgsDataItemGuiProviderUtils::deleteConnections( arcgisConnectionItems, []( const QString &connectionName ) { QgsArcGisConnectionSettings::sTreeConnectionArcgis->deleteItem( connectionName ); }, context );
} );
menu->addAction( actionDelete );

QAction *viewInfo = new QAction( tr( "View Service Info" ), menu );
connect( viewInfo, &QAction::triggered, this, [=] {
QDesktopServices::openUrl( QUrl( connectionItem->url() ) );
} );
menu->addAction( viewInfo );
if ( arcgisConnectionItems.size() == 1 )
{
QAction *viewInfo = new QAction( tr( "View Service Info" ), menu );
connect( viewInfo, &QAction::triggered, this, [=] {
QDesktopServices::openUrl( QUrl( connectionItem->url() ) );
} );
menu->addAction( viewInfo );
}
}
else if ( QgsArcGisRestFolderItem *folderItem = qobject_cast<QgsArcGisRestFolderItem *>( item ) )
{
Expand Down
38 changes: 22 additions & 16 deletions src/providers/hana/qgshanadataitemguiprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,32 +43,38 @@ void QgsHanaDataItemGuiProvider::populateContextMenu(

if ( QgsHanaConnectionItem *connItem = qobject_cast<QgsHanaConnectionItem *>( item ) )
{
QAction *actionRefresh = new QAction( tr( "Refresh" ), this );
connect( actionRefresh, &QAction::triggered, this, [connItem] { refreshConnection( connItem ); } );
menu->addAction( actionRefresh );
const QList<QgsHanaConnectionItem *> hanaConnectionItems = QgsDataItem::filteredItems<QgsHanaConnectionItem>( selection );

menu->addSeparator();
if ( hanaConnectionItems.size() == 1 )
{
QAction *actionRefresh = new QAction( tr( "Refresh" ), this );
connect( actionRefresh, &QAction::triggered, this, [connItem] { refreshConnection( connItem ); } );
menu->addAction( actionRefresh );

QAction *actionEdit = new QAction( tr( "Edit Connection…" ), this );
connect( actionEdit, &QAction::triggered, this, [connItem] { editConnection( connItem ); } );
menu->addAction( actionEdit );
menu->addSeparator();

QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), this );
connect( actionDuplicate, &QAction::triggered, this, [connItem] { duplicateConnection( connItem ); } );
menu->addAction( actionDuplicate );
QAction *actionEdit = new QAction( tr( "Edit Connection…" ), this );
connect( actionEdit, &QAction::triggered, this, [connItem] { editConnection( connItem ); } );
menu->addAction( actionEdit );

QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), this );
connect( actionDuplicate, &QAction::triggered, this, [connItem] { duplicateConnection( connItem ); } );
menu->addAction( actionDuplicate );
}

const QList<QgsHanaConnectionItem *> hanaConnectionItems = QgsDataItem::filteredItems<QgsHanaConnectionItem>( selection );
QAction *actionDelete = new QAction( hanaConnectionItems.size() > 1 ? tr( "Remove Connections…" ) : tr( "Remove Connection…" ), menu );
connect( actionDelete, &QAction::triggered, this, [hanaConnectionItems, context] {
QgsDataItemGuiProviderUtils::deleteConnections( hanaConnectionItems, []( const QString &connectionName ) { QgsHanaSettings::removeConnection( connectionName ); }, context );
} );
menu->addAction( actionDelete );

menu->addSeparator();

QAction *actionCreateSchema = new QAction( tr( "New Schema…" ), this );
connect( actionCreateSchema, &QAction::triggered, this, [connItem, context] { createSchema( connItem, context ); } );
menu->addAction( actionCreateSchema );
if ( hanaConnectionItems.size() == 1 )
{
menu->addSeparator();
QAction *actionCreateSchema = new QAction( tr( "New Schema…" ), this );
connect( actionCreateSchema, &QAction::triggered, this, [connItem, context] { createSchema( connItem, context ); } );
menu->addAction( actionCreateSchema );
}
}

if ( QgsHanaSchemaItem *schemaItem = qobject_cast<QgsHanaSchemaItem *>( item ) )
Expand Down
55 changes: 31 additions & 24 deletions src/providers/mssql/qgsmssqldataitemguiprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,42 +45,49 @@ void QgsMssqlDataItemGuiProvider::populateContextMenu( QgsDataItem *item, QMenu
}
else if ( QgsMssqlConnectionItem *connItem = qobject_cast<QgsMssqlConnectionItem *>( item ) )
{
QAction *actionRefresh = new QAction( tr( "Refresh" ), menu );
connect( actionRefresh, &QAction::triggered, this, [connItem] {
connItem->refresh();
if ( connItem->parent() )
connItem->parent()->refreshConnections();
} );
menu->addAction( actionRefresh );
const QList<QgsMssqlConnectionItem *> mssqlConnectionItems = QgsDataItem::filteredItems<QgsMssqlConnectionItem>( selection );

menu->addSeparator();
if ( mssqlConnectionItems.size() == 1 )
{
QAction *actionRefresh = new QAction( tr( "Refresh" ), menu );
connect( actionRefresh, &QAction::triggered, this, [connItem] {
connItem->refresh();
if ( connItem->parent() )
connItem->parent()->refreshConnections();
} );
menu->addAction( actionRefresh );

QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
connect( actionEdit, &QAction::triggered, this, [connItem] { editConnection( connItem ); } );
menu->addAction( actionEdit );
menu->addSeparator();

QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
connect( actionDuplicate, &QAction::triggered, this, [connItem] { duplicateConnection( connItem ); } );
menu->addAction( actionDuplicate );
QAction *actionEdit = new QAction( tr( "Edit Connection…" ), menu );
connect( actionEdit, &QAction::triggered, this, [connItem] { editConnection( connItem ); } );
menu->addAction( actionEdit );

QAction *actionDuplicate = new QAction( tr( "Duplicate Connection" ), menu );
connect( actionDuplicate, &QAction::triggered, this, [connItem] { duplicateConnection( connItem ); } );
menu->addAction( actionDuplicate );
}

const QList<QgsMssqlConnectionItem *> mssqlConnectionItems = QgsDataItem::filteredItems<QgsMssqlConnectionItem>( selection );
QAction *actionDelete = new QAction( mssqlConnectionItems.size() > 1 ? tr( "Remove Connections…" ) : tr( "Remove Connection…" ), menu );
connect( actionDelete, &QAction::triggered, this, [mssqlConnectionItems, context] {
QgsDataItemGuiProviderUtils::deleteConnections( mssqlConnectionItems, []( const QString &connectionName ) { QgsMssqlSourceSelect::deleteConnection( connectionName ); }, context );
} );
menu->addAction( actionDelete );

menu->addSeparator();
if ( mssqlConnectionItems.size() == 1 )
{
menu->addSeparator();

QAction *actionShowNoGeom = new QAction( tr( "Show Non-spatial Tables" ), menu );
actionShowNoGeom->setCheckable( true );
actionShowNoGeom->setChecked( connItem->allowGeometrylessTables() );
connect( actionShowNoGeom, &QAction::toggled, connItem, &QgsMssqlConnectionItem::setAllowGeometrylessTables );
menu->addAction( actionShowNoGeom );
QAction *actionShowNoGeom = new QAction( tr( "Show Non-spatial Tables" ), menu );
actionShowNoGeom->setCheckable( true );
actionShowNoGeom->setChecked( connItem->allowGeometrylessTables() );
connect( actionShowNoGeom, &QAction::toggled, connItem, &QgsMssqlConnectionItem::setAllowGeometrylessTables );
menu->addAction( actionShowNoGeom );

QAction *actionCreateSchema = new QAction( tr( "New Schema…" ), menu );
connect( actionCreateSchema, &QAction::triggered, this, [connItem] { createSchema( connItem ); } );
menu->addAction( actionCreateSchema );
QAction *actionCreateSchema = new QAction( tr( "New Schema…" ), menu );
connect( actionCreateSchema, &QAction::triggered, this, [connItem] { createSchema( connItem ); } );
menu->addAction( actionCreateSchema );
}
}
else if ( QgsMssqlSchemaItem *schemaItem = qobject_cast<QgsMssqlSchemaItem *>( item ) )
{
Expand Down
Loading

0 comments on commit 358408d

Please sign in to comment.