Skip to content

Commit 8d59d04

Browse files
committed
postgres selection:
- make geometryless table selectable - only make srid column editable when necessary - leave primary key column editable - require primary key selection for views
1 parent 318a827 commit 8d59d04

File tree

3 files changed

+42
-20
lines changed

3 files changed

+42
-20
lines changed

src/providers/postgres/qgspgsourceselect.cpp

100644100755
Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -504,9 +504,6 @@ void QgsPgSourceSelect::on_btnConnect_clicked()
504504
}
505505
}
506506

507-
if ( cmbConnections->count() > 0 && !mColumnTypeThread )
508-
mAddButton->setEnabled( true );
509-
510507
//if we have only one schema item, expand it by default
511508
int numTopLevelItems = mTableModel.invisibleRootItem()->rowCount();
512509
if ( numTopLevelItems < 2 || mTableModel.tableCount() < 20 )
@@ -522,9 +519,7 @@ void QgsPgSourceSelect::on_btnConnect_clicked()
522519

523520
if ( !mColumnTypeThread )
524521
{
525-
QApplication::restoreOverrideCursor();
526-
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmTable, Qt::AscendingOrder );
527-
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmSchema, Qt::AscendingOrder );
522+
finishList();
528523
}
529524
}
530525
else
@@ -536,18 +531,30 @@ void QgsPgSourceSelect::on_btnConnect_clicked()
536531
}
537532
}
538533

539-
void QgsPgSourceSelect::columnThreadFinished()
534+
void QgsPgSourceSelect::finishList()
540535
{
541-
delete mColumnTypeThread;
542-
mColumnTypeThread = 0;
543-
btnConnect->setText( tr( "Connect" ) );
544536
QApplication::restoreOverrideCursor();
545537

546538
if ( cmbConnections->count() > 0 )
547539
mAddButton->setEnabled( true );
548540

541+
#if 0
542+
for ( int i = 0; i < QgsPgTableModel::dbtmColumns; i++ )
543+
mTablesTreeView->resizeColumnToContents( i );
544+
#endif
545+
549546
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmTable, Qt::AscendingOrder );
550547
mTablesTreeView->sortByColumn( QgsPgTableModel::dbtmSchema, Qt::AscendingOrder );
548+
549+
}
550+
551+
void QgsPgSourceSelect::columnThreadFinished()
552+
{
553+
delete mColumnTypeThread;
554+
mColumnTypeThread = 0;
555+
btnConnect->setText( tr( "Connect" ) );
556+
557+
finishList();
551558
}
552559

553560
QStringList QgsPgSourceSelect::selectedTables()

src/providers/postgres/qgspgsourceselect.h

100644100755
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@ class QgsPgSourceSelect : public QDialog, private Ui::QgsDbSourceSelectBase
151151

152152
QPushButton *mBuildQueryButton;
153153
QPushButton *mAddButton;
154-
void updateSelectableState( const QModelIndex &index );
154+
155+
void finishList();
155156
};
156157

157158
#endif // QGSPGSOURCESELECT_H

src/providers/postgres/qgspgtablemodel.cpp

100644100755
Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ void QgsPgTableModel::addTableEntry( QgsPostgresLayerProperty layerProperty )
8888
QStandardItem *tableItem = new QStandardItem( layerProperty.tableName );
8989
QStandardItem *geomItem = new QStandardItem( layerProperty.geometryColName );
9090
QStandardItem *sridItem = new QStandardItem( layerProperty.srid );
91+
sridItem->setEditable( false );
9192

9293
QString pkText, pkCol = "";
9394
switch ( layerProperty.pkCols.size() )
@@ -120,11 +121,13 @@ void QgsPgTableModel::addTableEntry( QgsPostgresLayerProperty layerProperty )
120121
childItemList << selItem;
121122
childItemList << sqlItem;
122123

123-
if ( geomType == QGis::UnknownGeometry || layerProperty.srid.isEmpty() )
124+
if ( geomType == QGis::UnknownGeometry ||
125+
( geomType != QGis::NoGeometry && layerProperty.srid.isEmpty() ) ||
126+
pkText == tr( "Select..." ) )
124127
{
125128
foreach( QStandardItem *item, childItemList )
126129
{
127-
item->setFlags( item->flags() & ~( Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable ) );
130+
item->setFlags( item->flags() & ~( Qt::ItemIsEnabled | Qt::ItemIsSelectable ) );
128131
}
129132
}
130133

@@ -257,9 +260,13 @@ void QgsPgTableModel::setGeometryTypesForTable( QgsPostgresLayerProperty layerPr
257260

258261
row[ dbtmSrid ]->setText( sridList.at( 0 ) );
259262

263+
Qt::ItemFlags flags = Qt::ItemIsEnabled;
264+
if ( layerProperty.pkCols.size() < 2 )
265+
flags |= Qt::ItemIsSelectable;
266+
260267
foreach( QStandardItem *item, row )
261268
{
262-
item->setFlags( item->flags() | Qt::ItemIsSelectable | Qt::ItemIsEnabled );
269+
item->setFlags( item->flags() | flags );
263270
}
264271

265272
for ( int j = 1; j < typeList.size(); j++ )
@@ -295,12 +302,18 @@ bool QgsPgTableModel::setData( const QModelIndex &idx, const QVariant &value, in
295302
if ( !QStandardItemModel::setData( idx, value, role ) )
296303
return false;
297304

298-
if ( idx.column() == dbtmType || idx.column() == dbtmSrid )
305+
if ( idx.column() == dbtmType || idx.column() == dbtmSrid || idx.column() == dbtmPkCol )
299306
{
300-
bool ok;
301-
idx.sibling( idx.row(), dbtmSrid ).data().toInt( &ok );
307+
QGis::GeometryType geomType = ( QGis::GeometryType ) idx.sibling( idx.row(), dbtmType ).data( Qt::UserRole + 2 ).toInt();
308+
309+
bool ok = geomType != QGis::UnknownGeometry;
310+
311+
if ( geomType != QGis::NoGeometry )
312+
idx.sibling( idx.row(), dbtmSrid ).data().toInt( &ok );
302313

303-
ok &= idx.sibling( idx.row(), dbtmType ).data( Qt::UserRole + 2 ).toInt() != QGis::UnknownGeometry;
314+
QStringList pkCols = idx.sibling( idx.row(), dbtmPkCol ).data( Qt::UserRole + 1 ).toStringList();
315+
if ( pkCols.size() > 0 )
316+
ok = pkCols.contains( idx.sibling( idx.row(), dbtmPkCol ).data().toString() );
304317

305318
for ( int i = 0; i < dbtmColumns; i++ )
306319
{
@@ -328,8 +341,9 @@ QString QgsPgTableModel::layerURI( const QModelIndex &index, QString connInfo, b
328341
QStandardItem *pkItem = itemFromIndex( index.sibling( index.row(), dbtmPkCol ) );
329342
QString pkColumnName = pkItem->data( Qt::UserRole + 2 ).toString();
330343

331-
if ( pkItem->data( Qt::UserRole + 1 ).toStringList().size() > 0 && pkColumnName.isEmpty() )
332-
// no primary key for view selected
344+
if ( pkItem->data( Qt::UserRole + 1 ).toStringList().size() > 0 &&
345+
!pkItem->data( Qt::UserRole + 1 ).toStringList().contains( pkColumnName ) )
346+
// no valid primary candidate selected
333347
return QString::null;
334348

335349
QString schemaName = index.sibling( index.row(), dbtmSchema ).data( Qt::DisplayRole ).toString();

0 commit comments

Comments
 (0)