Skip to content

Commit 1166768

Browse files
committedSep 21, 2018
Distance
1 parent ee8389a commit 1166768

File tree

5 files changed

+191
-6
lines changed

5 files changed

+191
-6
lines changed
 

‎python/gui/auto_generated/processing/qgsprocessingwidgetwrapper.sip.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ Returns the current value of the parameter.
197197
.. seealso:: :py:func:`setWidgetValue`
198198
%End
199199

200+
protected:
201+
202+
200203
};
201204

202205

‎src/gui/processing/qgsprocessingguiregistry.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ QgsProcessingGuiRegistry::QgsProcessingGuiRegistry()
3131
addParameterWidgetFactory( new QgsProcessingCrsWidgetWrapper() );
3232
addParameterWidgetFactory( new QgsProcessingStringWidgetWrapper() );
3333
addParameterWidgetFactory( new QgsProcessingNumericWidgetWrapper() );
34+
addParameterWidgetFactory( new QgsProcessingDistanceWidgetWrapper() );
3435
}
3536

3637
QgsProcessingGuiRegistry::~QgsProcessingGuiRegistry()

‎src/gui/processing/qgsprocessingwidgetwrapper.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,10 @@ class GUI_EXPORT QgsAbstractProcessingParameterWidgetWrapper : public QObject
223223
*/
224224
virtual QVariant widgetValue() const = 0;
225225

226+
protected:
227+
228+
QgsProcessingContextGenerator *mProcessingContextGenerator = nullptr;
229+
226230
private slots:
227231

228232
void parentLayerChanged( QgsAbstractProcessingParameterWidgetWrapper *wrapper );
@@ -231,7 +235,6 @@ class GUI_EXPORT QgsAbstractProcessingParameterWidgetWrapper : public QObject
231235

232236
QgsProcessingGui::WidgetType mType = QgsProcessingGui::Standard;
233237
const QgsProcessingParameterDefinition *mParameterDefinition = nullptr;
234-
QgsProcessingContextGenerator *mProcessingContextGenerator = nullptr;
235238

236239
void setDynamicParentLayerParameter( const QVariant &value );
237240

‎src/gui/processing/qgsprocessingwidgetwrapperimpl.cpp

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "qgsprojectionselectionwidget.h"
2222
#include "qgsspinbox.h"
2323
#include "qgsdoublespinbox.h"
24+
#include "qgsprocessingcontext.h"
2425
#include <QLabel>
2526
#include <QHBoxLayout>
2627
#include <QCheckBox>
@@ -635,5 +636,148 @@ QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingNumericWidgetWrapper::
635636
return new QgsProcessingNumericWidgetWrapper( parameter, type );
636637
}
637638

