15
15
16
16
#include " qgsextentwidget.h"
17
17
18
+ #include " qgsapplication.h"
18
19
#include " qgslogger.h"
19
20
#include " qgscoordinatetransform.h"
20
21
#include " qgsmapcanvas.h"
21
22
#include " qgsmaplayermodel.h"
22
23
#include " qgsexception.h"
23
24
#include " qgsproject.h"
24
25
#include " qgsdoublevalidator.h"
26
+ #include " qgslayoutmanager.h"
27
+ #include " qgslayoutitemmap.h"
28
+ #include " qgsprintlayout.h"
29
+ #include " qgsbookmarkmodel.h"
30
+ #include " qgsreferencedgeometry.h"
25
31
26
32
#include < QMenu>
27
33
#include < QAction>
@@ -47,17 +53,35 @@ QgsExtentWidget::QgsExtentWidget( QWidget *parent, WidgetStyle style )
47
53
connect ( mLayerMenu , &QMenu::aboutToShow, this , &QgsExtentWidget::layerMenuAboutToShow );
48
54
mMapLayerModel = new QgsMapLayerModel ( this );
49
55
56
+ mLayoutMenu = new QMenu ( tr ( " Calculate from Layout Map" ), this );
57
+ mButtonCalcFromLayout ->setMenu ( mLayoutMenu );
58
+ connect ( mLayoutMenu , &QMenu::aboutToShow, this , &QgsExtentWidget::layoutMenuAboutToShow );
59
+
60
+ mBookmarkMenu = new QMenu ( tr ( " Calculate from Bookmark" ), this );
61
+ mButtonCalcFromBookmark ->setMenu ( mBookmarkMenu );
62
+ connect ( mBookmarkMenu , &QMenu::aboutToShow, this , &QgsExtentWidget::bookmarkMenuAboutToShow );
63
+
50
64
mMenu = new QMenu ( this );
51
- mUseCanvasExtentAction = new QAction ( tr ( " Use Map Canvas Extent" ), this );
65
+ mUseCanvasExtentAction = new QAction ( tr ( " Use Current Map Canvas Extent" ), this );
66
+ mUseCanvasExtentAction ->setIcon ( QgsApplication::getThemeIcon ( QStringLiteral ( " /mActionMapIdentification.svg" ) ) );
67
+ mUseCanvasExtentAction ->setVisible ( false );
52
68
connect ( mUseCanvasExtentAction , &QAction::triggered, this , &QgsExtentWidget::setOutputExtentFromCurrent );
53
69
54
- mUseCurrentExtentAction = new QAction ( tr ( " Use Current Layer Extent" ), this );
70
+ mUseCurrentExtentAction = new QAction ( tr ( " Use Current Layer/Default Extent" ), this );
71
+ mUseCurrentExtentAction ->setVisible ( false );
55
72
connect ( mUseCurrentExtentAction , &QAction::triggered, this , &QgsExtentWidget::setOutputExtentFromCurrent );
56
73
57
- mDrawOnCanvasAction = new QAction ( tr ( " Draw on Canvas" ), this );
74
+ mDrawOnCanvasAction = new QAction ( tr ( " Draw on Map Canvas" ), this );
75
+ mDrawOnCanvasAction ->setVisible ( false );
58
76
connect ( mDrawOnCanvasAction , &QAction::triggered, this , &QgsExtentWidget::setOutputExtentFromDrawOnCanvas );
59
77
60
78
mMenu ->addMenu ( mLayerMenu );
79
+ mMenu ->addMenu ( mLayoutMenu );
80
+ mMenu ->addMenu ( mBookmarkMenu );
81
+ mMenu ->addSeparator ();
82
+ mMenu ->addAction ( mUseCanvasExtentAction );
83
+ mMenu ->addAction ( mDrawOnCanvasAction );
84
+ mMenu ->addAction ( mUseCurrentExtentAction );
61
85
62
86
mCondensedToolButton ->setMenu ( mMenu );
63
87
mCondensedToolButton ->setPopupMode ( QToolButton::InstantPopup );
@@ -115,7 +139,7 @@ void QgsExtentWidget::setCurrentExtent( const QgsRectangle ¤tExtent, const
115
139
mCurrentCrs = currentCrs;
116
140
117
141
mCurrentExtentButton ->setVisible ( true );
118
- mMenu -> addAction ( mUseCurrentExtentAction );
142
+ mUseCurrentExtentAction -> setVisible ( true );
119
143
}
120
144
121
145
void QgsExtentWidget::setOutputCrs ( const QgsCoordinateReferenceSystem &outputCrs )
@@ -336,6 +360,72 @@ void QgsExtentWidget::layerMenuAboutToShow()
336
360
}
337
361
}
338
362
363
+ void QgsExtentWidget::layoutMenuAboutToShow ()
364
+ {
365
+ mLayoutMenu ->clear ();
366
+
367
+ if ( QgsLayoutManager *manager = QgsProject::instance ()->layoutManager () )
368
+ {
369
+ const QList<QgsPrintLayout *> layouts = manager->printLayouts ();
370
+ for ( const QgsPrintLayout *layout : layouts )
371
+ {
372
+ QList< QgsLayoutItemMap * > maps;
373
+ layout->layoutItems ( maps );
374
+ if ( maps.empty () )
375
+ continue ;
376
+
377
+ QMenu *layoutMenu = new QMenu ( layout->name (), mMenu );
378
+ for ( const QgsLayoutItemMap *map : std::as_const ( maps ) )
379
+ {
380
+ QgsRectangle extent = map->extent ();
381
+ QgsCoordinateReferenceSystem crs = map->crs ();
382
+ QAction *mapExtentAction = new QAction ( tr ( " %1" ).arg ( map->displayName () ), mLayoutMenu );
383
+ connect ( mapExtentAction, &QAction::triggered, this , [this , extent, crs] { setOutputExtentFromUser ( extent, crs ); } );
384
+ layoutMenu->addAction ( mapExtentAction );
385
+ }
386
+ mLayoutMenu ->addMenu ( layoutMenu );
387
+ }
388
+ }
389
+ }
390
+
391
+ void QgsExtentWidget::bookmarkMenuAboutToShow ()
392
+ {
393
+ mBookmarkMenu ->clear ();
394
+
395
+ if ( !mBookmarkModel )
396
+ mBookmarkModel = new QgsBookmarkManagerProxyModel ( QgsApplication::bookmarkManager (), QgsProject::instance ()->bookmarkManager (), this );
397
+
398
+ QMap< QString, QMenu * > groupMenus;
399
+ for ( int i = 0 ; i < mBookmarkModel ->rowCount (); ++i )
400
+ {
401
+ const QString group = mBookmarkModel ->data ( mBookmarkModel ->index ( i, 0 ), QgsBookmarkManagerModel::RoleGroup ).toString ();
402
+ QMenu *destMenu = mBookmarkMenu ;
403
+ if ( !group.isEmpty () )
404
+ {
405
+ destMenu = groupMenus.value ( group );
406
+ if ( !destMenu )
407
+ {
408
+ destMenu = new QMenu ( group, mBookmarkMenu );
409
+ groupMenus[ group ] = destMenu;
410
+ }
411
+ }
412
+ QAction *action = new QAction ( mBookmarkModel ->data ( mBookmarkModel ->index ( i, 0 ), QgsBookmarkManagerModel::RoleName ).toString (), mBookmarkMenu );
413
+ const QgsReferencedRectangle extent = mBookmarkModel ->data ( mBookmarkModel ->index ( i, 0 ), QgsBookmarkManagerModel::RoleExtent ).value < QgsReferencedRectangle >();
414
+ connect ( action, &QAction::triggered, this , [ = ] { setOutputExtentFromUser ( extent, extent.crs () ); } );
415
+ destMenu->addAction ( action );
416
+ }
417
+
418
+ QStringList groupKeys = groupMenus.keys ();
419
+ groupKeys.sort ( Qt::CaseInsensitive );
420
+ for ( int i = 0 ; i < groupKeys.count (); ++i )
421
+ {
422
+ if ( mBookmarkMenu ->actions ().value ( i ) )
423
+ mBookmarkMenu ->insertMenu ( mBookmarkMenu ->actions ().at ( i ), groupMenus.value ( groupKeys.at ( i ) ) );
424
+ else
425
+ mBookmarkMenu ->addMenu ( groupMenus.value ( groupKeys.at ( i ) ) );
426
+ }
427
+ }
428
+
339
429
void QgsExtentWidget::setExtentToLayerExtent ( const QString &layerId )
340
430
{
341
431
QgsMapLayer *layer = QgsProject::instance ()->mapLayer ( layerId );
@@ -442,16 +532,26 @@ void QgsExtentWidget::setMapCanvas( QgsMapCanvas *canvas, bool drawOnCanvasOptio
442
532
mButtonDrawOnCanvas ->setVisible ( drawOnCanvasOption );
443
533
mCurrentExtentButton ->setVisible ( true );
444
534
445
- mMenu -> addAction ( mUseCanvasExtentAction );
535
+ mUseCanvasExtentAction -> setVisible ( true );
446
536
if ( drawOnCanvasOption )
447
- mMenu ->addAction ( mDrawOnCanvasAction );
537
+ mDrawOnCanvasAction ->setVisible ( true );
538
+
539
+ mCondensedToolButton ->setToolTip ( tr ( " Set to current map canvas extent" ) );
540
+ mCondensedToolButton ->setIcon ( QgsApplication::getThemeIcon ( QStringLiteral ( " /mActionMapIdentification.svg" ) ) );
541
+ connect ( mCondensedToolButton , &QAbstractButton::clicked, this , &QgsExtentWidget::setOutputExtentFromCurrent );
542
+ mCondensedToolButton ->setPopupMode ( QToolButton::MenuButtonPopup );
448
543
}
449
544
else
450
545
{
451
546
mButtonDrawOnCanvas ->setVisible ( false );
452
547
mCurrentExtentButton ->setVisible ( false );
453
- mMenu ->removeAction ( mUseCanvasExtentAction );
454
- mMenu ->removeAction ( mDrawOnCanvasAction );
548
+ mUseCanvasExtentAction ->setVisible ( false );
549
+ mUseCanvasExtentAction ->setVisible ( false );
550
+
551
+ mCondensedToolButton ->setToolTip ( QString () );
552
+ mCondensedToolButton ->setIcon ( QIcon () );
553
+ disconnect ( mCondensedToolButton , &QAbstractButton::clicked, this , &QgsExtentWidget::setOutputExtentFromCurrent );
554
+ mCondensedToolButton ->setPopupMode ( QToolButton::InstantPopup );
455
555
}
456
556
}
457
557
0 commit comments