//! Autoconnected SLOTS * void QgsPgNewConnection::accept() { QgsSettings settings; QString baseKey = QStringLiteral( "/PostgreSQL/connections/" ); settings.setValue( baseKey + "selected", txtName->text() ); bool hasAuthConfigID = !mAuthSettings->configId().isEmpty(); if ( !hasAuthConfigID && mAuthSettings->storePasswordIsChecked( ) && QMessageBox::question( this, tr( "Saving Passwords" ), tr( "WARNING: You have opted to save your password. It will be stored in unsecured plain text in your project files and in your home directory (Unix-like OS) or user profile (Windows). If you want to avoid this, press Cancel and either:\n\na) Don't save a password in the connection settings — it will be requested interactively when needed;\nb) Use the Configuration tab to add your credentials in an HTTP Basic Authentication method and store them in an encrypted database." ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return; } // warn if entry was renamed to an existing connection if ( ( mOriginalConnName.isNull() || mOriginalConnName.compare( txtName->text(), Qt::CaseInsensitive ) != 0 ) && ( settings.contains( baseKey + txtName->text() + "/service" ) || settings.contains( baseKey + txtName->text() + "/host" ) ) && QMessageBox::question( this, tr( "Save Connection" ), tr( "Should the existing connection %1 be overwritten?" ).arg( txtName->text() ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return; } // on rename delete the original entry first if ( !mOriginalConnName.isNull() && mOriginalConnName != txtName->text() ) { settings.remove( baseKey + mOriginalConnName ); settings.sync(); } baseKey += txtName->text(); settings.setValue( baseKey + "/service", txtService->text() ); settings.setValue( baseKey + "/host", txtHost->text() ); settings.setValue( baseKey + "/port", txtPort->text() ); settings.setValue( baseKey + "/database", txtDatabase->text() ); settings.setValue( baseKey + "/username", mAuthSettings->storeUsernameIsChecked( ) ? mAuthSettings->username() : QString() ); settings.setValue( baseKey + "/password", mAuthSettings->storePasswordIsChecked( ) && !hasAuthConfigID ? mAuthSettings->password() : QString() ); settings.setValue( baseKey + "/authcfg", mAuthSettings->configId() ); settings.setValue( baseKey + "/publicOnly", cb_publicSchemaOnly->isChecked() ); settings.setValue( baseKey + "/geometryColumnsOnly", cb_geometryColumnsOnly->isChecked() ); settings.setValue( baseKey + "/dontResolveType", cb_dontResolveType->isChecked() ); settings.setValue( baseKey + "/allowGeometrylessTables", cb_allowGeometrylessTables->isChecked() ); settings.setValue( baseKey + "/sslmode", cbxSSLmode->currentData().toInt() ); settings.setValue( baseKey + "/saveUsername", mAuthSettings->storeUsernameIsChecked( ) ? "true" : "false" ); settings.setValue( baseKey + "/savePassword", mAuthSettings->storePasswordIsChecked( ) && !hasAuthConfigID ? "true" : "false" ); settings.setValue( baseKey + "/estimatedMetadata", cb_useEstimatedMetadata->isChecked() ); settings.setValue( baseKey + "/projectsInDatabase", cb_projectsInDatabase->isChecked() ); // remove old save setting settings.remove( baseKey + "/save" ); QDialog::accept(); }
void QgsOracleNewConnection::accept() { QgsSettings settings; QString baseKey = QStringLiteral( "/Oracle/connections/" ); settings.setValue( baseKey + QStringLiteral( "selected" ), txtName->text() ); if ( chkStorePassword->isChecked() && QMessageBox::question( this, tr( "Saving Passwords" ), tr( "WARNING: You have opted to save your password. It will be stored in plain text in your project files and in your home directory on Unix-like systems, or in your user profile on Windows. If you do not want this to happen, please press the Cancel button.\n" ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return; } // warn if entry was renamed to an existing connection if ( ( mOriginalConnName.isNull() || mOriginalConnName.compare( txtName->text(), Qt::CaseInsensitive ) != 0 ) && ( settings.contains( baseKey + txtName->text() + QStringLiteral( "/service" ) ) || settings.contains( baseKey + txtName->text() + QStringLiteral( "/host" ) ) ) && QMessageBox::question( this, tr( "Save Connection" ), tr( "Should the existing connection %1 be overwritten?" ).arg( txtName->text() ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return; } // on rename delete the original entry first if ( !mOriginalConnName.isNull() && mOriginalConnName != txtName->text() ) { settings.remove( baseKey + mOriginalConnName ); settings.sync(); } baseKey += txtName->text(); settings.setValue( baseKey + QStringLiteral( "/database" ), txtDatabase->text() ); settings.setValue( baseKey + QStringLiteral( "/host" ), txtHost->text() ); settings.setValue( baseKey + QStringLiteral( "/port" ), txtPort->text() ); settings.setValue( baseKey + QStringLiteral( "/username" ), chkStoreUsername->isChecked() ? txtUsername->text() : QString() ); settings.setValue( baseKey + QStringLiteral( "/password" ), chkStorePassword->isChecked() ? txtPassword->text() : QString() ); settings.setValue( baseKey + QStringLiteral( "/userTablesOnly" ), cb_userTablesOnly->isChecked() ); settings.setValue( baseKey + QStringLiteral( "/geometryColumnsOnly" ), cb_geometryColumnsOnly->isChecked() ); settings.setValue( baseKey + QStringLiteral( "/allowGeometrylessTables" ), cb_allowGeometrylessTables->isChecked() ); settings.setValue( baseKey + QStringLiteral( "/estimatedMetadata" ), cb_useEstimatedMetadata->isChecked() ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ); settings.setValue( baseKey + QStringLiteral( "/onlyExistingTypes" ), cb_onlyExistingTypes->isChecked() ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ); settings.setValue( baseKey + QStringLiteral( "/includeGeoAttributes" ), cb_includeGeoAttributes->isChecked() ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ); settings.setValue( baseKey + QStringLiteral( "/saveUsername" ), chkStoreUsername->isChecked() ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ); settings.setValue( baseKey + QStringLiteral( "/savePassword" ), chkStorePassword->isChecked() ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ); settings.setValue( baseKey + QStringLiteral( "/dboptions" ), txtOptions->text() ); settings.setValue( baseKey + QStringLiteral( "/dbworkspace" ), txtWorkspace->text() ); settings.setValue( baseKey + QStringLiteral( "/schema" ), txtSchema->text() ); QDialog::accept(); }
bool QgsNewHttpConnection::validate() { QgsSettings settings; QString key = mBaseKey + txtName->text(); // warn if entry was renamed to an existing connection if ( ( mOriginalConnName.isNull() || mOriginalConnName.compare( txtName->text(), Qt::CaseInsensitive ) != 0 ) && settings.contains( key + "/url" ) && QMessageBox::question( this, tr( "Save Connection" ), tr( "Should the existing connection %1 be overwritten?" ).arg( txtName->text() ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return false; } if ( ! mAuthSettings->password().isEmpty() && QMessageBox::question( this, tr( "Saving Passwords" ), tr( "WARNING: You have entered a password. It will be stored in unsecured plain text in your project files and your home directory (Unix-like OS) or user profile (Windows). If you want to avoid this, press Cancel and either:\n\na) Don't provide a password in the connection settings — it will be requested interactively when needed;\nb) Use the Configuration tab to add your credentials in an HTTP Basic Authentication method and store them in an encrypted database." ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return false; } return true; }
QString QgsOgrSourceSelect::openDirectory() { QgsSettings settings; bool haveLastUsedDir = settings.contains( QStringLiteral( "/UI/LastUsedDirectory" ) ); QString lastUsedDir = settings.value( QStringLiteral( "UI/LastUsedDirectory" ), QDir::homePath() ).toString(); if ( !haveLastUsedDir ) lastUsedDir = QLatin1String( "" ); QString path = QFileDialog::getExistingDirectory( this, tr( "Open Directory" ), lastUsedDir, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks ); settings.setValue( QStringLiteral( "UI/LastUsedDirectory" ), path ); //process path if it is grass if ( cmbDirectoryTypes->currentText() == QLatin1String( "Grass Vector" ) ) { #ifdef Q_OS_WIN //replace backslashes with forward slashes path.replace( '\\', '/' ); #endif path = path + "/head"; } return path; }
//! Autoconnected SLOTS * void QgsNewOgrConnection::accept() { QgsSettings settings; QString baseKey = '/' + cmbDatabaseTypes->currentText() + "/connections/"; settings.setValue( baseKey + "selected", txtName->text() ); // warn if entry was renamed to an existing connection if ( ( mOriginalConnName.isNull() || mOriginalConnName != txtName->text() ) && settings.contains( baseKey + txtName->text() + "/host" ) && QMessageBox::question( this, tr( "Save Connection" ), tr( "Should the existing connection %1 be overwritten?" ).arg( txtName->text() ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return; } // on rename delete original entry first if ( !mOriginalConnName.isNull() && mOriginalConnName != txtName->text() ) { settings.remove( baseKey + mOriginalConnName ); } baseKey += txtName->text(); settings.setValue( baseKey + "/host", txtHost->text() ); settings.setValue( baseKey + "/database", txtDatabase->text() ); settings.setValue( baseKey + "/port", txtPort->text() ); settings.setValue( baseKey + "/username", mAuthSettingsDatabase->storeUsernameIsChecked() ? mAuthSettingsDatabase->username() : QLatin1String( "" ) ); settings.setValue( baseKey + "/password", mAuthSettingsDatabase->storePasswordIsChecked() ? mAuthSettingsDatabase->password() : QLatin1String( "" ) ); settings.setValue( baseKey + "/store_username", mAuthSettingsDatabase->storeUsernameIsChecked() ? "true" : "false" ); settings.setValue( baseKey + "/store_password", mAuthSettingsDatabase->storePasswordIsChecked() ? "true" : "false" ); settings.setValue( baseKey + "/configid", mAuthSettingsDatabase->configId() ); QDialog::accept(); }
//! Autoconnected SLOTS * void QgsMssqlNewConnection::accept() { QgsSettings settings; QString baseKey = QStringLiteral( "/MSSQL/connections/" ); settings.setValue( baseKey + "selected", txtName->text() ); // warn if entry was renamed to an existing connection if ( ( mOriginalConnName.isNull() || mOriginalConnName.compare( txtName->text(), Qt::CaseInsensitive ) != 0 ) && ( settings.contains( baseKey + txtName->text() + "/service" ) || settings.contains( baseKey + txtName->text() + "/host" ) ) && QMessageBox::question( this, tr( "Save Connection" ), tr( "Should the existing connection %1 be overwritten?" ).arg( txtName->text() ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return; } // on rename delete the original entry first if ( !mOriginalConnName.isNull() && mOriginalConnName != txtName->text() ) { settings.remove( baseKey + mOriginalConnName ); settings.sync(); } baseKey += txtName->text(); QString database; QListWidgetItem *item = listDatabase->currentItem(); if ( item && item->text() != QLatin1String( "(from service)" ) ) { database = item->text(); } settings.setValue( baseKey + "/service", txtService->text() ); settings.setValue( baseKey + "/host", txtHost->text() ); settings.setValue( baseKey + "/database", database ); settings.setValue( baseKey + "/username", chkStoreUsername->isChecked() ? txtUsername->text() : QString() ); settings.setValue( baseKey + "/password", chkStorePassword->isChecked() ? txtPassword->text() : QString() ); settings.setValue( baseKey + "/saveUsername", chkStoreUsername->isChecked() ? "true" : "false" ); settings.setValue( baseKey + "/savePassword", chkStorePassword->isChecked() ? "true" : "false" ); settings.setValue( baseKey + "/geometryColumns", cb_geometryColumns->isChecked() ); settings.setValue( baseKey + "/allowGeometrylessTables", cb_allowGeometrylessTables->isChecked() ); settings.setValue( baseKey + "/estimatedMetadata", cb_useEstimatedMetadata->isChecked() ); QDialog::accept(); }
QgsNamedColorList QgsCustomColorScheme::fetchColors( const QString &context, const QColor &baseColor ) { Q_UNUSED( context ); Q_UNUSED( baseColor ); //fetch predefined custom colors QgsNamedColorList colorList; QgsSettings settings; //check if settings contains custom palette if ( !settings.contains( QStringLiteral( "/colors/palettecolors" ) ) ) { //no custom palette, return default colors colorList.append( qMakePair( QColor( 0, 0, 0 ), QString() ) ); colorList.append( qMakePair( QColor( 255, 255, 255 ), QString() ) ); colorList.append( qMakePair( QColor( 166, 206, 227 ), QString() ) ); colorList.append( qMakePair( QColor( 31, 120, 180 ), QString() ) ); colorList.append( qMakePair( QColor( 178, 223, 138 ), QString() ) ); colorList.append( qMakePair( QColor( 51, 160, 44 ), QString() ) ); colorList.append( qMakePair( QColor( 251, 154, 153 ), QString() ) ); colorList.append( qMakePair( QColor( 227, 26, 28 ), QString() ) ); colorList.append( qMakePair( QColor( 253, 191, 111 ), QString() ) ); colorList.append( qMakePair( QColor( 255, 127, 0 ), QString() ) ); return colorList; } QList< QVariant > customColorVariants = settings.value( QStringLiteral( "colors/palettecolors" ) ).toList(); QList< QVariant > customColorLabels = settings.value( QStringLiteral( "colors/palettelabels" ) ).toList(); //generate list from custom colors int colorIndex = 0; for ( QList< QVariant >::iterator it = customColorVariants.begin(); it != customColorVariants.end(); ++it ) { QColor color = ( *it ).value<QColor>(); QString label; if ( customColorLabels.length() > colorIndex ) { label = customColorLabels.at( colorIndex ).toString(); } colorList.append( qMakePair( color, label ) ); colorIndex++; } return colorList; }
QgsPgNewConnection::QgsPgNewConnection( QWidget *parent, const QString &connName, Qt::WindowFlags fl ) : QDialog( parent, fl ) , mOriginalConnName( connName ) { setupUi( this ); connect( btnConnect, &QPushButton::clicked, this, &QgsPgNewConnection::btnConnect_clicked ); connect( cb_geometryColumnsOnly, &QCheckBox::clicked, this, &QgsPgNewConnection::cb_geometryColumnsOnly_clicked ); connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsPgNewConnection::showHelp ); cbxSSLmode->addItem( tr( "disable" ), QgsDataSourceUri::SslDisable ); cbxSSLmode->addItem( tr( "allow" ), QgsDataSourceUri::SslAllow ); cbxSSLmode->addItem( tr( "prefer" ), QgsDataSourceUri::SslPrefer ); cbxSSLmode->addItem( tr( "require" ), QgsDataSourceUri::SslRequire ); cbxSSLmode->addItem( tr( "verify-ca" ), QgsDataSourceUri::SslVerifyCa ); cbxSSLmode->addItem( tr( "verify-full" ), QgsDataSourceUri::SslVerifyFull ); mAuthSettings->setDataprovider( QStringLiteral( "postgres" ) ); mAuthSettings->showStoreCheckboxes( true ); if ( !connName.isEmpty() ) { // populate the dialog with the information stored for the connection // populate the fields with the stored setting parameters QgsSettings settings; QString key = "/PostgreSQL/connections/" + connName; txtService->setText( settings.value( key + "/service" ).toString() ); txtHost->setText( settings.value( key + "/host" ).toString() ); QString port = settings.value( key + "/port" ).toString(); if ( port.length() == 0 ) { port = QStringLiteral( "5432" ); } txtPort->setText( port ); txtDatabase->setText( settings.value( key + "/database" ).toString() ); cb_publicSchemaOnly->setChecked( settings.value( key + "/publicOnly", false ).toBool() ); cb_geometryColumnsOnly->setChecked( settings.value( key + "/geometryColumnsOnly", true ).toBool() ); cb_dontResolveType->setChecked( settings.value( key + "/dontResolveType", false ).toBool() ); cb_allowGeometrylessTables->setChecked( settings.value( key + "/allowGeometrylessTables", false ).toBool() ); // Ensure that cb_publicSchemaOnly is set correctly cb_geometryColumnsOnly_clicked(); cb_useEstimatedMetadata->setChecked( settings.value( key + "/estimatedMetadata", false ).toBool() ); cbxSSLmode->setCurrentIndex( cbxSSLmode->findData( settings.enumValue( key + "/sslmode", QgsDataSourceUri::SslPrefer ) ) ); if ( settings.value( key + "/saveUsername" ).toString() == QLatin1String( "true" ) ) { mAuthSettings->setUsername( settings.value( key + "/username" ).toString() ); mAuthSettings->setStoreUsernameChecked( true ); } if ( settings.value( key + "/savePassword" ).toString() == QLatin1String( "true" ) ) { mAuthSettings->setPassword( settings.value( key + "/password" ).toString() ); mAuthSettings->setStorePasswordChecked( true ); } // Old save setting if ( settings.contains( key + "/save" ) ) { mAuthSettings->setUsername( settings.value( key + "/username" ).toString() ); mAuthSettings->setStoreUsernameChecked( ! mAuthSettings->username().isEmpty() ); if ( settings.value( key + "/save" ).toString() == QLatin1String( "true" ) ) mAuthSettings->setPassword( settings.value( key + "/password" ).toString() ); mAuthSettings->setStorePasswordChecked( true ); } QString authcfg = settings.value( key + "/authcfg" ).toString(); mAuthSettings->setConfigId( authcfg ); txtName->setText( connName ); } txtName->setValidator( new QRegExpValidator( QRegExp( "[^\\/]*" ), txtName ) ); }
QString QgsClipboard::generateClipboardText() const { QgsSettings settings; CopyFormat format = AttributesWithWKT; if ( settings.contains( QStringLiteral( "/qgis/copyFeatureFormat" ) ) ) format = static_cast< CopyFormat >( settings.value( QStringLiteral( "qgis/copyFeatureFormat" ), true ).toInt() ); else { //old format setting format = settings.value( QStringLiteral( "qgis/copyGeometryAsWKT" ), true ).toBool() ? AttributesWithWKT : AttributesOnly; } switch ( format ) { case AttributesOnly: case AttributesWithWKT: { QStringList textLines; QStringList textFields; // first do the field names if ( format == AttributesWithWKT ) { textFields += QStringLiteral( "wkt_geom" ); } Q_FOREACH ( const QgsField &field, mFeatureFields ) { textFields += field.name(); } textLines += textFields.join( QStringLiteral( "\t" ) ); textFields.clear(); // then the field contents for ( QgsFeatureList::const_iterator it = mFeatureClipboard.constBegin(); it != mFeatureClipboard.constEnd(); ++it ) { QgsAttributes attributes = it->attributes(); // TODO: Set up Paste Transformations to specify the order in which fields are added. if ( format == AttributesWithWKT ) { if ( it->hasGeometry() ) textFields += it->geometry().exportToWkt(); else { textFields += QgsApplication::nullRepresentation(); } } // QgsDebugMsg("about to traverse fields."); for ( int idx = 0; idx < attributes.count(); ++idx ) { // QgsDebugMsg(QString("inspecting field '%1'.").arg(it2->toString())); textFields += attributes.at( idx ).toString(); } textLines += textFields.join( QStringLiteral( "\t" ) ); textFields.clear(); } return textLines.join( QStringLiteral( "\n" ) ); } case GeoJSON: { QgsJSONExporter exporter; exporter.setSourceCrs( mCRS ); return exporter.exportFeatures( mFeatureClipboard ); } } return QString(); }
QgsPgNewConnection::QgsPgNewConnection( QWidget *parent, const QString &connName, Qt::WindowFlags fl ) : QDialog( parent, fl ) , mOriginalConnName( connName ) , mAuthConfigSelect( nullptr ) { setupUi( this ); cbxSSLmode->addItem( tr( "disable" ), QgsDataSourceUri::SslDisable ); cbxSSLmode->addItem( tr( "allow" ), QgsDataSourceUri::SslAllow ); cbxSSLmode->addItem( tr( "prefer" ), QgsDataSourceUri::SslPrefer ); cbxSSLmode->addItem( tr( "require" ), QgsDataSourceUri::SslRequire ); cbxSSLmode->addItem( tr( "verify-ca" ), QgsDataSourceUri::SslVerifyCa ); cbxSSLmode->addItem( tr( "verify-full" ), QgsDataSourceUri::SslVerifyFull ); mAuthConfigSelect = new QgsAuthConfigSelect( this, QStringLiteral( "postgres" ) ); tabAuthentication->insertTab( 1, mAuthConfigSelect, tr( "Configurations" ) ); if ( !connName.isEmpty() ) { // populate the dialog with the information stored for the connection // populate the fields with the stored setting parameters QgsSettings settings; QString key = "/PostgreSQL/connections/" + connName; txtService->setText( settings.value( key + "/service" ).toString() ); txtHost->setText( settings.value( key + "/host" ).toString() ); QString port = settings.value( key + "/port" ).toString(); if ( port.length() == 0 ) { port = QStringLiteral( "5432" ); } txtPort->setText( port ); txtDatabase->setText( settings.value( key + "/database" ).toString() ); cb_publicSchemaOnly->setChecked( settings.value( key + "/publicOnly", false ).toBool() ); cb_geometryColumnsOnly->setChecked( settings.value( key + "/geometryColumnsOnly", true ).toBool() ); cb_dontResolveType->setChecked( settings.value( key + "/dontResolveType", false ).toBool() ); cb_allowGeometrylessTables->setChecked( settings.value( key + "/allowGeometrylessTables", false ).toBool() ); // Ensure that cb_publicSchemaOnly is set correctly on_cb_geometryColumnsOnly_clicked(); cb_useEstimatedMetadata->setChecked( settings.value( key + "/estimatedMetadata", false ).toBool() ); cbxSSLmode->setCurrentIndex( cbxSSLmode->findData( settings.value( key + "/sslmode", QgsDataSourceUri::SslPrefer ).toInt() ) ); if ( settings.value( key + "/saveUsername" ).toString() == QLatin1String( "true" ) ) { txtUsername->setText( settings.value( key + "/username" ).toString() ); chkStoreUsername->setChecked( true ); } if ( settings.value( key + "/savePassword" ).toString() == QLatin1String( "true" ) ) { txtPassword->setText( settings.value( key + "/password" ).toString() ); chkStorePassword->setChecked( true ); } // Old save setting if ( settings.contains( key + "/save" ) ) { txtUsername->setText( settings.value( key + "/username" ).toString() ); chkStoreUsername->setChecked( !txtUsername->text().isEmpty() ); if ( settings.value( key + "/save" ).toString() == QLatin1String( "true" ) ) txtPassword->setText( settings.value( key + "/password" ).toString() ); chkStorePassword->setChecked( true ); } QString authcfg = settings.value( key + "/authcfg" ).toString(); mAuthConfigSelect->setConfigId( authcfg ); if ( !authcfg.isEmpty() ) { tabAuthentication->setCurrentIndex( tabAuthentication->indexOf( mAuthConfigSelect ) ); } txtName->setText( connName ); } txtName->setValidator( new QRegExpValidator( QRegExp( "[^\\/]*" ), txtName ) ); }
// On Android, there there is a libqgis.so instead of a qgis executable. // The main method symbol of this library needs to be exported so it can be called by java // On Windows this main is included in qgis_app and called from mainwin.cpp APP_EXPORT #endif int main( int argc, char *argv[] ) { #ifdef Q_OS_MACX // Increase file resource limits (i.e., number of allowed open files) // (from code provided by Larry Biehl, Purdue University, USA, from 'MultiSpec' project) // This is generally 256 for the soft limit on Mac // NOTE: setrlimit() must come *before* initialization of stdio strings, // e.g. before any debug messages, or setrlimit() gets ignored // see: http://stackoverflow.com/a/17726104/2865523 struct rlimit rescLimit; if ( getrlimit( RLIMIT_NOFILE, &rescLimit ) == 0 ) { rlim_t oldSoft( rescLimit.rlim_cur ); rlim_t oldHard( rescLimit.rlim_max ); #ifdef OPEN_MAX rlim_t newSoft( OPEN_MAX ); rlim_t newHard( std::min( oldHard, newSoft ) ); #else rlim_t newSoft( 4096 ); rlim_t newHard( std::min( ( rlim_t )8192, oldHard ) ); #endif if ( rescLimit.rlim_cur < newSoft ) { rescLimit.rlim_cur = newSoft; rescLimit.rlim_max = newHard; if ( setrlimit( RLIMIT_NOFILE, &rescLimit ) == 0 ) { QgsDebugMsg( QString( "Mac RLIMIT_NOFILE Soft/Hard NEW: %1 / %2" ) .arg( rescLimit.rlim_cur ).arg( rescLimit.rlim_max ) ); } } Q_UNUSED( oldSoft ); //avoid warnings QgsDebugMsg( QString( "Mac RLIMIT_NOFILE Soft/Hard ORIG: %1 / %2" ) .arg( oldSoft ).arg( oldHard ) ); } #endif QgsDebugMsg( QString( "Starting qgis main" ) ); #ifdef WIN32 // Windows #ifdef _MSC_VER _set_fmode( _O_BINARY ); #else //MinGW _fmode = _O_BINARY; #endif // _MSC_VER #endif // WIN32 // Set up the custom qWarning/qDebug custom handler #ifndef ANDROID qInstallMsgHandler( myMessageOutput ); #endif #if (defined(linux) && !defined(ANDROID)) || defined(__FreeBSD__) signal( SIGQUIT, qgisCrash ); signal( SIGILL, qgisCrash ); signal( SIGFPE, qgisCrash ); signal( SIGSEGV, qgisCrash ); signal( SIGBUS, qgisCrash ); signal( SIGSYS, qgisCrash ); signal( SIGTRAP, qgisCrash ); signal( SIGXCPU, qgisCrash ); signal( SIGXFSZ, qgisCrash ); #endif #ifdef Q_OS_WIN SetUnhandledExceptionFilter( QgsCrashHandler::handle ); #endif // initialize random number seed qsrand( time( nullptr ) ); ///////////////////////////////////////////////////////////////// // Command line options 'behavior' flag setup //////////////////////////////////////////////////////////////// // // Parse the command line arguments, looking to see if the user has asked for any // special behaviors. Any remaining non command arguments will be kept aside to // be passed as a list of layers and / or a project that should be loaded. // // This behavior is used to load the app, snapshot the map, // save the image to disk and then exit QString mySnapshotFileName; QString configLocalStorageLocation; QString profileName; int mySnapshotWidth = 800; int mySnapshotHeight = 600; bool myHideSplash = false; bool mySettingsMigrationForce = false; bool mySkipVersionCheck = false; #if defined(ANDROID) QgsDebugMsg( QString( "Android: Splash hidden" ) ); myHideSplash = true; #endif bool myRestoreDefaultWindowState = false; bool myRestorePlugins = true; bool myCustomization = true; QString dxfOutputFile; QgsDxfExport::SymbologyExport dxfSymbologyMode = QgsDxfExport::SymbolLayerSymbology; double dxfScale = 50000.0; QString dxfEncoding = QStringLiteral( "CP1252" ); QString dxfPreset; QgsRectangle dxfExtent; // This behavior will set initial extent of map canvas, but only if // there are no command line arguments. This gives a usable map // extent when qgis starts with no layers loaded. When layers are // loaded, we let the layers define the initial extent. QString myInitialExtent; if ( argc == 1 ) myInitialExtent = QStringLiteral( "-1,-1,1,1" ); // This behavior will allow you to force the use of a translation file // which is useful for testing QString myTranslationCode; // The user can specify a path which will override the default path of custom // user settings (~/.qgis) and it will be used for QgsSettings INI file QString configpath; QString authdbdirectory; QString pythonfile; QString customizationfile; QString globalsettingsfile; // TODO Fix android #if defined(ANDROID) QgsDebugMsg( QString( "Android: All params stripped" ) );// Param %1" ).arg( argv[0] ) ); //put all QGIS settings in the same place configpath = QgsApplication::qgisSettingsDirPath(); QgsDebugMsg( QString( "Android: configpath set to %1" ).arg( configpath ) ); #endif QStringList args; if ( !bundleclicked( argc, argv ) ) { // Build a local QCoreApplication from arguments. This way, arguments are correctly parsed from their native locale // It will use QString::fromLocal8Bit( argv ) under Unix and GetCommandLine() under Windows. QCoreApplication coreApp( argc, argv ); args = QCoreApplication::arguments(); for ( int i = 1; i < args.size(); ++i ) { const QString &arg = args[i]; if ( arg == QLatin1String( "--help" ) || arg == QLatin1String( "-?" ) ) { usage( args[0] ); return 2; } else if ( arg == QLatin1String( "--nologo" ) || arg == QLatin1String( "-n" ) ) { myHideSplash = true; } else if ( arg == QLatin1String( "--version-migration" ) ) { mySettingsMigrationForce = true; } else if ( arg == QLatin1String( "--noversioncheck" ) || arg == QLatin1String( "-V" ) ) { mySkipVersionCheck = true; } else if ( arg == QLatin1String( "--noplugins" ) || arg == QLatin1String( "-P" ) ) { myRestorePlugins = false; } else if ( arg == QLatin1String( "--nocustomization" ) || arg == QLatin1String( "-C" ) ) { myCustomization = false; } else if ( i + 1 < argc && ( arg == QLatin1String( "--profile" ) ) ) { profileName = args[++i]; } else if ( i + 1 < argc && ( arg == QLatin1String( "--profiles-path" ) || arg == QLatin1String( "-s" ) ) ) { configLocalStorageLocation = QDir::toNativeSeparators( QFileInfo( args[++i] ).absoluteFilePath() ); } else if ( i + 1 < argc && ( arg == QLatin1String( "--snapshot" ) || arg == QLatin1String( "-s" ) ) ) { mySnapshotFileName = QDir::toNativeSeparators( QFileInfo( args[++i] ).absoluteFilePath() ); } else if ( i + 1 < argc && ( arg == QLatin1String( "--width" ) || arg == QLatin1String( "-w" ) ) ) { mySnapshotWidth = QString( args[++i] ).toInt(); } else if ( i + 1 < argc && ( arg == QLatin1String( "--height" ) || arg == QLatin1String( "-h" ) ) ) { mySnapshotHeight = QString( args[++i] ).toInt(); } else if ( i + 1 < argc && ( arg == QLatin1String( "--lang" ) || arg == QLatin1String( "-l" ) ) ) { myTranslationCode = args[++i]; } else if ( i + 1 < argc && ( arg == QLatin1String( "--project" ) || arg == QLatin1String( "-p" ) ) ) { sProjectFileName = QDir::toNativeSeparators( QFileInfo( args[++i] ).absoluteFilePath() ); } else if ( i + 1 < argc && ( arg == QLatin1String( "--extent" ) || arg == QLatin1String( "-e" ) ) ) { myInitialExtent = args[++i]; } else if ( i + 1 < argc && ( arg == QLatin1String( "--authdbdirectory" ) || arg == QLatin1String( "-a" ) ) ) { authdbdirectory = QDir::toNativeSeparators( QDir( args[++i] ).absolutePath() ); } else if ( i + 1 < argc && ( arg == QLatin1String( "--code" ) || arg == QLatin1String( "-f" ) ) ) { pythonfile = QDir::toNativeSeparators( QFileInfo( args[++i] ).absoluteFilePath() ); } else if ( i + 1 < argc && ( arg == QLatin1String( "--customizationfile" ) || arg == QLatin1String( "-z" ) ) ) { customizationfile = QDir::toNativeSeparators( QFileInfo( args[++i] ).absoluteFilePath() ); } else if ( i + 1 < argc && ( arg == QLatin1String( "--globalsettingsfile" ) || arg == QLatin1String( "-g" ) ) ) { globalsettingsfile = QDir::toNativeSeparators( QFileInfo( args[++i] ).absoluteFilePath() ); } else if ( arg == QLatin1String( "--defaultui" ) || arg == QLatin1String( "-d" ) ) { myRestoreDefaultWindowState = true; } else if ( arg == QLatin1String( "--dxf-export" ) ) { dxfOutputFile = args[++i]; } else if ( arg == QLatin1String( "--dxf-extent" ) ) { QgsLocaleNumC l; QString ext( args[++i] ); QStringList coords( ext.split( ',' ) ); if ( coords.size() != 4 ) { std::cerr << "invalid dxf extent " << ext.toStdString() << std::endl; return 2; } for ( int i = 0; i < 4; i++ ) { bool ok; double d; d = coords[i].toDouble( &ok ); if ( !ok ) { std::cerr << "invalid dxf coordinate " << coords[i].toStdString() << " in extent " << ext.toStdString() << std::endl; return 2; } switch ( i ) { case 0: dxfExtent.setXMinimum( d ); break; case 1: dxfExtent.setYMinimum( d ); break; case 2: dxfExtent.setXMaximum( d ); break; case 3: dxfExtent.setYMaximum( d ); break; } } } else if ( arg == QLatin1String( "--dxf-symbology-mode" ) ) { QString mode( args[++i] ); if ( mode == QLatin1String( "none" ) ) { dxfSymbologyMode = QgsDxfExport::NoSymbology; } else if ( mode == QLatin1String( "symbollayer" ) ) { dxfSymbologyMode = QgsDxfExport::SymbolLayerSymbology; } else if ( mode == QLatin1String( "feature" ) ) { dxfSymbologyMode = QgsDxfExport::FeatureSymbology; } else { std::cerr << "invalid dxf symbology mode " << mode.toStdString() << std::endl; return 2; } } else if ( arg == QLatin1String( "--dxf-scale-denom" ) ) { bool ok; QString scale( args[++i] ); dxfScale = scale.toDouble( &ok ); if ( !ok ) { std::cerr << "invalid dxf scale " << scale.toStdString() << std::endl; return 2; } } else if ( arg == QLatin1String( "--dxf-encoding" ) ) { dxfEncoding = args[++i]; } else if ( arg == QLatin1String( "--dxf-preset" ) ) { dxfPreset = args[++i]; } else if ( arg == QLatin1String( "--" ) ) { for ( i++; i < args.size(); ++i ) sFileList.append( QDir::toNativeSeparators( QFileInfo( args[i] ).absoluteFilePath() ) ); } else { sFileList.append( QDir::toNativeSeparators( QFileInfo( args[i] ).absoluteFilePath() ) ); } } } ///////////////////////////////////////////////////////////////////// // If no --project was specified, parse the args to look for a // // .qgs file and set myProjectFileName to it. This allows loading // // of a project file by clicking on it in various desktop managers // // where an appropriate mime-type has been set up. // ///////////////////////////////////////////////////////////////////// if ( sProjectFileName.isEmpty() ) { // check for a .qgs for ( int i = 0; i < args.size(); i++ ) { QString arg = QDir::toNativeSeparators( QFileInfo( args[i] ).absoluteFilePath() ); if ( arg.endsWith( QLatin1String( ".qgs" ), Qt::CaseInsensitive ) ) { sProjectFileName = arg; break; } } } ///////////////////////////////////////////////////////////////////// // Now we have the handlers for the different behaviors... //////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// // Initialize the application and the translation stuff ///////////////////////////////////////////////////////////////////// #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) && !defined(ANDROID) bool myUseGuiFlag = nullptr != getenv( "DISPLAY" ); #else bool myUseGuiFlag = true; #endif if ( !myUseGuiFlag ) { std::cerr << QObject::tr( "QGIS starting in non-interactive mode not supported.\n" "You are seeing this message most likely because you " "have no DISPLAY environment variable set.\n" ).toUtf8().constData(); exit( 1 ); //exit for now until a version of qgis is capabable of running non interactive } // GUI customization is enabled according to settings (loaded when instance is created) // we force disabled here if --nocustomization argument is used if ( !myCustomization ) { QgsCustomization::instance()->setEnabled( false ); } QCoreApplication::setOrganizationName( QgsApplication::QGIS_ORGANIZATION_NAME ); QCoreApplication::setOrganizationDomain( QgsApplication::QGIS_ORGANIZATION_DOMAIN ); QCoreApplication::setApplicationName( QgsApplication::QGIS_APPLICATION_NAME ); QCoreApplication::setAttribute( Qt::AA_DontShowIconsInMenus, false ); QgsSettings settings; if ( configLocalStorageLocation.isEmpty() ) { if ( getenv( "QGIS_CUSTOM_CONFIG_PATH" ) ) { configLocalStorageLocation = getenv( "QGIS_CUSTOM_CONFIG_PATH" ); } else if ( settings.contains( QStringLiteral( "profilesPath" ), QgsSettings::Core ) ) { configLocalStorageLocation = settings.value( QStringLiteral( "profilesPath" ), "", QgsSettings::Core ).toString(); QgsDebugMsg( QString( "Loading profiles path from global config at %1" ).arg( configLocalStorageLocation ) ); } // If it is still empty at this point we get it from the standard location. if ( configLocalStorageLocation.isEmpty() ) { configLocalStorageLocation = QStandardPaths::standardLocations( QStandardPaths::AppDataLocation ).value( 0 ); } } QString rootProfileFolder = QgsUserProfileManager::resolveProfilesFolder( configLocalStorageLocation ); QgsUserProfileManager manager( rootProfileFolder ); QgsUserProfile *profile = manager.getProfile( profileName, true ); QString profileFolder = profile->folder(); profileName = profile->name(); delete profile; QgsDebugMsg( "User profile details:" ); QgsDebugMsg( QString( "\t - %1" ).arg( profileName ) ); QgsDebugMsg( QString( "\t - %1" ).arg( profileFolder ) ); QgsDebugMsg( QString( "\t - %1" ).arg( rootProfileFolder ) ); QgsApplication myApp( argc, argv, myUseGuiFlag, profileFolder ); // SetUp the QgsSettings Global Settings: // - use the path specified with --globalsettingsfile path, // - use the environment if not found // - use a default location as a fallback if ( globalsettingsfile.isEmpty() ) { globalsettingsfile = getenv( "QGIS_GLOBAL_SETTINGS_FILE" ); } if ( globalsettingsfile.isEmpty() ) { QString default_globalsettingsfile = QgsApplication::pkgDataPath() + "/qgis_global_settings.ini"; if ( QFile::exists( default_globalsettingsfile ) ) { globalsettingsfile = default_globalsettingsfile; } } if ( !globalsettingsfile.isEmpty() ) { if ( ! QgsSettings::setGlobalSettingsPath( globalsettingsfile ) ) { QgsMessageLog::logMessage( QStringLiteral( "Invalid globalsettingsfile path: %1" ).arg( globalsettingsfile ), QStringLiteral( "QGIS" ) ); } else { QgsMessageLog::logMessage( QStringLiteral( "Successfully loaded globalsettingsfile path: %1" ).arg( globalsettingsfile ), QStringLiteral( "QGIS" ) ); } } // Settings migration is only supported on the default profile for now. if ( profileName == "default" ) { std::unique_ptr< QgsVersionMigration > migration( QgsVersionMigration::canMigrate( 20000, Qgis::QGIS_VERSION_INT ) ); if ( migration && ( mySettingsMigrationForce || migration->requiresMigration() ) ) { QgsDebugMsg( "RUNNING MIGRATION" ); migration->runMigration(); } } // Redefine QgsApplication::libraryPaths as necessary. // IMPORTANT: Do *after* QgsApplication myApp(...), but *before* Qt uses any plugins, // e.g. loading splash screen, setting window icon, etc. // Always honor QT_PLUGIN_PATH env var or qt.conf, which will // be part of libraryPaths just after QgsApplication creation. #ifdef Q_OS_WIN // For non static builds on win (static builds are not supported) // we need to be sure we can find the qt image plugins. QCoreApplication::addLibraryPath( QApplication::applicationDirPath() + QDir::separator() + "qtplugins" ); #endif #ifdef Q_OS_MAC // Resulting libraryPaths has critical QGIS plugin paths first, then any Qt plugin paths, then // any dev-defined paths (in app's qt.conf) and/or user-defined paths (QT_PLUGIN_PATH env var). // // NOTE: Minimizes, though does not fully protect against, crashes due to dev/user-defined libs // built against a different Qt/QGIS, while still allowing custom C++ plugins to load. QStringList libPaths( QCoreApplication::libraryPaths() ); QgsDebugMsgLevel( QStringLiteral( "Initial macOS QCoreApplication::libraryPaths: %1" ) .arg( libPaths.join( " " ) ), 4 ); // Strip all critical paths that should always be prepended if ( libPaths.removeAll( QDir::cleanPath( QgsApplication::pluginPath() ) ) ) { QgsDebugMsgLevel( QStringLiteral( "QgsApplication::pluginPath removed from initial libraryPaths" ), 4 ); } if ( libPaths.removeAll( QCoreApplication::applicationDirPath() ) ) { QgsDebugMsgLevel( QStringLiteral( "QCoreApplication::applicationDirPath removed from initial libraryPaths" ), 4 ); } // Prepend path, so a standard Qt bundle directory is parsed QgsDebugMsgLevel( QStringLiteral( "Prepending QCoreApplication::applicationDirPath to libraryPaths" ), 4 ); libPaths.prepend( QCoreApplication::applicationDirPath() ); // Check if we are running in a 'release' app bundle, i.e. contains copied-in // standard Qt-specific plugin subdirectories (ones never created by QGIS, e.g. 'sqldrivers' is). // Note: bundleclicked(...) is inadequate to determine which *type* of bundle was opened, e.g. release or build dir. // An app bundled with QGIS_MACAPP_BUNDLE > 0 is considered a release bundle. QString relLibPath( QDir::cleanPath( QCoreApplication::applicationDirPath().append( "/../PlugIns" ) ) ); // Note: relLibPath becomes the defacto QT_PLUGINS_DIR of a release app bundle if ( QFile::exists( relLibPath + QStringLiteral( "/imageformats" ) ) && QFile::exists( relLibPath + QStringLiteral( "/codecs" ) ) ) { // We are in a release app bundle. // Strip QT_PLUGINS_DIR because it will crash a launched release app bundle, since // the appropriate Qt frameworks and plugins have been copied into the bundle. if ( libPaths.removeAll( QT_PLUGINS_DIR ) ) { QgsDebugMsgLevel( QStringLiteral( "QT_PLUGINS_DIR removed from initial libraryPaths" ), 4 ); } // Prepend the Plugins path, so copied-in Qt plugin bundle directories are parsed. QgsDebugMsgLevel( QStringLiteral( "Prepending <bundle>/Plugins to libraryPaths" ), 4 ); libPaths.prepend( relLibPath ); // TODO: see if this or another method can be used to avoid QCA's install prefix plugins // from being parsed and loaded (causes multi-Qt-loaded errors when bundled Qt should // be the only one loaded). QCA core (> v2.1.3) needs an update first. //setenv( "QCA_PLUGIN_PATH", relLibPath.toUtf8().constData(), 1 ); } else { // We are either running from build dir bundle, or launching Mach-O binary directly. // Add system Qt plugins, since they are not bundled, and not always referenced by default. // An app bundled with QGIS_MACAPP_BUNDLE = 0 will still have Plugins/qgis in it. // Note: Don't always prepend. // User may have already defined it in QT_PLUGIN_PATH in a specific order. if ( !libPaths.contains( QT_PLUGINS_DIR ) ) { QgsDebugMsgLevel( QStringLiteral( "Prepending QT_PLUGINS_DIR to libraryPaths" ), 4 ); libPaths.prepend( QT_PLUGINS_DIR ); } } QgsDebugMsgLevel( QStringLiteral( "Prepending QgsApplication::pluginPath to libraryPaths" ), 4 ); libPaths.prepend( QDir::cleanPath( QgsApplication::pluginPath() ) ); // Redefine library search paths. QCoreApplication::setLibraryPaths( libPaths ); QgsDebugMsgLevel( QStringLiteral( "Rewritten macOS QCoreApplication::libraryPaths: %1" ) .arg( QCoreApplication::libraryPaths().join( " " ) ), 4 ); #endif #ifdef Q_OS_MAC // Set hidpi icons; use SVG icons, as PNGs will be relatively too small QCoreApplication::setAttribute( Qt::AA_UseHighDpiPixmaps ); // Set 1024x1024 icon for dock, app switcher, etc., rendering myApp.setWindowIcon( QIcon( QgsApplication::iconsPath() + QStringLiteral( "qgis-icon-macos.png" ) ) ); #else myApp.setWindowIcon( QIcon( QgsApplication::appIconPath() ) ); #endif // TODO: use QgsSettings QSettings *customizationsettings = nullptr; // Using the customizationfile option always overrides the option and config path options. if ( !customizationfile.isEmpty() ) { customizationsettings = new QSettings( customizationfile, QSettings::IniFormat ); QgsCustomization::instance()->setEnabled( true ); } else { customizationsettings = new QSettings( QStringLiteral( "QGIS" ), QStringLiteral( "QGISCUSTOMIZATION2" ) ); } // Load and set possible default customization, must be done after QgsApplication init and QgsSettings ( QCoreApplication ) init QgsCustomization::instance()->setSettings( customizationsettings ); QgsCustomization::instance()->loadDefault(); #ifdef Q_OS_MACX // If the GDAL plugins are bundled with the application and GDAL_DRIVER_PATH // is not already defined, use the GDAL plugins in the application bundle. QString gdalPlugins( QCoreApplication::applicationDirPath().append( "/lib/gdalplugins" ) ); if ( QFile::exists( gdalPlugins ) && !getenv( "GDAL_DRIVER_PATH" ) ) { setenv( "GDAL_DRIVER_PATH", gdalPlugins.toUtf8(), 1 ); } // Point GDAL_DATA at any GDAL share directory embedded in the app bundle if ( !getenv( "GDAL_DATA" ) ) { QStringList gdalShares; QString appResources( QDir::cleanPath( QgsApplication::pkgDataPath() ) ); gdalShares << QCoreApplication::applicationDirPath().append( "/share/gdal" ) << appResources.append( "/share/gdal" ) << appResources.append( "/gdal" ); Q_FOREACH ( const QString &gdalShare, gdalShares ) { if ( QFile::exists( gdalShare ) ) { setenv( "GDAL_DATA", gdalShare.toUtf8().constData(), 1 ); break; } } }
QgsOracleNewConnection::QgsOracleNewConnection( QWidget *parent, const QString &connName, Qt::WindowFlags fl ) : QDialog( parent, fl ) , mOriginalConnName( connName ) { setupUi( this ); txtSchema->setShowClearButton( true ); connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsOracleNewConnection::showHelp ); connect( btnConnect, &QPushButton::clicked, this, &QgsOracleNewConnection::testConnection ); if ( !connName.isEmpty() ) { // populate the dialog with the information stored for the connection // populate the fields with the stored setting parameters QgsSettings settings; QString key = QStringLiteral( "/Oracle/connections/" ) + connName; txtDatabase->setText( settings.value( key + QStringLiteral( "/database" ) ).toString() ); txtHost->setText( settings.value( key + QStringLiteral( "/host" ) ).toString() ); QString port = settings.value( key + QStringLiteral( "/port" ) ).toString(); if ( port.length() == 0 ) { port = QStringLiteral( "1521" ); } txtPort->setText( port ); txtOptions->setText( settings.value( key + QStringLiteral( "/dboptions" ) ).toString() ); txtWorkspace->setText( settings.value( key + QStringLiteral( "/dbworkspace" ) ).toString() ); txtSchema->setText( settings.value( key + QStringLiteral( "/schema" ) ).toString() ); cb_userTablesOnly->setChecked( settings.value( key + QStringLiteral( "/userTablesOnly" ), false ).toBool() ); cb_geometryColumnsOnly->setChecked( settings.value( key + QStringLiteral( "/geometryColumnsOnly" ), true ).toBool() ); cb_allowGeometrylessTables->setChecked( settings.value( key + QStringLiteral( "/allowGeometrylessTables" ), false ).toBool() ); cb_useEstimatedMetadata->setChecked( settings.value( key + QStringLiteral( "/estimatedMetadata" ), false ).toBool() ); cb_onlyExistingTypes->setChecked( settings.value( key + QStringLiteral( "/onlyExistingTypes" ), true ).toBool() ); cb_includeGeoAttributes->setChecked( settings.value( key + QStringLiteral( "/includeGeoAttributes" ), false ).toBool() ); if ( settings.value( key + QStringLiteral( "/saveUsername" ) ).toString() == QLatin1String( "true" ) ) { txtUsername->setText( settings.value( key + QStringLiteral( "/username" ) ).toString() ); chkStoreUsername->setChecked( true ); } if ( settings.value( key + QStringLiteral( "/savePassword" ) ).toString() == QLatin1String( "true" ) ) { txtPassword->setText( settings.value( key + QStringLiteral( "/password" ) ).toString() ); chkStorePassword->setChecked( true ); } // Old save setting if ( settings.contains( key + QStringLiteral( "/save" ) ) ) { txtUsername->setText( settings.value( key + QStringLiteral( "/username" ) ).toString() ); chkStoreUsername->setChecked( !txtUsername->text().isEmpty() ); if ( settings.value( key + QStringLiteral( "/save" ) ).toString() == QLatin1String( "true" ) ) txtPassword->setText( settings.value( key + QStringLiteral( "/password" ) ).toString() ); chkStorePassword->setChecked( true ); } txtName->setText( connName ); } txtName->setValidator( new QRegExpValidator( QRegExp( QStringLiteral( "[^\\/]+" ) ), txtName ) ); }
bool QgsNewSpatialiteLayerDialog::createDb() { QString dbPath = mDatabaseComboBox->currentText(); if ( dbPath.isEmpty() ) return false; QFile newDb( dbPath ); if ( newDb.exists() ) { QMessageBox msgBox; msgBox.setIcon( QMessageBox::Question ); msgBox.setWindowTitle( tr( "The File Already Exists." ) ); msgBox.setText( tr( "Do you want to overwrite the existing file with a new database or add a new layer to it?" ) ); QPushButton *overwriteButton = msgBox.addButton( tr( "Overwrite" ), QMessageBox::ActionRole ); QPushButton *addNewLayerButton = msgBox.addButton( tr( "Add new layer" ), QMessageBox::ActionRole ); msgBox.setStandardButtons( QMessageBox::Cancel ); msgBox.setDefaultButton( addNewLayerButton ); int ret = msgBox.exec(); if ( ret == QMessageBox::Cancel ) { return false; } if ( msgBox.clickedButton() == overwriteButton ) { newDb.remove(); } } if ( !newDb.exists() ) { QString errCause; bool res = false; QString spatialite_lib = QgsProviderRegistry::instance()->library( QStringLiteral( "spatialite" ) ); QLibrary *myLib = new QLibrary( spatialite_lib ); bool loaded = myLib->load(); if ( loaded ) { QgsDebugMsg( "SpatiaLite provider loaded" ); typedef bool ( *createDbProc )( const QString &, QString & ); createDbProc createDbPtr = ( createDbProc ) cast_to_fptr( myLib->resolve( "createDb" ) ); if ( createDbPtr ) { res = createDbPtr( dbPath, errCause ); } else { errCause = QStringLiteral( "Resolving createDb(...) failed" ); } } delete myLib; if ( !res ) { QMessageBox::warning( nullptr, tr( "SpatiaLite Database" ), errCause ); pbnFindSRID->setEnabled( false ); } } QFileInfo fi( newDb ); if ( !fi.exists() ) { pbnFindSRID->setEnabled( false ); return false; } QString key = "/SpatiaLite/connections/" + fi.fileName() + "/sqlitepath"; QgsSettings settings; if ( !settings.contains( key ) ) { settings.setValue( QStringLiteral( "SpatiaLite/connections/selected" ), fi.fileName() + tr( "@" ) + fi.canonicalFilePath() ); settings.setValue( key, fi.canonicalFilePath() ); QMessageBox::information( nullptr, tr( "SpatiaLite Database" ), tr( "Registered new database!" ) ); } pbnFindSRID->setEnabled( true ); return true; }
QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer *layer, QWidget *parent, QgsMapCanvas *canvas ) : QWidget( parent ) , mMapCanvas( canvas ) { mLayer = layer; if ( !layer ) { return; } setupUi( this ); // get rid of annoying outer focus rect on Mac mDiagramOptionsListWidget->setAttribute( Qt::WA_MacShowFocusRect, false ); mDiagramTypeComboBox->blockSignals( true ); QPixmap pix = QgsApplication::getThemePixmap( QStringLiteral( "diagramNone" ) ); mDiagramTypeComboBox->addItem( pix, tr( "No diagrams" ), "None" ); pix = QgsApplication::getThemePixmap( QStringLiteral( "pie-chart" ) ); mDiagramTypeComboBox->addItem( pix, tr( "Pie chart" ), DIAGRAM_NAME_PIE ); pix = QgsApplication::getThemePixmap( QStringLiteral( "text" ) ); mDiagramTypeComboBox->addItem( pix, tr( "Text diagram" ), DIAGRAM_NAME_TEXT ); pix = QgsApplication::getThemePixmap( QStringLiteral( "histogram" ) ); mDiagramTypeComboBox->addItem( pix, tr( "Histogram" ), DIAGRAM_NAME_HISTOGRAM ); mDiagramTypeComboBox->blockSignals( false ); mScaleRangeWidget->setMapCanvas( mMapCanvas ); mSizeFieldExpressionWidget->registerExpressionContextGenerator( this ); mBackgroundColorButton->setColorDialogTitle( tr( "Select background color" ) ); mBackgroundColorButton->setAllowAlpha( true ); mBackgroundColorButton->setContext( QStringLiteral( "symbology" ) ); mBackgroundColorButton->setShowNoColor( true ); mBackgroundColorButton->setNoColorString( tr( "Transparent background" ) ); mDiagramPenColorButton->setColorDialogTitle( tr( "Select pen color" ) ); mDiagramPenColorButton->setAllowAlpha( true ); mDiagramPenColorButton->setContext( QStringLiteral( "symbology" ) ); mDiagramPenColorButton->setShowNoColor( true ); mDiagramPenColorButton->setNoColorString( tr( "Transparent stroke" ) ); mMaxValueSpinBox->setShowClearButton( false ); mDiagramAttributesTreeWidget->setItemDelegateForColumn( ColumnAttributeExpression, new EditBlockerDelegate( this ) ); mDiagramAttributesTreeWidget->setItemDelegateForColumn( ColumnColor, new EditBlockerDelegate( this ) ); connect( mFixedSizeRadio, &QRadioButton::toggled, this, &QgsDiagramProperties::scalingTypeChanged ); connect( mAttributeBasedScalingRadio, &QRadioButton::toggled, this, &QgsDiagramProperties::scalingTypeChanged ); mDiagramUnitComboBox->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderMapUnits << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches ); mDiagramLineUnitComboBox->setUnits( QgsUnitTypes::RenderUnitList() << QgsUnitTypes::RenderMillimeters << QgsUnitTypes::RenderMapUnits << QgsUnitTypes::RenderPixels << QgsUnitTypes::RenderPoints << QgsUnitTypes::RenderInches ); QgsWkbTypes::GeometryType layerType = layer->geometryType(); if ( layerType == QgsWkbTypes::UnknownGeometry || layerType == QgsWkbTypes::NullGeometry ) { mDiagramTypeComboBox->setEnabled( false ); mDiagramFrame->setEnabled( false ); } //insert placement options mPlacementComboBox->blockSignals( true ); switch ( layerType ) { case QgsWkbTypes::PointGeometry: mPlacementComboBox->addItem( tr( "Around Point" ), QgsDiagramLayerSettings::AroundPoint ); mPlacementComboBox->addItem( tr( "Over Point" ), QgsDiagramLayerSettings::OverPoint ); mLinePlacementFrame->setVisible( false ); break; case QgsWkbTypes::LineGeometry: mPlacementComboBox->addItem( tr( "Around Line" ), QgsDiagramLayerSettings::Line ); mPlacementComboBox->addItem( tr( "Over Line" ), QgsDiagramLayerSettings::Horizontal ); mLinePlacementFrame->setVisible( true ); break; case QgsWkbTypes::PolygonGeometry: mPlacementComboBox->addItem( tr( "Around Centroid" ), QgsDiagramLayerSettings::AroundPoint ); mPlacementComboBox->addItem( tr( "Over Centroid" ), QgsDiagramLayerSettings::OverPoint ); mPlacementComboBox->addItem( tr( "Perimeter" ), QgsDiagramLayerSettings::Line ); mPlacementComboBox->addItem( tr( "Inside Polygon" ), QgsDiagramLayerSettings::Horizontal ); mLinePlacementFrame->setVisible( false ); break; default: break; } mPlacementComboBox->blockSignals( false ); mLabelPlacementComboBox->addItem( tr( "Height" ), QgsDiagramSettings::Height ); mLabelPlacementComboBox->addItem( tr( "x-height" ), QgsDiagramSettings::XHeight ); mScaleDependencyComboBox->addItem( tr( "Area" ), true ); mScaleDependencyComboBox->addItem( tr( "Diameter" ), false ); mAngleOffsetComboBox->addItem( tr( "Top" ), 90 * 16 ); mAngleOffsetComboBox->addItem( tr( "Right" ), 0 ); mAngleOffsetComboBox->addItem( tr( "Bottom" ), 270 * 16 ); mAngleOffsetComboBox->addItem( tr( "Left" ), 180 * 16 ); QgsSettings settings; // reset horiz stretch of left side of options splitter (set to 1 for previewing in Qt Designer) QSizePolicy policy( mDiagramOptionsListFrame->sizePolicy() ); policy.setHorizontalStretch( 0 ); mDiagramOptionsListFrame->setSizePolicy( policy ); if ( !settings.contains( QStringLiteral( "/Windows/Diagrams/OptionsSplitState" ) ) ) { // set left list widget width on initial showing QList<int> splitsizes; splitsizes << 115; mDiagramOptionsSplitter->setSizes( splitsizes ); } // restore dialog, splitters and current tab mDiagramOptionsSplitter->restoreState( settings.value( QStringLiteral( "Windows/Diagrams/OptionsSplitState" ) ).toByteArray() ); mDiagramOptionsListWidget->setCurrentRow( settings.value( QStringLiteral( "Windows/Diagrams/Tab" ), 0 ).toInt() ); // field combo and expression button mSizeFieldExpressionWidget->setLayer( mLayer ); QgsDistanceArea myDa; myDa.setSourceCrs( mLayer->crs() ); myDa.setEllipsoidalMode( true ); myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); mSizeFieldExpressionWidget->setGeomCalculator( myDa ); //insert all attributes into the combo boxes const QgsFields &layerFields = layer->fields(); for ( int idx = 0; idx < layerFields.count(); ++idx ) { QTreeWidgetItem *newItem = new QTreeWidgetItem( mAttributesTreeWidget ); QString name = QStringLiteral( "\"%1\"" ).arg( layerFields.at( idx ).name() ); newItem->setText( 0, name ); newItem->setData( 0, RoleAttributeExpression, name ); newItem->setFlags( newItem->flags() & ~Qt::ItemIsDropEnabled ); } const QgsDiagramRenderer *dr = layer->diagramRenderer(); if ( !dr ) //no diagram renderer yet, insert reasonable default { mDiagramTypeComboBox->blockSignals( true ); mDiagramTypeComboBox->setCurrentIndex( 0 ); mDiagramTypeComboBox->blockSignals( false ); mFixedSizeRadio->setChecked( true ); mDiagramUnitComboBox->setUnit( QgsUnitTypes::RenderMillimeters ); mDiagramLineUnitComboBox->setUnit( QgsUnitTypes::RenderMillimeters ); mLabelPlacementComboBox->setCurrentIndex( mLabelPlacementComboBox->findText( tr( "x-height" ) ) ); mDiagramSizeSpinBox->setEnabled( true ); mDiagramSizeSpinBox->setValue( 15 ); mLinearScaleFrame->setEnabled( false ); mIncreaseMinimumSizeSpinBox->setEnabled( false ); mIncreaseMinimumSizeLabel->setEnabled( false ); mBarWidthSpinBox->setValue( 5 ); mScaleVisibilityGroupBox->setChecked( layer->hasScaleBasedVisibility() ); mScaleRangeWidget->setScaleRange( 1.0 / layer->maximumScale(), 1.0 / layer->minimumScale() ); // caution: layer uses scale denoms, widget uses true scales mShowAllCheckBox->setChecked( true ); mCheckBoxAttributeLegend->setChecked( true ); mCheckBoxSizeLegend->setChecked( false ); mSizeLegendSymbol.reset( QgsMarkerSymbol::createSimple( QgsStringMap() ) ); switch ( layerType ) { case QgsWkbTypes::PointGeometry: mPlacementComboBox->setCurrentIndex( mPlacementComboBox->findData( QgsDiagramLayerSettings::AroundPoint ) ); break; case QgsWkbTypes::LineGeometry: mPlacementComboBox->setCurrentIndex( mPlacementComboBox->findData( QgsDiagramLayerSettings::Line ) ); chkLineAbove->setChecked( true ); chkLineBelow->setChecked( false ); chkLineOn->setChecked( false ); chkLineOrientationDependent->setChecked( false ); break; case QgsWkbTypes::PolygonGeometry: mPlacementComboBox->setCurrentIndex( mPlacementComboBox->findData( QgsDiagramLayerSettings::AroundPoint ) ); break; case QgsWkbTypes::UnknownGeometry: case QgsWkbTypes::NullGeometry: break; } mBackgroundColorButton->setColor( QColor( 255, 255, 255, 255 ) ); //force a refresh of widget status to match diagram type on_mDiagramTypeComboBox_currentIndexChanged( mDiagramTypeComboBox->currentIndex() ); } else // already a diagram renderer present { //single category renderer or interpolated one? if ( dr->rendererName() == QLatin1String( "SingleCategory" ) ) { mFixedSizeRadio->setChecked( true ); } else { mAttributeBasedScalingRadio->setChecked( true ); } mDiagramSizeSpinBox->setEnabled( mFixedSizeRadio->isChecked() ); mLinearScaleFrame->setEnabled( mAttributeBasedScalingRadio->isChecked() ); mCheckBoxAttributeLegend->setChecked( dr->attributeLegend() ); mCheckBoxSizeLegend->setChecked( dr->sizeLegend() ); mSizeLegendSymbol.reset( dr->sizeLegendSymbol() ? dr->sizeLegendSymbol()->clone() : QgsMarkerSymbol::createSimple( QgsStringMap() ) ); QIcon icon = QgsSymbolLayerUtils::symbolPreviewIcon( mSizeLegendSymbol.get(), mButtonSizeLegendSymbol->iconSize() ); mButtonSizeLegendSymbol->setIcon( icon ); //assume single category or linearly interpolated diagram renderer for now QList<QgsDiagramSettings> settingList = dr->diagramSettings(); if ( !settingList.isEmpty() ) { mDiagramFrame->setEnabled( settingList.at( 0 ).enabled ); mDiagramFont = settingList.at( 0 ).font; QSizeF size = settingList.at( 0 ).size; mBackgroundColorButton->setColor( settingList.at( 0 ).backgroundColor ); mTransparencySpinBox->setValue( settingList.at( 0 ).transparency * 100.0 / 255.0 ); mTransparencySlider->setValue( mTransparencySpinBox->value() ); mDiagramPenColorButton->setColor( settingList.at( 0 ).penColor ); mPenWidthSpinBox->setValue( settingList.at( 0 ).penWidth ); mDiagramSizeSpinBox->setValue( ( size.width() + size.height() ) / 2.0 ); // caution: layer uses scale denoms, widget uses true scales mScaleRangeWidget->setScaleRange( 1.0 / ( settingList.at( 0 ).maxScaleDenominator > 0 ? settingList.at( 0 ).maxScaleDenominator : layer->maximumScale() ), 1.0 / ( settingList.at( 0 ).minScaleDenominator > 0 ? settingList.at( 0 ).minScaleDenominator : layer->minimumScale() ) ); mScaleVisibilityGroupBox->setChecked( settingList.at( 0 ).scaleBasedVisibility ); mDiagramUnitComboBox->setUnit( settingList.at( 0 ).sizeType ); mDiagramUnitComboBox->setMapUnitScale( settingList.at( 0 ).sizeScale ); mDiagramLineUnitComboBox->setUnit( settingList.at( 0 ).lineSizeUnit ); mDiagramLineUnitComboBox->setMapUnitScale( settingList.at( 0 ).lineSizeScale ); if ( settingList.at( 0 ).labelPlacementMethod == QgsDiagramSettings::Height ) { mLabelPlacementComboBox->setCurrentIndex( 0 ); } else { mLabelPlacementComboBox->setCurrentIndex( 1 ); } mAngleOffsetComboBox->setCurrentIndex( mAngleOffsetComboBox->findData( settingList.at( 0 ).angleOffset ) ); mOrientationLeftButton->setProperty( "direction", QgsDiagramSettings::Left ); mOrientationRightButton->setProperty( "direction", QgsDiagramSettings::Right ); mOrientationUpButton->setProperty( "direction", QgsDiagramSettings::Up ); mOrientationDownButton->setProperty( "direction", QgsDiagramSettings::Down ); switch ( settingList.at( 0 ).diagramOrientation ) { case QgsDiagramSettings::Left: mOrientationLeftButton->setChecked( true ); break; case QgsDiagramSettings::Right: mOrientationRightButton->setChecked( true ); break; case QgsDiagramSettings::Up: mOrientationUpButton->setChecked( true ); break; case QgsDiagramSettings::Down: mOrientationDownButton->setChecked( true ); break; } mBarWidthSpinBox->setValue( settingList.at( 0 ).barWidth ); mIncreaseSmallDiagramsCheck->setChecked( settingList.at( 0 ).minimumSize != 0 ); mIncreaseMinimumSizeSpinBox->setEnabled( mIncreaseSmallDiagramsCheck->isChecked() ); mIncreaseMinimumSizeLabel->setEnabled( mIncreaseSmallDiagramsCheck->isChecked() ); mIncreaseMinimumSizeSpinBox->setValue( settingList.at( 0 ).minimumSize ); if ( settingList.at( 0 ).scaleByArea ) { mScaleDependencyComboBox->setCurrentIndex( 0 ); } else { mScaleDependencyComboBox->setCurrentIndex( 1 ); } QList< QColor > categoryColors = settingList.at( 0 ).categoryColors; QList< QString > categoryAttributes = settingList.at( 0 ).categoryAttributes; QList< QString > categoryLabels = settingList.at( 0 ).categoryLabels; QList< QString >::const_iterator catIt = categoryAttributes.constBegin(); QList< QColor >::const_iterator coIt = categoryColors.constBegin(); QList< QString >::const_iterator labIt = categoryLabels.constBegin(); for ( ; catIt != categoryAttributes.constEnd(); ++catIt, ++coIt, ++labIt ) { QTreeWidgetItem *newItem = new QTreeWidgetItem( mDiagramAttributesTreeWidget ); newItem->setText( 0, *catIt ); newItem->setData( 0, RoleAttributeExpression, *catIt ); newItem->setFlags( newItem->flags() & ~Qt::ItemIsDropEnabled ); QColor col( *coIt ); col.setAlpha( 255 ); newItem->setBackground( 1, QBrush( col ) ); newItem->setText( 2, *labIt ); newItem->setFlags( newItem->flags() | Qt::ItemIsEditable ); } } if ( dr->rendererName() == QLatin1String( "LinearlyInterpolated" ) ) { const QgsLinearlyInterpolatedDiagramRenderer *lidr = dynamic_cast<const QgsLinearlyInterpolatedDiagramRenderer *>( dr ); if ( lidr ) { mDiagramSizeSpinBox->setEnabled( false ); mLinearScaleFrame->setEnabled( true ); mMaxValueSpinBox->setValue( lidr->upperValue() ); mSizeSpinBox->setValue( ( lidr->upperSize().width() + lidr->upperSize().height() ) / 2 ); if ( lidr->classificationAttributeIsExpression() ) { mSizeFieldExpressionWidget->setField( lidr->classificationAttributeExpression() ); } else { mSizeFieldExpressionWidget->setField( lidr->classificationField() ); } } } const QgsDiagramLayerSettings *dls = layer->diagramLayerSettings(); if ( dls ) { mDiagramDistanceSpinBox->setValue( dls->distance() ); mPrioritySlider->setValue( dls->priority() ); mZIndexSpinBox->setValue( dls->zIndex() ); mPlacementComboBox->setCurrentIndex( mPlacementComboBox->findData( dls->placement() ) ); chkLineAbove->setChecked( dls->linePlacementFlags() & QgsDiagramLayerSettings::AboveLine ); chkLineBelow->setChecked( dls->linePlacementFlags() & QgsDiagramLayerSettings::BelowLine ); chkLineOn->setChecked( dls->linePlacementFlags() & QgsDiagramLayerSettings::OnLine ); if ( !( dls->linePlacementFlags() & QgsDiagramLayerSettings::MapOrientation ) ) chkLineOrientationDependent->setChecked( true ); mShowAllCheckBox->setChecked( dls->showAllDiagrams() ); mDataDefinedProperties = dls->dataDefinedProperties(); } if ( dr->diagram() ) { mDiagramType = dr->diagram()->diagramName(); mDiagramTypeComboBox->blockSignals( true ); mDiagramTypeComboBox->setCurrentIndex( settingList.at( 0 ).enabled ? mDiagramTypeComboBox->findData( mDiagramType ) : 0 ); mDiagramTypeComboBox->blockSignals( false ); //force a refresh of widget status to match diagram type on_mDiagramTypeComboBox_currentIndexChanged( mDiagramTypeComboBox->currentIndex() ); if ( mDiagramTypeComboBox->currentIndex() == -1 ) { QMessageBox::warning( this, tr( "Unknown diagram type." ), tr( "The diagram type '%1' is unknown. A default type is selected for you." ).arg( mDiagramType ), QMessageBox::Ok ); mDiagramTypeComboBox->setCurrentIndex( mDiagramTypeComboBox->findData( DIAGRAM_NAME_PIE ) ); } } } connect( mAddAttributeExpression, &QPushButton::clicked, this, &QgsDiagramProperties::showAddAttributeExpressionDialog ); connect( mTransparencySlider, &QSlider::valueChanged, mTransparencySpinBox, &QgsSpinBox::setValue ); connect( mTransparencySpinBox, static_cast < void ( QgsSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mTransparencySlider, &QSlider::setValue ); registerDataDefinedButton( mBackgroundColorDDBtn, QgsDiagramLayerSettings::BackgroundColor ); registerDataDefinedButton( mLineColorDDBtn, QgsDiagramLayerSettings::StrokeColor ); registerDataDefinedButton( mLineWidthDDBtn, QgsDiagramLayerSettings::StrokeWidth ); registerDataDefinedButton( mCoordXDDBtn, QgsDiagramLayerSettings::PositionX ); registerDataDefinedButton( mCoordYDDBtn, QgsDiagramLayerSettings::PositionY ); registerDataDefinedButton( mDistanceDDBtn, QgsDiagramLayerSettings::Distance ); registerDataDefinedButton( mPriorityDDBtn, QgsDiagramLayerSettings::Priority ); registerDataDefinedButton( mZOrderDDBtn, QgsDiagramLayerSettings::ZIndex ); registerDataDefinedButton( mShowDiagramDDBtn, QgsDiagramLayerSettings::Show ); registerDataDefinedButton( mAlwaysShowDDBtn, QgsDiagramLayerSettings::AlwaysShow ); registerDataDefinedButton( mIsObstacleDDBtn, QgsDiagramLayerSettings::IsObstacle ); registerDataDefinedButton( mStartAngleDDBtn, QgsDiagramLayerSettings::StartAngle ); }
void QgsOgrSourceSelect::addButtonClicked() { QgsSettings settings; mDataSources.clear(); if ( radioSrcDatabase->isChecked() ) { if ( !settings.contains( '/' + cmbDatabaseTypes->currentText() + "/connections/" + cmbConnections->currentText() + "/host" ) ) { QMessageBox::information( this, tr( "Add vector layer" ), tr( "No database selected." ) ); return; } QString baseKey = '/' + cmbDatabaseTypes->currentText() + "/connections/"; baseKey += cmbConnections->currentText(); QString host = settings.value( baseKey + "/host" ).toString(); QString database = settings.value( baseKey + "/database" ).toString(); QString port = settings.value( baseKey + "/port" ).toString(); QString user = settings.value( baseKey + "/username" ).toString(); QString pass = settings.value( baseKey + "/password" ).toString(); bool makeConnection = false; if ( pass.isEmpty() ) { if ( cmbDatabaseTypes->currentText() == QLatin1String( "MSSQL" ) ) makeConnection = true; else pass = QInputDialog::getText( this, tr( "Password for " ) + user, tr( "Please enter your password:"******"Add vector layer" ), tr( "No protocol URI entered." ) ); return; } mDataSources << createProtocolURI( cmbProtocolTypes->currentText(), protocolURI->text() ); } else if ( radioSrcFile->isChecked() ) { if ( inputSrcDataset->text().isEmpty() ) { QMessageBox::information( this, tr( "Add vector layer" ), tr( "No layers selected." ) ); return; } mDataSources << inputSrcDataset->text().split( ';' ); } else if ( radioSrcDirectory->isChecked() ) { if ( inputSrcDataset->text().isEmpty() ) { QMessageBox::information( this, tr( "Add vector layer" ), tr( "No directory selected." ) ); return; } mDataSources << inputSrcDataset->text(); } // Save the used encoding settings.setValue( QStringLiteral( "UI/encoding" ), encoding() ); if ( ! mDataSources.isEmpty() ) { emit addVectorLayers( mDataSources, encoding(), dataSourceType() ); } }