Merge pull request #5614 from signedav/constraintindicators

Constraint result not displayed in non editable mode
This commit is contained in:
Matthias Kuhn 2017-11-20 07:13:39 +01:00 committed by GitHub
commit 30ed315392
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 181 additions and 51 deletions

View File

@ -172,6 +172,32 @@ class QgsEditorWidgetWrapper : QgsWidgetWrapper
Add a hint text on the widget
\param hintText The hint text to display
.. 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
signals:
@ -193,6 +219,11 @@ class QgsEditorWidgetWrapper : QgsWidgetWrapper
\param status
%End
void constraintResultVisibleChanged( bool visible );
%Docstring
Emit this signal when the constraint result visibility changed.
%End
public slots:
virtual void setFeature( const QgsFeature &feature );
@ -268,7 +299,7 @@ class QgsEditorWidgetWrapper : QgsWidgetWrapper
protected:
virtual void updateConstraintWidgetStatus( ConstraintResult status );
virtual void updateConstraintWidgetStatus();
%Docstring
This should update the widget with a visual cue if a constraint status
changed.
@ -279,8 +310,6 @@ class QgsEditorWidgetWrapper : QgsWidgetWrapper
This can be overwritten in subclasses to allow individual widgets to
change the visual cue.
\param status The current constraint status.
.. versionadded:: 2.16
%End

View File

@ -51,7 +51,7 @@ class QgsRelationReferenceWidgetWrapper : QgsEditorWidgetWrapper
protected:
virtual void updateConstraintWidgetStatus( ConstraintResult status );
virtual void updateConstraintWidgetStatus();
};

View File

@ -101,6 +101,11 @@ class QgsAttributeFormEditorWidget : QWidget
Set the constraint status for this widget.
%End
void setConstraintResultVisible( bool editable );
%Docstring
Set the constraint result lable visible or invisible according to the layer editable status
%End
public slots:
void setIsMixed( bool mixed );

View File

@ -101,22 +101,51 @@ void QgsEditorWidgetWrapper::valueChanged()
emit valueChanged( value() );
}
void QgsEditorWidgetWrapper::updateConstraintWidgetStatus( ConstraintResult constraintResult )
void QgsEditorWidgetWrapper::updateConstraintWidgetStatus()
{
switch ( constraintResult )
if ( !mConstraintResultVisible )
{
case ConstraintResultPass:
widget()->setStyleSheet( QString() );
break;
case ConstraintResultFailHard:
widget()->setStyleSheet( QStringLiteral( "background-color: #FFE0B2;" ) );
break;
case ConstraintResultFailSoft:
widget()->setStyleSheet( QStringLiteral( "background-color: #FFECB3;" ) );
break;
widget()->setStyleSheet( QString() );
}
else
{
switch ( mConstraintResult )
{
case ConstraintResultPass:
widget()->setStyleSheet( QString() );
break;
case ConstraintResultFailHard:
widget()->setStyleSheet( QStringLiteral( "background-color: #FFE0B2;" ) );
break;
case ConstraintResultFailSoft:
widget()->setStyleSheet( QStringLiteral( "background-color: #FFECB3;" ) );
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 )
@ -210,7 +239,9 @@ void QgsEditorWidgetWrapper::updateConstraint( const QgsVectorLayer *layer, int
ConstraintResult result = !hardConstraintsOk ? ConstraintResultFailHard
: ( !softConstraintsOk ? ConstraintResultFailSoft : ConstraintResultPass );
updateConstraintWidgetStatus( result );
//set the constraint result
mConstraintResult = result;
updateConstraintWidgetStatus();
emit constraintStatusChanged( expressionDesc, description, errStr, result );
}
}

View File

@ -42,6 +42,10 @@ class QgsField;
class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
{
Q_OBJECT
Q_PROPERTY( bool constraintResultVisible READ constraintResultVisible WRITE setConstraintResultVisible NOTIFY constraintResultVisibleChanged )
Q_PROPERTY( ConstraintResult constraintResult READ constraintResult NOTIFY constraintStatusChanged )
public:
/**
@ -185,6 +189,30 @@ class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
*/
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:
/**
@ -204,6 +232,11 @@ class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
*/
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:
/**
@ -295,11 +328,9 @@ class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
* This can be overwritten in subclasses to allow individual widgets to
* change the visual cue.
*
* \param status The current constraint status.
*
* \since QGIS 2.16
*/
virtual void updateConstraintWidgetStatus( ConstraintResult status );
virtual void updateConstraintWidgetStatus();
private:
@ -314,6 +345,12 @@ class GUI_EXPORT QgsEditorWidgetWrapper : public QgsWidgetWrapper
//! Contains the string explanation of why a constraint check failed
QString mConstraintFailureReason;
//! The current constraint result
ConstraintResult mConstraintResult;
//! The current constraint result
bool mConstraintResultVisible;
int mFieldIdx;
QgsFeature mFeature;
mutable QVariant mDefaultValue; // Cache default value, we don't want to retrieve different serial numbers if called repeatedly

View File

@ -80,7 +80,7 @@ void QgsColorWidgetWrapper::setValue( const QVariant &value )
mColorButton->setColor( !value.isNull() ? QColor( value.toString() ) : QColor() );
}
void QgsColorWidgetWrapper::updateConstraintWidgetStatus( ConstraintResult /*constraintValid*/ )
void QgsColorWidgetWrapper::updateConstraintWidgetStatus()
{
// nothing
}

View File

@ -49,7 +49,7 @@ class GUI_EXPORT QgsColorWidgetWrapper : public QgsEditorWidgetWrapper
void setValue( const QVariant &value ) override;
private:
void updateConstraintWidgetStatus( ConstraintResult status ) override;
void updateConstraintWidgetStatus() override;
QgsColorButton *mColorButton = nullptr;
};

