Skip to content

Commit f79d86e

Browse files
committedSep 5, 2018
[processing] Port string widget wrapper to new c++ class
1 parent e10d16e commit f79d86e

File tree

4 files changed

+338
-2
lines changed

4 files changed

+338
-2
lines changed
 

‎src/gui/processing/qgsprocessingguiregistry.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ QgsProcessingGuiRegistry::QgsProcessingGuiRegistry()
2828
addAlgorithmConfigurationWidgetFactory( new QgsFilterAlgorithmConfigurationWidgetFactory() );
2929

3030
addParameterWidgetFactory( new QgsProcessingBooleanWidgetWrapper() );
31+
addParameterWidgetFactory( new QgsProcessingStringWidgetWrapper() );
3132
}
3233

3334
QgsProcessingGuiRegistry::~QgsProcessingGuiRegistry()

‎src/gui/processing/qgsprocessingwidgetwrapperimpl.cpp

Lines changed: 121 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include <QHBoxLayout>
2323
#include <QCheckBox>
2424
#include <QComboBox>
25+
#include <QLineEdit>
26+
#include <QPlainTextEdit>
2527

2628
///@cond PRIVATE
2729

@@ -120,18 +122,25 @@ QVariant QgsProcessingBooleanWidgetWrapper::widgetValue() const
120122

121123
QStringList QgsProcessingBooleanWidgetWrapper::compatibleParameterTypes() const
122124
{
125+
//pretty much everything is compatible here and can be converted to a bool!
123126
return QStringList() << QgsProcessingParameterBoolean::typeName()
127+
<< QgsProcessingParameterString::typeName()
124128
<< QgsProcessingParameterNumber::typeName()
129+
<< QgsProcessingParameterDistance::typeName()
130+
<< QgsProcessingParameterFile::typeName()
131+
<< QgsProcessingParameterField::typeName()
125132
<< QgsProcessingParameterFeatureSource::typeName()
126133
<< QgsProcessingParameterMapLayer::typeName()
127134
<< QgsProcessingParameterRasterLayer::typeName()
128-
<< QgsProcessingParameterVectorLayer::typeName();
135+
<< QgsProcessingParameterVectorLayer::typeName()
136+
<< QgsProcessingParameterExpression::typeName();
129137
}
130138

131139
QStringList QgsProcessingBooleanWidgetWrapper::compatibleOutputTypes() const
132140
{
133141
return QStringList() << QgsProcessingOutputNumber::typeName()
134142
<< QgsProcessingOutputMapLayer::typeName()
143+
<< QgsProcessingOutputFile::typeName()
135144
<< QgsProcessingOutputRasterLayer::typeName()
136145
<< QgsProcessingOutputVectorLayer::typeName()
137146
<< QgsProcessingOutputString::typeName();
@@ -144,7 +153,7 @@ QList<int> QgsProcessingBooleanWidgetWrapper::compatibleDataTypes() const
144153

145154
QString QgsProcessingBooleanWidgetWrapper::parameterType() const
146155
{
147-
return QStringLiteral( "boolean" );
156+
return QgsProcessingParameterBoolean::typeName();
148157
}
149158

150159
QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingBooleanWidgetWrapper::createWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type )
@@ -153,4 +162,114 @@ QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingBooleanWidgetWrapper::
153162
}
154163

155164

