28
28
#include < QMessageBox>
29
29
#include < QSqlError>
30
30
#include < QSqlQuery>
31
+ #include < QSqlRecord>
31
32
#include < QModelIndex>
32
33
#include < QAbstractTableModel>
33
34
#include < QToolButton>
@@ -138,10 +139,6 @@ void QgsBookmarks::addClicked()
138
139
QgsMapCanvas *canvas = QgisApp::instance ()->mapCanvas ();
139
140
Q_ASSERT ( canvas );
140
141
141
- QSqlQuery query ( mQgisModel ->database () );
142
- query.prepare ( " INSERT INTO tbl_bookmarks(bookmark_id,name,project_name,xmin,ymin,xmax,ymax,projection_srid)"
143
- " VALUES (NULL,:name,:project_name,:xmin,:ymin,:xmax,:ymax,:projection_srid)" );
144
-
145
142
QString projStr ( QLatin1String ( " " ) );
146
143
if ( QgsProject::instance () )
147
144
{
@@ -156,14 +153,16 @@ void QgsBookmarks::addClicked()
156
153
}
157
154
}
158
155
159
- query.bindValue ( QStringLiteral ( " :name" ), tr ( " New bookmark" ) );
160
- query.bindValue ( QStringLiteral ( " :project_name" ), projStr );
161
- query.bindValue ( QStringLiteral ( " :xmin" ), canvas->extent ().xMinimum () );
162
- query.bindValue ( QStringLiteral ( " :ymin" ), canvas->extent ().yMinimum () );
163
- query.bindValue ( QStringLiteral ( " :xmax" ), canvas->extent ().xMaximum () );
164
- query.bindValue ( QStringLiteral ( " :ymax" ), canvas->extent ().yMaximum () );
165
- query.bindValue ( QStringLiteral ( " :projection_srid" ), QVariant::fromValue ( canvas->mapSettings ().destinationCrs ().srsid () ) );
166
- if ( query.exec () )
156
+ QSqlRecord record = mQgisModel ->record ();
157
+ record.setValue ( 1 , QVariant ( tr ( " New bookmark" ) ) );
158
+ record.setValue ( 2 , QVariant ( projStr ) );
159
+ record.setValue ( 3 , QVariant ( canvas->extent ().xMinimum () ) );
160
+ record.setValue ( 4 , QVariant ( canvas->extent ().yMinimum () ) );
161
+ record.setValue ( 5 , QVariant ( canvas->extent ().xMaximum () ) );
162
+ record.setValue ( 6 , QVariant ( canvas->extent ().yMaximum () ) );
163
+ record.setValue ( 7 , QVariant::fromValue ( canvas->mapSettings ().destinationCrs ().srsid () ) );
164
+
165
+ if ( mQgisModel ->insertRecord ( -1 , record ) )
167
166
{
168
167
mQgisModel ->setSort ( 0 , Qt::AscendingOrder );
169
168
mQgisModel ->select ();
@@ -174,8 +173,8 @@ void QgsBookmarks::addClicked()
174
173
else
175
174
{
176
175
QMessageBox::warning ( this , tr ( " Error" ), tr ( " Unable to create the bookmark.\n Driver: %1\n Database: %2" )
177
- .arg ( query .lastError ().driverText (),
178
- query .lastError ().databaseText () ) );
176
+ .arg ( mQgisModel -> database () .lastError ().driverText (),
177
+ mQgisModel -> database () .lastError ().databaseText () ) );
179
178
}
180
179
}
181
180
@@ -408,13 +407,16 @@ int QgsProjectBookmarksTableModel::rowCount( const QModelIndex &parent ) const
408
407
int QgsProjectBookmarksTableModel::columnCount ( const QModelIndex &parent ) const
409
408
{
410
409
Q_UNUSED ( parent );
411
- return 7 ;
410
+ return 8 ;
412
411
}
413
412
414
413
QVariant QgsProjectBookmarksTableModel::data ( const QModelIndex &index, int role ) const
415
414
{
416
- Q_UNUSED ( role );
417
- Q_ASSERT ( role == Qt::DisplayRole );
415
+
416
+ if ( role != Qt::DisplayRole && role != Qt::EditRole )
417
+ {
418
+ return QVariant ();
419
+ }
418
420
419
421
switch ( index .column () )
420
422
{
@@ -431,7 +433,7 @@ QVariant QgsProjectBookmarksTableModel::data( const QModelIndex &index, int role
431
433
case 6 :
432
434
return QgsProject::instance ()->readDoubleEntry ( QStringLiteral ( " Bookmarks" ), QStringLiteral ( " /Row-%1/MaxY" ).arg ( index .row () ) );
433
435
case 7 :
434
- return QgsProject::instance ()->readNumEntry ( QStringLiteral ( " Bookmarks" ), QStringLiteral ( " /Row-%1/SRID" ).arg ( index .row () ) );
436
+ return QgsProject::instance ()->readNumEntry ( QStringLiteral ( " Bookmarks" ), QStringLiteral ( " /Row-%1/SRID" ).arg ( index .row () ) );
435
437
default :
436
438
return QVariant ();
437
439
}
@@ -474,14 +476,17 @@ bool QgsProjectBookmarksTableModel::insertRows( int row, int count, const QModel
474
476
{
475
477
Q_UNUSED ( row );
476
478
Q_UNUSED ( parent );
479
+ beginInsertRows ( parent, row, row + count );
477
480
478
- return QgsProject::instance ()->writeEntry ( QStringLiteral ( " Bookmarks" ), QStringLiteral ( " /count" ), QgsProject::instance ()->readNumEntry ( QStringLiteral ( " Bookmarks" ), QStringLiteral ( " /count" ) ) + count );
481
+ bool result = QgsProject::instance ()->writeEntry ( QStringLiteral ( " Bookmarks" ), QStringLiteral ( " /count" ), QgsProject::instance ()->readNumEntry ( QStringLiteral ( " Bookmarks" ), QStringLiteral ( " /count" ) ) + count );
482
+ endInsertRows ();
483
+ return result;
479
484
}
480
485
481
486
bool QgsProjectBookmarksTableModel::removeRows ( int row, int count, const QModelIndex &parent )
482
487
{
483
488
Q_UNUSED ( parent );
484
-
489
+ beginRemoveRows ( parent, row, row + count );
485
490
for ( int newRow = row ; newRow < rowCount () - count ; newRow++ )
486
491
{
487
492
for ( int column = 0 ; column < columnCount () ; column++ )
@@ -495,10 +500,11 @@ bool QgsProjectBookmarksTableModel::removeRows( int row, int count, const QModel
495
500
}
496
501
497
502
QgsProject::instance ()->writeEntry ( QStringLiteral ( " Bookmarks" ), QStringLiteral ( " /count" ), QgsProject::instance ()->readNumEntry ( QStringLiteral ( " Bookmarks" ), QStringLiteral ( " /count" ) ) - count );
498
-
503
+ endRemoveRows ();
499
504
return true ;
500
505
}
501
506
507
+
502
508
QgsMergedBookmarksTableModel::QgsMergedBookmarksTableModel ( QAbstractTableModel &qgisTableModel, QAbstractTableModel &projectTableModel, QTreeView *treeView )
503
509
: mQgisTableModel( qgisTableModel )
504
510
, mProjectTableModel( projectTableModel )
@@ -512,19 +518,20 @@ QgsMergedBookmarksTableModel::QgsMergedBookmarksTableModel( QAbstractTableModel
512
518
connect (
513
519
&mQgisTableModel , &QAbstractTableModel::layoutChanged,
514
520
this , &QgsMergedBookmarksTableModel::allLayoutChanged );
515
- connect (
516
- &mQgisTableModel , &QAbstractTableModel::dataChanged,
517
- this , &QgsMergedBookmarksTableModel::qgisDataChanged );
521
+
518
522
connect (
519
523
&mQgisTableModel , &QAbstractTableModel::rowsInserted,
520
524
this , &QgsMergedBookmarksTableModel::allLayoutChanged );
525
+
521
526
connect (
522
527
&mQgisTableModel , &QAbstractTableModel::rowsRemoved,
523
528
this , &QgsMergedBookmarksTableModel::allLayoutChanged );
524
529
525
530
connect (
526
531
&projectTableModel, &QAbstractTableModel::layoutChanged,
527
532
this , &QgsMergedBookmarksTableModel::allLayoutChanged );
533
+
534
+
528
535
}
529
536
530
537
int QgsMergedBookmarksTableModel::rowCount ( const QModelIndex &parent ) const
@@ -539,33 +546,37 @@ int QgsMergedBookmarksTableModel::columnCount( const QModelIndex &parent ) const
539
546
540
547
QVariant QgsMergedBookmarksTableModel::data ( const QModelIndex &index, int role ) const
541
548
{
542
- // is project or application
543
- if ( index .column () == mQgisTableModel .columnCount () )
544
- {
545
- if ( role == Qt::CheckStateRole )
546
- {
547
- return index .row () < mQgisTableModel .rowCount () ? Qt::Unchecked : Qt::Checked;
548
- }
549
- else
550
- {
551
- return QVariant ();
552
- }
553
- }
554
- if ( index .row () < mQgisTableModel .rowCount () )
549
+ QVariant value;
550
+ // Is it checkbox column?
551
+ if ( index .column () == mQgisTableModel .columnCount () && role == Qt::CheckStateRole )
555
552
{
556
- return mQgisTableModel .data ( index , role ) ;
553
+ value = index . row () < mQgisTableModel .rowCount () ? Qt::Unchecked : Qt::Checked ;
557
554
}
558
555
else
559
556
{
560
- if ( role == Qt::DisplayRole || role == Qt::EditRole )
557
+ // Is it a SQLite stored entry ?
558
+ if ( index .row () < mQgisTableModel .rowCount () )
561
559
{
562
- return mProjectTableModel . data ( this -> index ( index . row () - mQgisTableModel .rowCount (), index . column () ) , role );
560
+ value = mQgisTableModel .data ( index , role );
563
561
}
564
- else
562
+ else // ... it is a project stored bookmark
565
563
{
566
- return mQgisTableModel .data ( this ->index ( 0 , index .column () ), role );
564
+ if ( role == Qt::DisplayRole || role == Qt::EditRole )
565
+ {
566
+ value = mProjectTableModel .data ( this ->index ( index .row () - mQgisTableModel .rowCount (), index .column () ), role );
567
+ }
568
+ else // Default roles from base model
569
+ {
570
+ value = mQgisTableModel .data ( this ->index ( 0 , index .column () ), role );
571
+ }
572
+ }
573
+ // Is it the projection column ?
574
+ if ( ( role == Qt::DisplayRole || role == Qt::EditRole ) && index .column ( ) == mQgisTableModel .columnCount () - 1 )
575
+ {
576
+ value = QgsCoordinateReferenceSystem::fromSrsId ( value.toInt ( ) ).authid ( );
567
577
}
568
578
}
579
+ return value;
569
580
}
570
581
571
582
bool QgsMergedBookmarksTableModel::setData ( const QModelIndex &index, const QVariant &value, int role )
@@ -575,13 +586,15 @@ bool QgsMergedBookmarksTableModel::setData( const QModelIndex &index, const QVar
575
586
{
576
587
if ( index .row () < mQgisTableModel .rowCount () )
577
588
{
589
+ // Move from SQLite storage to project
578
590
moveBookmark ( mQgisTableModel , mProjectTableModel , index .row () );
579
591
mTreeView ->scrollTo ( this ->index ( rowCount () - 1 , 1 ) );
580
592
mTreeView ->setCurrentIndex ( this ->index ( rowCount () - 1 , 1 ) );
581
593
mTreeView ->selectionModel ()->select ( this ->index ( rowCount () - 1 , 1 ), QItemSelectionModel::Rows );
582
594
}
583
595
else
584
596
{
597
+ // Move from project to SQLite storage
585
598
moveBookmark ( mProjectTableModel , mQgisTableModel , index .row () - mQgisTableModel .rowCount () );
586
599
mTreeView ->scrollTo ( this ->index ( mQgisTableModel .rowCount () - 1 , 1 ) );
587
600
mTreeView ->setCurrentIndex ( this ->index ( mQgisTableModel .rowCount () - 1 , 1 ) );
@@ -615,23 +628,31 @@ Qt::ItemFlags QgsMergedBookmarksTableModel::flags( const QModelIndex &index ) co
615
628
}
616
629
else
617
630
{
618
- flags |= Qt::ItemIsEditable;
631
+ // Skip projection: not editable!
632
+ if ( index .column () != mQgisTableModel .columnCount () - 1 )
633
+ flags |= Qt::ItemIsEditable;
619
634
}
620
635
return flags;
621
636
}
622
637
623
638
bool QgsMergedBookmarksTableModel::removeRows ( int row, int count, const QModelIndex &parent )
624
639
{
625
640
Q_ASSERT ( count == 1 );
626
-
641
+ bool result;
642
+ beginRemoveRows ( parent, row, row + count );
627
643
if ( row < mQgisTableModel .rowCount () )
628
644
{
629
- return mQgisTableModel .removeRows ( row, count, parent );
645
+ QSqlTableModel *qgisModel = static_cast <QSqlTableModel *>( &mQgisTableModel );
646
+ Q_ASSERT ( qgisModel );
647
+ result = qgisModel->removeRows ( row, count, parent );
648
+ qgisModel->select ();
630
649
}
631
650
else
632
651
{
633
- return mProjectTableModel .removeRows ( row - mQgisTableModel .rowCount (), count, parent );
652
+ result = mProjectTableModel .removeRows ( row - mQgisTableModel .rowCount (), count, parent );
634
653
}
654
+ endRemoveRows ();
655
+ return result;
635
656
}
636
657
637
658
QVariant QgsMergedBookmarksTableModel::headerData ( int section, Qt::Orientation orientation, int role ) const
@@ -666,34 +687,35 @@ void QgsMergedBookmarksTableModel::moveBookmark( QAbstractTableModel &modelFrom,
666
687
modelTo.insertRow ( -1 );
667
688
for ( int column = 1 ; column < modelFrom.columnCount () ; column++ )
668
689
{
690
+ Q_ASSERT ( modelTo.index ( modelTo.rowCount () - 1 , column ).isValid ( ) );
669
691
modelTo.setData (
670
692
modelTo.index ( modelTo.rowCount () - 1 , column ),
671
693
modelFrom.data ( modelFrom.index ( row, column ) ) );
672
694
}
695
+ qgisModel = dynamic_cast <QSqlTableModel *>( &modelFrom );
696
+ Q_ASSERT ( qgisModel );
697
+ qgisModel->removeRows ( row, 1 );
698
+ qgisModel->select ();
673
699
}
674
700
else
675
701
{
676
- QSqlQuery query ( " INSERT INTO tbl_bookmarks(bookmark_id,name,project_name,xmin,ymin,xmax,ymax,projection_srid)"
677
- " VALUES (NULL,:name,:project_name,:xmin,:ymin,:xmax,:ymax,:projection_srid)" ,
678
- qgisModel->database () );
702
+ QSqlRecord record = qgisModel->record ();
703
+ record.setValue ( 1 , modelFrom.data ( modelFrom.index ( row, 1 ) ).toString () );
704
+ record.setValue ( 2 , modelFrom.data ( modelFrom.index ( row, 2 ) ).toString () );
705
+ record.setValue ( 3 , modelFrom.data ( modelFrom.index ( row, 3 ) ).toDouble () );
706
+ record.setValue ( 4 , modelFrom.data ( modelFrom.index ( row, 4 ) ).toDouble () );
707
+ record.setValue ( 5 , modelFrom.data ( modelFrom.index ( row, 5 ) ).toDouble () );
708
+ record.setValue ( 6 , modelFrom.data ( modelFrom.index ( row, 6 ) ).toDouble () );
709
+ record.setValue ( 7 , modelFrom.data ( modelFrom.index ( row, 7 ) ).toInt () );
679
710
680
- query.bindValue ( QStringLiteral ( " :name" ), modelFrom.data ( modelFrom.index ( row, 1 ) ).toString () );
681
- query.bindValue ( QStringLiteral ( " :project_name" ), modelFrom.data ( modelFrom.index ( row, 2 ) ).toString () );
682
- query.bindValue ( QStringLiteral ( " :xmin" ), modelFrom.data ( modelFrom.index ( row, 3 ) ).toDouble () );
683
- query.bindValue ( QStringLiteral ( " :ymin" ), modelFrom.data ( modelFrom.index ( row, 4 ) ).toDouble () );
684
- query.bindValue ( QStringLiteral ( " :xmax" ), modelFrom.data ( modelFrom.index ( row, 5 ) ).toDouble () );
685
- query.bindValue ( QStringLiteral ( " :ymax" ), modelFrom.data ( modelFrom.index ( row, 6 ) ).toDouble () );
686
- query.bindValue ( QStringLiteral ( " :projection_srid" ), modelFrom.data ( modelFrom.index ( row, 7 ) ).toInt () );
687
-
688
- if ( !query.exec () )
711
+ if ( ! qgisModel->insertRecord ( -1 , record ) )
689
712
{
690
713
QgsDebugMsg ( QString ( " Could not move bookmark: %1" )
691
- .arg ( query .lastError ().text () ) );
714
+ .arg ( qgisModel-> database () .lastError ().text () ) );
692
715
return ;
693
716
}
694
717
qgisModel->setSort ( 0 , Qt::AscendingOrder );
695
718
qgisModel->select ();
719
+ modelFrom.removeRows ( row, 1 );
696
720
}
697
-
698
- modelFrom.removeRow ( row );
699
721
}
0 commit comments