void QgsPgTableModel::addTableEntry( const QgsPostgresLayerProperty& layerProperty ) { QgsDebugMsg( layerProperty.toString() ); // is there already a root item with the given scheme Name? QStandardItem *schemaItem = 0; for ( int i = 0; i < layerProperty.size(); i++ ) { QGis::WkbType wkbType = layerProperty.types[ i ]; int srid = layerProperty.srids[ i ]; if ( wkbType == QGis::WKBUnknown && layerProperty.geometryColName.isEmpty() ) { wkbType = QGis::WKBNoGeometry; } QString tip; if ( wkbType == QGis::WKBUnknown ) { tip = tr( "Specify a geometry type" ); } else if ( wkbType != QGis::WKBNoGeometry && srid == INT_MIN ) { tip = tr( "Enter a SRID" ); } QStandardItem *schemaNameItem = new QStandardItem( layerProperty.schemaName ); QStandardItem *typeItem = new QStandardItem( iconForWkbType( wkbType ), wkbType == QGis::WKBUnknown ? tr( "Select..." ) : QgsPostgresConn::displayStringForWkbType( wkbType ) ); typeItem->setData( wkbType == QGis::WKBUnknown, Qt::UserRole + 1 ); typeItem->setData( wkbType, Qt::UserRole + 2 ); if ( wkbType == QGis::WKBUnknown ) typeItem->setFlags( typeItem->flags() | Qt::ItemIsEditable ); QStandardItem *geomTypeItem = new QStandardItem( QgsPostgresConn::displayStringForGeomType( layerProperty.geometryColType ) ); QStandardItem *tableItem = new QStandardItem( layerProperty.tableName ); QStandardItem *geomItem = new QStandardItem( layerProperty.geometryColName ); QStandardItem *sridItem = new QStandardItem( wkbType != QGis::WKBNoGeometry ? QString::number( srid ) : "" ); sridItem->setEditable( wkbType != QGis::WKBNoGeometry && srid == INT_MIN ); if ( sridItem->isEditable() ) { sridItem->setText( tr( "Enter..." ) ); sridItem->setFlags( sridItem->flags() | Qt::ItemIsEditable ); } QString pkCol = ""; if ( layerProperty.pkCols.size() > 0 ) { pkCol = layerProperty.pkCols[0]; } QStandardItem *pkItem = new QStandardItem( pkCol ); if ( layerProperty.pkCols.size() > 1 ) pkItem->setFlags( pkItem->flags() | Qt::ItemIsEditable ); else pkItem->setFlags( pkItem->flags() & ~Qt::ItemIsEditable ); pkItem->setData( layerProperty.pkCols, Qt::UserRole + 1 ); pkItem->setData( pkCol, Qt::UserRole + 2 ); QStandardItem *selItem = new QStandardItem( "" ); selItem->setFlags( selItem->flags() | Qt::ItemIsUserCheckable ); selItem->setCheckState( Qt::Checked ); selItem->setToolTip( tr( "Disable 'Fast Access to Features at ID' capability to force keeping the attribute table in memory (e.g. in case of expensive views)." ) ); QStandardItem* sqlItem = new QStandardItem( layerProperty.sql ); QList<QStandardItem*> childItemList; childItemList << schemaNameItem; childItemList << tableItem; childItemList << geomItem; childItemList << geomTypeItem; childItemList << typeItem; childItemList << sridItem; childItemList << pkItem; childItemList << selItem; childItemList << sqlItem; foreach ( QStandardItem *item, childItemList ) { if ( tip.isEmpty() ) { item->setFlags( item->flags() | Qt::ItemIsSelectable | Qt::ItemIsEnabled ); item->setToolTip( "" ); } else { item->setFlags( item->flags() & ~Qt::ItemIsSelectable ); if ( item == schemaNameItem || item == tableItem || item == geomItem ) { item->setFlags( item->flags() & ~Qt::ItemIsEnabled ); item->setToolTip( tip ); } } } if ( !schemaItem ) { QList<QStandardItem*> schemaItems = findItems( layerProperty.schemaName, Qt::MatchExactly, dbtmSchema ); // there is already an item for this schema if ( schemaItems.size() > 0 ) { schemaItem = schemaItems.at( dbtmSchema ); } else { // create a new toplevel item for this schema schemaItem = new QStandardItem( layerProperty.schemaName ); schemaItem->setFlags( Qt::ItemIsEnabled ); invisibleRootItem()->setChild( invisibleRootItem()->rowCount(), schemaItem ); } } schemaItem->appendRow( childItemList ); ++mTableCount; } }
void QgsPgTableModel::addTableEntry( const QgsPostgresLayerProperty &layerProperty ) { QgsDebugMsg( layerProperty.toString() ); // is there already a root item with the given scheme Name? QStandardItem *schemaItem = nullptr; for ( int i = 0; i < layerProperty.size(); i++ ) { QgsWkbTypes::Type wkbType = layerProperty.types[ i ]; int srid = layerProperty.srids[ i ]; if ( wkbType == QgsWkbTypes::Unknown && layerProperty.geometryColName.isEmpty() ) { wkbType = QgsWkbTypes::NoGeometry; } QString tip; if ( wkbType == QgsWkbTypes::Unknown ) { tip = tr( "Specify a geometry type in the '%1' column" ).arg( tr( "Data Type" ) ); } else if ( wkbType != QgsWkbTypes::NoGeometry && srid == INT_MIN ) { tip = tr( "Enter a SRID into the '%1' column" ).arg( tr( "SRID" ) ); } else if ( !layerProperty.pkCols.isEmpty() ) { tip = tr( "Select columns in the '%1' column that uniquely identify features of this layer" ).arg( tr( "Feature id" ) ); } QStandardItem *schemaNameItem = new QStandardItem( layerProperty.schemaName ); QStandardItem *typeItem = new QStandardItem( iconForWkbType( wkbType ), wkbType == QgsWkbTypes::Unknown ? tr( "Select..." ) : QgsPostgresConn::displayStringForWkbType( wkbType ) ); typeItem->setData( wkbType == QgsWkbTypes::Unknown, Qt::UserRole + 1 ); typeItem->setData( wkbType, Qt::UserRole + 2 ); if ( wkbType == QgsWkbTypes::Unknown ) typeItem->setFlags( typeItem->flags() | Qt::ItemIsEditable ); QStandardItem *geomTypeItem = new QStandardItem( QgsPostgresConn::displayStringForGeomType( layerProperty.geometryColType ) ); QStandardItem *tableItem = new QStandardItem( layerProperty.tableName ); QStandardItem *commentItem = new QStandardItem( layerProperty.tableComment ); QStandardItem *geomItem = new QStandardItem( layerProperty.geometryColName ); QStandardItem *sridItem = new QStandardItem( wkbType != QgsWkbTypes::NoGeometry ? QString::number( srid ) : QLatin1String( "" ) ); sridItem->setEditable( wkbType != QgsWkbTypes::NoGeometry && srid == INT_MIN ); if ( sridItem->isEditable() ) { sridItem->setText( tr( "Enter..." ) ); sridItem->setFlags( sridItem->flags() | Qt::ItemIsEditable ); } QStandardItem *pkItem = new QStandardItem( QLatin1String( "" ) ); if ( !layerProperty.pkCols.isEmpty() ) { pkItem->setText( tr( "Select..." ) ); pkItem->setFlags( pkItem->flags() | Qt::ItemIsEditable ); } else pkItem->setFlags( pkItem->flags() & ~Qt::ItemIsEditable ); pkItem->setData( layerProperty.pkCols, Qt::UserRole + 1 ); pkItem->setData( "", Qt::UserRole + 2 ); QStandardItem *selItem = new QStandardItem( QLatin1String( "" ) ); selItem->setFlags( selItem->flags() | Qt::ItemIsUserCheckable ); selItem->setCheckState( Qt::Checked ); selItem->setToolTip( tr( "Disable 'Fast Access to Features at ID' capability to force keeping the attribute table in memory (e.g. in case of expensive views)." ) ); QStandardItem *sqlItem = new QStandardItem( layerProperty.sql ); QList<QStandardItem *> childItemList; childItemList << schemaNameItem; childItemList << tableItem; childItemList << commentItem; childItemList << geomItem; childItemList << geomTypeItem; childItemList << typeItem; childItemList << sridItem; childItemList << pkItem; childItemList << selItem; childItemList << sqlItem; Q_FOREACH ( QStandardItem *item, childItemList ) { if ( tip.isEmpty() ) { item->setFlags( item->flags() | Qt::ItemIsSelectable ); item->setToolTip( QLatin1String( "" ) ); } else { item->setFlags( item->flags() & ~Qt::ItemIsSelectable ); if ( item == schemaNameItem ) item->setData( QgsApplication::getThemeIcon( QStringLiteral( "/mIconWarning.svg" ) ), Qt::DecorationRole ); if ( item == schemaNameItem || item == tableItem || item == geomItem ) { item->setToolTip( tip ); } } } if ( !schemaItem ) { QList<QStandardItem *> schemaItems = findItems( layerProperty.schemaName, Qt::MatchExactly, DbtmSchema ); // there is already an item for this schema if ( !schemaItems.isEmpty() ) { schemaItem = schemaItems.at( DbtmSchema ); } else { // create a new toplevel item for this schema schemaItem = new QStandardItem( layerProperty.schemaName ); schemaItem->setFlags( Qt::ItemIsEnabled ); invisibleRootItem()->setChild( invisibleRootItem()->rowCount(), schemaItem ); } } schemaItem->appendRow( childItemList ); ++mTableCount; } }
void QgsPgTableModel::addTableEntry( const QgsPostgresLayerProperty &layerProperty ) { QgsDebugMsg( layerProperty.toString() ); // is there already a root item with the given scheme Name? QStandardItem *schemaItem = nullptr; for ( int i = 0; i < layerProperty.size(); i++ ) { QgsWkbTypes::Type wkbType = layerProperty.types[ i ]; int srid = layerProperty.srids[ i ]; if ( wkbType == QgsWkbTypes::Unknown && layerProperty.geometryColName.isEmpty() ) { wkbType = QgsWkbTypes::NoGeometry; } QString tip; bool withTipButSelectable = false; if ( wkbType == QgsWkbTypes::Unknown ) { tip = tr( "Specify a geometry type in the '%1' column" ).arg( tr( "Data Type" ) ); } else if ( wkbType != QgsWkbTypes::NoGeometry && srid == std::numeric_limits<int>::min() ) { tip = tr( "Enter a SRID into the '%1' column" ).arg( tr( "SRID" ) ); } else if ( !layerProperty.pkCols.isEmpty() ) { tip = tr( "Select columns in the '%1' column that uniquely identify features of this layer" ).arg( tr( "Feature id" ) ); withTipButSelectable = true; } QStandardItem *schemaNameItem = new QStandardItem( layerProperty.schemaName ); QStandardItem *typeItem = new QStandardItem( iconForWkbType( wkbType ), wkbType == QgsWkbTypes::Unknown ? tr( "Select…" ) : QgsPostgresConn::displayStringForWkbType( wkbType ) ); typeItem->setData( wkbType == QgsWkbTypes::Unknown, Qt::UserRole + 1 ); typeItem->setData( wkbType, Qt::UserRole + 2 ); if ( wkbType == QgsWkbTypes::Unknown ) typeItem->setFlags( typeItem->flags() | Qt::ItemIsEditable ); QStandardItem *geomTypeItem = new QStandardItem( QgsPostgresConn::displayStringForGeomType( layerProperty.geometryColType ) ); QStandardItem *tableItem = new QStandardItem( layerProperty.tableName ); QStandardItem *commentItem = new QStandardItem( layerProperty.tableComment ); QStandardItem *geomItem = new QStandardItem( layerProperty.geometryColName ); QStandardItem *sridItem = new QStandardItem( wkbType != QgsWkbTypes::NoGeometry ? QString::number( srid ) : QString() ); sridItem->setEditable( wkbType != QgsWkbTypes::NoGeometry && srid == std::numeric_limits<int>::min() ); if ( sridItem->isEditable() ) { sridItem->setText( tr( "Enter…" ) ); sridItem->setFlags( sridItem->flags() | Qt::ItemIsEditable ); } QStandardItem *pkItem = new QStandardItem( QString() ); if ( !layerProperty.pkCols.isEmpty() ) { pkItem->setText( tr( "Select…" ) ); pkItem->setFlags( pkItem->flags() | Qt::ItemIsEditable ); } else pkItem->setFlags( pkItem->flags() & ~Qt::ItemIsEditable ); pkItem->setData( layerProperty.pkCols, Qt::UserRole + 1 ); QStringList defPk( QgsSettings().value( QStringLiteral( "/PostgreSQL/connections/%1/keys/%2/%3" ).arg( mConnName, layerProperty.schemaName, layerProperty.tableName ), QStringList() ).toStringList() ); if ( !layerProperty.pkCols.isEmpty() && defPk.isEmpty() ) { // If we have a view with multiple possible columns to be used as the primary key, for convenience // let's select the first one - this is what the browser dock already does. We risk that a wrong column // will be used, but most of the time we should be fine. defPk = QStringList( layerProperty.pkCols[0] ); } pkItem->setData( defPk, Qt::UserRole + 2 ); if ( !defPk.isEmpty() ) pkItem->setText( defPk.join( ',' ) ); QStandardItem *selItem = new QStandardItem( QString() ); selItem->setFlags( selItem->flags() | Qt::ItemIsUserCheckable ); selItem->setCheckState( Qt::Checked ); selItem->setToolTip( headerData( Columns::DbtmSelectAtId, Qt::Orientation::Horizontal, Qt::ToolTipRole ).toString() ); QStandardItem *checkPkUnicityItem = new QStandardItem( QString() ); checkPkUnicityItem->setFlags( checkPkUnicityItem->flags() | Qt::ItemIsUserCheckable ); // Legacy: default value is determined by project option to trust layer's metadata // TODO: remove this default from QGIS 4 and leave default value to false? // checkPkUnicity has only effect on views and materialized views, so we can safely disable it if ( layerProperty.isView || layerProperty.isMaterializedView ) { checkPkUnicityItem->setCheckState( QgsProject::instance( )->trustLayerMetadata() ? Qt::CheckState::Unchecked : Qt::CheckState::Checked ); checkPkUnicityItem->setToolTip( headerData( Columns::DbtmCheckPkUnicity, Qt::Orientation::Horizontal, Qt::ToolTipRole ).toString() ); } else { checkPkUnicityItem->setCheckState( Qt::CheckState::Unchecked ); checkPkUnicityItem->setFlags( checkPkUnicityItem->flags() & ~ Qt::ItemIsEnabled ); checkPkUnicityItem->setToolTip( tr( "This option is only available for views and materialized views." ) ); } QStandardItem *sqlItem = new QStandardItem( layerProperty.sql ); QList<QStandardItem *> childItemList; childItemList << schemaNameItem; childItemList << tableItem; childItemList << commentItem; childItemList << geomItem; childItemList << geomTypeItem; childItemList << typeItem; childItemList << sridItem; childItemList << pkItem; childItemList << selItem; childItemList << checkPkUnicityItem; childItemList << sqlItem; const auto constChildItemList = childItemList; for ( QStandardItem *item : constChildItemList ) { if ( tip.isEmpty() || withTipButSelectable ) item->setFlags( item->flags() | Qt::ItemIsSelectable ); else item->setFlags( item->flags() & ~Qt::ItemIsSelectable ); if ( tip.isEmpty() && item != checkPkUnicityItem && item != selItem ) { item->setToolTip( QString() ); } else { if ( item == schemaNameItem ) item->setData( QgsApplication::getThemeIcon( QStringLiteral( "/mIconWarning.svg" ) ), Qt::DecorationRole ); if ( item == schemaNameItem || item == tableItem || item == geomItem ) { item->setToolTip( tip ); } } } if ( !schemaItem ) { QList<QStandardItem *> schemaItems = findItems( layerProperty.schemaName, Qt::MatchExactly, DbtmSchema ); // there is already an item for this schema if ( !schemaItems.isEmpty() ) { schemaItem = schemaItems.at( DbtmSchema ); } else { // create a new toplevel item for this schema schemaItem = new QStandardItem( layerProperty.schemaName ); schemaItem->setFlags( Qt::ItemIsEnabled ); invisibleRootItem()->setChild( invisibleRootItem()->rowCount(), schemaItem ); } } schemaItem->appendRow( childItemList ); ++mTableCount; } }