Branch data Line data Source code
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 : : ***************************************************************************/ 15 : : #include "qgsdatabaseschemamodel.h" 16 : : #include "qgsproviderregistry.h" 17 : : #include "qgsprovidermetadata.h" 18 : : #include "qgsabstractdatabaseproviderconnection.h" 19 : : 20 : 0 : QgsDatabaseSchemaModel::QgsDatabaseSchemaModel( const QString &provider, const QString &connection, QObject *parent ) 21 : 0 : : QAbstractItemModel( parent ) 22 : 0 : { 23 : 0 : QgsProviderMetadata *metadata = QgsProviderRegistry::instance()->providerMetadata( provider ); 24 : : Q_ASSERT( metadata ); 25 : : 26 : 0 : mConnection.reset( dynamic_cast<QgsAbstractDatabaseProviderConnection *>( metadata->createConnection( connection ) ) ); 27 : : Q_ASSERT( mConnection ); 28 : 0 : init(); 29 : 0 : } 30 : : 31 : 0 : QgsDatabaseSchemaModel::QgsDatabaseSchemaModel( QgsAbstractDatabaseProviderConnection *connection, QObject *parent ) 32 : 0 : : QAbstractItemModel( parent ) 33 : 0 : , mConnection( connection ) 34 : 0 : { 35 : : Q_ASSERT( mConnection ); 36 : 0 : init(); 37 : 0 : } 38 : : 39 : 0 : void QgsDatabaseSchemaModel::init() 40 : : { 41 : : Q_ASSERT( mConnection->capabilities() & QgsAbstractDatabaseProviderConnection::Capability::Schemas ); 42 : 0 : mSchemas = mConnection->schemas(); 43 : 0 : } 44 : : 45 : 0 : QModelIndex QgsDatabaseSchemaModel::parent( const QModelIndex &child ) const 46 : : { 47 : 0 : Q_UNUSED( child ) 48 : 0 : return QModelIndex(); 49 : : } 50 : : 51 : : 52 : 0 : int QgsDatabaseSchemaModel::rowCount( const QModelIndex &parent ) const 53 : : { 54 : 0 : if ( parent.isValid() ) 55 : 0 : return 0; 56 : : 57 : 0 : return mSchemas.count() + ( mAllowEmpty ? 1 : 0 ); 58 : 0 : } 59 : : 60 : 0 : int QgsDatabaseSchemaModel::columnCount( const QModelIndex &parent ) const 61 : : { 62 : 0 : Q_UNUSED( parent ) 63 : 0 : return 1; 64 : : } 65 : : 66 : : 67 : 0 : QVariant QgsDatabaseSchemaModel::data( const QModelIndex &index, int role ) const 68 : : { 69 : 0 : if ( !index.isValid() ) 70 : 0 : return QVariant(); 71 : : 72 : 0 : if ( index.row() == 0 && mAllowEmpty ) 73 : : { 74 : 0 : if ( role == RoleEmpty ) 75 : 0 : return true; 76 : : 77 : 0 : return QVariant(); 78 : : } 79 : : 80 : 0 : const QString schemaName = mSchemas.value( index.row() - ( mAllowEmpty ? 1 : 0 ) ); 81 : 0 : switch ( role ) 82 : : { 83 : : case RoleEmpty: 84 : 0 : return false; 85 : : 86 : : case Qt::DisplayRole: 87 : : case Qt::EditRole: 88 : : case Qt::ToolTipRole: 89 : : { 90 : 0 : return schemaName; 91 : : } 92 : : } 93 : : 94 : 0 : return QVariant(); 95 : 0 : } 96 : : 97 : 0 : QModelIndex QgsDatabaseSchemaModel::index( int row, int column, const QModelIndex &parent ) const 98 : : { 99 : 0 : if ( hasIndex( row, column, parent ) ) 100 : : { 101 : 0 : return createIndex( row, column, row ); 102 : : } 103 : : 104 : 0 : return QModelIndex(); 105 : 0 : } 106 : : 107 : 0 : void QgsDatabaseSchemaModel::setAllowEmptySchema( bool allowEmpty ) 108 : : { 109 : 0 : if ( allowEmpty == mAllowEmpty ) 110 : 0 : return; 111 : : 112 : 0 : if ( allowEmpty ) 113 : : { 114 : 0 : beginInsertRows( QModelIndex(), 0, 0 ); 115 : 0 : mAllowEmpty = true; 116 : 0 : endInsertRows(); 117 : 0 : } 118 : : else 119 : : { 120 : 0 : beginRemoveRows( QModelIndex(), 0, 0 ); 121 : 0 : mAllowEmpty = false; 122 : 0 : endRemoveRows(); 123 : : } 124 : 0 : } 125 : : 126 : 0 : void QgsDatabaseSchemaModel::refresh() 127 : : { 128 : 0 : const QStringList newSchemas = mConnection->schemas(); 129 : 0 : const QStringList oldSchemas = mSchemas; 130 : : 131 : 0 : for ( const QString &oldSchema : oldSchemas ) 132 : : { 133 : 0 : if ( !newSchemas.contains( oldSchema ) ) 134 : : { 135 : 0 : int r = mSchemas.indexOf( oldSchema ) ; 136 : 0 : beginRemoveRows( QModelIndex(), r + ( mAllowEmpty ? 1 : 0 ), r + ( mAllowEmpty ? 1 : 0 ) ); 137 : 0 : mSchemas.removeAt( r ); 138 : 0 : endRemoveRows(); 139 : 0 : } 140 : : } 141 : : 142 : 0 : for ( const QString &newSchema : newSchemas ) 143 : : { 144 : 0 : if ( !mSchemas.contains( newSchema ) ) 145 : : { 146 : 0 : beginInsertRows( QModelIndex(), mSchemas.count() + ( mAllowEmpty ? 1 : 0 ), mSchemas.count() + ( mAllowEmpty ? 1 : 0 ) ); 147 : 0 : mSchemas.append( newSchema ); 148 : 0 : endInsertRows(); 149 : 0 : } 150 : : } 151 : 0 : }