639+
//
640+
// QgsProcessingDistanceWidgetWrapper
641+
//
642+
643+
QgsProcessingDistanceWidgetWrapper::QgsProcessingDistanceWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type, QWidget *parent )
644+
: QgsProcessingNumericWidgetWrapper( parameter, type, parent )
645+
{
646+
647+
}
648+
649+
QString QgsProcessingDistanceWidgetWrapper::parameterType() const
650+
{
651+
return QgsProcessingParameterDistance::typeName();
652+
}
653+
654+
QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingDistanceWidgetWrapper::createWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type )
655+
{
656+
return new QgsProcessingDistanceWidgetWrapper( parameter, type );
657+
}
658+
659+
QWidget *QgsProcessingDistanceWidgetWrapper::createWidget()
660+
{
661+
QWidget *spin = QgsProcessingNumericWidgetWrapper::createWidget();
662+
663+
mLabel = new QLabel();
664+
mUnitsCombo = new QComboBox();
665+
666+
mUnitsCombo->addItem( QgsUnitTypes::toString( QgsUnitTypes::DistanceMeters ), QgsUnitTypes::DistanceMeters );
667+
mUnitsCombo->addItem( QgsUnitTypes::toString( QgsUnitTypes::DistanceKilometers ), QgsUnitTypes::DistanceKilometers );
668+
mUnitsCombo->addItem( QgsUnitTypes::toString( QgsUnitTypes::DistanceFeet ), QgsUnitTypes::DistanceFeet );
669+
mUnitsCombo->addItem( QgsUnitTypes::toString( QgsUnitTypes::DistanceMiles ), QgsUnitTypes::DistanceMiles );
670+
mUnitsCombo->addItem( QgsUnitTypes::toString( QgsUnitTypes::DistanceYards ), QgsUnitTypes::DistanceYards );
671+
672+
const double labelMargin = mUnitsCombo->fontMetrics().width( 'X' );
673+
QHBoxLayout *layout = new QHBoxLayout();
674+
layout->addWidget( spin, 1 );
675+
layout->insertSpacing( 1, labelMargin / 2 );
676+
layout->insertWidget( 2, mLabel );
677+
layout->insertWidget( 3, mUnitsCombo );
678+
layout->insertSpacing( 4, labelMargin / 2 );
679+
680+
mWarningLabel = new QLabel();
681+
QIcon icon = QgsApplication::getThemeIcon( QStringLiteral( "mIconWarning.svg" ) );
682+
const int size = static_cast< int >( std::max( 24.0, spin->height() * 0.5 ) );
683+
mWarningLabel->setPixmap( icon.pixmap( icon.actualSize( QSize( size, size ) ) ) );
684+
mWarningLabel->setToolTip( tr( "Distance is in geographic degrees. Consider reprojecting to a projected local coordinate system for accurate results." ) );
685+
layout->insertWidget( 4, mWarningLabel );
686+
layout->insertSpacing( 5, labelMargin );
687+
688+
setUnits( QgsUnitTypes::DistanceUnknownUnit );
689+
690+
QWidget *w = new QWidget();
691+
layout->setMargin( 0 );
692+
layout->setContentsMargins( 0, 0, 0, 0 );
693+
w->setLayout( layout );
694+
return w;
695+
}
696+
697+
void QgsProcessingDistanceWidgetWrapper::postInitialize( const QList<QgsAbstractProcessingParameterWidgetWrapper *> &wrappers )
698+
{
699+
QgsProcessingNumericWidgetWrapper::postInitialize( wrappers );
700+
switch ( type() )
701+
{
702+
case QgsProcessingGui::Batch:
703+
case QgsProcessingGui::Standard:
704+
{
705+
for ( const QgsAbstractProcessingParameterWidgetWrapper *wrapper : wrappers )
706+
{
707+
if ( wrapper->parameterDefinition()->name() == static_cast< const QgsProcessingParameterDistance * >( parameterDefinition() )->parentParameterName() )
708+
{
709+
setUnitParameterValue( wrapper->parameterValue() );
710+
connect( wrapper, &QgsAbstractProcessingParameterWidgetWrapper::widgetValueHasChanged, this, [ = ]
711+
{
712+
setUnitParameterValue( wrapper->parameterValue() );
713+
} );
714+
break;
715+
}
716+
}
717+
break;
718+
}
719+
720+
case QgsProcessingGui::Modeler:
721+
break;
722+
}
723+
}
724+
725+
void QgsProcessingDistanceWidgetWrapper::setUnitParameterValue( const QVariant &value )
726+
{
727+
QgsUnitTypes::DistanceUnit units = QgsUnitTypes::DistanceUnknownUnit;
728+
729+
// evaluate value to layer
730+
QgsProcessingContext *context = nullptr;
731+
std::unique_ptr< QgsProcessingContext > tmpContext;
732+
if ( mProcessingContextGenerator )
733+
context = mProcessingContextGenerator->processingContext();
734+
735+
if ( !context )
736+
{
737+
tmpContext = qgis::make_unique< QgsProcessingContext >();
738+
context = tmpContext.get();
739+
}
740+
741+
QgsCoordinateReferenceSystem crs = QgsProcessingParameters::parameterAsCrs( parameterDefinition(), value, *context );
742+
if ( crs.isValid() )
743+
{
744+
units = crs.mapUnits();
745+
}
746+
747+
setUnits( units );
748+
}
749+
750+
void QgsProcessingDistanceWidgetWrapper::setUnits( const QgsUnitTypes::DistanceUnit units )
751+
{
752+
mLabel->setText( QgsUnitTypes::toString( units ) );
753+
if ( QgsUnitTypes::unitType( units ) != QgsUnitTypes::Standard )
754+
{
755+
mUnitsCombo->hide();
756+
mLabel->show();
757+
}
758+
else
759+
{
760+
mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( units ) );
761+
mUnitsCombo->show();
762+
mLabel->hide();
763+
mWarningLabel->setVisible( units == QgsUnitTypes::DistanceDegrees );
764+
mBaseUnit = units;
765+
}
766+
}
767+
768+
QVariant QgsProcessingDistanceWidgetWrapper::widgetValue() const
769+
{
770+
const QVariant val = QgsProcessingNumericWidgetWrapper::widgetValue();
771+
if ( val.type() == QVariant::Double && mUnitsCombo->isVisible() )
772+
{
773+
QgsUnitTypes::DistanceUnit displayUnit = static_cast<QgsUnitTypes::DistanceUnit >( mUnitsCombo->currentData().toInt() );
774+
return val.toDouble() * QgsUnitTypes::fromUnitToUnitFactor( displayUnit, mBaseUnit );
775+
}
776+
else
777+
{
778+
return val;
779+
}
780+
}
781+
638782

