Skip to content

Commit 11a5a69

Browse files
sbrunnerNathanW2
authored andcommittedMay 10, 2016
Be able to store the bookmarks in the project (#2661)
1 parent d278b95 commit 11a5a69

File tree

2 files changed

+430
-34
lines changed

2 files changed

+430
-34
lines changed
 

‎src/app/qgsbookmarks.cpp

Lines changed: 348 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
#include <QSettings>
3131
#include <QSqlError>
3232
#include <QSqlQuery>
33-
#include <QSqlTableModel>
33+
#include <QModelIndex>
34+
#include <QAbstractTableModel>
3435

3536

3637
QgsBookmarks::QgsBookmarks( QWidget *parent ) : QDockWidget( parent )
@@ -75,23 +76,26 @@ QgsBookmarks::QgsBookmarks( QWidget *parent ) : QDockWidget( parent )
7576
return;
7677
}
7778

78-
QSqlTableModel *model = new QSqlTableModel( this, db );
79-
model->setTable( "tbl_bookmarks" );
80-
model->setSort( 0, Qt::AscendingOrder );
81-
model->setEditStrategy( QSqlTableModel::OnFieldChange );
82-
model->select();
79+
mQgisModel = new QSqlTableModel( this, db );
80+
mQgisModel->setTable( "tbl_bookmarks" );
81+
mQgisModel->setSort( 0, Qt::AscendingOrder );
82+
mQgisModel->select();
83+
mQgisModel->setEditStrategy( QSqlTableModel::OnFieldChange );
8384

8485
// set better headers then column names from table
85-
model->setHeaderData( 0, Qt::Horizontal, tr( "ID" ) );
86-
model->setHeaderData( 1, Qt::Horizontal, tr( "Name" ) );
87-
model->setHeaderData( 2, Qt::Horizontal, tr( "Project" ) );
88-
model->setHeaderData( 3, Qt::Horizontal, tr( "xMin" ) );
89-
model->setHeaderData( 4, Qt::Horizontal, tr( "yMin" ) );
90-
model->setHeaderData( 5, Qt::Horizontal, tr( "xMax" ) );
91-
model->setHeaderData( 6, Qt::Horizontal, tr( "yMax" ) );
92-
model->setHeaderData( 7, Qt::Horizontal, tr( "SRID" ) );
86+
mQgisModel->setHeaderData( 0, Qt::Horizontal, tr( "ID" ) );
87+
mQgisModel->setHeaderData( 1, Qt::Horizontal, tr( "Name" ) );
88+
mQgisModel->setHeaderData( 2, Qt::Horizontal, tr( "Project" ) );
89+
mQgisModel->setHeaderData( 3, Qt::Horizontal, tr( "xMin" ) );
90+
mQgisModel->setHeaderData( 4, Qt::Horizontal, tr( "yMin" ) );
91+
mQgisModel->setHeaderData( 5, Qt::Horizontal, tr( "xMax" ) );
92+
mQgisModel->setHeaderData( 6, Qt::Horizontal, tr( "yMax" ) );
93+
mQgisModel->setHeaderData( 7, Qt::Horizontal, tr( "SRID" ) );
9394

94-
lstBookmarks->setModel( model );
95+
mProjectModel = new QgsProjectBookmarksTableModel();
96+
mModel.reset( new QgsMergedBookmarksTableModel( *mQgisModel, *mProjectModel, lstBookmarks ) );
97+
98+
lstBookmarks->setModel( mModel.data() );
9599

96100
QSettings settings;
97101
lstBookmarks->header()->restoreState( settings.value( "/Windows/Bookmarks/headerstate" ).toByteArray() );
@@ -103,7 +107,8 @@ QgsBookmarks::QgsBookmarks( QWidget *parent ) : QDockWidget( parent )
103107

