Skip to content

Commit 8880691

Browse files
committed
[feature] Layer transparency for vectors (fix #7692)
1 parent 63ee006 commit 8880691

File tree

9 files changed

+137
-42
lines changed

9 files changed

+137
-42
lines changed

src/app/composer/qgscomposer.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -632,9 +632,9 @@ void QgsComposer::on_mActionExportAsPDF_triggered()
632632
showWMSPrintingWarning();
633633
}
634634

635-
if ( containsBlendModes() )
635+
if ( containsAdvancedEffects() )
636636
{
637-
showBlendModePrintingWarning();
637+
showAdvancedEffectsWarning();
638638
}
639639

640640
// If we are not printing as raster, temporarily disable advanced effects
@@ -828,9 +828,9 @@ void QgsComposer::on_mActionPrint_triggered()
828828
showWMSPrintingWarning();
829829
}
830830

831-
if ( containsBlendModes() )
831+
if ( containsAdvancedEffects() )
832832
{
833-
showBlendModePrintingWarning();
833+
showAdvancedEffectsWarning();
834834
}
835835

836836
// If we are not printing as raster, temporarily disable advanced effects
@@ -2056,9 +2056,9 @@ bool QgsComposer::containsWMSLayer() const
20562056
return false;
20572057
}
20582058

2059-
bool QgsComposer::containsBlendModes() const
2059+
bool QgsComposer::containsAdvancedEffects() const
20602060
{
2061-
// Check if composer contains any blend modes
2061+
// Check if composer contains any blend modes or flattened layers for transparency
20622062
QMap<QgsComposerItem*, QWidget*>::const_iterator item_it = mItemWidgetMap.constBegin();
20632063
QgsComposerItem* currentItem = 0;
20642064
QgsComposerMap* currentMap = 0;
@@ -2071,11 +2071,11 @@ bool QgsComposer::containsBlendModes() const
20712071
{
20722072
return true;
20732073
}
2074-
// If item is a composer map, check if it contains any blended layers
2074+
// If item is a composer map, check if it contains any advanced effects
20752075
currentMap = dynamic_cast<QgsComposerMap *>( currentItem );
20762076
if ( currentMap )
20772077
{
2078-
if ( currentMap->containsBlendModes() )
2078+
if ( currentMap->containsAdvancedEffects() )
20792079
{
20802080
return true;
20812081
}
@@ -2111,13 +2111,13 @@ void QgsComposer::showWMSPrintingWarning()
21112111
}
21122112
}
21132113

