Skip to content

Commit

Permalink
Merge pull request #5614 from signedav/constraintindicators
Browse files Browse the repository at this point in the history
Constraint result not displayed in non editable mode
  • Loading branch information
m-kuhn committed Nov 20, 2017
2 parents eb2ef6a + 9950031 commit 30ed315
Show file tree
Hide file tree
Showing 18 changed files with 181 additions and 51 deletions.
35 changes: 32 additions & 3 deletions python/gui/editorwidgets/core/qgseditorwidgetwrapper.sip
Expand Up @@ -172,6 +172,32 @@ class QgsEditorWidgetWrapper : QgsWidgetWrapper
Add a hint text on the widget Add a hint text on the widget
\param hintText The hint text to display \param hintText The hint text to display
.. versionadded:: 3.0 .. versionadded:: 3.0
%End

ConstraintResult constraintResult() const;
%Docstring
Getter of constraintResult
It's the current result of the constraint on the widget influencing it's visualization.
.. versionadded:: 3.0
:rtype: ConstraintResult
%End

bool constraintResultVisible() const;
%Docstring
Getter of constraintResultVisible
Defines if the constraint result should be visualized on the widget (with color).
This will be disabled when the form is not editable.
.. versionadded:: 3.0
:rtype: bool
%End

void setConstraintResultVisible( bool constraintResultVisible );
%Docstring
Setter of constraintResultVisible
Defines if the constraint result should be visualized on the widget (with color).
This will be disabled when the form is not editable.
\param constraintResultVisible if constraintResult should be displayed (mostly editable status)
.. versionadded:: 3.0
%End %End


signals: signals:
Expand All @@ -193,6 +219,11 @@ class QgsEditorWidgetWrapper : QgsWidgetWrapper
\param status \param status
%End %End


void constraintResultVisibleChanged( bool visible );
%Docstring
Emit this signal when the constraint result visibility changed.
%End

public slots: public slots:


virtual void setFeature( const QgsFeature &feature ); virtual void setFeature( const QgsFeature &feature );
Expand Down Expand Up @@ -268,7 +299,7 @@ class QgsEditorWidgetWrapper : QgsWidgetWrapper


protected: protected:


virtual void updateConstraintWidgetStatus( ConstraintResult status ); virtual void updateConstraintWidgetStatus();
%Docstring %Docstring
This should update the widget with a visual cue if a constraint status This should update the widget with a visual cue if a constraint status
changed. changed.
Expand All @@ -279,8 +310,6 @@ class QgsEditorWidgetWrapper : QgsWidgetWrapper
This can be overwritten in subclasses to allow individual widgets to This can be overwritten in subclasses to allow individual widgets to
change the visual cue. change the visual cue.


\param status The current constraint status.

.. versionadded:: 2.16 .. versionadded:: 2.16
%End %End


Expand Down
Expand Up @@ -51,7 +51,7 @@ class QgsRelationReferenceWidgetWrapper : QgsEditorWidgetWrapper


protected: protected:


virtual void updateConstraintWidgetStatus( ConstraintResult status ); virtual void updateConstraintWidgetStatus();




}; };
Expand Down
5 changes: 5 additions & 0 deletions python/gui/qgsattributeformeditorwidget.sip
Expand Up @@ -101,6 +101,11 @@ class QgsAttributeFormEditorWidget : QWidget
Set the constraint status for this widget. Set the constraint status for this widget.
%End %End


void setConstraintResultVisible( bool editable );
%Docstring
Set the constraint result lable visible or invisible according to the layer editable status
%End

public slots: public slots:


void setIsMixed( bool mixed ); void setIsMixed( bool mixed );
Expand Down
55 changes: 43 additions & 12 deletions src/gui/editorwidgets/core/qgseditorwidgetwrapper.cpp
Expand Up @@ -101,24 +101,53 @@ void QgsEditorWidgetWrapper::valueChanged()
emit valueChanged( value() ); emit valueChanged( value() );
} }


void QgsEditorWidgetWrapper::updateConstraintWidgetStatus( ConstraintResult constraintResult ) void QgsEditorWidgetWrapper::updateConstraintWidgetStatus()
{ {
switch ( constraintResult ) if ( !mConstraintResultVisible )
{ {
case ConstraintResultPass: widget()->setStyleSheet( QString() );
widget()->setStyleSheet( QString() ); }
break; else
{
switch ( mConstraintResult )
{
case ConstraintResultPass:
widget()->setStyleSheet( QString() );
break;


case ConstraintResultFailHard: case ConstraintResultFailHard:
widget()->setStyleSheet( QStringLiteral( "background-color: #FFE0B2;" ) ); widget()->setStyleSheet( QStringLiteral( "background-color: #FFE0B2;" ) );
break; break;


case ConstraintResultFailSoft: case ConstraintResultFailSoft:
widget()->setStyleSheet( QStringLiteral( "background-color: #FFECB3;" ) ); widget()->setStyleSheet( QStringLiteral( "background-color: #FFECB3;" ) );
break; break;
}
} }
} }