View File

@ -233,23 +233,30 @@ void QgsExternalResourceWidgetWrapper::setEnabled( bool enabled )
mQgsWidget->setReadOnly( !enabled );
}
void QgsExternalResourceWidgetWrapper::updateConstraintWidgetStatus( ConstraintResult status )
void QgsExternalResourceWidgetWrapper::updateConstraintWidgetStatus()
{
if ( mLineEdit )
{
switch ( status )
if ( !constraintResultVisible() )
{
case ConstraintResultPass:
mLineEdit->setStyleSheet( QString() );
break;
widget()->setStyleSheet( QString() );
}
else
{
switch ( constraintResult() )
{
case ConstraintResultPass:
mLineEdit->setStyleSheet( QString() );
break;
case ConstraintResultFailHard:
mLineEdit->setStyleSheet( QStringLiteral( "QgsFilterLineEdit { background-color: #dd7777; }" ) );
break;
case ConstraintResultFailHard:
mLineEdit->setStyleSheet( QStringLiteral( "QgsFilterLineEdit { background-color: #dd7777; }" ) );
break;
case ConstraintResultFailSoft:
mLineEdit->setStyleSheet( QStringLiteral( "QgsFilterLineEdit { background-color: #ffd85d; }" ) );
break;
case ConstraintResultFailSoft:
mLineEdit->setStyleSheet( QStringLiteral( "QgsFilterLineEdit { background-color: #ffd85d; }" ) );
break;
}
}
}
}

View File

@ -59,7 +59,7 @@ class GUI_EXPORT QgsExternalResourceWidgetWrapper : public QgsEditorWidgetWrappe
void setEnabled( bool enabled ) override;
private:
void updateConstraintWidgetStatus( ConstraintResult status ) override;
void updateConstraintWidgetStatus() override;
QLineEdit *mLineEdit = nullptr;
QLabel *mLabel = nullptr;

View File

@ -72,7 +72,7 @@ void QgsKeyValueWidgetWrapper::setValue( const QVariant &value )
mWidget->setMap( value.toMap() );
}
void QgsKeyValueWidgetWrapper::updateConstraintWidgetStatus( ConstraintResult /*constraintValid*/ )
void QgsKeyValueWidgetWrapper::updateConstraintWidgetStatus()
{
// Nothing
}

View File