165+
166+
//
167+
// QgsProcessingStringWidgetWrapper
168+
//
169+
170+
QgsProcessingStringWidgetWrapper::QgsProcessingStringWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type, QWidget *parent )
171+
: QgsAbstractProcessingParameterWidgetWrapper( parameter, type, parent )
172+
{
173+
174+
}
175+
176+
QWidget *QgsProcessingStringWidgetWrapper::createWidget()
177+
{
178+
switch ( type() )
179+
{
180+
case QgsProcessingGui::Standard:
181+
case QgsProcessingGui::Modeler:
182+
{
183+
if ( static_cast< const QgsProcessingParameterString * >( parameterDefinition() )->multiLine() )
184+
{
185+
mPlainTextEdit = new QPlainTextEdit();
186+
mPlainTextEdit->setToolTip( parameterDefinition()->toolTip() );
187+
188+
connect( mPlainTextEdit, &QPlainTextEdit::textChanged, this, [ = ]
189+
{
190+
emit widgetValueHasChanged( this );
191+
} );
192+
return mPlainTextEdit;
193+
}
194+
else
195+
{
196+
mLineEdit = new QLineEdit();
197+
mLineEdit->setToolTip( parameterDefinition()->toolTip() );
198+
199+
connect( mLineEdit, &QLineEdit::textChanged, this, [ = ]
200+
{
201+
emit widgetValueHasChanged( this );
202+
} );
203+
return mLineEdit;
204+
}
205+
};
206+
207+
case QgsProcessingGui::Batch:
208+
{
209+
mLineEdit = new QLineEdit();
210+
mLineEdit->setToolTip( parameterDefinition()->toolTip() );
211+
212+
connect( mLineEdit, &QLineEdit::textChanged, this, [ = ]
213+
{
214+
emit widgetValueHasChanged( this );
215+
} );
216+
return mLineEdit;
217+
}
218+
}
219+
return nullptr;
220+
}
221+
222+
void QgsProcessingStringWidgetWrapper::setWidgetValue( const QVariant &value, const QgsProcessingContext &context )
223+
{
224+
const QString v = QgsProcessingParameters::parameterAsString( parameterDefinition(), value, context );
225+
if ( mLineEdit )
226+
mLineEdit->setText( v );
227+
if ( mPlainTextEdit )
228+
mPlainTextEdit->setPlainText( v );
229+
}
230+
231+
QVariant QgsProcessingStringWidgetWrapper::widgetValue() const
232+
{
233+
if ( mLineEdit )
234+
return mLineEdit->text();
235+
else if ( mPlainTextEdit )
236+
return mPlainTextEdit->toPlainText();
237+
else
238+
return QVariant();
239+
}
240+
241+
QStringList QgsProcessingStringWidgetWrapper::compatibleParameterTypes() const
242+
{
243+
return QStringList()
244+
<< QgsProcessingParameterString::typeName()
245+
<< QgsProcessingParameterNumber::typeName()
246+
<< QgsProcessingParameterDistance::typeName()
247+
<< QgsProcessingParameterFile::typeName()
248+
<< QgsProcessingParameterField::typeName()
249+
<< QgsProcessingParameterExpression::typeName();
250+
}
251+
252+
QStringList QgsProcessingStringWidgetWrapper::compatibleOutputTypes() const
253+
{
254+
return QStringList() << QgsProcessingOutputNumber::typeName()
255+
<< QgsProcessingOutputFile::typeName()
256+
<< QgsProcessingOutputString::typeName();
257+
}
258+
259+
QList<int> QgsProcessingStringWidgetWrapper::compatibleDataTypes() const
260+
{
261+
return QList< int >();
262+
}
263+
264+
QString QgsProcessingStringWidgetWrapper::parameterType() const
265+
{
266+
return QgsProcessingParameterString::typeName();
267+
}
268+
269+
QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingStringWidgetWrapper::createWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type )
270+
{
271+
return new QgsProcessingStringWidgetWrapper( parameter, type );
272+
}
273+
274+
156275
///@endcond PRIVATE

‎src/gui/processing/qgsprocessingwidgetwrapperimpl.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424

2525
class QCheckBox;
2626
class QComboBox;
27+
class QLineEdit;
28+
class QPlainTextEdit;
29+
2730

2831
///@cond PRIVATE
2932

@@ -63,6 +66,43 @@ class GUI_EXPORT QgsProcessingBooleanWidgetWrapper : public QgsAbstractProcessin
6366
friend class TestProcessingGui;
6467
};
6568

