18 #include <QImageWriter> 
   30   , mAtlas( layout->atlas() )
 
   33   connect( mUseAtlasCheckBox, &QCheckBox::stateChanged, 
this, &QgsLayoutAtlasWidget::mUseAtlasCheckBox_stateChanged );
 
   34   connect( mAtlasFilenamePatternEdit, &QLineEdit::editingFinished, 
this, &QgsLayoutAtlasWidget::mAtlasFilenamePatternEdit_editingFinished );
 
   35   connect( mAtlasFilenameExpressionButton, &QToolButton::clicked, 
this, &QgsLayoutAtlasWidget::mAtlasFilenameExpressionButton_clicked );
 
   36   connect( mAtlasHideCoverageCheckBox, &QCheckBox::stateChanged, 
this, &QgsLayoutAtlasWidget::mAtlasHideCoverageCheckBox_stateChanged );
 
   37   connect( mAtlasSingleFileCheckBox, &QCheckBox::stateChanged, 
this, &QgsLayoutAtlasWidget::mAtlasSingleFileCheckBox_stateChanged );
 
   38   connect( mAtlasSortFeatureCheckBox, &QCheckBox::stateChanged, 
this, &QgsLayoutAtlasWidget::mAtlasSortFeatureCheckBox_stateChanged );
 
   39   connect( mAtlasSortFeatureDirectionButton, &QToolButton::clicked, 
this, &QgsLayoutAtlasWidget::mAtlasSortFeatureDirectionButton_clicked );
 
   40   connect( mAtlasFeatureFilterEdit, &QLineEdit::editingFinished, 
this, &QgsLayoutAtlasWidget::mAtlasFeatureFilterEdit_editingFinished );
 
   41   connect( mAtlasFeatureFilterButton, &QToolButton::clicked, 
this, &QgsLayoutAtlasWidget::mAtlasFeatureFilterButton_clicked );
 
   42   connect( mAtlasFeatureFilterCheckBox, &QCheckBox::stateChanged, 
this, &QgsLayoutAtlasWidget::mAtlasFeatureFilterCheckBox_stateChanged );
 
   53   mAtlasSortFeatureDirectionButton->setEnabled( 
false );
 
   54   mAtlasSortExpressionWidget->setEnabled( 
false );
 
   59   mPageNameWidget->registerExpressionContextGenerator( mLayout );
 
   61   QList<QByteArray> formats = QImageWriter::supportedImageFormats();
 
   62   for ( 
int i = 0; i < formats.size(); ++i )
 
   64     mAtlasFileFormat->addItem( QString( formats.at( i ) ) );
 
   66   connect( mAtlasFileFormat, qgis::overload<int>::of( &QComboBox::currentIndexChanged ), 
this, [ = ]( 
int ) { changeFileFormat(); } );
 
   76 void QgsLayoutAtlasWidget::mUseAtlasCheckBox_stateChanged( 
int state )
 
   78   if ( state == Qt::Checked )
 
   81     mConfigurationGroup->setEnabled( 
true );
 
   82     mOutputGroup->setEnabled( 
true );
 
   87     mConfigurationGroup->setEnabled( 
false );
 
   88     mOutputGroup->setEnabled( 
false );
 
   92 void QgsLayoutAtlasWidget::changeCoverageLayer( 
QgsMapLayer *layer )
 
   99   mLayout->undoStack()->beginCommand( mAtlas, tr( 
"Change Atlas Layer" ) );
 
  100   mLayout->reportContext().setLayer( vl );
 
  108     updateAtlasFeatures();
 
  110   mLayout->undoStack()->endCommand();
 
  113 void QgsLayoutAtlasWidget::mAtlasFilenamePatternEdit_editingFinished()
 
  119   mBlockUpdates = 
