diff --git a/python/core/layout/qgslayoutitempage.sip b/python/core/layout/qgslayoutitempage.sip index b351a9cc5c9..bdcea7929a2 100644 --- a/python/core/layout/qgslayoutitempage.sip +++ b/python/core/layout/qgslayoutitempage.sip @@ -28,6 +28,11 @@ class QgsLayoutItemPage : QgsLayoutItem Landscape }; + enum UndoCommand + { + UndoPageSymbol, + }; + explicit QgsLayoutItemPage( QgsLayout *layout /TransferThis/ ); %Docstring Constructor for QgsLayoutItemPage, with the specified parent ``layout``. diff --git a/src/app/layout/qgslayoutpagepropertieswidget.cpp b/src/app/layout/qgslayoutpagepropertieswidget.cpp index 2c721ee60d7..449900ebaae 100644 --- a/src/app/layout/qgslayoutpagepropertieswidget.cpp +++ b/src/app/layout/qgslayoutpagepropertieswidget.cpp @@ -47,6 +47,9 @@ QgsLayoutPagePropertiesWidget::QgsLayoutPagePropertiesWidget( QWidget *parent, Q mLockAspectRatio->setWidthSpinBox( mWidthSpin ); mLockAspectRatio->setHeightSpinBox( mHeightSpin ); + mSymbolButton->setSymbolType( QgsSymbol::Fill ); + mSymbolButton->setSymbol( mPage->layout()->pageCollection()->pageStyleSymbol()->clone() ); + connect( mPageSizeComboBox, static_cast( &QComboBox::currentIndexChanged ), this, &QgsLayoutPagePropertiesWidget::pageSizeChanged ); connect( mPageOrientationComboBox, static_cast( &QComboBox::currentIndexChanged ), this, &QgsLayoutPagePropertiesWidget::orientationChanged ); @@ -55,6 +58,7 @@ QgsLayoutPagePropertiesWidget::QgsLayoutPagePropertiesWidget( QWidget *parent, Q connect( mWidthSpin, static_cast< void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutPagePropertiesWidget::setToCustomSize ); connect( mHeightSpin, static_cast< void ( QDoubleSpinBox::* )( double )>( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutPagePropertiesWidget::setToCustomSize ); + connect( mSymbolButton, &QgsSymbolButton::changed, this, &QgsLayoutPagePropertiesWidget::symbolChanged ); registerDataDefinedButton( mPaperSizeDDBtn, QgsLayoutObject::PresetPaperSize ); registerDataDefinedButton( mWidthDDBtn, QgsLayoutObject::ItemWidth ); registerDataDefinedButton( mHeightDDBtn, QgsLayoutObject::ItemHeight ); @@ -142,6 +146,13 @@ void QgsLayoutPagePropertiesWidget::setToCustomSize() mPageOrientationComboBox->setEnabled( false ); } +void QgsLayoutPagePropertiesWidget::symbolChanged() +{ + mPage->layout()->undoStack()->beginCommand( mPage->layout()->pageCollection(), tr( "Change Page Background" ), QgsLayoutItemPage::UndoPageSymbol ); + mPage->layout()->pageCollection()->setPageStyleSymbol( static_cast< QgsFillSymbol * >( mSymbolButton->symbol() )->clone() ); + mPage->layout()->undoStack()->endCommand(); +} + void QgsLayoutPagePropertiesWidget::showCurrentPageSize() { QgsLayoutSize paperSize = mPage->pageSize(); diff --git a/src/app/layout/qgslayoutpagepropertieswidget.h b/src/app/layout/qgslayoutpagepropertieswidget.h index aec8306a5e2..bb25f7ed6ad 100644 --- a/src/app/layout/qgslayoutpagepropertieswidget.h +++ b/src/app/layout/qgslayoutpagepropertieswidget.h @@ -47,6 +47,7 @@ class QgsLayoutPagePropertiesWidget : public QgsLayoutItemBaseWidget, private Ui void orientationChanged( int index ); void updatePageSize(); void setToCustomSize(); + void symbolChanged(); private: diff --git a/src/core/layout/qgslayoutitempage.h b/src/core/layout/qgslayoutitempage.h index 920fbe0db5d..e66a1841497 100644 --- a/src/core/layout/qgslayoutitempage.h +++ b/src/core/layout/qgslayoutitempage.h @@ -65,6 +65,12 @@ class CORE_EXPORT QgsLayoutItemPage : public QgsLayoutItem Landscape //!< Landscape orientation }; + //! Page item undo commands, used for collapsing undo commands + enum UndoCommand + { + UndoPageSymbol = 3000, //!< Layout page symbol change + }; + /** * Constructor for QgsLayoutItemPage, with the specified parent \a layout. */ diff --git a/src/core/layout/qgslayoutpagecollection.cpp b/src/core/layout/qgslayoutpagecollection.cpp index b83c4bcc62d..3f4bc8e7103 100644 --- a/src/core/layout/qgslayoutpagecollection.cpp +++ b/src/core/layout/qgslayoutpagecollection.cpp @@ -44,6 +44,12 @@ void QgsLayoutPageCollection::setPageStyleSymbol( QgsFillSymbol *symbol ) return; mPageStyleSymbol.reset( static_cast( symbol->clone() ) ); + + for ( QgsLayoutItemPage *page : qgis::as_const( mPages ) ) + { + page->update(); + } + } void QgsLayoutPageCollection::reflow() diff --git a/src/ui/layout/qgslayoutpagepropertieswidget.ui b/src/ui/layout/qgslayoutpagepropertieswidget.ui index e66681ff312..7b808e3f568 100644 --- a/src/ui/layout/qgslayoutpagepropertieswidget.ui +++ b/src/ui/layout/qgslayoutpagepropertieswidget.ui @@ -6,15 +6,15 @@ 0 0 - 660 - 368 + 397 + 409 New Item Properties - - + + Qt::Vertical @@ -27,7 +27,36 @@ - + + + + Background + + + + + + + true + + + + 0 + 0 + + + + + 100 + 0 + + + + + + + + Page size @@ -178,26 +207,31 @@ + + QgsDoubleSpinBox + QDoubleSpinBox +
qgsdoublespinbox.h
+
+ + QgsPropertyOverrideButton + QToolButton +
qgspropertyoverridebutton.h
+
QgsRatioLockButton QToolButton
qgsratiolockbutton.h
1
- - QgsDoubleSpinBox - QDoubleSpinBox -
qgsdoublespinbox.h
-
QgsLayoutUnitsComboBox QComboBox
qgslayoutunitscombobox.h
- QgsPropertyOverrideButton + QgsSymbolButton QToolButton -
qgspropertyoverridebutton.h
+
qgssymbolbutton.h
diff --git a/tests/src/core/testqgslayoutpage.cpp b/tests/src/core/testqgslayoutpage.cpp index 05543c89268..09bcbff51cd 100644 --- a/tests/src/core/testqgslayoutpage.cpp +++ b/tests/src/core/testqgslayoutpage.cpp @@ -42,6 +42,8 @@ class TestQgsLayoutPage : public QObject void decodePageOrientation(); void grid(); void transparentPaper(); //test totally transparent paper style + void borderedPaper(); //test page with border + void markerLinePaper(); //test page with marker line borde void hiddenPages(); //test hidden page boundaries @@ -187,6 +189,45 @@ void TestQgsLayoutPage::transparentPaper() QVERIFY( checker.testLayout( mReport ) ); } +void TestQgsLayoutPage::borderedPaper() +{ + QgsProject p; + QgsLayout l( &p ); + std::unique_ptr< QgsLayoutItemPage > page( new QgsLayoutItemPage( &l ) ); + page->setPageSize( QgsLayoutSize( 297, 210, QgsUnitTypes::LayoutMillimeters ) ); + l.pageCollection()->addPage( page.release() ); + + QgsSimpleFillSymbolLayer *simpleFill = new QgsSimpleFillSymbolLayer(); + std::unique_ptr< QgsFillSymbol > fillSymbol = qgis::make_unique< QgsFillSymbol >(); + fillSymbol->changeSymbolLayer( 0, simpleFill ); + simpleFill->setColor( Qt::white ); + simpleFill->setStrokeColor( Qt::black ); + simpleFill->setStrokeWidth( 6 ); + l.pageCollection()->setPageStyleSymbol( fillSymbol.get() ); + + QgsLayoutChecker checker( QStringLiteral( "composerpaper_bordered" ), &l ); + checker.setControlPathPrefix( QStringLiteral( "composer_paper" ) ); + QVERIFY( checker.testLayout( mReport ) ); +} + +void TestQgsLayoutPage::markerLinePaper() +{ + QgsProject p; + QgsLayout l( &p ); + std::unique_ptr< QgsLayoutItemPage > page( new QgsLayoutItemPage( &l ) ); + page->setPageSize( QgsLayoutSize( 297, 210, QgsUnitTypes::LayoutMillimeters ) ); + l.pageCollection()->addPage( page.release() ); + + QgsMarkerLineSymbolLayer *markerLine = new QgsMarkerLineSymbolLayer(); + std::unique_ptr< QgsFillSymbol > markerLineSymbol = qgis::make_unique< QgsFillSymbol >(); + markerLineSymbol->changeSymbolLayer( 0, markerLine ); + l.pageCollection()->setPageStyleSymbol( markerLineSymbol.get() ); + + QgsLayoutChecker checker( QStringLiteral( "composerpaper_markerborder" ), &l ); + checker.setControlPathPrefix( QStringLiteral( "composer_paper" ) ); + QVERIFY( checker.testLayout( mReport, 0, 0 ) ); +} + void TestQgsLayoutPage::hiddenPages() { QgsProject p; @@ -195,24 +236,20 @@ void TestQgsLayoutPage::hiddenPages() page->setPageSize( QgsLayoutSize( 297, 210, QgsUnitTypes::LayoutMillimeters ) ); l.pageCollection()->addPage( page.release() ); -#if 0 //TODO QgsSimpleFillSymbolLayer *simpleFill = new QgsSimpleFillSymbolLayer(); - QgsFillSymbol *fillSymbol = new QgsFillSymbol(); + std::unique_ptr< QgsFillSymbol > fillSymbol = qgis::make_unique< QgsFillSymbol >(); fillSymbol->changeSymbolLayer( 0, simpleFill ); simpleFill->setColor( Qt::blue ); simpleFill->setStrokeColor( Qt::transparent ); - mComposition->setPageStyleSymbol( fillSymbol ); - delete fillSymbol; -#endif + l.pageCollection()->setPageStyleSymbol( fillSymbol.get() ); l.context().setPagesVisible( false ); -#if 0 //TODO - QgsCompositionChecker checker( QStringLiteral( "composerpaper_hidden" ), mComposition ); + + QgsLayoutChecker checker( QStringLiteral( "composerpaper_hidden" ), &l ); checker.setControlPathPrefix( QStringLiteral( "composer_paper" ) ); - bool result = checker.testComposition( mReport ); - mComposition->setPagesVisible( true ); + bool result = checker.testLayout( mReport ); QVERIFY( result ); -#endif + } QGSTEST_MAIN( TestQgsLayoutPage ) diff --git a/tests/testdata/control_images/composer_paper/expected_composerpaper_bordered/expected_composerpaper_bordered_mask.png b/tests/testdata/control_images/composer_paper/expected_composerpaper_bordered/expected_composerpaper_bordered_mask.png new file mode 100644 index 00000000000..d5a535593ec Binary files /dev/null and b/tests/testdata/control_images/composer_paper/expected_composerpaper_bordered/expected_composerpaper_bordered_mask.png differ diff --git a/tests/testdata/control_images/composer_paper/expected_composerpaper_markerborder/expected_composerpaper_markerborder.png b/tests/testdata/control_images/composer_paper/expected_composerpaper_markerborder/composer/expected_composerpaper_markerborder.png similarity index 100% rename from tests/testdata/control_images/composer_paper/expected_composerpaper_markerborder/expected_composerpaper_markerborder.png rename to tests/testdata/control_images/composer_paper/expected_composerpaper_markerborder/composer/expected_composerpaper_markerborder.png diff --git a/tests/testdata/control_images/composer_paper/expected_composerpaper_markerborder/expected_composerpaper_markerborder_mask.png b/tests/testdata/control_images/composer_paper/expected_composerpaper_markerborder/composer/expected_composerpaper_markerborder_mask.png similarity index 100% rename from tests/testdata/control_images/composer_paper/expected_composerpaper_markerborder/expected_composerpaper_markerborder_mask.png rename to tests/testdata/control_images/composer_paper/expected_composerpaper_markerborder/composer/expected_composerpaper_markerborder_mask.png diff --git a/tests/testdata/control_images/composer_paper/expected_composerpaper_markerborder/layout/expected_composerpaper_markerborder.png b/tests/testdata/control_images/composer_paper/expected_composerpaper_markerborder/layout/expected_composerpaper_markerborder.png new file mode 100644 index 00000000000..90c3c8da75a Binary files /dev/null and b/tests/testdata/control_images/composer_paper/expected_composerpaper_markerborder/layout/expected_composerpaper_markerborder.png differ