Skip to content

Commit 22f1a1d

Browse files
committed
Implement QgsEditorWidgetWrapper::showIndeterminateState() for setting
editor widgets into an indeterminant "unknown value" state Works for all editor widgets except date time, range and uuid widgets.
1 parent 16274d5 commit 22f1a1d

30 files changed

+226
-21
lines changed

python/gui/editorwidgets/core/qgseditorwidgetwrapper.sip

+5
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ class QgsEditorWidgetWrapper : QgsWidgetWrapper
8383
*/
8484
void setEnabled( bool enabled );
8585

86+
/** Sets the widget to display in an indeterminate "mixed value" state.
87+
* @note added in QGIS 2.16
88+
*/
89+
virtual void showIndeterminateState();
90+
8691
signals:
8792
/**
8893
* Emit this signal, whenever the value changed.

src/gui/editorwidgets/core/qgseditorwidgetwrapper.h

+5
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
105105
*/
106106
void setEnabled( bool enabled ) override;
107107

108+
/** Sets the widget to display in an indeterminate "mixed value" state.
109+
* @note added in QGIS 2.16
110+
*/
111+
virtual void showIndeterminateState() {}
112+
108113
signals:
109114
/**
110115
* Emit this signal, whenever the value changed.

src/gui/editorwidgets/qgscheckboxwidgetwrapper.cpp

+11-2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ QVariant QgsCheckboxWidgetWrapper::value() const
3737
return v;
3838
}
3939

40+
void QgsCheckboxWidgetWrapper::showIndeterminateState()
41+
{
42+
if ( mCheckBox )
43+
{
44+
whileBlocking( mCheckBox )->setCheckState( Qt::PartiallyChecked );
45+
}
46+
}
47+
4048
QWidget* QgsCheckboxWidgetWrapper::createWidget( QWidget* parent )
4149
{
4250
return new QCheckBox( parent );
@@ -60,13 +68,14 @@ bool QgsCheckboxWidgetWrapper::valid() const
6068

6169
void QgsCheckboxWidgetWrapper::setValue( const QVariant& value )
6270
{
71+
bool state = ( value == config( "CheckedState" ) );
6372
if ( mGroupBox )
6473
{
65-
mGroupBox->setChecked( value == config( "CheckedState" ) );
74+
mGroupBox->setChecked( state );
6675
}
6776

6877
if ( mCheckBox )
6978
{
70-
mCheckBox->setChecked( value == config( "CheckedState" ) );
79+
mCheckBox->setChecked( state );
7180
}
7281
}

src/gui/editorwidgets/qgscheckboxwidgetwrapper.h

+2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class GUI_EXPORT QgsCheckboxWidgetWrapper : public QgsEditorWidgetWrapper
4343
public:
4444
QVariant value() const override;
4545

46+
void showIndeterminateState() override;
47+
4648
protected:
4749
QWidget* createWidget( QWidget* parent ) override;
4850
void initWidget( QWidget* editor ) override;

src/gui/editorwidgets/qgsclassificationwidgetwrapper.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ QVariant QgsClassificationWidgetWrapper::value() const
2929
return mComboBox->itemData( mComboBox->currentIndex() );
3030
}
3131

32+
void QgsClassificationWidgetWrapper::showIndeterminateState()
33+
{
34+
whileBlocking( mComboBox )->setCurrentIndex( -1 );
35+
}
36+
3237
QWidget*QgsClassificationWidgetWrapper::createWidget( QWidget* parent )
3338
{
3439
return new QComboBox( parent );

src/gui/editorwidgets/qgsclassificationwidgetwrapper.h

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class GUI_EXPORT QgsClassificationWidgetWrapper : public QgsEditorWidgetWrapper
3333
// QgsEditorWidgetWrapper interface
3434
public:
3535
QVariant value() const override;
36+
void showIndeterminateState() override;
3637

3738
protected:
3839
QWidget*createWidget( QWidget* parent ) override;

src/gui/editorwidgets/qgscolorwidgetwrapper.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ QVariant QgsColorWidgetWrapper::value() const
3232
return v;
3333
}
3434

35+
void QgsColorWidgetWrapper::showIndeterminateState()
36+
{
37+
if ( mColorButton )
38+
{
39+
whileBlocking( mColorButton )->setColor( QColor() );
40+
}
41+
}
42+
3543
QWidget* QgsColorWidgetWrapper::createWidget( QWidget* parent )
3644
{
3745
QgsColorButtonV2* button = new QgsColorButtonV2( parent );

src/gui/editorwidgets/qgscolorwidgetwrapper.h

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class GUI_EXPORT QgsColorWidgetWrapper : public QgsEditorWidgetWrapper
3535
// QgsEditorWidgetWrapper interface
3636
public:
3737
QVariant value() const override;
38+
void showIndeterminateState() override;
3839

3940
protected:
4041
QWidget* createWidget( QWidget* parent ) override;

src/gui/editorwidgets/qgsenumerationwidgetwrapper.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ QVariant QgsEnumerationWidgetWrapper::value() const
3535
return value;
3636
}
3737

38+
void QgsEnumerationWidgetWrapper::showIndeterminateState()
39+
{
40+
if ( mComboBox )
41+
{
42+
whileBlocking( mComboBox )->setCurrentIndex( -1 );
43+
}
44+
}
45+
3846
QWidget* QgsEnumerationWidgetWrapper::createWidget( QWidget* parent )
3947
{
4048
return new QComboBox( parent );

src/gui/editorwidgets/qgsenumerationwidgetwrapper.h

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class GUI_EXPORT QgsEnumerationWidgetWrapper : public QgsEditorWidgetWrapper
3333
// QgsEditorWidgetWrapper interface
3434
public:
3535
QVariant value() const override;
36+
void showIndeterminateState() override;
3637

3738
protected:
3839
QWidget* createWidget( QWidget* parent ) override;

src/gui/editorwidgets/qgsexternalresourcewidgetwrapper.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,24 @@ QVariant QgsExternalResourceWidgetWrapper::value() const
5454
return QVariant( field().type() );
5555
}
5656

57+
void QgsExternalResourceWidgetWrapper::showIndeterminateState()
58+
{
59+
if ( mLineEdit )
60+
{
61+
whileBlocking( mLineEdit )->clear();
62+
}
63+
64+
if ( mLabel )
65+
{
66+
mLabel->clear();
67+
}
68+
69+
if ( mQgsWidget )
70+
{
71+
whileBlocking( mQgsWidget )->setDocumentPath( QString() );
72+
}
73+
}
74+
5775
bool QgsExternalResourceWidgetWrapper::valid() const
5876
{
5977
return mLineEdit || mLabel || mQgsWidget;

src/gui/editorwidgets/qgsexternalresourcewidgetwrapper.h

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class GUI_EXPORT QgsExternalResourceWidgetWrapper : public QgsEditorWidgetWrappe
4242
// QgsEditorWidgetWrapper interface
4343
public:
4444
QVariant value() const override;
45+
void showIndeterminateState() override;
4546

4647
protected:
4748
QWidget* createWidget( QWidget* parent ) override;

src/gui/editorwidgets/qgsfilenamewidgetwrapper.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@ bool QgsFileNameWidgetWrapper::valid() const
5353
return mLineEdit || mLabel;
5454
}
5555

56+
void QgsFileNameWidgetWrapper::showIndeterminateState()
57+
{
58+
if ( mLineEdit )
59+
{
60+
whileBlocking( mLineEdit )->clear();
61+
}
62+
63+
if ( mLabel )
64+
mLabel->clear();
65+
}
66+
5667
QWidget* QgsFileNameWidgetWrapper::createWidget( QWidget* parent )
5768
{
5869
QWidget* container = new QWidget( parent );

src/gui/editorwidgets/qgsfilenamewidgetwrapper.h

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class GUI_EXPORT QgsFileNameWidgetWrapper : public QgsEditorWidgetWrapper
4141
public:
4242
QVariant value() const override;
4343
bool valid() const override;
44+
void showIndeterminateState() override;
4445

4546
protected:
4647
QWidget* createWidget( QWidget* parent ) override;

src/gui/editorwidgets/qgsphotowidgetwrapper.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,18 @@ QVariant QgsPhotoWidgetWrapper::value() const
115115
return v;
116116
}
117117

118+
void QgsPhotoWidgetWrapper::showIndeterminateState()
119+
{
120+
if ( mLineEdit )
121+
{
122+
whileBlocking( mLineEdit )->clear();
123+
}
124+
if ( mPhotoLabel )
125+
mPhotoLabel->clear();
126+
if ( mPhotoPixmapLabel )
127+
mPhotoPixmapLabel->clear();
128+
}
129+
118130
QWidget* QgsPhotoWidgetWrapper::createWidget( QWidget* parent )
119131
{
120132
QWidget* container = new QWidget( parent );

src/gui/editorwidgets/qgsphotowidgetwrapper.h

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class GUI_EXPORT QgsPhotoWidgetWrapper : public QgsEditorWidgetWrapper
4949
// QgsEditorWidgetWrapper interface
5050
public:
5151
QVariant value() const override;
52+
void showIndeterminateState() override;
5253

5354
protected:
5455
QWidget* createWidget( QWidget* parent ) override;

src/gui/editorwidgets/qgsrelationreferencewidget.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,20 @@ QgsFeature QgsRelationReferenceWidget::referencedFeature()
346346
return f;
347347
}
348348

349+
void QgsRelationReferenceWidget::showIndeterminateState()
350+
{
351+
if ( mReadOnlySelector )
352+
{
353+
whileBlocking( mLineEdit )->setText( QString() );
354+
}
355+
else
356+
{
357+
whileBlocking( mComboBox )->setCurrentIndex( -1 );
358+
}
359+
mRemoveFKButton->setEnabled( false );
360+
updateAttributeEditorFrame( QgsFeature() );
361+
}
362+
349363
QVariant QgsRelationReferenceWidget::foreignKey()
350364
{
351365
if ( mReadOnlySelector )

src/gui/editorwidgets/qgsrelationreferencewidget.h

+5
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ class GUI_EXPORT QgsRelationReferenceWidget : public QWidget
108108
//! if no feature is related, it returns an invalid feature
109109
QgsFeature referencedFeature();
110110

111+
/** Sets the widget to display in an indeterminate "mixed value" state.
112+
* @note added in QGIS 2.16
113+
*/
114+
void showIndeterminateState();
115+
111116
public slots:
112117
//! open the form of the related feature in a new dialog
113118
void openForm();

