Skip to content

Commit d0b84e6

Browse files
committed
[FEATURE] Allow setting composer page background style (fix #7846)
1 parent a152312 commit d0b84e6

6 files changed

+116
-6
lines changed

src/app/composer/qgscompositionwidget.cpp

+30
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
#include "qgscomposition.h"
2020
#include "qgscomposermap.h"
2121
#include "qgscomposeritem.h"
22+
#include "qgsstylev2.h"
23+
#include "qgssymbolv2selectordialog.h"
24+
#include "qgssymbollayerv2utils.h"
2225
#include <QColorDialog>
2326
#include <QWidget>
2427
#include <QPrinter> //for screen resolution
@@ -45,6 +48,8 @@ QgsCompositionWidget::QgsCompositionWidget( QWidget* parent, QgsComposition* c )
4548
{
4649
mNumPagesSpinBox->setValue( mComposition->numPages() );
4750

51+
updatePageStyle();
52+
4853
//read printout resolution from composition
4954
mResolutionSpinBox->setValue( mComposition->printResolution() );
5055

@@ -374,6 +379,30 @@ void QgsCompositionWidget::displayCompositionWidthHeight()
374379
}
375380
}
376381

382+
void QgsCompositionWidget::on_mPageStyleButton_clicked()
383+
{
384+
if ( !mComposition )
385+
{
386+
return;
387+
}
388+
389+
QgsSymbolV2SelectorDialog d( mComposition->pageStyleSymbol(), QgsStyleV2::defaultStyle(), 0 );
390+
391+
if ( d.exec() == QDialog::Accepted )
392+
{
393+
updatePageStyle();
394+
}
395+
}
396+
397+
void QgsCompositionWidget::updatePageStyle()
398+
{
399+
if ( mComposition )
400+
{
401+
QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( mComposition->pageStyleSymbol(), mPageStyleButton->iconSize() );
402+
mPageStyleButton->setIcon( icon );
403+
}
404+
}
405+
377406
void QgsCompositionWidget::setPrintAsRasterCheckBox( bool state )
378407
{
379408
mPrintAsRasterCheckBox->blockSignals( true );
@@ -520,6 +549,7 @@ void QgsCompositionWidget::blockSignals( bool block )
520549
mPaperHeightDoubleSpinBox->blockSignals( block );
521550
mNumPagesSpinBox->blockSignals( block );
522551
mPaperOrientationComboBox->blockSignals( block );
552+
mPageStyleButton->blockSignals( block );
523553
mResolutionSpinBox->blockSignals( block );
524554
mPrintAsRasterCheckBox->blockSignals( block );
525555
mGridResolutionSpinBox->blockSignals( block );

src/app/composer/qgscompositionwidget.h

+3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class QgsCompositionWidget: public QWidget, private Ui::QgsCompositionWidgetBase
4848
void on_mPaperWidthDoubleSpinBox_editingFinished();
4949
void on_mPaperHeightDoubleSpinBox_editingFinished();
5050
void on_mNumPagesSpinBox_valueChanged( int value );
51+
void on_mPageStyleButton_clicked();
5152
void on_mResolutionSpinBox_valueChanged( const int value );
5253
void on_mPrintAsRasterCheckBox_toggled( bool state );
5354
void on_mGenerateWorldFileCheckBox_toggled( bool state );
@@ -84,6 +85,8 @@ class QgsCompositionWidget: public QWidget, private Ui::QgsCompositionWidgetBase
8485
/**Sets GUI elements to snaping distances of composition*/
8586
void displaySnapingSettings();
8687

88+
void updatePageStyle();
89+
8790
void createPaperEntries();
8891
void insertPaperEntries();
8992

src/core/composer/qgscomposition.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
#include "qgsvectorlayer.h"
3838
#include "qgsvectordataprovider.h"
3939
#include "qgsexpression.h"
40+
#include "qgssymbolv2.h"
41+
#include "qgssymbollayerv2utils.h"
4042

4143
#include <QDomDocument>
4244
#include <QDomElement>
@@ -54,6 +56,7 @@ QgsComposition::QgsComposition( QgsMapRenderer* mapRenderer )
5456
, mPageWidth( 297 )
5557
, mPageHeight( 210 )
5658
, mSpaceBetweenPages( 10 )
59+
, mPageStyleSymbol( 0 )
5760
, mPrintAsRaster( false )
5861
, mGenerateWorldFile( false )
5962
, mWorldFileMap( 0 )
@@ -75,6 +78,7 @@ QgsComposition::QgsComposition( QgsMapRenderer* mapRenderer )
7578
, mPreventCursorChange( false )
7679
{
7780
setBackgroundBrush( Qt::gray );
81+
createDefaultPageStyleSymbol();
7882
addPaperItem();
7983

8084
//add mouse selection handles to composition, and initially hide
@@ -97,6 +101,7 @@ QgsComposition::QgsComposition()
97101
mPageWidth( 297 ),
98102
mPageHeight( 210 ),
99103
mSpaceBetweenPages( 10 ),
104+
mPageStyleSymbol( 0 ),
100105
mPrintAsRaster( false ),
101106
mGenerateWorldFile( false ),
102107
mWorldFileMap( 0 ),
@@ -133,6 +138,7 @@ QgsComposition::~QgsComposition()
133138
clear();
134139
delete mActiveItemCommand;
135140
delete mActiveMultiFrameCommand;
141+
delete mPageStyleSymbol;
136142
}
137143

138144
void QgsComposition::loadDefaults()
@@ -200,6 +206,22 @@ int QgsComposition::numPages() const
200206
return mPages.size();
201207
}
202208

