Skip to content

Commit 6b6f5eb

Browse files
authoredJan 6, 2022
Merge pull request #46722 from nirvn/label_alg
Brand new extent widget's calculate extent from layout map and bookmark functionality
2 parents 1c096ce + 678f95e commit 6b6f5eb

File tree

4 files changed

+213
-73
lines changed

4 files changed

+213
-73
lines changed
 

‎src/gui/qgsextentwidget.cpp

Lines changed: 108 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,19 @@
1515

1616
#include "qgsextentwidget.h"
1717

18+
#include "qgsapplication.h"
1819
#include "qgslogger.h"
1920
#include "qgscoordinatetransform.h"
2021
#include "qgsmapcanvas.h"
2122
#include "qgsmaplayermodel.h"
2223
#include "qgsexception.h"
2324
#include "qgsproject.h"
2425
#include "qgsdoublevalidator.h"
26+
#include "qgslayoutmanager.h"
27+
#include "qgslayoutitemmap.h"
28+
#include "qgsprintlayout.h"
29+
#include "qgsbookmarkmodel.h"
30+
#include "qgsreferencedgeometry.h"
2531

2632
#include <QMenu>
2733
#include <QAction>
@@ -47,17 +53,35 @@ QgsExtentWidget::QgsExtentWidget( QWidget *parent, WidgetStyle style )
4753
connect( mLayerMenu, &QMenu::aboutToShow, this, &QgsExtentWidget::layerMenuAboutToShow );
4854
mMapLayerModel = new QgsMapLayerModel( this );
4955

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+
5064
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 );
5268
connect( mUseCanvasExtentAction, &QAction::triggered, this, &QgsExtentWidget::setOutputExtentFromCurrent );
5369

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 );
5572
connect( mUseCurrentExtentAction, &QAction::triggered, this, &QgsExtentWidget::setOutputExtentFromCurrent );
5673

57-
mDrawOnCanvasAction = new QAction( tr( "Draw on Canvas" ), this );
74+
mDrawOnCanvasAction = new QAction( tr( "Draw on Map Canvas" ), this );
75+
mDrawOnCanvasAction->setVisible( false );
5876
connect( mDrawOnCanvasAction, &QAction::triggered, this, &QgsExtentWidget::setOutputExtentFromDrawOnCanvas );
5977

6078
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 );
6185

6286
mCondensedToolButton->setMenu( mMenu );
6387
mCondensedToolButton->setPopupMode( QToolButton::InstantPopup );
@@ -115,7 +139,7 @@ void QgsExtentWidget::setCurrentExtent( const QgsRectangle &currentExtent, const
115139
mCurrentCrs = currentCrs;
116140

117141
mCurrentExtentButton->setVisible( true );
118-
mMenu->addAction( mUseCurrentExtentAction );
142+
mUseCurrentExtentAction->setVisible( true );
119143
}
120144

121145
void QgsExtentWidget::setOutputCrs( const QgsCoordinateReferenceSystem &outputCrs )
@@ -336,6 +360,72 @@ void QgsExtentWidget::layerMenuAboutToShow()
336360
}
337361
}
338362

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+
339429
void QgsExtentWidget::setExtentToLayerExtent( const QString &layerId )
340430
{
341431
QgsMapLayer *layer = QgsProject::instance()->mapLayer( layerId );
@@ -442,16 +532,26 @@ void QgsExtentWidget::setMapCanvas( QgsMapCanvas *canvas, bool drawOnCanvasOptio
442532
mButtonDrawOnCanvas->setVisible( drawOnCanvasOption );
443533
mCurrentExtentButton->setVisible( true );
444534

445-
mMenu->addAction( mUseCanvasExtentAction );
535+
mUseCanvasExtentAction->setVisible( true );
446536
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 );
448543
}
449544
else
450545
{
451546
mButtonDrawOnCanvas->setVisible( false );
452547
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 );
455555
}
456556
}
457557

‎src/gui/qgsextentwidget.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <memory>
3131
#include <QRegularExpression>
3232