69+
70+
class GUI_EXPORT QgsProcessingStringWidgetWrapper : public QgsAbstractProcessingParameterWidgetWrapper, public QgsProcessingParameterWidgetFactoryInterface
71+
{
72+
Q_OBJECT
73+
74+
public:
75+
76+
QgsProcessingStringWidgetWrapper( const QgsProcessingParameterDefinition *parameter = nullptr,
77+
QgsProcessingGui::WidgetType type = QgsProcessingGui::Standard, QWidget *parent = nullptr );
78+
79+
// QgsProcessingParameterWidgetFactoryInterface
80+
QString parameterType() const override;
81+
QgsAbstractProcessingParameterWidgetWrapper *createWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type ) override;
82+
83+
// QgsProcessingParameterWidgetWrapper interface
84+
QWidget *createWidget() override SIP_FACTORY;
85+
86+
protected:
87+
88+
void setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) override;
89+
QVariant widgetValue() const override;
90+
91+
QStringList compatibleParameterTypes() const override;
92+
93+
QStringList compatibleOutputTypes() const override;
94+
95+
QList< int > compatibleDataTypes() const override;
96+
97+
private:
98+
99+
QLineEdit *mLineEdit = nullptr;
100+
QPlainTextEdit *mPlainTextEdit = nullptr;
101+
102+
friend class TestProcessingGui;
103+
};
104+
105+
66106
///@endcond PRIVATE
67107

68108
#endif // QGSPROCESSINGWIDGETWRAPPERIMPL_H

‎tests/src/gui/testprocessinggui.cpp

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include <QComboBox>
2222
#include <QStackedWidget>
2323
#include <QToolButton>
24+
#include <QLineEdit>
25+
#include <QPlainTextEdit>
2426

2527
#include "qgstest.h"
2628
#include "qgsgui.h"
@@ -138,6 +140,7 @@ class TestProcessingGui : public QObject
138140
void testWrapperDynamic();
139141
void testModelerWrapper();
140142
void testBooleanWrapper();
143+
void testStringWrapper();
141144
};
142145

143146
void TestProcessingGui::initTestCase()
@@ -561,5 +564,178 @@ void TestProcessingGui::testBooleanWrapper()
561564
delete l;
562565
}
563566

