[FEATURE][composer] Add page name option for atlas

Page name can be set to either a field or expression derived from
the coverage layer, and is shown in the new atlas page combobox.
This commit is contained in:
Nyall Dawson 2015-08-03 16:05:39 +10:00
parent 5537e23f35
commit 69ac6771e8
7 changed files with 304 additions and 150 deletions

View File

@ -28,16 +28,6 @@ public:
*/
void setEnabled( bool enabled );
/** Returns the map used by the atlas
* @deprecated Use QgsComposerMap::atlasDriven() instead
*/
QgsComposerMap* composerMap() const /Deprecated/;
/** Sets the map used by the atlas
* @deprecated Use QgsComposerMap::setAtlasDriven( true ) instead
*/
void setComposerMap( QgsComposerMap* map ) /Deprecated/;
/** Returns true if the atlas is set to hide the coverage layer
* @returns true if coverage layer is hidden
* @see setHideCoverage
@ -48,27 +38,7 @@ public:
* @param hide set to true to hide the coverage layer
* @see hideCoverage
*/
void setHideCoverage( bool hide );
/** Returns whether the atlas map uses a fixed scale
* @deprecated since 2.4 Use QgsComposerMap::atlasScalingMode() instead
*/
bool fixedScale() const /Deprecated/;
/** Sets whether the atlas map should use a fixed scale
* @deprecated since 2.4 Use QgsComposerMap::setAtlasScalingMode() instead
*/
void setFixedScale( bool fixed ) /Deprecated/;
/** Returns the margin for the atlas map
* @deprecated Use QgsComposerMap::atlasMargin() instead
*/
float margin() const /Deprecated/;
/** Sets the margin for the atlas map
* @deprecated Use QgsComposerMap::setAtlasMargin( double ) instead
*/
void setMargin( float margin ) /Deprecated/;
void setHideCoverage( bool hide );
/** Returns the filename expression used for generating output filenames for each
* atlas page.
@ -107,6 +77,29 @@ public:
* @see coverageLayer
*/
void setCoverageLayer( QgsVectorLayer* layer );
/** Returns the expression used for calculating the page name.
* @returns expression string, or field name from coverage layer
* @see setPageNameExpression
* @see nameForPage
* @note added in QGIS 2.12
*/
QString pageNameExpression() const;
/** Sets the expression used for calculating the page name.
* @param pageNameExpression expression string, or field name from coverage layer
* @see pageNameExpression
* @note added in QGIS 2.12
*/
void setPageNameExpression( const QString& pageNameExpression );
/** Returns the calculated name for a specified atlas page number.
* @param pageNumber number of page, where 0 = first page
* @returns page name
* @see pageNameExpression
* @note added in QGIS 2.12
*/
QString nameForPage( int pageNumber ) const;
/** Returns whether the atlas will be exported to a single file. This is only
* applicable for PDF exports.
@ -146,9 +139,6 @@ public:
QString sortKeyAttributeName() const;
void setSortKeyAttributeName( QString fieldName );
int sortKeyAttributeIndex() const /Deprecated/;
void setSortKeyAttributeIndex( int idx ) /Deprecated/;
/** Returns the current list of predefined scales for the atlas. This is used
* for maps which are set to the predefined atlas scaling mode.
* @returns a vector of doubles representing predefined scales
@ -224,6 +214,41 @@ public:
/** Recalculates the bounds of an atlas driven map */
void prepareMap( QgsComposerMap* map );
//Deprecated methods
/** Returns the map used by the atlas
* @deprecated Use QgsComposerMap::atlasDriven() instead
*/
QgsComposerMap* composerMap() const /Deprecated/;
/** Sets the map used by the atlas
* @deprecated Use QgsComposerMap::setAtlasDriven( true ) instead
*/
void setComposerMap( QgsComposerMap* map ) /Deprecated/;
/** Returns whether the atlas map uses a fixed scale
* @deprecated since 2.4 Use QgsComposerMap::atlasScalingMode() instead
*/
bool fixedScale() const /Deprecated/;
/** Sets whether the atlas map should use a fixed scale
* @deprecated since 2.4 Use QgsComposerMap::setAtlasScalingMode() instead
*/
void setFixedScale( bool fixed ) /Deprecated/;
/** Returns the margin for the atlas map
* @deprecated Use QgsComposerMap::atlasMargin() instead
*/
float margin() const /Deprecated/;
/** Sets the margin for the atlas map
* @deprecated Use QgsComposerMap::setAtlasMargin( double ) instead
*/
void setMargin( float margin ) /Deprecated/;
int sortKeyAttributeIndex() const /Deprecated/;
void setSortKeyAttributeIndex( int idx ) /Deprecated/;
public slots:

