diff --git a/src/gui/providers/gdal/qgsgdalclouddataitemguiprovider.cpp b/src/gui/providers/gdal/qgsgdalclouddataitemguiprovider.cpp index 887d1004fe95..a9d3f9b011b6 100644 --- a/src/gui/providers/gdal/qgsgdalclouddataitemguiprovider.cpp +++ b/src/gui/providers/gdal/qgsgdalclouddataitemguiprovider.cpp @@ -136,13 +136,7 @@ void QgsGdalCloudDataItemGuiProvider::duplicateConnection( QgsGdalCloudConnectio const QgsGdalCloudProviderConnection::Data connection = QgsGdalCloudProviderConnection::connection( connectionName ); const QStringList connections = QgsGdalCloudProviderConnection::sTreeConnectionCloud->items(); - int i = 0; - QString newConnectionName( connectionName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( connectionName ) .arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); QgsGdalCloudProviderConnection::addConnection( newConnectionName, connection ); cloudItem->refresh(); diff --git a/src/gui/providers/sensorthings/qgssensorthingsdataitemguiprovider.cpp b/src/gui/providers/sensorthings/qgssensorthingsdataitemguiprovider.cpp index ad9ab74d678c..ab9b375358ee 100644 --- a/src/gui/providers/sensorthings/qgssensorthingsdataitemguiprovider.cpp +++ b/src/gui/providers/sensorthings/qgssensorthingsdataitemguiprovider.cpp @@ -93,13 +93,7 @@ void QgsSensorThingsDataItemGuiProvider::duplicateConnection( QgsDataItem *item const QgsSensorThingsProviderConnection::Data connection = QgsSensorThingsProviderConnection::connection( connectionName ); const QStringList connections = QgsSensorThingsProviderConnection::sTreeSensorThingsConnections->items(); - int i = 0; - QString newConnectionName( connectionName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( connectionName ).arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); QgsSensorThingsProviderConnection::addConnection( newConnectionName, connection ); item->parent()->refreshConnections(); diff --git a/src/gui/qgsdataitemguiproviderutils.cpp b/src/gui/qgsdataitemguiproviderutils.cpp index 665824a6539e..58c46b756aa0 100644 --- a/src/gui/qgsdataitemguiproviderutils.cpp +++ b/src/gui/qgsdataitemguiproviderutils.cpp @@ -46,3 +46,16 @@ void QgsDataItemGuiProviderUtils::deleteConnectionsPrivate( const QStringList &c if ( firstParent ) firstParent->refreshConnections(); } + +const QString QgsDataItemGuiProviderUtils::uniqueName( const QString &name, const QStringList &connectionNames ) +{ + int i = 0; + QString newConnectionName( name ); + while ( connectionNames.contains( newConnectionName ) ) + { + ++i; + newConnectionName = QString( "%1 (copy %2)" ).arg( name ) .arg( i ); + } + + return newConnectionName; +} diff --git a/src/gui/qgsdataitemguiproviderutils.h b/src/gui/qgsdataitemguiproviderutils.h index cab45c4fd55a..31f97d80a846 100644 --- a/src/gui/qgsdataitemguiproviderutils.h +++ b/src/gui/qgsdataitemguiproviderutils.h @@ -61,6 +61,17 @@ class GUI_EXPORT QgsDataItemGuiProviderUtils QPointer< QgsDataItem > firstParent( items.at( 0 )->parent() ); deleteConnectionsPrivate( connectionNames, deleteConnection, firstParent ); } + + /** + * Check if connection with \a name exists in \a connectionNames list and then try to + * append a number to it to get a unique name. + * + * \note Not available in Python bindings + * + * \since QGIS 3.40 + */ + static const QString uniqueName( const QString &name, const QStringList &connectionNames ); + #endif private: diff --git a/src/gui/tiledscene/qgstiledscenedataitemguiprovider.cpp b/src/gui/tiledscene/qgstiledscenedataitemguiprovider.cpp index f6aa66c333f2..3817cc87e865 100644 --- a/src/gui/tiledscene/qgstiledscenedataitemguiprovider.cpp +++ b/src/gui/tiledscene/qgstiledscenedataitemguiprovider.cpp @@ -94,13 +94,7 @@ void QgsTiledSceneDataItemGuiProvider::duplicateConnection( QgsDataItem *item ) const QgsTiledSceneProviderConnection::Data connection = QgsTiledSceneProviderConnection::connection( connectionName ); const QStringList connections = QgsTiledSceneProviderConnection::sTreeConnectionTiledScene->items(); - int i = 0; - QString newConnectionName( connectionName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( connectionName ).arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); QgsTiledSceneProviderConnection::addConnection( newConnectionName, connection ); item->parent()->refreshConnections(); diff --git a/src/gui/vectortile/qgsvectortiledataitemguiprovider.cpp b/src/gui/vectortile/qgsvectortiledataitemguiprovider.cpp index 42619b4ad0bc..74cc6c0ff143 100644 --- a/src/gui/vectortile/qgsvectortiledataitemguiprovider.cpp +++ b/src/gui/vectortile/qgsvectortiledataitemguiprovider.cpp @@ -118,13 +118,7 @@ void QgsVectorTileDataItemGuiProvider::duplicateConnection( QgsDataItem *item ) const QgsVectorTileProviderConnection::Data connection = QgsVectorTileProviderConnection::connection( connectionName ); const QStringList connections = QgsVectorTileProviderConnection::sTreeConnectionVectorTile->items(); - int i = 0; - QString newConnectionName( connectionName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( connectionName ).arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); QgsVectorTileProviderConnection::addConnection( newConnectionName, connection ); item->parent()->refreshConnections(); diff --git a/src/providers/arcgisrest/qgsarcgisrestdataitemguiprovider.cpp b/src/providers/arcgisrest/qgsarcgisrestdataitemguiprovider.cpp index 549814d58553..5a1e473bb97c 100644 --- a/src/providers/arcgisrest/qgsarcgisrestdataitemguiprovider.cpp +++ b/src/providers/arcgisrest/qgsarcgisrestdataitemguiprovider.cpp @@ -179,13 +179,7 @@ void QgsArcGisRestDataItemGuiProvider::duplicateConnection( QgsDataItem *item ) const QString connectionName = item->name(); const QStringList connections = QgsArcGisConnectionSettings::sTreeConnectionArcgis->items(); - int i = 0; - QString newConnectionName( connectionName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( connectionName ).arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); QgsArcGisConnectionSettings::settingsUrl->setValue( QgsArcGisConnectionSettings::settingsUrl->value( connectionName ), newConnectionName ); @@ -203,7 +197,6 @@ void QgsArcGisRestDataItemGuiProvider::duplicateConnection( QgsDataItem *item ) item->parent()->refreshConnections(); } - void QgsArcGisRestDataItemGuiProvider::refreshConnection( QgsDataItem *item ) { item->refresh(); diff --git a/src/providers/hana/qgshanadataitemguiprovider.cpp b/src/providers/hana/qgshanadataitemguiprovider.cpp index e02bedff370e..62c5f6da848b 100644 --- a/src/providers/hana/qgshanadataitemguiprovider.cpp +++ b/src/providers/hana/qgshanadataitemguiprovider.cpp @@ -215,13 +215,7 @@ void QgsHanaDataItemGuiProvider::duplicateConnection( QgsDataItem *item ) const QStringList connections = settings.childGroups(); settings.endGroup(); - int i = 0; - QString newConnectionName( connectionName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( connectionName ).arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); QgsHanaSettings hanaSettings( connectionName, true ); QgsHanaSettings newHanaSettings( newConnectionName ); diff --git a/src/providers/mssql/qgsmssqldataitemguiprovider.cpp b/src/providers/mssql/qgsmssqldataitemguiprovider.cpp index 9a15611e406c..ceb20a7e5bec 100644 --- a/src/providers/mssql/qgsmssqldataitemguiprovider.cpp +++ b/src/providers/mssql/qgsmssqldataitemguiprovider.cpp @@ -199,13 +199,7 @@ void QgsMssqlDataItemGuiProvider::duplicateConnection( QgsDataItem *item ) const QStringList connections = settings.childGroups(); settings.endGroup(); - int i = 0; - QString newConnectionName( connectionName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( connectionName ).arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); const QString key = "/MSSQL/connections/" + connectionName; const QString newKey = "/MSSQL/connections/" + newConnectionName; diff --git a/src/providers/oracle/qgsoracledataitems.cpp b/src/providers/oracle/qgsoracledataitems.cpp index 6ba14305fb5b..8232aedccac5 100644 --- a/src/providers/oracle/qgsoracledataitems.cpp +++ b/src/providers/oracle/qgsoracledataitems.cpp @@ -24,6 +24,7 @@ #include "qgsdbquerylog.h" #include "qgsdbquerylog_p.h" #include "qgsvectorlayerexporter.h" +#include "qgsdataitemguiproviderutils.h" #include #include @@ -311,13 +312,7 @@ void QgsOracleConnectionItem::duplicateConnection() const QStringList connections = settings.childGroups(); settings.endGroup(); - int i = 0; - QString newConnectionName( mName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( mName ).arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); QString key = QStringLiteral( "/Oracle/connections/" ) + mName; QString newKey = QStringLiteral( "/Oracle/connections/" ) + newConnectionName; diff --git a/src/providers/postgres/qgspostgresdataitemguiprovider.cpp b/src/providers/postgres/qgspostgresdataitemguiprovider.cpp index afeae9810ce2..265bbceb158a 100644 --- a/src/providers/postgres/qgspostgresdataitemguiprovider.cpp +++ b/src/providers/postgres/qgspostgresdataitemguiprovider.cpp @@ -257,13 +257,7 @@ void QgsPostgresDataItemGuiProvider::duplicateConnection( QgsDataItem *item ) const QStringList connections = settings.childGroups(); settings.endGroup(); - int i = 0; - QString newConnectionName( connectionName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( connectionName ).arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); QString baseKey = QStringLiteral( "/PostgreSQL/connections/%1" ).arg( connectionName ); QString newBaseKey = QStringLiteral( "/PostgreSQL/connections/%1" ).arg( newConnectionName ); diff --git a/src/providers/wcs/qgswcsdataitemguiprovider.cpp b/src/providers/wcs/qgswcsdataitemguiprovider.cpp index 36cdcee5e082..8d64d87abb9c 100644 --- a/src/providers/wcs/qgswcsdataitemguiprovider.cpp +++ b/src/providers/wcs/qgswcsdataitemguiprovider.cpp @@ -99,13 +99,7 @@ void QgsWcsDataItemGuiProvider::duplicateConnection( QgsDataItem *item ) const QString connectionName = item->name(); const QStringList connections = QgsOwsConnection::sTreeOwsConnections->items( {QStringLiteral( "wcs" )} ); - int i = 0; - QString newConnectionName( connectionName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( connectionName ).arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); const QStringList detailsParameters { QStringLiteral( "wcs" ), connectionName }; const QStringList newDetailsParameters { QStringLiteral( "wcs" ), newConnectionName }; diff --git a/src/providers/wfs/qgswfsdataitemguiprovider.cpp b/src/providers/wfs/qgswfsdataitemguiprovider.cpp index 415f20b315c8..fbb7ce0ba010 100644 --- a/src/providers/wfs/qgswfsdataitemguiprovider.cpp +++ b/src/providers/wfs/qgswfsdataitemguiprovider.cpp @@ -100,13 +100,7 @@ void QgsWfsDataItemGuiProvider::duplicateConnection( QgsDataItem *item ) const QString connectionName = item->name(); const QStringList connections = QgsOwsConnection::sTreeOwsConnections->items( {QStringLiteral( "wfs" )} ); - int i = 0; - QString newConnectionName( connectionName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( connectionName ).arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); const QStringList detailsParameters { QStringLiteral( "wfs" ), connectionName }; const QStringList newDetailsParameters { QStringLiteral( "wfs" ), newConnectionName }; diff --git a/src/providers/wms/qgswmsdataitemguiproviders.cpp b/src/providers/wms/qgswmsdataitemguiproviders.cpp index f8189fdfaf7a..2da13c954015 100644 --- a/src/providers/wms/qgswmsdataitemguiproviders.cpp +++ b/src/providers/wms/qgswmsdataitemguiproviders.cpp @@ -108,13 +108,7 @@ void QgsWmsDataItemGuiProvider::duplicateConnection( QgsDataItem *item ) const QString connectionName = item->name(); const QStringList connections = QgsOwsConnection::sTreeOwsConnections->items( {QStringLiteral( "wms" )} ); - int i = 0; - QString newConnectionName( connectionName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( connectionName ).arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); const QStringList detailsParameters { QStringLiteral( "wms" ), connectionName }; const QStringList newDetailsParameters { QStringLiteral( "wms" ), newConnectionName }; @@ -244,13 +238,7 @@ void QgsXyzDataItemGuiProvider::duplicateConnection( QgsDataItem *item ) const QString connectionName = item->name(); const QStringList connections = QgsXyzConnectionSettings::sTreeXyzConnections->items(); - int i = 0; - QString newConnectionName( connectionName ); - while ( connections.contains( newConnectionName ) ) - { - ++i; - newConnectionName = QString( "%1 - copy %2" ).arg( connectionName ).arg( i ); - } + const QString newConnectionName = QgsDataItemGuiProviderUtils::uniqueName( connectionName, connections ); QgsXyzConnection connection = QgsXyzConnectionUtils::connection( connectionName ); connection.name = newConnectionName;