src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.cpp

+12-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ QgsRelationReferenceWidgetWrapper::QgsRelationReferenceWidgetWrapper( QgsVectorL
2424
, mWidget( nullptr )
2525
, mCanvas( canvas )
2626
, mMessageBar( messageBar )
27+
, mIndeterminateState( false )
2728
{
2829
}
2930

@@ -103,11 +104,21 @@ bool QgsRelationReferenceWidgetWrapper::valid() const
103104
return mWidget;
104105
}
105106

107+
void QgsRelationReferenceWidgetWrapper::showIndeterminateState()
108+
{
109+
if ( mWidget )
110+
{
111+
mWidget->showIndeterminateState();
112+
}
113+
mIndeterminateState = true;
114+
}
115+
106116
void QgsRelationReferenceWidgetWrapper::setValue( const QVariant& val )
107117
{
108-
if ( !mWidget || val == value() )
118+
if ( !mWidget || ( !mIndeterminateState && val == value() ) )
109119
return;
110120

121+
mIndeterminateState = false;
111122
mWidget->setForeignKey( val );
112123
}
113124

src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.h

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class GUI_EXPORT QgsRelationReferenceWidgetWrapper : public QgsEditorWidgetWrapp
5050
virtual void initWidget( QWidget* editor ) override;
5151
virtual QVariant value() const override;
5252
bool valid() const override;
53+
void showIndeterminateState() override;
5354