QgsEditorWidgetWrapper::ConstraintResult QgsEditorWidgetWrapper::constraintResult() const
{
return mConstraintResult;
}

bool QgsEditorWidgetWrapper::constraintResultVisible() const
{
return mConstraintResultVisible;
}

void QgsEditorWidgetWrapper::setConstraintResultVisible( bool constraintResultVisible )
{
if ( mConstraintResultVisible == constraintResultVisible )
return;

mConstraintResultVisible = constraintResultVisible;

updateConstraintWidgetStatus();

emit constraintResultVisibleChanged( mConstraintResultVisible );
}

void QgsEditorWidgetWrapper::updateConstraint( const QgsFeature &ft, QgsFieldConstraints::ConstraintOrigin constraintOrigin ) void QgsEditorWidgetWrapper::updateConstraint( const QgsFeature &ft, QgsFieldConstraints::ConstraintOrigin constraintOrigin )
{ {
updateConstraint( layer(), mFieldIdx, ft, constraintOrigin ); updateConstraint( layer(), mFieldIdx, ft, constraintOrigin );
Expand Down Expand Up @@ -210,7 +239,9 @@ void QgsEditorWidgetWrapper::updateConstraint( const QgsVectorLayer *layer, int


ConstraintResult result = !hardConstraintsOk ? ConstraintResultFailHard ConstraintResult result = !hardConstraintsOk ? ConstraintResultFailHard
: ( !softConstraintsOk ? ConstraintResultFailSoft : ConstraintResultPass ); : ( !softConstraintsOk ? ConstraintResultFailSoft : ConstraintResultPass );
updateConstraintWidgetStatus( result ); //set the constraint result
mConstraintResult = result;
updateConstraintWidgetStatus();
emit constraintStatusChanged( expressionDesc, description, errStr, result ); emit constraintStatusChanged( expressionDesc, description, errStr, result );
} }
} }
Expand Down
43 changes: 40 additions & 3 deletions src/gui/editorwidgets/core/qgseditorwidgetwrapper.h
Expand Up @@ -42,6 +42,10 @@ class QgsField;
class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
{ {
Q_OBJECT Q_OBJECT

Q_PROPERTY( bool constraintResultVisible READ constraintResultVisible WRITE setConstraintResultVisible NOTIFY constraintResultVisibleChanged )
Q_PROPERTY( ConstraintResult constraintResult READ constraintResult NOTIFY constraintStatusChanged )

public: public:


/** /**
Expand Down Expand Up @@ -185,6 +189,30 @@ class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
*/ */
virtual void setHint( const QString &hintText ); virtual void setHint( const QString &hintText );


/**
* Getter of constraintResult
* It's the current result of the constraint on the widget influencing it's visualization.
* \since QGIS 3.0
*/
ConstraintResult constraintResult() const;

/**
* Getter of constraintResultVisible
* Defines if the constraint result should be visualized on the widget (with color).
* This will be disabled when the form is not editable.
* \since QGIS 3.0
*/
bool constraintResultVisible() const;

/**
* Setter of constraintResultVisible
* Defines if the constraint result should be visualized on the widget (with color).
* This will be disabled when the form is not editable.
* \param constraintResultVisible if constraintResult should be displayed (mostly editable status)
* \since QGIS 3.0
*/
void setConstraintResultVisible( bool constraintResultVisible );

signals: signals:


/** /**
Expand All @@ -204,6 +232,11 @@ class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
*/ */
void constraintStatusChanged( const QString &constraint, const QString &desc, const QString &err, ConstraintResult status ); void constraintStatusChanged( const QString &constraint, const QString &desc, const QString &err, ConstraintResult status );


/**
* Emit this signal when the constraint result visibility changed.
*/
void constraintResultVisibleChanged( bool visible );

public slots: public slots:


/** /**
Expand Down Expand Up @@ -295,11 +328,9 @@ class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
* This can be overwritten in subclasses to allow individual widgets to * This can be overwritten in subclasses to allow individual widgets to
* change the visual cue. * change the visual cue.
* *
* \param status The current constraint status.
*
* \since QGIS 2.16 * \since QGIS 2.16
*/ */
virtual void updateConstraintWidgetStatus( ConstraintResult status ); virtual void updateConstraintWidgetStatus();


private: private:


Expand All @@ -314,6 +345,12 @@ class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
//! Contains the string explanation of why a constraint check failed //! Contains the string explanation of why a constraint check failed
QString mConstraintFailureReason; QString mConstraintFailureReason;


//! The current constraint result
ConstraintResult mConstraintResult;

//! The current constraint result
bool mConstraintResultVisible;

int mFieldIdx; int mFieldIdx;
QgsFeature mFeature; QgsFeature mFeature;
mutable QVariant mDefaultValue; // Cache default value, we don't want to retrieve different serial numbers if called repeatedly mutable QVariant mDefaultValue; // Cache default value, we don't want to retrieve different serial numbers if called repeatedly
Expand Down
2 changes: 1 addition & 1 deletion src/gui/editorwidgets/qgscolorwidgetwrapper.cpp
Expand Up @@ -80,7 +80,7 @@ void QgsColorWidgetWrapper::setValue( const QVariant &value )
mColorButton->setColor( !value.isNull() ? QColor( value.toString() ) : QColor() ); mColorButton->setColor( !value.isNull() ? QColor( value.toString() ) : QColor() );
} }


