@@ -46,6 +46,7 @@ QgsNewSpatialiteLayerDialog::QgsNewSpatialiteLayerDialog( QWidget *parent, Qt::W
46
46
setupUi ( this );
47
47
connect ( mAddAttributeButton , &QToolButton::clicked, this , &QgsNewSpatialiteLayerDialog::mAddAttributeButton_clicked );
48
48
connect ( mRemoveAttributeButton , &QToolButton::clicked, this , &QgsNewSpatialiteLayerDialog::mRemoveAttributeButton_clicked );
49
+ connect ( mGeometryTypeBox , static_cast <void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this , &QgsNewSpatialiteLayerDialog::mGeometryTypeBox_currentIndexChanged );
49
50
connect ( mTypeBox , static_cast <void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this , &QgsNewSpatialiteLayerDialog::mTypeBox_currentIndexChanged );
50
51
connect ( pbnFindSRID, &QPushButton::clicked, this , &QgsNewSpatialiteLayerDialog::pbnFindSRID_clicked );
51
52
connect ( toolButtonNewDatabase, &QToolButton::clicked, this , &QgsNewSpatialiteLayerDialog::toolButtonNewDatabase_clicked );
@@ -55,13 +56,19 @@ QgsNewSpatialiteLayerDialog::QgsNewSpatialiteLayerDialog( QWidget *parent, Qt::W
55
56
QgsSettings settings;
56
57
restoreGeometry ( settings.value ( QStringLiteral ( " Windows/NewSpatiaLiteLayer/geometry" ) ).toByteArray () );
57
58
59
+ mGeometryTypeBox ->addItem ( tr ( " Non spatial" ), QStringLiteral ( " " ) );
58
60
mGeometryTypeBox ->addItem ( tr ( " Point" ), QStringLiteral ( " POINT" ) );
59
61
mGeometryTypeBox ->addItem ( tr ( " Line" ), QStringLiteral ( " LINESTRING" ) );
60
62
mGeometryTypeBox ->addItem ( tr ( " Polygon" ), QStringLiteral ( " POLYGON" ) );
61
63
mGeometryTypeBox ->addItem ( tr ( " MultiPoint" ), QStringLiteral ( " MULTIPOINT" ) );
62
64
mGeometryTypeBox ->addItem ( tr ( " MultiLine" ), QStringLiteral ( " MULTILINESTRING" ) );
63
65
mGeometryTypeBox ->addItem ( tr ( " MultiPolygon" ), QStringLiteral ( " MULTIPOLYGON" ) );
64
66
67
+ pbnFindSRID->setEnabled ( false );
68
+ mGeometryWithZCheckBox ->setEnabled ( false );
69
+ mGeometryWithMCheckBox ->setEnabled ( false );
70
+ leGeometryColumn->setEnabled ( false );
71
+
65
72
mAddAttributeButton ->setIcon ( QgsApplication::getThemeIcon ( QStringLiteral ( " /mActionNewAttribute.svg" ) ) );
66
73
mRemoveAttributeButton ->setIcon ( QgsApplication::getThemeIcon ( QStringLiteral ( " /mActionDeleteAttribute.svg" ) ) );
67
74
mTypeBox ->addItem ( tr ( " Text data" ), " text" );
@@ -109,6 +116,14 @@ QgsNewSpatialiteLayerDialog::~QgsNewSpatialiteLayerDialog()
109
116
settings.setValue ( QStringLiteral ( " Windows/NewSpatiaLiteLayer/geometry" ), saveGeometry () );
110
117
}
111
118
119
+ void QgsNewSpatialiteLayerDialog::mGeometryTypeBox_currentIndexChanged ( int index )
120
+ {
121
+ pbnFindSRID->setEnabled ( index != 0 );
122
+ mGeometryWithZCheckBox ->setEnabled ( index != 0 );
123
+ mGeometryWithMCheckBox ->setEnabled ( index != 0 );
124
+ leGeometryColumn->setEnabled ( index != 0 );
125
+ }
126
+
112
127
void QgsNewSpatialiteLayerDialog::mTypeBox_currentIndexChanged ( int index )
113
128
{
114
129
// This isn't used since widths are irrelevant in sqlite3
@@ -377,26 +392,11 @@ bool QgsNewSpatialiteLayerDialog::apply()
377
392
delim = QStringLiteral ( " ," );
378
393
++it;
379
394
}
380
-
381
395
// complete the create table statement
382
396
sql += ' )' ;
383
397
384
398
QgsDebugMsg ( QString ( " Creating table in database %1" ).arg ( mDatabaseComboBox ->currentText () ) );
385
-
386
- QgsDebugMsg ( sql ); // OK
387
-
388
- QString sqlAddGeom = QStringLiteral ( " select AddGeometryColumn(%1,%2,%3,%4,%5)" )
389
- .arg ( quotedValue ( leLayerName->text () ),
390
- quotedValue ( leGeometryColumn->text () ) )
391
- .arg ( mCrsId .split ( ' :' ).value ( 1 , QStringLiteral ( " 0" ) ).toInt () )
392
- .arg ( quotedValue ( selectedType () ) )
393
- .arg ( quotedValue ( selectedZM () ) );
394
- QgsDebugMsg ( sqlAddGeom ); // OK
395
-
396
- QString sqlCreateIndex = QStringLiteral ( " select CreateSpatialIndex(%1,%2)" )
397
- .arg ( quotedValue ( leLayerName->text () ),
398
- quotedValue ( leGeometryColumn->text () ) );
399
- QgsDebugMsg ( sqlCreateIndex ); // OK
399
+ QgsDebugMsg ( sql );
400
400
401
401
spatialite_database_unique_ptr database;
402
402
int rc = database.open ( mDatabaseComboBox ->currentText () );
@@ -405,68 +405,84 @@ bool QgsNewSpatialiteLayerDialog::apply()
405
405
QMessageBox::warning ( this ,
406
406
tr ( " SpatiaLite Database" ),
407
407
tr ( " Unable to open the database: %1" ).arg ( mDatabaseComboBox ->currentText () ) );
408
+ return false ;
408
409
}
409
- else
410
+
411
+ char *errmsg = nullptr ;
412
+
413
+ // create the table
414
+ rc = sqlite3_exec ( database.get (), sql.toUtf8 (), nullptr , nullptr , &errmsg );
415
+ if ( rc != SQLITE_OK )
416
+ {
417
+ QMessageBox::warning ( this ,
418
+ tr ( " Error Creating SpatiaLite Table" ),
419
+ tr ( " Failed to create the SpatiaLite table %1. The database returned:\n %2" ).arg ( leLayerName->text (), errmsg ) );
420
+ sqlite3_free ( errmsg );
421
+ return false ;
422
+ }
423
+
424
+ // create the geometry column and the spatial index
425
+ if ( mGeometryTypeBox ->currentIndex () != 0 )
410
426
{
411
- char *errmsg = nullptr ;
412
- rc = sqlite3_exec ( database.get (), sql.toUtf8 (), nullptr , nullptr , &errmsg );
427
+ QString sqlAddGeom = QStringLiteral ( " select AddGeometryColumn(%1,%2,%3,%4,%5)" )
428
+ .arg ( quotedValue ( leLayerName->text () ),
429
+ quotedValue ( leGeometryColumn->text () ) )
430
+ .arg ( mCrsId .split ( ' :' ).value ( 1 , QStringLiteral ( " 0" ) ).toInt () )
431
+ .arg ( quotedValue ( selectedType () ) )
432
+ .arg ( quotedValue ( selectedZM () ) );
433
+ QgsDebugMsg ( sqlAddGeom );
434
+
435
+ rc = sqlite3_exec ( database.get (), sqlAddGeom.toUtf8 (), nullptr , nullptr , &errmsg );
413
436
if ( rc != SQLITE_OK )
414
437
{
415
438
QMessageBox::warning ( this ,
416
- tr ( " Error Creating SpatiaLite Table " ),
417
- tr ( " Failed to create the SpatiaLite table %1 . The database returned:\n %2 " ).arg ( leLayerName-> text (), errmsg ) );
439
+ tr ( " Error Creating Geometry Column " ),
440
+ tr ( " Failed to create the geometry column . The database returned:\n %1 " ).arg ( errmsg ) );
418
441
sqlite3_free ( errmsg );
442
+ return false ;
419
443
}
420
- else
444
+
445
+ QString sqlCreateIndex = QStringLiteral ( " select CreateSpatialIndex(%1,%2)" )
446
+ .arg ( quotedValue ( leLayerName->text () ),
447
+ quotedValue ( leGeometryColumn->text () ) );
448
+ QgsDebugMsg ( sqlCreateIndex );
449
+
450
+ rc = sqlite3_exec ( database.get (), sqlCreateIndex.toUtf8 (), nullptr , nullptr , &errmsg );
451
+ if ( rc != SQLITE_OK )
421
452
{
422
- // create the geometry column and the spatial index
423
- rc = sqlite3_exec ( database.get (), sqlAddGeom.toUtf8 (), nullptr , nullptr , &errmsg );
424
- if ( rc != SQLITE_OK )
425
- {
426
- QMessageBox::warning ( this ,
427
- tr ( " Error Creating Geometry Column" ),
428
- tr ( " Failed to create the geometry column. The database returned:\n %1" ).arg ( errmsg ) );
429
- sqlite3_free ( errmsg );
430
- }
431
- else
432
- {
433
- // create the spatial index
434
- rc = sqlite3_exec ( database.get (), sqlCreateIndex.toUtf8 (), nullptr , nullptr , &errmsg );
435
- if ( rc != SQLITE_OK )
436
- {
437
- QMessageBox::warning ( this ,
438
- tr ( " Error Creating Spatial Index" ),
439
- tr ( " Failed to create the spatial index. The database returned:\n %1" ).arg ( errmsg ) );
440
- sqlite3_free ( errmsg );
441
- }
442
-
443
- QgsVectorLayer *layer = new QgsVectorLayer ( QStringLiteral ( " dbname='%1' table='%2'(%3) sql=" )
444
- .arg ( mDatabaseComboBox ->currentText (),
445
- leLayerName->text (),
446
- leGeometryColumn->text () ), leLayerName->text (), QStringLiteral ( " spatialite" ) );
447
- if ( layer->isValid () )
448
- {
449
- // Reload connections to refresh browser panel
450
- QgisApp::instance ()->reloadConnections ();
451
-
452
- // register this layer with the central layers registry
453
- QList<QgsMapLayer *> myList;
454
- myList << layer;
455
- // addMapLayers returns a list of all successfully added layers
456
- // so we compare that to our original list.
457
- if ( myList == QgsProject::instance ()->addMapLayers ( myList ) )
458
- return true ;
459
- }
460
- else
461
- {
462
- QgsDebugMsg ( leLayerName->text () + " is an invalid layer - not loaded" );
463
- QMessageBox::critical ( this , tr ( " Invalid Layer" ), tr ( " %1 is an invalid layer and cannot be loaded." ).arg ( leLayerName->text () ) );
464
- delete layer;
465
- }
466
- }
453
+ QMessageBox::warning ( this ,
454
+ tr ( " Error Creating Spatial Index" ),
455
+ tr ( " Failed to create the spatial index. The database returned:\n %1" ).arg ( errmsg ) );
456
+ sqlite3_free ( errmsg );
457
+ return false ;
467
458
}
468
459
}
469
460
461
+ QgsVectorLayer *layer = new QgsVectorLayer ( QStringLiteral ( " dbname='%1' table='%2'%3 sql=" )
462
+ .arg ( mDatabaseComboBox ->currentText (),
463
+ leLayerName->text (),
464
+ mGeometryTypeBox ->currentIndex () != 0 ? QStringLiteral ( " (%1)" ).arg ( leGeometryColumn->text () ) : QStringLiteral ( " " ) ),
465
+ leLayerName->text (), QStringLiteral ( " spatialite" ) );
466
+ if ( layer->isValid () )
467
+ {
468
+ // Reload connections to refresh browser panel
469
+ QgisApp::instance ()->reloadConnections ();
470
+
471
+ // register this layer with the central layers registry
472
+ QList<QgsMapLayer *> myList;
473
+ myList << layer;
474
+ // addMapLayers returns a list of all successfully added layers
475
+ // so we compare that to our original list.
476
+ if ( myList == QgsProject::instance ()->addMapLayers ( myList ) )
477
+ return true ;
478
+ }
479
+ else
480
+ {
481
+ QgsDebugMsg ( leLayerName->text () + " is an invalid layer - not loaded" );
482
+ QMessageBox::critical ( this , tr ( " Invalid Layer" ), tr ( " %1 is an invalid layer and cannot be loaded." ).arg ( leLayerName->text () ) );
483
+ delete layer;
484
+ }
485
+
470
486
return false ;
471
487
}
472
488
0 commit comments