2114-
void QgsComposer::showBlendModePrintingWarning()
2114+
void QgsComposer::showAdvancedEffectsWarning()
21152115
{
21162116
if ( ! mComposition->printAsRaster() )
21172117
{
21182118
QgsMessageViewer* m = new QgsMessageViewer( this, QgisGui::ModalDialogFlags, false );
2119-
m->setWindowTitle( tr( "Project contains blend modes" ) );
2120-
m->setMessage( tr( "Blend modes are enabled in this project, which cannot be printed as vectors. Printing as a raster is recommended." ), QgsMessageOutput::MessageText );
2119+
m->setWindowTitle( tr( "Project contains composition effects" ) );
2120+
m->setMessage( tr( "Advanced composition effects such as blend modes or vector layer transparency are enabled in this project, which cannot be printed as vectors. Printing as a raster is recommended." ), QgsMessageOutput::MessageText );
21212121
m->setCheckBoxText( tr( "Print as raster" ) );
21222122
m->setCheckBoxState( Qt::Checked );
21232123
m->setCheckBoxVisible( true );

src/app/composer/qgscomposer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,14 +309,14 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
309309
//! True if a composer map contains a WMS layer
310310
bool containsWMSLayer() const;
311311

312-
//! True if a composer contains blend modes
313-
bool containsBlendModes() const;
312+
//! True if a composer contains advanced effects, such as blend modes
313+
bool containsAdvancedEffects() const;
314314

315315
//! Displays a warning because of possible min/max size in WMS
316316
void showWMSPrintingWarning();
317317

318318
//! Displays a warning because of incompatibility between blend modes and QPrinter
319-
void showBlendModePrintingWarning();
319+
void showAdvancedEffectsWarning();
320320

321321
//! Changes elements that are not suitable for this project
322322
void cleanupAfterTemplateRead();

src/core/composer/qgscomposermap.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,8 +631,9 @@ bool QgsComposerMap::containsWMSLayer() const
631631
return false;
632632
}
633633

634-
bool QgsComposerMap::containsBlendModes() const
634+
bool QgsComposerMap::containsAdvancedEffects() const
635635
{
636+
// check if map contains advanced effects like blend modes, or flattened layers for transparency
636637
if ( !mMapRenderer )
637638
{
638639
return false;
@@ -659,6 +660,10 @@ bool QgsComposerMap::containsBlendModes() const
659660
QgsVectorLayer* currentVectorLayer = qobject_cast<QgsVectorLayer *>( currentLayer );
660661
if ( currentVectorLayer )
661662
{
663+
if ( currentVectorLayer->layerTransparency() != 0 )
664+
{
665+
return true;
666+
}
662667
if ( currentVectorLayer->featureBlendMode() != QPainter::CompositionMode_SourceOver )
663668
{
664669
return true;

src/core/composer/qgscomposermap.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
183183
/**True if composer map renders a WMS layer*/
184184
bool containsWMSLayer() const;
185185

186-
/**True if composer map contains layers with blend modes*/
187-
bool containsBlendModes() const;
186+
/**True if composer map contains layers with blend modes or flattened layers for vectors */
187+
bool containsAdvancedEffects() const;
188188

189189
/** stores state in Dom node
190190
* @param elem is Dom element corresponding to 'Composer' tag

src/core/qgsmaprenderer.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,8 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
523523
{
524524
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
525525
if (( vl->blendMode() != QPainter::CompositionMode_SourceOver && ( split || !mySettings.value( "/qgis/enable_render_caching", false ).toBool() ) )
526-
|| ( vl->featureBlendMode() != QPainter::CompositionMode_SourceOver ) )
526+
|| ( vl->featureBlendMode() != QPainter::CompositionMode_SourceOver )
527+
|| ( vl->layerTransparency() != 0 ) )
527528

528529
{
529530
flattenedLayer = true;
@@ -595,6 +596,17 @@ void QgsMapRenderer::render( QPainter* painter, double* forceWidthScale )
595596
// If we flattened this layer for alternate blend modes, composite it now
596597
if ( flattenedLayer )
597598
{
599+
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer *>( ml );
600+
if ( vl->layerTransparency() != 0 )
601+
{
602+
// a layer transparency has been set, so update the alpha for the flattened layer
603+
// by combining it with the layer transparency
604+
QColor transparentFillColor = QColor( 0, 0, 0, 255 - ( 255 * vl->layerTransparency() / 100 ) );
605+
// use destination in composition mode to merge source's alpha with destination
606+
mRenderContext.painter()->setCompositionMode( QPainter::CompositionMode_DestinationIn );
607+
mRenderContext.painter()->fillRect( mypFlattenedImage->rect(), transparentFillColor );
608+
}
609+
598610
delete mRenderContext.painter();
599611
mRenderContext.setPainter( mypContextPainter );
600612
mypContextPainter->save();

src/core/qgsvectorlayer.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ QgsVectorLayer::QgsVectorLayer( QString vectorLayerPath,
123123
, mLabel( 0 )
124124
, mLabelOn( false )
125125
, mFeatureBlendMode( QPainter::CompositionMode_SourceOver ) // Default to normal feature blending
126+
, mLayerTransparency( 0 )
126127
, mVertexMarkerOnlyForSelection( false )
127128
, mCache( new QgsGeometryCache( this ) )
128129
, mEditBuffer( 0 )
@@ -1767,6 +1768,14 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage
17671768
QDomElement e = featureBlendModeNode.toElement();
17681769
setFeatureBlendMode( QgsMapRenderer::getCompositionMode(( QgsMapRenderer::BlendMode ) e.text().toInt() ) );
17691770
}
1771+
1772+
// get and set the layer transparency if it exists
1773+
QDomNode layerTransparencyNode = node.namedItem( "layerTransparency" );
1774+
if ( !layerTransparencyNode.isNull() )
1775+
{
1776+
QDomElement e = layerTransparencyNode.toElement();
1777+
setLayerTransparency( e.text().toInt() );
1778+
}
17701779

17711780
// use scale dependent visibility flag
17721781
QDomElement e = node.toElement();
@@ -2099,6 +2108,12 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString&
20992108
featureBlendModeElem.appendChild( featureBlendModeText );
21002109
node.appendChild( featureBlendModeElem );
21012110

2111+
// add the layer transparency
2112+
QDomElement layerTransparencyElem = doc.createElement( "layerTransparency" );
2113+
QDomText layerTransparencyText = doc.createTextNode( QString::number( layerTransparency() ) );
2114+
layerTransparencyElem.appendChild( layerTransparencyText );
2115+
node.appendChild( layerTransparencyElem );
2116+
21022117
// add the display field
21032118
QDomElement dField = doc.createElement( "displayfield" );
21042119
QDomText dFieldText = doc.createTextNode( displayField() );
@@ -3367,6 +3382,18 @@ QPainter::CompositionMode QgsVectorLayer::featureBlendMode() const
33673382
return mFeatureBlendMode;
33683383
}
33693384

3385+
/** Write transparency for layer */
3386+
void QgsVectorLayer::setLayerTransparency( int layerTransparency )
3387+
{
3388+
mLayerTransparency = layerTransparency;
3389+
}
3390+
3391+
/** Read transparency for layer */
3392+
int QgsVectorLayer::layerTransparency() const
3393+
{
3394+
return mLayerTransparency;
3395+
}
3396+
33703397
void QgsVectorLayer::stopRendererV2( QgsRenderContext& rendererContext, QgsSingleSymbolRendererV2* selRenderer )
33713398
{
33723399
mRendererV2->stopRender( rendererContext );

src/core/qgsvectorlayer.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1234,6 +1234,15 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
12341234
* @note added in 2.0
12351235
*/
12361236
QPainter::CompositionMode featureBlendMode() const;
1237+
1238+
/* Set the transparency for the vector layer
1239+
* @note added in 2.0
1240+
*/
1241+
void setLayerTransparency( int layerTransparency );
1242+
/* Returns the current transparency for the vector layer
1243+
* @note added in 2.0
1244+
*/
1245+
int layerTransparency() const;
12371246

12381247
public slots:
12391248
/**
@@ -1491,6 +1500,9 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
14911500

14921501
/** Blend mode for features */
14931502
QPainter::CompositionMode mFeatureBlendMode;
1503+
1504+
/** Layer transparency */
1505+
int mLayerTransparency;
14941506

14951507
/**The current type of editing marker*/
14961508
QgsVectorLayer::VertexMarkerType mCurrentVertexMarkerType;

src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,14 @@ QgsRendererV2PropertiesDialog::QgsRendererV2PropertiesDialog( QgsVectorLayer* la
9191

9292
// Feature blend mode
9393
mFeatureBlendComboBox->setBlendMode( mLayer->featureBlendMode() );
94+
95+
// Layer transparency
96+
mLayerTransparencySlider->setValue( mLayer->layerTransparency() );
97+
mLayerTransparencySpnBx->setValue( mLayer->layerTransparency() );
98+
99+
// connect layer transparency slider and spin box
100+
connect( mLayerTransparencySlider, SIGNAL( valueChanged( int ) ), mLayerTransparencySpnBx, SLOT( setValue( int ) ) );
101+
connect( mLayerTransparencySpnBx, SIGNAL( valueChanged( int ) ), mLayerTransparencySlider, SLOT( setValue( int ) ) );
94102

95103
QPixmap pix;
96104
QgsRendererV2Registry* reg = QgsRendererV2Registry::instance();
@@ -179,6 +187,9 @@ void QgsRendererV2PropertiesDialog::apply()
179187
// set the blend modes for the layer
180188
mLayer->setBlendMode( mBlendModeComboBox->blendMode() );
181189
mLayer->setFeatureBlendMode( mFeatureBlendComboBox->blendMode() );
190+
191+
// set transparency for the layer
192+
mLayer->setLayerTransparency( mLayerTransparencySlider->value() );
182193
}
183194

184195
void QgsRendererV2PropertiesDialog::onOK()

src/ui/qgsrendererv2propsdialogbase.ui

Lines changed: 52 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,57 @@
2424
</property>
2525
<property name="saveCollapsedState" stdset="0">
2626
<bool>true</bool>
27-
</property>
28-
<layout class="QHBoxLayout" name="horizontalLayout">
29-
<item>
30-
<widget class="QLabel" name="lblLayerBlend">
31-
<property name="text">
32-
<string>Layer blending mode</string>
33-
</property>
34-
</widget>
35-
</item>
36-
<item>
37-
<widget class="QgsBlendModeComboBox" name="mBlendModeComboBox"/>
38-
</item>
39-
</layout>
27+
</property>
28+
<layout class="QGridLayout" name="gridLayout">
29+
<item row="0" column="1" colspan="3">
30+
<layout class="QHBoxLayout" name="horizontalLayout_2">
31+
<item>
32+
<widget class="QSlider" name="mLayerTransparencySlider">
33+
<property name="maximum">
34+
<number>100</number>
35+
</property>
36+
<property name="orientation">
37+
<enum>Qt::Horizontal</enum>
38+
</property>
39+
</widget>
40+
</item>
41+
<item>
42+
<widget class="QSpinBox" name="mLayerTransparencySpnBx">
43+
<property name="maximum">
44+
<number>100</number>
45+
</property>
46+
</widget>
47+
</item>
48+
</layout>
49+
</item>
50+
<item row="0" column="0">
51+
<widget class="QLabel" name="lblTransparency">
52+
<property name="text">
53+
<string>Layer transparency</string>
54+
</property>
55+
</widget>
56+
</item>
57+
<item row="1" column="3">
58+
<widget class="QgsBlendModeComboBox" name="mFeatureBlendComboBox"/>
59+
</item>
60+
<item row="1" column="2">
61+
<widget class="QLabel" name="lblFeatureBlend">
62+
<property name="text">
63+
<string>Feature blending mode</string>
64+
</property>
65+
</widget>
66+
</item>
67+
<item row="1" column="0">
68+
<widget class="QLabel" name="lblLayerBlend">
69+
<property name="text">
70+
<string>Layer blending mode</string>
71+
</property>
72+
</widget>
73+
</item>
74+
<item row="1" column="1">
75+
<widget class="QgsBlendModeComboBox" name="mBlendModeComboBox"/>
76+
</item>
77+
</layout>
4078
</widget>
4179
</item>
4280
<item>
@@ -57,16 +95,6 @@
5795
</property>
5896
</spacer>
5997
</item>
60-
<item>
61-
<widget class="QLabel" name="lblFeatureBlend">
62-
<property name="text">
63-
<string>Feature blending mode</string>
64-
</property>
65-
</widget>
66-
</item>
67-
<item>
68-
<widget class="QgsBlendModeComboBox" name="mFeatureBlendComboBox"/>
69-
</item>
7098
</layout>
7199
</item>
72100
<item>
@@ -119,7 +147,7 @@
119147
<extends>QGroupBox</extends>
120148
<header>qgscollapsiblegroupbox.h</header>
121149
<container>1</container>
122-
</customwidget>
150+
</customwidget>
123151
</customwidgets>
124152
<tabstops>
125153
<tabstop>cboRenderers</tabstop>

0 commit comments

Comments
 (0)