25#include "moc_qgsfields.cpp"
35 d =
new QgsFieldsPrivate();
51 d =
new QgsFieldsPrivate();
64 d->nameToIndex.clear();
75 if ( d->nameToIndex.contains(
field.name() ) )
79 originIndex = d->fields.count();
80 d->fields.append(
Field(
field, origin, originIndex ) );
82 d->nameToIndex.insert(
field.name(), d->fields.count() - 1 );
90 if ( d->nameToIndex.contains(
field.name() ) )
105 if ( d->nameToIndex.contains(
field.name() ) )
109 for (
int i = 0; i < fields.
size(); ++ i )
118 if ( !
exists( fieldIdx ) )
121 if ( name.isEmpty() )
124 if ( d->nameToIndex.contains( name ) )
127 const QString oldName = d->fields[ fieldIdx ].field.name();
128 d->fields[ fieldIdx ].field.setName( name );
129 d->nameToIndex.remove( oldName );
130 d->nameToIndex.insert( name, fieldIdx );
136 if ( d->nameToIndex.contains(
field.name() ) )
141 d->nameToIndex.insert(
field.name(), d->fields.count() - 1 );
147 if ( !
exists( fieldIdx ) )
150 d->fields.remove( fieldIdx );
151 d->nameToIndex.clear();
152 for (
int idx = 0; idx <
count(); ++idx )
154 d->nameToIndex.insert( d->fields.at( idx ).field.name(), idx );
160 for (
int i = 0; i < other.
count(); ++i )
174 return d->fields.isEmpty();
179 return d->fields.count();
184 return d->fields.count();
190 for (
int i = 0; i < d->fields.count(); ++i )
192 lst.append( d->fields[i].field.name() );
199 return i >= 0 && i < d->fields.count();
204 return d->fields[i].field;
209 return d->fields[i].field;
214 return d->fields[fieldIdx].field;
230 return d->fields[i].field;
235 if ( !
exists( fieldIdx ) )
238 return d->fields[fieldIdx].origin;
243 return d->fields[fieldIdx].originIndex;
248 return d->nameToIndex.value( fieldName, -1 );
253 return d->nameToIndex.value( fieldName, -1 );
259 for (
int i = 0; i < d->fields.count(); ++i )
260 lst.append( d->fields[i].field );
266 return d->fields == other.d->fields;
271 if ( d->fields.isEmpty() )
272 return const_iterator();
274 return const_iterator( &d->fields.first() );
279 if ( d->fields.isEmpty() )
280 return const_iterator();
282 return const_iterator( &d->fields.last() + 1 );
287 if ( d->fields.isEmpty() )
288 return const_iterator();
290 return const_iterator( &d->fields.first() );
295 if ( d->fields.isEmpty() )
296 return const_iterator();
298 return const_iterator( &d->fields.last() + 1 );
303 if ( d->fields.isEmpty() )
307 return iterator( &d->fields.first() );
312 if ( d->fields.isEmpty() )
316 return iterator( &d->fields.last() + 1 );
321 if ( considerOrigin )
332 return iconForFieldType( d->fields.at( fieldIdx ).field.type(), d->fields.at( fieldIdx ).field.subType(), d->fields.at( fieldIdx ).field.typeName() );
335 return iconForFieldType( d->fields.at( fieldIdx ).field.type(), d->fields.at( fieldIdx ).field.subType(), d->fields.at( fieldIdx ).field.typeName() );
342 case QMetaType::Type::Bool:
344 case QMetaType::Type::Int:
345 case QMetaType::Type::UInt:
346 case QMetaType::Type::LongLong:
347 case QMetaType::Type::ULongLong:
349 case QMetaType::Type::Double:
351 case QMetaType::Type::QString:
353 case QMetaType::Type::QDate:
355 case QMetaType::Type::QDateTime:
357 case QMetaType::Type::QTime:
359 case QMetaType::Type::QByteArray:
361 case QMetaType::Type::QVariantList:
365 case QMetaType::Type::Int:
366 case QMetaType::Type::UInt:
367 case QMetaType::Type::LongLong:
368 case QMetaType::Type::ULongLong:
370 case QMetaType::Type::Double:
372 case QMetaType::Type::QString:
378 case QMetaType::Type::QStringList:
380 case QMetaType::Type::QVariantMap:
382 case QMetaType::Type::User:
383 if ( typeString.compare( QLatin1String(
"geometry" ) ) == 0 )
410 for (
int idx = 0; idx <
count(); ++idx )
412 if ( d->fields[idx].field.name() == fieldName )
416 if ( fieldName.isEmpty() )
419 for (
int idx = 0; idx <
count(); ++idx )
421 if ( QString::compare( d->fields[idx].field.name(), fieldName, Qt::CaseInsensitive ) == 0 )
425 for (
int idx = 0; idx <
count(); ++idx )
427 const QString alias = d->fields[idx].field.alias();
428 if ( !alias.isEmpty() && QString::compare( alias, fieldName, Qt::CaseInsensitive ) == 0 )
437 const int count = d->fields.count();
439 lst.reserve(
count );
440 for (
int i = 0; i <
count; ++i )
453 out << static_cast< quint32 >( fields.
size() );
454 for (
int i = 0; i < fields.
size(); i++ )
456 out << fields.
field( i );
466 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.