15 changes: 13 additions & 2 deletions src/core/raster/qgsrasterpipe.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ QgsRasterPipe::Role QgsRasterPipe::interfaceRole( QgsRasterInterface * interface
else if ( dynamic_cast<QgsRasterRenderer *>( interface ) ) role = RendererRole;
else if ( dynamic_cast<QgsRasterResampleFilter *>( interface ) ) role = ResamplerRole;
else if ( dynamic_cast<QgsBrightnessContrastFilter *>( interface ) ) role = BrightnessRole;
else if ( dynamic_cast<QgsHueSaturationFilter *>( interface ) ) role = HueSaturationRole;
else if ( dynamic_cast<QgsRasterProjector *>( interface ) ) role = ProjectorRole;
else if ( dynamic_cast<QgsRasterNuller *>( interface ) ) role = NullerRole;

Expand Down Expand Up @@ -180,6 +181,7 @@ bool QgsRasterPipe::set( QgsRasterInterface* theInterface )
int rendererIdx = mRoleMap.value( RendererRole, -1 );
int resamplerIdx = mRoleMap.value( ResamplerRole, -1 );
int brightnessIdx = mRoleMap.value( BrightnessRole, -1 );
int hueSaturationIdx = mRoleMap.value( HueSaturationRole, -1 );

if ( role == ProviderRole )
{
Expand All @@ -193,13 +195,17 @@ bool QgsRasterPipe::set( QgsRasterInterface* theInterface )
{
idx = qMax( providerIdx, rendererIdx ) + 1;
}
else if ( role == ResamplerRole )
else if ( role == HueSaturationRole )
{
idx = qMax( qMax( providerIdx, rendererIdx ), brightnessIdx ) + 1;
}
else if ( role == ResamplerRole )
{
idx = qMax( qMax( qMax( providerIdx, rendererIdx ), brightnessIdx ), hueSaturationIdx ) + 1;
}
else if ( role == ProjectorRole )
{
idx = qMax( qMax( qMax( providerIdx, rendererIdx ), brightnessIdx ), resamplerIdx ) + 1;
idx = qMax( qMax( qMax( qMax( providerIdx, rendererIdx ), brightnessIdx ), hueSaturationIdx ), resamplerIdx ) + 1;
}

return insert( idx, theInterface ); // insert may still fail and return false
Expand Down Expand Up @@ -235,6 +241,11 @@ QgsBrightnessContrastFilter * QgsRasterPipe::brightnessFilter() const
return dynamic_cast<QgsBrightnessContrastFilter *>( interface( BrightnessRole ) );
}

QgsHueSaturationFilter * QgsRasterPipe::hueSaturationFilter() const
{
return dynamic_cast<QgsHueSaturationFilter *>( interface( HueSaturationRole ) );
}

QgsRasterProjector * QgsRasterPipe::projector() const
{
return dynamic_cast<QgsRasterProjector*>( interface( ProjectorRole ) );
Expand Down
3 changes: 3 additions & 0 deletions src/core/raster/qgsrasterpipe.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "qgsrasterinterface.h"
#include "qgsrasterresamplefilter.h"
#include "qgsbrightnesscontrastfilter.h"
#include "qgshuesaturationfilter.h"
#include "qgsrasterdataprovider.h"
#include "qgsrasternuller.h"
#include "qgsrasterrenderer.h"
Expand All @@ -50,6 +51,7 @@ class CORE_EXPORT QgsRasterPipe
ResamplerRole = 4,
ProjectorRole = 5,
NullerRole = 6,
HueSaturationRole = 7
};

QgsRasterPipe();
Expand Down Expand Up @@ -95,6 +97,7 @@ class CORE_EXPORT QgsRasterPipe
QgsRasterRenderer * renderer() const;
QgsRasterResampleFilter * resampleFilter() const;
QgsBrightnessContrastFilter * brightnessFilter() const;
QgsHueSaturationFilter * hueSaturationFilter() const;
QgsRasterProjector * projector() const;
QgsRasterNuller * nuller() const;

Expand Down
59 changes: 59 additions & 0 deletions src/ui/qgsrasterlayerpropertiesbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,65 @@
</layout>
</widget>
</item>
<item>
<widget class="QgsCollapsibleGroupBox" name="mHueSaturationGroupBox">
<property name="title">
<string>Saturation and hue</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<property name="saveCollapsedState" stdset="0">
<bool>true</bool>
</property>
<layout class="QGridLayout" name="_7">
<item row="0" column="0">
<widget class="QSlider" name="sliderSaturation">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimum">
<number>-100</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>100</number>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinBoxSaturation">
<property name="minimum">
<number>-100</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="decimals" stdset="0">
<number>0</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
Expand Down