@@ -76,21 +76,18 @@ void QgsPgTableModel::addTableEntry( QgsPostgresLayerProperty layerProperty )
7676 QList<QStandardItem*> childItemList;
7777
7878 QStandardItem *schemaNameItem = new QStandardItem ( layerProperty.schemaName );
79- schemaNameItem->setFlags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
79+ schemaNameItem->setFlags ( Qt::ItemIsEnabled );
8080
81- QStandardItem *typeItem = new QStandardItem ( iconForGeomType ( geomType ), geomType == QGis::UnknownGeometry ? tr ( " Waiting..." ) : QgsPostgresConn::displayStringForGeomType ( geomType ) );
81+ QStandardItem *typeItem = new QStandardItem ( iconForGeomType ( geomType ),
82+ geomType == QGis::UnknownGeometry
83+ ? tr ( " Detecting..." )
84+ : QgsPostgresConn::displayStringForGeomType ( geomType ) );
8285 typeItem->setData ( geomType == QGis::UnknownGeometry, Qt::UserRole + 1 );
8386 typeItem->setData ( geomType, Qt::UserRole + 2 );
84- typeItem->setFlags (( geomType != QGis::UnknownGeometry ? Qt::ItemIsEnabled : Qt::NoItemFlags ) | Qt::ItemIsSelectable | Qt::ItemIsEditable );
8587
8688 QStandardItem *tableItem = new QStandardItem ( layerProperty.tableName );
87- tableItem->setFlags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
88-
8989 QStandardItem *geomItem = new QStandardItem ( layerProperty.geometryColName );
90- geomItem->setFlags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
91-
92- QStandardItem *sridItem = new QStandardItem ( QString::number ( layerProperty.srid ) );
93- sridItem->setFlags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
90+ QStandardItem *sridItem = new QStandardItem ( layerProperty.srid );
9491
9592 QString pkText, pkCol = " " ;
9693 switch ( layerProperty.pkCols .size () )
@@ -101,17 +98,18 @@ void QgsPgTableModel::addTableEntry( QgsPostgresLayerProperty layerProperty )
10198 }
10299
103100 QStandardItem *pkItem = new QStandardItem ( pkText );
101+ if ( pkText == tr ( " Select..." ) )
102+ pkItem->setFlags ( pkItem->flags () | Qt::ItemIsEditable );
103+
104104 pkItem->setData ( layerProperty.pkCols , Qt::UserRole + 1 );
105105 pkItem->setData ( pkCol, Qt::UserRole + 2 );
106- pkItem->setFlags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
107106
108107 QStandardItem *selItem = new QStandardItem ( " " );
109- selItem->setFlags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable );
108+ selItem->setFlags ( selItem-> flags () | Qt::ItemIsUserCheckable );
110109 selItem->setCheckState ( Qt::Checked );
111110 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)." ) );
112111
113112 QStandardItem* sqlItem = new QStandardItem ( layerProperty.sql );
114- sqlItem->setFlags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
115113
116114 childItemList << schemaNameItem;
117115 childItemList << tableItem;
@@ -122,6 +120,14 @@ void QgsPgTableModel::addTableEntry( QgsPostgresLayerProperty layerProperty )
122120 childItemList << selItem;
123121 childItemList << sqlItem;
124122
123+ if ( geomType == QGis::UnknownGeometry || layerProperty.srid .isEmpty () )
124+ {
125+ foreach ( QStandardItem *item, childItemList )
126+ {
127+ item->setFlags ( item->flags () & ~( Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable ) );
128+ }
129+ }
130+
125131 schemaItem->appendRow ( childItemList );
126132
127133 ++mTableCount ;
@@ -164,6 +170,7 @@ void QgsPgTableModel::setSql( const QModelIndex &index, const QString &sql )
164170 {
165171 continue ;
166172 }
173+
167174 QModelIndex currentTableIndex = currentChildIndex.sibling ( i, dbtmTable );
168175 if ( !currentTableIndex.isValid () )
169176 {
@@ -176,8 +183,7 @@ void QgsPgTableModel::setSql( const QModelIndex &index, const QString &sql )
176183 continue ;
177184 }
178185
179- if ( itemFromIndex ( currentTableIndex )->text () == tableName &&
180- itemFromIndex ( currentGeomIndex )->text () == geomName )
186+ if ( itemFromIndex ( currentTableIndex )->text () == tableName && itemFromIndex ( currentGeomIndex )->text () == geomName )
181187 {
182188 QModelIndex sqlIndex = currentChildIndex.sibling ( i, dbtmSql );
183189 if ( sqlIndex.isValid () )
@@ -192,6 +198,8 @@ void QgsPgTableModel::setSql( const QModelIndex &index, const QString &sql )
192198void QgsPgTableModel::setGeometryTypesForTable ( QgsPostgresLayerProperty layerProperty )
193199{
194200 QStringList typeList = layerProperty.type .split ( " ," , QString::SkipEmptyParts );
201+ QStringList sridList = layerProperty.srid .split ( " ," , QString::SkipEmptyParts );
202+ Q_ASSERT ( typeList.size () == sridList.size () );
195203
196204 // find schema item and table item
197205 QStandardItem* schemaItem;
@@ -213,53 +221,54 @@ void QgsPgTableModel::setGeometryTypesForTable( QgsPostgresLayerProperty layerPr
213221 continue ;
214222 }
215223
216- QModelIndex currentTypeIndex = currentChildIndex.sibling ( i, dbtmType );
217- QModelIndex currentTableIndex = currentChildIndex.sibling ( i, dbtmTable );
218- QModelIndex currentGeomColumnIndex = currentChildIndex.sibling ( i, dbtmGeomCol );
219- QModelIndex currentPkColumnIndex = currentChildIndex.sibling ( i, dbtmPkCol );
220- QModelIndex currentSridIndex = currentChildIndex.sibling ( i, dbtmSrid );
221-
222- if ( !currentTypeIndex.isValid ()
223- || !currentTableIndex.isValid ()
224- || !currentGeomColumnIndex.isValid ()
225- || !currentPkColumnIndex.isValid ()
226- || !currentSridIndex.isValid ()
227- )
224+ QList<QStandardItem *> row;
225+
226+ for ( int j = 0 ; j < dbtmColumns; j++ )
228227 {
229- continue ;
228+ row << itemFromIndex ( currentChildIndex. sibling ( i, j ) ) ;
230229 }
231230
232- QString tableText = itemFromIndex ( currentTableIndex )->text ();
233- QString geomColText = itemFromIndex ( currentGeomColumnIndex )->text ();
234- QStandardItem *typeItem = itemFromIndex ( currentTypeIndex );
235- QStandardItem *sridItem = itemFromIndex ( currentSridIndex );
236-
237- if ( tableText == layerProperty.tableName && geomColText == layerProperty.geometryColName )
231+ if ( row[ dbtmTable ]->text () == layerProperty.tableName && row[ dbtmGeomCol ]->text () == layerProperty.geometryColName )
238232 {
239- sridItem ->setText ( QString::number ( layerProperty.srid ) );
233+ row[ dbtmSrid ] ->setText ( layerProperty.srid );
240234
241235 if ( typeList.isEmpty () )
242236 {
243- typeItem->setText ( tr ( " Select..." ) );
237+ row[ dbtmType ]->setText ( tr ( " Select..." ) );
238+ row[ dbtmType ]->setFlags ( row[ dbtmType ]->flags () | Qt::ItemIsEditable );
239+
240+ row[ dbtmSrid ]->setText ( tr ( " Enter..." ) );
241+ row[ dbtmSrid ]->setFlags ( row[ dbtmSrid ]->flags () | Qt::ItemIsEditable );
242+
243+ foreach ( QStandardItem *item, row )
244+ {
245+ item->setFlags ( item->flags () | Qt::ItemIsEnabled );
246+ }
244247 }
245248 else
246249 {
247250 // update existing row
248251 QGis::GeometryType geomType = QgsPostgresConn::geomTypeFromPostgis ( typeList.at ( 0 ) );
249252
250- typeItem->setIcon ( iconForGeomType ( geomType ) );
251- typeItem->setText ( QgsPostgresConn::displayStringForGeomType ( geomType ) );
252- typeItem->setData ( false , Qt::UserRole + 1 );
253- typeItem->setData ( geomType, Qt::UserRole + 2 );
253+ row[ dbtmType ]->setIcon ( iconForGeomType ( geomType ) );
254+ row[ dbtmType ]->setText ( QgsPostgresConn::displayStringForGeomType ( geomType ) );
255+ row[ dbtmType ]->setData ( false , Qt::UserRole + 1 );
256+ row[ dbtmType ]->setData ( geomType, Qt::UserRole + 2 );
257+
258+ row[ dbtmSrid ]->setText ( sridList.at ( 0 ) );
259+
260+ foreach ( QStandardItem *item, row )
261+ {
262+ item->setFlags ( item->flags () | Qt::ItemIsSelectable | Qt::ItemIsEnabled );
263+ }
254264
255265 for ( int j = 1 ; j < typeList.size (); j++ )
256266 {
257267 layerProperty.type = typeList[j];
268+ layerProperty.srid = sridList[j];
258269 addTableEntry ( layerProperty );
259270 }
260271 }
261-
262- typeItem->setFlags ( typeItem->flags () | Qt::ItemIsEnabled );
263272 }
264273 }
265274}
@@ -280,3 +289,28 @@ QIcon QgsPgTableModel::iconForGeomType( QGis::GeometryType type )
280289 return QIcon ( QgsDataItem::getThemePixmap ( " /mIconLayer.png" ) );
281290 }
282291}
292+
293+ bool QgsPgTableModel::setData ( const QModelIndex &idx, const QVariant &value, int role )
294+ {
295+ if ( !QStandardItemModel::setData ( idx, value, role ) )
296+ return false ;
297+
298+ if ( idx.column () == dbtmType || idx.column () == dbtmSrid )
299+ {
300+ bool ok;
301+ idx.sibling ( idx.row (), dbtmSrid ).data ().toInt ( &ok );
302+
303+ ok &= idx.sibling ( idx.row (), dbtmType ).data ( Qt::UserRole + 2 ).toInt () != QGis::UnknownGeometry;
304+
305+ for ( int i = 0 ; i < dbtmColumns; i++ )
306+ {
307+ QStandardItem *item = itemFromIndex ( idx.sibling ( idx.row (), i ) );
308+ if ( ok )
309+ item->setFlags ( item->flags () | Qt::ItemIsSelectable );
310+ else
311+ item->setFlags ( item->flags () & ~Qt::ItemIsSelectable );
312+ }
313+ }
314+
315+ return true ;
316+ }
0 commit comments