View File

@ -35,6 +35,7 @@ QgsAtlasCompositionWidget::QgsAtlasCompositionWidget( QWidget* parent, QgsCompos
connect( mAtlasCoverageLayerComboBox, SIGNAL( layerChanged( QgsMapLayer* ) ), mAtlasSortFeatureKeyComboBox, SLOT( setLayer( QgsMapLayer* ) ) );
connect( mAtlasCoverageLayerComboBox, SIGNAL( layerChanged( QgsMapLayer* ) ), this, SLOT( changeCoverageLayer( QgsMapLayer* ) ) );
connect( mAtlasSortFeatureKeyComboBox, SIGNAL( fieldChanged( QString ) ), this, SLOT( changesSortFeatureField( QString ) ) );
connect( mPageNameWidget, SIGNAL( fieldChanged( QString, bool ) ), this, SLOT( pageNameExpressionChanged( QString, bool ) ) );
// Sort direction
mAtlasSortFeatureDirectionButton->setEnabled( false );
@ -253,6 +254,17 @@ void QgsAtlasCompositionWidget::on_mAtlasFeatureFilterCheckBox_stateChanged( int
updateAtlasFeatures();
}
void QgsAtlasCompositionWidget::pageNameExpressionChanged( QString expression, bool valid )
{
QgsAtlasComposition* atlasMap = &mComposition->atlasComposition();
if ( !atlasMap || ( !valid && !expression.isEmpty() ) )
{
return;
}
atlasMap->setPageNameExpression( expression );
}
void QgsAtlasCompositionWidget::on_mAtlasFeatureFilterEdit_editingFinished()
{
QgsAtlasComposition* atlasMap = &mComposition->atlasComposition();
@ -313,6 +325,8 @@ void QgsAtlasCompositionWidget::updateGuiElements()
mOutputGroup->setEnabled( atlasMap->enabled() );
mAtlasCoverageLayerComboBox->setLayer( atlasMap->coverageLayer() );
mPageNameWidget->setLayer( atlasMap->coverageLayer() );
mPageNameWidget->setField( atlasMap->pageNameExpression() );
mAtlasSortFeatureKeyComboBox->setLayer( atlasMap->coverageLayer() );
mAtlasSortFeatureKeyComboBox->setField( atlasMap->sortKeyAttributeName() );
@ -344,6 +358,7 @@ void QgsAtlasCompositionWidget::blockAllSignals( bool b )
mConfigurationGroup->blockSignals( b );
mOutputGroup->blockSignals( b );
mAtlasCoverageLayerComboBox->blockSignals( b );
mPageNameWidget->blockSignals( b );
mAtlasSortFeatureKeyComboBox->blockSignals( b );
mAtlasFilenamePatternEdit->blockSignals( b );
mAtlasHideCoverageCheckBox->blockSignals( b );

View File

@ -48,6 +48,7 @@ class QgsAtlasCompositionWidget:
void on_mAtlasFeatureFilterEdit_editingFinished();
void on_mAtlasFeatureFilterButton_clicked();
void on_mAtlasFeatureFilterCheckBox_stateChanged( int state );
void pageNameExpressionChanged( QString expression, bool valid );
private slots:
void updateGuiElements();

View File

@ -415,6 +415,7 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
mAtlasPageComboBox->setMinimumHeight( mAtlasToolbar->height() );
mAtlasPageComboBox->setMinimumContentsLength( 6 );
mAtlasPageComboBox->setMaxVisibleItems( 20 );
mAtlasPageComboBox->setSizeAdjustPolicy( QComboBox::AdjustToContents );
mAtlasPageComboBox->setInsertPolicy( QComboBox::NoInsert );
connect( mAtlasPageComboBox->lineEdit(), SIGNAL( editingFinished() ), this, SLOT( atlasPageComboEditingFinished() ) );
connect( mAtlasPageComboBox, SIGNAL( currentIndexChanged( QString ) ), this, SLOT( atlasPageComboEditingFinished() ) );
@ -999,11 +1000,19 @@ void QgsComposer::updateAtlasPageComboBox( int pageCount )
if ( pageCount == mAtlasPageComboBox->count() )
return;
if ( !mComposition )
return;
mAtlasPageComboBox->blockSignals( true );
mAtlasPageComboBox->clear();
for ( int i = 1; i <= pageCount && i < 500; ++i )
{
mAtlasPageComboBox->addItem( QString::number( i ), i );
QString name = mComposition->atlasComposition().nameForPage( i - 1 );
QString fullName = ( !name.isEmpty() ? QString( "%1: %2" ).arg( i ).arg( name ) : QString::number( i ) );
mAtlasPageComboBox->addItem( fullName, i );
mAtlasPageComboBox->setItemData( i - 1, name, Qt::UserRole + 1 );
mAtlasPageComboBox->setItemData( i - 1, fullName, Qt::UserRole + 2 );
}
mAtlasPageComboBox->blockSignals( false );
}
@ -1154,8 +1163,21 @@ void QgsComposer::on_mActionAtlasLast_triggered()
void QgsComposer::atlasPageComboEditingFinished()
{
QString text = mAtlasPageComboBox->lineEdit()->text();
bool ok = false;
int page = text.toInt( &ok );
//find matching record in combo box
int page = -1;
for ( int i = 0; i < mAtlasPageComboBox->count(); ++i )
{
if ( text.compare( mAtlasPageComboBox->itemData( i, Qt::UserRole + 1 ).toString(), Qt::CaseInsensitive ) == 0
|| text.compare( mAtlasPageComboBox->itemData( i, Qt::UserRole + 2 ).toString(), Qt::CaseInsensitive ) == 0
|| QString::number( i + 1 ) == text )
{
page = i + 1;
break;
}
}
bool ok = ( page > 0 );
if ( !ok || page >= mComposition->atlasComposition().numFeatures() || page < 1 )
{
mAtlasPageComboBox->blockSignals( true );

View File

@ -28,15 +28,17 @@
#include "qgsproject.h"
#include "qgsmessagelog.h"
QgsAtlasComposition::QgsAtlasComposition( QgsComposition* composition ) :
mComposition( composition ),
mEnabled( false ),
mHideCoverage( false ), mFilenamePattern( "'output_'||$feature" ),
mCoverageLayer( 0 ), mSingleFile( false ),
mSortFeatures( false ), mSortAscending( true ), mCurrentFeatureNo( 0 ),
mFilterFeatures( false ), mFeatureFilter( "" ),
mFilenameParserError( QString() ),
mFilterParserError( QString() )
QgsAtlasComposition::QgsAtlasComposition( QgsComposition* composition )
: mComposition( composition )
, mEnabled( false )
, mHideCoverage( false )
, mFilenamePattern( "'output_'||$feature" )
, mCoverageLayer( 0 )
, mSingleFile( false )
, mSortFeatures( false )
, mSortAscending( true )
, mCurrentFeatureNo( 0 )
, mFilterFeatures( false )
{
// declare special columns with a default value
@ -113,6 +115,14 @@ void QgsAtlasComposition::setCoverageLayer( QgsVectorLayer* layer )
emit coverageLayerChanged( layer );
}
QString QgsAtlasComposition::nameForPage( int pageNumber ) const
{
if ( pageNumber < 0 || pageNumber >= mFeatureIds.count() )
return QString();
return mFeatureIds.at( pageNumber ).second;
}
QgsComposerMap* QgsAtlasComposition::composerMap() const
{
//deprecated method. Until removed just return the first atlas-enabled composer map
@ -175,21 +185,21 @@ class FieldSorter
public:
FieldSorter( QgsAtlasComposition::SorterKeys& keys, bool ascending = true ) : mKeys( keys ), mAscending( ascending ) {}
bool operator()( const QgsFeatureId& id1, const QgsFeatureId& id2 )
bool operator()( const QPair< QgsFeatureId, QString > & id1, const QPair< QgsFeatureId, QString >& id2 )
{
bool result = true;
if ( mKeys[ id1 ].type() == QVariant::Int )
if ( mKeys[ id1.first ].type() == QVariant::Int )
{
result = mKeys[ id1 ].toInt() < mKeys[ id2 ].toInt();
result = mKeys[ id1.first ].toInt() < mKeys[ id2.first ].toInt();
}
else if ( mKeys[ id1 ].type() == QVariant::Double )
else if ( mKeys[ id1.first ].type() == QVariant::Double )
{
result = mKeys[ id1 ].toDouble() < mKeys[ id2 ].toDouble();
result = mKeys[ id1.first ].toDouble() < mKeys[ id2.first ].toDouble();
}
else if ( mKeys[ id1 ].type() == QVariant::String )
else if ( mKeys[ id1.first ].type() == QVariant::String )
{
result = ( QString::localeAwareCompare( mKeys[ id1 ].toString(), mKeys[ id2 ].toString() ) < 0 );
result = ( QString::localeAwareCompare( mKeys[ id1.first ].toString(), mKeys[ id2.first ].toString() ) < 0 );
}
return mAscending ? result : !result;
@ -225,14 +235,37 @@ int QgsAtlasComposition::updateFeatures()
}
mFilterParserError = QString();
QScopedPointer<QgsExpression> nameExpression;
if ( !mPageNameExpression.isEmpty() )
{
nameExpression.reset( new QgsExpression( mPageNameExpression ) );
if ( nameExpression->hasParserError() )
{
nameExpression.reset( 0 );
}
nameExpression->prepare( mCoverageLayer->pendingFields() );
}
// We cannot use nextFeature() directly since the feature pointer is rewinded by the rendering process
// We thus store the feature ids for future extraction
QgsFeature feat;
mFeatureIds.clear();
mFeatureKeys.clear();
int sortIdx = mCoverageLayer->fieldNameIndex( mSortKeyAttributeName );
while ( fit.nextFeature( feat ) )
{
QString pageName;
if ( !nameExpression.isNull() )
{
QVariant result = nameExpression->evaluate( &feat, mCoverageLayer->pendingFields() );
if ( nameExpression->hasEvalError() )
{
QgsMessageLog::logMessage( tr( "Atlas name eval error: %1" ).arg( nameExpression->evalErrorString() ), tr( "Composer" ) );
}
pageName = result.toString();
}
if ( !filterExpression.isNull() )
{
QVariant result = filterExpression->evaluate( &feat, mCoverageLayer->pendingFields() );
@ -247,7 +280,8 @@ int QgsAtlasComposition::updateFeatures()
continue;
}
}
mFeatureIds.push_back( feat.id() );
mFeatureIds.push_back( qMakePair( feat.id(), pageName ) );
if ( mSortFeatures && sortIdx != -1 )
{
@ -369,7 +403,18 @@ void QgsAtlasComposition::lastFeature()
bool QgsAtlasComposition::prepareForFeature( const QgsFeature * feat )
{
int featureI = mFeatureIds.indexOf( feat->id() );
int featureI = -1;
QVector< QPair<QgsFeatureId, QString> >::const_iterator it = mFeatureIds.constBegin();
int currentIdx = 0;
for ( ; it != mFeatureIds.constEnd(); ++it, ++currentIdx )
{
if (( *it ).first == feat->id() )
{
featureI = currentIdx;
break;
}
}
if ( featureI < 0 )
{
//feature not found
@ -405,7 +450,7 @@ bool QgsAtlasComposition::prepareForFeature( const int featureI, const bool upda
mCurrentFeatureNo = featureI;
// retrieve the next feature, based on its id
mCoverageLayer->getFeatures( QgsFeatureRequest().setFilterFid( mFeatureIds[ featureI ] ) ).nextFeature( mCurrentFeature );
mCoverageLayer->getFeatures( QgsFeatureRequest().setFilterFid( mFeatureIds[ featureI ].first ) ).nextFeature( mCurrentFeature );
QgsExpression::setSpecialColumn( "$atlasfeatureid", mCurrentFeature.id() );
QgsExpression::setSpecialColumn( "$atlasgeometry", QVariant::fromValue( *mCurrentFeature.constGeometry() ) );
@ -655,6 +700,7 @@ void QgsAtlasComposition::writeXML( QDomElement& elem, QDomDocument& doc ) const
atlasElem.setAttribute( "hideCoverage", mHideCoverage ? "true" : "false" );
atlasElem.setAttribute( "singleFile", mSingleFile ? "true" : "false" );
atlasElem.setAttribute( "filenamePattern", mFilenamePattern );
atlasElem.setAttribute( "pageNameExpression", mPageNameExpression );
atlasElem.setAttribute( "sortFeatures", mSortFeatures ? "true" : "false" );
if ( mSortFeatures )
@ -693,6 +739,7 @@ void QgsAtlasComposition::readXML( const QDomElement& atlasElem, const QDomDocum
}
}
mPageNameExpression = atlasElem.attribute( "pageNameExpression", QString() );
mSingleFile = atlasElem.attribute( "singleFile", "false" ) == "true" ? true : false;
mFilenamePattern = atlasElem.attribute( "filenamePattern", "" );

View File

@ -57,16 +57,6 @@ class CORE_EXPORT QgsAtlasComposition : public QObject
*/
void setEnabled( bool enabled );
/** Returns the map used by the atlas
* @deprecated Use QgsComposerMap::atlasDriven() instead
*/
Q_DECL_DEPRECATED QgsComposerMap* composerMap() const;
/** Sets the map used by the atlas
* @deprecated Use QgsComposerMap::setAtlasDriven( true ) instead
*/
Q_DECL_DEPRECATED void setComposerMap( QgsComposerMap* map );
/** Returns true if the atlas is set to hide the coverage layer
* @returns true if coverage layer is hidden
* @see setHideCoverage
@ -79,26 +69,6 @@ class CORE_EXPORT QgsAtlasComposition : public QObject
*/
void setHideCoverage( bool hide );
/** Returns whether the atlas map uses a fixed scale
* @deprecated since 2.4 Use QgsComposerMap::atlasScalingMode() instead
*/
Q_DECL_DEPRECATED bool fixedScale() const;
/** Sets whether the atlas map should use a fixed scale
* @deprecated since 2.4 Use QgsComposerMap::setAtlasScalingMode() instead
*/
Q_DECL_DEPRECATED void setFixedScale( bool fixed );
/** Returns the margin for the atlas map
* @deprecated Use QgsComposerMap::atlasMargin() instead
*/
Q_DECL_DEPRECATED float margin() const;
/** Sets the margin for the atlas map
* @deprecated Use QgsComposerMap::setAtlasMargin( double ) instead
*/
Q_DECL_DEPRECATED void setMargin( float margin );
/** Returns the filename expression used for generating output filenames for each
* atlas page.
* @returns filename pattern
@ -137,6 +107,29 @@ class CORE_EXPORT QgsAtlasComposition : public QObject
*/
void setCoverageLayer( QgsVectorLayer* layer );
/** Returns the expression used for calculating the page name.
* @returns expression string, or field name from coverage layer
* @see setPageNameExpression
* @see nameForPage
* @note added in QGIS 2.12
*/
QString pageNameExpression() const { return mPageNameExpression; }
/** Sets the expression used for calculating the page name.
* @param pageNameExpression expression string, or field name from coverage layer
* @see pageNameExpression
* @note added in QGIS 2.12
*/
void setPageNameExpression( const QString& pageNameExpression ) { mPageNameExpression = pageNameExpression; }
/** Returns the calculated name for a specified atlas page number.
* @param pageNumber number of page, where 0 = first page
* @returns page name
* @see pageNameExpression
* @note added in QGIS 2.12
*/
QString nameForPage( int pageNumber ) const;
/** Returns whether the atlas will be exported to a single file. This is only
* applicable for PDF exports.
* @returns true if atlas will be exported to a single file
@ -175,9 +168,6 @@ class CORE_EXPORT QgsAtlasComposition : public QObject
QString sortKeyAttributeName() const { return mSortKeyAttributeName; }
void setSortKeyAttributeName( QString fieldName ) { mSortKeyAttributeName = fieldName; }
Q_DECL_DEPRECATED int sortKeyAttributeIndex() const;
Q_DECL_DEPRECATED void setSortKeyAttributeIndex( int idx );
/** Returns the current list of predefined scales for the atlas. This is used
* for maps which are set to the predefined atlas scaling mode.
* @returns a vector of doubles representing predefined scales
@ -254,6 +244,42 @@ class CORE_EXPORT QgsAtlasComposition : public QObject
/** Recalculates the bounds of an atlas driven map */
void prepareMap( QgsComposerMap* map );
//deprecated methods
/** Returns the map used by the atlas
* @deprecated Use QgsComposerMap::atlasDriven() instead
*/
Q_DECL_DEPRECATED QgsComposerMap* composerMap() const;
/** Sets the map used by the atlas
* @deprecated Use QgsComposerMap::setAtlasDriven( true ) instead
*/
Q_DECL_DEPRECATED void setComposerMap( QgsComposerMap* map );
/** Returns whether the atlas map uses a fixed scale
* @deprecated since 2.4 Use QgsComposerMap::atlasScalingMode() instead
*/
Q_DECL_DEPRECATED bool fixedScale() const;
/** Sets whether the atlas map should use a fixed scale
* @deprecated since 2.4 Use QgsComposerMap::setAtlasScalingMode() instead
*/
Q_DECL_DEPRECATED void setFixedScale( bool fixed );
/** Returns the margin for the atlas map
* @deprecated Use QgsComposerMap::atlasMargin() instead
*/
Q_DECL_DEPRECATED float margin() const;
/** Sets the margin for the atlas map
* @deprecated Use QgsComposerMap::setAtlasMargin( double ) instead
*/
Q_DECL_DEPRECATED void setMargin( float margin );
Q_DECL_DEPRECATED int sortKeyAttributeIndex() const;
Q_DECL_DEPRECATED void setSortKeyAttributeIndex( int idx );
public slots:
/** Refreshes the current atlas feature, by refetching its attributes from the vector layer provider
@ -334,13 +360,15 @@ class CORE_EXPORT QgsAtlasComposition : public QObject
// key (attribute index) used for ordering
QString mSortKeyAttributeName;
QString mPageNameExpression;
// feature filtering
bool mFilterFeatures;
// feature expression filter
QString mFeatureFilter;
// id of each iterated feature (after filtering and sorting)
QVector<QgsFeatureId> mFeatureIds;
// id of each iterated feature (after filtering and sorting) paired with atlas page name
QVector< QPair<QgsFeatureId, QString> > mFeatureIds;
QgsFeature mCurrentFeature;

View File

@ -121,41 +121,31 @@
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="mHorizontalAlignementLabel">
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,1,0">
<item row="4" column="2">
<widget class="QToolButton" name="mAtlasSortFeatureDirectionButton">
<property name="toolTip">
<string>Sort direction</string>
</property>
<property name="text">
<string>Coverage layer </string>
<string>...</string>
</property>
<property name="arrowType">
<enum>Qt::UpArrow</enum>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="4" column="1">
<widget class="QgsFieldComboBox" name="mAtlasSortFeatureKeyComboBox"/>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="mAtlasFeatureFilterCheckBox">
<property name="text">
<string>Filter with</string>
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="2">
<widget class="QLineEdit" name="mAtlasFeatureFilterEdit"/>
</item>
<item row="2" column="3">
<item row="3" column="2">
<widget class="QToolButton" name="mAtlasFeatureFilterButton">
<property name="text">
<string>...</string>
@ -166,14 +156,31 @@
</property>
</widget>
</item>
<item row="1" column="0" colspan="4">
<item row="1" column="0" colspan="3">
<widget class="QCheckBox" name="mAtlasHideCoverageCheckBox">
<property name="text">
<string>Hidden coverage layer</string>
</property>
</widget>
</item>
<item row="0" column="2" colspan="2">
<item row="0" column="0">
<widget class="QLabel" name="mHorizontalAlignementLabel">
<property name="text">
<string>Coverage layer </string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Page name</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="mAtlasFeatureFilterEdit"/>
</item>
<item row="0" column="1" colspan="2">
<widget class="QgsMapLayerComboBox" name="mAtlasCoverageLayerComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
@ -183,6 +190,35 @@
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QgsFieldExpressionWidget" name="mPageNameWidget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="mAtlasSortFeatureCheckBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Sort by</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -214,35 +250,6 @@
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QgsFieldComboBox" name="mAtlasSortFeatureKeyComboBox"/>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="mAtlasSortFeatureCheckBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Sort by</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QToolButton" name="mAtlasSortFeatureDirectionButton">
<property name="toolTip">
<string>Sort direction</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="arrowType">
<enum>Qt::UpArrow</enum>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QToolButton" name="mAtlasFilenameExpressionButton">
<property name="text">
@ -267,6 +274,13 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>GroupBox</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
@ -306,6 +320,11 @@
<extends>QComboBox</extends>
<header location="global">qgsfieldcombobox.h</header>
</customwidget>
<customwidget>
<class>QgsFieldExpressionWidget</class>
<extends>QWidget</extends>
<header>qgsfieldexpressionwidget.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>mUseAtlasCheckBox</tabstop>
@ -319,9 +338,6 @@
<tabstop>mAtlasFilenamePatternEdit</tabstop>
<tabstop>mAtlasFilenameExpressionButton</tabstop>
<tabstop>mAtlasSingleFileCheckBox</tabstop>
<tabstop>mAtlasSortFeatureCheckBox</tabstop>
<tabstop>mAtlasSortFeatureKeyComboBox</tabstop>
<tabstop>mAtlasSortFeatureDirectionButton</tabstop>
</tabstops>
<resources>
<include location="../../images/images.qrc"/>