QGIS API Documentation  3.20.0-Odense (decaadbb31)
qgsfieldsitem.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsfieldsitem.cpp
3  -------------------
4  begin : 2011-04-01
5  copyright : (C) 2011 Radim Blazek
6  email : radim dot blazek at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "qgsfieldsitem.h"
19 #include "qgsiconutils.h"
20 #include "qgsproviderregistry.h"
21 #include "qgsprovidermetadata.h"
22 #include "qgslogger.h"
23 #include "qgsapplication.h"
24 #include "qgsvectorlayer.h"
25 
27  const QString &path,
28  const QString &connectionUri,
29  const QString &providerKey,
30  const QString &schema,
31  const QString &tableName )
32  : QgsDataItem( Qgis::BrowserItemType::Fields, parent, tr( "Fields" ), path, providerKey )
33  , mSchema( schema )
34  , mTableName( tableName )
35  , mConnectionUri( connectionUri )
36 {
39  if ( md )
40  {
41  try
42  {
43  std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn { static_cast<QgsAbstractDatabaseProviderConnection *>( md->createConnection( mConnectionUri, {} ) ) };
44  mTableProperty = std::make_unique<QgsAbstractDatabaseProviderConnection::TableProperty>( conn->table( schema, tableName ) );
45  }
46  catch ( QgsProviderConnectionException &ex )
47  {
48  QgsDebugMsg( QStringLiteral( "Error creating fields item: %1" ).arg( ex.what() ) );
49  }
50  }
51 }
52 
54 {
55 
56 }
57 
58 QVector<QgsDataItem *> QgsFieldsItem::createChildren()
59 {
60  QVector<QgsDataItem *> children;
61  try
62  {
64  if ( md )
65  {
66  std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn { static_cast<QgsAbstractDatabaseProviderConnection *>( md->createConnection( mConnectionUri, {} ) ) };
67  if ( conn )
68  {
69  int i = 0;
70  const QgsFields constFields { conn->fields( mSchema, mTableName ) };
71  for ( const auto &f : constFields )
72  {
73  QgsFieldItem *fieldItem { new QgsFieldItem( this, f ) };
74  fieldItem->setSortKey( i++ );
75  children.push_back( fieldItem );
76  }
77  }
78  }
79  }
80  catch ( const QgsProviderConnectionException &ex )
81  {
82  children.push_back( new QgsErrorItem( this, ex.what(), path() + QStringLiteral( "/error" ) ) );
83  }
84  return children;
85 }
86 
88 {
89  return QgsApplication::getThemeIcon( QStringLiteral( "mSourceFields.svg" ) );
90 }
91 
93 {
94  return mConnectionUri;
95 }
96 
98 {
99  std::unique_ptr<QgsVectorLayer> vl;
101  if ( md )
102  {
103  try
104  {
105  std::unique_ptr<QgsAbstractDatabaseProviderConnection> conn { static_cast<QgsAbstractDatabaseProviderConnection *>( md->createConnection( mConnectionUri, {} ) ) };
106  if ( conn )
107  {
108  vl.reset( new QgsVectorLayer( conn->tableUri( mSchema, mTableName ), QStringLiteral( "temp_layer" ), providerKey() ) );
109  if ( vl->isValid() )
110  {
111  return vl.release();
112  }
113  }
114  }
115  catch ( const QgsProviderConnectionException & )
116  {
117  // This should never happen!
118  QgsDebugMsg( QStringLiteral( "Error getting connection from %1" ).arg( mConnectionUri ) );
119  }
120  }
121  else
122  {
123  // This should never happen!
124  QgsDebugMsg( QStringLiteral( "Error getting metadata for provider %1" ).arg( providerKey() ) );
125  }
126  return nullptr;
127 }
128 
130 {
131  return mTableProperty.get();
132 }
133 
135 {
136  return mTableName;
137 }
138 
139 QString QgsFieldsItem::schema() const
140 {
141  return mSchema;
142 }
143 
145  : QgsDataItem( Qgis::BrowserItemType::Field, parent, field.name(), parent->path() + '/' + field.name(), parent->providerKey() )
146  , mField( field )
147 {
148  // Precondition
149  Q_ASSERT( static_cast<QgsFieldsItem *>( parent ) );
151 }
152 
154 {
155 }
156 
158 {
159  // Check if this is a geometry column and show the right icon
160  QgsFieldsItem *parentFields { static_cast<QgsFieldsItem *>( parent() ) };
161  if ( parentFields && parentFields->tableProperty() &&
162  parentFields->tableProperty()->geometryColumn() == mName &&
163  parentFields->tableProperty()->geometryColumnTypes().count() )
164  {
165  if ( mField.typeName() == QLatin1String( "raster" ) )
166  {
167  return QgsIconUtils::iconRaster();
168  }
169  const QgsWkbTypes::GeometryType geomType { QgsWkbTypes::geometryType( parentFields->tableProperty()->geometryColumnTypes().first().wkbType ) };
170  switch ( geomType )
171  {
172  case QgsWkbTypes::GeometryType::LineGeometry:
173  return QgsIconUtils::iconLine();
174  case QgsWkbTypes::GeometryType::PointGeometry:
175  return QgsIconUtils::iconPoint();
176  case QgsWkbTypes::GeometryType::PolygonGeometry:
177  return QgsIconUtils::iconPolygon();
178  case QgsWkbTypes::GeometryType::UnknownGeometry:
179  case QgsWkbTypes::GeometryType::NullGeometry:
181  }
182  }
183  const QIcon icon { QgsFields::iconForFieldType( mField.type() ) };
184  // Try subtype if icon is null
185  if ( icon.isNull() )
186  {
187  return QgsFields::iconForFieldType( mField.subType() );
188  }
189  return icon;
190 }
191 
192 
The Qgis class provides global constants for use throughout the application.
Definition: qgis.h:62
@ Populated
Children created.
@ Collapse
The collapse/expand status for this items children should be ignored in order to avoid undesired netw...
@ Fertile
Can create children. Even items without this capability may have children, but cannot create them,...
The QgsAbstractDatabaseProviderConnection class provides common functionality for DB based connection...
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Base class for all items in the model.
Definition: qgsdataitem.h:46
void setSortKey(const QVariant &key)
Sets a custom sorting key for the item.
QString mName
Definition: qgsdataitem.h:441
QVector< QgsDataItem * > children() const
Definition: qgsdataitem.h:329
QgsDataItem * parent() const
Gets item parent.
Definition: qgsdataitem.h:322
Qgis::BrowserItemCapabilities mCapabilities
Definition: qgsdataitem.h:437
QString path() const
Definition: qgsdataitem.h:346
virtual void setState(Qgis::BrowserItemState state)
Set item state.
QString providerKey() const
Returns the provider key that created this item (e.g.
Data item that can be used to report problems (e.g.
Definition: qgsdataitem.h:533
QString what() const
Definition: qgsexception.h:48
A layer field item, information about the connection URI, the schema and the table as well as the lay...
~QgsFieldItem() override
QgsFieldItem(QgsDataItem *parent, const QgsField &field)
Constructor for QgsFieldItem, with the specified parent item and field.
QIcon icon() override
Encapsulate a field in an attribute table or data source.
Definition: qgsfield.h:51
QString typeName() const
Gets the field type.
Definition: qgsfield.cpp:138
QVariant::Type type
Definition: qgsfield.h:58
QVariant::Type subType() const
If the field is a collection, gets its element's type.
Definition: qgsfield.cpp:133
A collection of field items with some internal logic to retrieve the fields and a the vector layer in...
Definition: qgsfieldsitem.h:34
QString tableName() const
Returns the table name.
QgsFieldsItem(QgsDataItem *parent, const QString &path, const QString &connectionUri, const QString &providerKey, const QString &schema, const QString &tableName)
Constructor for QgsFieldsItem, with the specified parent item.
QgsAbstractDatabaseProviderConnection::TableProperty * tableProperty() const
Returns the (possibly NULL) properties of the table this fields belong to.
QString connectionUri() const
Returns the connection URI.
QVector< QgsDataItem * > createChildren() override
Create children.
QgsVectorLayer * layer()
Creates and returns a (possibly NULL) layer from the connection URI and schema/table information.
~QgsFieldsItem() override
QString schema() const
Returns the schema name.
QIcon icon() override
Container of fields for a vector layer.
Definition: qgsfields.h:45
static QIcon iconForFieldType(const QVariant::Type &type)
Returns an icon corresponding to a field type.
Definition: qgsfields.cpp:295
static QIcon iconLine()
Returns an icon representing line geometries.
static QIcon iconPolygon()
Returns an icon representing polygon geometries.
static QIcon iconDefaultLayer()
Returns a default icon for layers, which aren't the standard raster/vector/...
static QIcon iconPoint()
Returns an icon representing point geometries.
static QIcon iconRaster()
Returns an icon representing raster layers.
Custom exception class for provider connection related exceptions.
Definition: qgsexception.h:101
Holds data provider key, description, and associated shared library file or function pointer informat...
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
QgsProviderMetadata * providerMetadata(const QString &providerKey) const
Returns metadata of the provider or nullptr if not found.
Represents a vector layer which manages a vector based data sets.
static GeometryType geometryType(Type type) SIP_HOLDGIL
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
Definition: qgswkbtypes.h:938
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
Definition: qgswkbtypes.h:141
const QgsField & field
Definition: qgsfield.h:463
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
The TableProperty class represents a database table or view.