Skip to content

Commit 1956467

Browse files
committedJun 30, 2016
Fix raster load min/max from extent in style dock (fix #15171)
1 parent b49ada2 commit 1956467

18 files changed

+165
-11
lines changed
 

‎python/gui/raster/qgsmultibandcolorrendererwidget.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class QgsMultiBandColorRendererWidget: QgsRasterRendererWidget
1010
~QgsMultiBandColorRendererWidget();
1111

1212
QgsRasterRenderer* renderer();
13+
void setMapCanvas( QgsMapCanvas* canvas );
1314

1415
void setFromRenderer( const QgsRasterRenderer* r );
1516

‎python/gui/raster/qgsrasterminmaxwidget.sip

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,28 @@ class QgsRasterMinMaxWidget: QWidget
77
QgsRasterMinMaxWidget( QgsRasterLayer* theLayer, QWidget *parent /TransferThis/ = 0 );
88
~QgsRasterMinMaxWidget();
99

10-
void setExtent( const QgsRectangle & theExtent );
10+
/** Sets the extent to use for minimum and maximum value calculation.
11+
* @param theExtent extent in raster layer's CRS
12+
* @note if a map canvas is set using setMapCanvas(), its extent will take
13+
* precedence over any extent set using this method.
14+
*/
15+
void setExtent( const QgsRectangle& theExtent );
16+
17+
/** Sets the map canvas associated with the widget. This allows the widget to retrieve the current
18+
* map extent from the canvas. If a canvas is set it will take precedence over any extent
19+
* set from calling setExtent().
20+
* @param canvas map canvas
21+
* @see mapCanvas()
22+
* @note added in QGIS 2.16
23+
*/
24+
void setMapCanvas( QgsMapCanvas* canvas );
25+
26+
/** Returns the map canvas associated with the widget.
27+
* @see setMapCanvas()
28+
* @see canvasExtent()
29+
* @note added in QGIS 2.16
30+
*/
31+
QgsMapCanvas* mapCanvas();
1132

1233
void setBands( const QList<int> & theBands );
1334
/** Return the extent selected by the user.

‎python/gui/raster/qgsrasterrendererwidget.sip

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ class QgsRasterRendererWidget: QWidget
2020
void setRasterLayer( QgsRasterLayer* layer );
2121
const QgsRasterLayer* rasterLayer() const;
2222

23+
/** Sets the map canvas associated with the widget. This allows the widget to retrieve the current
24+
* map extent and other properties from the canvas.
25+
* @param canvas map canvas
26+
* @see mapCanvas()
27+
* @note added in QGIS 2.16
28+
*/
29+
virtual void setMapCanvas( QgsMapCanvas* canvas );
30+
31+
/** Returns the map canvas associated with the widget.
32+
* @see setMapCanvas()
33+
* @see canvasExtent()
34+
* @note added in QGIS 2.16
35+
*/
36+
QgsMapCanvas* mapCanvas();
37+
2338
virtual QString min( int index = 0 );
2439
virtual QString max( int index = 0 );
2540
virtual void setMin( const QString& value, int index = 0 );

‎python/gui/raster/qgssinglebandgrayrendererwidget.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class QgsSingleBandGrayRendererWidget: QgsRasterRendererWidget
1010
static QgsRasterRendererWidget* create( QgsRasterLayer* layer, const QgsRectangle &theExtent ) /Factory/;
1111

1212
QgsRasterRenderer* renderer();
13+
void setMapCanvas( QgsMapCanvas* canvas );
1314

1415
void setFromRenderer( const QgsRasterRenderer* r );
1516

‎python/gui/raster/qgssinglebandpseudocolorrendererwidget.sip

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class QgsSingleBandPseudoColorRendererWidget : QgsRasterRendererWidget
1717

1818
static QgsRasterRendererWidget* create( QgsRasterLayer* layer, const QgsRectangle &theExtent ) /Factory/;
1919
QgsRasterRenderer* renderer();
20+
void setMapCanvas( QgsMapCanvas* canvas );
2021

2122
void setFromRenderer( const QgsRasterRenderer* r );
2223

@@ -44,4 +45,4 @@ class QgsTreeWidgetItem: QObject, QTreeWidgetItem
4445
signals:
4546
/** This signal is emitted when the contents of the column in the specified item has been edited by the user. */
4647
void itemEdited( QTreeWidgetItem* item, int column );
47-
};
48+
};

