Skip to content

Commit

Permalink
Add ability to set default values for QgsFilterLineEdit
Browse files Browse the repository at this point in the history
and have clearing the widget reset to default rather than
null
  • Loading branch information
nyalldawson committed Sep 8, 2016
1 parent edcc247 commit d71453d
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 3 deletions.
36 changes: 36 additions & 0 deletions python/gui/qgsfilterlineedit.sip
Expand Up @@ -14,12 +14,31 @@ class QgsFilterLineEdit : QLineEdit
%End
public:

//! Behaviour when clearing value of widget
enum ClearMode
{
ClearToNull, //!< Reset value to null
ClearToDefault, //!< Reset value to default value (see defaultValue() )
};

/** Constructor for QgsFilterLineEdit.
* @param parent parent widget
* @param nullValue string for representing null values
*/
QgsFilterLineEdit( QWidget* parent /TransferThis/ = 0, const QString& nullValue = QString::null );

/** Returns the clear mode for the widget. The clear mode defines the behaviour of the
* widget when its value is cleared. This defaults to ClearToNull.
* @see setClearMode()
*/
ClearMode clearMode() const;

/** Sets the clear mode for the widget. The clear mode defines the behaviour of the
* widget when its value is cleared. This defaults to ClearToNull.
* @see clearMode()
*/
void setClearMode( ClearMode mode );

/** Sets the string representation for null values in the widget. This does not
* affect the values returned for null values by value(), rather it only affects
* the text that is shown to users when the widget's value is null.
Expand All @@ -34,6 +53,23 @@ class QgsFilterLineEdit : QLineEdit
*/
QString nullValue() const;

/** Sets the default value for the widget. The default value is a value
* which the widget will be reset to if it is cleared and the clearMode()
* is equal to ClearToDefault.
* @param defaultValue default value
* @see defaultValue()
* @see clearMode()
*/
void setDefaultValue( const QString& defaultValue );

/** Returns the default value for the widget. The default value is a value
* which the widget will be reset to if it is cleared and the clearMode()
* is equal to ClearToDefault.
* @see setDefaultValue()
* @see clearMode()
*/
QString defaultValue() const;

/**
* Sets the current text for the widget with support for handling null values.
*
Expand Down
27 changes: 25 additions & 2 deletions src/gui/qgsfilterlineedit.cpp
Expand Up @@ -25,6 +25,7 @@

QgsFilterLineEdit::QgsFilterLineEdit( QWidget* parent, const QString& nullValue )
: QLineEdit( parent )
, mClearMode( ClearToNull )
, mNullValue( nullValue )
, mFocusInEvent( false )
, mClearHover( false )
Expand Down Expand Up @@ -87,7 +88,18 @@ void QgsFilterLineEdit::focusInEvent( QFocusEvent* e )

void QgsFilterLineEdit::clearValue()
{
setText( mNullValue );
switch ( mClearMode )
{
case ClearToNull:
setText( mNullValue );
break;

case ClearToDefault:
setText( mDefaultValue );
break;

}

setModified( true );
emit cleared();
}
Expand Down Expand Up @@ -133,7 +145,18 @@ void QgsFilterLineEdit::onTextChanged( const QString &text )

bool QgsFilterLineEdit::shouldShowClear() const
{
return isEnabled() && !isReadOnly() && !isNull();
if ( !isEnabled() || isReadOnly() )
return false;

switch ( mClearMode )
{
case ClearToNull:
return !isNull();

case ClearToDefault:
return value() != mDefaultValue;
}
return false; //avoid warnings
}

QRect QgsFilterLineEdit::clearRect() const
Expand Down
43 changes: 43 additions & 0 deletions src/gui/qgsfilterlineedit.h
Expand Up @@ -34,17 +34,39 @@ class QToolButton;
class GUI_EXPORT QgsFilterLineEdit : public QLineEdit
{
Q_OBJECT
Q_ENUMS( ClearMode )
Q_PROPERTY( ClearMode clearMode READ clearMode WRITE setClearMode )
Q_PROPERTY( QString nullValue READ nullValue WRITE setNullValue )
Q_PROPERTY( QString defaultValue READ defaultValue WRITE setDefaultValue )
Q_PROPERTY( QString value READ value WRITE setValue NOTIFY valueChanged )

public:

//! Behaviour when clearing value of widget
enum ClearMode
{
ClearToNull = 0, //!< Reset value to null
ClearToDefault, //!< Reset value to default value (see defaultValue() )
};

/** Constructor for QgsFilterLineEdit.
* @param parent parent widget
* @param nullValue string for representing null values
*/
QgsFilterLineEdit( QWidget* parent = nullptr, const QString& nullValue = QString::null );