5455
public slots:
5556
virtual void setValue( const QVariant& value ) override;
@@ -62,6 +63,7 @@ class GUI_EXPORT QgsRelationReferenceWidgetWrapper : public QgsEditorWidgetWrapp
6263
QgsRelationReferenceWidget* mWidget;
6364
QgsMapCanvas* mCanvas;
6465
QgsMessageBar* mMessageBar;
66+
bool mIndeterminateState;
6567
};
6668

6769
#endif // QGSRELATIONREFERENCEWIDGETWRAPPER_H

src/gui/editorwidgets/qgstexteditwrapper.cpp

+43-18
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,50 @@ bool QgsTextEditWrapper::valid() const
135135
return mLineEdit || mTextEdit || mPlainTextEdit;
136136
}
137137

138+
void QgsTextEditWrapper::showIndeterminateState()
139+
{
140+
//note - this is deliberately a zero length string, not a null string!
141+
if ( mTextEdit )
142+
mTextEdit->blockSignals( true );
143+
if ( mPlainTextEdit )
144+
mPlainTextEdit->blockSignals( true );
145+
if ( mLineEdit )
146+
mLineEdit->blockSignals( true );
147+
148+
setWidgetValue( QString( "" ) );
149+
150+
if ( mTextEdit )
151+
mTextEdit->blockSignals( false );
152+
if ( mPlainTextEdit )
153+
mPlainTextEdit->blockSignals( false );
154+
if ( mLineEdit )
155+
mLineEdit->blockSignals( false );
156+
}
157+
138158
void QgsTextEditWrapper::setValue( const QVariant& val )
159+
{
160+
setWidgetValue( val );
161+
}
162+
163+
void QgsTextEditWrapper::setEnabled( bool enabled )
164+
{
165+
if ( mTextEdit )
166+
mTextEdit->setReadOnly( !enabled );
167+
168+
if ( mPlainTextEdit )
169+
mPlainTextEdit->setReadOnly( !enabled );
170+
171+
if ( mLineEdit )
172+
{
173+
mLineEdit->setReadOnly( !enabled );
174+
if ( enabled )
175+
mLineEdit->setPalette( mWritablePalette );
176+
else
177+
mLineEdit->setPalette( mReadOnlyPalette );
178+
}
179+
}
180+
181+
void QgsTextEditWrapper::setWidgetValue( const QVariant& val )
139182
{
140183
QString v;
141184
if ( val.isNull() )
@@ -166,21 +209,3 @@ void QgsTextEditWrapper::setValue( const QVariant& val )
166209
if ( mLineEdit )
167210
mLineEdit->setText( v );
168211
}
169-
170-
void QgsTextEditWrapper::setEnabled( bool enabled )
171-
{
172-
if ( mTextEdit )
173-
mTextEdit->setReadOnly( !enabled );
174-
175-
if ( mPlainTextEdit )
176-
mPlainTextEdit->setReadOnly( !enabled );
177-
178-
if ( mLineEdit )
179-
{
180-
mLineEdit->setReadOnly( !enabled );
181-
if ( enabled )
182-
mLineEdit->setPalette( mWritablePalette );
183-
else
184-
mLineEdit->setPalette( mReadOnlyPalette );
185-
}
186-
}

src/gui/editorwidgets/qgstexteditwrapper.h

+3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class GUI_EXPORT QgsTextEditWrapper : public QgsEditorWidgetWrapper
4242
// QgsEditorWidgetWrapper interface
4343
public:
4444
QVariant value() const override;
45+
void showIndeterminateState() override;
4546

4647
protected:
4748
QWidget*createWidget( QWidget* parent ) override;
@@ -58,6 +59,8 @@ class GUI_EXPORT QgsTextEditWrapper : public QgsEditorWidgetWrapper
5859
QLineEdit* mLineEdit;
5960
QPalette mReadOnlyPalette;
6061
QPalette mWritablePalette;
62+
63+
void setWidgetValue( const QVariant& value );
6164
};
6265

6366
#endif // QGSTEXTEDITWRAPPER_H

0 commit comments

Comments
 (0)