QGIS API Documentation  2.15.0-Master (13f053b)
qgstexteditwrapper.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgstexteditwrapper.cpp
3  --------------------------------------
4  Date : 5.1.2014
5  Copyright : (C) 2014 Matthias Kuhn
6  Email : matthias at opengis dot ch
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include "qgstexteditwrapper.h"
17 
18 #include "qgsfield.h"
19 #include "qgsfieldvalidator.h"
20 #include "qgsfilterlineedit.h"
21 
22 #include <QSettings>
23 
25  : QgsEditorWidgetWrapper( vl, fieldIdx, editor, parent )
26  , mTextEdit( nullptr )
27  , mPlainTextEdit( nullptr )
28  , mLineEdit( nullptr )
29 {
30 }
31 
33 {
34  QString v;
35 
36  if ( mTextEdit )
37  {
38  if ( config( "UseHtml" ).toBool() )
39  {
40  v = mTextEdit->toHtml();
41  }
42  else
43  {
44  v = mTextEdit->toPlainText();
45  }
46  }
47 
48  if ( mPlainTextEdit )
49  {
50  v = mPlainTextEdit->toPlainText();
51  }
52 
53  if ( mLineEdit )
54  {
55  v = mLineEdit->text();
56  }
57 
58  if (( v.isEmpty() && ( field().type() == QVariant::Int || field().type() == QVariant::Double || field().type() == QVariant::LongLong || field().type() == QVariant::Date ) ) ||
59  v == QSettings().value( "qgis/nullValue", "NULL" ).toString() )
60  return QVariant( field().type() );
61 
62  if ( !defaultValue().isNull() && v == defaultValue().toString() )
63  {
64  return defaultValue();
65  }
66 
67  QVariant res( v );
68  if ( field().convertCompatible( res ) )
69  return res;
70  else
71  return QVariant( field().type() );
72 }
73 
75 {
76  if ( config( "IsMultiline" ).toBool() )
77  {
78  if ( config( "UseHtml" ).toBool() )
79  {
80  return new QTextEdit( parent );
81  }
82  else
83  {
84  return new QPlainTextEdit( parent );
85  }
86  }
87  else
88  {
89  return new QgsFilterLineEdit( parent );
90  }
91 }
92 
94 {
95  mTextEdit = qobject_cast<QTextEdit*>( editor );
96  mPlainTextEdit = qobject_cast<QPlainTextEdit*>( editor );
97  mLineEdit = qobject_cast<QLineEdit*>( editor );
98 
99  if ( mTextEdit )
100  connect( mTextEdit, SIGNAL( textChanged() ), this, SLOT( valueChanged() ) );
101 
102  if ( mPlainTextEdit )
103  connect( mPlainTextEdit, SIGNAL( textChanged() ), this, SLOT( valueChanged() ) );
104 
105  if ( mLineEdit )
106  {
107  mLineEdit->setValidator( new QgsFieldValidator( mLineEdit, field(), defaultValue().toString() ) );
108 
109  QVariant defVal = defaultValue();
110  if ( defVal.isNull() )
111  {
112  defVal = QSettings().value( "qgis/nullValue", "NULL" );
113  }
114 
115  QgsFilterLineEdit *fle = qobject_cast<QgsFilterLineEdit*>( mLineEdit );
116  if ( field().type() == QVariant::Int || field().type() == QVariant::Double || field().type() == QVariant::LongLong || field().type() == QVariant::Date )
117  {
118  mPlaceholderText = defVal.toString();
119  mLineEdit->setPlaceholderText( mPlaceholderText );
120  }
121  else if ( fle )
122  {
123  fle->setNullValue( defVal.toString() );
124  }
125 
126  connect( mLineEdit, SIGNAL( textChanged( QString ) ), this, SLOT( valueChanged( QString ) ) );
127  connect( mLineEdit, SIGNAL( textChanged( QString ) ), this, SLOT( textChanged( QString ) ) );
128 
129  mWritablePalette = mLineEdit->palette();
130  mReadOnlyPalette = mLineEdit->palette();
131  mReadOnlyPalette.setColor( QPalette::Text, mWritablePalette.color( QPalette::Disabled, QPalette::Text ) );
132  }
133 }
134 
136 {
137  return mLineEdit || mTextEdit || mPlainTextEdit;
138 }
139 
141 {
142  //note - this is deliberately a zero length string, not a null string!
143  if ( mTextEdit )
144  mTextEdit->blockSignals( true );
145  if ( mPlainTextEdit )
146  mPlainTextEdit->blockSignals( true );
147  if ( mLineEdit )
148  {
149  mLineEdit->blockSignals( true );
150  // for interdeminate state we need to clear the placeholder text - we want an empty line edit, not
151  // one showing the default value (eg "NULL")
152  mLineEdit->setPlaceholderText( QString() );
153  }
154 
155  setWidgetValue( QString( "" ) );
156 
157  if ( mTextEdit )
158  mTextEdit->blockSignals( false );
159  if ( mPlainTextEdit )
160  mPlainTextEdit->blockSignals( false );
161  if ( mLineEdit )
162  mLineEdit->blockSignals( false );
163 }
164 
166 {
167  if ( mLineEdit )
168  {
169  //restore placeholder text, which may have been removed by showIndeterminateState()
170  mLineEdit->setPlaceholderText( mPlaceholderText );
171  }
172  setWidgetValue( val );
173 }
174 
175 void QgsTextEditWrapper::setEnabled( bool enabled )
176 {
177  if ( mTextEdit )
178  mTextEdit->setReadOnly( !enabled );
179 
180  if ( mPlainTextEdit )
181  mPlainTextEdit->setReadOnly( !enabled );
182 
183  if ( mLineEdit )
184  {
185  mLineEdit->setReadOnly( !enabled );
186  if ( enabled )
187  mLineEdit->setPalette( mWritablePalette );
188  else
189  mLineEdit->setPalette( mReadOnlyPalette );
190  }
191 }
192 
193 void QgsTextEditWrapper::textChanged( const QString& )
194 {
195  if ( mLineEdit )
196  {
197  //restore placeholder text, which may have been removed by showIndeterminateState()
198  mLineEdit->setPlaceholderText( mPlaceholderText );
199  }
200 }
201 
202 void QgsTextEditWrapper::setWidgetValue( const QVariant& val )
203 {
204  QString v;
205  if ( val.isNull() )
206  {
207  if ( !( field().type() == QVariant::Int || field().type() == QVariant::Double || field().type() == QVariant::LongLong || field().type() == QVariant::Date ) )
208  v = QSettings().value( "qgis/nullValue", "NULL" ).toString();
209  }
210  else
211  v = val.toString();
212 
213  if ( mTextEdit )
214  {
215  if ( val != value() )
216  {
217  if ( config( "UseHtml" ).toBool() )
218  mTextEdit->setHtml( v );
219  else
220  mTextEdit->setPlainText( v );
221  }
222  }
223 
224  if ( mPlainTextEdit )
225  {
226  if ( val != value() )
227  mPlainTextEdit->setPlainText( v );
228  }
229 
230  if ( mLineEdit )
231  mLineEdit->setText( v );
232 }
void setEnabled(bool enabled) override
void setPalette(const QPalette &)
void valueChanged()
Will call the value() method to determine the emitted value.
void setColor(ColorGroup group, ColorRole role, const QColor &color)
Manages an editor widget Widget and wrapper share the same parent.
QString toHtml() const
QgsField field() const
Access the field.
const QColor & color(ColorGroup group, ColorRole role) const
QString toPlainText() const
void showIndeterminateState() override
Sets the widget to display in an indeterminate "mixed value" state.
QVariant value() const override
Will be used to access the widget&#39;s value.
void setReadOnly(bool)
void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
bool isNull() const
bool isEmpty() const
Lineedit with builtin clear button.
void setPlaceholderText(const QString &)
bool blockSignals(bool block)
QgsTextEditWrapper(QgsVectorLayer *vl, int fieldIdx, QWidget *editor=nullptr, QWidget *parent=nullptr)
bool valid() const override
Return true if the widget has been properly initialized.
QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
QVariant defaultValue() const
Access the default value of the field.
QVariant value(const QString &key, const QVariant &defaultValue) const
void setReadOnly(bool ro)
void setValue(const QVariant &value) override
QgsEditorWidgetConfig config() const
Returns the whole config.
void setReadOnly(bool ro)
void setNullValue(const QString &nullValue)
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString toPlainText() const
QObject * parent() const
Represents a vector layer which manages a vector based data sets.
QString toString() const
QVariant::Type type() const
Gets variant type of the field as it will be retrieved from data source.
Definition: qgsfield.cpp:89