27 #include <nlohmann/json.hpp>
41 if (
config( QStringLiteral(
"UseHtml" ) ).toBool() )
43 v = mTextEdit->toHtml();
47 v = mTextEdit->toPlainText();
53 v = mPlainTextEdit->toPlainText();
58 v = mLineEdit->text();
61 if ( ( v.isEmpty() && (
field().type() == QVariant::Int
62 ||
field().type() == QVariant::Double
63 ||
field().type() == QVariant::LongLong
64 ||
field().type() == QVariant::Date ) )
67 return QVariant(
field().type() );
77 if (
field().type() != QVariant::Map &&
field().convertCompatible( res ) )
81 else if (
field().type() == QVariant::String &&
field().length() > 0 )
85 return QVariant( v.left(
field().length() ) );
87 else if (
field().type() == QVariant::Map )
96 if ( json::accept( v.toUtf8() ) )
105 if ( v.length() > 0 )
111 mInvalidJSON =
false;
118 return QVariant(
field().type() );
124 mForm = qobject_cast<QgsAttributeForm *>( parent );
125 if (
config( QStringLiteral(
"IsMultiline" ) ).toBool() )
127 if (
config( QStringLiteral(
"UseHtml" ) ).toBool() )
129 return new QTextBrowser( parent );
133 return new QPlainTextEdit( parent );
144 mInvalidJSON =
false;
145 mTextBrowser = qobject_cast<QTextBrowser *>( editor );
146 mTextEdit = qobject_cast<QTextEdit *>( editor );
147 mPlainTextEdit = qobject_cast<QPlainTextEdit *>( editor );
148 mLineEdit = qobject_cast<QLineEdit *>( editor );
153 if ( mPlainTextEdit )
161 if ( defVal.isNull() )
167 if (
field().type() == QVariant::Int ||
field().type() == QVariant::Double ||
field().type() == QVariant::LongLong ||
field().type() == QVariant::Date )
169 mPlaceholderText = defVal.toString();
170 mLineEdit->setPlaceholderText( mPlaceholderText );
177 connect( mLineEdit, &QLineEdit::textChanged,
this, [ = ](
const QString &
value )
184 connect( mLineEdit, &QLineEdit::textChanged,
this, &QgsTextEditWrapper::textChanged );
186 mWritablePalette = mLineEdit->palette();
187 mReadOnlyPalette = mLineEdit->palette();
193 return mLineEdit || mTextEdit || mPlainTextEdit;
199 mTextEdit->blockSignals(
true );
200 if ( mPlainTextEdit )
201 mPlainTextEdit->blockSignals(
true );
204 mLineEdit->blockSignals(
true );
207 mLineEdit->setPlaceholderText( QString() );
211 setWidgetValue( QStringLiteral(
"" ) );
214 mTextEdit->blockSignals(
false );
215 if ( mPlainTextEdit )
216 mPlainTextEdit->blockSignals(
false );
218 mLineEdit->blockSignals(
false );
225 mForm->
displayWarning( tr(
"Your JSON was invalid and has been reverted back to the last valid edit or the original data" ) );
227 mInvalidJSON =
false;
233 void QgsTextEditWrapper::updateValues(
const QVariant &val,
const QVariantList & )
238 mLineEdit->setPlaceholderText( mPlaceholderText );
240 setWidgetValue( val );
246 mTextEdit->setReadOnly( !enabled );
248 if ( mPlainTextEdit )
249 mPlainTextEdit->setReadOnly( !enabled );
253 mLineEdit->setReadOnly( !enabled );
255 mLineEdit->setPalette( mWritablePalette );
258 mLineEdit->setPalette( mReadOnlyPalette );
261 mLineEdit->setStyleSheet( QStringLiteral(
"QLineEdit { background-color: rgba(255, 255, 255, 75%); }" ) );
263 mLineEdit->setFrame( enabled );
272 void QgsTextEditWrapper::textChanged(
const QString & )
277 mLineEdit->setPlaceholderText( mPlaceholderText );
281 void QgsTextEditWrapper::setWidgetValue(
const QVariant &val )
286 if ( !(
field().type() == QVariant::Int ||
field().type() == QVariant::Double ||
field().type() == QVariant::LongLong ||
field().type() == QVariant::Date ) )
289 else if (
field().type() == QVariant::Map )
293 if (
field().displayString( val ).isEmpty() )
295 if ( val.type() == QVariant::String && val.toString() != QLatin1String(
"\"\"" ) )
297 v = val.toString().append(
"\"" ).insert( 0,
"\"" );
309 else if ( val.type() == QVariant::Double && std::isnan( val.toDouble() ) )
324 bool canConvertToDouble;
325 QLocale().toDouble( v, &canConvertToDouble );
326 if ( canConvertToDouble &&
layer() &&
layer()->isEditable() && ! QLocale().groupSeparator().isNull() &&
field().isNumeric() )
328 v = v.remove( QLocale().groupSeparator() );
331 const QVariant currentValue =
value( );
334 const bool changed { val != currentValue || val.isNull() != currentValue.isNull() };
340 if (
config( QStringLiteral(
"UseHtml" ) ).toBool() )
342 mTextEdit->setHtml( v );
345 mTextBrowser->setTextInteractionFlags( Qt::LinksAccessibleByMouse );
346 mTextBrowser->setOpenExternalLinks(
true );
351 mTextEdit->setPlainText( v );
354 else if ( mPlainTextEdit )
356 mPlainTextEdit->setPlainText( v );
358 else if ( mLineEdit )
360 mLineEdit->setText( v );
367 if ( hintText.isNull() )
368 mPlaceholderText = mPlaceholderTextBackup;
371 mPlaceholderTextBackup = mPlaceholderText;
372 mPlaceholderText = hintText;
376 mLineEdit->setPlaceholderText( mPlaceholderText );
static QString nullRepresentation()
This string is used to represent the value NULL throughout QGIS.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
QString displayString(const QVariant &v) const
Formats string for display.
QLineEdit subclass with built in support for clearing the widget's value and handling custom null val...
void setNullValue(const QString &nullValue)
Sets the string representation for null values in the widget.
static QVariant parseJson(const std::string &jsonString)
Converts JSON jsonString to a QVariant, in case of parsing error an invalid QVariant is returned.
void initWidget(QWidget *editor) override
This method should initialize the editor widget with runtime data.
QWidget * createWidget(QWidget *parent) override
This method should create a new widget with the provided parent.
void showIndeterminateState() override
Sets the widget to display in an indeterminate "mixed value" state.
void setHint(const QString &hintText) override
Add a hint text on the widget.
QgsTextEditWrapper(QgsVectorLayer *layer, int fieldIdx, QWidget *editor=nullptr, QWidget *parent=nullptr)
Constructor for QgsTextEditWrapper.
void setFeature(const QgsFeature &feature) override
bool isInvalidJSON()
Returns whether the text edit widget contains Invalid JSON.
void setEnabled(bool enabled) override
bool valid() const override
Returns true if the widget has been properly initialized.
QVariant value() const override
Will be used to access the widget's value.
Represents a vector layer which manages a vector based data sets.
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH