QGIS/src/app/mesh/qgsmeshrendererscalarsettingswidget.cpp
Martin Dobias d91e12d417 Fix missing min/max values for classification when changing datasets
The min/max values were stored in the color ramp shader, but to my surprise
these values were never persisted or copied: pseudo-color raster renderer
has a separate storage for the min/max values, so we need that for mesh renderer
as well.

The QgsRasterShaderFunction is not really useful, and QgsColorRamp should not
be derived from it, making things just more confusing.
2018-08-17 09:34:41 +02:00

100 lines
4.1 KiB
C++

/***************************************************************************
qgsmeshrendererscalarsettingswidget.cpp
---------------------------------------
begin : June 2018
copyright : (C) 2018 by Peter Petrik
email : zilolv at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsmeshrendererscalarsettingswidget.h"
#include "qgis.h"
#include "qgsmeshlayer.h"
#include "qgsmeshlayerutils.h"
#include "qgsmessagelog.h"
QgsMeshRendererScalarSettingsWidget::QgsMeshRendererScalarSettingsWidget( QWidget *parent )
: QWidget( parent )
{
setupUi( this );
connect( mScalarRecalculateMinMaxButton, &QPushButton::clicked, this, &QgsMeshRendererScalarSettingsWidget::recalculateMinMaxButtonClicked );
connect( mScalarMinLineEdit, &QLineEdit::textChanged, this, &QgsMeshRendererScalarSettingsWidget::minMaxChanged );
connect( mScalarMaxLineEdit, &QLineEdit::textChanged, this, &QgsMeshRendererScalarSettingsWidget::minMaxChanged );
connect( mScalarMinLineEdit, &QLineEdit::textEdited, this, &QgsMeshRendererScalarSettingsWidget::minMaxEdited );
connect( mScalarMaxLineEdit, &QLineEdit::textEdited, this, &QgsMeshRendererScalarSettingsWidget::minMaxEdited );
connect( mScalarColorRampShaderWidget, &QgsColorRampShaderWidget::widgetChanged, this, &QgsMeshRendererScalarSettingsWidget::widgetChanged );
}
void QgsMeshRendererScalarSettingsWidget::setLayer( QgsMeshLayer *layer )
{
mMeshLayer = layer;
}
QgsMeshRendererScalarSettings QgsMeshRendererScalarSettingsWidget::settings() const
{
QgsMeshRendererScalarSettings settings;
settings.setColorRampShader( mScalarColorRampShaderWidget->shader() );
settings.setClassificationMinMax( lineEditValue( mScalarMinLineEdit ), lineEditValue( mScalarMaxLineEdit ) );
return settings;
}
void QgsMeshRendererScalarSettingsWidget::syncToLayer( )
{
if ( !mMeshLayer )
return;
if ( mActiveDatasetGroup < 0 )
return;
const QgsMeshRendererSettings rendererSettings = mMeshLayer->rendererSettings();
const QgsMeshRendererScalarSettings settings = rendererSettings.scalarSettings( mActiveDatasetGroup );
const QgsColorRampShader shader = settings.colorRampShader();
whileBlocking( mScalarMinLineEdit )->setText( QString::number( settings.classificationMin() ) );
whileBlocking( mScalarMaxLineEdit )->setText( QString::number( settings.classificationMax() ) );
whileBlocking( mScalarColorRampShaderWidget )->setFromShader( shader );
}
double QgsMeshRendererScalarSettingsWidget::lineEditValue( const QLineEdit *lineEdit ) const
{
if ( lineEdit->text().isEmpty() )
{
return std::numeric_limits<double>::quiet_NaN();
}
return lineEdit->text().toDouble();
}
void QgsMeshRendererScalarSettingsWidget::minMaxChanged()
{
double min = lineEditValue( mScalarMinLineEdit );
double max = lineEditValue( mScalarMaxLineEdit );
mScalarColorRampShaderWidget->setMinimumMaximum( min, max );
}
void QgsMeshRendererScalarSettingsWidget::minMaxEdited()
{
double min = lineEditValue( mScalarMinLineEdit );
double max = lineEditValue( mScalarMaxLineEdit );
mScalarColorRampShaderWidget->setMinimumMaximumAndClassify( min, max );
}
void QgsMeshRendererScalarSettingsWidget::recalculateMinMaxButtonClicked()
{
double min, max;
QgsMeshLayerUtils::calculateMinMaxForDatasetGroup( min, max, mMeshLayer->dataProvider(), mActiveDatasetGroup );
whileBlocking( mScalarMinLineEdit )->setText( QString::number( min ) );
whileBlocking( mScalarMaxLineEdit )->setText( QString::number( max ) );
mScalarColorRampShaderWidget->setMinimumMaximumAndClassify( min, max );
}