26#include "moc_qgsfields.cpp"
28using namespace Qt::StringLiterals;
38 d =
new QgsFieldsPrivate();
53 d =
new QgsFieldsPrivate();
66 d->nameToIndex.clear();
77 if ( d->nameToIndex.contains(
field.name() ) )
81 originIndex = d->fields.count();
82 d->fields.append(
Field(
field, origin, originIndex ) );
84 d->nameToIndex.insert(
field.name(), d->fields.count() - 1 );
92 if ( d->nameToIndex.contains(
field.name() ) )
107 if ( d->nameToIndex.contains(
field.name() ) )
111 for (
int i = 0; i < fields.
size(); ++i )
120 if ( !
exists( fieldIdx ) )
123 if ( name.isEmpty() )
126 if ( d->nameToIndex.contains( name ) )
129 const QString oldName = d->fields[fieldIdx].field.name();
130 d->fields[fieldIdx].field.setName( name );
131 d->nameToIndex.remove( oldName );
132 d->nameToIndex.insert( name, fieldIdx );
138 if ( d->nameToIndex.contains(
field.name() ) )
143 d->nameToIndex.insert(
field.name(), d->fields.count() - 1 );
149 if ( !
exists( fieldIdx ) )
152 d->fields.remove( fieldIdx );
153 d->nameToIndex.clear();
154 for (
int idx = 0; idx <
count(); ++idx )
156 d->nameToIndex.insert( d->fields.at( idx ).field.name(), idx );
162 for (
int i = 0; i < other.
count(); ++i )
176 return d->fields.isEmpty();
181 return d->fields.count();
186 return d->fields.count();
192 for (
int i = 0; i < d->fields.count(); ++i )
194 lst.append( d->fields[i].field.name() );
201 return i >= 0 && i < d->fields.count();
206 return d->fields[i].field;
211 return d->fields[i].field;
216 return d->fields[fieldIdx].field;
232 return d->fields[i].field;
237 if ( !
exists( fieldIdx ) )
240 return d->fields[fieldIdx].origin;
245 return d->fields[fieldIdx].originIndex;
250 return d->nameToIndex.value( fieldName, -1 );
255 return d->nameToIndex.value( fieldName, -1 );
261 for (
int i = 0; i < d->fields.count(); ++i )
262 lst.append( d->fields[i].field );
268 return d->fields == other.d->fields;
273 if ( d->fields.isEmpty() )
274 return const_iterator();
276 return const_iterator( &d->fields.first() );
281 if ( d->fields.isEmpty() )
282 return const_iterator();
284 return const_iterator( &d->fields.last() + 1 );
289 if ( d->fields.isEmpty() )
290 return const_iterator();
292 return const_iterator( &d->fields.first() );
297 if ( d->fields.isEmpty() )
298 return const_iterator();
300 return const_iterator( &d->fields.last() + 1 );
305 if ( d->fields.isEmpty() )
309 return iterator( &d->fields.first() );
314 if ( d->fields.isEmpty() )
318 return iterator( &d->fields.last() + 1 );
323 if ( considerOrigin )
334 return iconForFieldType( d->fields.at( fieldIdx ).field.type(), d->fields.at( fieldIdx ).field.subType(), d->fields.at( fieldIdx ).field.typeName() );
337 return iconForFieldType( d->fields.at( fieldIdx ).field.type(), d->fields.at( fieldIdx ).field.subType(), d->fields.at( fieldIdx ).field.typeName() );
344 case QMetaType::Type::Bool:
346 case QMetaType::Type::Int:
347 case QMetaType::Type::UInt:
348 case QMetaType::Type::LongLong:
349 case QMetaType::Type::ULongLong:
351 case QMetaType::Type::Double:
353 case QMetaType::Type::QString:
355 case QMetaType::Type::QDate:
357 case QMetaType::Type::QDateTime:
359 case QMetaType::Type::QTime:
361 case QMetaType::Type::QByteArray:
363 case QMetaType::Type::QVariantList:
367 case QMetaType::Type::Int:
368 case QMetaType::Type::UInt:
369 case QMetaType::Type::LongLong:
370 case QMetaType::Type::ULongLong:
372 case QMetaType::Type::Double:
374 case QMetaType::Type::QString:
380 case QMetaType::Type::QStringList:
382 case QMetaType::Type::QVariantMap:
384 case QMetaType::Type::User:
385 if ( typeString.compare(
"geometry"_L1 ) == 0 )
412 for (
int idx = 0; idx <
count(); ++idx )
414 if ( d->fields[idx].field.name() == fieldName )
418 if ( fieldName.isEmpty() )
421 for (
int idx = 0; idx <
count(); ++idx )
423 if ( QString::compare( d->fields[idx].field.name(), fieldName, Qt::CaseInsensitive ) == 0 )
427 for (
int idx = 0; idx <
count(); ++idx )
429 const QString alias = d->fields[idx].field.alias();
430 if ( !alias.isEmpty() && QString::compare( alias, fieldName, Qt::CaseInsensitive ) == 0 )
439 const int count = d->fields.count();
441 lst.reserve(
count );
442 for (
int i = 0; i <
count; ++i )
455 out << static_cast< quint32 >( fields.
size() );
456 for (
int i = 0; i < fields.
size(); i++ )
458 out << fields.
field( i );
468 for ( quint32 i = 0; i < size; i++ )
@ Provider
Field originates from the underlying data provider of the vector layer.
@ Unknown
The field origin has not been specified.
@ Expression
Field is calculated from an expression.
@ Join
Field originates from a joined layer.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
void extend(const QgsFields &other)
Extends with fields from another QgsFields container.
const_iterator constEnd() const noexcept
Returns a const STL-style iterator pointing to the imaginary item after the last item in the list.
struct QgsFields::Field Field
QList< QgsField > toList() const
Utility function to return a list of QgsField instances.
QgsAttributeList allAttributesList() const
Utility function to get list of attribute indexes.
bool operator==(const QgsFields &other) const
bool appendExpressionField(const QgsField &field, int originIndex)
Appends an expression field. The field must have unique name, otherwise it is rejected (returns false...
Q_INVOKABLE int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
Q_INVOKABLE int indexOf(const QString &fieldName) const
Gets the field index from the field name.
void remove(int fieldIdx)
Removes the field with the given index.
const_iterator begin() const noexcept
Returns a const STL-style iterator pointing to the first item in the list.
static QIcon iconForFieldType(QMetaType::Type type, QMetaType::Type subType=QMetaType::Type::UnknownType, const QString &typeString=QString())
Returns an icon corresponding to a field type.
QgsField field(int fieldIdx) const
Returns the field at particular index (must be in range 0..N-1).
QgsFields & operator=(const QgsFields &other)
QgsField operator[](int i) const
Gets field at particular index (must be in range 0..N-1).
QgsFields()
Constructor for an empty field container.
Qgis::FieldOrigin fieldOrigin(int fieldIdx) const
Returns the field's origin (value from an enumeration).
Q_INVOKABLE bool exists(int i) const
Returns if a field index is valid.
int size() const
Returns number of items.
void clear()
Removes all fields.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
int fieldOriginIndex(int fieldIdx) const
Returns the field's origin index (its meaning is specific to each type of origin).
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
QIcon iconForField(int fieldIdx, bool considerOrigin=false) const
Returns an icon corresponding to a field index, based on the field's type and source.
const_iterator end() const noexcept
Returns a const STL-style iterator pointing to the imaginary item after the last item in the list.
bool rename(int fieldIdx, const QString &name)
Renames a name of field.
const_iterator constBegin() const noexcept
Returns a const STL-style iterator pointing to the first item in the list.
static QMetaType::Type variantTypeToMetaType(QVariant::Type variantType)
Converts a QVariant::Type to a QMetaType::Type.
QList< int > QgsAttributeList
QDataStream & operator>>(QDataStream &in, QgsFields &fields)
Reads fields from stream in into fields. QGIS version compatibility is not guaranteed.
QDataStream & operator<<(QDataStream &out, const QgsFields &fields)
Writes the fields to stream out. QGIS version compatibility is not guaranteed.