‎src/app/qgsrasterlayerproperties.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,7 @@ void QgsRasterLayerProperties::setRendererWidget( const QString& rendererName )
549549
// Current canvas extent (used to calc min/max) in layer CRS
550550
QgsRectangle myExtent = mMapCanvas->mapSettings().outputExtentToLayerExtent( mRasterLayer, mMapCanvas->extent() );
551551
mRendererWidget = rendererEntry.widgetCreateFunction( mRasterLayer, myExtent );
552+
mRendererWidget->setMapCanvas( mMapCanvas );
552553
mRendererStackedWidget->addWidget( mRendererWidget );
553554
if ( oldWidget )
554555
{

‎src/core/raster/qgsrasterrendererregistry.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@
2929

3030
QgsRasterRendererRegistryEntry::QgsRasterRendererRegistryEntry( const QString& theName, const QString& theVisibleName,
3131
QgsRasterRendererCreateFunc rendererFunction,
32-
QgsRasterRendererWidgetCreateFunc widgetFunction ):
33-
name( theName ), visibleName( theVisibleName ), rendererCreateFunction( rendererFunction ),
34-
widgetCreateFunction( widgetFunction )
32+
QgsRasterRendererWidgetCreateFunc widgetFunction )
33+
: name( theName )
34+
, visibleName( theVisibleName )
35+
, rendererCreateFunction( rendererFunction )
36+
, widgetCreateFunction( widgetFunction )
3537
{
3638
}
3739

‎src/gui/raster/qgsmultibandcolorrendererwidget.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ QgsMultiBandColorRendererWidget::QgsMultiBandColorRendererWidget( QgsRasterLayer
3636

3737
mMinMaxWidget = new QgsRasterMinMaxWidget( layer, this );
3838
mMinMaxWidget->setExtent( extent );
39+
mMinMaxWidget->setMapCanvas( mCanvas );
3940
layout()->addWidget( mMinMaxWidget );
4041
connect( mMinMaxWidget, SIGNAL( load( int, double, double, int ) ),
4142
this, SLOT( loadMinMax( int, double, double, int ) ) );
@@ -105,6 +106,12 @@ QgsRasterRenderer* QgsMultiBandColorRendererWidget::renderer()
105106
return r;
106107
}
107108