639783
///@endcond PRIVATE

‎src/gui/processing/qgsprocessingwidgetwrapperimpl.h

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,22 +165,56 @@ class GUI_EXPORT QgsProcessingNumericWidgetWrapper : public QgsAbstractProcessin
165165

166166
QList< int > compatibleDataTypes() const override;
167167

168-
private:
169-
170-
static double calculateStep( double minimum, double maximum );
168+
protected:
171169

172170
QgsSpinBox *mSpinBox = nullptr;
173171
QgsDoubleSpinBox *mDoubleSpinBox = nullptr;
174172

175-
QLineEdit *mLineEdit = nullptr;
176-
QPlainTextEdit *mPlainTextEdit = nullptr;
173+
private:
174+
175+
static double calculateStep( double minimum, double maximum );
177176

178177
bool mAllowingNull = false;
179178

180179
friend class TestProcessingGui;
181180
};
182181

183182

183+
class GUI_EXPORT QgsProcessingDistanceWidgetWrapper : public QgsProcessingNumericWidgetWrapper
184+
{
185+
Q_OBJECT
186+
187+
public:
188+
189+
QgsProcessingDistanceWidgetWrapper( const QgsProcessingParameterDefinition *parameter = nullptr,
190+
QgsProcessingGui::WidgetType type = QgsProcessingGui::Standard, QWidget *parent = nullptr );
191+
192+
// QgsProcessingParameterWidgetFactoryInterface
193+
QString parameterType() const override;
194+
QgsAbstractProcessingParameterWidgetWrapper *createWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type ) override;
195+
196+
// QgsProcessingParameterWidgetWrapper interface
197+
QWidget *createWidget() override SIP_FACTORY;
198+
void postInitialize( const QList< QgsAbstractProcessingParameterWidgetWrapper * > &wrappers ) override;
199+
200+
public slots:
201+
void setUnitParameterValue( const QVariant &value );
202+
void setUnits( QgsUnitTypes::DistanceUnit unit );
203+
204+
protected:
205+
206+
QVariant widgetValue() const override;
207+
208+
private:
209+
210+
QgsUnitTypes::DistanceUnit mBaseUnit = QgsUnitTypes::DistanceUnknownUnit;
211+
QLabel *mLabel = nullptr;
212+
QLabel *mWarningLabel = nullptr;
213+
QComboBox *mUnitsCombo = nullptr;
214+
215+
friend class TestProcessingGui;
216+
};
217+
184218
///@endcond PRIVATE
185219

186220
#endif // QGSPROCESSINGWIDGETWRAPPERIMPL_H

0 commit comments

Comments
 (0)
Please sign in to comment.