@ -56,7 +56,7 @@ class GUI_EXPORT QgsKeyValueWidgetWrapper : public QgsEditorWidgetWrapper
void onValueChanged();
private:
void updateConstraintWidgetStatus( ConstraintResult status ) override;
void updateConstraintWidgetStatus() override;
QgsKeyValueWidget *mWidget = nullptr;
};

View File

@ -87,7 +87,7 @@ void QgsListWidgetWrapper::onValueChanged()
emit valueChanged( value() );
}
void QgsListWidgetWrapper::updateConstraintWidgetStatus( ConstraintResult /*constraintValid*/ )
void QgsListWidgetWrapper::updateConstraintWidgetStatus()
{
// Nothing
}

View File

@ -56,7 +56,7 @@ class GUI_EXPORT QgsListWidgetWrapper : public QgsEditorWidgetWrapper
void onValueChanged();
private:
void updateConstraintWidgetStatus( ConstraintResult status ) override;
void updateConstraintWidgetStatus() override;
QgsListWidget *mWidget = nullptr;
};

View File

@ -145,23 +145,30 @@ void QgsRelationReferenceWidgetWrapper::foreignKeyChanged( QVariant value )
emit valueChanged( value );
}
void QgsRelationReferenceWidgetWrapper::updateConstraintWidgetStatus( ConstraintResult status )
void QgsRelationReferenceWidgetWrapper::updateConstraintWidgetStatus()
{
if ( mWidget )
{
switch ( status )
if ( !constraintResultVisible() )
{
case ConstraintResultPass:
mWidget->setStyleSheet( QString() );
break;
widget()->setStyleSheet( QString() );
}
else
{
switch ( constraintResult() )
{
case ConstraintResultPass:
mWidget->setStyleSheet( QString() );
break;
case ConstraintResultFailHard:
mWidget->setStyleSheet( QStringLiteral( ".QComboBox { background-color: #dd7777; }" ) );
break;
case ConstraintResultFailHard:
mWidget->setStyleSheet( QStringLiteral( ".QComboBox { background-color: #dd7777; }" ) );
break;
case ConstraintResultFailSoft:
mWidget->setStyleSheet( QStringLiteral( ".QComboBox { background-color: #ffd85d; }" ) );
break;
case ConstraintResultFailSoft:
mWidget->setStyleSheet( QStringLiteral( ".QComboBox { background-color: #ffd85d; }" ) );
break;
}
}
}
}

View File

@ -66,7 +66,7 @@ class GUI_EXPORT QgsRelationReferenceWidgetWrapper : public QgsEditorWidgetWrapp
protected:
void updateConstraintWidgetStatus( ConstraintResult status ) override;
void updateConstraintWidgetStatus() override;
private:
QgsRelationReferenceWidget *mWidget = nullptr;

View File

@ -967,6 +967,10 @@ void QgsAttributeForm::synchronizeEnabledState()
QgsEditorWidgetWrapper *eww = qobject_cast<QgsEditorWidgetWrapper *>( ww );
if ( eww )
{
mFormEditorWidgets.value( eww->fieldIdx() )->setConstraintResultVisible( isEditable );
eww->setConstraintResultVisible( isEditable );
bool enabled = isEditable && fieldIsEditable( eww->fieldIdx() );
ww->setEnabled( enabled );

View File

@ -159,6 +159,11 @@ void QgsAttributeFormEditorWidget::setConstraintStatus( const QString &constrain
}
}
void QgsAttributeFormEditorWidget::setConstraintResultVisible( bool editable )
{
mConstraintResultLabel->setHidden( !editable );
}
void QgsAttributeFormEditorWidget::setMode( QgsAttributeFormEditorWidget::Mode mode )
{
mMode = mode;

View File

@ -123,6 +123,11 @@ class GUI_EXPORT QgsAttributeFormEditorWidget : public QWidget
*/
void setConstraintStatus( const QString &constraint, const QString &description, const QString &err, QgsEditorWidgetWrapper::ConstraintResult result );
/**
* Set the constraint result lable visible or invisible according to the layer editable status
*/
void setConstraintResultVisible( bool editable );
public slots:
/**