567+
void TestProcessingGui::testStringWrapper()
568+
{
569+
QgsProcessingParameterString param( QStringLiteral( "string" ), QStringLiteral( "string" ) );
570+
571+
// standard wrapper
572+
QgsProcessingStringWidgetWrapper wrapper( &param );
573+
574+
QgsProcessingContext context;
575+
QWidget *w = wrapper.createWrappedWidget( context );
576+
577+
QSignalSpy spy( &wrapper, &QgsProcessingStringWidgetWrapper::widgetValueHasChanged );
578+
wrapper.setWidgetValue( QStringLiteral( "a" ), context );
579+
QCOMPARE( spy.count(), 1 );
580+
QCOMPARE( wrapper.widgetValue().toString(), QStringLiteral( "a" ) );
581+
QCOMPARE( static_cast< QLineEdit * >( wrapper.wrappedWidget() )->text(), QStringLiteral( "a" ) );
582+
wrapper.setWidgetValue( QString(), context );
583+
QCOMPARE( spy.count(), 2 );
584+
QVERIFY( wrapper.widgetValue().toString().isEmpty() );
585+
QVERIFY( static_cast< QLineEdit * >( wrapper.wrappedWidget() )->text().isEmpty() );
586+
587+
QLabel *l = wrapper.createWrappedLabel();
588+
QVERIFY( l );
589+
QCOMPARE( l->text(), QStringLiteral( "string" ) );
590+
QCOMPARE( l->toolTip(), param.toolTip() );
591+
delete l;
592+
593+
// check signal
594+
static_cast< QLineEdit * >( wrapper.wrappedWidget() )->setText( QStringLiteral( "b" ) );
595+
QCOMPARE( spy.count(), 3 );
596+
static_cast< QLineEdit * >( wrapper.wrappedWidget() )->clear();
597+
QCOMPARE( spy.count(), 4 );
598+
599+
delete w;
600+
601+
// batch wrapper
602+
QgsProcessingStringWidgetWrapper wrapperB( &param, QgsProcessingGui::Batch );
603+
604+
w = wrapperB.createWrappedWidget( context );
605+
QSignalSpy spy2( &wrapperB, &QgsProcessingStringWidgetWrapper::widgetValueHasChanged );
606+
wrapperB.setWidgetValue( QStringLiteral( "a" ), context );
607+
QCOMPARE( spy2.count(), 1 );
608+
QCOMPARE( wrapperB.widgetValue().toString(), QStringLiteral( "a" ) );
609+
QCOMPARE( static_cast< QLineEdit * >( wrapperB.wrappedWidget() )->text(), QStringLiteral( "a" ) );
610+
wrapperB.setWidgetValue( QString(), context );
611+
QCOMPARE( spy2.count(), 2 );
612+
QVERIFY( wrapperB.widgetValue().toString().isEmpty() );
613+
QVERIFY( static_cast< QLineEdit * >( wrapperB.wrappedWidget() )->text().isEmpty() );
614+
615+
// check signal
616+
static_cast< QLineEdit * >( w )->setText( QStringLiteral( "x" ) );
617+
QCOMPARE( spy2.count(), 3 );
618+
static_cast< QLineEdit * >( w )->clear();
619+
QCOMPARE( spy2.count(), 4 );
620+
621+
// should be no label in batch mode
622+
QVERIFY( !wrapperB.createWrappedLabel() );
623+
delete w;
624+
625+
// modeler wrapper
626+
QgsProcessingStringWidgetWrapper wrapperM( &param, QgsProcessingGui::Modeler );
627+
628+
w = wrapperM.createWrappedWidget( context );
629+
QSignalSpy spy3( &wrapperM, &QgsProcessingStringWidgetWrapper::widgetValueHasChanged );
630+
wrapperM.setWidgetValue( QStringLiteral( "a" ), context );
631+
QCOMPARE( wrapperM.widgetValue().toString(), QStringLiteral( "a" ) );
632+
QCOMPARE( spy3.count(), 1 );
633+
QCOMPARE( static_cast< QLineEdit * >( wrapperM.wrappedWidget() )->text(), QStringLiteral( "a" ) );
634+
wrapperM.setWidgetValue( QString(), context );
635+
QVERIFY( wrapperM.widgetValue().toString().isEmpty() );
636+
QCOMPARE( spy3.count(), 2 );
637+
QVERIFY( static_cast< QLineEdit * >( wrapperM.wrappedWidget() )->text().isEmpty() );
638+
639+
// check signal
640+
static_cast< QLineEdit * >( w )->setText( QStringLiteral( "x" ) );
641+
QCOMPARE( spy3.count(), 3 );
642+
static_cast< QLineEdit * >( w )->clear();
643+
QCOMPARE( spy3.count(), 4 );
644+
645+
// should be a label in modeler mode
646+
l = wrapperM.createWrappedLabel();
647+
QVERIFY( l );
648+
QCOMPARE( l->text(), QStringLiteral( "string" ) );
649+
QCOMPARE( l->toolTip(), param.toolTip() );
650+
delete w;
651+
delete l;
652+
653+
//
654+
// multiline parameter
655+
//
656+
param = QgsProcessingParameterString( QStringLiteral( "string" ), QStringLiteral( "string" ), QVariant(), true );
657+
658+
// standard wrapper
659+
QgsProcessingStringWidgetWrapper wrapperMultiLine( &param );
660+
661+
w = wrapperMultiLine.createWrappedWidget( context );
662+
663+
QSignalSpy spy4( &wrapperMultiLine, &QgsProcessingStringWidgetWrapper::widgetValueHasChanged );
664+
wrapperMultiLine.setWidgetValue( QStringLiteral( "a" ), context );
665+
QCOMPARE( spy4.count(), 1 );
666+
QCOMPARE( wrapperMultiLine.widgetValue().toString(), QStringLiteral( "a" ) );
667+
QCOMPARE( static_cast< QPlainTextEdit * >( wrapperMultiLine.wrappedWidget() )->toPlainText(), QStringLiteral( "a" ) );
668+
wrapperMultiLine.setWidgetValue( QString(), context );
669+
QCOMPARE( spy4.count(), 2 );
670+
QVERIFY( wrapperMultiLine.widgetValue().toString().isEmpty() );
671+
QVERIFY( static_cast< QPlainTextEdit * >( wrapperMultiLine.wrappedWidget() )->toPlainText().isEmpty() );
672+
673+
l = wrapper.createWrappedLabel();
674+
QVERIFY( l );
675+
QCOMPARE( l->text(), QStringLiteral( "string" ) );
676+
QCOMPARE( l->toolTip(), param.toolTip() );
677+
delete l;
678+
679+
// check signal
680+
static_cast< QPlainTextEdit * >( wrapperMultiLine.wrappedWidget() )->setPlainText( QStringLiteral( "b" ) );
681+
QCOMPARE( spy4.count(), 3 );
682+
static_cast< QPlainTextEdit * >( wrapperMultiLine.wrappedWidget() )->clear();
683+
QCOMPARE( spy4.count(), 4 );
684+
685+
delete w;
686+
687+
// batch wrapper - should still be a line edit
688+
QgsProcessingStringWidgetWrapper wrapperMultiLineB( &param, QgsProcessingGui::Batch );
689+
690+
w = wrapperMultiLineB.createWrappedWidget( context );
691+
QSignalSpy spy5( &wrapperMultiLineB, &QgsProcessingStringWidgetWrapper::widgetValueHasChanged );
692+
wrapperMultiLineB.setWidgetValue( QStringLiteral( "a" ), context );
693+
QCOMPARE( spy5.count(), 1 );
694+
QCOMPARE( wrapperMultiLineB.widgetValue().toString(), QStringLiteral( "a" ) );
695+
QCOMPARE( static_cast< QLineEdit * >( wrapperMultiLineB.wrappedWidget() )->text(), QStringLiteral( "a" ) );
696+
wrapperMultiLineB.setWidgetValue( QString(), context );
697+
QCOMPARE( spy5.count(), 2 );
698+
QVERIFY( wrapperMultiLineB.widgetValue().toString().isEmpty() );
699+
QVERIFY( static_cast< QLineEdit * >( wrapperMultiLineB.wrappedWidget() )->text().isEmpty() );
700+
701+
// check signal
702+
static_cast< QLineEdit * >( w )->setText( QStringLiteral( "x" ) );
703+
QCOMPARE( spy5.count(), 3 );
704+
static_cast< QLineEdit * >( w )->clear();
705+
QCOMPARE( spy5.count(), 4 );
706+
707+
// should be no label in batch mode
708+
QVERIFY( !wrapperB.createWrappedLabel() );
709+
delete w;
710+
711+
// modeler wrapper
712+
QgsProcessingStringWidgetWrapper wrapperMultiLineM( &param, QgsProcessingGui::Modeler );
713+
714+
w = wrapperMultiLineM.createWrappedWidget( context );
715+
QSignalSpy spy6( &wrapperMultiLineM, &QgsProcessingStringWidgetWrapper::widgetValueHasChanged );
716+
wrapperMultiLineM.setWidgetValue( QStringLiteral( "a" ), context );
717+
QCOMPARE( wrapperMultiLineM.widgetValue().toString(), QStringLiteral( "a" ) );
718+
QCOMPARE( spy6.count(), 1 );
719+
QCOMPARE( static_cast< QPlainTextEdit * >( wrapperMultiLineM.wrappedWidget() )->toPlainText(), QStringLiteral( "a" ) );
720+
wrapperMultiLineM.setWidgetValue( QString(), context );
721+
QVERIFY( wrapperMultiLineM.widgetValue().toString().isEmpty() );
722+
QCOMPARE( spy6.count(), 2 );
723+
QVERIFY( static_cast< QPlainTextEdit * >( wrapperMultiLineM.wrappedWidget() )->toPlainText().isEmpty() );
724+
725+
// check signal
726+
static_cast< QPlainTextEdit * >( w )->setPlainText( QStringLiteral( "x" ) );
727+
QCOMPARE( spy6.count(), 3 );
728+
static_cast< QPlainTextEdit * >( w )->clear();
729+
QCOMPARE( spy6.count(), 4 );
730+
731+
// should be a label in modeler mode
732+
l = wrapperMultiLineM.createWrappedLabel();
733+
QVERIFY( l );
734+
QCOMPARE( l->text(), QStringLiteral( "string" ) );
735+
QCOMPARE( l->toolTip(), param.toolTip() );
736+
delete w;
737+
delete l;
738+
}
739+
564740
QGSTEST_MAIN( TestProcessingGui )
565741
#include "testprocessinggui.moc"

0 commit comments

Comments
 (0)
Please sign in to comment.