33+
class QgsBookmarkManagerProxyModel;
3334
class QgsCoordinateReferenceSystem;
3435
class QgsMapLayerModel;
3536
class QgsMapLayer;
@@ -244,6 +245,8 @@ class GUI_EXPORT QgsExtentWidget : public QWidget, private Ui::QgsExtentGroupBox
244245
private slots:
245246

246247
void layerMenuAboutToShow();
248+
void layoutMenuAboutToShow();
249+
void bookmarkMenuAboutToShow();
247250

248251
void extentDrawn( const QgsRectangle &extent );
249252
void mapToolDeactivated();
@@ -264,8 +267,14 @@ class GUI_EXPORT QgsExtentWidget : public QWidget, private Ui::QgsExtentGroupBox
264267
QgsCoordinateReferenceSystem mOriginalCrs;
265268

266269
QMenu *mMenu = nullptr;
270+
267271
QMenu *mLayerMenu = nullptr;
272+
QMenu *mLayoutMenu = nullptr;
273+
QMenu *mBookmarkMenu = nullptr;
274+
268275
QgsMapLayerModel *mMapLayerModel = nullptr;
276+
QgsBookmarkManagerProxyModel *mBookmarkModel = nullptr;
277+
269278
QList< QAction * > mLayerMenuActions;
270279
QAction *mUseCanvasExtentAction = nullptr;
271280
QAction *mUseCurrentExtentAction = nullptr;

‎src/gui/qgsscalewidget.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void QgsScaleWidget::menuAboutToShow()
102102

103103
double scale = mCanvas->scale();
104104
QAction *canvasScaleAction = new QAction( QgsApplication::getThemeIcon( QStringLiteral( "/mActionMapIdentification.svg" ) ),
105-
tr( "Current Canvas Scale (1:%1)" ).arg( qgsDoubleToString( scale, 0 ) ), mMenu );
105+
tr( "Use Current Map Canvas Scale (1:%1)" ).arg( qgsDoubleToString( scale, 0 ) ), mMenu );
106106
connect( canvasScaleAction, &QAction::triggered, this, [this, scale] { setScale( scale ); } );
107107
mMenu->addAction( canvasScaleAction );
108108

‎src/ui/qgsextentgroupboxwidget.ui