104108
QgsBookmarks::~QgsBookmarks()
105109
{
106-
delete lstBookmarks->model();
110+
delete mQgisModel;
111+
delete mProjectModel;
107112
QSqlDatabase::removeDatabase( "bookmarks" );
108113
saveWindowLocation();
109114
}
@@ -123,15 +128,15 @@ void QgsBookmarks::saveWindowLocation()
123128

124129
void QgsBookmarks::addClicked()
125130
{
126-
QSqlTableModel *model = qobject_cast<QSqlTableModel *>( lstBookmarks->model() );
127-
Q_ASSERT( model );
131+
Q_ASSERT( mModel );
132+
Q_ASSERT( mQgisModel );
128133

129134
QgsMapCanvas *canvas = QgisApp::instance()->mapCanvas();
130135
Q_ASSERT( canvas );
131136

132137
QSqlQuery query( "INSERT INTO tbl_bookmarks(bookmark_id,name,project_name,xmin,ymin,xmax,ymax,projection_srid)"
133138
" VALUES (NULL,:name,:project_name,:xmin,:xmax,:ymin,:ymax,:projection_srid)",
134-
model->database() );
139+
mQgisModel->database() );
135140

136141
QString projStr( "" );
137142
if ( QgsProject::instance() )
@@ -156,11 +161,11 @@ void QgsBookmarks::addClicked()
156161
query.bindValue( ":projection_srid", QVariant::fromValue( canvas->mapSettings().destinationCrs().srsid() ) );
157162
if ( query.exec() )
158163
{
159-
model->setSort( 0, Qt::AscendingOrder );
160-
model->select();
161-
lstBookmarks->scrollToBottom();
162-
lstBookmarks->setCurrentIndex( model->index( model->rowCount() - 1, 1 ) );
163-
lstBookmarks->edit( model->index( model->rowCount() - 1, 1 ) );
164+
mQgisModel->setSort( 0, Qt::AscendingOrder );
165+
mQgisModel->select();
166+
lstBookmarks->scrollTo( mModel->index( mQgisModel->rowCount() - 1, 1 ) );
167+
lstBookmarks->setCurrentIndex( mModel->index( mQgisModel->rowCount() - 1, 1 ) );
168+
lstBookmarks->edit( mModel->index( mQgisModel->rowCount() - 1, 1 ) );
164169
}
165170
else
166171
{
@@ -193,7 +198,7 @@ void QgsBookmarks::deleteClicked()
193198
int i = 0;
194199
Q_FOREACH ( int row, rows )
195200
{
196-
lstBookmarks->model()->removeRow( row - i );
201+
mModel->removeRow( row - i );
197202
i++;
198203
}
199204
}
@@ -265,8 +270,7 @@ void QgsBookmarks::importFromXML()
265270
QDomElement docElem = doc.documentElement();
266271
QDomNodeList nodeList = docElem.elementsByTagName( "bookmark" );
267272

268-
QSqlTableModel *model = qobject_cast<QSqlTableModel *>( lstBookmarks->model() );
269-
Q_ASSERT( model );
273+
Q_ASSERT( mModel );
270274

271275
QString queries;
272276

@@ -293,7 +297,7 @@ void QgsBookmarks::importFromXML()
293297
}
294298

295299
QStringList queriesList = queries.split( ';' );
296-
QSqlQuery query( model->database() );
300+
QSqlQuery query( mQgisModel->database() );
297301

298302
Q_FOREACH ( const QString& queryTxt, queriesList )
299303
{
@@ -309,8 +313,8 @@ void QgsBookmarks::importFromXML()
309313
}
310314
query.finish();
311315
}
312-
model->setSort( 0, Qt::AscendingOrder );
313-
model->select();
316+
mQgisModel->setSort( 0, Qt::AscendingOrder );
317+
mQgisModel->select();
314318
}
315319

316320
void QgsBookmarks::exportToXML()
@@ -335,8 +339,8 @@ void QgsBookmarks::exportToXML()
335339
QDomElement root = doc.createElement( "qgis_bookmarks" );
336340
doc.appendChild( root );
337341

