Skip to content

Commit 5d4b581

Browse files
authored
Merge pull request #5852 from elpaso/bugfix-bookmarks-take2
[bugfix] bookmarks sorting and multiple deletion
2 parents f5cd856 + 78554dd commit 5d4b581

File tree

4 files changed

+60
-42
lines changed

4 files changed

+60
-42
lines changed

src/app/qgsbookmarks.cpp

+53-39
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,24 @@ QgsBookmarks::QgsBookmarks( QWidget *parent )
103103
mQgisModel->setHeaderData( 7, Qt::Horizontal, tr( "SRID" ) );
104104

105105
mProjectModel = new QgsProjectBookmarksTableModel( this );
106-
mModel = new QgsMergedBookmarksTableModel( *mQgisModel, *mProjectModel, lstBookmarks, this );
106+
mMergedModel = new QgsMergedBookmarksTableModel( *mQgisModel, *mProjectModel, lstBookmarks, this );
107107

108108
mProxyModel = new QgsBookmarksProxyModel( this );
109-
mProxyModel->setSourceModel( mModel );
109+
mProxyModel->setSourceModel( mMergedModel );
110110

111111
lstBookmarks->setModel( mProxyModel );
112112
lstBookmarks->setItemDelegate( new QgsDoubleSpinBoxBookmarksDelegate( this ) );
113+
lstBookmarks->setSortingEnabled( true );
114+
lstBookmarks->sortByColumn( 1, Qt::AscendingOrder );
113115

114-
connect( mModel, &QgsMergedBookmarksTableModel::layoutChanged, mProxyModel, &QgsBookmarksProxyModel::_resetModel );
116+
connect( mMergedModel, &QgsMergedBookmarksTableModel::selectItem, this, [ = ]( const QModelIndex & index )
117+
{
118+
QModelIndex proxyIndex( mProxyModel->mapFromSource( index ) );
119+
lstBookmarks->scrollTo( proxyIndex );
120+
lstBookmarks->setCurrentIndex( proxyIndex );
121+
} );
122+
123+
connect( mMergedModel, &QgsMergedBookmarksTableModel::layoutChanged, mProxyModel, &QgsBookmarksProxyModel::_resetModel );
115124

116125
QgsSettings settings;
117126
lstBookmarks->header()->restoreState( settings.value( QStringLiteral( "Windows/Bookmarks/headerstate" ) ).toByteArray() );
@@ -143,7 +152,7 @@ void QgsBookmarks::saveWindowLocation()
143152

144153
void QgsBookmarks::addClicked()
145154
{
146-
Q_ASSERT( mModel );
155+
Q_ASSERT( mMergedModel );
147156
Q_ASSERT( mQgisModel );
148157

149158
QgsMapCanvas *canvas = QgisApp::instance()->mapCanvas();
@@ -176,7 +185,7 @@ void QgsBookmarks::addClicked()
176185
{
177186
mQgisModel->setSort( 0, Qt::AscendingOrder );
178187
mQgisModel->select();
179-
QModelIndex newIdx = mProxyModel->mapFromSource( mModel->index( mQgisModel->rowCount() - 1, 1 ) );
188+
QModelIndex newIdx = mProxyModel->mapFromSource( mMergedModel->index( mQgisModel->rowCount() - 1, 1 ) );
180189
// Edit new bookmark title
181190
lstBookmarks->scrollTo( newIdx );
182191
lstBookmarks->setCurrentIndex( newIdx );
@@ -192,16 +201,15 @@ void QgsBookmarks::addClicked()
192201

193202
void QgsBookmarks::deleteClicked()
194203
{
195-
QList<int> rows;
196-
Q_FOREACH ( const QModelIndex &idx, lstBookmarks->selectionModel()->selectedIndexes() )
204+
QItemSelection selection( mProxyModel->mapSelectionToSource( lstBookmarks->selectionModel()->selection() ) );
205+
std::vector<int> rows;
206+
for ( const auto &selectedIdx : selection.indexes() )
197207
{
198-
if ( idx.column() == 1 )
199-
{
200-
rows << idx.row();
201-
}
208+
if ( selectedIdx.column() == 1 )
209+
rows.push_back( selectedIdx.row() );
202210
}
203211

204-
if ( rows.isEmpty() )
212+
if ( rows.size() == 0 )
205213
return;
206214

207215
// make sure the user really wants to delete these bookmarks
@@ -210,12 +218,14 @@ void QgsBookmarks::deleteClicked()
210218
QMessageBox::Ok | QMessageBox::Cancel ) )
211219
return;
212220

213-
int i = 0;
214-
Q_FOREACH ( int row, rows )
221+
// Remove in reverse order to keep the merged model indexes
222+
std::sort( rows.begin(), rows.end(), std::greater<int>() );
223+
224+
for ( const auto &row : rows )
215225
{
216-
mModel->removeRow( row - i );
217-
i++;
226+
mMergedModel->removeRow( row );
218227
}
228+
mProxyModel->_resetModel();
219229
}
220230

