QGIS API Documentation  3.12.1-BucureČ™ti (121cc00ff0)
qgslayoutpagepropertieswidget.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayoutpagepropertieswidget.cpp
3  ---------------------------------
4  Date : July 2017
5  Copyright : (C) 2017 Nyall Dawson
6  Email : nyall dot dawson at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
17 #include "qgsapplication.h"
18 #include "qgspagesizeregistry.h"
19 #include "qgslayoutitempage.h"
20 #include "qgslayout.h"
22 #include "qgslayoutundostack.h"
23 #include "qgsvectorlayer.h"
24 
26  : QgsLayoutItemBaseWidget( parent, layoutItem )
27  , mPage( static_cast< QgsLayoutItemPage *>( layoutItem ) )
28 {
29  setupUi( this );
30 
31  mPageOrientationComboBox->addItem( tr( "Portrait" ), QgsLayoutItemPage::Portrait );
32  mPageOrientationComboBox->addItem( tr( "Landscape" ), QgsLayoutItemPage::Landscape );
33 
34  const auto constEntries = QgsApplication::pageSizeRegistry()->entries();
35  for ( const QgsPageSize &size : constEntries )
36  {
37  mPageSizeComboBox->addItem( size.displayName, size.name );
38  }
39  mPageSizeComboBox->addItem( tr( "Custom" ) );
40 
41  mWidthSpin->setValue( mPage->pageSize().width() );
42  mHeightSpin->setValue( mPage->pageSize().height() );
43  mSizeUnitsComboBox->setUnit( mPage->pageSize().units() );
44  mExcludePageCheckBox->setChecked( mPage->excludeFromExports() );
45 
46  mPageOrientationComboBox->setCurrentIndex( mPageOrientationComboBox->findData( mPage->orientation() ) );
47 
48  mSizeUnitsComboBox->linkToWidget( mWidthSpin );
49  mSizeUnitsComboBox->linkToWidget( mHeightSpin );
50  mSizeUnitsComboBox->setConverter( &mPage->layout()->renderContext().measurementConverter() );
51 
52  mLockAspectRatio->setWidthSpinBox( mWidthSpin );
53  mLockAspectRatio->setHeightSpinBox( mHeightSpin );
54 
55  mSymbolButton->setSymbolType( QgsSymbol::Fill );
56  mSymbolButton->setSymbol( mPage->pageStyleSymbol()->clone() );
57 
58  connect( mPageSizeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutPagePropertiesWidget::pageSizeChanged );
59  connect( mPageOrientationComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutPagePropertiesWidget::orientationChanged );
60 
61  connect( mWidthSpin, static_cast< void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutPagePropertiesWidget::updatePageSize );
62  connect( mHeightSpin, static_cast< void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutPagePropertiesWidget::updatePageSize );
63  connect( mWidthSpin, static_cast< void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutPagePropertiesWidget::setToCustomSize );
64  connect( mHeightSpin, static_cast< void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutPagePropertiesWidget::setToCustomSize );
65  connect( mExcludePageCheckBox, &QCheckBox::toggled, this, &QgsLayoutPagePropertiesWidget::excludeExportsToggled );
66 
67  connect( mSymbolButton, &QgsSymbolButton::changed, this, &QgsLayoutPagePropertiesWidget::symbolChanged );
73 
74  connect( mPaperSizeDDBtn, &QgsPropertyOverrideButton::changed, this, &QgsLayoutPagePropertiesWidget::refreshLayout );
75  connect( mWidthDDBtn, &QgsPropertyOverrideButton::changed, this, &QgsLayoutPagePropertiesWidget::refreshLayout );
76  connect( mHeightDDBtn, &QgsPropertyOverrideButton::changed, this, &QgsLayoutPagePropertiesWidget::refreshLayout );
77  connect( mOrientationDDBtn, &QgsPropertyOverrideButton::changed, this, &QgsLayoutPagePropertiesWidget::refreshLayout );
78 
79  mExcludePageDDBtn->registerEnabledWidget( mExcludePageCheckBox, false );
80 
81  mSymbolButton->registerExpressionContextGenerator( mPage );
82  mSymbolButton->setLayer( coverageLayer() );
83  if ( mPage->layout() )
84  {
86  }
87 
88  showCurrentPageSize();
89 }
90 
91 void QgsLayoutPagePropertiesWidget::pageSizeChanged( int )
92 {
93  mBlockPageUpdate = true;
94  if ( mPageSizeComboBox->currentData().toString().isEmpty() )
95  {
96  //custom size
97  mLockAspectRatio->setEnabled( true );
98  mSizeUnitsComboBox->setEnabled( true );
99  mPageOrientationComboBox->setEnabled( false );
100  }
101  else
102  {
103  mLockAspectRatio->setEnabled( false );
104  mLockAspectRatio->setLocked( false );
105  mSizeUnitsComboBox->setEnabled( false );
106  mPageOrientationComboBox->setEnabled( true );
107  QgsPageSize size = QgsApplication::pageSizeRegistry()->find( mPageSizeComboBox->currentData().toString() ).value( 0 );
108  QgsLayoutSize convertedSize = mConverter.convert( size.size, mSizeUnitsComboBox->unit() );
109  mSettingPresetSize = true;
110  switch ( mPageOrientationComboBox->currentData().toInt() )
111  {
113  mWidthSpin->setValue( convertedSize.height() );
114  mHeightSpin->setValue( convertedSize.width() );
115  break;
116 
118  mWidthSpin->setValue( convertedSize.width() );
119  mHeightSpin->setValue( convertedSize.height() );
120  break;
121  }
122  mSettingPresetSize = false;
123  }
124  mBlockPageUpdate = false;
125  updatePageSize();
126 }
127 
128 void QgsLayoutPagePropertiesWidget::orientationChanged( int )
129 {
130  if ( mPageSizeComboBox->currentData().toString().isEmpty() )
131  return;
132 
133  double width = mWidthSpin->value();
134  double height = mHeightSpin->value();
135  switch ( mPageOrientationComboBox->currentData().toInt() )
136  {
138  if ( width < height )
139  {
140  whileBlocking( mWidthSpin )->setValue( height );
141  whileBlocking( mHeightSpin )->setValue( width );
142  }
143  break;
144 
146  if ( width > height )
147  {
148  whileBlocking( mWidthSpin )->setValue( height );
149  whileBlocking( mHeightSpin )->setValue( width );
150  }
151  break;
152  }
153 
154  updatePageSize();
155 }
156 
157 void QgsLayoutPagePropertiesWidget::updatePageSize()
158 {
159  if ( mBlockPageUpdate )
160  return;
161 
162  mPage->layout()->undoStack()->beginMacro( tr( "Change Page Size" ) );
164  mPage->layout()->undoStack()->beginCommand( mPage, tr( "Change Page Size" ), 1 + mPage->layout()->pageCollection()->pageNumber( mPage ) );
165  mPage->setPageSize( QgsLayoutSize( mWidthSpin->value(), mHeightSpin->value(), mSizeUnitsComboBox->unit() ) );
166  mPage->layout()->undoStack()->endCommand();
167  mPage->layout()->pageCollection()->reflow();
168  mPage->layout()->pageCollection()->endPageSizeChange();
169  mPage->layout()->undoStack()->endMacro();
170 
171  refreshLayout();
172  emit pageOrientationChanged();
173 }
174 
175 void QgsLayoutPagePropertiesWidget::setToCustomSize()
176 {
177  if ( mSettingPresetSize )
178  return;
179  whileBlocking( mPageSizeComboBox )->setCurrentIndex( mPageSizeComboBox->count() - 1 );
180  mPageOrientationComboBox->setEnabled( false );
181 }
182 
183 void QgsLayoutPagePropertiesWidget::symbolChanged()
184 {
185  mPage->layout()->undoStack()->beginCommand( mPage->layout()->pageCollection(), tr( "Change Page Background" ), QgsLayoutItemPage::UndoPageSymbol );
186  mPage->setPageStyleSymbol( static_cast< QgsFillSymbol * >( mSymbolButton->symbol() )->clone() );
187  mPage->layout()->undoStack()->endCommand();
188 }
189 
190 void QgsLayoutPagePropertiesWidget::excludeExportsToggled( bool checked )
191 {
192  mPage->beginCommand( !checked ? tr( "Include Page in Exports" ) : tr( "Exclude Page from Exports" ) );
193  mPage->setExcludeFromExports( checked );
194  mPage->endCommand();
195 }
196 
197 void QgsLayoutPagePropertiesWidget::refreshLayout()
198 {
199  mPage->layout()->refresh();
200 }
201 
202 void QgsLayoutPagePropertiesWidget::showCurrentPageSize()
203 {
204  QgsLayoutSize paperSize = mPage->pageSize();
205  QString pageSize = QgsApplication::pageSizeRegistry()->find( paperSize );
206  if ( !pageSize.isEmpty() )
207  {
208  whileBlocking( mPageSizeComboBox )->setCurrentIndex( mPageSizeComboBox->findData( pageSize ) );
209  mLockAspectRatio->setEnabled( false );
210  mLockAspectRatio->setLocked( false );
211  mSizeUnitsComboBox->setEnabled( false );
212  mPageOrientationComboBox->setEnabled( true );
213  }
214  else
215  {
216  // custom
217  whileBlocking( mPageSizeComboBox )->setCurrentIndex( mPageSizeComboBox->count() - 1 );
218  mLockAspectRatio->setEnabled( true );
219  mSizeUnitsComboBox->setEnabled( true );
220  mPageOrientationComboBox->setEnabled( false );
221  }
222 }
Portrait orientation.
void beginCommand(const QString &commandText, UndoCommand command=UndoNone)
Starts new undo command for this item.
int pageNumber(QgsLayoutItemPage *page) const
Returns the page number for the specified page, or -1 if the page is not contained in the collection...
Base class for graphical items within a QgsLayout.
Landscape orientation.
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
QgsLayoutMeasurement convert(QgsLayoutMeasurement measurement, QgsUnitTypes::LayoutUnit targetUnits) const
Converts a measurement from one unit to another.
Exclude item from exports.
Layout page symbol change.
void setPageStyleSymbol(QgsFillSymbol *symbol)
Sets the symbol to use for drawing the page background.
void changed()
Emitted when the symbol&#39;s settings are changed.
QgsLayoutPagePropertiesWidget(QWidget *parent, QgsLayoutItem *page)
Constructor for QgsLayoutPagePropertiesWidget.
void pageOrientationChanged()
Emitted when page orientation changes.
QgsLayoutRenderContext & renderContext()
Returns a reference to the layout&#39;s render context, which stores information relating to the current ...
Definition: qgslayout.cpp:358
QList< QgsPageSize > entries() const
Returns a list of page sizes in the registry.
QList< QgsPageSize > find(const QString &name) const
Finds matching page sizes from the registry, using a case insensitive match on the page size name...
void beginPageSizeChange()
Should be called before changing any page item sizes, and followed by a call to endPageSizeChange().
void registerDataDefinedButton(QgsPropertyOverrideButton *button, QgsLayoutObject::DataDefinedProperty property)
Registers a data defined button, setting up its initial value, connections and description.
const QgsFillSymbol * pageStyleSymbol() const
Returns the symbol to use for drawing the page background.
void setExcludeFromExports(bool exclude)
Sets whether the item should be excluded from layout exports and prints.
void endCommand()
Saves final state of an object and pushes the active command to the undo history. ...
const QgsLayout * layout() const
Returns the layout the object is attached to.
void endCommand()
Completes the current item command and push it onto the layout&#39;s undo stack.
void refresh()
Forces the layout, and all items contained within it, to refresh.
Definition: qgslayout.cpp:803
QgsFillSymbol * clone() const override
Returns a deep copy of this symbol.
Definition: qgssymbol.cpp:2134
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
Orientation orientation() const
Returns the page orientation.
QgsUnitTypes::LayoutUnit units() const
Returns the units for the size.
void layerChanged(QgsVectorLayer *layer)
Emitted when the context&#39;s layer is changed.
void beginMacro(const QString &commandText)
Starts a macro command, with the given descriptive commandText.
void beginCommand(QgsLayoutUndoObjectInterface *object, const QString &commandText, int id=0)
Begins a new undo command for the specified object.
QgsLayoutReportContext & reportContext()
Returns a reference to the layout&#39;s report context, which stores information relating to the current ...
Definition: qgslayout.cpp:368
void changed()
Emitted when property definition changes.
QgsVectorLayer * coverageLayer() const
Returns the current layout context coverage layer (if set).
QgsLayoutSize pageSize() const
Returns the size of the page.
Fill symbol.
Definition: qgssymbol.h:88
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
Definition: qgis.h:262
void setLayer(QgsVectorLayer *layer)
Sets a layer to associate with the widget.
const QgsLayoutMeasurementConverter & measurementConverter() const
Returns the layout measurement converter to be used in the layout.
A base class for property widgets for layout items.
static QgsPageSizeRegistry * pageSizeRegistry()
Returns the application&#39;s page size registry, used for managing layout page sizes.
A named page size for layouts.
Preset paper size for composition.
bool excludeFromExports() const
Returns whether the item should be excluded from layout exports and prints.
void setPageSize(const QgsLayoutSize &size)
Sets the size of the page.
void endPageSizeChange()
Should be called after changing any page item sizes, and preceded by a call to beginPageSizeChange()...
void endMacro()
Ends a macro command.
void reflow()
Forces the page collection to reflow the arrangement of pages, e.g.
This class provides a method of storing sizes, consisting of a width and height, for use in QGIS layo...
Definition: qgslayoutsize.h:40
QgsLayoutSize size
Page size.
double height() const
Returns the height of the size.
Definition: qgslayoutsize.h:90
Item representing the paper in a layout.
double width() const
Returns the width of the size.
Definition: qgslayoutsize.h:76