209+
void QgsComposition::setPageStyleSymbol( QgsFillSymbolV2* symbol )
210+
{
211+
delete mPageStyleSymbol;
212+
mPageStyleSymbol = symbol;
213+
}
214+
215+
void QgsComposition::createDefaultPageStyleSymbol()
216+
{
217+
delete mPageStyleSymbol;
218+
QgsStringMap properties;
219+
properties.insert( "color", "white" );
220+
properties.insert( "style", "solid" );
221+
properties.insert( "style_border", "no" );
222+
mPageStyleSymbol = QgsFillSymbolV2::createSimple( properties );
223+
}
224+
203225
QPointF QgsComposition::positionOnPage( const QPointF & position ) const
204226
{
205227
double y;
@@ -469,6 +491,9 @@ bool QgsComposition::writeXML( QDomElement& composerElem, QDomDocument& doc )
469491
compositionElem.setAttribute( "paperHeight", QString::number( mPageHeight ) );
470492
compositionElem.setAttribute( "numPages", mPages.size() );
471493

494+
QDomElement pageStyleElem = QgsSymbolLayerV2Utils::saveSymbol( QString(), mPageStyleSymbol, doc );
495+
compositionElem.appendChild( pageStyleElem );
496+
472497
//snapping
473498
if ( mSnapToGrid )
474499
{
@@ -559,6 +584,13 @@ bool QgsComposition::readXML( const QDomElement& compositionElem, const QDomDocu
559584
emit paperSizeChanged();
560585
int numPages = compositionElem.attribute( "numPages", "1" ).toInt();
561586

587+
QDomElement pageStyleSymbolElem = compositionElem.firstChildElement( "symbol" );
588+
if ( !pageStyleSymbolElem.isNull() )
589+
{
590+
delete mPageStyleSymbol;
591+
mPageStyleSymbol = dynamic_cast<QgsFillSymbolV2*>( QgsSymbolLayerV2Utils::loadSymbol( pageStyleSymbolElem ) );
592+
}
593+
562594
if ( widthConversionOk && heightConversionOk )
563595
{
564596
removePaperItems();

src/core/composer/qgscomposition.h

+10
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class QgsComposerMultiFrame;
5555
class QgsComposerMultiFrameCommand;
5656
class QgsVectorLayer;
5757
class QgsComposer;
58+
class QgsFillSymbolV2;
5859

5960
/** \ingroup MapComposer
6061
* Graphics scene for map printing. The class manages the paper item which always
@@ -108,6 +109,11 @@ class CORE_EXPORT QgsComposition : public QGraphicsScene
108109
/**Note: added in version 1.9*/
109110
int numPages() const;
110111

112+
/**Note: added in version 2.1*/
113+
void setPageStyleSymbol( QgsFillSymbolV2* symbol );
114+
/**Note: added in version 2.1*/
115+
QgsFillSymbolV2* pageStyleSymbol() { return mPageStyleSymbol; }
116+
111117
/**Returns the position within a page of a point in the composition
112118
@note Added in QGIS 2.1
113119
*/
@@ -432,6 +438,10 @@ class CORE_EXPORT QgsComposition : public QGraphicsScene
432438
QList< QgsPaperItem* > mPages;
433439
double mSpaceBetweenPages; //space in preview between pages
434440

441+
/**Drawing style for page*/
442+
QgsFillSymbolV2* mPageStyleSymbol;
443+
void createDefaultPageStyleSymbol();
444+
435445
/**Maintains z-Order of items. Starts with item at position 1 (position 0 is always paper item)*/
436446
QLinkedList<QgsComposerItem*> mItemZList;
437447

src/core/composer/qgspaperitem.cpp

+22-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "qgspaperitem.h"
1919
#include "qgscomposition.h"
20+
#include "qgsstylev2.h"
2021
#include "qgslogger.h"
2122
#include <QGraphicsRectItem>
2223
#include <QPainter>
@@ -152,7 +153,27 @@ void QgsPaperItem::paint( QPainter* painter, const QStyleOptionGraphicsItem* ite
152153
return;
153154
}
154155

155-
drawBackground( painter );
156+
QgsRenderContext context;
157+
context.setPainter( painter );
158+
context.setScaleFactor( 1.0 );
159+
if ( mComposition->plotStyle() == QgsComposition::Preview )
160+
{
161+
context.setRasterScaleFactor( horizontalViewScaleFactor() );
162+
}
163+
else
164+
{
165+
context.setRasterScaleFactor( mComposition->printResolution() / 25.4 );
166+
}
167+
168+
painter->save();
169+
painter->setRenderHint( QPainter::Antialiasing );
170+
QPolygonF pagePolygon = QPolygonF( QRectF( 0, 0, rect().width(), rect().height() ) );
171+
mComposition->pageStyleSymbol()->startRender( context );
172+
QList<QPolygonF> rings; //empty list
173+
mComposition->pageStyleSymbol()->renderPolygon( pagePolygon, &rings, 0, context );
174+
mComposition->pageStyleSymbol()->stopRender( context );
175+
painter->restore();
176+
156177
}
157178

158179
bool QgsPaperItem::writeXML( QDomElement& elem, QDomDocument & doc ) const

src/ui/qgscompositionwidgetbase.ui

+19-5
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@
223223
</property>
224224
</widget>
225225
</item>
226-
<item row="6" column="1">
226+
<item row="7" column="1">
227227
<widget class="QSpinBox" name="mResolutionSpinBox">
228228
<property name="suffix">
229229
<string> dpi</string>
@@ -236,14 +236,14 @@
236236
</property>
237237
</widget>
238238
</item>
239-
<item row="6" column="0">
239+
<item row="7" column="0">
240240
<widget class="QLabel" name="label_9">
241241
<property name="text">
242242
<string>Export resolution</string>
243243
</property>
244244
</widget>
245245
</item>
246-
<item row="8" column="0" colspan="2">
246+
<item row="9" column="0" colspan="2">
247247
<widget class="QCheckBox" name="mPrintAsRasterCheckBox">
248248
<property name="text">
249249
<string>Print as raster</string>
@@ -256,14 +256,14 @@
256256
</property>
257257
</widget>
258258
</item>
259-
<item row="9" column="0">
259+
<item row="10" column="0">
260260
<widget class="QCheckBox" name="mGenerateWorldFileCheckBox">
261261
<property name="text">
262262
<string>World file on</string>
263263
</property>
264264
</widget>
265265
</item>
266-
<item row="9" column="1">
266+
<item row="10" column="1">
267267
<widget class="QComboBox" name="mWorldFileMapComboBox">
268268
<property name="enabled">
269269
<bool>false</bool>
@@ -273,6 +273,20 @@
273273
</property>
274274
</widget>
275275
</item>
276+
<item row="6" column="1">
277+
<widget class="QPushButton" name="mPageStyleButton">
278+
<property name="text">
279+
<string>Change...</string>
280+
</property>
281+
</widget>
282+
</item>
283+
<item row="6" column="0">
284+
<widget class="QLabel" name="label_10">
285+
<property name="text">
286+
<string>Page background</string>
287+
</property>
288+
</widget>
289+
</item>
276290
</layout>
277291
</widget>
278292
</item>

0 commit comments

Comments
 (0)