QGIS API Documentation  3.18.1-Zürich (202f1bf7e5)
qgslayoutmapgridwidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayoutmapgridwidget.cpp
3  ----------------------------
4  begin : October 2017
5  copyright : (C) 2017 by Nyall Dawson
6  email : nyall dot dawson at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "qgslayoutmapgridwidget.h"
20 #include "qgssymbol.h"
21 #include "qgslayoutitemmap.h"
22 #include "qgsproject.h"
23 #include "qgssymbollayerutils.h"
24 #include "qgsstyle.h"
26 #include "qgslayout.h"
27 #include "qgsmapsettings.h"
29 #include "qgsvectorlayer.h"
30 #include "qgsprojectviewsettings.h"
31 #include "qgstextformatwidget.h"
32 #include "qgsguiutils.h"
33 
35  : QgsLayoutItemBaseWidget( nullptr, mapGrid )
36  , mMap( map )
37  , mMapGrid( mapGrid )
38 {
39  setupUi( this );
40 
41  mFrameStyleComboBox->addItem( tr( "No Frame" ), QgsLayoutItemMapGrid::NoFrame );
42  mFrameStyleComboBox->addItem( tr( "Zebra" ), QgsLayoutItemMapGrid::Zebra );
43  mFrameStyleComboBox->addItem( tr( "Zebra (Nautical)" ), QgsLayoutItemMapGrid::ZebraNautical );
44  mFrameStyleComboBox->addItem( tr( "Interior Ticks" ), QgsLayoutItemMapGrid::InteriorTicks );
45  mFrameStyleComboBox->addItem( tr( "Exterior Ticks" ), QgsLayoutItemMapGrid::ExteriorTicks );
46  mFrameStyleComboBox->addItem( tr( "Interior and Exterior Ticks" ), QgsLayoutItemMapGrid::InteriorExteriorTicks );
47  mFrameStyleComboBox->addItem( tr( "Line Border" ), QgsLayoutItemMapGrid::LineBorder );
48  mFrameStyleComboBox->addItem( tr( "Line Border (Nautical)" ), QgsLayoutItemMapGrid::LineBorderNautical );
49 
50  mRotatedTicksLengthModeComboBox->addItem( tr( "Orthogonal" ), QgsLayoutItemMapGrid::OrthogonalTicks );
51  mRotatedTicksLengthModeComboBox->addItem( tr( "Fixed Length" ), QgsLayoutItemMapGrid::NormalizedTicks );
52  mRotatedAnnotationsLengthModeComboBox->addItem( tr( "Orthogonal" ), QgsLayoutItemMapGrid::OrthogonalTicks );
53  mRotatedAnnotationsLengthModeComboBox->addItem( tr( "Fixed Length" ), QgsLayoutItemMapGrid::NormalizedTicks );
54 
55  mGridFrameMarginSpinBox->setShowClearButton( true );
56  mGridFrameMarginSpinBox->setClearValue( 0 );
57 
58  mDistanceToMapFrameSpinBox->setShowClearButton( true );
59  mDistanceToMapFrameSpinBox->setClearValue( 0 );
60 
61  connect( mIntervalXSpinBox, &QgsDoubleSpinBox::editingFinished, this, &QgsLayoutMapGridWidget::mIntervalXSpinBox_editingFinished );
62  connect( mIntervalYSpinBox, &QgsDoubleSpinBox::editingFinished, this, &QgsLayoutMapGridWidget::mIntervalYSpinBox_editingFinished );
63  connect( mOffsetXSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mOffsetXSpinBox_valueChanged );
64  connect( mOffsetYSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mOffsetYSpinBox_valueChanged );
65  connect( mCrossWidthSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mCrossWidthSpinBox_valueChanged );
66  connect( mFrameWidthSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mFrameWidthSpinBox_valueChanged );
67  connect( mGridFrameMarginSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mGridFrameMarginSpinBox_valueChanged );
68  connect( mFrameStyleComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mFrameStyleComboBox_currentIndexChanged );
69  connect( mRotatedTicksGroupBox, &QGroupBox::toggled, this, &QgsLayoutMapGridWidget::mRotatedTicksGroupBox_toggled );
70  connect( mRotatedTicksLengthModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mRotatedTicksLengthModeComboBox_currentIndexChanged );
71  connect( mRotatedTicksThresholdSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mRotatedTicksThresholdSpinBox_valueChanged );
72  connect( mRotatedTicksMarginToCornerSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mRotatedTicksMarginToCornerSpinBox_valueChanged );
73  connect( mRotatedAnnotationsGroupBox, &QGroupBox::toggled, this, &QgsLayoutMapGridWidget::mRotatedAnnotationsGroupBox_toggled );
74  connect( mRotatedAnnotationsLengthModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mRotatedAnnotationsLengthModeComboBox_currentIndexChanged );
75  connect( mRotatedAnnotationsThresholdSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mRotatedAnnotationsThresholdSpinBox_valueChanged );
76  connect( mRotatedAnnotationsMarginToCornerSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mRotatedAnnotationsMarginToCornerSpinBox_valueChanged );
77  connect( mGridFramePenSizeSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mGridFramePenSizeSpinBox_valueChanged );
78  connect( mGridFramePenColorButton, &QgsColorButton::colorChanged, this, &QgsLayoutMapGridWidget::mGridFramePenColorButton_colorChanged );
79  connect( mGridFrameFill1ColorButton, &QgsColorButton::colorChanged, this, &QgsLayoutMapGridWidget::mGridFrameFill1ColorButton_colorChanged );
80  connect( mGridFrameFill2ColorButton, &QgsColorButton::colorChanged, this, &QgsLayoutMapGridWidget::mGridFrameFill2ColorButton_colorChanged );
81  connect( mGridTypeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mGridTypeComboBox_currentIndexChanged );
82  connect( mMapGridUnitComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::intervalUnitChanged );
83  connect( mGridBlendComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mGridBlendComboBox_currentIndexChanged );
84  connect( mCheckGridLeftSide, &QCheckBox::toggled, this, &QgsLayoutMapGridWidget::mCheckGridLeftSide_toggled );
85  connect( mCheckGridRightSide, &QCheckBox::toggled, this, &QgsLayoutMapGridWidget::mCheckGridRightSide_toggled );
86  connect( mCheckGridTopSide, &QCheckBox::toggled, this, &QgsLayoutMapGridWidget::mCheckGridTopSide_toggled );
87  connect( mCheckGridBottomSide, &QCheckBox::toggled, this, &QgsLayoutMapGridWidget::mCheckGridBottomSide_toggled );
88  connect( mFrameDivisionsLeftComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mFrameDivisionsLeftComboBox_currentIndexChanged );
89  connect( mFrameDivisionsRightComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mFrameDivisionsRightComboBox_currentIndexChanged );
90  connect( mFrameDivisionsTopComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mFrameDivisionsTopComboBox_currentIndexChanged );
91  connect( mFrameDivisionsBottomComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mFrameDivisionsBottomComboBox_currentIndexChanged );
92  connect( mDrawAnnotationGroupBox, &QgsCollapsibleGroupBoxBasic::toggled, this, &QgsLayoutMapGridWidget::mDrawAnnotationGroupBox_toggled );
93  connect( mAnnotationFormatButton, &QToolButton::clicked, this, &QgsLayoutMapGridWidget::mAnnotationFormatButton_clicked );
94  connect( mAnnotationDisplayLeftComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDisplayLeftComboBox_currentIndexChanged );
95  connect( mAnnotationDisplayRightComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDisplayRightComboBox_currentIndexChanged );
96  connect( mAnnotationDisplayTopComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDisplayTopComboBox_currentIndexChanged );
97  connect( mAnnotationDisplayBottomComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDisplayBottomComboBox_currentIndexChanged );
98  connect( mAnnotationPositionLeftComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationPositionLeftComboBox_currentIndexChanged );
99  connect( mAnnotationPositionRightComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationPositionRightComboBox_currentIndexChanged );
100  connect( mAnnotationPositionTopComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationPositionTopComboBox_currentIndexChanged );
101  connect( mAnnotationPositionBottomComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationPositionBottomComboBox_currentIndexChanged );
102  connect( mAnnotationDirectionComboBoxLeft, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxLeft_currentIndexChanged );
103  connect( mAnnotationDirectionComboBoxRight, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxRight_currentIndexChanged );
104  connect( mAnnotationDirectionComboBoxTop, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxTop_currentIndexChanged );
105  connect( mAnnotationDirectionComboBoxBottom, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxBottom_currentIndexChanged );
106  connect( mAnnotationFormatComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationFormatComboBox_currentIndexChanged );
107  connect( mCoordinatePrecisionSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mCoordinatePrecisionSpinBox_valueChanged );
108  connect( mDistanceToMapFrameSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mDistanceToMapFrameSpinBox_valueChanged );
109  connect( mMinWidthSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::minIntervalChanged );
110  connect( mMaxWidthSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::maxIntervalChanged );
111  connect( mEnabledCheckBox, &QCheckBox::toggled, this, &QgsLayoutMapGridWidget::gridEnabledToggled );
112  setPanelTitle( tr( "Map Grid Properties" ) );
113 
114  mMapGridCrsSelector->setOptionVisible( QgsProjectionSelectionWidget::CrsNotSet, true );
115  mMapGridCrsSelector->setNotSetText( tr( "Use Map CRS" ) );
116 
117  connect( mMapGridCrsSelector, &QgsProjectionSelectionWidget::crsChanged, this, &QgsLayoutMapGridWidget::mapGridCrsChanged );
118 
119  blockAllSignals( true );
120 
121  mMapGridUnitComboBox->addItem( tr( "Map Units" ), QgsLayoutItemMapGrid::MapUnit );
122  mMapGridUnitComboBox->addItem( tr( "Fit Segment Width" ), QgsLayoutItemMapGrid::DynamicPageSizeBased );
123  mMapGridUnitComboBox->addItem( tr( "Millimeters" ), QgsLayoutItemMapGrid::MM );
124  mMapGridUnitComboBox->addItem( tr( "Centimeters" ), QgsLayoutItemMapGrid::CM );
125 
126  mGridTypeComboBox->insertItem( 0, tr( "Solid" ), QgsLayoutItemMapGrid::Solid );
127  mGridTypeComboBox->insertItem( 1, tr( "Cross" ), QgsLayoutItemMapGrid::Cross );
128  mGridTypeComboBox->insertItem( 2, tr( "Markers" ), QgsLayoutItemMapGrid::Markers );
129  mGridTypeComboBox->insertItem( 3, tr( "Frame and annotations only" ), QgsLayoutItemMapGrid::FrameAnnotationsOnly );
130 
131  insertFrameDisplayEntries( mFrameDivisionsLeftComboBox );
132  insertFrameDisplayEntries( mFrameDivisionsRightComboBox );
133  insertFrameDisplayEntries( mFrameDivisionsTopComboBox );
134  insertFrameDisplayEntries( mFrameDivisionsBottomComboBox );
135 
136  insertAnnotationDisplayEntries( mAnnotationDisplayLeftComboBox );
137  insertAnnotationDisplayEntries( mAnnotationDisplayRightComboBox );
138  insertAnnotationDisplayEntries( mAnnotationDisplayTopComboBox );
139  insertAnnotationDisplayEntries( mAnnotationDisplayBottomComboBox );
140 
141  insertAnnotationPositionEntries( mAnnotationPositionLeftComboBox );
142  insertAnnotationPositionEntries( mAnnotationPositionRightComboBox );
143  insertAnnotationPositionEntries( mAnnotationPositionTopComboBox );
144  insertAnnotationPositionEntries( mAnnotationPositionBottomComboBox );
145 
146  insertAnnotationDirectionEntries( mAnnotationDirectionComboBoxLeft );
147  insertAnnotationDirectionEntries( mAnnotationDirectionComboBoxRight );
148  insertAnnotationDirectionEntries( mAnnotationDirectionComboBoxTop );
149  insertAnnotationDirectionEntries( mAnnotationDirectionComboBoxBottom );
150 
151  mGridFramePenColorButton->setColorDialogTitle( tr( "Select Grid Frame Color" ) );
152  mGridFramePenColorButton->setAllowOpacity( true );
153  mGridFramePenColorButton->setContext( QStringLiteral( "composer" ) );
154  mGridFramePenColorButton->setNoColorString( tr( "Transparent Frame" ) );
155  mGridFramePenColorButton->setShowNoColor( true );
156 
157  mGridFrameFill1ColorButton->setColorDialogTitle( tr( "Select Grid Frame Fill Color" ) );
158  mGridFrameFill1ColorButton->setAllowOpacity( true );
159  mGridFrameFill1ColorButton->setContext( QStringLiteral( "composer" ) );
160  mGridFrameFill1ColorButton->setNoColorString( tr( "Transparent Fill" ) );
161  mGridFrameFill1ColorButton->setShowNoColor( true );
162 
163  mGridFrameFill2ColorButton->setColorDialogTitle( tr( "Select Grid Frame Fill Color" ) );
164  mGridFrameFill2ColorButton->setAllowOpacity( true );
165  mGridFrameFill2ColorButton->setContext( QStringLiteral( "composer" ) );
166  mGridFrameFill2ColorButton->setNoColorString( tr( "Transparent Fill" ) );
167  mGridFrameFill2ColorButton->setShowNoColor( true );
168 
169  mGridLineStyleButton->setSymbolType( QgsSymbol::Line );
170  mGridMarkerStyleButton->setSymbolType( QgsSymbol::Marker );
171 
172  //set initial state of frame style controls
173  toggleFrameControls( false, false, false, false );
174 
193 
194  // call to initially populate mAnnotationFormatComboBox
195  onCrsChanged();
196 
198 
199  blockAllSignals( false );
200  connect( mAnnotationFontButton, &QgsFontButton::changed, this, &QgsLayoutMapGridWidget::annotationTextFormatChanged );
201  connect( mGridLineStyleButton, &QgsSymbolButton::changed, this, &QgsLayoutMapGridWidget::lineSymbolChanged );
202  connect( mGridMarkerStyleButton, &QgsSymbolButton::changed, this, &QgsLayoutMapGridWidget::markerSymbolChanged );
203 
204  mGridLineStyleButton->registerExpressionContextGenerator( mMapGrid );
205  mGridLineStyleButton->setLayer( coverageLayer() );
206  mGridMarkerStyleButton->registerExpressionContextGenerator( mMapGrid );
207  mGridMarkerStyleButton->setLayer( coverageLayer() );
208  if ( mMap->layout() )
209  {
210  connect( &mMap->layout()->reportContext(), &QgsLayoutReportContext::layerChanged, mGridLineStyleButton, &QgsSymbolButton::setLayer );
211  connect( &mMap->layout()->reportContext(), &QgsLayoutReportContext::layerChanged, mGridMarkerStyleButton, &QgsSymbolButton::setLayer );
212  connect( &mMap->layout()->reportContext(), &QgsLayoutReportContext::layerChanged, mAnnotationFontButton, &QgsFontButton::setLayer );
213  }
214  mAnnotationFontButton->setLayer( coverageLayer() );
215  mAnnotationFontButton->registerExpressionContextGenerator( mMapGrid );
216 
217  connect( mMapGrid, &QgsLayoutItemMapGrid::crsChanged, this, &QgsLayoutMapGridWidget::onCrsChanged );
218 }
219 
221 {
222  updateDataDefinedButton( mEnabledDDBtn );
223  updateDataDefinedButton( mIntervalXDDBtn );
224  updateDataDefinedButton( mIntervalYDDBtn );
225  updateDataDefinedButton( mOffsetXDDBtn );
226  updateDataDefinedButton( mOffsetYDDBtn );
227  updateDataDefinedButton( mFrameSizeDDBtn );
228  updateDataDefinedButton( mFrameMarginDDBtn );
229  updateDataDefinedButton( mLabelDistDDBtn );
230  updateDataDefinedButton( mCrossWidthDDBtn );
231  updateDataDefinedButton( mFrameLineThicknessDDBtn );
232  updateDataDefinedButton( mAnnotationDisplayLeftDDBtn );
233  updateDataDefinedButton( mAnnotationDisplayRightDDBtn );
234  updateDataDefinedButton( mAnnotationDisplayTopDDBtn );
235  updateDataDefinedButton( mAnnotationDisplayBottomDDBtn );
236  updateDataDefinedButton( mFrameDivisionsLeftDDBtn );
237  updateDataDefinedButton( mFrameDivisionsRightDDBtn );
238  updateDataDefinedButton( mFrameDivisionsTopDDBtn );
239  updateDataDefinedButton( mFrameDivisionsBottomDDBtn );
240 }
241 
242 void QgsLayoutMapGridWidget::setGuiElementValues()
243 {
245 }
246 
248 {
249  if ( !mMapGrid || !mMap )
250  {
251  return;
252  }
253 
254  blockAllSignals( true );
256  setGridItems();
257  blockAllSignals( false );
258 }
259 
260 void QgsLayoutMapGridWidget::blockAllSignals( bool block )
261 {
262  //grid
263  mEnabledCheckBox->blockSignals( block );
264  mGridTypeComboBox->blockSignals( block );
265  mIntervalXSpinBox->blockSignals( block );
266  mIntervalYSpinBox->blockSignals( block );
267  mOffsetXSpinBox->blockSignals( block );
268  mOffsetYSpinBox->blockSignals( block );
269  mCrossWidthSpinBox->blockSignals( block );
270  mFrameStyleComboBox->blockSignals( block );
271  mFrameWidthSpinBox->blockSignals( block );
272  mGridFrameMarginSpinBox->blockSignals( block );
273  mGridLineStyleButton->blockSignals( block );
274  mMapGridUnitComboBox->blockSignals( block );
275  mGridFramePenSizeSpinBox->blockSignals( block );
276  mGridFramePenColorButton->blockSignals( block );
277  mGridFrameFill1ColorButton->blockSignals( block );
278  mGridFrameFill2ColorButton->blockSignals( block );
279  mGridBlendComboBox->blockSignals( block );
280  mCheckGridLeftSide->blockSignals( block );
281  mCheckGridRightSide->blockSignals( block );
282  mCheckGridTopSide->blockSignals( block );
283  mCheckGridBottomSide->blockSignals( block );
284  mFrameDivisionsLeftComboBox->blockSignals( block );
285  mFrameDivisionsRightComboBox->blockSignals( block );
286  mFrameDivisionsTopComboBox->blockSignals( block );
287  mFrameDivisionsBottomComboBox->blockSignals( block );
288  mGridMarkerStyleButton->blockSignals( block );
289 
290  //grid annotation
291  mDrawAnnotationGroupBox->blockSignals( block );
292  mAnnotationFormatComboBox->blockSignals( block );
293  mAnnotationDisplayLeftComboBox->blockSignals( block );
294  mAnnotationPositionLeftComboBox->blockSignals( block );
295  mAnnotationDirectionComboBoxLeft->blockSignals( block );
296  mAnnotationDisplayRightComboBox->blockSignals( block );
297  mAnnotationPositionRightComboBox->blockSignals( block );
298  mAnnotationDirectionComboBoxRight->blockSignals( block );
299  mAnnotationDisplayTopComboBox->blockSignals( block );
300  mAnnotationPositionTopComboBox->blockSignals( block );
301  mAnnotationDirectionComboBoxTop->blockSignals( block );
302  mAnnotationDisplayBottomComboBox->blockSignals( block );
303  mAnnotationPositionBottomComboBox->blockSignals( block );
304  mAnnotationDirectionComboBoxBottom->blockSignals( block );
305  mDistanceToMapFrameSpinBox->blockSignals( block );
306  mCoordinatePrecisionSpinBox->blockSignals( block );
307  mAnnotationFontButton->blockSignals( block );
308  mMinWidthSpinBox->blockSignals( block );
309  mMaxWidthSpinBox->blockSignals( block );
310 }
311 
312 void QgsLayoutMapGridWidget::handleChangedFrameDisplay( QgsLayoutItemMapGrid::BorderSide border, const QgsLayoutItemMapGrid::DisplayMode mode )
313 {
314  if ( !mMapGrid || !mMap )
315  {
316  return;
317  }
318 
319  mMap->beginCommand( tr( "Change Frame Divisions" ) );
320  mMapGrid->setFrameDivisions( mode, border );
321  mMap->endCommand();
322  mMap->updateBoundingRect();
323 }
324 
325 void QgsLayoutMapGridWidget::handleChangedAnnotationDisplay( QgsLayoutItemMapGrid::BorderSide border, const QgsLayoutItemMapGrid::DisplayMode mode )
326 {
327  if ( !mMapGrid || !mMap )
328  {
329  return;
330  }
331 
332  mMap->beginCommand( tr( "Change Annotation Format" ) );
333  mMapGrid->setAnnotationDisplay( mode, border );
334  mMap->updateBoundingRect();
335  mMap->update();
336  mMap->endCommand();
337 }
338 
339 void QgsLayoutMapGridWidget::toggleFrameControls( bool frameEnabled, bool frameFillEnabled, bool frameSizeEnabled, bool rotationEnabled )
340 {
341  //set status of frame controls
342  mFrameWidthSpinBox->setEnabled( frameSizeEnabled );
343  mGridFrameMarginSpinBox->setEnabled( frameEnabled );
344  mGridFramePenSizeSpinBox->setEnabled( frameEnabled );
345  mGridFramePenColorButton->setEnabled( frameEnabled );
346  mGridFrameFill1ColorButton->setEnabled( frameFillEnabled );
347  mGridFrameFill2ColorButton->setEnabled( frameFillEnabled );
348  mFrameWidthLabel->setEnabled( frameSizeEnabled );
349  mFrameMarginLabel->setEnabled( frameEnabled );
350  mFramePenLabel->setEnabled( frameEnabled );
351  mFrameFillLabel->setEnabled( frameFillEnabled );
352  mCheckGridLeftSide->setEnabled( frameEnabled );
353  mCheckGridRightSide->setEnabled( frameEnabled );
354  mCheckGridTopSide->setEnabled( frameEnabled );
355  mCheckGridBottomSide->setEnabled( frameEnabled );
356  mFrameDivisionsLeftComboBox->setEnabled( frameEnabled );
357  mFrameDivisionsRightComboBox->setEnabled( frameEnabled );
358  mFrameDivisionsTopComboBox->setEnabled( frameEnabled );
359  mFrameDivisionsBottomComboBox->setEnabled( frameEnabled );
360  mLeftDivisionsLabel->setEnabled( frameEnabled );
361  mRightDivisionsLabel->setEnabled( frameEnabled );
362  mTopDivisionsLabel->setEnabled( frameEnabled );
363  mBottomDivisionsLabel->setEnabled( frameEnabled );
364  mRotatedTicksGroupBox->setEnabled( rotationEnabled );
365 }
366 
367 void QgsLayoutMapGridWidget::insertAnnotationPositionEntries( QComboBox *c )
368 {
369  c->insertItem( 0, tr( "Inside Frame" ), QgsLayoutItemMapGrid::InsideMapFrame );
370  c->insertItem( 1, tr( "Outside Frame" ), QgsLayoutItemMapGrid::OutsideMapFrame );
371 }
372 
373 void QgsLayoutMapGridWidget::insertAnnotationDirectionEntries( QComboBox *c )
374 {
375  c->addItem( tr( "Horizontal" ), QgsLayoutItemMapGrid::Horizontal );
376  c->addItem( tr( "Vertical Ascending" ), QgsLayoutItemMapGrid::Vertical );
377  c->addItem( tr( "Vertical Descending" ), QgsLayoutItemMapGrid::VerticalDescending );
378  c->addItem( tr( "Boundary Direction" ), QgsLayoutItemMapGrid::BoundaryDirection );
379  // c->addItem( tr( "Parallel to Tick" ), QgsLayoutItemMapGrid::ParallelToTick );
380  c->addItem( tr( "Above Tick" ), QgsLayoutItemMapGrid::AboveTick );
381  c->addItem( tr( "On Tick" ), QgsLayoutItemMapGrid::OnTick );
382  c->addItem( tr( "Under Tick" ), QgsLayoutItemMapGrid::UnderTick );
383 }
384 
385 void QgsLayoutMapGridWidget::initFrameDisplayBox( QComboBox *c, QgsLayoutItemMapGrid::DisplayMode display )
386 {
387  if ( !c )
388  {
389  return;
390  }
391  c->setCurrentIndex( c->findData( display ) );
392 }
393 
394 void QgsLayoutMapGridWidget::handleChangedAnnotationPosition( QgsLayoutItemMapGrid::BorderSide border, const QgsLayoutItemMapGrid::AnnotationPosition position )
395 {
396  if ( !mMapGrid || !mMap )
397  {
398  return;
399  }
400 
401  mMap->beginCommand( tr( "Change Annotation Position" ) );
402  mMapGrid->setAnnotationPosition( position, border );
403 
404  mMap->updateBoundingRect();
405  mMap->update();
406  mMap->endCommand();
407 }
408 
409 void QgsLayoutMapGridWidget::handleChangedAnnotationDirection( QgsLayoutItemMapGrid::BorderSide border, QgsLayoutItemMapGrid::AnnotationDirection direction )
410 {
411  if ( !mMapGrid || !mMap )
412  {
413  return;
414  }
415 
416  mMap->beginCommand( tr( "Change Annotation Direction" ) );
417  mMapGrid->setAnnotationDirection( direction, border );
418  mMap->updateBoundingRect();
419  mMap->update();
420  mMap->endCommand();
421 }
422 
423 void QgsLayoutMapGridWidget::insertFrameDisplayEntries( QComboBox *c )
424 {
425  c->addItem( tr( "All" ), QgsLayoutItemMapGrid::ShowAll );
426  c->addItem( tr( "Latitude/Y Only" ), QgsLayoutItemMapGrid::LatitudeOnly );
427  c->addItem( tr( "Longitude/X Only" ), QgsLayoutItemMapGrid::LongitudeOnly );
428 }
429 
430 void QgsLayoutMapGridWidget::insertAnnotationDisplayEntries( QComboBox *c )
431 {
432  c->insertItem( 0, tr( "Show All" ), QgsLayoutItemMapGrid::ShowAll );
433  c->insertItem( 1, tr( "Show Latitude/Y Only" ), QgsLayoutItemMapGrid::LatitudeOnly );
434  c->insertItem( 2, tr( "Show Longitude/X Only" ), QgsLayoutItemMapGrid::LongitudeOnly );
435  c->insertItem( 3, tr( "Disabled" ), QgsLayoutItemMapGrid::HideAll );
436 }
437 
438 void QgsLayoutMapGridWidget::initAnnotationPositionBox( QComboBox *c, QgsLayoutItemMapGrid::AnnotationPosition pos )
439 {
440  if ( !c )
441  {
442  return;
443  }
444 
446  {
447  c->setCurrentIndex( c->findText( tr( "Inside Frame" ) ) );
448  }
449  else
450  {
451  c->setCurrentIndex( c->findText( tr( "Outside Frame" ) ) );
452  }
453 }
454 
455 void QgsLayoutMapGridWidget::initAnnotationDirectionBox( QComboBox *c, QgsLayoutItemMapGrid::AnnotationDirection dir )
456 {
457  if ( !c )
458  {
459  return;
460  }
461  c->setCurrentIndex( c->findData( dir ) );
462 }
463 
464 bool QgsLayoutMapGridWidget::hasPredefinedScales() const
465 {
466  // first look at project's scales
467  const QVector< double > scales = QgsProject::instance()->viewSettings()->mapScales();
468  bool hasProjectScales( QgsProject::instance()->viewSettings()->useProjectScales() );
469  if ( !hasProjectScales || scales.isEmpty() )
470  {
471  // default to global map tool scales
472  QgsSettings settings;
473  QString scalesStr( settings.value( QStringLiteral( "Map/scales" ), Qgis::defaultProjectScales() ).toString() );
474  QStringList myScalesList = scalesStr.split( ',' );
475  return !myScalesList.isEmpty() && !myScalesList[0].isEmpty();
476  }
477  return true;
478 }
479 
480 void QgsLayoutMapGridWidget::setGridItems()
481 {
482  if ( !mMapGrid )
483  {
484  return;
485  }
486 
487  mGridMarkerStyleButton->registerExpressionContextGenerator( mMapGrid );
488  mGridLineStyleButton->registerExpressionContextGenerator( mMapGrid );
489  mAnnotationFontButton->registerExpressionContextGenerator( mMapGrid );
490 
491  mEnabledCheckBox->setChecked( mMapGrid->enabled() );
492  mIntervalXSpinBox->setValue( mMapGrid->intervalX() );
493  mIntervalYSpinBox->setValue( mMapGrid->intervalY() );
494  mOffsetXSpinBox->setValue( mMapGrid->offsetX() );
495  mOffsetYSpinBox->setValue( mMapGrid->offsetY() );
496  mCrossWidthSpinBox->setValue( mMapGrid->crossLength() );
497  mFrameWidthSpinBox->setValue( mMapGrid->frameWidth() );
498  mGridFrameMarginSpinBox->setValue( mMapGrid->frameMargin() );
499  mGridFramePenSizeSpinBox->setValue( mMapGrid->framePenSize() );
500  mGridFramePenColorButton->setColor( mMapGrid->framePenColor() );
501  mGridFrameFill1ColorButton->setColor( mMapGrid->frameFillColor1() );
502  mGridFrameFill2ColorButton->setColor( mMapGrid->frameFillColor2() );
503 
504  const QgsLayoutItemMapGrid::GridStyle gridStyle = mMapGrid->style();
505  mGridTypeComboBox->setCurrentIndex( mGridTypeComboBox->findData( gridStyle ) );
506  switch ( gridStyle )
507  {
509  mCrossWidthSpinBox->setVisible( true );
510  mCrossWidthDDBtn->setVisible( true );
511  mCrossWidthLabel->setVisible( true );
512  mGridLineStyleButton->setVisible( true );
513  mLineStyleLabel->setVisible( true );
514  mGridMarkerStyleButton->setVisible( false );
515  mMarkerStyleLabel->setVisible( false );
516  mGridBlendComboBox->setVisible( true );
517  mGridBlendLabel->setVisible( true );
518  break;
520  mCrossWidthSpinBox->setVisible( false );
521  mCrossWidthDDBtn->setVisible( false );
522  mCrossWidthLabel->setVisible( false );
523  mGridLineStyleButton->setVisible( false );
524  mLineStyleLabel->setVisible( false );
525  mGridMarkerStyleButton->setVisible( true );
526  mMarkerStyleLabel->setVisible( true );
527  mGridBlendComboBox->setVisible( true );
528  mGridBlendLabel->setVisible( true );
529  break;
531  mCrossWidthSpinBox->setVisible( false );
532  mCrossWidthDDBtn->setVisible( false );
533  mCrossWidthLabel->setVisible( false );
534  mGridLineStyleButton->setVisible( true );
535  mLineStyleLabel->setVisible( true );
536  mGridMarkerStyleButton->setVisible( false );
537  mMarkerStyleLabel->setVisible( false );
538  mGridBlendComboBox->setVisible( true );
539  mGridBlendLabel->setVisible( true );
540  break;
542  mCrossWidthSpinBox->setVisible( false );
543  mCrossWidthDDBtn->setVisible( false );
544  mCrossWidthLabel->setVisible( false );
545  mGridLineStyleButton->setVisible( false );
546  mLineStyleLabel->setVisible( false );
547  mGridMarkerStyleButton->setVisible( false );
548  mMarkerStyleLabel->setVisible( false );
549  mGridBlendComboBox->setVisible( false );
550  mGridBlendLabel->setVisible( false );
551  break;
552  }
553 
554  //grid frame
555  mFrameWidthSpinBox->setValue( mMapGrid->frameWidth() );
556  mGridFrameMarginSpinBox->setValue( mMapGrid->frameMargin() );
557  QgsLayoutItemMapGrid::FrameStyle gridFrameStyle = mMapGrid->frameStyle();
558  mFrameStyleComboBox->setCurrentIndex( mFrameStyleComboBox->findData( gridFrameStyle ) );
559  switch ( gridFrameStyle )
560  {
563  toggleFrameControls( true, true, true, false );
564  break;
568  toggleFrameControls( true, false, true, true );
569  break;
572  toggleFrameControls( true, false, false, false );
573  break;
575  toggleFrameControls( false, false, false, false );
576  break;
577  }
578 
579  mCheckGridLeftSide->setChecked( mMapGrid->testFrameSideFlag( QgsLayoutItemMapGrid::FrameLeft ) );
580  mCheckGridRightSide->setChecked( mMapGrid->testFrameSideFlag( QgsLayoutItemMapGrid::FrameRight ) );
581  mCheckGridTopSide->setChecked( mMapGrid->testFrameSideFlag( QgsLayoutItemMapGrid::FrameTop ) );
582  mCheckGridBottomSide->setChecked( mMapGrid->testFrameSideFlag( QgsLayoutItemMapGrid::FrameBottom ) );
583 
584  mRotatedTicksGroupBox->setChecked( mMapGrid->rotatedTicksEnabled() );
585  mRotatedTicksLengthModeComboBox->setCurrentIndex( mRotatedTicksLengthModeComboBox->findData( mMapGrid->rotatedTicksLengthMode() ) );
586  mRotatedTicksThresholdSpinBox->setValue( mMapGrid->rotatedTicksMinimumAngle() );
587  mRotatedTicksMarginToCornerSpinBox->setValue( mMapGrid->rotatedTicksMarginToCorner() );
588 
589  mRotatedAnnotationsGroupBox->setChecked( mMapGrid->rotatedAnnotationsEnabled() );
590  mRotatedAnnotationsLengthModeComboBox->setCurrentIndex( mRotatedAnnotationsLengthModeComboBox->findData( mMapGrid->rotatedAnnotationsLengthMode() ) );
591  mRotatedAnnotationsThresholdSpinBox->setValue( mMapGrid->rotatedAnnotationsMinimumAngle() );
592  mRotatedAnnotationsMarginToCornerSpinBox->setValue( mMapGrid->rotatedAnnotationsMarginToCorner() );
593 
594  initFrameDisplayBox( mFrameDivisionsLeftComboBox, mMapGrid->frameDivisions( QgsLayoutItemMapGrid::Left ) );
595  initFrameDisplayBox( mFrameDivisionsRightComboBox, mMapGrid->frameDivisions( QgsLayoutItemMapGrid::Right ) );
596  initFrameDisplayBox( mFrameDivisionsTopComboBox, mMapGrid->frameDivisions( QgsLayoutItemMapGrid::Top ) );
597  initFrameDisplayBox( mFrameDivisionsBottomComboBox, mMapGrid->frameDivisions( QgsLayoutItemMapGrid::Bottom ) );
598 
599  //line style
600  mGridLineStyleButton->setSymbol( mMapGrid->lineSymbol()->clone() );
601  //marker style
602  mGridMarkerStyleButton->setSymbol( mMapGrid->markerSymbol()->clone() );
603 
604  mGridBlendComboBox->setBlendMode( mMapGrid->blendMode() );
605 
606  mDrawAnnotationGroupBox->setChecked( mMapGrid->annotationEnabled() );
607  mAnnotationDisplayLeftComboBox->setCurrentIndex( mAnnotationDisplayLeftComboBox->findData( mMapGrid->annotationDisplay( QgsLayoutItemMapGrid::Left ) ) );
608  mAnnotationDisplayRightComboBox->setCurrentIndex( mAnnotationDisplayRightComboBox->findData( mMapGrid->annotationDisplay( QgsLayoutItemMapGrid::Right ) ) );
609  mAnnotationDisplayTopComboBox->setCurrentIndex( mAnnotationDisplayTopComboBox->findData( mMapGrid->annotationDisplay( QgsLayoutItemMapGrid::Top ) ) );
610  mAnnotationDisplayBottomComboBox->setCurrentIndex( mAnnotationDisplayBottomComboBox->findData( mMapGrid->annotationDisplay( QgsLayoutItemMapGrid::Bottom ) ) );
611 
612  mAnnotationPositionLeftComboBox->setCurrentIndex( mAnnotationPositionLeftComboBox->findData( mMapGrid->annotationPosition( QgsLayoutItemMapGrid::Left ) ) );
613  mAnnotationPositionRightComboBox->setCurrentIndex( mAnnotationPositionRightComboBox->findData( mMapGrid->annotationPosition( QgsLayoutItemMapGrid::Right ) ) );
614  mAnnotationPositionTopComboBox->setCurrentIndex( mAnnotationPositionTopComboBox->findData( mMapGrid->annotationPosition( QgsLayoutItemMapGrid::Top ) ) );
615  mAnnotationPositionBottomComboBox->setCurrentIndex( mAnnotationPositionBottomComboBox->findData( mMapGrid->annotationPosition( QgsLayoutItemMapGrid::Bottom ) ) );
616 
617  initAnnotationDirectionBox( mAnnotationDirectionComboBoxLeft, mMapGrid->annotationDirection( QgsLayoutItemMapGrid::Left ) );
618  initAnnotationDirectionBox( mAnnotationDirectionComboBoxRight, mMapGrid->annotationDirection( QgsLayoutItemMapGrid::Right ) );
619  initAnnotationDirectionBox( mAnnotationDirectionComboBoxTop, mMapGrid->annotationDirection( QgsLayoutItemMapGrid::Top ) );
620  initAnnotationDirectionBox( mAnnotationDirectionComboBoxBottom, mMapGrid->annotationDirection( QgsLayoutItemMapGrid::Bottom ) );
621 
622  mAnnotationFontButton->setDialogTitle( tr( "Grid Annotation Font" ) );
623  mAnnotationFontButton->setMode( QgsFontButton::ModeTextRenderer );
624  mAnnotationFontButton->setTextFormat( mMapGrid->annotationTextFormat() );
625 
626  mAnnotationFormatComboBox->setCurrentIndex( mAnnotationFormatComboBox->findData( mMapGrid->annotationFormat() ) );
627  mAnnotationFormatButton->setEnabled( mMapGrid->annotationFormat() == QgsLayoutItemMapGrid::CustomFormat );
628  mDistanceToMapFrameSpinBox->setValue( mMapGrid->annotationFrameDistance() );
629  mCoordinatePrecisionSpinBox->setValue( mMapGrid->annotationPrecision() );
630 
631  //Unit
632  mMapGridUnitComboBox->setCurrentIndex( mMapGridUnitComboBox->findData( mMapGrid->units() ) );
633  switch ( mMapGrid->units() )
634  {
638  mIntervalStackedWidget->setCurrentIndex( 0 );
639  break;
640 
642  mIntervalStackedWidget->setCurrentIndex( 1 );
643  break;
644  }
645  mMinWidthSpinBox->setValue( mMapGrid->minimumIntervalWidth() );
646  mMaxWidthSpinBox->setValue( mMapGrid->maximumIntervalWidth() );
647 
648  whileBlocking( mMapGridCrsSelector )->setCrs( mMapGrid->crs() );
649 }
650 
651 void QgsLayoutMapGridWidget::mIntervalXSpinBox_editingFinished()
652 {
653  if ( !mMapGrid || !mMap )
654  {
655  return;
656  }
657 
658  mMap->beginCommand( tr( "Change Grid Interval" ) );
659  mMapGrid->setIntervalX( mIntervalXSpinBox->value() );
660  mMap->updateBoundingRect();
661  mMap->update();
662  mMap->endCommand();
663 }
664 
665 void QgsLayoutMapGridWidget::mIntervalYSpinBox_editingFinished()
666 {
667  if ( !mMapGrid || !mMap )
668  {
669  return;
670  }
671 
672  mMap->beginCommand( tr( "Change Grid Interval" ) );
673  mMapGrid->setIntervalY( mIntervalYSpinBox->value() );
674  mMap->updateBoundingRect();
675  mMap->update();
676  mMap->endCommand();
677 }
678 
679 void QgsLayoutMapGridWidget::mOffsetXSpinBox_valueChanged( double value )
680 {
681  if ( !mMapGrid || !mMap )
682  {
683  return;
684  }
685 
686  mMap->beginCommand( tr( "Change Grid Offset" ) );
687  mMapGrid->setOffsetX( value );
688  mMap->updateBoundingRect();
689  mMap->update();
690  mMap->endCommand();
691 }
692 
693 void QgsLayoutMapGridWidget::mOffsetYSpinBox_valueChanged( double value )
694 {
695  if ( !mMapGrid || !mMap )
696  {
697  return;
698  }
699 
700  mMap->beginCommand( tr( "Change Grid Offset" ) );
701  mMapGrid->setOffsetY( value );
702  mMap->updateBoundingRect();
703  mMap->update();
704  mMap->endCommand();
705 }
706 
707 void QgsLayoutMapGridWidget::mCrossWidthSpinBox_valueChanged( double val )
708 {
709  if ( !mMapGrid || !mMap )
710  {
711  return;
712  }
713 
714  mMap->beginCommand( tr( "Change Cross Width" ) );
715  mMapGrid->setCrossLength( val );
716  mMap->update();
717  mMap->endCommand();
718 }
719 
720 void QgsLayoutMapGridWidget::mFrameWidthSpinBox_valueChanged( double val )
721 {
722  if ( !mMapGrid || !mMap )
723  {
724  return;
725  }
726 
727  mMap->beginCommand( tr( "Change Frame Width" ) );
728  mMapGrid->setFrameWidth( val );
729  mMap->updateBoundingRect();
730  mMap->update();
731  mMap->endCommand();
732 }
733 
734 void QgsLayoutMapGridWidget::mGridFrameMarginSpinBox_valueChanged( double val )
735 {
736  if ( !mMapGrid || !mMap )
737  {
738  return;
739  }
740 
741  mMap->beginCommand( tr( "Change Grid Frame Margin" ) );
742  mMapGrid->setFrameMargin( val );
743  mMap->updateBoundingRect();
744  mMap->update();
745  mMap->endCommand();
746 }
747 
748 void QgsLayoutMapGridWidget::mCheckGridLeftSide_toggled( bool checked )
749 {
750  if ( !mMapGrid || !mMap )
751  {
752  return;
753  }
754 
755  mMap->beginCommand( tr( "Change Frame Left" ) );
756  mMapGrid->setFrameSideFlag( QgsLayoutItemMapGrid::FrameLeft, checked );
757  mMap->updateBoundingRect();
758  mMap->update();
759  mMap->endCommand();
760 }
761 
762 void QgsLayoutMapGridWidget::mCheckGridRightSide_toggled( bool checked )
763 {
764  if ( !mMapGrid || !mMap )
765  {
766  return;
767  }
768 
769  mMap->beginCommand( tr( "Change Frame Right" ) );
770  mMapGrid->setFrameSideFlag( QgsLayoutItemMapGrid::FrameRight, checked );
771  mMap->updateBoundingRect();
772  mMap->update();
773  mMap->endCommand();
774 }
775 
776 void QgsLayoutMapGridWidget::mCheckGridTopSide_toggled( bool checked )
777 {
778  if ( !mMapGrid || !mMap )
779  {
780  return;
781  }
782 
783  mMap->beginCommand( tr( "Change Frame Top" ) );
784  mMapGrid->setFrameSideFlag( QgsLayoutItemMapGrid::FrameTop, checked );
785  mMap->updateBoundingRect();
786  mMap->update();
787  mMap->endCommand();
788 }
789 
790 void QgsLayoutMapGridWidget::mCheckGridBottomSide_toggled( bool checked )
791 {
792  if ( !mMapGrid || !mMap )
793  {
794  return;
795  }
796 
797  mMap->beginCommand( tr( "Change Frame Bottom" ) );
798  mMapGrid->setFrameSideFlag( QgsLayoutItemMapGrid::FrameBottom, checked );
799  mMap->updateBoundingRect();
800  mMap->update();
801  mMap->endCommand();
802 }
803 
804 void QgsLayoutMapGridWidget::mFrameDivisionsLeftComboBox_currentIndexChanged( int index )
805 {
806  handleChangedFrameDisplay( QgsLayoutItemMapGrid::Left, static_cast< QgsLayoutItemMapGrid::DisplayMode >( mFrameDivisionsLeftComboBox->itemData( index ).toInt() ) );
807 }
808 
809 void QgsLayoutMapGridWidget::mFrameDivisionsRightComboBox_currentIndexChanged( int index )
810 {
811  handleChangedFrameDisplay( QgsLayoutItemMapGrid::Right, static_cast< QgsLayoutItemMapGrid::DisplayMode >( mFrameDivisionsRightComboBox->itemData( index ).toInt() ) );
812 }
813 
814 void QgsLayoutMapGridWidget::mFrameDivisionsTopComboBox_currentIndexChanged( int index )
815 {
816  handleChangedFrameDisplay( QgsLayoutItemMapGrid::Top, static_cast< QgsLayoutItemMapGrid::DisplayMode >( mFrameDivisionsTopComboBox->itemData( index ).toInt() ) );
817 }
818 
819 void QgsLayoutMapGridWidget::mFrameDivisionsBottomComboBox_currentIndexChanged( int index )
820 {
821  handleChangedFrameDisplay( QgsLayoutItemMapGrid::Bottom, static_cast< QgsLayoutItemMapGrid::DisplayMode >( mFrameDivisionsBottomComboBox->itemData( index ).toInt() ) );
822 }
823 
824 void QgsLayoutMapGridWidget::mGridFramePenSizeSpinBox_valueChanged( double d )
825 {
826  if ( !mMapGrid || !mMap )
827  {
828  return;
829  }
830 
831  mMap->beginCommand( tr( "Change Frame Thickness" ) );
832  mMapGrid->setFramePenSize( d );
833  mMap->updateBoundingRect();
834  mMap->update();
835  mMap->endCommand();
836 }
837 
838 void QgsLayoutMapGridWidget::mGridFramePenColorButton_colorChanged( const QColor &newColor )
839 {
840  if ( !mMapGrid || !mMap )
841  {
842  return;
843  }
844 
845  mMap->beginCommand( tr( "Change Frame Color" ), QgsLayoutItem::UndoGridFramePenColor );
846  mMapGrid->setFramePenColor( newColor );
847  mMap->update();
848  mMap->endCommand();
849 }
850 
851 void QgsLayoutMapGridWidget::mGridFrameFill1ColorButton_colorChanged( const QColor &newColor )
852 {
853  if ( !mMapGrid || !mMap )
854  {
855  return;
856  }
857 
858  mMap->beginCommand( tr( "Change Frame Fill Color" ), QgsLayoutItem::UndoMapGridFrameFill1Color );
859  mMapGrid->setFrameFillColor1( newColor );
860  mMap->update();
861  mMap->endCommand();
862 }
863 
864 void QgsLayoutMapGridWidget::mGridFrameFill2ColorButton_colorChanged( const QColor &newColor )
865 {
866  if ( !mMapGrid || !mMap )
867  {
868  return;
869  }
870 
871  mMap->beginCommand( tr( "Change Frame Fill Color" ), QgsLayoutItem::UndoMapGridFrameFill2Color );
872  mMapGrid->setFrameFillColor2( newColor );
873  mMap->update();
874  mMap->endCommand();
875 }
876 
877 void QgsLayoutMapGridWidget::mFrameStyleComboBox_currentIndexChanged( int )
878 {
879  if ( !mMapGrid || !mMap )
880  {
881  return;
882  }
883 
884  QgsLayoutItemMapGrid::FrameStyle style = static_cast< QgsLayoutItemMapGrid::FrameStyle >( mFrameStyleComboBox->currentData().toInt() );
885  mMap->beginCommand( tr( "Change Frame Style" ) );
886  mMapGrid->setFrameStyle( style );
887  switch ( style )
888  {
891  toggleFrameControls( true, true, true, false );
892  break;
896  toggleFrameControls( true, false, true, true );
897  break;
900  toggleFrameControls( true, false, false, false );
901  break;
903  toggleFrameControls( false, false, false, false );
904  break;
905  }
906  mMap->updateBoundingRect();
907  mMap->update();
908  mMap->endCommand();
909 }
910 
911 void QgsLayoutMapGridWidget::mRotatedTicksGroupBox_toggled( bool state )
912 {
913  if ( !mMapGrid || !mMap )
914  {
915  return;
916  }
917 
918  mMap->beginCommand( tr( "Change Tick Rotation Enabled" ) );
919  mMapGrid->setRotatedTicksEnabled( state );
920  mMap->update();
921  mMap->endCommand();
922 }
923 
924 void QgsLayoutMapGridWidget::mRotatedTicksLengthModeComboBox_currentIndexChanged( int )
925 {
926  if ( !mMapGrid || !mMap )
927  {
928  return;
929  }
930 
931  QgsLayoutItemMapGrid::TickLengthMode mode = static_cast< QgsLayoutItemMapGrid::TickLengthMode >( mRotatedTicksLengthModeComboBox->currentData().toInt() );
932  mMap->beginCommand( tr( "Change Tick Length Mode" ) );
933  mMapGrid->setRotatedTicksLengthMode( mode );
934  mMap->update();
935  mMap->endCommand();
936 }
937 
938 void QgsLayoutMapGridWidget::mRotatedTicksThresholdSpinBox_valueChanged( double val )
939 {
940  if ( !mMapGrid || !mMap )
941  {
942  return;
943  }
944 
945  mMap->beginCommand( tr( "Change Rotated Ticks Threshold" ) );
946  mMapGrid->setRotatedTicksMinimumAngle( val );
947  mMap->update();
948  mMap->endCommand();
949 }
950 
951 void QgsLayoutMapGridWidget::mRotatedTicksMarginToCornerSpinBox_valueChanged( double val )
952 {
953  if ( !mMapGrid || !mMap )
954  {
955  return;
956  }
957 
958  mMap->beginCommand( tr( "Change Rotated Ticks Margin to Corner" ) );
959  mMapGrid->setRotatedTicksMarginToCorner( val );
960  mMap->update();
961  mMap->endCommand();
962 }
963 
964 void QgsLayoutMapGridWidget::mRotatedAnnotationsGroupBox_toggled( bool state )
965 {
966  if ( !mMapGrid || !mMap )
967  {
968  return;
969  }
970 
971  mMap->beginCommand( tr( "Change Annotation Rotation Enabled" ) );
972  mMapGrid->setRotatedAnnotationsEnabled( state );
973  mMap->update();
974  mMap->endCommand();
975 }
976 
977 void QgsLayoutMapGridWidget::mRotatedAnnotationsLengthModeComboBox_currentIndexChanged( int )
978 {
979  if ( !mMapGrid || !mMap )
980  {
981  return;
982  }
983 
984  QgsLayoutItemMapGrid::TickLengthMode mode = static_cast< QgsLayoutItemMapGrid::TickLengthMode >( mRotatedAnnotationsLengthModeComboBox->currentData().toInt() );
985  mMap->beginCommand( tr( "Change Annotation Length Mode" ) );
986  mMapGrid->setRotatedAnnotationsLengthMode( mode );
987  mMap->update();
988  mMap->endCommand();
989 }
990 
991 void QgsLayoutMapGridWidget::mRotatedAnnotationsThresholdSpinBox_valueChanged( double val )
992 {
993  if ( !mMapGrid || !mMap )
994  {
995  return;
996  }
997 
998  mMap->beginCommand( tr( "Change Rotated Annotations Threshold" ) );
999  mMapGrid->setRotatedAnnotationsMinimumAngle( val );
1000  mMap->update();
1001  mMap->endCommand();
1002 }
1003 
1004 void QgsLayoutMapGridWidget::mRotatedAnnotationsMarginToCornerSpinBox_valueChanged( double val )
1005 {
1006  if ( !mMapGrid || !mMap )
1007  {
1008  return;
1009  }
1010 
1011  mMap->beginCommand( tr( "Change Rotated Annotations Margin to Corner" ) );
1012  mMapGrid->setRotatedAnnotationsMarginToCorner( val );
1013  mMap->update();
1014  mMap->endCommand();
1015 }
1016 
1017 void QgsLayoutMapGridWidget::intervalUnitChanged( int )
1018 {
1019  if ( !mMapGrid || !mMap )
1020  {
1021  return;
1022  }
1023 
1024  const QgsLayoutItemMapGrid::GridUnit unit = static_cast< QgsLayoutItemMapGrid::GridUnit >( mMapGridUnitComboBox->currentData().toInt() );
1025  switch ( unit )
1026  {
1030  mIntervalStackedWidget->setCurrentIndex( 0 );
1031  break;
1032 
1034  mIntervalStackedWidget->setCurrentIndex( 1 );
1035  break;
1036  }
1037 
1038  mMap->beginCommand( tr( "Change Grid Unit" ) );
1039  mMapGrid->setUnits( unit );
1040  mMap->updateBoundingRect();
1041  mMap->update();
1042  mMap->endCommand();
1043 }
1044 
1045 void QgsLayoutMapGridWidget::minIntervalChanged( double interval )
1046 {
1047  mMap->beginCommand( tr( "Change Grid Interval Range" ), QgsLayoutItem::UndoMapGridIntervalRange );
1048  mMapGrid->setMinimumIntervalWidth( interval );
1049  mMap->endCommand();
1050  mMap->updateBoundingRect();
1051  mMap->update();
1052 }
1053 
1054 void QgsLayoutMapGridWidget::maxIntervalChanged( double interval )
1055 {
1056  mMap->beginCommand( tr( "Change Grid Interval Range" ), QgsLayoutItem::UndoMapGridIntervalRange );
1057  mMapGrid->setMaximumIntervalWidth( interval );
1058  mMap->endCommand();
1059  mMap->updateBoundingRect();
1060  mMap->update();
1061 }
1062 
1063 void QgsLayoutMapGridWidget::annotationTextFormatChanged()
1064 {
1065  if ( !mMapGrid || !mMap )
1066  {
1067  return;
1068  }
1069 
1070  mMap->beginCommand( tr( "Change Annotation Font" ) );
1071  mMapGrid->setAnnotationTextFormat( mAnnotationFontButton->textFormat() );
1072  mMap->endCommand();
1073  mMap->updateBoundingRect();
1074  mMap->update();
1075 }
1076 
1077 void QgsLayoutMapGridWidget::onCrsChanged()
1078 {
1079  mBlockAnnotationFormatUpdates++;
1080  const QgsLayoutItemMapGrid::AnnotationFormat prevFormat = static_cast< QgsLayoutItemMapGrid::AnnotationFormat >( mAnnotationFormatComboBox->currentData().toInt() );
1081 
1082  mAnnotationFormatComboBox->clear();
1083  mAnnotationFormatComboBox->addItem( tr( "Decimal" ), QgsLayoutItemMapGrid::Decimal );
1084  mAnnotationFormatComboBox->addItem( tr( "Decimal with Suffix" ), QgsLayoutItemMapGrid::DecimalWithSuffix );
1085 
1086  // only show degree based options for geographic CRSes
1087  const QgsCoordinateReferenceSystem crs = mMapGrid->crs().isValid() ? mMapGrid->crs() : mMap->crs();
1088  switch ( crs.mapUnits() )
1089  {
1098  break;
1099 
1102  mAnnotationFormatComboBox->addItem( tr( "Degree, Minute" ), QgsLayoutItemMapGrid::DegreeMinuteNoSuffix );
1103  mAnnotationFormatComboBox->addItem( tr( "Degree, Minute with Suffix" ), QgsLayoutItemMapGrid::DegreeMinute );
1104  mAnnotationFormatComboBox->addItem( tr( "Degree, Minute Aligned" ), QgsLayoutItemMapGrid::DegreeMinutePadded );
1105  mAnnotationFormatComboBox->addItem( tr( "Degree, Minute, Second" ), QgsLayoutItemMapGrid::DegreeMinuteSecondNoSuffix );
1106  mAnnotationFormatComboBox->addItem( tr( "Degree, Minute, Second with Suffix" ), QgsLayoutItemMapGrid::DegreeMinuteSecond );
1107  mAnnotationFormatComboBox->addItem( tr( "Degree, Minute, Second Aligned" ), QgsLayoutItemMapGrid::DegreeMinuteSecondPadded );
1108  break;
1109  }
1110  mAnnotationFormatComboBox->addItem( tr( "Custom" ), QgsLayoutItemMapGrid::CustomFormat );
1111 
1112  const int prevIndex = mAnnotationFormatComboBox->findData( prevFormat );
1113  if ( prevIndex >= 0 )
1114  mAnnotationFormatComboBox->setCurrentIndex( prevIndex );
1115  else
1116  mAnnotationFormatComboBox->setCurrentIndex( 0 );
1117  mBlockAnnotationFormatUpdates--;
1118 
1119  const QgsLayoutItemMapGrid::AnnotationFormat newFormat = static_cast< QgsLayoutItemMapGrid::AnnotationFormat >( mAnnotationFormatComboBox->currentData().toInt() );
1120  if ( newFormat != prevFormat )
1121  {
1122  mAnnotationFormatComboBox_currentIndexChanged( mAnnotationFormatComboBox->currentIndex() );
1123  }
1124 }
1125 
1126 void QgsLayoutMapGridWidget::mGridBlendComboBox_currentIndexChanged( int index )
1127 {
1128  Q_UNUSED( index )
1129  if ( mMapGrid )
1130  {
1131  mMap->beginCommand( tr( "Change Grid Blend Mode" ) );
1132  mMapGrid->setBlendMode( mGridBlendComboBox->blendMode() );
1133  mMap->update();
1134  mMap->endCommand();
1135  }
1136 
1137 }
1138 
1139 void QgsLayoutMapGridWidget::mGridTypeComboBox_currentIndexChanged( int )
1140 {
1141  if ( !mMapGrid || !mMap )
1142  {
1143  return;
1144  }
1145 
1146  mMap->beginCommand( tr( "Change Grid Type" ) );
1147  switch ( static_cast< QgsLayoutItemMapGrid::GridStyle >( mGridTypeComboBox->currentData().toInt() ) )
1148  {
1150  mMapGrid->setStyle( QgsLayoutItemMapGrid::Cross );
1151  mCrossWidthSpinBox->setVisible( true );
1152  mCrossWidthDDBtn->setVisible( true );
1153  mCrossWidthLabel->setVisible( true );
1154  mGridLineStyleButton->setVisible( true );
1155  mLineStyleLabel->setVisible( true );
1156  mGridMarkerStyleButton->setVisible( false );
1157  mMarkerStyleLabel->setVisible( false );
1158  mGridBlendComboBox->setVisible( true );
1159  mGridBlendLabel->setVisible( true );
1160  break;
1161 
1163  mMapGrid->setStyle( QgsLayoutItemMapGrid::Markers );
1164  mCrossWidthSpinBox->setVisible( false );
1165  mCrossWidthDDBtn->setVisible( false );
1166  mCrossWidthLabel->setVisible( false );
1167  mGridLineStyleButton->setVisible( false );
1168  mLineStyleLabel->setVisible( false );
1169  mGridMarkerStyleButton->setVisible( true );
1170  mMarkerStyleLabel->setVisible( true );
1171  mGridBlendComboBox->setVisible( true );
1172  mGridBlendLabel->setVisible( true );
1173  break;
1174 
1176  mMapGrid->setStyle( QgsLayoutItemMapGrid::Solid );
1177  mCrossWidthSpinBox->setVisible( false );
1178  mCrossWidthDDBtn->setVisible( false );
1179  mCrossWidthLabel->setVisible( false );
1180  mGridLineStyleButton->setVisible( true );
1181  mLineStyleLabel->setVisible( true );
1182  mGridMarkerStyleButton->setVisible( false );
1183  mMarkerStyleLabel->setVisible( false );
1184  mGridBlendComboBox->setVisible( true );
1185  mGridBlendLabel->setVisible( true );
1186  break;
1187 
1189  mMapGrid->setStyle( QgsLayoutItemMapGrid::FrameAnnotationsOnly );
1190  mCrossWidthSpinBox->setVisible( false );
1191  mCrossWidthDDBtn->setVisible( false );
1192  mCrossWidthLabel->setVisible( false );
1193  mGridLineStyleButton->setVisible( false );
1194  mLineStyleLabel->setVisible( false );
1195  mGridMarkerStyleButton->setVisible( false );
1196  mMarkerStyleLabel->setVisible( false );
1197  mGridBlendComboBox->setVisible( false );
1198  mGridBlendLabel->setVisible( false );
1199  break;
1200  }
1201 
1202  mMap->updateBoundingRect();
1203  mMap->update();
1204  mMap->endCommand();
1205 }
1206 
1207 void QgsLayoutMapGridWidget::mapGridCrsChanged( const QgsCoordinateReferenceSystem &crs )
1208 {
1209  if ( !mMapGrid || !mMap )
1210  {
1211  return;
1212  }
1213 
1214  if ( mMapGrid->crs() == crs )
1215  return;
1216 
1217  mMap->beginCommand( tr( "Change Grid CRS" ) );
1218  mMapGrid->setCrs( crs );
1219  mMap->updateBoundingRect();
1220  mMap->update();
1221  mMap->endCommand();
1222 }
1223 
1224 void QgsLayoutMapGridWidget::mDrawAnnotationGroupBox_toggled( bool state )
1225 {
1226  if ( !mMapGrid || !mMap )
1227  {
1228  return;
1229  }
1230 
1231  mMap->beginCommand( tr( "Toggle Annotations" ) );
1232  mMapGrid->setAnnotationEnabled( state );
1233  mMap->updateBoundingRect();
1234  mMap->update();
1235  mMap->endCommand();
1236 }
1237 
1238 void QgsLayoutMapGridWidget::mAnnotationFormatButton_clicked()
1239 {
1240  if ( !mMapGrid || !mMap )
1241  {
1242  return;
1243  }
1244 
1245  QgsExpressionContext expressionContext = mMapGrid->createExpressionContext();
1246  expressionContext.setHighlightedFunctions( QStringList() << QStringLiteral( "to_dms" ) << QStringLiteral( "to_dm" ) );
1247 
1248  QgsExpressionBuilderDialog exprDlg( nullptr, mMapGrid->annotationExpression(), this, QStringLiteral( "generic" ), expressionContext );
1249  exprDlg.setWindowTitle( tr( "Expression Based Annotation" ) );
1250 
1251  if ( exprDlg.exec() == QDialog::Accepted )
1252  {
1253  QString expression = exprDlg.expressionText();
1254  mMap->beginCommand( tr( "Change Annotation Format" ) );
1255  mMapGrid->setAnnotationExpression( expression );
1256  mMap->updateBoundingRect();
1257  mMap->update();
1258  mMap->endCommand();
1259  }
1260 }
1261 
1262 void QgsLayoutMapGridWidget::mAnnotationDisplayLeftComboBox_currentIndexChanged( int )
1263 {
1264  handleChangedAnnotationDisplay( QgsLayoutItemMapGrid::Left, static_cast< QgsLayoutItemMapGrid::DisplayMode >( mAnnotationDisplayLeftComboBox->currentData().toInt() ) );
1265 }
1266 
1267 void QgsLayoutMapGridWidget::mAnnotationDisplayRightComboBox_currentIndexChanged( int )
1268 {
1269  handleChangedAnnotationDisplay( QgsLayoutItemMapGrid::Right, static_cast< QgsLayoutItemMapGrid::DisplayMode >( mAnnotationDisplayRightComboBox->currentData().toInt() ) );
1270 }
1271 
1272 void QgsLayoutMapGridWidget::mAnnotationDisplayTopComboBox_currentIndexChanged( int )
1273 {
1274  handleChangedAnnotationDisplay( QgsLayoutItemMapGrid::Top, static_cast< QgsLayoutItemMapGrid::DisplayMode >( mAnnotationDisplayTopComboBox->currentData().toInt() ) );
1275 }
1276 
1277 void QgsLayoutMapGridWidget::mAnnotationDisplayBottomComboBox_currentIndexChanged( int )
1278 {
1279  handleChangedAnnotationDisplay( QgsLayoutItemMapGrid::Bottom, static_cast< QgsLayoutItemMapGrid::DisplayMode >( mAnnotationDisplayBottomComboBox->currentData().toInt() ) );
1280 }
1281 
1282 void QgsLayoutMapGridWidget::mAnnotationPositionLeftComboBox_currentIndexChanged( int )
1283 {
1284  handleChangedAnnotationPosition( QgsLayoutItemMapGrid::Left, static_cast< QgsLayoutItemMapGrid::AnnotationPosition >( mAnnotationPositionLeftComboBox->currentData().toInt() ) );
1285 }
1286 
1287 void QgsLayoutMapGridWidget::mAnnotationPositionRightComboBox_currentIndexChanged( int )
1288 {
1289  handleChangedAnnotationPosition( QgsLayoutItemMapGrid::Right, static_cast< QgsLayoutItemMapGrid::AnnotationPosition >( mAnnotationPositionRightComboBox->currentData().toInt() ) );
1290 }
1291 
1292 void QgsLayoutMapGridWidget::mAnnotationPositionTopComboBox_currentIndexChanged( int )
1293 {
1294  handleChangedAnnotationPosition( QgsLayoutItemMapGrid::Top, static_cast< QgsLayoutItemMapGrid::AnnotationPosition >( mAnnotationPositionTopComboBox->currentData().toInt() ) );
1295 }
1296 
1297 void QgsLayoutMapGridWidget::mAnnotationPositionBottomComboBox_currentIndexChanged( int )
1298 {
1299  handleChangedAnnotationPosition( QgsLayoutItemMapGrid::Bottom, static_cast< QgsLayoutItemMapGrid::AnnotationPosition >( mAnnotationPositionBottomComboBox->currentData().toInt() ) );
1300 }
1301 
1302 void QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxLeft_currentIndexChanged( int index )
1303 {
1304  handleChangedAnnotationDirection( QgsLayoutItemMapGrid::Left, static_cast< QgsLayoutItemMapGrid::AnnotationDirection >( mAnnotationDirectionComboBoxLeft->itemData( index ).toInt() ) );
1305 }
1306 
1307 void QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxRight_currentIndexChanged( int index )
1308 {
1309  handleChangedAnnotationDirection( QgsLayoutItemMapGrid::Right, static_cast< QgsLayoutItemMapGrid::AnnotationDirection >( mAnnotationDirectionComboBoxRight->itemData( index ).toInt() ) );
1310 }
1311 
1312 void QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxTop_currentIndexChanged( int index )
1313 {
1314  handleChangedAnnotationDirection( QgsLayoutItemMapGrid::Top, static_cast< QgsLayoutItemMapGrid::AnnotationDirection >( mAnnotationDirectionComboBoxTop->itemData( index ).toInt() ) );
1315 }
1316 
1317 void QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxBottom_currentIndexChanged( int index )
1318 {
1319  handleChangedAnnotationDirection( QgsLayoutItemMapGrid::Bottom, static_cast< QgsLayoutItemMapGrid::AnnotationDirection >( mAnnotationDirectionComboBoxBottom->itemData( index ).toInt() ) );
1320 }
1321 
1322 void QgsLayoutMapGridWidget::mDistanceToMapFrameSpinBox_valueChanged( double d )
1323 {
1324  if ( !mMapGrid || !mMap )
1325  {
1326  return;
1327  }
1328 
1329  mMap->beginCommand( tr( "Change Annotation Distance" ), QgsLayoutItem::UndoMapAnnotationDistance );
1330  mMapGrid->setAnnotationFrameDistance( d );
1331  mMap->updateBoundingRect();
1332  mMap->update();
1333  mMap->endCommand();
1334 }
1335 
1336 void QgsLayoutMapGridWidget::lineSymbolChanged()
1337 {
1338  if ( !mMapGrid || !mMap )
1339  {
1340  return;
1341  }
1342 
1343  mMap->beginCommand( tr( "Change Grid Line Style" ), QgsLayoutItem::UndoMapGridLineSymbol );
1344  mMapGrid->setLineSymbol( mGridLineStyleButton->clonedSymbol<QgsLineSymbol>() );
1345  mMap->endCommand();
1346  mMap->update();
1347 }
1348 
1349 void QgsLayoutMapGridWidget::markerSymbolChanged()
1350 {
1351  if ( !mMapGrid || !mMap )
1352  {
1353  return;
1354  }
1355 
1356  mMap->beginCommand( tr( "Change Grid Marker Style" ), QgsLayoutItem::UndoMapGridMarkerSymbol );
1357  mMapGrid->setMarkerSymbol( mGridMarkerStyleButton->clonedSymbol<QgsMarkerSymbol>() );
1358  mMap->endCommand();
1359  mMap->update();
1360 }
1361 
1362 void QgsLayoutMapGridWidget::gridEnabledToggled( bool active )
1363 {
1364  if ( !mMapGrid || !mMap )
1365  {
1366  return;
1367  }
1368 
1369  mMap->beginCommand( tr( "Toggle Grid Display" ) );
1370  mMapGrid->setEnabled( active );
1371  mMap->endCommand();
1372  mMap->updateBoundingRect();
1373  mMap->update();
1374 }
1375 
1376 void QgsLayoutMapGridWidget::mAnnotationFormatComboBox_currentIndexChanged( int index )
1377 {
1378  if ( !mMapGrid || !mMap )
1379  {
1380  return;
1381  }
1382  if ( mBlockAnnotationFormatUpdates )
1383  return;
1384 
1385  mMap->beginCommand( tr( "Change Annotation Format" ) );
1386 
1387  mMapGrid->setAnnotationFormat( static_cast< QgsLayoutItemMapGrid::AnnotationFormat >( mAnnotationFormatComboBox->itemData( index ).toInt() ) );
1388  mAnnotationFormatButton->setEnabled( mMapGrid->annotationFormat() == QgsLayoutItemMapGrid::CustomFormat );
1389 
1390  mMap->updateBoundingRect();
1391  mMap->update();
1392  mMap->endCommand();
1393 }
1394 
1395 void QgsLayoutMapGridWidget::mCoordinatePrecisionSpinBox_valueChanged( int value )
1396 {
1397  if ( !mMapGrid || !mMap )
1398  {
1399  return;
1400  }
1401  mMap->beginCommand( tr( "Change Annotation Precision" ) );
1402  mMapGrid->setAnnotationPrecision( value );
1403  mMap->updateBoundingRect();
1404  mMap->update();
1405  mMap->endCommand();
1406 }
static QString defaultProjectScales()
A string with default project scales.
Definition: qgis.cpp:270
void colorChanged(const QColor &color)
Emitted whenever a new color is set for the button.
This class represents a coordinate reference system (CRS).
Q_GADGET QgsUnitTypes::DistanceUnit mapUnits
A generic dialog for building expression strings.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setHighlightedFunctions(const QStringList &names)
Sets the list of function names intended to be highlighted to the user.
@ ModeTextRenderer
Configure font settings for use with QgsTextRenderer.
Definition: qgsfontbutton.h:61
void setLayer(QgsVectorLayer *layer)
Sets a layer to associate with the widget.
void changed()
Emitted when the widget's text format settings are changed.
A base class for property widgets for layout items.
void updateDataDefinedButton(QgsPropertyOverrideButton *button)
Updates a previously registered data defined button to reflect the item's current properties.
QgsVectorLayer * coverageLayer() const
Returns the current layout context coverage layer (if set).
void registerDataDefinedButton(QgsPropertyOverrideButton *button, QgsLayoutObject::DataDefinedProperty property)
Registers a data defined button, setting up its initial value, connections and description.
An individual grid which is drawn above the map content in a QgsLayoutItemMap.
GridStyle
Grid drawing style.
@ Markers
Draw markers at intersections of grid lines.
@ Cross
Draw line crosses at intersections of grid lines.
@ FrameAnnotationsOnly
No grid lines over the map, only draw frame and annotations.
GridUnit
Unit for grid values.
@ CM
Grid units in centimeters.
@ MM
Grid units in millimeters.
@ DynamicPageSizeBased
Dynamically sized, based on a on-page size range.
@ MapUnit
Grid units follow map units.
@ FrameTop
Top side of map.
@ FrameBottom
Bottom side of map.
@ FrameLeft
Left side of map.
@ FrameRight
Right side of map.
AnnotationPosition
Position for grid annotations.
@ InsideMapFrame
Draw annotations inside the map frame.
@ OutsideMapFrame
Draw annotations outside the map frame.
DisplayMode
Display settings for grid annotations and frames.
@ LongitudeOnly
Show longitude/x annotations/divisions only.
@ ShowAll
Show both latitude and longitude annotations/divisions.
@ LatitudeOnly
Show latitude/y annotations/divisions only.
void crsChanged()
Emitted whenever the grid's CRS is changed.
TickLengthMode
Tick length mode (useful for rotated grids)
@ OrthogonalTicks
Align ticks orthogonaly.
@ NormalizedTicks
Constant tick lengths.
AnnotationFormat
Format for displaying grid annotations.
@ DegreeMinuteSecondNoSuffix
Degree/minutes/seconds, use - for S/W coordinates.
@ DegreeMinuteSecondPadded
Degree/minutes/seconds, with minutes using leading zeros where required.
@ DegreeMinuteSecond
Degree/minutes/seconds, use NSEW suffix.
@ DecimalWithSuffix
Decimal degrees, use NSEW suffix.
@ DegreeMinute
Degree/minutes, use NSEW suffix.
@ DegreeMinuteNoSuffix
Degree/minutes, use - for S/W coordinates.
@ Decimal
Decimal degrees, use - for S/W coordinates.
@ DegreeMinutePadded
Degree/minutes, with minutes using leading zeros where required.
@ CustomFormat
Custom expression-based format.
AnnotationDirection
Direction of grid annotations.
@ OnTick
Draw annotations parallel to tick (on the line)
@ Horizontal
Draw annotations horizontally.
@ Vertical
Draw annotations vertically, ascending.
@ BoundaryDirection
Annotations follow the boundary direction.
@ AboveTick
Draw annotations parallel to tick (above the line)
@ UnderTick
Draw annotations parallel to tick (under the line)
@ VerticalDescending
Draw annotations vertically, descending.
FrameStyle
Style for grid frame.
@ Zebra
Black/white pattern.
@ InteriorTicks
Tick markers drawn inside map frame.
@ LineBorder
Simple solid line frame.
@ InteriorExteriorTicks
Tick markers drawn both inside and outside the map frame.
@ LineBorderNautical
Simple solid line frame, with nautical style diagonals on corners.
@ ExteriorTicks
Tick markers drawn outside map frame.
@ NoFrame
Disable grid frame.
@ ZebraNautical
Black/white pattern, with nautical style diagonals on corners.
BorderSide
Border sides for annotations.
Layout graphical items for displaying a map.
@ UndoGridFramePenColor
Map grid frame pen color.
@ UndoMapGridIntervalRange
Grid interval range.
@ UndoMapGridLineSymbol
Grid line symbol.
@ UndoMapGridMarkerSymbol
Grid marker symbol.
@ UndoMapGridFrameFill1Color
Map grid frame fill color 1.
@ UndoMapAnnotationDistance
Map frame annotation distance.
@ UndoMapGridFrameFill2Color
Map grid frame fill color 2.
void populateDataDefinedButtons()
Initializes data defined buttons to current atlas coverage layer.
virtual void updateGuiElements()
Sets the current composer map values to the GUI elements.
QgsLayoutMapGridWidget(QgsLayoutItemMapGrid *mapGrid, QgsLayoutItemMap *map)
constructor
@ MapGridIntervalX
Map grid interval X.
@ MapGridAnnotationDisplayBottom
Map annotation display bottom.
@ MapGridIntervalY
Map grid interval Y.
@ MapGridFrameSize
Map grid frame size.
@ MapGridFrameDivisionsBottom
Map frame division display bottom.
@ MapGridAnnotationDisplayRight
Map annotation display right.
@ MapGridFrameMargin
Map grid frame margin.
@ MapGridOffsetX
Map grid offset X.
@ MapGridLabelDistance
Map grid label distance.
@ MapGridAnnotationDisplayLeft
Map annotation display left.
@ MapGridFrameDivisionsLeft
Map frame division display left.
@ MapGridEnabled
Map grid enabled.
@ MapGridFrameLineThickness
Map grid frame line thickness.
@ MapGridFrameDivisionsRight
Map frame division display right.
@ MapGridFrameDivisionsTop
Map frame division display top.
@ MapGridCrossSize
Map grid cross size.
@ MapGridOffsetY
Map grid offset Y.
@ MapGridAnnotationDisplayTop
Map annotation display top.
void layerChanged(QgsVectorLayer *layer)
Emitted when the context's layer is changed.
A line symbol type, for rendering LineString and MultiLineString geometries.
Definition: qgssymbol.h:1204
A marker symbol type, for rendering Point and MultiPoint geometries.
Definition: qgssymbol.h:1004
void setPanelTitle(const QString &panelTitle)
Set the title of the panel when shown in the interface.
QVector< double > mapScales() const
Returns the list of custom project map scales.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Definition: qgsproject.cpp:501
const QgsProjectViewSettings * viewSettings() const
Returns the project's view settings, which contains settings and properties relating to how a QgsProj...
void crsChanged(const QgsCoordinateReferenceSystem &)
Emitted when the selected CRS is changed.
@ CrsNotSet
Not set (hidden by default)
This class is a composition of two QSettings instances:
Definition: qgssettings.h:62
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setLayer(QgsVectorLayer *layer)
Sets a layer to associate with the widget.
void changed()
Emitted when the symbol's settings are changed.
@ Line
Line symbol.
Definition: qgssymbol.h:89
@ Marker
Marker symbol.
Definition: qgssymbol.h:88
@ DistanceMeters
Meters.
Definition: qgsunittypes.h:69
@ DistanceDegrees
Degrees, for planar geographic CRS distance measurements.
Definition: qgsunittypes.h:75
@ DistanceKilometers
Kilometers.
Definition: qgsunittypes.h:70
@ DistanceMiles
Terrestrial miles.
Definition: qgsunittypes.h:74
@ DistanceUnknownUnit
Unknown distance unit.
Definition: qgsunittypes.h:78
@ DistanceMillimeters
Millimeters.
Definition: qgsunittypes.h:77
@ DistanceYards
Imperial yards.
Definition: qgsunittypes.h:73
@ DistanceFeet
Imperial feet.
Definition: qgsunittypes.h:71
@ DistanceNauticalMiles
Nautical miles.
Definition: qgsunittypes.h:72
@ DistanceCentimeters
Centimeters.
Definition: qgsunittypes.h:76
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
Definition: qgis.h:263
const QgsCoordinateReferenceSystem & crs