221231
void QgsBookmarks::lstBookmarks_doubleClicked( const QModelIndex &index )
@@ -285,7 +295,7 @@ void QgsBookmarks::importFromXml()
285295
QDomElement docElem = doc.documentElement();
286296
QDomNodeList nodeList = docElem.elementsByTagName( QStringLiteral( "bookmark" ) );
287297

288-
Q_ASSERT( mModel );
298+
Q_ASSERT( mMergedModel );
289299

290300
QString queries;
291301

@@ -354,8 +364,8 @@ void QgsBookmarks::exportToXml()
354364
QDomElement root = doc.createElement( QStringLiteral( "qgis_bookmarks" ) );
355365
doc.appendChild( root );
356366

357-
int rowCount = mModel->rowCount();
358-
int colCount = mModel->columnCount() - 1; // exclude virtual "In project" column
367+
int rowCount = mMergedModel->rowCount();
368+
int colCount = mMergedModel->columnCount() - 1; // exclude virtual "In project" column
359369

360370
QList<QString> headerList;
361371
headerList
@@ -374,7 +384,7 @@ void QgsBookmarks::exportToXml()
374384
root.appendChild( bookmark );
375385
for ( int j = 0; j < colCount; j++ )
376386
{
377-
QModelIndex idx = mModel->index( i, j );
387+
QModelIndex idx = mMergedModel->index( i, j );
378388
if ( idx.isValid() )
379389
{
380390
QString value = idx.data( Qt::DisplayRole ).toString();
@@ -489,9 +499,11 @@ bool QgsProjectBookmarksTableModel::setData( const QModelIndex &index, const QVa
489499
bool QgsProjectBookmarksTableModel::insertRows( int row, int count, const QModelIndex &parent )
490500
{
491501
Q_UNUSED( parent );
492-
beginInsertRows( parent, row, row + count );
493-
494-
bool result = QgsProject::instance()->writeEntry( QStringLiteral( "Bookmarks" ), QStringLiteral( "/count" ), QgsProject::instance()->readNumEntry( QStringLiteral( "Bookmarks" ), QStringLiteral( "/count" ) ) + count );
502+
Q_UNUSED( row );
503+
// append
504+
int oldCount = QgsProject::instance()->readNumEntry( QStringLiteral( "Bookmarks" ), QStringLiteral( "/count" ) );
505+
beginInsertRows( parent, oldCount, oldCount + count );
506+
bool result = QgsProject::instance()->writeEntry( QStringLiteral( "Bookmarks" ), QStringLiteral( "/count" ), oldCount + count );
495507
endInsertRows();
496508
return result;
497509
}
@@ -603,36 +615,39 @@ QVariant QgsMergedBookmarksTableModel::data( const QModelIndex &index, int role
603615

604616
bool QgsMergedBookmarksTableModel::setData( const QModelIndex &index, const QVariant &value, int role )
605617
{
618+
bool result = false;
606619
// last column triggers a move from QGIS to project bookmark
607620
if ( index.column() == mQgisTableModel.columnCount() )
608621
{
609622
if ( index.row() < mQgisTableModel.rowCount() )
610623
{
611624
// Move from SQLite storage to project
612625
moveBookmark( mQgisTableModel, mProjectTableModel, index.row() );
613-
mTreeView->scrollTo( this->index( rowCount() - 1, 1 ) );
614-
mTreeView->setCurrentIndex( this->index( rowCount() - 1, 1 ) );
615-
mTreeView->selectionModel()->select( this->index( rowCount() - 1, 1 ), QItemSelectionModel::Rows );
626+
emit selectItem( this->index( rowCount() - 1, 1 ) );
616627
}
617628
else
618629
{
619630
//Move from project to SQLite storage
620631
moveBookmark( mProjectTableModel, mQgisTableModel, index.row() - mQgisTableModel.rowCount() );
621-
mTreeView->scrollTo( this->index( mQgisTableModel.rowCount() - 1, 1 ) );
622-
mTreeView->setCurrentIndex( this->index( mQgisTableModel.rowCount() - 1, 1 ) );
623-
mTreeView->selectionModel()->select( this->index( mQgisTableModel.rowCount() - 1, 1 ), QItemSelectionModel::Rows );
632+
emit selectItem( this->index( mQgisTableModel.rowCount() - 1, 1 ) );
624633
}
625-
return true;
626-
}
627-
628-
if ( index.row() < mQgisTableModel.rowCount() )
629-
{
630-
return mQgisTableModel.setData( index, value, role );
634+
result = true;
631635
}
632636
else
633637
{
634-
return mProjectTableModel.setData( this->index( index.row() - mQgisTableModel.rowCount(), index.column() ), value, role );
638+
639+
if ( index.row() < mQgisTableModel.rowCount() )
640+
{
641+
result = mQgisTableModel.setData( index, value, role );
642+
}
643+
else
644+
{
645+
result = mProjectTableModel.setData( this->index( index.row() - mQgisTableModel.rowCount(), index.column() ), value, role );
646+
}
635647
}
648+
if ( result )
649+
emit dataChanged( index, index );
650+
return result;
636651
}
637652

638653
Qt::ItemFlags QgsMergedBookmarksTableModel::flags( const QModelIndex &index ) const
@@ -659,19 +674,18 @@ bool QgsMergedBookmarksTableModel::removeRows( int row, int count, const QModelI
659674
{
660675
Q_ASSERT( count == 1 );
661676
bool result;
662-
beginRemoveRows( parent, row, row + count );
663677
if ( row < mQgisTableModel.rowCount() )
664678
{
665679
QSqlTableModel *qgisModel = static_cast<QSqlTableModel *>( &mQgisTableModel );
666680
Q_ASSERT( qgisModel );
667681
result = qgisModel->removeRows( row, count, parent );
668-
qgisModel->select();
682+
qgisModel->select(); // This updates row count in the model!
669683
}
670684
else
671685
{
672686
result = mProjectTableModel.removeRows( row - mQgisTableModel.rowCount(), count, parent );
673687
}
674-
endRemoveRows();
688+
allLayoutChanged();
675689
return result;
676690
}
677691

src/app/qgsbookmarks.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ class QgsMergedBookmarksTableModel: public QAbstractTableModel
126126
bool projectAvailable() const;
127127
void moveBookmark( QAbstractTableModel &modelFrom, QAbstractTableModel &modelTo, int row );
128128

129+
signals:
130+
131+
void selectItem( const QModelIndex &index );
132+
129133
private slots:
130134
void allLayoutChanged()
131135
{
@@ -156,7 +160,7 @@ class APP_EXPORT QgsBookmarks : public QgsDockWidget, private Ui::QgsBookmarksBa
156160
private:
157161
QSqlTableModel *mQgisModel = nullptr;
158162
QgsProjectBookmarksTableModel *mProjectModel = nullptr;
159-
QgsMergedBookmarksTableModel *mModel = nullptr;
163+
QgsMergedBookmarksTableModel *mMergedModel = nullptr;
160164
QgsBookmarksProxyModel *mProxyModel = nullptr;
161165

162166
void saveWindowLocation();

src/core/layertree/qgslayertreemodel.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@ void QgsLayerTreeModel::refreshLayerLegend( QgsLayerTreeLayer *nodeLayer )
501501

502502
// update children
503503
int oldNodeCount = rowCount( idx );
504-
beginRemoveRows( idx, 0, oldNodeCount - 1 );
504+
beginRemoveRows( idx, 0, std::max( oldNodeCount - 1, 0 ) );
505505
removeLegendFromLayer( nodeLayer );
506506
endRemoveRows();
507507

src/gui/symbology/qgscategorizedsymbolrendererwidget.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ void QgsCategorizedSymbolRendererModel::setRenderer( QgsCategorizedSymbolRendere
5858
{
5959
if ( mRenderer )
6060
{
61-
beginRemoveRows( QModelIndex(), 0, mRenderer->categories().size() - 1 );
61+
beginRemoveRows( QModelIndex(), 0, std::max( mRenderer->categories().size() - 1, 0 ) );
6262
mRenderer = nullptr;
6363
endRemoveRows();
6464
}

0 commit comments

Comments
 (0)