QGIS API Documentation  3.12.1-BucureČ™ti (121cc00ff0)
qgslayoutpropertieswidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayoutpropertieswidget.cpp
3  -----------------------------
4  begin : July 2017
5  copyright : (C) 2017 by Nyall Dawson
6  email : nyall dot dawson at gmail dot com
7  ***************************************************************************/
8 /***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
18 #include "qgslayout.h"
19 #include "qgslayoutsnapper.h"
21 #include "qgslayoutundostack.h"
22 #include "qgslayoutitemmap.h"
24 #include "qgsprintlayout.h"
25 #include "qgslayoutatlas.h"
26 
28  : QgsPanelWidget( parent )
29  , mLayout( layout )
30 {
31  Q_ASSERT( mLayout );
32 
33  setupUi( this );
34  setPanelTitle( tr( "Layout Properties" ) );
35  blockSignals( true );
36 
37  mVariableEditor->setMinimumHeight( mVariableEditor->fontMetrics().height() * 15 );
38 
39  updateSnappingElements();
40 
41  mGridSpacingUnitsCombo->linkToWidget( mGridResolutionSpinBox );
42  mGridOffsetUnitsComboBox->linkToWidget( mOffsetXSpinBox );
43  mGridOffsetUnitsComboBox->linkToWidget( mOffsetYSpinBox );
44 
45  blockSignals( false );
46 
47  connect( mSnapToleranceSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsLayoutPropertiesWidget::snapToleranceChanged );
48 
49  connect( mGridOffsetUnitsComboBox, &QgsLayoutUnitsComboBox::changed, this, &QgsLayoutPropertiesWidget::gridOffsetUnitsChanged );
50  connect( mGridSpacingUnitsCombo, &QgsLayoutUnitsComboBox::changed, this, &QgsLayoutPropertiesWidget::gridResolutionUnitsChanged );
51  connect( mGridResolutionSpinBox, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, &QgsLayoutPropertiesWidget::gridResolutionChanged );
52  connect( mOffsetXSpinBox, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, &QgsLayoutPropertiesWidget::gridOffsetXChanged );
53  connect( mOffsetYSpinBox, static_cast < void ( QgsDoubleSpinBox::* )( double ) > ( &QgsDoubleSpinBox::valueChanged ), this, &QgsLayoutPropertiesWidget::gridOffsetYChanged );
54 
55  double leftMargin = mLayout->customProperty( QStringLiteral( "resizeToContentsLeftMargin" ) ).toDouble();
56  double topMargin = mLayout->customProperty( QStringLiteral( "resizeToContentsTopMargin" ) ).toDouble();
57  double bottomMargin = mLayout->customProperty( QStringLiteral( "resizeToContentsBottomMargin" ) ).toDouble();
58  double rightMargin = mLayout->customProperty( QStringLiteral( "resizeToContentsRightMargin" ) ).toDouble();
59  QgsUnitTypes::LayoutUnit marginUnit = static_cast< QgsUnitTypes::LayoutUnit >(
60  mLayout->customProperty( QStringLiteral( "imageCropMarginUnit" ), QgsUnitTypes::LayoutMillimeters ).toInt() );
61 
62  bool exportWorldFile = mLayout->customProperty( QStringLiteral( "exportWorldFile" ), false ).toBool();
63  mGenerateWorldFileCheckBox->setChecked( exportWorldFile );
64  connect( mGenerateWorldFileCheckBox, &QCheckBox::toggled, this, &QgsLayoutPropertiesWidget::worldFileToggled );
65 
66  connect( mRasterizeCheckBox, &QCheckBox::toggled, this, &QgsLayoutPropertiesWidget::rasterizeToggled );
67  connect( mForceVectorCheckBox, &QCheckBox::toggled, this, &QgsLayoutPropertiesWidget::forceVectorToggled );
68 
69  mTopMarginSpinBox->setValue( topMargin );
70  mMarginUnitsComboBox->linkToWidget( mTopMarginSpinBox );
71  mRightMarginSpinBox->setValue( rightMargin );
72  mMarginUnitsComboBox->linkToWidget( mRightMarginSpinBox );
73  mBottomMarginSpinBox->setValue( bottomMargin );
74  mMarginUnitsComboBox->linkToWidget( mBottomMarginSpinBox );
75  mLeftMarginSpinBox->setValue( leftMargin );
76  mMarginUnitsComboBox->linkToWidget( mLeftMarginSpinBox );
77  mMarginUnitsComboBox->setUnit( marginUnit );
78  mMarginUnitsComboBox->setConverter( &mLayout->renderContext().measurementConverter() );
79 
80  connect( mTopMarginSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutPropertiesWidget::resizeMarginsChanged );
81  connect( mRightMarginSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutPropertiesWidget::resizeMarginsChanged );
82  connect( mBottomMarginSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutPropertiesWidget::resizeMarginsChanged );
83  connect( mLeftMarginSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutPropertiesWidget::resizeMarginsChanged );
84  connect( mResizePageButton, &QPushButton::clicked, this, &QgsLayoutPropertiesWidget::resizeToContents );
85 
86  connect( mResolutionSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsLayoutPropertiesWidget::dpiChanged );
87 
88  mReferenceMapComboBox->setCurrentLayout( mLayout );
89  mReferenceMapComboBox->setItemType( QgsLayoutItemRegistry::LayoutMap );
90  connect( mReferenceMapComboBox, &QgsLayoutItemComboBox::itemChanged, this, &QgsLayoutPropertiesWidget::referenceMapChanged );
91 
92  connect( mLayout, &QgsLayout::changed, this, &QgsLayoutPropertiesWidget::updateGui );
93 
94  updateVariables();
95  connect( mVariableEditor, &QgsVariableEditorWidget::scopeChanged, this, &QgsLayoutPropertiesWidget::variablesChanged );
96  // listen out for variable edits
97  connect( QgsApplication::instance(), &QgsApplication::customVariablesChanged, this, &QgsLayoutPropertiesWidget::updateVariables );
98  connect( QgsProject::instance(), &QgsProject::customVariablesChanged, this, &QgsLayoutPropertiesWidget::updateVariables );
99  connect( QgsProject::instance(), &QgsProject::metadataChanged, this, &QgsLayoutPropertiesWidget::updateVariables );
100  connect( &mLayout->renderContext(), &QgsLayoutRenderContext::dpiChanged, this, &QgsLayoutPropertiesWidget::updateVariables );
101  connect( mLayout->pageCollection(), &QgsLayoutPageCollection::changed, this, &QgsLayoutPropertiesWidget::updateVariables );
102  connect( mLayout, &QgsLayout::variablesChanged, this, &QgsLayoutPropertiesWidget::updateVariables );
103 
104  updateGui();
105 }
106 
108 {
109  if ( QgsPrintLayout *printLayout = dynamic_cast< QgsPrintLayout * >( masterLayout ) )
110  {
111  connect( printLayout, &QgsPrintLayout::nameChanged, this, &QgsLayoutPropertiesWidget::updateVariables );
112  connect( printLayout->atlas(), &QgsLayoutAtlas::coverageLayerChanged, this, &QgsLayoutPropertiesWidget::updateVariables );
113  }
114 }
115 
117 {
118  whileBlocking( mReferenceMapComboBox )->setItem( mLayout->referenceMap() );
119  whileBlocking( mResolutionSpinBox )->setValue( mLayout->renderContext().dpi() );
120 
121  bool rasterize = mLayout->customProperty( QStringLiteral( "rasterize" ), false ).toBool();
122  whileBlocking( mRasterizeCheckBox )->setChecked( rasterize );
123 
124  bool forceVectors = mLayout->customProperty( QStringLiteral( "forceVector" ), false ).toBool();
125  whileBlocking( mForceVectorCheckBox )->setChecked( forceVectors );
126 
127  if ( rasterize )
128  {
129  mForceVectorCheckBox->setChecked( false );
130  mForceVectorCheckBox->setEnabled( false );
131  }
132  else
133  {
134  mForceVectorCheckBox->setEnabled( true );
135  }
136 }
137 
138 void QgsLayoutPropertiesWidget::updateSnappingElements()
139 {
140  mSnapToleranceSpinBox->setValue( mLayout->snapper().snapTolerance() );
141 
142  mGridSpacingUnitsCombo->setUnit( mLayout->gridSettings().resolution().units() );
143  mGridResolutionSpinBox->setValue( mLayout->gridSettings().resolution().length() );
144 
145  mGridOffsetUnitsComboBox->setUnit( mLayout->gridSettings().offset().units() );
146  mOffsetXSpinBox->setValue( mLayout->gridSettings().offset().x() );
147  mOffsetYSpinBox->setValue( mLayout->gridSettings().offset().y() );
148 }
149 
150 void QgsLayoutPropertiesWidget::gridResolutionChanged( double d )
151 {
153  m.setLength( d );
154  mLayout->gridSettings().setResolution( m );
155  mLayout->pageCollection()->redraw();
156 }
157 
158 void QgsLayoutPropertiesWidget::gridResolutionUnitsChanged( QgsUnitTypes::LayoutUnit unit )
159 {
161  m.setUnits( unit );
162  mLayout->gridSettings().setResolution( m );
163  mLayout->pageCollection()->redraw();
164 }
165 
166 void QgsLayoutPropertiesWidget::gridOffsetXChanged( double d )
167 {
168  QgsLayoutPoint o = mLayout->gridSettings().offset();
169  o.setX( d );
170  mLayout->gridSettings().setOffset( o );
171  mLayout->pageCollection()->redraw();
172 }
173 
174 void QgsLayoutPropertiesWidget::gridOffsetYChanged( double d )
175 {
176  QgsLayoutPoint o = mLayout->gridSettings().offset();
177  o.setY( d );
178  mLayout->gridSettings().setOffset( o );
179  mLayout->pageCollection()->redraw();
180 }
181 
182 void QgsLayoutPropertiesWidget::gridOffsetUnitsChanged( QgsUnitTypes::LayoutUnit unit )
183 {
184  QgsLayoutPoint o = mLayout->gridSettings().offset();
185  o.setUnits( unit );
186  mLayout->gridSettings().setOffset( o );
187  mLayout->pageCollection()->redraw();
188 }
189 
190 void QgsLayoutPropertiesWidget::snapToleranceChanged( int tolerance )
191 {
192  mLayout->snapper().setSnapTolerance( tolerance );
193 }
194 
195 void QgsLayoutPropertiesWidget::resizeMarginsChanged()
196 {
197  mLayout->setCustomProperty( QStringLiteral( "resizeToContentsLeftMargin" ), mLeftMarginSpinBox->value() );
198  mLayout->setCustomProperty( QStringLiteral( "resizeToContentsTopMargin" ), mTopMarginSpinBox->value() );
199  mLayout->setCustomProperty( QStringLiteral( "resizeToContentsBottomMargin" ), mBottomMarginSpinBox->value() );
200  mLayout->setCustomProperty( QStringLiteral( "resizeToContentsRightMargin" ), mRightMarginSpinBox->value() );
201  mLayout->setCustomProperty( QStringLiteral( "imageCropMarginUnit" ), mMarginUnitsComboBox->unit() );
202 }
203 
204 void QgsLayoutPropertiesWidget::resizeToContents()
205 {
206  mLayout->undoStack()->beginMacro( tr( "Resize to Contents" ) );
207 
208  mLayout->pageCollection()->resizeToContents( QgsMargins( mLeftMarginSpinBox->value(),
209  mTopMarginSpinBox->value(),
210  mRightMarginSpinBox->value(),
211  mBottomMarginSpinBox->value() ),
212  mMarginUnitsComboBox->unit() );
213 
214  mLayout->undoStack()->endMacro();
215 }
216 
217 void QgsLayoutPropertiesWidget::referenceMapChanged( QgsLayoutItem *item )
218 {
219  mLayout->undoStack()->beginCommand( mLayout, tr( "Set Reference Map" ) );
220  QgsLayoutItemMap *map = qobject_cast< QgsLayoutItemMap * >( item );
221  mLayout->setReferenceMap( map );
222  mLayout->undoStack()->endCommand();
223 }
224 
225 void QgsLayoutPropertiesWidget::dpiChanged( int value )
226 {
227  mLayout->undoStack()->beginCommand( mLayout, tr( "Set Default DPI" ), QgsLayout::UndoLayoutDpi );
228  mLayout->renderContext().setDpi( value );
229  mLayout->undoStack()->endCommand();
230 }
231 
232 void QgsLayoutPropertiesWidget::worldFileToggled()
233 {
234  mLayout->setCustomProperty( QStringLiteral( "exportWorldFile" ), mGenerateWorldFileCheckBox->isChecked() );
235 }
236 
237 void QgsLayoutPropertiesWidget::rasterizeToggled()
238 {
239  mLayout->setCustomProperty( QStringLiteral( "rasterize" ), mRasterizeCheckBox->isChecked() );
240 
241  if ( mRasterizeCheckBox->isChecked() )
242  {
243  mForceVectorCheckBox->setChecked( false );
244  mForceVectorCheckBox->setEnabled( false );
245  }
246  else
247  {
248  mForceVectorCheckBox->setEnabled( true );
249  }
250 }
251 
252 void QgsLayoutPropertiesWidget::forceVectorToggled()
253 {
254  mLayout->setCustomProperty( QStringLiteral( "forceVector" ), mForceVectorCheckBox->isChecked() );
255 }
256 
257 void QgsLayoutPropertiesWidget::variablesChanged()
258 {
259  mBlockVariableUpdates = true;
260  QgsExpressionContextUtils::setLayoutVariables( mLayout, mVariableEditor->variablesInActiveScope() );
261  mBlockVariableUpdates = false;
262 }
263 
264 void QgsLayoutPropertiesWidget::updateVariables()
265 {
266  if ( mBlockVariableUpdates )
267  return;
268 
269  QgsExpressionContext context;
273  mVariableEditor->setContext( &context );
274  mVariableEditor->setEditableScopeIndex( 2 );
275 }
276 
277 void QgsLayoutPropertiesWidget::blockSignals( bool block )
278 {
279  mGridResolutionSpinBox->blockSignals( block );
280  mOffsetXSpinBox->blockSignals( block );
281  mOffsetYSpinBox->blockSignals( block );
282  mSnapToleranceSpinBox->blockSignals( block );
283 }
284 
The QgsSpinBox is a spin box with a clear button that will set the value to the defined clear value...
void setDpi(double dpi)
Sets the dpi for outputting the layout.
QgsUnitTypes::LayoutUnit units() const
Returns the units for the measurement.
Base class for graphical items within a QgsLayout.
static QgsApplication * instance()
Returns the singleton instance of the QgsApplication.
void setY(const double y)
Sets y coordinate of point.
void customVariablesChanged()
Emitted whenever a custom global variable changes.
QgsLayoutUndoStack * undoStack()
Returns a pointer to the layout&#39;s undo stack, which manages undo/redo states for the layout and it&#39;s ...
Definition: qgslayout.cpp:685
Change layout default DPI.
Definition: qgslayout.h:71
QVariant customProperty(const QString &key, const QVariant &defaultValue=QVariant()) const
Read a custom property from the layout.
Definition: qgslayout.cpp:414
void resizeToContents(const QgsMargins &margins, QgsUnitTypes::LayoutUnit marginUnits)
Resizes the layout to a single page which fits the current contents of the layout.
QgsLayoutSnapper & snapper()
Returns a reference to the layout&#39;s snapper, which stores handles layout snap grids and lines and sna...
Definition: qgslayout.h:406
void metadataChanged()
Emitted when the project&#39;s metadata is changed.
Base class for any widget that can be shown as a inline panel.
void changed()
Emitted when pages are added or removed from the collection.
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
static void setLayoutVariables(QgsLayout *layout, const QVariantMap &variables)
Sets all layout context variables.
void updateGui()
Refreshes the gui to reflect the current layout settings.
QgsLayoutRenderContext & renderContext()
Returns a reference to the layout&#39;s render context, which stores information relating to the current ...
Definition: qgslayout.cpp:358
void dpiChanged()
Emitted when the context&#39;s DPI is changed.
void setResolution(QgsLayoutMeasurement resolution)
Sets the page/snap grid resolution.
This class provides a method of storing points, consisting of an x and y coordinate, for use in QGIS layouts.
void scopeChanged()
Emitted when the user has modified a scope using the widget.
void setX(const double x)
Sets the x coordinate of point.
QgsUnitTypes::LayoutUnit units() const
Returns the units for the point.
Layout graphical items for displaying a map.
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context...
void endCommand()
Saves final state of an object and pushes the active command to the undo history. ...
void setMasterLayout(QgsMasterLayoutInterface *masterLayout)
Sets the master layout.
void setLength(const double length)
Sets the length of the measurement.
void variablesChanged()
Emitted whenever the expression variables stored in the layout have been changed. ...
This class provides a method of storing measurements for use in QGIS layouts using a variety of diffe...
QgsLayoutMeasurement resolution() const
Returns the page/snap grid resolution.
QgsLayoutPageCollection * pageCollection()
Returns a pointer to the layout&#39;s page collection, which stores and manages page items in the layout...
Definition: qgslayout.cpp:458
QgsLayoutGridSettings & gridSettings()
Returns a reference to the layout&#39;s grid settings, which stores settings relating to grid appearance...
Definition: qgslayout.h:418
double dpi() const
Returns the dpi for outputting the layout.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
double y() const
Returns y coordinate of point.
void setOffset(const QgsLayoutPoint &offset)
Sets the offset of the page/snap grid.
double x() const
Returns x coordinate of point.
void redraw()
Triggers a redraw for all pages.
void changed(QgsUnitTypes::LayoutUnit unit)
Emitted when the unit is changed.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition: qgslayout.h:49
void beginMacro(const QString &commandText)
Starts a macro command, with the given descriptive commandText.
void itemChanged(QgsLayoutItem *item)
Emitted whenever the currently selected item changes.
void beginCommand(QgsLayoutUndoObjectInterface *object, const QString &commandText, int id=0)
Begins a new undo command for the specified object.
void setUnits(const QgsUnitTypes::LayoutUnit units)
Sets the units for the measurement.
QgsLayoutPoint offset() const
Returns the offset of the page/snap grid.
QgsLayoutItemMap * referenceMap() const
Returns the map item which will be used to generate corresponding world files when the layout is expo...
Definition: qgslayout.cpp:429
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
Definition: qgis.h:262
double length() const
Returns the length of the measurement.
void customVariablesChanged()
Emitted whenever the expression variables stored in the project have been changed.
const QgsLayoutMeasurementConverter & measurementConverter() const
Returns the layout measurement converter to be used in the layout.
void setUnits(const QgsUnitTypes::LayoutUnit units)
Sets the units for the point.
static QgsExpressionContextScope * layoutScope(const QgsLayout *layout)
Creates a new scope which contains variables and functions relating to a QgsLayout layout...
static QgsProject * instance()
Returns the QgsProject singleton instance.
Definition: qgsproject.cpp:450
void nameChanged(const QString &name)
Emitted when the layout&#39;s name is changed.
void setReferenceMap(QgsLayoutItemMap *map)
Sets the map item which will be used to generate corresponding world files when the layout is exporte...
Definition: qgslayout.cpp:452
void setCustomProperty(const QString &key, const QVariant &value)
Set a custom property for the layout.
Definition: qgslayout.cpp:406
void setSnapTolerance(int snapTolerance)
Sets the snap tolerance (in pixels) to use when snapping.
LayoutUnit
Layout measurement units.
Definition: qgsunittypes.h:159
int snapTolerance() const
Returns the snap tolerance (in pixels) to use when snapping.
Print layout, a QgsLayout subclass for static or atlas-based layouts.
void endMacro()
Ends a macro command.
void changed()
Emitted when properties of the layout change.
Interface for master layout type objects, such as print layouts and reports.
void setPanelTitle(const QString &panelTitle)
Set the title of the panel when shown in the interface.
QgsLayoutPropertiesWidget(QWidget *parent, QgsLayout *layout)
constructor
The QgsMargins class defines the four margins of a rectangle.
Definition: qgsmargins.h:37
void coverageLayerChanged(QgsVectorLayer *layer)
Emitted when the coverage layer for the atlas changes.