QGIS API Documentation 3.34.0-Prizren (ffbdd678812)
Loading...
Searching...
No Matches
qgsdatabaseschemamodel.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsdatabaseschemamodel.cpp
3 --------------------------------------
4 Date : March 2020
5 Copyright : (C) 2020 Nyall Dawson
6 Email : nyall dot dawson at gmail dot com
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***************************************************************************/
16#include "qgsproviderregistry.h"
17#include "qgsprovidermetadata.h"
19
20QgsDatabaseSchemaModel::QgsDatabaseSchemaModel( const QString &provider, const QString &connection, QObject *parent )
21 : QAbstractItemModel( parent )
22{
24 Q_ASSERT( metadata );
25
26 mConnection.reset( dynamic_cast<QgsAbstractDatabaseProviderConnection *>( metadata->createConnection( connection ) ) );
27 Q_ASSERT( mConnection );
28 init();
29}
30
32 : QAbstractItemModel( parent )
33 , mConnection( connection )
34{
35 Q_ASSERT( mConnection );
36 init();
37}
38
39void QgsDatabaseSchemaModel::init()
40{
41 Q_ASSERT( mConnection->capabilities() & QgsAbstractDatabaseProviderConnection::Capability::Schemas );
42 mSchemas = mConnection->schemas();
43}
44
45QModelIndex QgsDatabaseSchemaModel::parent( const QModelIndex &child ) const
46{
47 Q_UNUSED( child )
48 return QModelIndex();
49}
50
51
52int QgsDatabaseSchemaModel::rowCount( const QModelIndex &parent ) const
53{
54 if ( parent.isValid() )
55 return 0;
56
57 return mSchemas.count() + ( mAllowEmpty ? 1 : 0 );
58}
59
60int QgsDatabaseSchemaModel::columnCount( const QModelIndex &parent ) const
61{
62 Q_UNUSED( parent )
63 return 1;
64}
65
66
67QVariant QgsDatabaseSchemaModel::data( const QModelIndex &index, int role ) const
68{
69 if ( !index.isValid() )
70 return QVariant();
71
72 if ( index.row() == 0 && mAllowEmpty )
73 {
74 if ( role == RoleEmpty )
75 return true;
76
77 return QVariant();
78 }
79
80 const QString schemaName = mSchemas.value( index.row() - ( mAllowEmpty ? 1 : 0 ) );
81 switch ( role )
82 {
83 case RoleEmpty:
84 return false;
85
86 case Qt::DisplayRole:
87 case Qt::EditRole:
88 case Qt::ToolTipRole:
89 {
90 return schemaName;
91 }
92 }
93
94 return QVariant();
95}
96
97QModelIndex QgsDatabaseSchemaModel::index( int row, int column, const QModelIndex &parent ) const
98{
99 if ( hasIndex( row, column, parent ) )
100 {
101 return createIndex( row, column, row );
102 }
103
104 return QModelIndex();
105}
106
108{
109 if ( allowEmpty == mAllowEmpty )
110 return;
111
112 if ( allowEmpty )
113 {
114 beginInsertRows( QModelIndex(), 0, 0 );
115 mAllowEmpty = true;
116 endInsertRows();
117 }
118 else
119 {
120 beginRemoveRows( QModelIndex(), 0, 0 );
121 mAllowEmpty = false;
122 endRemoveRows();
123 }
124}
125
127{
128 const QStringList newSchemas = mConnection->schemas();
129 const QStringList oldSchemas = mSchemas;
130
131 for ( const QString &oldSchema : oldSchemas )
132 {
133 if ( !newSchemas.contains( oldSchema ) )
134 {
135 const int r = mSchemas.indexOf( oldSchema ) ;
136 beginRemoveRows( QModelIndex(), r + ( mAllowEmpty ? 1 : 0 ), r + ( mAllowEmpty ? 1 : 0 ) );
137 mSchemas.removeAt( r );
138 endRemoveRows();
139 }
140 }
141
142 for ( const QString &newSchema : newSchemas )
143 {
144 if ( !mSchemas.contains( newSchema ) )
145 {
146 beginInsertRows( QModelIndex(), mSchemas.count() + ( mAllowEmpty ? 1 : 0 ), mSchemas.count() + ( mAllowEmpty ? 1 : 0 ) );
147 mSchemas.append( newSchema );
148 endInsertRows();
149 }
150 }
151}
The QgsAbstractDatabaseProviderConnection class provides common functionality for DB based connection...
@ Schemas
Can list schemas (if not set, the connection does not support schemas)
void setAllowEmptySchema(bool allowEmpty)
Sets whether an optional empty schema ("not set") option is present in the model.
QModelIndex parent(const QModelIndex &child) const override
@ RoleEmpty
Entry is an empty entry.
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QgsDatabaseSchemaModel(const QString &provider, const QString &connection, QObject *parent=nullptr)
Constructor for QgsDatabaseSchemaModel, for the specified provider and connection name.
void refresh()
Refreshes the schema list by querying the underlying connection.
int columnCount(const QModelIndex &parent=QModelIndex()) const override
QModelIndex index(int row, int column, const QModelIndex &parent) const override
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Holds data provider key, description, and associated shared library file or function pointer informat...
virtual QgsAbstractProviderConnection * createConnection(const QString &uri, const QVariantMap &configuration)
Creates a new connection from uri and configuration, the newly created connection is not automaticall...
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.