diff --git a/python/gui/editorwidgets/core/qgseditorwidgetwrapper.sip b/python/gui/editorwidgets/core/qgseditorwidgetwrapper.sip index 2dfdceeee2d..eb6d58ccdd3 100644 --- a/python/gui/editorwidgets/core/qgseditorwidgetwrapper.sip +++ b/python/gui/editorwidgets/core/qgseditorwidgetwrapper.sip @@ -88,6 +88,7 @@ class QgsEditorWidgetWrapper : QObject */ void setEnabled( bool enabled ); + virtual bool valid() = 0; protected: virtual QWidget* createWidget( QWidget* parent ) = 0; diff --git a/python/gui/editorwidgets/core/qgswidgetwrapper.sip b/python/gui/editorwidgets/core/qgswidgetwrapper.sip index 684475c94a9..27230114618 100644 --- a/python/gui/editorwidgets/core/qgswidgetwrapper.sip +++ b/python/gui/editorwidgets/core/qgswidgetwrapper.sip @@ -111,6 +111,17 @@ class QgsWidgetWrapper : QObject */ static QgsWidgetWrapper* fromWidget( QWidget* widget ); + /** + * Return true if the widget has been properly initialized. + * This acts as hint for the calling party if this wrapper can be used + * after initializing it. + * If it cannot be used this is a hint tothe caller that he may try to find + * another suitable widget type instead. + * + * @return Validity status of this widget. + */ + virtual bool valid() = 0; + protected: /** * This method should create a new widget with the provided parent. This will only be called diff --git a/src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp b/src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp index dc4741a5b26..29f9dc55afc 100644 --- a/src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp +++ b/src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp @@ -30,8 +30,9 @@ QgsEditorWidgetFactory::~QgsEditorWidgetFactory() { } -/** Override in own factory to get something different than the default (a simple QgsFilterLineEdit) - * +/** + * By default a simple QgsFilterLineEdit is returned as search widget. + * Override in own factory to get something different than the default. */ QgsSearchWidgetWrapper* QgsEditorWidgetFactory::createSearchWidget( QgsVectorLayer* vl, int fieldIdx, QWidget* parent ) const { diff --git a/src/gui/editorwidgets/core/qgseditorwidgetfactory.h b/src/gui/editorwidgets/core/qgseditorwidgetfactory.h index 056cf4d2747..47f3180602b 100644 --- a/src/gui/editorwidgets/core/qgseditorwidgetfactory.h +++ b/src/gui/editorwidgets/core/qgseditorwidgetfactory.h @@ -115,6 +115,15 @@ class GUI_EXPORT QgsEditorWidgetFactory */ inline bool supportsField( QgsVectorLayer* vl, int fieldIdx ) { return isFieldSupported( vl, fieldIdx ); } + /** + * Returns a list of widget types which this editor widget supports. + * Each widget type can have a priority value attached, the factory with the highest one + * will be used. + * + * @return A map of widget type names and weight values + */ + virtual QMap supportedWidgetTypes() { return QMap(); } + /** * Create a pretty String representation of the value. * diff --git a/src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp b/src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp index f1af4b13943..31b50869bff 100644 --- a/src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp +++ b/src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp @@ -95,9 +95,21 @@ QgsEditorWidgetWrapper* QgsEditorWidgetRegistry::create( const QString& widgetId // Make sure that there is a widget created at this point // so setValue() et al won't crash ww->widget(); + + // If we tried to set a widget which is not supported by this wrapper + if ( !ww->valid() ) + { + delete ww; + QString wid = findSuitableWrapper( editor ); + ww = mWidgetFactories[wid]->create( vl, fieldIdx, editor, parent ); + ww->setConfig( config ); + ww->setContext( context ); + } + return ww; } } + return 0; } @@ -164,6 +176,20 @@ bool QgsEditorWidgetRegistry::registerWidget( const QString& widgetId, QgsEditor else { mWidgetFactories.insert( widgetId, widgetFactory ); + + // Use this factory as default where it provides the heighest priority + QMap types = widgetFactory->supportedWidgetTypes(); + QMap::ConstIterator it; + it = types.constBegin(); + + for ( ; it != types.constEnd(); ++it ) + { + if ( it.value() > mFactoriesByType[it.key()].first ) + { + mFactoriesByType[it.key()] = qMakePair( it.value(), widgetFactory ); + } + } + return true; } } @@ -316,3 +342,32 @@ void QgsEditorWidgetRegistry::writeSymbology( QDomElement& element, QDomDocument writeMapLayer( vl, element, doc ); } + +QString QgsEditorWidgetRegistry::findSuitableWrapper( QWidget* editor ) +{ + QMap >::ConstIterator it; + + QString widgetid; + int weight = 0; + + it = mFactoriesByType.constBegin(); + for ( ; it != mFactoriesByType.constEnd(); ++it ) + { + if ( editor->staticMetaObject.className() == it.key() ) + { + // if it's a perfect match: return it directly + return it.value().second->name(); + } + else if ( editor->inherits( it.key() ) ) + { + // if it's a subclass, continue evaluating, maybe we find a more-specific or one with more weight + if ( it.value().first > weight ) + { + weight = it.value().first; + widgetid = it.value().second->name(); + } + } + } + + return widgetid; +} diff --git a/src/gui/editorwidgets/core/qgseditorwidgetregistry.h b/src/gui/editorwidgets/core/qgseditorwidgetregistry.h index c5ffcd2cb4f..921d2d4e94e 100644 --- a/src/gui/editorwidgets/core/qgseditorwidgetregistry.h +++ b/src/gui/editorwidgets/core/qgseditorwidgetregistry.h @@ -193,7 +193,10 @@ class GUI_EXPORT QgsEditorWidgetRegistry : public QObject void writeSymbology( QDomElement& element, QDomDocument& doc, QString& errorMessage ); private: + QString findSuitableWrapper( QWidget* editor ); + QMap mWidgetFactories; + QMap > mFactoriesByType; }; #endif // QGSEDITORWIDGETREGISTRY_H diff --git a/src/gui/editorwidgets/core/qgswidgetwrapper.h b/src/gui/editorwidgets/core/qgswidgetwrapper.h index 85b71f543ab..8d8b536c6fe 100644 --- a/src/gui/editorwidgets/core/qgswidgetwrapper.h +++ b/src/gui/editorwidgets/core/qgswidgetwrapper.h @@ -119,6 +119,17 @@ class GUI_EXPORT QgsWidgetWrapper : public QObject */ static QgsWidgetWrapper* fromWidget( QWidget* widget ); + /** + * Return true if the widget has been properly initialized. + * This acts as hint for the calling party if this wrapper can be used + * after initializing it. + * If it cannot be used this is a hint tothe caller that he may try to find + * another suitable widget type instead. + * + * @return Validity status of this widget. + */ + virtual bool valid() = 0; + protected: /** * This method should create a new widget with the provided parent. This will only be called diff --git a/src/gui/editorwidgets/qgscheckboxwidgetwrapper.cpp b/src/gui/editorwidgets/qgscheckboxwidgetwrapper.cpp index 20c3bae9e1d..ec2d312002d 100644 --- a/src/gui/editorwidgets/qgscheckboxwidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgscheckboxwidgetwrapper.cpp @@ -53,6 +53,11 @@ void QgsCheckboxWidgetWrapper::initWidget( QWidget* editor ) connect( mGroupBox, SIGNAL( toggled( bool ) ), this, SLOT( valueChanged( bool ) ) ); } +bool QgsCheckboxWidgetWrapper::valid() +{ + return mCheckBox || mGroupBox; +} + void QgsCheckboxWidgetWrapper::setValue( const QVariant& value ) { if ( mGroupBox ) diff --git a/src/gui/editorwidgets/qgscheckboxwidgetwrapper.h b/src/gui/editorwidgets/qgscheckboxwidgetwrapper.h index 0bfd1960137..3f994b9fb7c 100644 --- a/src/gui/editorwidgets/qgscheckboxwidgetwrapper.h +++ b/src/gui/editorwidgets/qgscheckboxwidgetwrapper.h @@ -45,6 +45,7 @@ class GUI_EXPORT QgsCheckboxWidgetWrapper : public QgsEditorWidgetWrapper protected: QWidget* createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgsclassificationwidgetwrapper.cpp b/src/gui/editorwidgets/qgsclassificationwidgetwrapper.cpp index 94cba3e2e16..ccbfeef4bcd 100644 --- a/src/gui/editorwidgets/qgsclassificationwidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsclassificationwidgetwrapper.cpp @@ -59,6 +59,11 @@ void QgsClassificationWidgetWrapper::initWidget( QWidget* editor ) } } +bool QgsClassificationWidgetWrapper::valid() +{ + return mComboBox; +} + void QgsClassificationWidgetWrapper::setValue( const QVariant& value ) { mComboBox->setCurrentIndex( mComboBox->findData( value ) ); diff --git a/src/gui/editorwidgets/qgsclassificationwidgetwrapper.h b/src/gui/editorwidgets/qgsclassificationwidgetwrapper.h index 3fa6d71ea14..85fa7643486 100644 --- a/src/gui/editorwidgets/qgsclassificationwidgetwrapper.h +++ b/src/gui/editorwidgets/qgsclassificationwidgetwrapper.h @@ -33,6 +33,7 @@ class GUI_EXPORT QgsClassificationWidgetWrapper : public QgsEditorWidgetWrapper protected: QWidget*createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgscolorwidgetwrapper.cpp b/src/gui/editorwidgets/qgscolorwidgetwrapper.cpp index cb8d05cf41a..132dad71b29 100644 --- a/src/gui/editorwidgets/qgscolorwidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgscolorwidgetwrapper.cpp @@ -46,6 +46,11 @@ void QgsColorWidgetWrapper::initWidget( QWidget* editor ) connect( mColorButton, SIGNAL( colorChanged( QColor ) ), this, SLOT( valueChanged() ) ); } +bool QgsColorWidgetWrapper::valid() +{ + return mColorButton; +} + void QgsColorWidgetWrapper::setValue( const QVariant& value ) { if ( mColorButton ) diff --git a/src/gui/editorwidgets/qgscolorwidgetwrapper.h b/src/gui/editorwidgets/qgscolorwidgetwrapper.h index 5a7484dd994..5b56169e953 100644 --- a/src/gui/editorwidgets/qgscolorwidgetwrapper.h +++ b/src/gui/editorwidgets/qgscolorwidgetwrapper.h @@ -39,6 +39,7 @@ class GUI_EXPORT QgsColorWidgetWrapper : public QgsEditorWidgetWrapper protected: QWidget* createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgsdatetimeeditwrapper.cpp b/src/gui/editorwidgets/qgsdatetimeeditwrapper.cpp index bf285a91542..748f5bfd546 100644 --- a/src/gui/editorwidgets/qgsdatetimeeditwrapper.cpp +++ b/src/gui/editorwidgets/qgsdatetimeeditwrapper.cpp @@ -90,6 +90,11 @@ void QgsDateTimeEditWrapper::initWidget( QWidget *editor ) } } +bool QgsDateTimeEditWrapper::valid() +{ + return mQgsDateTimeEdit || mQDateTimeEdit; +} + void QgsDateTimeEditWrapper::dateTimeChanged( const QDateTime& dateTime ) { const QString fieldFormat = config( "field_format", QGSDATETIMEEDIT_DATEFORMAT ).toString(); diff --git a/src/gui/editorwidgets/qgsdatetimeeditwrapper.h b/src/gui/editorwidgets/qgsdatetimeeditwrapper.h index 773eec3d241..0574c3e359e 100644 --- a/src/gui/editorwidgets/qgsdatetimeeditwrapper.h +++ b/src/gui/editorwidgets/qgsdatetimeeditwrapper.h @@ -54,6 +54,7 @@ class GUI_EXPORT QgsDateTimeEditWrapper : public QgsEditorWidgetWrapper QVariant value() override; QWidget *createWidget( QWidget *parent ) override; void initWidget( QWidget *editor ) override; + bool valid() override; public slots: void setValue( const QVariant &value ) override; diff --git a/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp b/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp index 9f9afa33487..e667492b6d5 100644 --- a/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp @@ -26,7 +26,7 @@ QgsDefaultSearchWidgetWrapper::QgsDefaultSearchWidgetWrapper( QgsVectorLayer* vl , mLineEdit( NULL ) , mCheckbox( NULL ) , mContainer( NULL ) - , mCaseString(QString("LIKE")) + , mCaseString( QString( "LIKE" ) ) { } @@ -36,45 +36,45 @@ QString QgsDefaultSearchWidgetWrapper::expression() return mExpression; } -void QgsDefaultSearchWidgetWrapper::setCaseString(int caseSensitiveCheckState) +void QgsDefaultSearchWidgetWrapper::setCaseString( int caseSensitiveCheckState ) { - if ( caseSensitiveCheckState == Qt::Checked) - { - mCaseString = "LIKE"; - } - else - { - mCaseString = "ILIKE"; - } - // need to update also the line edit - setExpression(mLineEdit->text()); + if ( caseSensitiveCheckState == Qt::Checked ) + { + mCaseString = "LIKE"; + } + else + { + mCaseString = "ILIKE"; + } + // need to update also the line edit + setExpression( mLineEdit->text() ); } -void QgsDefaultSearchWidgetWrapper::setExpression(QString exp) +void QgsDefaultSearchWidgetWrapper::setExpression( QString exp ) { - QVariant::Type fldType = layer()->pendingFields()[mFieldIdx].type(); - bool numeric = ( fldType == QVariant::Int || fldType == QVariant::Double || fldType == QVariant::LongLong ); - - QSettings settings; - QString nullValue = settings.value( "qgis/nullValue", "NULL" ).toString(); - QString fieldName = layer()->pendingFields()[mFieldIdx].name(); - QString str; - if ( exp == nullValue ) - { - str = QString( "%1 IS NULL" ).arg( QgsExpression::quotedColumnRef( fieldName ) ); - } - else - { - str = QString( "%1 %2 '%3'" ) - .arg( QgsExpression::quotedColumnRef( fieldName ) ) - .arg( numeric ? "=" : mCaseString ) - .arg( numeric - ? exp.replace( "'", "''" ) - : - "%" + exp.replace( "'", "''" ) + "%" ); // escape quotes - } - mExpression = str; - emit expressionChanged(mExpression); + QVariant::Type fldType = layer()->pendingFields()[mFieldIdx].type(); + bool numeric = ( fldType == QVariant::Int || fldType == QVariant::Double || fldType == QVariant::LongLong ); + + QSettings settings; + QString nullValue = settings.value( "qgis/nullValue", "NULL" ).toString(); + QString fieldName = layer()->pendingFields()[mFieldIdx].name(); + QString str; + if ( exp == nullValue ) + { + str = QString( "%1 IS NULL" ).arg( QgsExpression::quotedColumnRef( fieldName ) ); + } + else + { + str = QString( "%1 %2 '%3'" ) + .arg( QgsExpression::quotedColumnRef( fieldName ) ) + .arg( numeric ? "=" : mCaseString ) + .arg( numeric + ? exp.replace( "'", "''" ) + : + "%" + exp.replace( "'", "''" ) + "%" ); // escape quotes + } + mExpression = str; + emit expressionChanged( mExpression ); } QWidget* QgsDefaultSearchWidgetWrapper::createWidget( QWidget* parent ) @@ -82,21 +82,26 @@ QWidget* QgsDefaultSearchWidgetWrapper::createWidget( QWidget* parent ) return new QWidget( parent ); } -bool QgsDefaultSearchWidgetWrapper::applyDirectly() +bool QgsDefaultSearchWidgetWrapper::applyDirectly() { - return false; + return false; } void QgsDefaultSearchWidgetWrapper::initWidget( QWidget* widget ) { mContainer = widget; - mContainer->setLayout(new QHBoxLayout() ); + mContainer->setLayout( new QHBoxLayout() ); mLineEdit = new QgsFilterLineEdit(); - mCheckbox = new QCheckBox("Case sensitive"); - mContainer->layout()->addWidget(mLineEdit); - mContainer->layout()->addWidget(mCheckbox); + mCheckbox = new QCheckBox( "Case sensitive" ); + mContainer->layout()->addWidget( mLineEdit ); + mContainer->layout()->addWidget( mCheckbox ); connect( mLineEdit, SIGNAL( textChanged( QString ) ), this, SLOT( setExpression( QString ) ) ); - connect( mCheckbox, SIGNAL( stateChanged( int ) ), this, SLOT( setCaseString(int) ) ); - mCheckbox->setChecked(Qt::Unchecked); + connect( mCheckbox, SIGNAL( stateChanged( int ) ), this, SLOT( setCaseString( int ) ) ); + mCheckbox->setChecked( Qt::Unchecked ); mCaseString = "ILIKE"; } + +bool QgsDefaultSearchWidgetWrapper::valid() +{ + return true; +} diff --git a/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.h b/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.h index 0fe1b55f61a..afaba822fdc 100644 --- a/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.h +++ b/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.h @@ -37,14 +37,15 @@ class GUI_EXPORT QgsDefaultSearchWidgetWrapper : public QgsSearchWidgetWrapper QString expression() override; bool applyDirectly() override; protected slots: - void setExpression(QString exp) override; + void setExpression( QString exp ) override; private slots: - void setCaseString(int); - + void setCaseString( int ); + protected: QWidget* createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; private: QgsFilterLineEdit* mLineEdit; diff --git a/src/gui/editorwidgets/qgsenumerationwidgetwrapper.cpp b/src/gui/editorwidgets/qgsenumerationwidgetwrapper.cpp index 164689fd240..56f8313dabb 100644 --- a/src/gui/editorwidgets/qgsenumerationwidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsenumerationwidgetwrapper.cpp @@ -57,6 +57,11 @@ void QgsEnumerationWidgetWrapper::initWidget( QWidget* editor ) } } +bool QgsEnumerationWidgetWrapper::valid() +{ + return mComboBox; +} + void QgsEnumerationWidgetWrapper::setValue( const QVariant& value ) { if ( mComboBox ) diff --git a/src/gui/editorwidgets/qgsenumerationwidgetwrapper.h b/src/gui/editorwidgets/qgsenumerationwidgetwrapper.h index 6ed23bd4b13..c3e416d5304 100644 --- a/src/gui/editorwidgets/qgsenumerationwidgetwrapper.h +++ b/src/gui/editorwidgets/qgsenumerationwidgetwrapper.h @@ -33,6 +33,7 @@ class GUI_EXPORT QgsEnumerationWidgetWrapper : public QgsEditorWidgetWrapper protected: QWidget* createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgsfilenamewidgetwrapper.cpp b/src/gui/editorwidgets/qgsfilenamewidgetwrapper.cpp index 6f1ef30927a..dba79be7bdf 100644 --- a/src/gui/editorwidgets/qgsfilenamewidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsfilenamewidgetwrapper.cpp @@ -47,6 +47,11 @@ QVariant QgsFileNameWidgetWrapper::value() return value; } +bool QgsFileNameWidgetWrapper::valid() +{ + return mLineEdit || mLabel; +} + QWidget* QgsFileNameWidgetWrapper::createWidget( QWidget* parent ) { QWidget* container = new QWidget( parent ); diff --git a/src/gui/editorwidgets/qgsfilenamewidgetwrapper.h b/src/gui/editorwidgets/qgsfilenamewidgetwrapper.h index 52740e77c38..ee29516be6e 100644 --- a/src/gui/editorwidgets/qgsfilenamewidgetwrapper.h +++ b/src/gui/editorwidgets/qgsfilenamewidgetwrapper.h @@ -40,6 +40,7 @@ class GUI_EXPORT QgsFileNameWidgetWrapper : public QgsEditorWidgetWrapper // QgsEditorWidgetWrapper interface public: QVariant value() override; + bool valid() override; protected: QWidget* createWidget( QWidget* parent ) override; diff --git a/src/gui/editorwidgets/qgshiddenwidgetwrapper.cpp b/src/gui/editorwidgets/qgshiddenwidgetwrapper.cpp index 5f2b8f2eb46..d69f6e490a6 100644 --- a/src/gui/editorwidgets/qgshiddenwidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgshiddenwidgetwrapper.cpp @@ -40,6 +40,11 @@ void QgsHiddenWidgetWrapper::initWidget( QWidget* editor ) editor->setVisible( false ); } +bool QgsHiddenWidgetWrapper::valid() +{ + return true; +} + void QgsHiddenWidgetWrapper::setValue( const QVariant& value ) { mValue = value; diff --git a/src/gui/editorwidgets/qgshiddenwidgetwrapper.h b/src/gui/editorwidgets/qgshiddenwidgetwrapper.h index 2717b1634a9..765a062d3f5 100644 --- a/src/gui/editorwidgets/qgshiddenwidgetwrapper.h +++ b/src/gui/editorwidgets/qgshiddenwidgetwrapper.h @@ -36,6 +36,7 @@ class GUI_EXPORT QgsHiddenWidgetWrapper : public QgsEditorWidgetWrapper protected: QWidget* createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgsphotowidgetwrapper.cpp b/src/gui/editorwidgets/qgsphotowidgetwrapper.cpp index e5a4e43d5af..2b503277329 100644 --- a/src/gui/editorwidgets/qgsphotowidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsphotowidgetwrapper.cpp @@ -156,6 +156,11 @@ void QgsPhotoWidgetWrapper::initWidget( QWidget* editor ) } } +bool QgsPhotoWidgetWrapper::valid() +{ + return mPhotoLabel || mLineEdit || mButton || mWebView; +} + void QgsPhotoWidgetWrapper::setValue( const QVariant& value ) { if ( mLineEdit ) diff --git a/src/gui/editorwidgets/qgsphotowidgetwrapper.h b/src/gui/editorwidgets/qgsphotowidgetwrapper.h index 2761b8ab890..d9ee5c1b7e5 100644 --- a/src/gui/editorwidgets/qgsphotowidgetwrapper.h +++ b/src/gui/editorwidgets/qgsphotowidgetwrapper.h @@ -48,6 +48,7 @@ class GUI_EXPORT QgsPhotoWidgetWrapper : public QgsEditorWidgetWrapper protected: QWidget* createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgsrangewidgetfactory.cpp b/src/gui/editorwidgets/qgsrangewidgetfactory.cpp index 123e59f19eb..791b003b3ea 100644 --- a/src/gui/editorwidgets/qgsrangewidgetfactory.cpp +++ b/src/gui/editorwidgets/qgsrangewidgetfactory.cpp @@ -84,3 +84,13 @@ bool QgsRangeWidgetFactory::isFieldSupported( QgsVectorLayer* vl, int fieldIdx ) return false; } } + +QMap QgsRangeWidgetFactory::supportedWidgetTypes() +{ + QMap map = QMap(); + map.insert( QSlider::staticMetaObject.className(), 10 ); + map.insert( QDial::staticMetaObject.className(), 10 ); + map.insert( QSpinBox::staticMetaObject.className(), 10 ); + map.insert( QDoubleSpinBox::staticMetaObject.className(), 10 ); + return map; +} diff --git a/src/gui/editorwidgets/qgsrangewidgetfactory.h b/src/gui/editorwidgets/qgsrangewidgetfactory.h index ce2ee4dd08e..031c9201e87 100644 --- a/src/gui/editorwidgets/qgsrangewidgetfactory.h +++ b/src/gui/editorwidgets/qgsrangewidgetfactory.h @@ -29,6 +29,7 @@ class GUI_EXPORT QgsRangeWidgetFactory : public QgsEditorWidgetFactory virtual QgsEditorConfigWidget* configWidget( QgsVectorLayer* vl, int fieldIdx, QWidget* parent ) const override; virtual QgsEditorWidgetConfig readConfig( const QDomElement& configElement, QgsVectorLayer* layer, int fieldIdx ) override; virtual void writeConfig( const QgsEditorWidgetConfig& config, QDomElement& configElement, QDomDocument& doc, const QgsVectorLayer* layer, int fieldIdx ) override; + virtual QMap supportedWidgetTypes() override; private: virtual bool isFieldSupported( QgsVectorLayer *vl, int fieldIdx ) override; diff --git a/src/gui/editorwidgets/qgsrangewidgetwrapper.cpp b/src/gui/editorwidgets/qgsrangewidgetwrapper.cpp index ed099cfd37b..48e1c7360d9 100644 --- a/src/gui/editorwidgets/qgsrangewidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsrangewidgetwrapper.cpp @@ -75,6 +75,10 @@ void QgsRangeWidgetWrapper::initWidget( QWidget* editor ) bool allowNull = config( "AllowNull" ).toBool(); + QVariant min( config( "Min" ) ); + QVariant max( config( "Max" ) ); + QVariant step( config( "Step" ) ); + if ( mDoubleSpinBox ) { // set the precision if field is integer @@ -84,8 +88,8 @@ void QgsRangeWidgetWrapper::initWidget( QWidget* editor ) mDoubleSpinBox->setDecimals( layer()->pendingFields()[fieldIdx()].precision() ); } - double min = config( "Min" ).toDouble(); - double step = config( "Step" ).toDouble(); + double minval = min.toDouble(); + double stepval = step.toDouble(); QgsDoubleSpinBox* qgsWidget = dynamic_cast( mDoubleSpinBox ); if ( qgsWidget ) qgsWidget->setShowClearButton( allowNull ); @@ -93,90 +97,107 @@ void QgsRangeWidgetWrapper::initWidget( QWidget* editor ) { if ( precision > 0 ) { - min -= 10 ^ -precision; + minval -= 10 ^ -precision; } else { - min -= step; + minval -= stepval; } - mDoubleSpinBox->setValue( min ); + mDoubleSpinBox->setValue( minval ); mDoubleSpinBox->setSpecialValueText( QSettings().value( "qgis/nullValue", "NULL" ).toString() ); } - mDoubleSpinBox->setMinimum( min ); - mDoubleSpinBox->setMaximum( config( "Max" ).toDouble() ); - mDoubleSpinBox->setSingleStep( step ); + if ( min.isValid() ) + mDoubleSpinBox->setMinimum( min.toDouble() ); + if ( max.isValid() ) + mDoubleSpinBox->setMaximum( max.toDouble() ); + if ( step.isValid() ) + mDoubleSpinBox->setSingleStep( step.toDouble() ); if ( config( "Suffix" ).isValid() ) - { mDoubleSpinBox->setSuffix( config( "Suffix" ).toString() ); - } + connect( mDoubleSpinBox, SIGNAL( valueChanged( double ) ), this, SLOT( valueChanged( double ) ) ); } if ( mIntSpinBox ) { - int min = config( "Min" ).toInt(); - int step = config( "Step" ).toInt(); + int minval = min.toInt(); + int stepval = step.toInt(); QgsSpinBox* qgsWidget = dynamic_cast( mIntSpinBox ); if ( qgsWidget ) qgsWidget->setShowClearButton( allowNull ); if ( allowNull ) { - min -= step; - mIntSpinBox->setValue( min ); + minval -= stepval; + mIntSpinBox->setValue( minval ); mIntSpinBox->setSpecialValueText( QSettings().value( "qgis/nullValue", "NULL" ).toString() ); } - mIntSpinBox->setMinimum( min ); - mIntSpinBox->setMaximum( config( "Max" ).toInt() ); - mIntSpinBox->setSingleStep( step ); + if ( min.isValid() ) + mIntSpinBox->setMinimum( min.toInt() ); + if ( max.isValid() ) + mIntSpinBox->setMaximum( max.toInt() ); + if ( step.isValid() ) + mIntSpinBox->setSingleStep( step.toInt() ); if ( config( "Suffix" ).isValid() ) - { mIntSpinBox->setSuffix( config( "Suffix" ).toString() ); - } connect( mIntSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( valueChanged( int ) ) ); } + if ( mQgsDial || mQgsSlider ) { - QVariant min( config( "Min" ) ); - QVariant max( config( "Max" ) ); - QVariant step( config( "Step" ) ); - field().convertCompatible( min ); field().convertCompatible( max ); field().convertCompatible( step ); if ( mQgsSlider ) { - mQgsSlider->setMinimum( min ); - mQgsSlider->setMaximum( max ); - mQgsSlider->setSingleStep( step ); + if ( min.isValid() ) + mQgsSlider->setMinimum( min ); + if ( max.isValid() ) + mQgsSlider->setMaximum( max ); + if ( step.isValid() ) + mQgsSlider->setSingleStep( step ); } if ( mQgsDial ) { - mQgsDial->setMinimum( min ); - mQgsDial->setMaximum( max ); - mQgsDial->setSingleStep( step ); + if ( min.isValid() ) + mQgsDial->setMinimum( min ); + if ( max.isValid() ) + mQgsDial->setMaximum( max ); + if ( step.isValid() ) + mQgsDial->setSingleStep( step ); } connect( editor, SIGNAL( valueChanged( QVariant ) ), this, SLOT( valueChanged( QVariant ) ) ); } else if ( mDial ) { - mDial->setMinimum( config( "Min" ).toInt() ); - mDial->setMaximum( config( "Max" ).toInt() ); - mDial->setSingleStep( config( "Step" ).toInt() ); + if ( min.isValid() ) + mDial->setMinimum( min.toInt() ); + if ( max.isValid() ) + mDial->setMaximum( max.toInt() ); + if ( step.isValid() ) + mDial->setSingleStep( step.toInt() ); connect( mDial, SIGNAL( valueChanged( int ) ), this, SLOT( valueChanged( int ) ) ); } else if ( mSlider ) { - mSlider->setMinimum( config( "Min" ).toInt() ); - mSlider->setMaximum( config( "Max" ).toInt() ); - mSlider->setSingleStep( config( "Step" ).toInt() ); + if ( min.isValid() ) + mSlider->setMinimum( min.toInt() ); + if ( max.isValid() ) + mSlider->setMaximum( max.toInt() ); + if ( step.isValid() ) + mSlider->setSingleStep( step.toInt() ); connect( mSlider, SIGNAL( valueChanged( int ) ), this, SLOT( valueChanged( int ) ) ); } } +bool QgsRangeWidgetWrapper::valid() +{ + return mSlider || mDial || mQgsDial || mQgsSlider || mIntSpinBox || mDoubleSpinBox; +} + void QgsRangeWidgetWrapper::valueChanged( QVariant v ) { if ( v.type() == QVariant::Int ) diff --git a/src/gui/editorwidgets/qgsrangewidgetwrapper.h b/src/gui/editorwidgets/qgsrangewidgetwrapper.h index d96d27e6418..51e59e48f77 100644 --- a/src/gui/editorwidgets/qgsrangewidgetwrapper.h +++ b/src/gui/editorwidgets/qgsrangewidgetwrapper.h @@ -50,6 +50,7 @@ class GUI_EXPORT QgsRangeWidgetWrapper : public QgsEditorWidgetWrapper protected: virtual QWidget* createWidget( QWidget* parent ) override; virtual void initWidget( QWidget* editor ) override; + bool valid() override; public slots: virtual void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.cpp b/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.cpp index c4d76a8dfc8..87dbdac0fa4 100644 --- a/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.cpp @@ -99,6 +99,11 @@ QVariant QgsRelationReferenceWidgetWrapper::value() } } +bool QgsRelationReferenceWidgetWrapper::valid() +{ + return mWidget; +} + void QgsRelationReferenceWidgetWrapper::setValue( const QVariant& val ) { if ( !mWidget || val == value() ) diff --git a/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.h b/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.h index 0516e340a21..df10592f2e7 100644 --- a/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.h +++ b/src/gui/editorwidgets/qgsrelationreferencewidgetwrapper.h @@ -49,6 +49,7 @@ class GUI_EXPORT QgsRelationReferenceWidgetWrapper : public QgsEditorWidgetWrapp virtual QWidget* createWidget( QWidget* parent ) override; virtual void initWidget( QWidget* editor ) override; virtual QVariant value() override; + bool valid() override; public slots: virtual void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgsrelationwidgetwrapper.cpp b/src/gui/editorwidgets/qgsrelationwidgetwrapper.cpp index 4086639a780..1096dcec63e 100644 --- a/src/gui/editorwidgets/qgsrelationwidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsrelationwidgetwrapper.cpp @@ -73,3 +73,8 @@ void QgsRelationWidgetWrapper::initWidget( QWidget* editor ) mWidget = w; } + +bool QgsRelationWidgetWrapper::valid() +{ + return mWidget; +} diff --git a/src/gui/editorwidgets/qgsrelationwidgetwrapper.h b/src/gui/editorwidgets/qgsrelationwidgetwrapper.h index 1f18882608e..7ad8298312c 100644 --- a/src/gui/editorwidgets/qgsrelationwidgetwrapper.h +++ b/src/gui/editorwidgets/qgsrelationwidgetwrapper.h @@ -30,6 +30,7 @@ class GUI_EXPORT QgsRelationWidgetWrapper : public QgsWidgetWrapper protected: QWidget* createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setFeature( const QgsFeature& feature ) override; diff --git a/src/gui/editorwidgets/qgstexteditwrapper.cpp b/src/gui/editorwidgets/qgstexteditwrapper.cpp index 340ddfc46a9..fbc4370a355 100644 --- a/src/gui/editorwidgets/qgstexteditwrapper.cpp +++ b/src/gui/editorwidgets/qgstexteditwrapper.cpp @@ -130,6 +130,11 @@ void QgsTextEditWrapper::initWidget( QWidget* editor ) } } +bool QgsTextEditWrapper::valid() +{ + return mLineEdit || mTextEdit || mPlainTextEdit; +} + void QgsTextEditWrapper::setValue( const QVariant& val ) { QString v; diff --git a/src/gui/editorwidgets/qgstexteditwrapper.h b/src/gui/editorwidgets/qgstexteditwrapper.h index 6264c1122ff..04c53dd98e5 100644 --- a/src/gui/editorwidgets/qgstexteditwrapper.h +++ b/src/gui/editorwidgets/qgstexteditwrapper.h @@ -46,6 +46,7 @@ class GUI_EXPORT QgsTextEditWrapper : public QgsEditorWidgetWrapper protected: QWidget*createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgsuniquevaluewidgetwrapper.cpp b/src/gui/editorwidgets/qgsuniquevaluewidgetwrapper.cpp index 3347ebe3af3..a13eb910842 100644 --- a/src/gui/editorwidgets/qgsuniquevaluewidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsuniquevaluewidgetwrapper.cpp @@ -100,6 +100,11 @@ void QgsUniqueValuesWidgetWrapper::initWidget( QWidget* editor ) } } +bool QgsUniqueValuesWidgetWrapper::valid() +{ + return mComboBox || mLineEdit; +} + void QgsUniqueValuesWidgetWrapper::setValue( const QVariant& value ) { if ( mComboBox ) diff --git a/src/gui/editorwidgets/qgsuniquevaluewidgetwrapper.h b/src/gui/editorwidgets/qgsuniquevaluewidgetwrapper.h index f59b42b5f71..8dfd3b23c4c 100644 --- a/src/gui/editorwidgets/qgsuniquevaluewidgetwrapper.h +++ b/src/gui/editorwidgets/qgsuniquevaluewidgetwrapper.h @@ -44,6 +44,7 @@ class GUI_EXPORT QgsUniqueValuesWidgetWrapper : public QgsEditorWidgetWrapper protected: QWidget* createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgsuuidwidgetwrapper.cpp b/src/gui/editorwidgets/qgsuuidwidgetwrapper.cpp index cda5fe52a1e..de7989ef124 100644 --- a/src/gui/editorwidgets/qgsuuidwidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsuuidwidgetwrapper.cpp @@ -49,6 +49,11 @@ void QgsUuidWidgetWrapper::initWidget( QWidget* editor ) mLineEdit->setEnabled( false ); } +bool QgsUuidWidgetWrapper::valid() +{ + return mLineEdit || mLabel; +} + void QgsUuidWidgetWrapper::setValue( const QVariant& value ) { if ( value.isNull() ) diff --git a/src/gui/editorwidgets/qgsuuidwidgetwrapper.h b/src/gui/editorwidgets/qgsuuidwidgetwrapper.h index 4029b9d27e4..6dc437d285e 100644 --- a/src/gui/editorwidgets/qgsuuidwidgetwrapper.h +++ b/src/gui/editorwidgets/qgsuuidwidgetwrapper.h @@ -41,6 +41,7 @@ class GUI_EXPORT QgsUuidWidgetWrapper : public QgsEditorWidgetWrapper protected: QWidget* createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgsvaluemapwidgetfactory.cpp b/src/gui/editorwidgets/qgsvaluemapwidgetfactory.cpp index 1fdb692cbd7..204b07b650f 100644 --- a/src/gui/editorwidgets/qgsvaluemapwidgetfactory.cpp +++ b/src/gui/editorwidgets/qgsvaluemapwidgetfactory.cpp @@ -88,3 +88,10 @@ QString QgsValueMapWidgetFactory::representValue( QgsVectorLayer* vl, int fieldI return config.key( value, QVariant( QString( "(%1)" ).arg( value.toString() ) ).toString() ); } + +QMap QgsValueMapWidgetFactory::supportedWidgetTypes() +{ + QMap map = QMap(); + map.insert( QComboBox::staticMetaObject.className(), 10 ); + return map; +} diff --git a/src/gui/editorwidgets/qgsvaluemapwidgetfactory.h b/src/gui/editorwidgets/qgsvaluemapwidgetfactory.h index 2a28a7afb88..ec738b909ff 100644 --- a/src/gui/editorwidgets/qgsvaluemapwidgetfactory.h +++ b/src/gui/editorwidgets/qgsvaluemapwidgetfactory.h @@ -31,6 +31,7 @@ class GUI_EXPORT QgsValueMapWidgetFactory : public QgsEditorWidgetFactory QgsEditorWidgetConfig readConfig( const QDomElement& configElement, QgsVectorLayer* layer, int fieldIdx ) override; void writeConfig( const QgsEditorWidgetConfig& config, QDomElement& configElement, QDomDocument& doc, const QgsVectorLayer* layer, int fieldIdx ) override; QString representValue( QgsVectorLayer* vl, int fieldIdx, const QgsEditorWidgetConfig& config, const QVariant& cache, const QVariant& value ) const override; + virtual QMap supportedWidgetTypes() override; }; #endif // QGSVALUEMAPWIDGETFACTORY_H diff --git a/src/gui/editorwidgets/qgsvaluemapwidgetwrapper.cpp b/src/gui/editorwidgets/qgsvaluemapwidgetwrapper.cpp index b423ef5b9db..36335676eef 100644 --- a/src/gui/editorwidgets/qgsvaluemapwidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsvaluemapwidgetwrapper.cpp @@ -55,6 +55,11 @@ void QgsValueMapWidgetWrapper::initWidget( QWidget* editor ) } } +bool QgsValueMapWidgetWrapper::valid() +{ + return mComboBox; +} + void QgsValueMapWidgetWrapper::setValue( const QVariant& value ) { if ( mComboBox ) diff --git a/src/gui/editorwidgets/qgsvaluemapwidgetwrapper.h b/src/gui/editorwidgets/qgsvaluemapwidgetwrapper.h index 696782c04a2..c5baf5f8691 100644 --- a/src/gui/editorwidgets/qgsvaluemapwidgetwrapper.h +++ b/src/gui/editorwidgets/qgsvaluemapwidgetwrapper.h @@ -46,6 +46,7 @@ class GUI_EXPORT QgsValueMapWidgetWrapper : public QgsEditorWidgetWrapper protected: QWidget* createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp b/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp index ce190ace3f5..82aac0fd44e 100644 --- a/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp @@ -25,7 +25,7 @@ #include bool QgsValueRelationWidgetWrapper::orderByKeyLessThan( const QgsValueRelationWidgetWrapper::ValueRelationItem& p1 - , const QgsValueRelationWidgetWrapper::ValueRelationItem& p2 ) + , const QgsValueRelationWidgetWrapper::ValueRelationItem& p2 ) { switch ( p1.first.type() ) { @@ -44,7 +44,7 @@ bool QgsValueRelationWidgetWrapper::orderByKeyLessThan( const QgsValueRelationWi } bool QgsValueRelationWidgetWrapper::orderByValueLessThan( const QgsValueRelationWidgetWrapper::ValueRelationItem& p1 - , const QgsValueRelationWidgetWrapper::ValueRelationItem& p2 ) + , const QgsValueRelationWidgetWrapper::ValueRelationItem& p2 ) { return p1.second < p2.second; } @@ -164,6 +164,11 @@ void QgsValueRelationWidgetWrapper::initWidget( QWidget* editor ) } } +bool QgsValueRelationWidgetWrapper::valid() +{ + return mListWidget || mLineEdit || mComboBox; +} + void QgsValueRelationWidgetWrapper::setValue( const QVariant& value ) { if ( mListWidget ) diff --git a/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.h b/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.h index 6623605c87c..d75e283b829 100644 --- a/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.h +++ b/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.h @@ -55,9 +55,9 @@ class GUI_EXPORT QgsValueRelationWidgetWrapper : public QgsEditorWidgetWrapper public: explicit QgsValueRelationWidgetWrapper( QgsVectorLayer* vl, int fieldIdx, QWidget* editor = 0, QWidget* parent = 0 ); static bool orderByKeyLessThan( const QgsValueRelationWidgetWrapper::ValueRelationItem& p1 , - const QgsValueRelationWidgetWrapper::ValueRelationItem& p2 ); + const QgsValueRelationWidgetWrapper::ValueRelationItem& p2 ); static bool orderByValueLessThan( const QgsValueRelationWidgetWrapper::ValueRelationItem& p1 , - const QgsValueRelationWidgetWrapper::ValueRelationItem& p2 ); + const QgsValueRelationWidgetWrapper::ValueRelationItem& p2 ); @@ -70,6 +70,7 @@ class GUI_EXPORT QgsValueRelationWidgetWrapper : public QgsEditorWidgetWrapper protected: QWidget* createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setValue( const QVariant& value ) override; diff --git a/src/gui/editorwidgets/qgswebviewwidgetwrapper.cpp b/src/gui/editorwidgets/qgswebviewwidgetwrapper.cpp index 2de9109a028..1f2b371310e 100644 --- a/src/gui/editorwidgets/qgswebviewwidgetwrapper.cpp +++ b/src/gui/editorwidgets/qgswebviewwidgetwrapper.cpp @@ -121,6 +121,11 @@ void QgsWebViewWidgetWrapper::initWidget( QWidget* editor ) } } +bool QgsWebViewWidgetWrapper::valid() +{ + return mWebView || mButton || mLineEdit; +} + void QgsWebViewWidgetWrapper::setValue( const QVariant& value ) { if ( mLineEdit ) diff --git a/src/gui/editorwidgets/qgswebviewwidgetwrapper.h b/src/gui/editorwidgets/qgswebviewwidgetwrapper.h index 227a498ef0d..9e10d40e01f 100644 --- a/src/gui/editorwidgets/qgswebviewwidgetwrapper.h +++ b/src/gui/editorwidgets/qgswebviewwidgetwrapper.h @@ -41,6 +41,7 @@ class GUI_EXPORT QgsWebViewWidgetWrapper : public QgsEditorWidgetWrapper protected: QWidget* createWidget( QWidget* parent ) override; void initWidget( QWidget* editor ) override; + bool valid() override; public slots: void setValue( const QVariant& value ) override;