338-
int rowCount = lstBookmarks->model()->rowCount();
339-
int colCount = lstBookmarks->model()->columnCount();
342+
int rowCount = mModel->rowCount();
343+
int colCount = mModel->columnCount();
340344

341345
QList<QString> headerList;
342346
headerList << "id" << "name" << "project" << "xmin"
@@ -348,7 +352,7 @@ void QgsBookmarks::exportToXML()
348352
root.appendChild( bookmark );
349353
for ( int j = 0; j < colCount; j++ )
350354
{
351-
QModelIndex idx = lstBookmarks->model()->index( i, j );
355+
QModelIndex idx = mModel->index( i, j );
352356
if ( idx.isValid() )
353357
{
354358
QString value = idx.data( Qt::DisplayRole ).toString();
@@ -375,3 +379,314 @@ void QgsBookmarks::exportToXML()
375379

376380
settings.setValue( "/Windows/Bookmarks/LastUsedDirectory", QFileInfo( fileName ).path() );
377381
}
382+
383+
384+
QgsProjectBookmarksTableModel::QgsProjectBookmarksTableModel()
385+
{
386+
QObject::connect(
387+
QgisApp::instance(), SIGNAL( projectRead() ),
388+
this, SLOT( projectRead() ) );
389+
}
390+
391+
int QgsProjectBookmarksTableModel::rowCount( const QModelIndex& parent ) const
392+
{
393+
Q_UNUSED( parent );
394+
395+
return QgsProject::instance()->readNumEntry( "Bookmarks", "/count" );
396+
}
397+
398+
int QgsProjectBookmarksTableModel::columnCount( const QModelIndex& parent ) const
399+
{
400+
Q_UNUSED( parent );
401+
402+
return 8;
403+
}
404+
405+
QVariant QgsProjectBookmarksTableModel::data( const QModelIndex& index, int role ) const
406+
{
407+
Q_UNUSED( role );
408+
Q_ASSERT( role == Qt::DisplayRole );
409+
410+
switch ( index.column() )
411+
{
412+
case 1:
413+
return QgsProject::instance()->readEntry( "Bookmarks", QString( "/Row-%1/Name" ).arg( index.row() ) );
414+
case 2:
415+
return QgsProject::instance()->readEntry( "Bookmarks", QString( "/Row-%1/Project" ).arg( index.row() ) );
416+
case 3:
417+
return QgsProject::instance()->readDoubleEntry( "Bookmarks", QString( "/Row-%1/MinX" ).arg( index.row() ) );
418+
case 4:
419+
return QgsProject::instance()->readDoubleEntry( "Bookmarks", QString( "/Row-%1/MinY" ).arg( index.row() ) );
420+
case 5:
421+
return QgsProject::instance()->readDoubleEntry( "Bookmarks", QString( "/Row-%1/MaxX" ).arg( index.row() ) );
422+
case 6:
423+
return QgsProject::instance()->readDoubleEntry( "Bookmarks", QString( "/Row-%1/MaxY" ).arg( index.row() ) );
424+
case 7:
425+
return QgsProject::instance()->readNumEntry( "Bookmarks", QString( "/Row-%1/SRID" ).arg( index.row() ) );
426+
default:
427+
return QVariant();
428+
}
429+
}
430+
431+
bool QgsProjectBookmarksTableModel::setData( const QModelIndex& index, const QVariant& value, int role )
432+
{
433+
Q_UNUSED( role );
434+
Q_ASSERT( role == Qt::EditRole );
435+
436+
switch ( index.column() )
437+
{
438+
case 1:
439+
QgsProject::instance()->writeEntry( "Bookmarks", QString( "/Row-%1/Name" ).arg( index.row() ), value.value<QString>() );
440+
return true;
441+
case 2:
442+
QgsProject::instance()->writeEntry( "Bookmarks", QString( "/Row-%1/Project" ).arg( index.row() ), value.value<QString>() );
443+
return true;
444+
case 3:
445+
QgsProject::instance()->writeEntry( "Bookmarks", QString( "/Row-%1/MinX" ).arg( index.row() ), value.toDouble() );
446+
return true;
447+
case 4:
448+
QgsProject::instance()->writeEntry( "Bookmarks", QString( "/Row-%1/MinY" ).arg( index.row() ), value.toDouble() );
449+
return true;
450+
case 5:
451+
QgsProject::instance()->writeEntry( "Bookmarks", QString( "/Row-%1/MaxX" ).arg( index.row() ), value.toDouble() );
452+
return true;
453+
case 6:
454+
QgsProject::instance()->writeEntry( "Bookmarks", QString( "/Row-%1/MaxY" ).arg( index.row() ), value.toDouble() );
455+
return true;
456+
case 7:
457+
QgsProject::instance()->writeEntry( "Bookmarks", QString( "/Row-%1/SRID" ).arg( index.row() ), value.toInt() );
458+
return true;
459+
default:
460+
return false;
461+
}
462+
}
463+
464+
bool QgsProjectBookmarksTableModel::insertRows( int row, int count, const QModelIndex& parent )
465+
{
466+
Q_UNUSED( row );
467+
Q_UNUSED( parent );
468+
469+
return QgsProject::instance()->writeEntry( "Bookmarks", "/count", QgsProject::instance()->readNumEntry( "Bookmarks", "/count" ) + count );
470+
}
471+
472+
bool QgsProjectBookmarksTableModel::removeRows( int row, int count, const QModelIndex& parent )
473+
{
474+
Q_UNUSED( parent );
475+
476+
for ( int newRow = row ; newRow < rowCount() - count ; newRow++ )
477+
{
478+
for ( int column = 0 ; column < columnCount() ; column++ )
479+
{
480+
setData( index( newRow, column ), data( index( newRow + count, column ) ) );
481+
}
482+
}
483+
for ( int newRow = rowCount() - count ; newRow < rowCount() ; newRow++ )
484+
{
485+
QgsProject::instance()->removeEntry( "Bookmarks", QString( "/Row-%1" ).arg( newRow ) );
486+
}
487+
488+
QgsProject::instance()->writeEntry( "Bookmarks", "/count", QgsProject::instance()->readNumEntry( "Bookmarks", "/count" ) - count );
489+
490+
return true;
491+
}
492+
493+
QgsMergedBookmarksTableModel::QgsMergedBookmarksTableModel( QAbstractTableModel& qgisTableModel, QAbstractTableModel& projectTableModel, QTreeView* treeView ):
494+
mQgisTableModel( qgisTableModel ),
495+
mProjectTableModel( projectTableModel ),
496+
mTreeView( treeView )
497+
{
498+
QObject::connect(
499+
QgisApp::instance(), SIGNAL( projectRead() ),
500+
this, SLOT( projectRead() ) );
501+
502+
QObject::connect(
503+
&mQgisTableModel, SIGNAL( layoutChanged() ),
504+
this, SLOT( allLayoutChanged() ) );
505+
QObject::connect(
506+
&mQgisTableModel, SIGNAL( dataChanged( const QModelIndex&, const QModelIndex& ) ),
507+
this, SLOT( qgisDataChanged( const QModelIndex&, const QModelIndex& ) ) );
508+
QObject::connect(
509+
&mQgisTableModel, SIGNAL( rowsInserted( const QModelIndex&, int, int ) ),
510+
this, SLOT( allLayoutChanged() ) );
511+
QObject::connect(
512+
&mQgisTableModel, SIGNAL( rowsRemoved( const QModelIndex&, int, int ) ),
513+
this, SLOT( allLayoutChanged() ) );
514+
515+
QObject::connect(
516+
&projectTableModel, SIGNAL( layoutChanged() ),
517+
this, SLOT( allLayoutChanged() ) );
518+
QObject::connect(
Code has comments. Press enter to view.
519+
&projectTableModel, SIGNAL( projectDataChanged( const QModelIndex&, const QModelIndex& ) ),
520+
this, SLOT( dataChanged( const QModelIndex&, const QModelIndex& ) ) );
521+
QObject::connect(
522+
&projectTableModel, SIGNAL( projectRowsInserted( const QModelIndex&, int, int ) ),
523+
this, SLOT( allLayoutChanged() ) );
524+
QObject::connect(
525+
&projectTableModel, SIGNAL( ProjectRowsRemoved( const QModelIndex&, int, int ) ),
526+
this, SLOT( allLayoutChanged() ) );
527+
}
528+
529+
int QgsMergedBookmarksTableModel::rowCount( const QModelIndex& parent ) const
530+
{
531+
return mQgisTableModel.rowCount( parent ) + mProjectTableModel.rowCount( parent );
532+
}
533+
534+
int QgsMergedBookmarksTableModel::columnCount( const QModelIndex& parent ) const
535+
{
536+
return mQgisTableModel.columnCount( parent ) + 1;
537+
}
538+
539+
QVariant QgsMergedBookmarksTableModel::data( const QModelIndex& index, int role ) const
540+
{
541+
// is project or application
542+
if ( index.column() == mQgisTableModel.columnCount() )
543+
{
544+
if ( role == Qt::CheckStateRole )
545+
{
546+
return index.row() < mQgisTableModel.rowCount() ? Qt::Unchecked : Qt::Checked;
547+
}
548+
else
549+
{
550+
return QVariant();
551+
}
552+
}
553+
if ( index.row() < mQgisTableModel.rowCount() )
554+
{
555+
return mQgisTableModel.data( index, role );
556+
}
557+
else
558+
{
559+
if ( role == Qt::DisplayRole || role == Qt::EditRole )
560+
{
561+
return mProjectTableModel.data( this->index( index.row() - mQgisTableModel.rowCount(), index.column() ), role );
562+
}
563+
else
564+
{
565+
return mQgisTableModel.data( this->index( 0, index.column() ), role );
566+
}
567+
}
568+
}
569+
570+
bool QgsMergedBookmarksTableModel::setData( const QModelIndex& index, const QVariant& value, int role )
571+
{
572+
// is project or QGIS
573+
if ( index.column() == mQgisTableModel.columnCount() )
574+
{
575+
if ( index.row() < mQgisTableModel.rowCount() )
576+
{
577+
moveBookmark( mQgisTableModel, mProjectTableModel, index.row() );
578+
mTreeView->scrollTo( this->index( rowCount() - 1, 1 ) );
579+
mTreeView->setCurrentIndex( this->index( rowCount() - 1, 1 ) );
580+
mTreeView->selectionModel()->select( this->index( rowCount() - 1, 1 ), QItemSelectionModel::Rows );
581+
}
582+
else
583+
{
584+
moveBookmark( mProjectTableModel, mQgisTableModel, index.row() - mQgisTableModel.rowCount() );
585+
mTreeView->scrollTo( this->index( mQgisTableModel.rowCount() - 1, 1 ) );
586+
mTreeView->setCurrentIndex( this->index( mQgisTableModel.rowCount() - 1, 1 ) );
587+
mTreeView->selectionModel()->select( this->index( mQgisTableModel.rowCount() - 1, 1 ), QItemSelectionModel::Rows );
588+
}
589+
return true;
590+
}
591+
if ( index.column() < mQgisTableModel.rowCount() )
592+
{
593+
return mQgisTableModel.setData( index, value, role );
594+
}
595+
else
596+
{
597+
return mProjectTableModel.setData( this->index( index.row() - mQgisTableModel.rowCount(), index.column() ), value, role );
598+
}
599+
}
600+
601+
Qt::ItemFlags QgsMergedBookmarksTableModel::flags( const QModelIndex& index ) const
602+
{
603+
Q_UNUSED( index );
604+
605+
Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
606+
if ( index.column() == mQgisTableModel.columnCount() )
607+
{
608+
if ( !mProjectOpen )
609+
{
610+
return Qt::ItemIsSelectable;
611+
}
612+
flags |= Qt::ItemIsUserCheckable;
613+
}
614+
else
615+
{
616+
flags |= Qt::ItemIsEditable;
617+
}
618+
return flags;
619+
}
620+
621+
bool QgsMergedBookmarksTableModel::removeRows( int row, int count, const QModelIndex& parent )
622+
{
623+
Q_ASSERT( count == 1 );
624+
625+
if ( row < mQgisTableModel.rowCount() )
626+
{
627+
return mQgisTableModel.removeRows( row, count, parent );
628+
}
629+
else
630+
{
631+
return mProjectTableModel.removeRows( row - mQgisTableModel.rowCount(), count, parent );
632+
}
633+
}
634+
635+
QVariant QgsMergedBookmarksTableModel::headerData( int section, Qt::Orientation orientation, int role ) const
636+
{
637+
if ( section == mQgisTableModel.columnCount() )
638+
{
639+
if ( role == Qt::DisplayRole )
640+
{
641+
return QVariant( tr( "In Project" ) );
642+
}
643+
else
644+
{
645+
return mQgisTableModel.headerData( 0, orientation, role );
646+
}
647+
}
648+
else
649+
{
650+
return mQgisTableModel.headerData( section, orientation, role );
651+
}
652+
}
653+
654+
QAbstractTableModel* QgsMergedBookmarksTableModel::qgisModel()
655+
{
656+
return &mQgisTableModel;
657+
}
658+
659+
void QgsMergedBookmarksTableModel::moveBookmark( QAbstractTableModel& modelFrom, QAbstractTableModel& modelTo, int row )
660+
{
661+
QSqlTableModel* qgisModel = dynamic_cast<QSqlTableModel*>( &modelTo );
662+
if ( qgisModel == NULL )
663+
{
664+
modelTo.insertRow( -1 );
665+
for ( int column = 1 ; column < modelFrom.columnCount() ; column++ )
666+
{
667+
modelTo.setData(
668+
modelTo.index( modelTo.rowCount() - 1, column ),
669+
modelFrom.data( modelFrom.index( row, column ) ) );
670+
}
671+
}
672+
else
673+
{
674+
QSqlQuery query( "INSERT INTO tbl_bookmarks(bookmark_id,name,project_name,xmin,ymin,xmax,ymax,projection_srid)"
675+
" VALUES (NULL,:name,:project_name,:xmin,:xmax,:ymin,:ymax,:projection_srid)",
676+
qgisModel->database() );
677+
678+
query.bindValue( ":name", modelFrom.data( modelFrom.index( row, 1 ) ).value<QString>() );
679+
query.bindValue( ":project_name", modelFrom.data( modelFrom.index( row, 2 ) ).value<QString>() );
680+
query.bindValue( ":xmin", modelFrom.data( modelFrom.index( row, 3 ) ).toDouble() );
681+
query.bindValue( ":ymin", modelFrom.data( modelFrom.index( row, 4 ) ).toDouble() );
682+
query.bindValue( ":xmax", modelFrom.data( modelFrom.index( row, 5 ) ).toDouble() );
683+
query.bindValue( ":ymax", modelFrom.data( modelFrom.index( row, 6 ) ).toDouble() );
684+
query.bindValue( ":projection_srid", modelFrom.data( modelFrom.index( row, 7 ) ).toInt() );
685+
686+
query.exec();
687+
qgisModel->setSort( 0, Qt::AscendingOrder );
688+
qgisModel->select();
689+
}
690+
691+
modelFrom.removeRow( row );
692+
}

‎src/app/qgsbookmarks.h

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,88 @@
1818
#define QGSBOOKMARKS_H
1919

2020
#include <QDockWidget>
21+
#include <QSqlTableModel>
22+
#include <QScopedPointer>
2123

2224
#include "ui_qgsbookmarksbase.h"
2325
#include "qgscontexthelp.h"
2426

27+
28+
/*
29+
* Model for project bookmarks
30+
*/
31+
class QgsProjectBookmarksTableModel: public QAbstractTableModel
32+
{
33+
Q_OBJECT
34+
35+
public:
36+
37+
QgsProjectBookmarksTableModel();
38+
39+
int rowCount( const QModelIndex& parent = QModelIndex() ) const override;
40+
41+
int columnCount( const QModelIndex& parent = QModelIndex() ) const override;
42+
43+
QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const override;
44+
45+
bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ) override;
46+
47+
bool insertRows( int row, int count, const QModelIndex& parent = QModelIndex() ) override;
48+
49+
bool removeRows( int row, int count, const QModelIndex& parent = QModelIndex() ) override;
50+
51+
private slots:
52+
void projectRead() { emit layoutChanged(); };
53+
};
54+
55+
/*
56+
* Model that merge the QGIS and project model
57+
*/
58+
class QgsMergedBookmarksTableModel: public QAbstractTableModel
59+
{
60+
Q_OBJECT
61+
62+
public:
63+
64+
QgsMergedBookmarksTableModel( QAbstractTableModel& qgisTableModel, QAbstractTableModel& projectTableModel, QTreeView* treeView );
65+
66+
int rowCount( const QModelIndex& parent = QModelIndex() ) const override;
67+
68+
int columnCount( const QModelIndex& parent = QModelIndex() ) const override;
69+
70+
QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const override;
71+
72+
bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole ) override;
73+
Qt::ItemFlags flags( const QModelIndex& index ) const override;
74+
75+
bool removeRows( int row, int count, const QModelIndex& parent = QModelIndex() ) override;
76+
QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override;
77+
QAbstractTableModel* qgisModel();
78+
79+
private:
80+
QAbstractTableModel& mQgisTableModel;
81+
QAbstractTableModel& mProjectTableModel;
82+
QTreeView* mTreeView;
83+
bool mProjectOpen;
84+
85+
void moveBookmark( QAbstractTableModel& modelFrom, QAbstractTableModel& modelTo, int row );
86+
87+
private slots:
88+
void projectRead() { mProjectOpen = true; };
89+
void allLayoutChanged() { emit layoutChanged(); };
90+
void qgisDataChanged( const QModelIndex& topLeft, const QModelIndex& bottomRight )
91+
{
92+
emit dataChanged( topLeft, bottomRight );
93+
};
94+
void projectDataChanged( const QModelIndex& topLeft, const QModelIndex& bottomRight )
95+
{
96+
emit dataChanged(
97+
index( topLeft.row() + mQgisTableModel.rowCount(), topLeft.column() ),
98+
index( bottomRight.row() + mQgisTableModel.rowCount(), bottomRight.column() ) );
99+
};
100+
};
101+
102+
25103
class APP_EXPORT QgsBookmarks : public QDockWidget, private Ui::QgsBookmarksBase
26104
{
27105
Q_OBJECT
@@ -43,11 +121,14 @@ class APP_EXPORT QgsBookmarks : public QDockWidget, private Ui::QgsBookmarksBase
43121
void on_actionHelp_triggered() { QgsContextHelp::run( metaObject()->className() ); }
44122

45123
private:
124+
QSqlTableModel* mQgisModel;
125+
QgsProjectBookmarksTableModel* mProjectModel;
126+
QScopedPointer<QgsMergedBookmarksTableModel> mModel;
127+
46128
void saveWindowLocation();
47129
void restorePosition();
48130

49131
};
50132

51133

52134
#endif // QGSBOOKMARKS_H
53-

0 commit comments

Comments
 (0)
Please sign in to comment.