QGIS API Documentation 3.99.0-Master (7d2ca374f2d)
Loading...
Searching...
No Matches
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
19
21#include "qgslayout.h"
22#include "qgslayoutitemmap.h"
24#include "qgslinesymbol.h"
25#include "qgsmarkersymbol.h"
26#include "qgsproject.h"
29#include "qgssymbol.h"
30#include "qgstextrenderer.h"
31#include "qgsvectorlayer.h"
32
33#include <QString>
34
35#include "moc_qgslayoutmapgridwidget.cpp"
36
37using namespace Qt::StringLiterals;
38
40 : QgsLayoutItemBaseWidget( nullptr, mapGrid )
41 , mMap( map )
42 , mMapGrid( mapGrid )
43{
44 setupUi( this );
45
46 mFrameStyleComboBox->addItem( tr( "No Frame" ), QVariant::fromValue( Qgis::MapGridFrameStyle::NoFrame ) );
47 mFrameStyleComboBox->addItem( tr( "Zebra" ), QVariant::fromValue( Qgis::MapGridFrameStyle::Zebra ) );
48 mFrameStyleComboBox->addItem( tr( "Zebra (Nautical)" ), QVariant::fromValue( Qgis::MapGridFrameStyle::ZebraNautical ) );
49 mFrameStyleComboBox->addItem( tr( "Interior Ticks" ), QVariant::fromValue( Qgis::MapGridFrameStyle::InteriorTicks ) );
50 mFrameStyleComboBox->addItem( tr( "Exterior Ticks" ), QVariant::fromValue( Qgis::MapGridFrameStyle::ExteriorTicks ) );
51 mFrameStyleComboBox->addItem( tr( "Interior and Exterior Ticks" ), QVariant::fromValue( Qgis::MapGridFrameStyle::InteriorExteriorTicks ) );
52 mFrameStyleComboBox->addItem( tr( "Line Border" ), QVariant::fromValue( Qgis::MapGridFrameStyle::LineBorder ) );
53 mFrameStyleComboBox->addItem( tr( "Line Border (Nautical)" ), QVariant::fromValue( Qgis::MapGridFrameStyle::LineBorderNautical ) );
54
55 mRotatedTicksLengthModeComboBox->addItem( tr( "Orthogonal" ), QVariant::fromValue( Qgis::MapGridTickLengthMode::OrthogonalTicks ) );
56 mRotatedTicksLengthModeComboBox->addItem( tr( "Fixed Length" ), QVariant::fromValue( Qgis::MapGridTickLengthMode::NormalizedTicks ) );
57 mRotatedAnnotationsLengthModeComboBox->addItem( tr( "Orthogonal" ), QVariant::fromValue( Qgis::MapGridTickLengthMode::OrthogonalTicks ) );
58 mRotatedAnnotationsLengthModeComboBox->addItem( tr( "Fixed Length" ), QVariant::fromValue( Qgis::MapGridTickLengthMode::NormalizedTicks ) );
59
60 mHAlignmentComboBox->setAvailableAlignments( Qt::AlignmentFlag::AlignLeft | Qt::AlignmentFlag::AlignHCenter | Qt::AlignmentFlag::AlignRight | Qt::AlignmentFlag::AlignJustify );
61
62 mGridFrameMarginSpinBox->setShowClearButton( true );
63 mGridFrameMarginSpinBox->setClearValue( 0 );
64
65 mDistanceToMapFrameSpinBox->setShowClearButton( true );
66 mDistanceToMapFrameSpinBox->setClearValue( 0 );
67
68 mOffsetXSpinBox->setShowClearButton( true );
69 mOffsetXSpinBox->setClearValue( 0 );
70 mOffsetYSpinBox->setShowClearButton( true );
71 mOffsetYSpinBox->setClearValue( 0 );
72
73 connect( mIntervalXSpinBox, &QgsDoubleSpinBox::editingFinished, this, &QgsLayoutMapGridWidget::mIntervalXSpinBox_editingFinished );
74 connect( mIntervalYSpinBox, &QgsDoubleSpinBox::editingFinished, this, &QgsLayoutMapGridWidget::mIntervalYSpinBox_editingFinished );
75 connect( mOffsetXSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mOffsetXSpinBox_valueChanged );
76 connect( mOffsetYSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mOffsetYSpinBox_valueChanged );
77 connect( mCrossWidthSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mCrossWidthSpinBox_valueChanged );
78 connect( mFrameWidthSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mFrameWidthSpinBox_valueChanged );
79 connect( mGridFrameMarginSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mGridFrameMarginSpinBox_valueChanged );
80 connect( mFrameStyleComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mFrameStyleComboBox_currentIndexChanged );
81 connect( mRotatedTicksGroupBox, &QGroupBox::toggled, this, &QgsLayoutMapGridWidget::mRotatedTicksGroupBox_toggled );
82 connect( mRotatedTicksLengthModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mRotatedTicksLengthModeComboBox_currentIndexChanged );
83 connect( mRotatedTicksThresholdSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mRotatedTicksThresholdSpinBox_valueChanged );
84 connect( mRotatedTicksMarginToCornerSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mRotatedTicksMarginToCornerSpinBox_valueChanged );
85 connect( mRotatedAnnotationsGroupBox, &QGroupBox::toggled, this, &QgsLayoutMapGridWidget::mRotatedAnnotationsGroupBox_toggled );
86 connect( mRotatedAnnotationsLengthModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mRotatedAnnotationsLengthModeComboBox_currentIndexChanged );
87 connect( mRotatedAnnotationsThresholdSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mRotatedAnnotationsThresholdSpinBox_valueChanged );
88 connect( mRotatedAnnotationsMarginToCornerSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mRotatedAnnotationsMarginToCornerSpinBox_valueChanged );
89 connect( mGridFramePenSizeSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mGridFramePenSizeSpinBox_valueChanged );
90 connect( mGridFramePenColorButton, &QgsColorButton::colorChanged, this, &QgsLayoutMapGridWidget::mGridFramePenColorButton_colorChanged );
91 connect( mGridFrameFill1ColorButton, &QgsColorButton::colorChanged, this, &QgsLayoutMapGridWidget::mGridFrameFill1ColorButton_colorChanged );
92 connect( mGridFrameFill2ColorButton, &QgsColorButton::colorChanged, this, &QgsLayoutMapGridWidget::mGridFrameFill2ColorButton_colorChanged );
93 connect( mGridTypeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mGridTypeComboBox_currentIndexChanged );
94 connect( mMapGridUnitComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::intervalUnitChanged );
95 connect( mGridBlendComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mGridBlendComboBox_currentIndexChanged );
96 connect( mCheckGridLeftSide, &QCheckBox::toggled, this, &QgsLayoutMapGridWidget::mCheckGridLeftSide_toggled );
97 connect( mCheckGridRightSide, &QCheckBox::toggled, this, &QgsLayoutMapGridWidget::mCheckGridRightSide_toggled );
98 connect( mCheckGridTopSide, &QCheckBox::toggled, this, &QgsLayoutMapGridWidget::mCheckGridTopSide_toggled );
99 connect( mCheckGridBottomSide, &QCheckBox::toggled, this, &QgsLayoutMapGridWidget::mCheckGridBottomSide_toggled );
100 connect( mFrameDivisionsLeftComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mFrameDivisionsLeftComboBox_currentIndexChanged );
101 connect( mFrameDivisionsRightComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mFrameDivisionsRightComboBox_currentIndexChanged );
102 connect( mFrameDivisionsTopComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mFrameDivisionsTopComboBox_currentIndexChanged );
103 connect( mFrameDivisionsBottomComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mFrameDivisionsBottomComboBox_currentIndexChanged );
104 connect( mDrawAnnotationGroupBox, &QgsCollapsibleGroupBoxBasic::toggled, this, &QgsLayoutMapGridWidget::mDrawAnnotationGroupBox_toggled );
105 connect( mAnnotationFormatButton, &QToolButton::clicked, this, &QgsLayoutMapGridWidget::mAnnotationFormatButton_clicked );
106 connect( mAnnotationDisplayLeftComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDisplayLeftComboBox_currentIndexChanged );
107 connect( mAnnotationDisplayRightComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDisplayRightComboBox_currentIndexChanged );
108 connect( mAnnotationDisplayTopComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDisplayTopComboBox_currentIndexChanged );
109 connect( mAnnotationDisplayBottomComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDisplayBottomComboBox_currentIndexChanged );
110 connect( mAnnotationPositionLeftComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationPositionLeftComboBox_currentIndexChanged );
111 connect( mAnnotationPositionRightComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationPositionRightComboBox_currentIndexChanged );
112 connect( mAnnotationPositionTopComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationPositionTopComboBox_currentIndexChanged );
113 connect( mAnnotationPositionBottomComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationPositionBottomComboBox_currentIndexChanged );
114 connect( mAnnotationDirectionComboBoxLeft, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxLeft_currentIndexChanged );
115 connect( mAnnotationDirectionComboBoxRight, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxRight_currentIndexChanged );
116 connect( mAnnotationDirectionComboBoxTop, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxTop_currentIndexChanged );
117 connect( mAnnotationDirectionComboBoxBottom, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxBottom_currentIndexChanged );
118 connect( mAnnotationFormatComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutMapGridWidget::mAnnotationFormatComboBox_currentIndexChanged );
119 connect( mCoordinatePrecisionSpinBox, static_cast<void ( QSpinBox::* )( int )>( &QSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mCoordinatePrecisionSpinBox_valueChanged );
120 connect( mDistanceToMapFrameSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::mDistanceToMapFrameSpinBox_valueChanged );
121 connect( mMinWidthSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::minIntervalChanged );
122 connect( mMaxWidthSpinBox, static_cast<void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutMapGridWidget::maxIntervalChanged );
123
124 connect( mHAlignmentComboBox, &QgsAlignmentComboBox::changed, this, [this] {
125 mMap->beginCommand( tr( "Change Grid Text Alignment" ) );
126 mMapGrid->setHorizontalAlignment( mHAlignmentComboBox->horizontalAlignment() );
127 mMap->endCommand();
128 mMap->updateBoundingRect();
129 mMap->update();
130 } );
131
132 connect( mEnabledCheckBox, &QCheckBox::toggled, this, &QgsLayoutMapGridWidget::gridEnabledToggled );
133 setPanelTitle( tr( "Map Grid Properties" ) );
134
135 mMapGridCrsSelector->setOptionVisible( QgsProjectionSelectionWidget::CrsNotSet, true );
136 mMapGridCrsSelector->setNotSetText( tr( "Use Map CRS" ) );
137 mMapGridCrsSelector->setDialogTitle( tr( "Grid CRS" ) );
138
139 connect( mMapGridCrsSelector, &QgsProjectionSelectionWidget::crsChanged, this, &QgsLayoutMapGridWidget::mapGridCrsChanged );
140
141 blockAllSignals( true );
142
143 mMapGridUnitComboBox->addItem( tr( "Map Units" ), QVariant::fromValue( Qgis::MapGridUnit::MapUnits ) );
144 mMapGridUnitComboBox->addItem( tr( "Fit Segment Width" ), QVariant::fromValue( Qgis::MapGridUnit::DynamicPageSizeBased ) );
145 mMapGridUnitComboBox->addItem( tr( "Millimeters" ), QVariant::fromValue( Qgis::MapGridUnit::Millimeters ) );
146 mMapGridUnitComboBox->addItem( tr( "Centimeters" ), QVariant::fromValue( Qgis::MapGridUnit::Centimeters ) );
147
148 mGridTypeComboBox->insertItem( 0, tr( "Solid" ), QVariant::fromValue( Qgis::MapGridStyle::Lines ) );
149 mGridTypeComboBox->insertItem( 1, tr( "Cross" ), QVariant::fromValue( Qgis::MapGridStyle::LineCrosses ) );
150 mGridTypeComboBox->insertItem( 2, tr( "Markers" ), QVariant::fromValue( Qgis::MapGridStyle::Markers ) );
151 mGridTypeComboBox->insertItem( 3, tr( "Frame and annotations only" ), QVariant::fromValue( Qgis::MapGridStyle::FrameAndAnnotationsOnly ) );
152
153 insertFrameDisplayEntries( mFrameDivisionsLeftComboBox );
154 insertFrameDisplayEntries( mFrameDivisionsRightComboBox );
155 insertFrameDisplayEntries( mFrameDivisionsTopComboBox );
156 insertFrameDisplayEntries( mFrameDivisionsBottomComboBox );
157
158 insertAnnotationDisplayEntries( mAnnotationDisplayLeftComboBox );
159 insertAnnotationDisplayEntries( mAnnotationDisplayRightComboBox );
160 insertAnnotationDisplayEntries( mAnnotationDisplayTopComboBox );
161 insertAnnotationDisplayEntries( mAnnotationDisplayBottomComboBox );
162
163 insertAnnotationPositionEntries( mAnnotationPositionLeftComboBox );
164 insertAnnotationPositionEntries( mAnnotationPositionRightComboBox );
165 insertAnnotationPositionEntries( mAnnotationPositionTopComboBox );
166 insertAnnotationPositionEntries( mAnnotationPositionBottomComboBox );
167
168 insertAnnotationDirectionEntries( mAnnotationDirectionComboBoxLeft );
169 insertAnnotationDirectionEntries( mAnnotationDirectionComboBoxRight );
170 insertAnnotationDirectionEntries( mAnnotationDirectionComboBoxTop );
171 insertAnnotationDirectionEntries( mAnnotationDirectionComboBoxBottom );
172
173 mGridFramePenColorButton->setColorDialogTitle( tr( "Select Grid Frame Color" ) );
174 mGridFramePenColorButton->setAllowOpacity( true );
175 mGridFramePenColorButton->setContext( u"composer"_s );
176 mGridFramePenColorButton->setNoColorString( tr( "Transparent Frame" ) );
177 mGridFramePenColorButton->setShowNoColor( true );
178
179 mGridFrameFill1ColorButton->setColorDialogTitle( tr( "Select Grid Frame Fill Color" ) );
180 mGridFrameFill1ColorButton->setAllowOpacity( true );
181 mGridFrameFill1ColorButton->setContext( u"composer"_s );
182 mGridFrameFill1ColorButton->setNoColorString( tr( "Transparent Fill" ) );
183 mGridFrameFill1ColorButton->setShowNoColor( true );
184
185 mGridFrameFill2ColorButton->setColorDialogTitle( tr( "Select Grid Frame Fill Color" ) );
186 mGridFrameFill2ColorButton->setAllowOpacity( true );
187 mGridFrameFill2ColorButton->setContext( u"composer"_s );
188 mGridFrameFill2ColorButton->setNoColorString( tr( "Transparent Fill" ) );
189 mGridFrameFill2ColorButton->setShowNoColor( true );
190
191 mGridLineStyleButton->setSymbolType( Qgis::SymbolType::Line );
192 mGridMarkerStyleButton->setSymbolType( Qgis::SymbolType::Marker );
193
194 //set initial state of frame style controls
195 toggleFrameControls( false, false, false, false );
196
216
217 // call to initially populate mAnnotationFormatComboBox
218 onCrsChanged();
219
221
222 blockAllSignals( false );
223 connect( mAnnotationFontButton, &QgsFontButton::changed, this, &QgsLayoutMapGridWidget::annotationTextFormatChanged );
224 connect( mGridLineStyleButton, &QgsSymbolButton::changed, this, &QgsLayoutMapGridWidget::lineSymbolChanged );
225 connect( mGridMarkerStyleButton, &QgsSymbolButton::changed, this, &QgsLayoutMapGridWidget::markerSymbolChanged );
226
227 mGridLineStyleButton->registerExpressionContextGenerator( mMapGrid );
228 mGridLineStyleButton->setLayer( coverageLayer() );
229 mGridMarkerStyleButton->registerExpressionContextGenerator( mMapGrid );
230 mGridMarkerStyleButton->setLayer( coverageLayer() );
231 if ( mMap->layout() )
232 {
233 connect( &mMap->layout()->reportContext(), &QgsLayoutReportContext::layerChanged, mGridLineStyleButton, &QgsSymbolButton::setLayer );
234 connect( &mMap->layout()->reportContext(), &QgsLayoutReportContext::layerChanged, mGridMarkerStyleButton, &QgsSymbolButton::setLayer );
235 connect( &mMap->layout()->reportContext(), &QgsLayoutReportContext::layerChanged, mAnnotationFontButton, &QgsFontButton::setLayer );
236 }
237 mAnnotationFontButton->setLayer( coverageLayer() );
238 mAnnotationFontButton->registerExpressionContextGenerator( mMapGrid );
239
240 connect( mMapGrid, &QgsLayoutItemMapGrid::crsChanged, this, &QgsLayoutMapGridWidget::onCrsChanged );
241}
242
244{
245 updateDataDefinedButton( mEnabledDDBtn );
246 updateDataDefinedButton( mIntervalXDDBtn );
247 updateDataDefinedButton( mIntervalYDDBtn );
248 updateDataDefinedButton( mOffsetXDDBtn );
249 updateDataDefinedButton( mOffsetYDDBtn );
250 updateDataDefinedButton( mFrameSizeDDBtn );
251 updateDataDefinedButton( mFrameMarginDDBtn );
252 updateDataDefinedButton( mLabelDistDDBtn );
253 updateDataDefinedButton( mCrossWidthDDBtn );
254 updateDataDefinedButton( mFrameLineThicknessDDBtn );
255 updateDataDefinedButton( mAnnotationDisplayLeftDDBtn );
256 updateDataDefinedButton( mAnnotationDisplayRightDDBtn );
257 updateDataDefinedButton( mAnnotationDisplayTopDDBtn );
258 updateDataDefinedButton( mAnnotationDisplayBottomDDBtn );
259 updateDataDefinedButton( mFrameDivisionsLeftDDBtn );
260 updateDataDefinedButton( mFrameDivisionsRightDDBtn );
261 updateDataDefinedButton( mFrameDivisionsTopDDBtn );
262 updateDataDefinedButton( mFrameDivisionsBottomDDBtn );
263}
264
265void QgsLayoutMapGridWidget::setGuiElementValues()
266{
268}
269
271{
272 if ( !mMapGrid || !mMap )
273 {
274 return;
275 }
276
277 blockAllSignals( true );
279 setGridItems();
280 blockAllSignals( false );
281}
282
283void QgsLayoutMapGridWidget::blockAllSignals( bool block )
284{
285 //grid
286 mEnabledCheckBox->blockSignals( block );
287 mGridTypeComboBox->blockSignals( block );
288 mIntervalXSpinBox->blockSignals( block );
289 mIntervalYSpinBox->blockSignals( block );
290 mOffsetXSpinBox->blockSignals( block );
291 mOffsetYSpinBox->blockSignals( block );
292 mCrossWidthSpinBox->blockSignals( block );
293 mFrameStyleComboBox->blockSignals( block );
294 mFrameWidthSpinBox->blockSignals( block );
295 mGridFrameMarginSpinBox->blockSignals( block );
296 mGridLineStyleButton->blockSignals( block );
297 mMapGridUnitComboBox->blockSignals( block );
298 mGridFramePenSizeSpinBox->blockSignals( block );
299 mGridFramePenColorButton->blockSignals( block );
300 mGridFrameFill1ColorButton->blockSignals( block );
301 mGridFrameFill2ColorButton->blockSignals( block );
302 mGridBlendComboBox->blockSignals( block );
303 mCheckGridLeftSide->blockSignals( block );
304 mCheckGridRightSide->blockSignals( block );
305 mCheckGridTopSide->blockSignals( block );
306 mCheckGridBottomSide->blockSignals( block );
307 mFrameDivisionsLeftComboBox->blockSignals( block );
308 mFrameDivisionsRightComboBox->blockSignals( block );
309 mFrameDivisionsTopComboBox->blockSignals( block );
310 mFrameDivisionsBottomComboBox->blockSignals( block );
311 mGridMarkerStyleButton->blockSignals( block );
312
313 //grid annotation
314 mDrawAnnotationGroupBox->blockSignals( block );
315 mAnnotationFormatComboBox->blockSignals( block );
316 mAnnotationDisplayLeftComboBox->blockSignals( block );
317 mAnnotationPositionLeftComboBox->blockSignals( block );
318 mAnnotationDirectionComboBoxLeft->blockSignals( block );
319 mAnnotationDisplayRightComboBox->blockSignals( block );
320 mAnnotationPositionRightComboBox->blockSignals( block );
321 mAnnotationDirectionComboBoxRight->blockSignals( block );
322 mAnnotationDisplayTopComboBox->blockSignals( block );
323 mAnnotationPositionTopComboBox->blockSignals( block );
324 mAnnotationDirectionComboBoxTop->blockSignals( block );
325 mAnnotationDisplayBottomComboBox->blockSignals( block );
326 mAnnotationPositionBottomComboBox->blockSignals( block );
327 mAnnotationDirectionComboBoxBottom->blockSignals( block );
328 mDistanceToMapFrameSpinBox->blockSignals( block );
329 mCoordinatePrecisionSpinBox->blockSignals( block );
330 mAnnotationFontButton->blockSignals( block );
331 mMinWidthSpinBox->blockSignals( block );
332 mMaxWidthSpinBox->blockSignals( block );
333 mHAlignmentComboBox->blockSignals( block );
334}
335
336void QgsLayoutMapGridWidget::handleChangedFrameDisplay( Qgis::MapGridBorderSide border, const Qgis::MapGridComponentVisibility mode )
337{
338 if ( !mMapGrid || !mMap )
339 {
340 return;
341 }
342
343 mMap->beginCommand( tr( "Change Frame Divisions" ) );
344 mMapGrid->setFrameDivisions( mode, border );
345 mMap->endCommand();
346 mMap->updateBoundingRect();
347}
348
349void QgsLayoutMapGridWidget::handleChangedAnnotationDisplay( Qgis::MapGridBorderSide border, const Qgis::MapGridComponentVisibility mode )
350{
351 if ( !mMapGrid || !mMap )
352 {
353 return;
354 }
355
356 mMap->beginCommand( tr( "Change Annotation Format" ) );
357 mMapGrid->setAnnotationDisplay( mode, border );
358 mMap->updateBoundingRect();
359 mMap->update();
360 mMap->endCommand();
361}
362
363void QgsLayoutMapGridWidget::toggleFrameControls( bool frameEnabled, bool frameFillEnabled, bool frameSizeEnabled, bool rotationEnabled )
364{
365 //set status of frame controls
366 mFrameWidthSpinBox->setEnabled( frameSizeEnabled );
367 mGridFrameMarginSpinBox->setEnabled( frameEnabled );
368 mGridFramePenSizeSpinBox->setEnabled( frameEnabled );
369 mGridFramePenColorButton->setEnabled( frameEnabled );
370 mGridFrameFill1ColorButton->setEnabled( frameFillEnabled );
371 mGridFrameFill2ColorButton->setEnabled( frameFillEnabled );
372 mFrameWidthLabel->setEnabled( frameSizeEnabled );
373 mFrameMarginLabel->setEnabled( frameEnabled );
374 mFramePenLabel->setEnabled( frameEnabled );
375 mFrameFillLabel->setEnabled( frameFillEnabled );
376 mCheckGridLeftSide->setEnabled( frameEnabled );
377 mCheckGridRightSide->setEnabled( frameEnabled );
378 mCheckGridTopSide->setEnabled( frameEnabled );
379 mCheckGridBottomSide->setEnabled( frameEnabled );
380 mFrameDivisionsLeftComboBox->setEnabled( frameEnabled );
381 mFrameDivisionsRightComboBox->setEnabled( frameEnabled );
382 mFrameDivisionsTopComboBox->setEnabled( frameEnabled );
383 mFrameDivisionsBottomComboBox->setEnabled( frameEnabled );
384 mLeftDivisionsLabel->setEnabled( frameEnabled );
385 mRightDivisionsLabel->setEnabled( frameEnabled );
386 mTopDivisionsLabel->setEnabled( frameEnabled );
387 mBottomDivisionsLabel->setEnabled( frameEnabled );
388 mRotatedTicksGroupBox->setEnabled( rotationEnabled );
389}
390
391void QgsLayoutMapGridWidget::insertAnnotationPositionEntries( QComboBox *c )
392{
393 c->insertItem( 0, tr( "Inside Frame" ), QVariant::fromValue( Qgis::MapGridAnnotationPosition::InsideMapFrame ) );
394 c->insertItem( 1, tr( "Outside Frame" ), QVariant::fromValue( Qgis::MapGridAnnotationPosition::OutsideMapFrame ) );
395}
396
397void QgsLayoutMapGridWidget::insertAnnotationDirectionEntries( QComboBox *c )
398{
399 c->addItem( tr( "Horizontal" ), QVariant::fromValue( Qgis::MapGridAnnotationDirection::Horizontal ) );
400 c->addItem( tr( "Vertical Ascending" ), QVariant::fromValue( Qgis::MapGridAnnotationDirection::Vertical ) );
401 c->addItem( tr( "Vertical Descending" ), QVariant::fromValue( Qgis::MapGridAnnotationDirection::VerticalDescending ) );
402 c->addItem( tr( "Boundary Direction" ), QVariant::fromValue( Qgis::MapGridAnnotationDirection::BoundaryDirection ) );
403 // c->addItem( tr( "Parallel to Tick" ), QVariant::fromValue( Qgis::MapGridAnnotationDirection::ParallelToTick ) );
404 c->addItem( tr( "Above Tick" ), QVariant::fromValue( Qgis::MapGridAnnotationDirection::AboveTick ) );
405 c->addItem( tr( "On Tick" ), QVariant::fromValue( Qgis::MapGridAnnotationDirection::OnTick ) );
406 c->addItem( tr( "Under Tick" ), QVariant::fromValue( Qgis::MapGridAnnotationDirection::UnderTick ) );
407}
408
409void QgsLayoutMapGridWidget::initFrameDisplayBox( QComboBox *c, Qgis::MapGridComponentVisibility display )
410{
411 if ( !c )
412 {
413 return;
414 }
415 c->setCurrentIndex( c->findData( QVariant::fromValue( display ) ) );
416}
417
418void QgsLayoutMapGridWidget::handleChangedAnnotationPosition( Qgis::MapGridBorderSide border, const Qgis::MapGridAnnotationPosition position )
419{
420 if ( !mMapGrid || !mMap )
421 {
422 return;
423 }
424
425 mMap->beginCommand( tr( "Change Annotation Position" ) );
426 mMapGrid->setAnnotationPosition( position, border );
427
428 mMap->updateBoundingRect();
429 mMap->update();
430 mMap->endCommand();
431}
432
433void QgsLayoutMapGridWidget::handleChangedAnnotationDirection( Qgis::MapGridBorderSide border, Qgis::MapGridAnnotationDirection direction )
434{
435 if ( !mMapGrid || !mMap )
436 {
437 return;
438 }
439
440 mMap->beginCommand( tr( "Change Annotation Direction" ) );
441 mMapGrid->setAnnotationDirection( direction, border );
442 mMap->updateBoundingRect();
443 mMap->update();
444 mMap->endCommand();
445}
446
447void QgsLayoutMapGridWidget::insertFrameDisplayEntries( QComboBox *c )
448{
449 c->addItem( tr( "All" ), QVariant::fromValue( Qgis::MapGridComponentVisibility::ShowAll ) );
450 c->addItem( tr( "Latitude/Y Only" ), QVariant::fromValue( Qgis::MapGridComponentVisibility::LatitudeOnly ) );
451 c->addItem( tr( "Longitude/X Only" ), QVariant::fromValue( Qgis::MapGridComponentVisibility::LongitudeOnly ) );
452}
453
454void QgsLayoutMapGridWidget::insertAnnotationDisplayEntries( QComboBox *c )
455{
456 c->insertItem( 0, tr( "Show All" ), QVariant::fromValue( Qgis::MapGridComponentVisibility::ShowAll ) );
457 c->insertItem( 1, tr( "Show Latitude/Y Only" ), QVariant::fromValue( Qgis::MapGridComponentVisibility::LatitudeOnly ) );
458 c->insertItem( 2, tr( "Show Longitude/X Only" ), QVariant::fromValue( Qgis::MapGridComponentVisibility::LongitudeOnly ) );
459 c->insertItem( 3, tr( "Disabled" ), QVariant::fromValue( Qgis::MapGridComponentVisibility::HideAll ) );
460}
461
462void QgsLayoutMapGridWidget::initAnnotationPositionBox( QComboBox *c, Qgis::MapGridAnnotationPosition pos )
463{
464 if ( !c )
465 {
466 return;
467 }
468
469 c->setCurrentIndex( c->findData( QVariant::fromValue( pos ) ) );
470}
471
472void QgsLayoutMapGridWidget::initAnnotationDirectionBox( QComboBox *c, Qgis::MapGridAnnotationDirection dir )
473{
474 if ( !c )
475 {
476 return;
477 }
478 c->setCurrentIndex( c->findData( QVariant::fromValue( dir ) ) );
479}
480
481bool QgsLayoutMapGridWidget::hasPredefinedScales() const
482{
483 // first look at project's scales
484 const QVector<double> scales = QgsProject::instance()->viewSettings()->mapScales();
485 const bool hasProjectScales( QgsProject::instance()->viewSettings()->useProjectScales() );
486 if ( !hasProjectScales || scales.isEmpty() )
487 {
488 // default to global map tool scales
489 const QStringList scales = QgsSettingsRegistryCore::settingsMapScales->value();
490 return !scales.isEmpty() && !scales[0].isEmpty();
491 }
492 return true;
493}
494
495void QgsLayoutMapGridWidget::setGridItems()
496{
497 if ( !mMapGrid )
498 {
499 return;
500 }
501
502 mGridMarkerStyleButton->registerExpressionContextGenerator( mMapGrid );
503 mGridLineStyleButton->registerExpressionContextGenerator( mMapGrid );
504 mAnnotationFontButton->registerExpressionContextGenerator( mMapGrid );
505
506 mEnabledCheckBox->setChecked( mMapGrid->enabled() );
507 mIntervalXSpinBox->setValue( mMapGrid->intervalX() );
508 mIntervalYSpinBox->setValue( mMapGrid->intervalY() );
509 mOffsetXSpinBox->setValue( mMapGrid->offsetX() );
510 mOffsetYSpinBox->setValue( mMapGrid->offsetY() );
511 mCrossWidthSpinBox->setValue( mMapGrid->crossLength() );
512 mFrameWidthSpinBox->setValue( mMapGrid->frameWidth() );
513 mGridFrameMarginSpinBox->setValue( mMapGrid->frameMargin() );
514 mGridFramePenSizeSpinBox->setValue( mMapGrid->framePenSize() );
515 mGridFramePenColorButton->setColor( mMapGrid->framePenColor() );
516 mGridFrameFill1ColorButton->setColor( mMapGrid->frameFillColor1() );
517 mGridFrameFill2ColorButton->setColor( mMapGrid->frameFillColor2() );
518
519 const Qgis::MapGridStyle gridStyle = mMapGrid->style();
520 mGridTypeComboBox->setCurrentIndex( mGridTypeComboBox->findData( QVariant::fromValue( gridStyle ) ) );
521 switch ( gridStyle )
522 {
524 mCrossWidthSpinBox->setVisible( true );
525 mCrossWidthDDBtn->setVisible( true );
526 mCrossWidthLabel->setVisible( true );
527 mGridLineStyleButton->setVisible( true );
528 mLineStyleLabel->setVisible( true );
529 mGridMarkerStyleButton->setVisible( false );
530 mMarkerStyleLabel->setVisible( false );
531 mGridBlendComboBox->setVisible( true );
532 mGridBlendLabel->setVisible( true );
533 break;
535 mCrossWidthSpinBox->setVisible( false );
536 mCrossWidthDDBtn->setVisible( false );
537 mCrossWidthLabel->setVisible( false );
538 mGridLineStyleButton->setVisible( false );
539 mLineStyleLabel->setVisible( false );
540 mGridMarkerStyleButton->setVisible( true );
541 mMarkerStyleFrame->setVisible( true );
542 mMarkerStyleLabel->setVisible( true );
543 mGridBlendComboBox->setVisible( true );
544 mGridBlendLabel->setVisible( true );
545 break;
547 mCrossWidthSpinBox->setVisible( false );
548 mCrossWidthDDBtn->setVisible( false );
549 mCrossWidthLabel->setVisible( false );
550 mGridLineStyleButton->setVisible( true );
551 mLineStyleLabel->setVisible( true );
552 mGridMarkerStyleButton->setVisible( false );
553 mMarkerStyleFrame->setVisible( false );
554 mMarkerStyleLabel->setVisible( false );
555 mGridBlendComboBox->setVisible( true );
556 mGridBlendLabel->setVisible( true );
557 break;
559 mCrossWidthSpinBox->setVisible( false );
560 mCrossWidthDDBtn->setVisible( false );
561 mCrossWidthLabel->setVisible( false );
562 mGridLineStyleButton->setVisible( false );
563 mLineStyleLabel->setVisible( false );
564 mGridMarkerStyleButton->setVisible( false );
565 mMarkerStyleFrame->setVisible( false );
566 mMarkerStyleLabel->setVisible( false );
567 mGridBlendComboBox->setVisible( false );
568 mGridBlendLabel->setVisible( false );
569 break;
570 }
571
572 //grid frame
573 mFrameWidthSpinBox->setValue( mMapGrid->frameWidth() );
574 mGridFrameMarginSpinBox->setValue( mMapGrid->frameMargin() );
575 const Qgis::MapGridFrameStyle gridFrameStyle = mMapGrid->frameStyle();
576 mFrameStyleComboBox->setCurrentIndex( mFrameStyleComboBox->findData( QVariant::fromValue( gridFrameStyle ) ) );
577 switch ( gridFrameStyle )
578 {
581 toggleFrameControls( true, true, true, false );
582 break;
586 toggleFrameControls( true, false, true, true );
587 break;
590 toggleFrameControls( true, false, false, false );
591 break;
593 toggleFrameControls( false, false, false, false );
594 break;
595 }
596
597 mCheckGridLeftSide->setChecked( mMapGrid->testFrameSideFlag( Qgis::MapGridFrameSideFlag::Left ) );
598 mCheckGridRightSide->setChecked( mMapGrid->testFrameSideFlag( Qgis::MapGridFrameSideFlag::Right ) );
599 mCheckGridTopSide->setChecked( mMapGrid->testFrameSideFlag( Qgis::MapGridFrameSideFlag::Top ) );
600 mCheckGridBottomSide->setChecked( mMapGrid->testFrameSideFlag( Qgis::MapGridFrameSideFlag::Bottom ) );
601
602 mRotatedTicksGroupBox->setChecked( mMapGrid->rotatedTicksEnabled() );
603 mRotatedTicksLengthModeComboBox->setCurrentIndex( mRotatedTicksLengthModeComboBox->findData( QVariant::fromValue( mMapGrid->rotatedTicksLengthMode() ) ) );
604 mRotatedTicksThresholdSpinBox->setValue( mMapGrid->rotatedTicksMinimumAngle() );
605 mRotatedTicksMarginToCornerSpinBox->setValue( mMapGrid->rotatedTicksMarginToCorner() );
606
607 mRotatedAnnotationsGroupBox->setChecked( mMapGrid->rotatedAnnotationsEnabled() );
608 mRotatedAnnotationsLengthModeComboBox->setCurrentIndex( mRotatedAnnotationsLengthModeComboBox->findData( QVariant::fromValue( mMapGrid->rotatedAnnotationsLengthMode() ) ) );
609 mRotatedAnnotationsThresholdSpinBox->setValue( mMapGrid->rotatedAnnotationsMinimumAngle() );
610 mRotatedAnnotationsMarginToCornerSpinBox->setValue( mMapGrid->rotatedAnnotationsMarginToCorner() );
611
612 initFrameDisplayBox( mFrameDivisionsLeftComboBox, mMapGrid->frameDivisions( Qgis::MapGridBorderSide::Left ) );
613 initFrameDisplayBox( mFrameDivisionsRightComboBox, mMapGrid->frameDivisions( Qgis::MapGridBorderSide::Right ) );
614 initFrameDisplayBox( mFrameDivisionsTopComboBox, mMapGrid->frameDivisions( Qgis::MapGridBorderSide::Top ) );
615 initFrameDisplayBox( mFrameDivisionsBottomComboBox, mMapGrid->frameDivisions( Qgis::MapGridBorderSide::Bottom ) );
616
617 //line style
618 mGridLineStyleButton->setSymbol( mMapGrid->lineSymbol()->clone() );
619 //marker style
620 mGridMarkerStyleButton->setSymbol( mMapGrid->markerSymbol()->clone() );
621
622 mGridBlendComboBox->setBlendMode( mMapGrid->blendMode() );
623
624 mDrawAnnotationGroupBox->setChecked( mMapGrid->annotationEnabled() );
625 mAnnotationDisplayLeftComboBox->setCurrentIndex( mAnnotationDisplayLeftComboBox->findData( QVariant::fromValue( mMapGrid->annotationDisplay( Qgis::MapGridBorderSide::Left ) ) ) );
626 mAnnotationDisplayRightComboBox->setCurrentIndex( mAnnotationDisplayRightComboBox->findData( QVariant::fromValue( mMapGrid->annotationDisplay( Qgis::MapGridBorderSide::Right ) ) ) );
627 mAnnotationDisplayTopComboBox->setCurrentIndex( mAnnotationDisplayTopComboBox->findData( QVariant::fromValue( mMapGrid->annotationDisplay( Qgis::MapGridBorderSide::Top ) ) ) );
628 mAnnotationDisplayBottomComboBox->setCurrentIndex( mAnnotationDisplayBottomComboBox->findData( QVariant::fromValue( mMapGrid->annotationDisplay( Qgis::MapGridBorderSide::Bottom ) ) ) );
629
630 mAnnotationPositionLeftComboBox->setCurrentIndex( mAnnotationPositionLeftComboBox->findData( QVariant::fromValue( mMapGrid->annotationPosition( Qgis::MapGridBorderSide::Left ) ) ) );
631 mAnnotationPositionRightComboBox->setCurrentIndex( mAnnotationPositionRightComboBox->findData( QVariant::fromValue( mMapGrid->annotationPosition( Qgis::MapGridBorderSide::Right ) ) ) );
632 mAnnotationPositionTopComboBox->setCurrentIndex( mAnnotationPositionTopComboBox->findData( QVariant::fromValue( mMapGrid->annotationPosition( Qgis::MapGridBorderSide::Top ) ) ) );
633 mAnnotationPositionBottomComboBox->setCurrentIndex( mAnnotationPositionBottomComboBox->findData( QVariant::fromValue( mMapGrid->annotationPosition( Qgis::MapGridBorderSide::Bottom ) ) ) );
634
635 initAnnotationDirectionBox( mAnnotationDirectionComboBoxLeft, mMapGrid->annotationDirection( Qgis::MapGridBorderSide::Left ) );
636 initAnnotationDirectionBox( mAnnotationDirectionComboBoxRight, mMapGrid->annotationDirection( Qgis::MapGridBorderSide::Right ) );
637 initAnnotationDirectionBox( mAnnotationDirectionComboBoxTop, mMapGrid->annotationDirection( Qgis::MapGridBorderSide::Top ) );
638 initAnnotationDirectionBox( mAnnotationDirectionComboBoxBottom, mMapGrid->annotationDirection( Qgis::MapGridBorderSide::Bottom ) );
639
640 mAnnotationFontButton->setDialogTitle( tr( "Grid Annotation Font" ) );
641 mAnnotationFontButton->setMode( QgsFontButton::ModeTextRenderer );
642 mAnnotationFontButton->setTextFormat( mMapGrid->annotationTextFormat() );
643
644 mAnnotationFormatComboBox->setCurrentIndex( mAnnotationFormatComboBox->findData( QVariant::fromValue( mMapGrid->annotationFormat() ) ) );
645 mAnnotationFormatButton->setEnabled( mMapGrid->annotationFormat() == Qgis::MapGridAnnotationFormat::CustomFormat );
646 mDistanceToMapFrameSpinBox->setValue( mMapGrid->annotationFrameDistance() );
647 mCoordinatePrecisionSpinBox->setValue( mMapGrid->annotationPrecision() );
648
649 mHAlignmentComboBox->setCurrentAlignment( mMapGrid->horizontalAlignment() );
650
651 //Unit
652 mMapGridUnitComboBox->setCurrentIndex( mMapGridUnitComboBox->findData( QVariant::fromValue( mMapGrid->units() ) ) );
653 switch ( mMapGrid->units() )
654 {
658 mIntervalStackedWidget->setCurrentIndex( 0 );
659 break;
660
662 mIntervalStackedWidget->setCurrentIndex( 1 );
663 break;
664 }
665 mMinWidthSpinBox->setValue( mMapGrid->minimumIntervalWidth() );
666 mMaxWidthSpinBox->setValue( mMapGrid->maximumIntervalWidth() );
667
668 whileBlocking( mMapGridCrsSelector )->setCrs( mMapGrid->crs() );
669}
670
671void QgsLayoutMapGridWidget::mIntervalXSpinBox_editingFinished()
672{
673 if ( !mMapGrid || !mMap )
674 {
675 return;
676 }
677
678 mMap->beginCommand( tr( "Change Grid Interval" ) );
679 mMapGrid->setIntervalX( mIntervalXSpinBox->value() );
680 mMap->updateBoundingRect();
681 mMap->update();
682 mMap->endCommand();
683}
684
685void QgsLayoutMapGridWidget::mIntervalYSpinBox_editingFinished()
686{
687 if ( !mMapGrid || !mMap )
688 {
689 return;
690 }
691
692 mMap->beginCommand( tr( "Change Grid Interval" ) );
693 mMapGrid->setIntervalY( mIntervalYSpinBox->value() );
694 mMap->updateBoundingRect();
695 mMap->update();
696 mMap->endCommand();
697}
698
699void QgsLayoutMapGridWidget::mOffsetXSpinBox_valueChanged( double value )
700{
701 if ( !mMapGrid || !mMap )
702 {
703 return;
704 }
705
706 mMap->beginCommand( tr( "Change Grid Offset" ) );
707 mMapGrid->setOffsetX( value );
708 mMap->updateBoundingRect();
709 mMap->update();
710 mMap->endCommand();
711}
712
713void QgsLayoutMapGridWidget::mOffsetYSpinBox_valueChanged( double value )
714{
715 if ( !mMapGrid || !mMap )
716 {
717 return;
718 }
719
720 mMap->beginCommand( tr( "Change Grid Offset" ) );
721 mMapGrid->setOffsetY( value );
722 mMap->updateBoundingRect();
723 mMap->update();
724 mMap->endCommand();
725}
726
727void QgsLayoutMapGridWidget::mCrossWidthSpinBox_valueChanged( double val )
728{
729 if ( !mMapGrid || !mMap )
730 {
731 return;
732 }
733
734 mMap->beginCommand( tr( "Change Cross Width" ) );
735 mMapGrid->setCrossLength( val );
736 mMap->update();
737 mMap->endCommand();
738}
739
740void QgsLayoutMapGridWidget::mFrameWidthSpinBox_valueChanged( double val )
741{
742 if ( !mMapGrid || !mMap )
743 {
744 return;
745 }
746
747 mMap->beginCommand( tr( "Change Frame Width" ) );
748 mMapGrid->setFrameWidth( val );
749 mMap->updateBoundingRect();
750 mMap->update();
751 mMap->endCommand();
752}
753
754void QgsLayoutMapGridWidget::mGridFrameMarginSpinBox_valueChanged( double val )
755{
756 if ( !mMapGrid || !mMap )
757 {
758 return;
759 }
760
761 mMap->beginCommand( tr( "Change Grid Frame Margin" ) );
762 mMapGrid->setFrameMargin( val );
763 mMap->updateBoundingRect();
764 mMap->update();
765 mMap->endCommand();
766}
767
768void QgsLayoutMapGridWidget::mCheckGridLeftSide_toggled( bool checked )
769{
770 if ( !mMapGrid || !mMap )
771 {
772 return;
773 }
774
775 mMap->beginCommand( tr( "Change Frame Left" ) );
776 mMapGrid->setFrameSideFlag( Qgis::MapGridFrameSideFlag::Left, checked );
777 mMap->updateBoundingRect();
778 mMap->update();
779 mMap->endCommand();
780}
781
782void QgsLayoutMapGridWidget::mCheckGridRightSide_toggled( bool checked )
783{
784 if ( !mMapGrid || !mMap )
785 {
786 return;
787 }
788
789 mMap->beginCommand( tr( "Change Frame Right" ) );
790 mMapGrid->setFrameSideFlag( Qgis::MapGridFrameSideFlag::Right, checked );
791 mMap->updateBoundingRect();
792 mMap->update();
793 mMap->endCommand();
794}
795
796void QgsLayoutMapGridWidget::mCheckGridTopSide_toggled( bool checked )
797{
798 if ( !mMapGrid || !mMap )
799 {
800 return;
801 }
802
803 mMap->beginCommand( tr( "Change Frame Top" ) );
804 mMapGrid->setFrameSideFlag( Qgis::MapGridFrameSideFlag::Top, checked );
805 mMap->updateBoundingRect();
806 mMap->update();
807 mMap->endCommand();
808}
809
810void QgsLayoutMapGridWidget::mCheckGridBottomSide_toggled( bool checked )
811{
812 if ( !mMapGrid || !mMap )
813 {
814 return;
815 }
816
817 mMap->beginCommand( tr( "Change Frame Bottom" ) );
818 mMapGrid->setFrameSideFlag( Qgis::MapGridFrameSideFlag::Bottom, checked );
819 mMap->updateBoundingRect();
820 mMap->update();
821 mMap->endCommand();
822}
823
824void QgsLayoutMapGridWidget::mFrameDivisionsLeftComboBox_currentIndexChanged( int index )
825{
826 handleChangedFrameDisplay( Qgis::MapGridBorderSide::Left, mFrameDivisionsLeftComboBox->itemData( index ).value< Qgis::MapGridComponentVisibility >() );
827}
828
829void QgsLayoutMapGridWidget::mFrameDivisionsRightComboBox_currentIndexChanged( int index )
830{
831 handleChangedFrameDisplay( Qgis::MapGridBorderSide::Right, mFrameDivisionsRightComboBox->itemData( index ).value< Qgis::MapGridComponentVisibility >() );
832}
833
834void QgsLayoutMapGridWidget::mFrameDivisionsTopComboBox_currentIndexChanged( int index )
835{
836 handleChangedFrameDisplay( Qgis::MapGridBorderSide::Top, mFrameDivisionsTopComboBox->itemData( index ).value< Qgis::MapGridComponentVisibility >() );
837}
838
839void QgsLayoutMapGridWidget::mFrameDivisionsBottomComboBox_currentIndexChanged( int index )
840{
841 handleChangedFrameDisplay( Qgis::MapGridBorderSide::Bottom, mFrameDivisionsBottomComboBox->itemData( index ).value< Qgis::MapGridComponentVisibility >() );
842}
843
844void QgsLayoutMapGridWidget::mGridFramePenSizeSpinBox_valueChanged( double d )
845{
846 if ( !mMapGrid || !mMap )
847 {
848 return;
849 }
850
851 mMap->beginCommand( tr( "Change Frame Thickness" ) );
852 mMapGrid->setFramePenSize( d );
853 mMap->updateBoundingRect();
854 mMap->update();
855 mMap->endCommand();
856}
857
858void QgsLayoutMapGridWidget::mGridFramePenColorButton_colorChanged( const QColor &newColor )
859{
860 if ( !mMapGrid || !mMap )
861 {
862 return;
863 }
864
865 mMap->beginCommand( tr( "Change Frame Color" ), QgsLayoutItem::UndoGridFramePenColor );
866 mMapGrid->setFramePenColor( newColor );
867 mMap->update();
868 mMap->endCommand();
869}
870
871void QgsLayoutMapGridWidget::mGridFrameFill1ColorButton_colorChanged( const QColor &newColor )
872{
873 if ( !mMapGrid || !mMap )
874 {
875 return;
876 }
877
878 mMap->beginCommand( tr( "Change Frame Fill Color" ), QgsLayoutItem::UndoMapGridFrameFill1Color );
879 mMapGrid->setFrameFillColor1( newColor );
880 mMap->update();
881 mMap->endCommand();
882}
883
884void QgsLayoutMapGridWidget::mGridFrameFill2ColorButton_colorChanged( const QColor &newColor )
885{
886 if ( !mMapGrid || !mMap )
887 {
888 return;
889 }
890
891 mMap->beginCommand( tr( "Change Frame Fill Color" ), QgsLayoutItem::UndoMapGridFrameFill2Color );
892 mMapGrid->setFrameFillColor2( newColor );
893 mMap->update();
894 mMap->endCommand();
895}
896
897void QgsLayoutMapGridWidget::mFrameStyleComboBox_currentIndexChanged( int )
898{
899 if ( !mMapGrid || !mMap )
900 {
901 return;
902 }
903
904 const Qgis::MapGridFrameStyle style = mFrameStyleComboBox->currentData().value< Qgis::MapGridFrameStyle >();
905 mMap->beginCommand( tr( "Change Frame Style" ) );
906 mMapGrid->setFrameStyle( style );
907 switch ( style )
908 {
911 toggleFrameControls( true, true, true, false );
912 break;
916 toggleFrameControls( true, false, true, true );
917 break;
920 toggleFrameControls( true, false, false, false );
921 break;
923 toggleFrameControls( false, false, false, false );
924 break;
925 }
926 mMap->updateBoundingRect();
927 mMap->update();
928 mMap->endCommand();
929}
930
931void QgsLayoutMapGridWidget::mRotatedTicksGroupBox_toggled( bool state )
932{
933 if ( !mMapGrid || !mMap )
934 {
935 return;
936 }
937
938 mMap->beginCommand( tr( "Change Tick Rotation Enabled" ) );
939 mMapGrid->setRotatedTicksEnabled( state );
940 mMap->update();
941 mMap->endCommand();
942}
943
944void QgsLayoutMapGridWidget::mRotatedTicksLengthModeComboBox_currentIndexChanged( int )
945{
946 if ( !mMapGrid || !mMap )
947 {
948 return;
949 }
950
951 const Qgis::MapGridTickLengthMode mode = mRotatedTicksLengthModeComboBox->currentData().value< Qgis::MapGridTickLengthMode >();
952 mMap->beginCommand( tr( "Change Tick Length Mode" ) );
953 mMapGrid->setRotatedTicksLengthMode( mode );
954 mMap->update();
955 mMap->endCommand();
956}
957
958void QgsLayoutMapGridWidget::mRotatedTicksThresholdSpinBox_valueChanged( double val )
959{
960 if ( !mMapGrid || !mMap )
961 {
962 return;
963 }
964
965 mMap->beginCommand( tr( "Change Rotated Ticks Threshold" ) );
966 mMapGrid->setRotatedTicksMinimumAngle( val );
967 mMap->update();
968 mMap->endCommand();
969}
970
971void QgsLayoutMapGridWidget::mRotatedTicksMarginToCornerSpinBox_valueChanged( double val )
972{
973 if ( !mMapGrid || !mMap )
974 {
975 return;
976 }
977
978 mMap->beginCommand( tr( "Change Rotated Ticks Margin to Corner" ) );
979 mMapGrid->setRotatedTicksMarginToCorner( val );
980 mMap->update();
981 mMap->endCommand();
982}
983
984void QgsLayoutMapGridWidget::mRotatedAnnotationsGroupBox_toggled( bool state )
985{
986 if ( !mMapGrid || !mMap )
987 {
988 return;
989 }
990
991 mMap->beginCommand( tr( "Change Annotation Rotation Enabled" ) );
992 mMapGrid->setRotatedAnnotationsEnabled( state );
993 mMap->update();
994 mMap->endCommand();
995}
996
997void QgsLayoutMapGridWidget::mRotatedAnnotationsLengthModeComboBox_currentIndexChanged( int )
998{
999 if ( !mMapGrid || !mMap )
1000 {
1001 return;
1002 }
1003
1004 const Qgis::MapGridTickLengthMode mode = mRotatedAnnotationsLengthModeComboBox->currentData().value< Qgis::MapGridTickLengthMode >();
1005 mMap->beginCommand( tr( "Change Annotation Length Mode" ) );
1006 mMapGrid->setRotatedAnnotationsLengthMode( mode );
1007 mMap->update();
1008 mMap->endCommand();
1009}
1010
1011void QgsLayoutMapGridWidget::mRotatedAnnotationsThresholdSpinBox_valueChanged( double val )
1012{
1013 if ( !mMapGrid || !mMap )
1014 {
1015 return;
1016 }
1017
1018 mMap->beginCommand( tr( "Change Rotated Annotations Threshold" ) );
1019 mMapGrid->setRotatedAnnotationsMinimumAngle( val );
1020 mMap->update();
1021 mMap->endCommand();
1022}
1023
1024void QgsLayoutMapGridWidget::mRotatedAnnotationsMarginToCornerSpinBox_valueChanged( double val )
1025{
1026 if ( !mMapGrid || !mMap )
1027 {
1028 return;
1029 }
1030
1031 mMap->beginCommand( tr( "Change Rotated Annotations Margin to Corner" ) );
1032 mMapGrid->setRotatedAnnotationsMarginToCorner( val );
1033 mMap->update();
1034 mMap->endCommand();
1035}
1036
1037void QgsLayoutMapGridWidget::intervalUnitChanged( int )
1038{
1039 if ( !mMapGrid || !mMap )
1040 {
1041 return;
1042 }
1043
1044 const Qgis::MapGridUnit unit = mMapGridUnitComboBox->currentData().value< Qgis::MapGridUnit >();
1045 switch ( unit )
1046 {
1050 mIntervalStackedWidget->setCurrentIndex( 0 );
1051 break;
1052
1054 mIntervalStackedWidget->setCurrentIndex( 1 );
1055 break;
1056 }
1057
1058 mMap->beginCommand( tr( "Change Grid Unit" ) );
1059 mMapGrid->setUnits( unit );
1060 mMap->updateBoundingRect();
1061 mMap->update();
1062 mMap->endCommand();
1063}
1064
1065void QgsLayoutMapGridWidget::minIntervalChanged( double interval )
1066{
1067 mMap->beginCommand( tr( "Change Grid Interval Range" ), QgsLayoutItem::UndoMapGridIntervalRange );
1068 mMapGrid->setMinimumIntervalWidth( interval );
1069 mMap->endCommand();
1070 mMap->updateBoundingRect();
1071 mMap->update();
1072}
1073
1074void QgsLayoutMapGridWidget::maxIntervalChanged( double interval )
1075{
1076 mMap->beginCommand( tr( "Change Grid Interval Range" ), QgsLayoutItem::UndoMapGridIntervalRange );
1077 mMapGrid->setMaximumIntervalWidth( interval );
1078 mMap->endCommand();
1079 mMap->updateBoundingRect();
1080 mMap->update();
1081}
1082
1083void QgsLayoutMapGridWidget::annotationTextFormatChanged()
1084{
1085 if ( !mMapGrid || !mMap )
1086 {
1087 return;
1088 }
1089
1090 mMap->beginCommand( tr( "Change Annotation Font" ) );
1091 mMapGrid->setAnnotationTextFormat( mAnnotationFontButton->textFormat() );
1092 mMap->endCommand();
1093 mMap->updateBoundingRect();
1094 mMap->update();
1095}
1096
1097void QgsLayoutMapGridWidget::onCrsChanged()
1098{
1099 mBlockAnnotationFormatUpdates++;
1100 const Qgis::MapGridAnnotationFormat prevFormat = mAnnotationFormatComboBox->currentData().value< Qgis::MapGridAnnotationFormat >();
1101
1102 mAnnotationFormatComboBox->clear();
1103 mAnnotationFormatComboBox->addItem( tr( "Decimal" ), QVariant::fromValue( Qgis::MapGridAnnotationFormat::Decimal ) );
1104 mAnnotationFormatComboBox->addItem( tr( "Decimal with Suffix" ), QVariant::fromValue( Qgis::MapGridAnnotationFormat::DecimalWithSuffix ) );
1105
1106 // only show degree based options for geographic CRSes
1107 const QgsCoordinateReferenceSystem crs = mMapGrid->crs().isValid() ? mMapGrid->crs() : mMap->crs();
1108 switch ( crs.mapUnits() )
1109 {
1158 break;
1159
1162 mAnnotationFormatComboBox->addItem( tr( "Degree, Minute" ), QVariant::fromValue( Qgis::MapGridAnnotationFormat::DegreeMinuteNoSuffix ) );
1163 mAnnotationFormatComboBox->addItem( tr( "Degree, Minute with Suffix" ), QVariant::fromValue( Qgis::MapGridAnnotationFormat::DegreeMinute ) );
1164 mAnnotationFormatComboBox->addItem( tr( "Degree, Minute Aligned" ), QVariant::fromValue( Qgis::MapGridAnnotationFormat::DegreeMinutePadded ) );
1165 mAnnotationFormatComboBox->addItem( tr( "Degree, Minute, Second" ), QVariant::fromValue( Qgis::MapGridAnnotationFormat::DegreeMinuteSecondNoSuffix ) );
1166 mAnnotationFormatComboBox->addItem( tr( "Degree, Minute, Second with Suffix" ), QVariant::fromValue( Qgis::MapGridAnnotationFormat::DegreeMinuteSecond ) );
1167 mAnnotationFormatComboBox->addItem( tr( "Degree, Minute, Second Aligned" ), QVariant::fromValue( Qgis::MapGridAnnotationFormat::DegreeMinuteSecondPadded ) );
1168 break;
1169 }
1170 mAnnotationFormatComboBox->addItem( tr( "Custom" ), QVariant::fromValue( Qgis::MapGridAnnotationFormat::CustomFormat ) );
1171
1172 const int prevIndex = mAnnotationFormatComboBox->findData( QVariant::fromValue( prevFormat ) );
1173 if ( prevIndex >= 0 )
1174 mAnnotationFormatComboBox->setCurrentIndex( prevIndex );
1175 else
1176 mAnnotationFormatComboBox->setCurrentIndex( 0 );
1177 mBlockAnnotationFormatUpdates--;
1178
1179 const Qgis::MapGridAnnotationFormat newFormat = mAnnotationFormatComboBox->currentData().value< Qgis::MapGridAnnotationFormat >();
1180 if ( newFormat != prevFormat )
1181 {
1182 mAnnotationFormatComboBox_currentIndexChanged( mAnnotationFormatComboBox->currentIndex() );
1183 }
1184}
1185
1186void QgsLayoutMapGridWidget::mGridBlendComboBox_currentIndexChanged( int index )
1187{
1188 Q_UNUSED( index )
1189 if ( mMapGrid )
1190 {
1191 mMap->beginCommand( tr( "Change Grid Blend Mode" ) );
1192 mMapGrid->setBlendMode( mGridBlendComboBox->blendMode() );
1193 mMap->update();
1194 mMap->endCommand();
1195 }
1196}
1197
1198void QgsLayoutMapGridWidget::mGridTypeComboBox_currentIndexChanged( int )
1199{
1200 if ( !mMapGrid || !mMap )
1201 {
1202 return;
1203 }
1204
1205 mMap->beginCommand( tr( "Change Grid Type" ) );
1206 switch ( mGridTypeComboBox->currentData().value< Qgis::MapGridStyle >() )
1207 {
1209 mMapGrid->setStyle( Qgis::MapGridStyle::LineCrosses );
1210 mCrossWidthSpinBox->setVisible( true );
1211 mCrossWidthDDBtn->setVisible( true );
1212 mCrossWidthLabel->setVisible( true );
1213 mGridLineStyleButton->setVisible( true );
1214 mLineStyleLabel->setVisible( true );
1215 mGridMarkerStyleButton->setVisible( false );
1216 mMarkerStyleFrame->setVisible( false );
1217 mMarkerStyleFrame->setVisible( false );
1218 mMarkerStyleLabel->setVisible( false );
1219 mGridBlendComboBox->setVisible( true );
1220 mGridBlendLabel->setVisible( true );
1221 break;
1222
1224 mMapGrid->setStyle( Qgis::MapGridStyle::Markers );
1225 mCrossWidthSpinBox->setVisible( false );
1226 mCrossWidthDDBtn->setVisible( false );
1227 mCrossWidthLabel->setVisible( false );
1228 mGridLineStyleButton->setVisible( false );
1229 mLineStyleLabel->setVisible( false );
1230 mGridMarkerStyleButton->setVisible( true );
1231 mMarkerStyleFrame->setVisible( true );
1232 mMarkerStyleLabel->setVisible( true );
1233 mGridBlendComboBox->setVisible( true );
1234 mGridBlendLabel->setVisible( true );
1235 break;
1236
1238 mMapGrid->setStyle( Qgis::MapGridStyle::Lines );
1239 mCrossWidthSpinBox->setVisible( false );
1240 mCrossWidthDDBtn->setVisible( false );
1241 mCrossWidthLabel->setVisible( false );
1242 mGridLineStyleButton->setVisible( true );
1243 mLineStyleLabel->setVisible( true );
1244 mGridMarkerStyleButton->setVisible( false );
1245 mMarkerStyleFrame->setVisible( false );
1246 mMarkerStyleLabel->setVisible( false );
1247 mGridBlendComboBox->setVisible( true );
1248 mGridBlendLabel->setVisible( true );
1249 break;
1250
1252 mMapGrid->setStyle( Qgis::MapGridStyle::FrameAndAnnotationsOnly );
1253 mCrossWidthSpinBox->setVisible( false );
1254 mCrossWidthDDBtn->setVisible( false );
1255 mCrossWidthLabel->setVisible( false );
1256 mGridLineStyleButton->setVisible( false );
1257 mLineStyleLabel->setVisible( false );
1258 mGridMarkerStyleButton->setVisible( false );
1259 mMarkerStyleFrame->setVisible( false );
1260 mMarkerStyleLabel->setVisible( false );
1261 mGridBlendComboBox->setVisible( false );
1262 mGridBlendLabel->setVisible( false );
1263 break;
1264 }
1265
1266 mMap->updateBoundingRect();
1267 mMap->update();
1268 mMap->endCommand();
1269}
1270
1271void QgsLayoutMapGridWidget::mapGridCrsChanged( const QgsCoordinateReferenceSystem &crs )
1272{
1273 if ( !mMapGrid || !mMap )
1274 {
1275 return;
1276 }
1277
1278 if ( mMapGrid->crs() == crs )
1279 return;
1280
1281 mMap->beginCommand( tr( "Change Grid CRS" ) );
1282 mMapGrid->setCrs( crs );
1283 mMap->updateBoundingRect();
1284 mMap->update();
1285 mMap->endCommand();
1286}
1287
1288void QgsLayoutMapGridWidget::mDrawAnnotationGroupBox_toggled( bool state )
1289{
1290 if ( !mMapGrid || !mMap )
1291 {
1292 return;
1293 }
1294
1295 mMap->beginCommand( tr( "Toggle Annotations" ) );
1296 mMapGrid->setAnnotationEnabled( state );
1297 mMap->updateBoundingRect();
1298 mMap->update();
1299 mMap->endCommand();
1300}
1301
1302void QgsLayoutMapGridWidget::mAnnotationFormatButton_clicked()
1303{
1304 if ( !mMapGrid || !mMap )
1305 {
1306 return;
1307 }
1308
1309 QgsExpressionContext expressionContext = mMapGrid->createExpressionContext();
1310 expressionContext.setHighlightedFunctions( QStringList() << u"to_dms"_s << u"to_dm"_s );
1311
1312 QgsExpressionBuilderDialog exprDlg( coverageLayer(), mMapGrid->annotationExpression(), this, u"generic"_s, expressionContext );
1313 exprDlg.setWindowTitle( tr( "Expression Based Annotation" ) );
1314
1315 if ( exprDlg.exec() == QDialog::Accepted )
1316 {
1317 const QString expression = exprDlg.expressionText();
1318 mMap->beginCommand( tr( "Change Annotation Format" ) );
1319 mMapGrid->setAnnotationExpression( expression );
1320 mMap->updateBoundingRect();
1321 mMap->update();
1322 mMap->endCommand();
1323 }
1324}
1325
1326void QgsLayoutMapGridWidget::mAnnotationDisplayLeftComboBox_currentIndexChanged( int )
1327{
1328 handleChangedAnnotationDisplay( Qgis::MapGridBorderSide::Left, mAnnotationDisplayLeftComboBox->currentData().value< Qgis::MapGridComponentVisibility >() );
1329}
1330
1331void QgsLayoutMapGridWidget::mAnnotationDisplayRightComboBox_currentIndexChanged( int )
1332{
1333 handleChangedAnnotationDisplay( Qgis::MapGridBorderSide::Right, mAnnotationDisplayRightComboBox->currentData().value< Qgis::MapGridComponentVisibility >() );
1334}
1335
1336void QgsLayoutMapGridWidget::mAnnotationDisplayTopComboBox_currentIndexChanged( int )
1337{
1338 handleChangedAnnotationDisplay( Qgis::MapGridBorderSide::Top, mAnnotationDisplayTopComboBox->currentData().value< Qgis::MapGridComponentVisibility >() );
1339}
1340
1341void QgsLayoutMapGridWidget::mAnnotationDisplayBottomComboBox_currentIndexChanged( int )
1342{
1343 handleChangedAnnotationDisplay( Qgis::MapGridBorderSide::Bottom, mAnnotationDisplayBottomComboBox->currentData().value< Qgis::MapGridComponentVisibility >() );
1344}
1345
1346void QgsLayoutMapGridWidget::mAnnotationPositionLeftComboBox_currentIndexChanged( int )
1347{
1348 handleChangedAnnotationPosition( Qgis::MapGridBorderSide::Left, mAnnotationPositionLeftComboBox->currentData().value< Qgis::MapGridAnnotationPosition >() );
1349}
1350
1351void QgsLayoutMapGridWidget::mAnnotationPositionRightComboBox_currentIndexChanged( int )
1352{
1353 handleChangedAnnotationPosition( Qgis::MapGridBorderSide::Right, mAnnotationPositionRightComboBox->currentData().value< Qgis::MapGridAnnotationPosition >() );
1354}
1355
1356void QgsLayoutMapGridWidget::mAnnotationPositionTopComboBox_currentIndexChanged( int )
1357{
1358 handleChangedAnnotationPosition( Qgis::MapGridBorderSide::Top, mAnnotationPositionTopComboBox->currentData().value< Qgis::MapGridAnnotationPosition >() );
1359}
1360
1361void QgsLayoutMapGridWidget::mAnnotationPositionBottomComboBox_currentIndexChanged( int )
1362{
1363 handleChangedAnnotationPosition( Qgis::MapGridBorderSide::Bottom, mAnnotationPositionBottomComboBox->currentData().value< Qgis::MapGridAnnotationPosition >() );
1364}
1365
1366void QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxLeft_currentIndexChanged( int index )
1367{
1368 handleChangedAnnotationDirection( Qgis::MapGridBorderSide::Left, mAnnotationDirectionComboBoxLeft->itemData( index ).value< Qgis::MapGridAnnotationDirection >() );
1369}
1370
1371void QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxRight_currentIndexChanged( int index )
1372{
1373 handleChangedAnnotationDirection( Qgis::MapGridBorderSide::Right, mAnnotationDirectionComboBoxRight->itemData( index ).value< Qgis::MapGridAnnotationDirection >() );
1374}
1375
1376void QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxTop_currentIndexChanged( int index )
1377{
1378 handleChangedAnnotationDirection( Qgis::MapGridBorderSide::Top, mAnnotationDirectionComboBoxTop->itemData( index ).value< Qgis::MapGridAnnotationDirection >() );
1379}
1380
1381void QgsLayoutMapGridWidget::mAnnotationDirectionComboBoxBottom_currentIndexChanged( int index )
1382{
1383 handleChangedAnnotationDirection( Qgis::MapGridBorderSide::Bottom, mAnnotationDirectionComboBoxBottom->itemData( index ).value< Qgis::MapGridAnnotationDirection >() );
1384}
1385
1386void QgsLayoutMapGridWidget::mDistanceToMapFrameSpinBox_valueChanged( double d )
1387{
1388 if ( !mMapGrid || !mMap )
1389 {
1390 return;
1391 }
1392
1393 mMap->beginCommand( tr( "Change Annotation Distance" ), QgsLayoutItem::UndoMapAnnotationDistance );
1394 mMapGrid->setAnnotationFrameDistance( d );
1395 mMap->updateBoundingRect();
1396 mMap->update();
1397 mMap->endCommand();
1398}
1399
1400void QgsLayoutMapGridWidget::lineSymbolChanged()
1401{
1402 if ( !mMapGrid || !mMap )
1403 {
1404 return;
1405 }
1406
1407 mMap->beginCommand( tr( "Change Grid Line Style" ), QgsLayoutItem::UndoMapGridLineSymbol );
1408 mMapGrid->setLineSymbol( mGridLineStyleButton->clonedSymbol<QgsLineSymbol>() );
1409 mMap->endCommand();
1410 mMap->update();
1411}
1412
1413void QgsLayoutMapGridWidget::markerSymbolChanged()
1414{
1415 if ( !mMapGrid || !mMap )
1416 {
1417 return;
1418 }
1419
1420 mMap->beginCommand( tr( "Change Grid Marker Style" ), QgsLayoutItem::UndoMapGridMarkerSymbol );
1421 mMapGrid->setMarkerSymbol( mGridMarkerStyleButton->clonedSymbol<QgsMarkerSymbol>() );
1422 mMap->endCommand();
1423 mMap->update();
1424}
1425
1426void QgsLayoutMapGridWidget::gridEnabledToggled( bool active )
1427{
1428 if ( !mMapGrid || !mMap )
1429 {
1430 return;
1431 }
1432
1433 mMap->beginCommand( tr( "Toggle Grid Display" ) );
1434 mMapGrid->setEnabled( active );
1435 mMap->endCommand();
1436 mMap->updateBoundingRect();
1437 mMap->update();
1438}
1439
1440void QgsLayoutMapGridWidget::mAnnotationFormatComboBox_currentIndexChanged( int index )
1441{
1442 if ( !mMapGrid || !mMap )
1443 {
1444 return;
1445 }
1446 if ( mBlockAnnotationFormatUpdates )
1447 return;
1448
1449 mMap->beginCommand( tr( "Change Annotation Format" ) );
1450
1451 mMapGrid->setAnnotationFormat( mAnnotationFormatComboBox->itemData( index ).value< Qgis::MapGridAnnotationFormat >() );
1452 mAnnotationFormatButton->setEnabled( mMapGrid->annotationFormat() == Qgis::MapGridAnnotationFormat::CustomFormat );
1453
1454 mMap->updateBoundingRect();
1455 mMap->update();
1456 mMap->endCommand();
1457}
1458
1459void QgsLayoutMapGridWidget::mCoordinatePrecisionSpinBox_valueChanged( int value )
1460{
1461 if ( !mMapGrid || !mMap )
1462 {
1463 return;
1464 }
1465 mMap->beginCommand( tr( "Change Annotation Precision" ) );
1466 mMapGrid->setAnnotationPrecision( value );
1467 mMap->updateBoundingRect();
1468 mMap->update();
1469 mMap->endCommand();
1470}
MapGridTickLengthMode
Map grid tick length mode (useful for rotated grids).
Definition qgis.h:5620
@ OrthogonalTicks
Align ticks orthogonaly.
Definition qgis.h:5621
@ NormalizedTicks
Constant tick lengths.
Definition qgis.h:5622
MapGridAnnotationPosition
Position for map grid annotations.
Definition qgis.h:5530
@ InsideMapFrame
Draw annotations inside the map frame.
Definition qgis.h:5531
@ OutsideMapFrame
Draw annotations outside the map frame.
Definition qgis.h:5532
MapGridUnit
Units for map grid values.
Definition qgis.h:5482
@ Centimeters
Grid units in centimeters.
Definition qgis.h:5485
@ Millimeters
Grid units in millimeters.
Definition qgis.h:5484
@ DynamicPageSizeBased
Dynamically sized, based on a on-page size range.
Definition qgis.h:5486
@ MapUnits
Grid units follow map units.
Definition qgis.h:5483
@ YardsBritishSears1922Truncated
British yards (Sears 1922 truncated).
Definition qgis.h:5175
@ Feet
Imperial feet.
Definition qgis.h:5138
@ MilesUSSurvey
US Survey miles.
Definition qgis.h:5182
@ LinksBritishSears1922
British links (Sears 1922).
Definition qgis.h:5170
@ YardsBritishBenoit1895A
British yards (Benoit 1895 A).
Definition qgis.h:5173
@ LinksBritishBenoit1895A
British links (Benoit 1895 A).
Definition qgis.h:5167
@ Centimeters
Centimeters.
Definition qgis.h:5143
@ YardsIndian1975
Indian yards (1975).
Definition qgis.h:5181
@ FeetUSSurvey
US Survey feet.
Definition qgis.h:5165
@ Millimeters
Millimeters.
Definition qgis.h:5144
@ FeetBritishSears1922
British feet (Sears 1922).
Definition qgis.h:5158
@ YardsClarkes
Clarke's yards.
Definition qgis.h:5177
@ YardsIndian
Indian yards.
Definition qgis.h:5178
@ FeetBritishBenoit1895B
British feet (Benoit 1895 B).
Definition qgis.h:5156
@ Miles
Terrestrial miles.
Definition qgis.h:5141
@ LinksUSSurvey
US Survey links.
Definition qgis.h:5172
@ Meters
Meters.
Definition qgis.h:5136
@ ChainsUSSurvey
US Survey chains.
Definition qgis.h:5152
@ FeetClarkes
Clarke's feet.
Definition qgis.h:5159
@ Unknown
Unknown distance unit.
Definition qgis.h:5185
@ Yards
Imperial yards.
Definition qgis.h:5140
@ FeetBritish1936
British feet (1936).
Definition qgis.h:5154
@ FeetIndian1962
Indian feet (1962).
Definition qgis.h:5163
@ YardsBritishSears1922
British yards (Sears 1922).
Definition qgis.h:5176
@ FeetIndian1937
Indian feet (1937).
Definition qgis.h:5162
@ YardsIndian1937
Indian yards (1937).
Definition qgis.h:5179
@ Degrees
Degrees, for planar geographic CRS distance measurements.
Definition qgis.h:5142
@ ChainsBritishBenoit1895B
British chains (Benoit 1895 B).
Definition qgis.h:5148
@ LinksBritishSears1922Truncated
British links (Sears 1922 truncated).
Definition qgis.h:5169
@ ChainsBritishBenoit1895A
British chains (Benoit 1895 A).
Definition qgis.h:5147
@ YardsBritishBenoit1895B
British yards (Benoit 1895 B).
Definition qgis.h:5174
@ FeetBritish1865
British feet (1865).
Definition qgis.h:5153
@ YardsIndian1962
Indian yards (1962).
Definition qgis.h:5180
@ FeetBritishSears1922Truncated
British feet (Sears 1922 truncated).
Definition qgis.h:5157
@ MetersGermanLegal
German legal meter.
Definition qgis.h:5184
@ LinksBritishBenoit1895B
British links (Benoit 1895 B).
Definition qgis.h:5168
@ ChainsInternational
International chains.
Definition qgis.h:5146
@ Inches
Inches.
Definition qgis.h:5145
@ Fathoms
Fathoms.
Definition qgis.h:5183
@ LinksInternational
International links.
Definition qgis.h:5166
@ ChainsBritishSears1922Truncated
British chains (Sears 1922 truncated).
Definition qgis.h:5149
@ FeetIndian
Indian (geodetic) feet.
Definition qgis.h:5161
@ NauticalMiles
Nautical miles.
Definition qgis.h:5139
@ ChainsClarkes
Clarke's chains.
Definition qgis.h:5151
@ LinksClarkes
Clarke's links.
Definition qgis.h:5171
@ ChainsBritishSears1922
British chains (Sears 1922).
Definition qgis.h:5150
@ Kilometers
Kilometers.
Definition qgis.h:5137
@ FeetIndian1975
Indian feet (1975).
Definition qgis.h:5164
@ FeetGoldCoast
Gold Coast feet.
Definition qgis.h:5160
@ FeetBritishBenoit1895A
British feet (Benoit 1895 A).
Definition qgis.h:5155
MapGridBorderSide
Border sides for map grid annotations.
Definition qgis.h:5584
@ Bottom
Bottom border.
Definition qgis.h:5587
@ Right
Right border.
Definition qgis.h:5586
@ Left
Left border.
Definition qgis.h:5585
@ Top
Top border.
Definition qgis.h:5588
@ Bottom
Bottom side of map.
Definition qgis.h:5639
@ Right
Right side of map.
Definition qgis.h:5637
@ Left
Left side of map.
Definition qgis.h:5636
@ Top
Top side of map.
Definition qgis.h:5638
MapGridComponentVisibility
Visibility display settings for map grid annotations and frames.
Definition qgis.h:5514
@ ShowAll
Show both latitude and longitude annotations/divisions.
Definition qgis.h:5515
@ LongitudeOnly
Show longitude/x annotations/divisions only.
Definition qgis.h:5517
@ LatitudeOnly
Show latitude/y annotations/divisions only.
Definition qgis.h:5516
@ HideAll
No annotations.
Definition qgis.h:5518
MapGridStyle
Map grid drawing styles.
Definition qgis.h:5498
@ LineCrosses
Draw line crosses at intersections of grid lines.
Definition qgis.h:5500
@ Markers
Draw markers at intersections of grid lines.
Definition qgis.h:5501
@ Lines
Draw lines for grid.
Definition qgis.h:5499
@ FrameAndAnnotationsOnly
No grid lines over the map, only draw frame and annotations.
Definition qgis.h:5502
MapGridFrameStyle
Style for map grid frames.
Definition qgis.h:5600
@ LineBorderNautical
Simple solid line frame, with nautical style diagonals on corners.
Definition qgis.h:5607
@ ZebraNautical
Black/white pattern, with nautical style diagonals on corners.
Definition qgis.h:5608
@ InteriorExteriorTicks
Tick markers drawn both inside and outside the map frame.
Definition qgis.h:5605
@ NoFrame
Disable grid frame.
Definition qgis.h:5601
@ ExteriorTicks
Tick markers drawn outside map frame.
Definition qgis.h:5604
@ Zebra
Black/white pattern.
Definition qgis.h:5602
@ LineBorder
Simple solid line frame.
Definition qgis.h:5606
@ InteriorTicks
Tick markers drawn inside map frame.
Definition qgis.h:5603
@ Marker
Marker symbol.
Definition qgis.h:632
@ Line
Line symbol.
Definition qgis.h:633
MapGridAnnotationDirection
Direction of grid annotations.
Definition qgis.h:5544
@ Vertical
Draw annotations vertically, ascending.
Definition qgis.h:5546
@ UnderTick
Draw annotations parallel to tick (under the line).
Definition qgis.h:5551
@ VerticalDescending
Draw annotations vertically, descending.
Definition qgis.h:5547
@ BoundaryDirection
Annotations follow the boundary direction.
Definition qgis.h:5548
@ AboveTick
Draw annotations parallel to tick (above the line).
Definition qgis.h:5549
@ OnTick
Draw annotations parallel to tick (on the line).
Definition qgis.h:5550
@ Horizontal
Draw annotations horizontally.
Definition qgis.h:5545
MapGridAnnotationFormat
Format for displaying map grid annotations.
Definition qgis.h:5563
@ DegreeMinute
Degree/minutes, use NSEW suffix.
Definition qgis.h:5565
@ DegreeMinuteSecond
Degree/minutes/seconds, use NSEW suffix.
Definition qgis.h:5566
@ DegreeMinuteNoSuffix
Degree/minutes, use - for S/W coordinates.
Definition qgis.h:5568
@ CustomFormat
Custom expression-based format.
Definition qgis.h:5572
@ Decimal
Decimal degrees, use - for S/W coordinates.
Definition qgis.h:5564
@ DegreeMinuteSecondNoSuffix
Degree/minutes/seconds, use - for S/W coordinates.
Definition qgis.h:5570
@ DegreeMinutePadded
Degree/minutes, with minutes using leading zeros where required.
Definition qgis.h:5569
@ DegreeMinuteSecondPadded
Degree/minutes/seconds, with minutes using leading zeros where required.
Definition qgis.h:5571
@ DecimalWithSuffix
Decimal degrees, use NSEW suffix.
Definition qgis.h:5567
void changed()
Emitted when the alignment is changed.
void colorChanged(const QColor &color)
Emitted whenever a new color is set for the button.
Represents a coordinate reference system (CRS).
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.
void setLayer(QgsVectorLayer *layer)
Sets a layer to associate with the widget.
void changed()
Emitted when the widget's text format settings are changed.
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.
QgsLayoutItemBaseWidget(QWidget *parent SIP_TRANSFERTHIS, QgsLayoutObject *layoutObject)
Constructor for QgsLayoutItemBaseWidget, linked with the specified layoutObject.
An individual grid which is drawn above the map content in a QgsLayoutItemMap.
void crsChanged()
Emitted whenever the grid's CRS is changed.
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
@ MapGridFrameDivisionsBottom
Map frame division display bottom.
@ MapGridFrameDivisionsTop
Map frame division display top.
@ MapGridAnnotationDisplayLeft
Map annotation display left.
@ MapGridFrameMargin
Map grid frame margin.
@ MapGridDrawAnnotation
Map annotation visibility (for individual annotations).
@ MapGridAnnotationDisplayRight
Map annotation display right.
@ MapGridAnnotationDisplayTop
Map annotation display top.
@ MapGridAnnotationDisplayBottom
Map annotation display bottom.
@ MapGridFrameDivisionsRight
Map frame division display right.
@ MapGridLabelDistance
Map grid label distance.
@ MapGridFrameLineThickness
Map grid frame line thickness.
@ MapGridFrameDivisionsLeft
Map frame division display left.
void layerChanged(QgsVectorLayer *layer)
Emitted when the context's layer is changed.
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.
const QgsProjectViewSettings * viewSettings() const
Returns the project's view settings, which contains settings and properties relating to how a QgsProj...
@ CrsNotSet
Not set (hidden by default).
void crsChanged(const QgsCoordinateReferenceSystem &crs)
Emitted when the selected CRS is changed.
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
static const QgsSettingsEntryStringList * settingsMapScales
void setLayer(QgsVectorLayer *layer)
Sets a layer to associate with the widget.
void changed()
Emitted when the symbol's settings are changed.
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:6854