QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
qgslayoutaddpagesdialog.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayoutaddpagesdialog.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 "qgspagesizeregistry.h"
18 #include "qgssettings.h"
19 #include "qgslayout.h"
22 #include "qgshelp.h"
23 
24 QgsLayoutAddPagesDialog::QgsLayoutAddPagesDialog( QWidget *parent, Qt::WindowFlags flags )
25  : QDialog( parent, flags )
26 {
27  setupUi( this );
28 
29  mPageOrientationComboBox->addItem( tr( "Portrait" ), QgsLayoutItemPage::Portrait );
30  mPageOrientationComboBox->addItem( tr( "Landscape" ), QgsLayoutItemPage::Landscape );
31  mPageOrientationComboBox->setCurrentIndex( 1 );
32 
33  const auto constEntries = QgsApplication::pageSizeRegistry()->entries();
34  for ( const QgsPageSize &size : constEntries )
35  {
36  mPageSizeComboBox->addItem( size.displayName, size.name );
37  }
38  mPageSizeComboBox->addItem( tr( "Custom" ) );
39  mPageSizeComboBox->setCurrentIndex( mPageSizeComboBox->findData( QStringLiteral( "A4" ) ) );
40  pageSizeChanged( mPageSizeComboBox->currentIndex() );
41  orientationChanged( 1 );
42 
43  mSizeUnitsComboBox->linkToWidget( mWidthSpin );
44  mSizeUnitsComboBox->linkToWidget( mHeightSpin );
45 
46  mLockAspectRatio->setWidthSpinBox( mWidthSpin );
47  mLockAspectRatio->setHeightSpinBox( mHeightSpin );
48 
49  connect( mPositionComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutAddPagesDialog::positionChanged );
50  mExistingPageSpinBox->setEnabled( false );
51 
52  connect( mPageSizeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutAddPagesDialog::pageSizeChanged );
53  connect( mPageOrientationComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutAddPagesDialog::orientationChanged );
54 
55  connect( mWidthSpin, static_cast< void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutAddPagesDialog::setToCustomSize );
56  connect( mHeightSpin, static_cast< void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutAddPagesDialog::setToCustomSize );
57 
58  connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsLayoutAddPagesDialog::showHelp );
59 }
60 
62 {
63  mConverter = layout->renderContext().measurementConverter();
64  mSizeUnitsComboBox->setConverter( &mConverter );
65  mExistingPageSpinBox->setMaximum( layout->pageCollection()->pageCount() );
66  mSizeUnitsComboBox->setUnit( layout->units() );
67 }
68 
70 {
71  return mPagesSpinBox->value();
72 }
73 
75 {
76  return static_cast< PagePosition >( mPositionComboBox->currentIndex() );
77 }
78 
80 {
81  return mExistingPageSpinBox->value();
82 }
83 
85 {
86  return QgsLayoutSize( mWidthSpin->value(), mHeightSpin->value(), mSizeUnitsComboBox->unit() );
87 }
88 
89 void QgsLayoutAddPagesDialog::positionChanged( int index )
90 {
91  mExistingPageSpinBox->setEnabled( index != 2 );
92 }
93 
94 void QgsLayoutAddPagesDialog::pageSizeChanged( int )
95 {
96  if ( mPageSizeComboBox->currentData().toString().isEmpty() )
97  {
98  //custom size
99  mLockAspectRatio->setEnabled( true );
100  mSizeUnitsComboBox->setEnabled( true );
101  mPageOrientationComboBox->setEnabled( false );
102  }
103  else
104  {
105  mLockAspectRatio->setEnabled( false );
106  mLockAspectRatio->setLocked( false );
107  mSizeUnitsComboBox->setEnabled( false );
108  mPageOrientationComboBox->setEnabled( true );
109  QgsPageSize size = QgsApplication::pageSizeRegistry()->find( mPageSizeComboBox->currentData().toString() ).value( 0 );
110  QgsLayoutSize convertedSize = mConverter.convert( size.size, mSizeUnitsComboBox->unit() );
111  mSettingPresetSize = true;
112  switch ( mPageOrientationComboBox->currentData().toInt() )
113  {
115  mWidthSpin->setValue( convertedSize.height() );
116  mHeightSpin->setValue( convertedSize.width() );
117  break;
118 
120  mWidthSpin->setValue( convertedSize.width() );
121  mHeightSpin->setValue( convertedSize.height() );
122  break;
123  }
124  mSettingPresetSize = false;
125  }
126 }
127 
128 void QgsLayoutAddPagesDialog::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 
155 void QgsLayoutAddPagesDialog::setToCustomSize()
156 {
157  if ( mSettingPresetSize )
158  return;
159  whileBlocking( mPageSizeComboBox )->setCurrentIndex( mPageSizeComboBox->count() - 1 );
160  mPageOrientationComboBox->setEnabled( false );
161  mLockAspectRatio->setEnabled( true );
162  mSizeUnitsComboBox->setEnabled( true );
163 }
164 
165 void QgsLayoutAddPagesDialog::showHelp()
166 {
167  QgsHelp::openHelp( QStringLiteral( "print_composer/overview_composer.html#working-with-the-page-properties" ) );
168 }
QgsLayoutRenderContext::measurementConverter
const QgsLayoutMeasurementConverter & measurementConverter() const
Returns the layout measurement converter to be used in the layout.
Definition: qgslayoutrendercontext.h:129
QgsApplication::pageSizeRegistry
static QgsPageSizeRegistry * pageSizeRegistry()
Returns the application's page size registry, used for managing layout page sizes.
Definition: qgsapplication.cpp:2263
QgsLayoutSize::width
double width() const
Returns the width of the size.
Definition: qgslayoutsize.h:76
QgsPageSizeRegistry::entries
QList< QgsPageSize > entries() const
Returns a list of page sizes in the registry.
Definition: qgspagesizeregistry.cpp:66
QgsLayout::units
QgsUnitTypes::LayoutUnit units() const
Returns the native units for the layout.
Definition: qgslayout.h:328
QgsLayoutAddPagesDialog::PagePosition
PagePosition
Page insertion positions.
Definition: qgslayoutaddpagesdialog.h:46
QgsLayoutAddPagesDialog::QgsLayoutAddPagesDialog
QgsLayoutAddPagesDialog(QWidget *parent=nullptr, Qt::WindowFlags flags=Qt::WindowFlags())
Constructor for QgsLayoutAddPagesDialog.
Definition: qgslayoutaddpagesdialog.cpp:24
QgsLayoutMeasurementConverter::convert
QgsLayoutMeasurement convert(QgsLayoutMeasurement measurement, QgsUnitTypes::LayoutUnit targetUnits) const
Converts a measurement from one unit to another.
Definition: qgslayoutmeasurementconverter.cpp:21
QgsPageSizeRegistry::find
QList< QgsPageSize > find(const QString &name) const
Finds matching page sizes from the registry, using a case insensitive match on the page size name.
Definition: qgspagesizeregistry.cpp:77
qgslayoutaddpagesdialog.h
qgslayoutmeasurementconverter.h
QgsLayout::renderContext
QgsLayoutRenderContext & renderContext()
Returns a reference to the layout's render context, which stores information relating to the current ...
Definition: qgslayout.cpp:359
QgsPageSize
A named page size for layouts.
Definition: qgspagesizeregistry.h:33
whileBlocking
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
Definition: qgis.h:262
QgsLayoutItemPage::Landscape
@ Landscape
Landscape orientation.
Definition: qgslayoutitempage.h:65
QgsLayoutAddPagesDialog::pagePosition
PagePosition pagePosition() const
Returns the position at which to insert the new pages.
Definition: qgslayoutaddpagesdialog.cpp:74
QgsLayoutAddPagesDialog::numberPages
int numberPages() const
Returns the number of pages to insert.
Definition: qgslayoutaddpagesdialog.cpp:69
qgslayout.h
qgspagesizeregistry.h
QgsLayoutSize::height
double height() const
Returns the height of the size.
Definition: qgslayoutsize.h:90
QgsLayoutAddPagesDialog::beforePage
int beforePage() const
Returns the page number for which new pages should be inserted before/after.
Definition: qgslayoutaddpagesdialog.cpp:79
QgsLayout::pageCollection
QgsLayoutPageCollection * pageCollection()
Returns a pointer to the layout's page collection, which stores and manages page items in the layout.
Definition: qgslayout.cpp:459
QgsLayout
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition: qgslayout.h:50
QgsHelp::openHelp
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Definition: qgshelp.cpp:36
QgsLayoutAddPagesDialog::pageSize
QgsLayoutSize pageSize() const
Returns the desired page size.
Definition: qgslayoutaddpagesdialog.cpp:84
QgsLayoutItemPage::Portrait
@ Portrait
Portrait orientation.
Definition: qgslayoutitempage.h:64
qgssettings.h
qgslayoutpagecollection.h
QgsLayoutSize
This class provides a method of storing sizes, consisting of a width and height, for use in QGIS layo...
Definition: qgslayoutsize.h:41
QgsPageSize::size
QgsLayoutSize size
Page size.
Definition: qgspagesizeregistry.h:54
QgsLayoutPageCollection::pageCount
int pageCount() const
Returns the number of pages in the collection.
Definition: qgslayoutpagecollection.cpp:455
QgsLayoutAddPagesDialog::setLayout
void setLayout(QgsLayout *layout)
Sets the layout associated with the dialog.
Definition: qgslayoutaddpagesdialog.cpp:61
qgshelp.h