Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsdatabasetablemodel.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 : : ***************************************************************************/ 15 : : #include "qgsdatabasetablemodel.h" 16 : : #include "qgsproviderregistry.h" 17 : : #include "qgsprovidermetadata.h" 18 : : #include "qgsabstractdatabaseproviderconnection.h" 19 : : #include "qgsdataitem.h" 20 : : 21 : 0 : QgsDatabaseTableModel::QgsDatabaseTableModel( const QString &provider, const QString &connection, const QString &schema, QObject *parent ) 22 : 0 : : QAbstractItemModel( parent ) 23 : 0 : , mSchema( schema ) 24 : 0 : { 25 : 0 : QgsProviderMetadata *metadata = QgsProviderRegistry::instance()->providerMetadata( provider ); 26 : : Q_ASSERT( metadata ); 27 : : 28 : 0 : mConnection.reset( dynamic_cast<QgsAbstractDatabaseProviderConnection *>( metadata->createConnection( connection ) ) ); 29 : : Q_ASSERT( mConnection ); 30 : 0 : init(); 31 : 0 : } 32 : : 33 : 0 : QgsDatabaseTableModel::QgsDatabaseTableModel( QgsAbstractDatabaseProviderConnection *connection, const QString &schema, QObject *parent ) 34 : 0 : : QAbstractItemModel( parent ) 35 : 0 : , mConnection( connection ) 36 : 0 : , mSchema( schema ) 37 : 0 : { 38 : : Q_ASSERT( mConnection ); 39 : 0 : init(); 40 : 0 : } 41 : : 42 : 0 : void QgsDatabaseTableModel::init() 43 : : { 44 : : Q_ASSERT( mConnection->capabilities() & QgsAbstractDatabaseProviderConnection::Capability::Tables ); 45 : 0 : mTables = mConnection->tables( mSchema ); 46 : 0 : } 47 : : 48 : 0 : QModelIndex QgsDatabaseTableModel::parent( const QModelIndex &child ) const 49 : : { 50 : 0 : Q_UNUSED( child ) 51 : 0 : return QModelIndex(); 52 : : } 53 : : 54 : : 55 : 0 : int QgsDatabaseTableModel::rowCount( const QModelIndex &parent ) const 56 : : { 57 : 0 : if ( parent.isValid() ) 58 : 0 : return 0; 59 : : 60 : 0 : return mTables.count() + ( mAllowEmpty ? 1 : 0 ); 61 : 0 : } 62 : : 63 : 0 : int QgsDatabaseTableModel::columnCount( const QModelIndex &parent ) const 64 : : { 65 : 0 : Q_UNUSED( parent ) 66 : 0 : return 1; 67 : : } 68 : : 69 : : 70 : 0 : QVariant QgsDatabaseTableModel::data( const QModelIndex &index, int role ) const 71 : : { 72 : 0 : if ( !index.isValid() ) 73 : 0 : return QVariant(); 74 : : 75 : 0 : if ( index.row() == 0 && mAllowEmpty ) 76 : : { 77 : 0 : if ( role == RoleEmpty ) 78 : 0 : return true; 79 : : 80 : 0 : return QVariant(); 81 : : } 82 : : 83 : 0 : if ( index.row() - ( mAllowEmpty ? 1 : 0 ) >= mTables.count() ) 84 : 0 : return QVariant(); 85 : : 86 : 0 : const QgsAbstractDatabaseProviderConnection::TableProperty &table = mTables[ index.row() - ( mAllowEmpty ? 1 : 0 ) ]; 87 : 0 : switch ( role ) 88 : : { 89 : : case RoleEmpty: 90 : 0 : return false; 91 : : 92 : : case Qt::DisplayRole: 93 : : case Qt::ToolTipRole: 94 : : case Qt::EditRole: 95 : : { 96 : 0 : return mSchema.isEmpty() && !table.schema().isEmpty() ? QStringLiteral( "%1.%2" ).arg( table.schema(), table.tableName() ) : table.tableName(); 97 : : } 98 : : 99 : : case RoleTableName: 100 : : { 101 : 0 : return table.tableName(); 102 : : } 103 : : 104 : : case Qt::DecorationRole: 105 : : case RoleWkbType: 106 : : case RoleCrs: 107 : : { 108 : 0 : if ( table.geometryColumnTypes().empty() ) 109 : : { 110 : 0 : if ( role == Qt::DecorationRole ) 111 : 0 : return QgsLayerItem::iconTable(); 112 : : else 113 : 0 : return QVariant(); 114 : : } 115 : : 116 : 0 : if ( role == Qt::DecorationRole ) 117 : : { 118 : 0 : const QgsWkbTypes::GeometryType geomType = QgsWkbTypes::geometryType( table.geometryColumnTypes().at( 0 ).wkbType ); 119 : 0 : switch ( geomType ) 120 : : { 121 : : case QgsWkbTypes::PointGeometry: 122 : : { 123 : 0 : return QgsLayerItem::iconPoint(); 124 : : } 125 : : case QgsWkbTypes::PolygonGeometry: 126 : : { 127 : 0 : return QgsLayerItem::iconPolygon(); 128 : : } 129 : : case QgsWkbTypes::LineGeometry: 130 : : { 131 : 0 : return QgsLayerItem::iconLine(); 132 : : } 133 : : default: 134 : 0 : break; 135 : : } 136 : : 137 : 0 : return QgsLayerItem::iconTable(); 138 : : } 139 : 0 : else if ( role == RoleWkbType ) 140 : 0 : return table.geometryColumnTypes().at( 0 ).wkbType; 141 : 0 : else if ( role == RoleCrs ) 142 : 0 : return table.geometryColumnTypes().at( 0 ).crs; 143 : : 144 : 0 : return QVariant(); 145 : : } 146 : : 147 : : case RoleSchema: 148 : 0 : return table.schema(); 149 : : 150 : : case RoleTableFlags: 151 : 0 : return static_cast< int >( table.flags() ); 152 : : 153 : : case RoleComment: 154 : 0 : return table.comment(); 155 : : 156 : : case RoleCustomInfo: 157 : 0 : return table.info(); 158 : : 159 : : } 160 : : 161 : 0 : return QVariant(); 162 : 0 : } 163 : : 164 : 0 : QModelIndex QgsDatabaseTableModel::index( int row, int column, const QModelIndex &parent ) const 165 : : { 166 : 0 : if ( hasIndex( row, column, parent ) ) 167 : : { 168 : 0 : return createIndex( row, column, row ); 169 : : } 170 : : 171 : 0 : return QModelIndex(); 172 : 0 : } 173 : : 174 : 0 : void QgsDatabaseTableModel::setAllowEmptyTable( bool allowEmpty ) 175 : : { 176 : 0 : if ( allowEmpty == mAllowEmpty ) 177 : 0 : return; 178 : : 179 : 0 : if ( allowEmpty ) 180 : : { 181 : 0 : beginInsertRows( QModelIndex(), 0, 0 ); 182 : 0 : mAllowEmpty = true; 183 : 0 : endInsertRows(); 184 : 0 : } 185 : : else 186 : : { 187 : 0 : beginRemoveRows( QModelIndex(), 0, 0 ); 188 : 0 : mAllowEmpty = false; 189 : 0 : endRemoveRows(); 190 : : } 191 : 0 : } 192 : : 193 : 0 : void QgsDatabaseTableModel::refresh() 194 : : { 195 : 0 : const QList< QgsAbstractDatabaseProviderConnection::TableProperty > newTables = mConnection->tables( mSchema ); 196 : 0 : const QList< QgsAbstractDatabaseProviderConnection::TableProperty > oldTables = mTables; 197 : : 198 : 0 : for ( const QgsAbstractDatabaseProviderConnection::TableProperty &oldTable : oldTables ) 199 : : { 200 : 0 : if ( !newTables.contains( oldTable ) ) 201 : : { 202 : 0 : int r = mTables.indexOf( oldTable ); 203 : 0 : beginRemoveRows( QModelIndex(), r + ( mAllowEmpty ? 1 : 0 ), r + ( mAllowEmpty ? 1 : 0 ) ); 204 : 0 : mTables.removeAt( r ); 205 : 0 : endRemoveRows(); 206 : 0 : } 207 : : } 208 : : 209 : 0 : for ( const QgsAbstractDatabaseProviderConnection::TableProperty &newTable : newTables ) 210 : : { 211 : 0 : if ( !mTables.contains( newTable ) ) 212 : : { 213 : 0 : beginInsertRows( QModelIndex(), mTables.count() + ( mAllowEmpty ? 1 : 0 ), mTables.count() + ( mAllowEmpty ? 1 : 0 ) ); 214 : 0 : mTables.append( newTable ); 215 : 0 : endInsertRows(); 216 : 0 : } 217 : : } 218 : 0 : }