void QgsColorWidgetWrapper::updateConstraintWidgetStatus( ConstraintResult /*constraintValid*/ ) void QgsColorWidgetWrapper::updateConstraintWidgetStatus()
{ {
// nothing // nothing
} }
2 changes: 1 addition & 1 deletion src/gui/editorwidgets/qgscolorwidgetwrapper.h
Expand Up @@ -49,7 +49,7 @@ class GUI_EXPORT QgsColorWidgetWrapper : public QgsEditorWidgetWrapper
void setValue( const QVariant &value ) override; void setValue( const QVariant &value ) override;


private: private:
void updateConstraintWidgetStatus( ConstraintResult status ) override; void updateConstraintWidgetStatus() override;


QgsColorButton *mColorButton = nullptr; QgsColorButton *mColorButton = nullptr;
}; };
Expand Down
29 changes: 18 additions & 11 deletions src/gui/editorwidgets/qgsexternalresourcewidgetwrapper.cpp
Expand Up @@ -233,23 +233,30 @@ void QgsExternalResourceWidgetWrapper::setEnabled( bool enabled )
mQgsWidget->setReadOnly( !enabled ); mQgsWidget->setReadOnly( !enabled );
} }


void QgsExternalResourceWidgetWrapper::updateConstraintWidgetStatus( ConstraintResult status ) void QgsExternalResourceWidgetWrapper::updateConstraintWidgetStatus()
{ {
if ( mLineEdit ) if ( mLineEdit )
{ {
switch ( status ) if ( !constraintResultVisible() )
{ {
case ConstraintResultPass: widget()->setStyleSheet( QString() );
mLineEdit->setStyleSheet( QString() ); }
break; else
{
switch ( constraintResult() )
{
case ConstraintResultPass:
mLineEdit->setStyleSheet( QString() );
break;


case ConstraintResultFailHard: case ConstraintResultFailHard:
mLineEdit->setStyleSheet( QStringLiteral( "QgsFilterLineEdit { background-color: #dd7777; }" ) ); mLineEdit->setStyleSheet( QStringLiteral( "QgsFilterLineEdit { background-color: #dd7777; }" ) );
break; break;


case ConstraintResultFailSoft: case ConstraintResultFailSoft:
mLineEdit->setStyleSheet( QStringLiteral( "QgsFilterLineEdit { background-color: #ffd85d; }" ) ); mLineEdit->setStyleSheet( QStringLiteral( "QgsFilterLineEdit { background-color: #ffd85d; }" ) );
break; break;
}
} }
} }
} }
2 changes: 1 addition & 1 deletion src/gui/editorwidgets/qgsexternalresourcewidgetwrapper.h
Expand Up @@ -59,7 +59,7 @@ class GUI_EXPORT QgsExternalResourceWidgetWrapper : public QgsEditorWidgetWrappe
void setEnabled( bool enabled ) override; void setEnabled( bool enabled ) override;


private: private:
void updateConstraintWidgetStatus( ConstraintResult status ) override; void updateConstraintWidgetStatus() override;


