diff --git a/python/gui/qgsfieldcombobox.sip b/python/gui/qgsfieldcombobox.sip index 2a0b3c90b27..10c214e915c 100644 --- a/python/gui/qgsfieldcombobox.sip +++ b/python/gui/qgsfieldcombobox.sip @@ -24,6 +24,8 @@ class QgsFieldComboBox : QComboBox //! Returns the currently used layer QgsVectorLayer* layer(); + + void changeEvent( QEvent* event ); signals: //! the signal is emitted when the currently selected field changes diff --git a/python/gui/qgsfieldexpressionwidget.sip b/python/gui/qgsfieldexpressionwidget.sip index a4fe77b17a8..9d9e924e47b 100644 --- a/python/gui/qgsfieldexpressionwidget.sip +++ b/python/gui/qgsfieldexpressionwidget.sip @@ -20,11 +20,14 @@ class QgsFieldExpressionWidget : QWidget /** * @brief currentField returns the currently selected field or expression if allowed * @param isExpression determines if the string returned is the name of a field or an expression + * @param isValid determines if the expression (or field) returned is valid */ - QString currentField( bool *isExpression = 0 ); + QString currentField( bool *isExpression = 0, bool *isValid = 0 ); //! Returns the currently used layer QgsVectorLayer* layer(); + + void changeEvent( QEvent* event ); signals: //! the signal is emitted when the currently selected field changes diff --git a/src/gui/qgsfieldexpressionwidget.cpp b/src/gui/qgsfieldexpressionwidget.cpp index 34283f92fc9..4071a377f33 100644 --- a/src/gui/qgsfieldexpressionwidget.cpp +++ b/src/gui/qgsfieldexpressionwidget.cpp @@ -44,7 +44,7 @@ QgsFieldExpressionWidget::QgsFieldExpressionWidget( QWidget *parent ) layout->addWidget( mButton ); connect( mCombo->lineEdit(), SIGNAL( textEdited( QString ) ), this, SLOT( expressionEdited( QString ) ) ); - connect( mCombo, SIGNAL( currentIndexChanged( int ) ), this, SLOT( indexChanged( int ) ) ); + connect( mCombo, SIGNAL( activated( int ) ), this, SLOT( currentFieldChanged( int ) ) ); connect( mButton, SIGNAL( clicked() ), this, SLOT( editExpression() ) ); } @@ -58,15 +58,18 @@ void QgsFieldExpressionWidget::setGeomCalculator( const QgsDistanceArea &da ) mDa = QSharedPointer( new QgsDistanceArea( da ) ); } -QString QgsFieldExpressionWidget::currentField( bool *isExpression ) +QString QgsFieldExpressionWidget::currentField( bool *isExpression , bool *isValid ) { if ( isExpression ) { *isExpression = false; } + if ( isValid ) + { + *isValid = true; + } int i = mCombo->currentIndex(); - const QModelIndex index = mFieldModel->index( i, 0 ); if ( !index.isValid() ) { @@ -77,6 +80,10 @@ QString QgsFieldExpressionWidget::currentField( bool *isExpression ) { *isExpression = mFieldModel->data( index, QgsFieldModel::IsExpressionRole ).toBool(); } + if ( isValid ) + { + *isValid = mFieldModel->data( index, QgsFieldModel::ExpressionValidityRole ).toBool(); + } QString expression = mFieldModel->data( index, QgsFieldModel::ExpressionRole ).toString(); return expression; } @@ -100,7 +107,7 @@ void QgsFieldExpressionWidget::setLayer( QgsVectorLayer *layer ) mFieldModel->setLayer( layer ); } -void QgsFieldExpressionWidget::setField( QString fieldName ) +void QgsFieldExpressionWidget::setField( const QString fieldName ) { if ( fieldName.isEmpty() ) return; @@ -112,6 +119,8 @@ void QgsFieldExpressionWidget::setField( QString fieldName ) idx = mFieldModel->setExpression( fieldName ); } mCombo->setCurrentIndex( idx.row() ); + + currentFieldChanged(); } void QgsFieldExpressionWidget::editExpression() @@ -136,39 +145,57 @@ void QgsFieldExpressionWidget::editExpression() } } -void QgsFieldExpressionWidget::expressionEdited( QString expression ) +void QgsFieldExpressionWidget::expressionEdited( const QString expression ) { - mFieldModel->removeExpression(); - setField( expression ); + QModelIndex idx = mFieldModel->setExpression( expression ); + mCombo->setCurrentIndex( idx.row() ); + currentFieldChanged(); } -void QgsFieldExpressionWidget::indexChanged( int i ) +void QgsFieldExpressionWidget::changeEvent( QEvent* event ) +{ + if ( event->type() == QEvent::EnabledChange ) + { + updateLineEditStyle(); + } +} + +void QgsFieldExpressionWidget::currentFieldChanged( int i /* =0 */ ) { Q_UNUSED( i ); - bool isExpression; - QString fieldName = currentField( &isExpression ); - bool isValid = true; - QFont font = mCombo->lineEdit()->font(); - font.setItalic( isExpression ); - mCombo->lineEdit()->setFont( font ); - - QPalette palette; - palette.setColor( QPalette::Text, Qt::black ); - if ( isExpression ) - { - QModelIndex idx = mFieldModel->indexFromName( fieldName ); - if ( idx.isValid() ) - { - isValid = mFieldModel->data( idx, QgsFieldModel::ExpressionValidityRole ).toBool(); - if ( !isValid ) - { - palette.setColor( QPalette::Text, Qt::red ); - } - } - } - mCombo->lineEdit()->setPalette( palette ); + updateLineEditStyle(); + bool isExpression, isValid; + QString fieldName = currentField( &isExpression, &isValid ); emit fieldChanged( fieldName ); emit fieldChanged( fieldName, isValid ); } + +void QgsFieldExpressionWidget::updateLineEditStyle() +{ + QPalette palette; + if ( !isEnabled() ) + { + palette.setColor( QPalette::Text, Qt::gray ); + } + else + { + bool isExpression, isValid; + currentField( &isExpression, &isValid ); + + QFont font = mCombo->lineEdit()->font(); + font.setItalic( isExpression ); + mCombo->lineEdit()->setFont( font ); + + if ( isExpression && !isValid ) + { + palette.setColor( QPalette::Text, Qt::red ); + } + else + { + palette.setColor( QPalette::Text, Qt::black ); + } + } + mCombo->lineEdit()->setPalette( palette ); +} diff --git a/src/gui/qgsfieldexpressionwidget.h b/src/gui/qgsfieldexpressionwidget.h index c02de6d85ca..acf1cb33773 100644 --- a/src/gui/qgsfieldexpressionwidget.h +++ b/src/gui/qgsfieldexpressionwidget.h @@ -47,12 +47,15 @@ class GUI_EXPORT QgsFieldExpressionWidget : public QWidget /** * @brief currentField returns the currently selected field or expression if allowed * @param isExpression determines if the string returned is the name of a field or an expression + * @param isValid determines if the expression (or field) returned is valid */ - QString currentField( bool *isExpression = 0 ); + QString currentField( bool *isExpression = 0, bool *isValid = 0 ); //! Returns the currently used layer QgsVectorLayer* layer(); + void changeEvent( QEvent* event ); + signals: //! the signal is emitted when the currently selected field changes void fieldChanged( QString fieldName ); @@ -68,16 +71,18 @@ class GUI_EXPORT QgsFieldExpressionWidget : public QWidget void setLayer( QgsMapLayer* layer ); //! sets the current field or expression in the widget - void setField( QString fieldName ); + void setField( const QString fieldName ); protected slots: //! open the expression dialog to edit the current or add a new expression void editExpression(); //! when expression is edited by the user in the line edit - void expressionEdited( QString expression ); + void expressionEdited( const QString expression ); - void indexChanged( int i ); + void currentFieldChanged( int i = 0 ); + + void updateLineEditStyle(); private: QComboBox* mCombo; diff --git a/src/gui/qgsfieldmodel.cpp b/src/gui/qgsfieldmodel.cpp index 7ae026af67d..f8334298029 100644 --- a/src/gui/qgsfieldmodel.cpp +++ b/src/gui/qgsfieldmodel.cpp @@ -28,7 +28,7 @@ QgsFieldModel::QgsFieldModel( QObject *parent ) { } -QModelIndex QgsFieldModel::indexFromName( QString fieldName ) +QModelIndex QgsFieldModel::indexFromName( const QString fieldName ) { int r = mFields.indexFromName( fieldName ); QModelIndex idx = index( r, 0 ); @@ -104,7 +104,7 @@ void QgsFieldModel::setAllowExpression( bool allowExpression ) } } -QModelIndex QgsFieldModel::setExpression( QString expression ) +QModelIndex QgsFieldModel::setExpression( const QString expression ) { if ( !mAllowExpression ) return QModelIndex(); diff --git a/src/gui/qgsfieldmodel.h b/src/gui/qgsfieldmodel.h index dda1d90ee64..7b3c8eb4ccc 100644 --- a/src/gui/qgsfieldmodel.h +++ b/src/gui/qgsfieldmodel.h @@ -49,7 +49,7 @@ class GUI_EXPORT QgsFieldModel : public QAbstractItemModel explicit QgsFieldModel( QObject *parent = 0 ); //! return the index corresponding to a given fieldName - QModelIndex indexFromName( QString fieldName ); + QModelIndex indexFromName( const QString fieldName ); //! returns the currently used layer void setAllowExpression( bool allowExpression ); @@ -59,7 +59,7 @@ class GUI_EXPORT QgsFieldModel : public QAbstractItemModel * @brief setExpression sets a single expression to be added after the fields at the end of the model * @return the model index of the newly added expression */ - QModelIndex setExpression( QString expression ); + QModelIndex setExpression( const QString expression ); //! remove expressions from the model void removeExpression();