109+
void QgsMultiBandColorRendererWidget::setMapCanvas( QgsMapCanvas* canvas )
110+
{
111+
QgsRasterRendererWidget::setMapCanvas( canvas );
112+
mMinMaxWidget->setMapCanvas( canvas );
113+
}
114+
108115
void QgsMultiBandColorRendererWidget::createValidators()
109116
{
110117
mRedMinLineEdit->setValidator( new QDoubleValidator( mRedMinLineEdit ) );

‎src/gui/raster/qgsmultibandcolorrendererwidget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class GUI_EXPORT QgsMultiBandColorRendererWidget: public QgsRasterRendererWidget
3838
~QgsMultiBandColorRendererWidget();
3939

4040
QgsRasterRenderer* renderer() override;
41+
void setMapCanvas( QgsMapCanvas* canvas ) override;
4142

4243
void setFromRenderer( const QgsRasterRenderer* r );
4344

‎src/gui/raster/qgsrasterminmaxwidget.cpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020

2121
#include "qgsrasterlayer.h"
2222
#include "qgsrasterminmaxwidget.h"
23+
#include "qgsmapcanvas.h"
2324

24-
QgsRasterMinMaxWidget::QgsRasterMinMaxWidget( QgsRasterLayer* theLayer, QWidget *parent ):
25-
QWidget( parent )
25+
QgsRasterMinMaxWidget::QgsRasterMinMaxWidget( QgsRasterLayer* theLayer, QWidget *parent )
26+
: QWidget( parent )
2627
, mLayer( theLayer )
28+
, mCanvas( nullptr )
2729
{
2830
QgsDebugMsg( "Entered." );
2931
setupUi( this );
@@ -50,6 +52,29 @@ QgsRasterMinMaxWidget::~QgsRasterMinMaxWidget()
5052
{
5153
}
5254

55+
void QgsRasterMinMaxWidget::setMapCanvas( QgsMapCanvas* canvas )
56+
{
57+
mCanvas = canvas;
58+
}
59+
60+
QgsMapCanvas* QgsRasterMinMaxWidget::mapCanvas()
61+
{
62+
return mCanvas;
63+
}
64+
65+
QgsRectangle QgsRasterMinMaxWidget::extent()
66+
{
67+
if ( !mCurrentExtentRadioButton->isChecked() )
68+
return QgsRectangle();
69+
70+
if ( mLayer && mCanvas )
71+
return mCanvas->mapSettings().outputExtentToLayerExtent( mLayer, mCanvas->extent() );
72+
else if ( mCanvas )
73+
return mCanvas->extent();
74+
else
75+
return QgsRectangle();
76+
}
77+
5378
void QgsRasterMinMaxWidget::on_mLoadPushButton_clicked()
5479
{
5580
QgsDebugMsg( "Entered." );

‎src/gui/raster/qgsrasterminmaxwidget.h

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,45 @@
2222
#include "qgsrasterlayer.h"
2323
#include "qgsrectangle.h"
2424

25+
class QgsMapCanvas;
26+
2527
class GUI_EXPORT QgsRasterMinMaxWidget: public QWidget, private Ui::QgsRasterMinMaxWidgetBase
2628
{
2729
Q_OBJECT
2830
public:
2931
QgsRasterMinMaxWidget( QgsRasterLayer* theLayer, QWidget *parent = nullptr );
3032
~QgsRasterMinMaxWidget();
3133

34+
/** Sets the extent to use for minimum and maximum value calculation.
35+
* @param theExtent extent in raster layer's CRS
36+
* @note if a map canvas is set using setMapCanvas(), its extent will take
37+
* precedence over any extent set using this method.
38+
*/
3239
void setExtent( const QgsRectangle & theExtent ) { mExtent = theExtent; }
3340

41+
/** Sets the map canvas associated with the widget. This allows the widget to retrieve the current
42+
* map extent from the canvas. If a canvas is set it will take precedence over any extent
43+
* set from calling setExtent().
44+
* @param canvas map canvas
45+
* @see mapCanvas()
46+
* @note added in QGIS 2.16
47+
*/
48+
void setMapCanvas( QgsMapCanvas* canvas );
49+
50+
/** Returns the map canvas associated with the widget.
51+
* @see setMapCanvas()
52+
* @see canvasExtent()
53+
* @note added in QGIS 2.16
54+
*/
55+
QgsMapCanvas* mapCanvas();
56+
3457
void setBands( const QList<int> & theBands ) { mBands = theBands; }
58+
3559
/** Return the extent selected by the user.
36-
Either an empty extent for 'full' or the current visible extent. */
37-
QgsRectangle extent() { return mCurrentExtentRadioButton->isChecked() ? mExtent : QgsRectangle(); }
60+
* Either an empty extent for 'full' or the current visible extent.
61+
*/
62+
QgsRectangle extent();
63+
3864
/** Return the selected sample size. */
3965
int sampleSize() { return mEstimateRadioButton->isChecked() ? 250000 : 0; }
4066

@@ -51,6 +77,9 @@ class GUI_EXPORT QgsRasterMinMaxWidget: public QWidget, private Ui::QgsRasterMin
5177
QgsRasterLayer* mLayer;
5278
QList<int> mBands;
5379
QgsRectangle mExtent;
80+
81+
QgsMapCanvas* mCanvas;
82+
QgsRasterLayer* mRasterLayer;
5483
};
5584

5685
#endif // QGSRASTERMINMAXWIDGET_H

‎src/gui/raster/qgsrasterrendererwidget.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,17 @@
1818
#include "qgsrasterrendererwidget.h"
1919
#include "qgsrasterdataprovider.h"
2020
#include "qgsrasterlayer.h"
21+
#include "qgsmapcanvas.h"
2122

23+
void QgsRasterRendererWidget::setMapCanvas( QgsMapCanvas* canvas )
24+
{
25+
mCanvas = canvas;
26+
}
27+
28+
QgsMapCanvas* QgsRasterRendererWidget::mapCanvas()
29+
{
30+
return mCanvas;
31+
}
2232

2333
QString QgsRasterRendererWidget::displayBandName( int band ) const
2434
{

‎src/gui/raster/qgsrasterrendererwidget.h

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,19 @@
2424

2525
class QgsRasterLayer;
2626
class QgsRasterRenderer;
27+
class QgsMapCanvas;
2728

2829
class GUI_EXPORT QgsRasterRendererWidget: public QWidget
2930
{
3031
Q_OBJECT
3132

3233
public:
33-
QgsRasterRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent ):
34-
mRasterLayer( layer )
34+
35+
//TODO QGIS 3.0 - remove extent parameter, replace with map canvas parameter
36+
QgsRasterRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent )
37+
: mRasterLayer( layer )
3538
, mExtent( extent )
39+
, mCanvas( nullptr )
3640
{}
3741

3842
virtual ~QgsRasterRendererWidget() {}
@@ -50,6 +54,21 @@ class GUI_EXPORT QgsRasterRendererWidget: public QWidget
5054
void setRasterLayer( QgsRasterLayer* layer ) { mRasterLayer = layer; }
5155
const QgsRasterLayer* rasterLayer() const { return mRasterLayer; }
5256

57+
/** Sets the map canvas associated with the widget. This allows the widget to retrieve the current
58+
* map extent and other properties from the canvas.
59+
* @param canvas map canvas
60+
* @see mapCanvas()
61+
* @note added in QGIS 2.16
62+
*/
63+
virtual void setMapCanvas( QgsMapCanvas* canvas );
64+
65+
/** Returns the map canvas associated with the widget.
66+
* @see setMapCanvas()
67+
* @see canvasExtent()
68+
* @note added in QGIS 2.16
69+
*/
70+
QgsMapCanvas* mapCanvas();
71+
5372
virtual QString min( int index = 0 ) { Q_UNUSED( index ); return QString(); }
5473
virtual QString max( int index = 0 ) { Q_UNUSED( index ); return QString(); }
5574
virtual void setMin( const QString& value, int index = 0 ) { Q_UNUSED( index ); Q_UNUSED( value ); }
@@ -73,6 +92,9 @@ class GUI_EXPORT QgsRasterRendererWidget: public QWidget
7392

7493
/** Current extent */
7594
QgsRectangle mExtent;
95+
96+
//! Associated map canvas
97+
QgsMapCanvas* mCanvas;
7698
};
7799

78100
#endif // QGSRASTERRENDERERWIDGET_H

‎src/gui/raster/qgsrendererrasterpropertieswidget.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ void QgsRendererRasterPropertiesWidget::setRendererWidget( const QString &render
324324
// Current canvas extent (used to calc min/max) in layer CRS
325325
QgsRectangle myExtent = mMapCanvas->mapSettings().outputExtentToLayerExtent( mRasterLayer, mMapCanvas->extent() );
326326
mRendererWidget = rendererEntry.widgetCreateFunction( mRasterLayer, myExtent );
327+
mRendererWidget->setMapCanvas( mMapCanvas );
327328
connect( mRendererWidget, SIGNAL( widgetChanged() ), this, SIGNAL( widgetChanged() ) );
328329
stackedWidget->addWidget( mRendererWidget );
329330
stackedWidget->setCurrentWidget( mRendererWidget );

‎src/gui/raster/qgssinglebandgrayrendererwidget.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ QgsSingleBandGrayRendererWidget::QgsSingleBandGrayRendererWidget( QgsRasterLayer
4141

4242
mMinMaxWidget = new QgsRasterMinMaxWidget( layer, this );
4343
mMinMaxWidget->setExtent( extent );
44+
mMinMaxWidget->setMapCanvas( mCanvas );
4445

4546
QHBoxLayout *layout = new QHBoxLayout();
4647
layout->setContentsMargins( 0, 0, 0, 0 );
@@ -105,6 +106,12 @@ QgsRasterRenderer* QgsSingleBandGrayRendererWidget::renderer()
105106
return renderer;
106107
}
107108

109+
void QgsSingleBandGrayRendererWidget::setMapCanvas( QgsMapCanvas* canvas )
110+
{
111+
QgsRasterRendererWidget::setMapCanvas( canvas );
112+
mMinMaxWidget->setMapCanvas( canvas );
113+
}
114+
108115
void QgsSingleBandGrayRendererWidget::loadMinMax( int theBandNo, double theMin, double theMax, int theOrigin )
109116
{
110117
Q_UNUSED( theBandNo );

‎src/gui/raster/qgssinglebandgrayrendererwidget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class GUI_EXPORT QgsSingleBandGrayRendererWidget: public QgsRasterRendererWidget
3333
static QgsRasterRendererWidget* create( QgsRasterLayer* layer, const QgsRectangle &theExtent ) { return new QgsSingleBandGrayRendererWidget( layer, theExtent ); }
3434

3535
QgsRasterRenderer* renderer() override;
36+
void setMapCanvas( QgsMapCanvas* canvas ) override;
3637

3738
void setFromRenderer( const QgsRasterRenderer* r );
3839

‎src/gui/raster/qgssinglebandpseudocolorrendererwidget.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ QgsSingleBandPseudoColorRendererWidget::QgsSingleBandPseudoColorRendererWidget(
100100

101101
mMinMaxWidget = new QgsRasterMinMaxWidget( layer, this );
102102
mMinMaxWidget->setExtent( extent );
103+
mMinMaxWidget->setMapCanvas( mCanvas );
104+
103105
QHBoxLayout *layout = new QHBoxLayout();
104106
layout->setContentsMargins( 0, 0, 0, 0 );
105107
mMinMaxContainerWidget->setLayout( layout );
@@ -191,6 +193,12 @@ QgsRasterRenderer* QgsSingleBandPseudoColorRendererWidget::renderer()
191193
return renderer;
192194
}
193195

196+
void QgsSingleBandPseudoColorRendererWidget::setMapCanvas( QgsMapCanvas* canvas )
197+
{
198+
QgsRasterRendererWidget::setMapCanvas( canvas );
199+
mMinMaxWidget->setMapCanvas( canvas );
200+
}
201+
194202
/** Generate labels from the values in the color map.
195203
* Skip labels which were manually edited (black text).
196204
* Text of generated labels is made gray

‎src/gui/raster/qgssinglebandpseudocolorrendererwidget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class GUI_EXPORT QgsSingleBandPseudoColorRendererWidget: public QgsRasterRendere
4040

4141
static QgsRasterRendererWidget* create( QgsRasterLayer* layer, const QgsRectangle &theExtent ) { return new QgsSingleBandPseudoColorRendererWidget( layer, theExtent ); }
4242
QgsRasterRenderer* renderer() override;
43+
void setMapCanvas( QgsMapCanvas* canvas ) override;
4344

4445
void setFromRenderer( const QgsRasterRenderer* r );
4546

1 commit comments

Comments
 (1)

nirvn commented on Jun 30, 2016

@nirvn
Contributor
Please sign in to comment.