true;
 
  120   mLayout->undoStack()->beginCommand( mAtlas, tr( 
"Change Atlas Filename" ) );
 
  125                               tr( 
"Could not set filename expression to '%1'.\nParser error:\n%2" )
 
  126                               .arg( mAtlasFilenamePatternEdit->text(),
 
  129   mLayout->undoStack()->endCommand();
 
  130   mBlockUpdates = 
false;
 
  133 void QgsLayoutAtlasWidget::mAtlasFilenameExpressionButton_clicked()
 
  142   exprDlg.setWindowTitle( tr( 
"Expression Based Filename" ) );
 
  144   if ( exprDlg.exec() == QDialog::Accepted )
 
  146     QString expression = exprDlg.expressionText();
 
  147     if ( !expression.isEmpty() )
 
  150       mAtlasFilenamePatternEdit->setText( expression );
 
  152       mBlockUpdates = 
true;
 
  153       mLayout->undoStack()->beginCommand( mAtlas, tr( 
"Change Atlas Filename" ) );
 
  157         mMessageBar->
pushWarning( tr( 
"Atlas" ), tr( 
"Could not set filename expression to '%1'.\nParser error:\n%2" )
 
  161       mBlockUpdates = 
false;
 
  162       mLayout->undoStack()->endCommand();
 
  167 void QgsLayoutAtlasWidget::mAtlasHideCoverageCheckBox_stateChanged( 
int state )
 
  172   mBlockUpdates = 
true;
 
  173   mLayout->undoStack()->beginCommand( mAtlas, tr( 
"Toggle Atlas Layer" ) );
 
  175   mLayout->undoStack()->endCommand();
 
  176   mBlockUpdates = 
false;
 
  179 void QgsLayoutAtlasWidget::mAtlasSingleFileCheckBox_stateChanged( 
int state )
 
  184   if ( state == Qt::Checked )
 
  186     mAtlasFilenamePatternEdit->setEnabled( 
false );
 
  187     mAtlasFilenameExpressionButton->setEnabled( 
false );
 
  191     mAtlasFilenamePatternEdit->setEnabled( 
true );
 
  192     mAtlasFilenameExpressionButton->setEnabled( 
true );
 
  195   mLayout->setCustomProperty( QStringLiteral( 
"singleFile" ), state == Qt::Checked );
 
  198 void QgsLayoutAtlasWidget::mAtlasSortFeatureCheckBox_stateChanged( 
int state )
 
  203   if ( state == Qt::Checked )
 
  205     mAtlasSortFeatureDirectionButton->setEnabled( 
true );
 
  206     mAtlasSortExpressionWidget->setEnabled( 
true );
 
  210     mAtlasSortFeatureDirectionButton->setEnabled( 
false );
 
  211     mAtlasSortExpressionWidget->setEnabled( 
false );
 
  213   mBlockUpdates = 
true;
 
  214   mLayout->undoStack()->beginCommand( mAtlas, tr( 
"Toggle Atlas Sorting" ) );
 
  216   mLayout->undoStack()->endCommand();
 
  217   mBlockUpdates = 
false;
 
  218   updateAtlasFeatures();
 
  221 void QgsLayoutAtlasWidget::changesSortFeatureExpression( 
const QString &expression, 
bool )
 
  226   mBlockUpdates = 
true;
 
  227   mLayout->undoStack()->beginCommand( mAtlas, tr( 
"Change Atlas Sort" ) );
 
  229   mLayout->undoStack()->endCommand();
 
  230   mBlockUpdates = 
false;
 
  231   updateAtlasFeatures();
 
  234 void QgsLayoutAtlasWidget::updateAtlasFeatures()
 
  239     mMessageBar->
pushInfo( tr( 
"Atlas" ),
 
  240                            tr( 
"No matching atlas features found!" ) );
 
  247 void QgsLayoutAtlasWidget::mAtlasFeatureFilterCheckBox_stateChanged( 
int state )
 
  252   if ( state == Qt::Checked )
 
  254     mAtlasFeatureFilterEdit->setEnabled( 
true );
 
  255     mAtlasFeatureFilterButton->setEnabled( 
true );
 
  259     mAtlasFeatureFilterEdit->setEnabled( 
false );
 
  260     mAtlasFeatureFilterButton->setEnabled( 
false );
 
  262   mBlockUpdates = 
true;
 
  263   mLayout->undoStack()->beginCommand( mAtlas, tr( 
"Change Atlas Filter" ) );
 
  265   mLayout->undoStack()->endCommand();
 
  266   mBlockUpdates = 
false;
 
  267   updateAtlasFeatures();
 
  270 void QgsLayoutAtlasWidget::pageNameExpressionChanged( 
const QString &, 
bool valid )
 
  275   QString expression = mPageNameWidget->asExpression();
 
  276   if ( !valid && !expression.isEmpty() )
 
  281   mBlockUpdates = 
true;
 
  282   mLayout->undoStack()->beginCommand( mAtlas, tr( 
"Change Atlas Name" ) );
 
  284   mLayout->undoStack()->endCommand();
 
  285   mBlockUpdates = 
false;
 
  288 void QgsLayoutAtlasWidget::mAtlasFeatureFilterEdit_editingFinished()
 
  294   mLayout->undoStack()->beginCommand( mAtlas, tr( 
"Change Atlas Filter" ) );
 
  296   mBlockUpdates = 
true;
 
  300     mMessageBar->
pushWarning( tr( 
"Atlas" ), tr( 
"Could not set filter expression to '%1'.\nParser error:\n%2" )
 
  301                               .arg( mAtlasFeatureFilterEdit->text(),
 
  304   mBlockUpdates = 
false;
 
  305   mLayout->undoStack()->endCommand();
 
  306   updateAtlasFeatures();
 
  309 void QgsLayoutAtlasWidget::mAtlasFeatureFilterButton_clicked()
 
  314   QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( mAtlasCoverageLayerComboBox->currentLayer() );
 
  323   exprDlg.setWindowTitle( tr( 
"Expression Based Filter" ) );
 
  325   if ( exprDlg.exec() == QDialog::Accepted )
 
  327     QString expression = exprDlg.expressionText();
 
  328     if ( !expression.isEmpty() )
 
  330       mAtlasFeatureFilterEdit->setText( expression );
 
  332       mLayout->undoStack()->beginCommand( mAtlas, tr( 
"Change Atlas Filter" ) );
 
  333       mBlockUpdates = 
true;
 
  338                                   tr( 
"Could not set filter expression to '%1'.\nParser error:\n%2" )
 
  339                                   .arg( mAtlasFeatureFilterEdit->text(),
 
  343       mBlockUpdates = 
false;
 
  344       mLayout->undoStack()->endCommand();
 
  345       updateAtlasFeatures();
 
  350 void QgsLayoutAtlasWidget::mAtlasSortFeatureDirectionButton_clicked()
 
  355   Qt::ArrowType at = mAtlasSortFeatureDirectionButton->arrowType();
 
  356   at = ( at == Qt::UpArrow ) ? Qt::DownArrow : Qt::UpArrow;
 
  357   mAtlasSortFeatureDirectionButton->setArrowType( at );
 
  359   mBlockUpdates = 
true;
 
  360   mLayout->undoStack()->beginCommand( mAtlas, tr( 
"Change Atlas Sort" ) );
 
  362   mLayout->undoStack()->endCommand();
 
  363   mBlockUpdates = 
false;
 
  364   updateAtlasFeatures();
 
  367 void QgsLayoutAtlasWidget::changeFileFormat()
 
  372   mLayout->setCustomProperty( QStringLiteral( 
"atlasRasterFormat" ), mAtlasFileFormat->currentText() );
 
  375 void QgsLayoutAtlasWidget::updateGuiElements()
 
  380   blockAllSignals( 
true );
 
  381   mUseAtlasCheckBox->setCheckState( mAtlas->
enabled() ? Qt::Checked : Qt::Unchecked );
 
  382   mConfigurationGroup->setEnabled( mAtlas->
enabled() );
 
  383   mOutputGroup->setEnabled( mAtlas->
enabled() );
 
  385   mAtlasCoverageLayerComboBox->setLayer( mAtlas->
coverageLayer() );
 
  389   mAtlasSortExpressionWidget->setLayer( mAtlas->
coverageLayer() );
 
  393   mAtlasHideCoverageCheckBox->setCheckState( mAtlas->
hideCoverage() ? Qt::Checked : Qt::Unchecked );
 
  395   bool singleFile = mLayout->customProperty( QStringLiteral( 
"singleFile" ), 
true ).toBool();
 
  396   mAtlasSingleFileCheckBox->setCheckState( singleFile ? Qt::Checked : Qt::Unchecked );
 
  397   mAtlasFilenamePatternEdit->setEnabled( !singleFile );
 
  398   mAtlasFilenameExpressionButton->setEnabled( !singleFile );
 
  400   mAtlasSortFeatureCheckBox->setCheckState( mAtlas->
sortFeatures() ? Qt::Checked : Qt::Unchecked );
 
  401   mAtlasSortFeatureDirectionButton->setEnabled( mAtlas->
sortFeatures() );
 
  402   mAtlasSortExpressionWidget->setEnabled( mAtlas->
sortFeatures() );
 
  404   mAtlasSortFeatureDirectionButton->setArrowType( mAtlas->
sortAscending() ? Qt::UpArrow : Qt::DownArrow );
 
  407   mAtlasFeatureFilterCheckBox->setCheckState( mAtlas->
filterFeatures() ? Qt::Checked : Qt::Unchecked );
 
  409   mAtlasFeatureFilterButton->setEnabled( mAtlas->
filterFeatures() );
 
  411   mAtlasFileFormat->setCurrentIndex( mAtlasFileFormat->findText( mLayout->customProperty( QStringLiteral( 
"atlasRasterFormat" ), QStringLiteral( 
"png" ) ).toString() ) );
 
  413   blockAllSignals( 
false );
 
  416 void QgsLayoutAtlasWidget::blockAllSignals( 
bool b )
 
  418   mUseAtlasCheckBox->blockSignals( b );
 
  419   mConfigurationGroup->blockSignals( b );
 
  420   mOutputGroup->blockSignals( b );
 
  421   mAtlasCoverageLayerComboBox->blockSignals( b );
 
  422   mPageNameWidget->blockSignals( b );
 
  423   mAtlasSortExpressionWidget->blockSignals( b );
 
  424   mAtlasFilenamePatternEdit->blockSignals( b );
 
  425   mAtlasHideCoverageCheckBox->blockSignals( b );
 
  426   mAtlasSingleFileCheckBox->blockSignals( b );
 
  427   mAtlasSortFeatureCheckBox->blockSignals( b );
 
  428   mAtlasSortFeatureDirectionButton->blockSignals( b );
 
  429   mAtlasFeatureFilterEdit->blockSignals( b );
 
  430   mAtlasFeatureFilterCheckBox->blockSignals( b );