@@ -51,6 +51,7 @@ QgsProjectionSelectionTreeWidget::QgsProjectionSelectionTreeWidget( QWidget *par
51
51
connect ( lstRecent, &QTreeWidget::currentItemChanged, this , &QgsProjectionSelectionTreeWidget::lstRecent_currentItemChanged );
52
52
connect ( cbxHideDeprecated, &QCheckBox::stateChanged, this , &QgsProjectionSelectionTreeWidget::updateFilter );
53
53
connect ( leSearch, &QgsFilterLineEdit::textChanged, this , &QgsProjectionSelectionTreeWidget::updateFilter );
54
+ connect ( mClearRecentCrs , &QToolButton::clicked, this , &QgsProjectionSelectionTreeWidget::clearRecentCrs );
54
55
55
56
mAreaCanvas ->setVisible ( mShowMap );
56
57
@@ -63,14 +64,16 @@ QgsProjectionSelectionTreeWidget::QgsProjectionSelectionTreeWidget( QWidget *par
63
64
64
65
// Hide (internal) ID column
65
66
lstCoordinateSystems->setColumnHidden ( QgisCrsIdColumn, true );
66
-
67
67
lstRecent->header ()->setSectionResizeMode ( AuthidColumn, QHeaderView::Stretch );
68
68
lstRecent->header ()->resizeSection ( QgisCrsIdColumn, 0 );
69
69
lstRecent->header ()->setSectionResizeMode ( QgisCrsIdColumn, QHeaderView::Fixed );
70
-
71
- // Hide (internal) ID column
72
70
lstRecent->setColumnHidden ( QgisCrsIdColumn, true );
73
71
72
+ // Clear Crs Column
73
+ lstRecent->header ()->setMinimumSectionSize ( 10 );
74
+ lstRecent->header ()->setStretchLastSection ( false );
75
+ lstRecent->header ()->resizeSection ( ClearColumn, 20 );
76
+
74
77
mRecentProjections = QgsCoordinateReferenceSystem::recentCoordinateReferenceSystems ();
75
78
76
79
mCheckBoxNoProjection ->setHidden ( true );
@@ -112,9 +115,10 @@ void QgsProjectionSelectionTreeWidget::resizeEvent( QResizeEvent *event )
112
115
lstCoordinateSystems->header ()->resizeSection ( AuthidColumn, 240 );
113
116
lstCoordinateSystems->header ()->resizeSection ( QgisCrsIdColumn, 0 );
114
117
115
- lstRecent->header ()->resizeSection ( NameColumn, event->size ().width () - 240 );
118
+ lstRecent->header ()->resizeSection ( NameColumn, event->size ().width () - 260 );
116
119
lstRecent->header ()->resizeSection ( AuthidColumn, 240 );
117
120
lstRecent->header ()->resizeSection ( QgisCrsIdColumn, 0 );
121
+ lstRecent->header ()->resizeSection ( ClearColumn, 20 );
118
122
}
119
123
120
124
void QgsProjectionSelectionTreeWidget::showEvent ( QShowEvent *event )
@@ -253,13 +257,25 @@ void QgsProjectionSelectionTreeWidget::insertRecent( const QgsCoordinateReferenc
253
257
if ( nodes.isEmpty () )
254
258
return ;
255
259
256
- lstRecent->insertTopLevelItem ( 0 , new QTreeWidgetItem ( lstRecent, QStringList ()
257
- << nodes.first ()->text ( NameColumn )
258
- << nodes.first ()->text ( AuthidColumn )
259
- << nodes.first ()->text ( QgisCrsIdColumn ) ) );
260
+ QTreeWidgetItem *item = new QTreeWidgetItem ( lstRecent, QStringList ()
261
+ << nodes.first ()->text ( NameColumn )
262
+ << nodes.first ()->text ( AuthidColumn )
263
+ << nodes.first ()->text ( QgisCrsIdColumn ) );
264
+
265
+ // Insert clear button in the last column
266
+ QToolButton *clearButton = new QToolButton ();
267
+ clearButton->setIcon ( QgsApplication::getThemeIcon ( " /mIconClearItem.svg" ) );
268
+ clearButton->setAutoRaise ( true );
269
+ clearButton->setToolTip ( tr ( " Clear from recently used coordinate reference systems" ) );
270
+ connect ( clearButton, &QToolButton::clicked, this , [this , item] { removeRecentCrsItem ( item ); } );
271
+ lstRecent->setItemWidget ( item, ClearColumn, clearButton );
272
+
273
+
274
+ lstRecent->insertTopLevelItem ( 0 , item );
275
+
260
276
}
261
277
262
- // note this line just returns the projection name!
278
+ // note this line just returns the projection name!
263
279
QString QgsProjectionSelectionTreeWidget::selectedName ()
264
280
{
265
281
// return the selected wkt name from the list view
@@ -307,25 +323,19 @@ QgsRectangle QgsProjectionSelectionTreeWidget::previewRect() const
307
323
return mAreaCanvas ->canvasRect ();
308
324
}
309
325
310
- QString QgsProjectionSelectionTreeWidget::getSelectedExpression ( const QString &expression ) const
326
+ QString QgsProjectionSelectionTreeWidget::expressionForItem ( QTreeWidgetItem *item, const QString &expression ) const
311
327
{
312
- // Only return the attribute if there is a node in the tree
313
- // selected that has an srs_id. This prevents error if the user
314
- // selects a top-level node rather than an actual coordinate
315
- // system
316
- //
317
- // Get the selected node and make sure it is a srs andx
318
- // not a top-level projection node
319
- QTreeWidgetItem *lvi = lstCoordinateSystems->currentItem ();
320
- if ( !lvi || lvi->text ( QgisCrsIdColumn ).isEmpty () )
328
+ // Only return the attribute if the selected item that has an srs_id.
329
+ // This prevents error if the user selects a top-level node rather
330
+ // than an actual coordinate system
331
+ if ( !item || item->text ( QgisCrsIdColumn ).isEmpty () )
321
332
return QString ();
322
333
323
- //
334
+
324
335
// Determine if this is a user projection or a system on
325
336
// user projection defs all have srs_id >= 100000
326
- //
327
337
QString databaseFileName;
328
- if ( lvi ->text ( QgisCrsIdColumn ).toLong () >= USER_CRS_START_ID )
338
+ if ( item ->text ( QgisCrsIdColumn ).toLong () >= USER_CRS_START_ID )
329
339
{
330
340
databaseFileName = QgsApplication::qgisUserDatabaseFilePath ();
331
341
if ( !QFileInfo::exists ( databaseFileName ) )
@@ -338,7 +348,6 @@ QString QgsProjectionSelectionTreeWidget::getSelectedExpression( const QString &
338
348
databaseFileName = mSrsDatabaseFileName ;
339
349
}
340
350
341
- //
342
351
// set up the database
343
352
// XXX We could probably hold the database open for the life of this object,
344
353
// assuming that it will never be used anywhere else. Given the low overhead,
@@ -358,7 +367,7 @@ QString QgsProjectionSelectionTreeWidget::getSelectedExpression( const QString &
358
367
sqlite3_stmt *stmt = nullptr ;
359
368
QString sql = QStringLiteral ( " select %1 from tbl_srs where srs_id=%2" )
360
369
.arg ( expression,
361
- lvi ->text ( QgisCrsIdColumn ) );
370
+ item ->text ( QgisCrsIdColumn ) );
362
371
363
372
QgsDebugMsgLevel ( QStringLiteral ( " Finding selected attribute using : %1" ).arg ( sql ), 4 );
364
373
rc = sqlite3_prepare ( database, sql.toUtf8 (), sql.toUtf8 ().length (), &stmt, &tail );
@@ -379,36 +388,42 @@ QString QgsProjectionSelectionTreeWidget::getSelectedExpression( const QString &
379
388
return attributeValue;
380
389
}
381
390
382
- QgsCoordinateReferenceSystem QgsProjectionSelectionTreeWidget::crs () const
391
+
392
+
393
+ QgsCoordinateReferenceSystem QgsProjectionSelectionTreeWidget::crsForItem ( QTreeWidgetItem *item ) const
383
394
{
384
395
if ( mCheckBoxNoProjection ->isEnabled () && mCheckBoxNoProjection ->isChecked () )
385
396
return QgsCoordinateReferenceSystem ();
386
397
387
398
if ( !mInitialized && mDeferredLoadCrs .isValid () )
388
399
return mDeferredLoadCrs ;
389
400
390
- const QString srsIdString = getSelectedExpression ( QStringLiteral ( " srs_id" ) );
401
+ const QString srsIdString = expressionForItem ( item, QStringLiteral ( " srs_id" ) );
391
402
if ( !srsIdString.isEmpty () )
392
403
{
393
404
int srid = srsIdString.toLong ();
394
405
if ( srid >= USER_CRS_START_ID )
395
406
return QgsCoordinateReferenceSystem::fromOgcWmsCrs ( QStringLiteral ( " USER:%1" ).arg ( srid ) );
396
407
else
397
- return QgsCoordinateReferenceSystem::fromOgcWmsCrs ( getSelectedExpression ( QStringLiteral ( " upper(auth_name||':'||auth_id)" ) ) );
408
+ return QgsCoordinateReferenceSystem::fromOgcWmsCrs ( expressionForItem ( item, QStringLiteral ( " upper(auth_name||':'||auth_id)" ) ) );
398
409
}
399
410
else
400
411
{
401
412
// custom CRS
402
- QTreeWidgetItem *lvi = lstCoordinateSystems->currentItem ();
403
- if ( lvi && lvi->data ( 0 , RoleWkt ).isValid () )
404
- return QgsCoordinateReferenceSystem::fromWkt ( lvi->data ( 0 , RoleWkt ).toString () );
405
- else if ( lvi && lvi->data ( 0 , RoleProj ).isValid () )
406
- return QgsCoordinateReferenceSystem::fromProj ( lvi->data ( 0 , RoleProj ).toString () );
413
+ if ( item && item->data ( 0 , RoleWkt ).isValid () )
414
+ return QgsCoordinateReferenceSystem::fromWkt ( item->data ( 0 , RoleWkt ).toString () );
415
+ else if ( item && item->data ( 0 , RoleProj ).isValid () )
416
+ return QgsCoordinateReferenceSystem::fromProj ( item->data ( 0 , RoleProj ).toString () );
407
417
else
408
418
return QgsCoordinateReferenceSystem ();
409
419
}
410
420
}
411
421
422
+ QgsCoordinateReferenceSystem QgsProjectionSelectionTreeWidget::crs () const
423
+ {
424
+ return crsForItem ( lstCoordinateSystems->currentItem () );
425
+ }
426
+
412
427
void QgsProjectionSelectionTreeWidget::setShowNoProjection ( bool show )
413
428
{
414
429
mCheckBoxNoProjection ->setVisible ( show );
@@ -1053,3 +1068,21 @@ void QgsProjectionSelectionTreeWidget::showDBMissingWarning( const QString &file
1053
1068
" Because of this the projection selector will not work…" )
1054
1069
.arg ( fileName ) );
1055
1070
}
1071
+
1072
+ void QgsProjectionSelectionTreeWidget::clearRecentCrs ()
1073
+ {
1074
+ QgsCoordinateReferenceSystem::clearRecentCoordinateReferenceSystems ();
1075
+ lstRecent->clear ();
1076
+ }
1077
+
1078
+
1079
+ void QgsProjectionSelectionTreeWidget::removeRecentCrsItem ( QTreeWidgetItem *item )
1080
+ {
1081
+ int index = lstRecent->indexOfTopLevelItem ( item );
1082
+ if ( index == -1 )
1083
+ return ;
1084
+ QgsCoordinateReferenceSystem crs = crsForItem ( item );
1085
+ QgsCoordinateReferenceSystem::removeRecentCoordinateReferenceSystem ( crs );
1086
+ lstRecent->takeTopLevelItem ( index );
1087
+ delete item;
1088
+ }
0 commit comments