QLineEdit *mLineEdit = nullptr; QLineEdit *mLineEdit = nullptr;
QLabel *mLabel = nullptr; QLabel *mLabel = nullptr;
Expand Down
2 changes: 1 addition & 1 deletion src/gui/editorwidgets/qgskeyvaluewidgetwrapper.cpp
Expand Up @@ -72,7 +72,7 @@ void QgsKeyValueWidgetWrapper::setValue( const QVariant &value )
mWidget->setMap( value.toMap() ); mWidget->setMap( value.toMap() );
} }


void QgsKeyValueWidgetWrapper::updateConstraintWidgetStatus( ConstraintResult /*constraintValid*/ ) void QgsKeyValueWidgetWrapper::updateConstraintWidgetStatus()
{ {
// Nothing // Nothing
} }
Expand Down
2 changes: 1 addition & 1 deletion src/gui/editorwidgets/qgskeyvaluewidgetwrapper.h
Expand Up @@ -56,7 +56,7 @@ class GUI_EXPORT QgsKeyValueWidgetWrapper : public QgsEditorWidgetWrapper
void onValueChanged(); void onValueChanged();


private: private:
void updateConstraintWidgetStatus( ConstraintResult status ) override; void updateConstraintWidgetStatus() override;


QgsKeyValueWidget *mWidget = nullptr; QgsKeyValueWidget *mWidget = nullptr;
}; };
Expand Down
2 changes: 1 addition & 1 deletion src/gui/editorwidgets/qgslistwidgetwrapper.cpp
Expand Up @@ -87,7 +87,7 @@ void QgsListWidgetWrapper::onValueChanged()
emit valueChanged( value() ); emit valueChanged( value() );
} }


void QgsListWidgetWrapper::updateConstraintWidgetStatus( ConstraintResult /*constraintValid*/ ) void QgsListWidgetWrapper::updateConstraintWidgetStatus()
{ {
// Nothing // Nothing
} }
2 changes: 1 addition & 1 deletion src/gui/editorwidgets/qgslistwidgetwrapper.h
Expand Up @@ -56,7 +56,7 @@ class GUI_EXPORT QgsListWidgetWrapper : public QgsEditorWidgetWrapper
void onValueChanged(); void onValueChanged();


private: private:
void updateConstraintWidgetStatus( ConstraintResult status ) override; void updateConstraintWidgetStatus() override;


QgsListWidget *mWidget = nullptr; QgsListWidget *mWidget = nullptr;
}; };
Expand Down
33 changes: 20 additions & 13 deletions src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.cpp
Expand Up @@ -145,23 +145,30 @@ void QgsRelationReferenceWidgetWrapper::foreignKeyChanged( QVariant value )
emit valueChanged( value ); emit valueChanged( value );
} }


void QgsRelationReferenceWidgetWrapper::updateConstraintWidgetStatus( ConstraintResult status ) void QgsRelationReferenceWidgetWrapper::updateConstraintWidgetStatus()
{ {
if ( mWidget ) if ( mWidget )
{ {
switch ( status ) if ( !constraintResultVisible() )
{ {
case ConstraintResultPass: widget()->setStyleSheet( QString() );
mWidget->setStyleSheet( QString() ); }
break; else

{
case ConstraintResultFailHard: switch ( constraintResult() )
mWidget->setStyleSheet( QStringLiteral( ".QComboBox { background-color: #dd7777; }" ) ); {
break; case ConstraintResultPass:

mWidget->setStyleSheet( QString() );
case ConstraintResultFailSoft: break;
mWidget->setStyleSheet( QStringLiteral( ".QComboBox { background-color: #ffd85d; }" ) );
break; case ConstraintResultFailHard:
mWidget->setStyleSheet( QStringLiteral( ".QComboBox { background-color: #dd7777; }" ) );
break;

case ConstraintResultFailSoft:
mWidget->setStyleSheet( QStringLiteral( ".QComboBox { background-color: #ffd85d; }" ) );
break;
}
} }
} }
} }
2 changes: 1 addition & 1 deletion src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.h
Expand Up @@ -66,7 +66,7 @@ class GUI_EXPORT QgsRelationReferenceWidgetWrapper : public QgsEditorWidgetWrapp


protected: protected:


void updateConstraintWidgetStatus( ConstraintResult status ) override; void updateConstraintWidgetStatus() override;


private: private:
QgsRelationReferenceWidget *mWidget = nullptr; QgsRelationReferenceWidget *mWidget = nullptr;
Expand Down

0 comments on commit 30ed315

Please sign in to comment.