Lines changed: 95 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -114,46 +114,7 @@
114114
<property name="bottomMargin">
115115
<number>0</number>
116116
</property>
117-
<item row="2" column="11">
118-
<widget class="QPushButton" name="mButtonDrawOnCanvas">
119-
<property name="sizePolicy">
120-
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
121-
<horstretch>0</horstretch>
122-
<verstretch>0</verstretch>
123-
</sizepolicy>
124-
</property>
125-
<property name="text">
126-
<string>Draw on Canvas</string>
127-
</property>
128-
</widget>
129-
</item>
130117
<item row="2" column="0">
131-
<widget class="QPushButton" name="mOriginalExtentButton">
132-
<property name="minimumSize">
133-
<size>
134-
<width>150</width>
135-
<height>0</height>
136-
</size>
137-
</property>
138-
<property name="text">
139-
<string>Current Layer Extent</string>
140-
</property>
141-
</widget>
142-
</item>
143-
<item row="2" column="6">
144-
<widget class="QPushButton" name="mCurrentExtentButton">
145-
<property name="minimumSize">
146-
<size>
147-
<width>150</width>
148-
<height>0</height>
149-
</size>
150-
</property>
151-
<property name="text">
152-
<string>Map Canvas Extent</string>
153-
</property>
154-
</widget>
155-
</item>
156-
<item row="2" column="1">
157118
<spacer name="horizontalSpacer_3">
158119
<property name="orientation">
159120
<enum>Qt::Horizontal</enum>
@@ -166,19 +127,6 @@
166127
</property>
167128
</spacer>
168129
</item>
169-
<item row="2" column="5">
170-
<spacer name="horizontalSpacer">
171-
<property name="orientation">
172-
<enum>Qt::Horizontal</enum>
173-
</property>
174-
<property name="sizeHint" stdset="0">
175-
<size>
176-
<width>40</width>
177-
<height>20</height>
178-
</size>
179-
</property>
180-
</spacer>
181-
</item>
182130
<item row="2" column="10">
183131
<spacer name="horizontalSpacer_2">
184132
<property name="orientation">
@@ -192,18 +140,101 @@
192140
</property>
193141
</spacer>
194142
</item>
195-
<item row="2" column="3">
196-
<widget class="QPushButton" name="mButtonCalcFromLayer">
197-
<property name="sizePolicy">
198-
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
199-
<horstretch>0</horstretch>
200-
<verstretch>0</verstretch>
201-
</sizepolicy>
202-
</property>
203-
<property name="text">
204-
<string>Calculate from Layer</string>
205-
</property>
206-
</widget>
143+
<item row="2" column="1" colspan="7">
144+
<layout class="QHBoxLayout" name="horizontalLayout1">
145+
<item>
146+
<widget class="QLabel" name="calculateLabel">
147+
<property name="text">
148+
<string>Calculate from</string>
149+
</property>
150+
<property name="alignment">
151+
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
152+
</property>
153+
</widget>
154+
</item>
155+
<item>
156+
<widget class="QPushButton" name="mButtonCalcFromLayer">
157+
<property name="sizePolicy">
158+
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
159+
<horstretch>0</horstretch>
160+
<verstretch>0</verstretch>
161+
</sizepolicy>
162+
</property>
163+
<property name="text">
164+
<string>Layer</string>
165+
</property>
166+
</widget>
167+
</item>
168+
<item>
169+
<widget class="QPushButton" name="mButtonCalcFromLayout">
170+
<property name="sizePolicy">
171+
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
172+
<horstretch>0</horstretch>
173+
<verstretch>0</verstretch>
174+
</sizepolicy>
175+
</property>
176+
<property name="text">
177+
<string>Layout Map</string>
178+
</property>
179+
</widget>
180+
</item>
181+
<item>
182+
<widget class="QPushButton" name="mButtonCalcFromBookmark">
183+
<property name="sizePolicy">
184+
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
185+
<horstretch>0</horstretch>
186+
<verstretch>0</verstretch>
187+
</sizepolicy>
188+
</property>
189+
<property name="text">
190+
<string>Bookmark</string>
191+
</property>
192+
</widget>
193+
</item>
194+
</layout>
195+
</item>
196+
<item row="3" column="1" colspan="7">
197+
<layout class="QHBoxLayout" name="horizontalLayout2">
198+
<item>
199+
<widget class="QPushButton" name="mOriginalExtentButton">
200+
<property name="sizePolicy">
201+
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
202+
<horstretch>0</horstretch>
203+
<verstretch>0</verstretch>
204+
</sizepolicy>
205+
</property>
206+
<property name="text">
207+
<string>Current Layer Extent</string>
208+
</property>
209+
</widget>
210+
</item>
211+
<item>
212+
<widget class="QPushButton" name="mCurrentExtentButton">
213+
<property name="sizePolicy">
214+
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
215+
<horstretch>0</horstretch>
216+
<verstretch>0</verstretch>
217+
</sizepolicy>
218+
</property>
219+
<property name="text">
220+
<string>Map Canvas Extent</string>
221+
</property>
222+
</widget>
223+
</item>
224+
<item>
225+
<widget class="QPushButton" name="mButtonDrawOnCanvas">
226+
<property name="sizePolicy">
227+
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
228+
<horstretch>0</horstretch>
229+
<verstretch>0</verstretch>
230+
</sizepolicy>
231+
</property>
232+
<property name="text">
233+
<string>Draw on Canvas</string>
234+
</property>
235+
</widget>
236+
</item>
237+
</layout>
207238
</item>
208239
</layout>
209240
</widget>

0 commit comments

Comments
 (0)
Please sign in to comment.