/** Returns the clear mode for the widget. The clear mode defines the behaviour of the
* widget when its value is cleared. This defaults to ClearToNull.
* @see setClearMode()
*/
ClearMode clearMode() const { return mClearMode; }

/** Sets the clear mode for the widget. The clear mode defines the behaviour of the
* widget when its value is cleared. This defaults to ClearToNull.
* @see clearMode()
*/
void setClearMode( ClearMode mode ) { mClearMode = mode; }

/** Sets the string representation for null values in the widget. This does not
* affect the values returned for null values by value(), rather it only affects
* the text that is shown to users when the widget's value is null.
Expand All @@ -59,6 +81,23 @@ class GUI_EXPORT QgsFilterLineEdit : public QLineEdit
*/
QString nullValue() const { return mNullValue; }

/** Sets the default value for the widget. The default value is a value
* which the widget will be reset to if it is cleared and the clearMode()
* is equal to ClearToDefault.
* @param defaultValue default value
* @see defaultValue()
* @see clearMode()
*/
void setDefaultValue( const QString& defaultValue ) { mDefaultValue = defaultValue; }

/** Returns the default value for the widget. The default value is a value
* which the widget will be reset to if it is cleared and the clearMode()
* is equal to ClearToDefault.
* @see setDefaultValue()
* @see clearMode()
*/
QString defaultValue() const { return mDefaultValue; }

/**
* Sets the current text for the widget with support for handling null values.
*
Expand Down Expand Up @@ -118,7 +157,11 @@ class GUI_EXPORT QgsFilterLineEdit : public QLineEdit
void onTextChanged( const QString &text );

private:

ClearMode mClearMode;

QString mNullValue;
QString mDefaultValue;
QString mStyleSheet;
bool mFocusInEvent;
bool mClearHover;
Expand Down
27 changes: 26 additions & 1 deletion tests/src/python/test_qgsfilterlineedit.py
Expand Up @@ -38,6 +38,10 @@ def testGettersSetters(self):
w.setValue('value')
self.assertEqual(w.value(), 'value')
self.assertEqual(w.text(), 'value')
w.setDefaultValue('default')
self.assertEqual(w.defaultValue(), 'default')
w.setClearMode(QgsFilterLineEdit.ClearToDefault)
self.assertEqual(w.clearMode(), QgsFilterLineEdit.ClearToDefault)

def testNullValueHandling(self):
""" test widget handling of null values """
Expand Down Expand Up @@ -70,7 +74,7 @@ def testNullValueHandling(self):
self.assertTrue(w.isNull())
self.assertFalse(w.value())

def testClear(self):
def testClearToNull(self):
""" test clearing widget """
w = qgis.gui.QgsFilterLineEdit()

Expand All @@ -90,6 +94,27 @@ def testClear(self):
self.assertTrue(w.isNull())
self.assertFalse(w.value())

def testClearToDefault(self):
# test clearing to default value
w = qgis.gui.QgsFilterLineEdit()
w.setClearMode(QgsFilterLineEdit.ClearToDefault)

w.setValue('abc')
w.clearValue()
self.assertTrue(w.isNull())
self.assertFalse(w.value())
w.clearValue()
self.assertTrue(w.isNull())
self.assertFalse(w.value())

w.setDefaultValue('def')
w.setValue('abc')
self.assertFalse(w.isNull())
w.clearValue()
self.assertEqual(w.value(), 'def')
self.assertEqual(w.text(), 'def')
self.assertFalse(w.isNull())

@unittest.skipIf(not use_signal_spy, "No QSignalSpy available")
def test_ChangedSignals(self):
""" test that signals are correctly emitted when clearing"""
Expand Down

0 comments on commit d71453d

Please sign in to comment.