Skip to content

Commit 3d9d1ee

Browse files
committedJun 7, 2013
postgresql & oracle provider fixes:
- start with an empty line edit when entering srids (fixes #8016) - oracle provider: order primary key candidates in views by column id (fixes #8018) - disable non-selectable entries and provide tooltips on why they are disabled
1 parent eea63a4 commit 3d9d1ee

File tree

7 files changed

+199
-50
lines changed

7 files changed

+199
-50
lines changed
 

‎src/providers/oracle/qgsoracleconn.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ QStringList QgsOracleConn::pkCandidates( QString ownerName, QString viewName )
156156
QStringList cols;
157157

158158
QSqlQuery qry( mDatabase );
159-
if ( !exec( qry, QString( "SELECT column_name FROM all_tab_columns WHERE owner=%1 AND table_name=%2" )
159+
if ( !exec( qry, QString( "SELECT column_name FROM all_tab_columns WHERE owner=%1 AND table_name=%2 ORDER BY column_id" )
160160
.arg( quotedValue( ownerName ) ).arg( quotedValue( viewName ) ) ) )
161161
{
162162
QgsMessageLog::logMessage( tr( "SQL:%1\nerror:%2\n" ).arg( qry.lastQuery() ).arg( qry.lastError().text() ), tr( "Oracle" ) );

‎src/providers/oracle/qgsoraclesourceselect.cpp

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,14 @@ email : jef at norbit dot de
4141
QWidget *QgsOracleSourceSelectDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const
4242
{
4343
Q_UNUSED( option );
44+
45+
QString tableName = index.sibling( index.row(), QgsOracleTableModel::dbtmTable ).data( Qt::DisplayRole ).toString();
46+
if ( tableName.isEmpty() )
47+
return 0;
48+
4449
if ( index.column() == QgsOracleTableModel::dbtmSql )
4550
{
46-
QLineEdit *le = new QLineEdit( parent );
47-
le->setText( index.data( Qt::DisplayRole ).toString() );
48-
return le;
51+
return new QLineEdit( parent );
4952
}
5053

5154
if ( index.column() == QgsOracleTableModel::dbtmType && index.data( Qt::UserRole + 1 ).toBool() )
@@ -63,7 +66,6 @@ QWidget *QgsOracleSourceSelectDelegate::createEditor( QWidget *parent, const QSt
6366
{
6467
cb->addItem( QgsOracleTableModel::iconForWkbType( type ), QgsOracleConn::displayStringForWkbType( type ), type );
6568
}
66-
cb->setCurrentIndex( cb->findData( index.data( Qt::UserRole + 2 ).toInt() ) );
6769
return cb;
6870
}
6971

@@ -76,9 +78,7 @@ QWidget *QgsOracleSourceSelectDelegate::createEditor( QWidget *parent, const QSt
7678
QStringList values = index.data( Qt::UserRole + 2 ).toStringList();
7779
if ( values.size() == 0 )
7880
{
79-
QString tableName = index.sibling( index.row(), QgsOracleTableModel::dbtmTable ).data( Qt::DisplayRole ).toString();
8081
QString ownerName = index.sibling( index.row(), QgsOracleTableModel::dbtmOwner ).data( Qt::DisplayRole ).toString();
81-
8282
values = mConn->pkCandidates( ownerName, tableName );
8383
}
8484

@@ -89,7 +89,6 @@ QWidget *QgsOracleSourceSelectDelegate::createEditor( QWidget *parent, const QSt
8989
{
9090
QComboBox *cb = new QComboBox( parent );
9191
cb->addItems( values );
92-
cb->setCurrentIndex( cb->findText( index.data( Qt::DisplayRole ).toString() ) );
9392
return cb;
9493
}
9594
}
@@ -98,13 +97,38 @@ QWidget *QgsOracleSourceSelectDelegate::createEditor( QWidget *parent, const QSt
9897
{
9998
QLineEdit *le = new QLineEdit( parent );
10099
le->setValidator( new QIntValidator( -1, 999999, parent ) );
101-
le->insert( index.data( Qt::DisplayRole ).toString() );
102100
return le;
103101
}
104102

105103
return 0;
106104
}
107105

106+
void QgsOracleSourceSelectDelegate::setEditorData( QWidget *editor, const QModelIndex &index ) const
107+
{
108+
QString value( index.data( Qt::DisplayRole ).toString() );
109+
110+
QComboBox *cb = qobject_cast<QComboBox* >( editor );
111+
if ( cb )
112+
{
113+
if ( index.column() == QgsOracleTableModel::dbtmType )
114+
cb->setCurrentIndex( cb->findData( index.data( Qt::UserRole + 2 ).toInt() ) );
115+
116+
if ( index.column() == QgsOracleTableModel::dbtmPkCol && index.data( Qt::UserRole + 2 ).toBool() )
117+
cb->setCurrentIndex( cb->findText( value ) );
118+
}
119+
120+
QLineEdit *le = qobject_cast<QLineEdit*>( editor );
121+
if ( le )
122+
{
123+
bool ok;
124+
value.toInt( &ok );
125+
if ( index.column() == QgsOracleTableModel::dbtmSrid && !ok )
126+
value = "";
127+
128+
le->setText( value );
129+
}
130+
}
131+
108132
void QgsOracleSourceSelectDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
109133
{
110134
QComboBox *cb = qobject_cast<QComboBox *>( editor );
@@ -120,14 +144,24 @@ void QgsOracleSourceSelectDelegate::setModelData( QWidget *editor, QAbstractItem
120144
}
121145
else if ( index.column() == QgsOracleTableModel::dbtmPkCol )
122146
{
123-
model->setData( index, cb->currentText() );
124-
model->setData( index, cb->currentText(), Qt::UserRole + 2 );
147+
QString value( cb->currentText() );
148+
model->setData( index, value.isEmpty() ? tr( "Select..." ) : value );
149+
model->setData( index, !value.isEmpty(), Qt::UserRole + 2 );
125150
}
126151
}
127152

128153
QLineEdit *le = qobject_cast<QLineEdit *>( editor );
129154
if ( le )
130-
model->setData( index, le->text() );
155+
{
156+
QString value( le->text() );
157+
158+
if ( index.column() == QgsOracleTableModel::dbtmSrid && value.isEmpty() )
159+
{
160+
value = tr( "Enter..." );
161+
}
162+
163+
model->setData( index, value );
164+
}
131165
}
132166

133167
QgsOracleSourceSelect::QgsOracleSourceSelect( QWidget *parent, Qt::WFlags fl, bool managerMode, bool embeddedMode )

‎src/providers/oracle/qgsoraclesourceselect.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@
2020
#include "ui_qgsdbsourceselectbase.h"
2121
#include "qgisgui.h"
2222
#include "qgsdbfilterproxymodel.h"
23-
#include "qgscontexthelp.h"
24-
2523
#include "qgsoracletablemodel.h"
24+
#include "qgscontexthelp.h"
2625

2726
#include <QMap>
2827
#include <QPair>
@@ -31,8 +30,8 @@
3130

3231
class QPushButton;
3332
class QStringList;
34-
class QgisApp;
3533
class QgsOracleColumnTypeThread;
34+
class QgisApp;
3635
class QgsOracleSourceSelect;
3736

3837
class QgsOracleSourceSelectDelegate : public QItemDelegate
@@ -52,8 +51,10 @@ class QgsOracleSourceSelectDelegate : public QItemDelegate
5251

5352
QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const;
5453
void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const;
54+
void setEditorData( QWidget *editor, const QModelIndex &index ) const;
5555

5656
void setConn( QgsOracleConn *conn ) { if ( mConn ) mConn->disconnect(); mConn = conn; }
57+
5758
private:
5859
QgsOracleConn *mConn;
5960
};

‎src/providers/oracle/qgsoracletablemodel.cpp

Lines changed: 56 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,23 @@ void QgsOracleTableModel::addTableEntry( const QgsOracleLayerProperty &layerProp
5757
QGis::WkbType wkbType = layerProperty.types[ i ];
5858
int srid = layerProperty.srids[ i ];
5959

60-
QStandardItem *ownerNameItem = new QStandardItem( layerProperty.ownerName );
6160

62-
bool selectable = wkbType == QGis::WKBNoGeometry || ( wkbType != QGis::WKBUnknown && srid != 0 );
61+
QString tip;
62+
if ( wkbType == QGis::WKBUnknown )
63+
{
64+
tip = tr( "Specify a geometry type" );
65+
}
66+
else if ( wkbType != QGis::WKBNoGeometry && srid == 0 )
67+
{
68+
tip = tr( "Enter a SRID" );
69+
}
70+
71+
if ( tip.isEmpty() && layerProperty.isView )
72+
{
73+
tip = tr( "Select a primary key" );
74+
}
6375

76+
QStandardItem *ownerNameItem = new QStandardItem( layerProperty.ownerName );
6477
QStandardItem *typeItem = new QStandardItem( iconForWkbType( wkbType ), wkbType == QGis::WKBUnknown ? tr( "Select..." ) : QgsOracleConn::displayStringForWkbType( wkbType ) );
6578
typeItem->setData( wkbType == QGis::WKBUnknown, Qt::UserRole + 1 );
6679
typeItem->setData( wkbType, Qt::UserRole + 2 );
@@ -77,9 +90,12 @@ void QgsOracleTableModel::addTableEntry( const QgsOracleLayerProperty &layerProp
7790
sridItem->setFlags( sridItem->flags() | Qt::ItemIsEditable );
7891
}
7992

80-
QStandardItem *pkItem = new QStandardItem( layerProperty.isView ? tr( "Select..." ) : "" );
93+
QStandardItem *pkItem = new QStandardItem( "" );
8194
if ( layerProperty.isView )
95+
{
96+
pkItem->setText( tr( "Select..." ) );
8297
pkItem->setFlags( pkItem->flags() | Qt::ItemIsEditable );
98+
}
8399
else
84100
pkItem->setFlags( pkItem->flags() & ~Qt::ItemIsEditable );
85101

@@ -105,13 +121,20 @@ void QgsOracleTableModel::addTableEntry( const QgsOracleLayerProperty &layerProp
105121

106122
foreach ( QStandardItem *item, childItemList )
107123
{
108-
if ( selectable )
124+
if ( tip.isEmpty() )
109125
{
110-
item->setFlags( item->flags() | Qt::ItemIsSelectable );
126+
item->setFlags( item->flags() | Qt::ItemIsSelectable | Qt::ItemIsEnabled );
127+
item->setToolTip( "" );
111128
}
112129
else
113130
{
114131
item->setFlags( item->flags() & ~Qt::ItemIsSelectable );
132+
133+
if ( item == ownerNameItem || item == tableItem || item == geomItem )
134+
{
135+
item->setFlags( item->flags() & ~Qt::ItemIsEnabled );
136+
item->setToolTip( tip );
137+
}
115138
}
116139
}
117140

@@ -235,26 +258,45 @@ bool QgsOracleTableModel::setData( const QModelIndex &idx, const QVariant &value
235258

236259
if ( idx.column() == dbtmType || idx.column() == dbtmSrid || idx.column() == dbtmPkCol )
237260
{
238-
QGis::WkbType geomType = ( QGis::WkbType ) idx.sibling( idx.row(), dbtmType ).data( Qt::UserRole + 2 ).toInt();
239-
240-
bool ok = geomType != QGis::WKBUnknown;
261+
QGis::WkbType wkbType = ( QGis::WkbType ) idx.sibling( idx.row(), dbtmType ).data( Qt::UserRole + 2 ).toInt();
241262

242-
if ( ok && geomType != QGis::WKBNoGeometry )
263+
QString tip;
264+
if ( wkbType == QGis::WKBUnknown )
243265
{
266+
tip = tr( "Specify a geometry type" );
267+
}
268+
else if ( wkbType != QGis::WKBNoGeometry )
269+
{
270+
bool ok;
244271
int srid = idx.sibling( idx.row(), dbtmSrid ).data().toInt( &ok );
245-
ok &= srid != 0;
272+
273+
if ( !ok || srid == 0 )
274+
tip = tr( "Enter a SRID" );
246275
}
247276

248-
ok &= !idx.sibling( idx.row(), dbtmPkCol ).data( Qt::UserRole + 1 ).toBool() ||
249-
idx.sibling( idx.row(), dbtmPkCol ).data( Qt::UserRole + 2 ).toBool();
277+
if ( tip.isEmpty() && idx.sibling( idx.row(), dbtmPkCol ).data( Qt::UserRole + 1 ).toBool() )
278+
{
279+
if ( !idx.sibling( idx.row(), dbtmPkCol ).data( Qt::UserRole + 2 ).toBool() )
280+
tip = tr( "Select a primary key" );
281+
}
250282

251283
for ( int i = 0; i < dbtmColumns; i++ )
252284
{
253285
QStandardItem *item = itemFromIndex( idx.sibling( idx.row(), i ) );
254-
if ( ok )
255-
item->setFlags( item->flags() | Qt::ItemIsSelectable );
286+
if ( tip.isEmpty() )
287+
{
288+
item->setFlags( item->flags() | Qt::ItemIsSelectable | Qt::ItemIsEnabled );
289+
item->setToolTip( "" );
290+
}
256291
else
292+
{
257293
item->setFlags( item->flags() & ~Qt::ItemIsSelectable );
294+
if ( i == dbtmOwner || i == dbtmTable || i == dbtmGeomCol )
295+
{
296+
item->setFlags( item->flags() & ~Qt::ItemIsEnabled );
297+
item->setToolTip( tip );
298+
}
299+
}
258300
}
259301
}
260302

‎src/providers/postgres/qgspgsourceselect.cpp

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,14 @@ email : sherman at mrcc.com
4141
QWidget *QgsPgSourceSelectDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const
4242
{
4343
Q_UNUSED( option );
44+
45+
QString tableName = index.sibling( index.row(), QgsPgTableModel::dbtmTable ).data( Qt::DisplayRole ).toString();
46+
if ( tableName.isEmpty() )
47+
return 0;
48+
4449
if ( index.column() == QgsPgTableModel::dbtmSql )
4550
{
46-
QLineEdit *le = new QLineEdit( parent );
47-
le->setText( index.data( Qt::DisplayRole ).toString() );
48-
return le;
51+
return new QLineEdit( parent );
4952
}
5053

5154
if ( index.column() == QgsPgTableModel::dbtmType && index.data( Qt::UserRole + 1 ).toBool() )
@@ -63,7 +66,6 @@ QWidget *QgsPgSourceSelectDelegate::createEditor( QWidget *parent, const QStyleO
6366
{
6467
cb->addItem( QgsPgTableModel::iconForWkbType( type ), QgsPostgresConn::displayStringForWkbType( type ), type );
6568
}
66-
cb->setCurrentIndex( cb->findData( index.data( Qt::UserRole + 2 ).toInt() ) );
6769
return cb;
6870
}
6971

@@ -75,7 +77,6 @@ QWidget *QgsPgSourceSelectDelegate::createEditor( QWidget *parent, const QStyleO
7577
{
7678
QComboBox *cb = new QComboBox( parent );
7779
cb->addItems( values );
78-
cb->setCurrentIndex( cb->findText( index.data( Qt::DisplayRole ).toString() ) );
7980
return cb;
8081
}
8182
}
@@ -84,13 +85,38 @@ QWidget *QgsPgSourceSelectDelegate::createEditor( QWidget *parent, const QStyleO
8485
{
8586
QLineEdit *le = new QLineEdit( parent );
8687
le->setValidator( new QIntValidator( -1, 999999, parent ) );
87-
le->insert( index.data( Qt::DisplayRole ).toString() );
8888
return le;
8989
}
9090

9191
return 0;
9292
}
9393

94+
void QgsPgSourceSelectDelegate::setEditorData( QWidget *editor, const QModelIndex &index ) const
95+
{
96+
QString value( index.data( Qt::DisplayRole ).toString() );
97+
98+
QComboBox *cb = qobject_cast<QComboBox* >( editor );
99+
if ( cb )
100+
{
101+
if ( index.column() == QgsPgTableModel::dbtmType )
102+
cb->setCurrentIndex( cb->findData( index.data( Qt::UserRole + 2 ).toInt() ) );
103+
104+
if ( index.column() == QgsPgTableModel::dbtmPkCol && !index.data( Qt::UserRole + 2 ).toString().isEmpty() )
105+
cb->setCurrentIndex( cb->findText( index.data( Qt::UserRole + 2 ).toString() ) );
106+
}
107+
108+
QLineEdit *le = qobject_cast<QLineEdit*>( editor );
109+
if ( le )
110+
{
111+
bool ok;
112+
value.toInt( &ok );
113+
if ( index.column() == QgsPgTableModel::dbtmSrid && !ok )
114+
value = "";
115+
116+
le->setText( value );
117+
}
118+
}
119+
94120
void QgsPgSourceSelectDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
95121
{
96122
QComboBox *cb = qobject_cast<QComboBox *>( editor );
@@ -106,14 +132,24 @@ void QgsPgSourceSelectDelegate::setModelData( QWidget *editor, QAbstractItemMode
106132
}
107133
else if ( index.column() == QgsPgTableModel::dbtmPkCol )
108134
{
109-
model->setData( index, cb->currentText() );
110-
model->setData( index, cb->currentText(), Qt::UserRole + 2 );
135+
QString value( cb->currentText() );
136+
model->setData( index, value.isEmpty() ? tr( "Select..." ) : value );
137+
model->setData( index, value, Qt::UserRole + 2 );
111138
}
112139
}
113140

114141
QLineEdit *le = qobject_cast<QLineEdit *>( editor );
115142
if ( le )
116-
model->setData( index, le->text() );
143+
{
144+
QString value( le->text() );
145+
146+
if ( index.column() == QgsPgTableModel::dbtmSrid && value.isEmpty() )
147+
{
148+
value = tr( "Enter..." );
149+
}
150+
151+
model->setData( index, value );
152+
}
117153
}
118154

119155
QgsPgSourceSelect::QgsPgSourceSelect( QWidget *parent, Qt::WFlags fl, bool managerMode, bool embeddedMode )

‎src/providers/postgres/qgspgsourceselect.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class QgsPgSourceSelectDelegate : public QItemDelegate
4545

4646
QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const;
4747
void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const;
48+
void setEditorData( QWidget *editor, const QModelIndex &index ) const;
4849
};
4950

5051

‎src/providers/postgres/qgspgtablemodel.cpp

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,21 @@ void QgsPgTableModel::addTableEntry( const QgsPostgresLayerProperty& layerProper
5353
{
5454
QGis::WkbType wkbType = layerProperty.types[ i ];
5555
int srid = layerProperty.srids[ i ];
56+
5657
if ( wkbType == QGis::WKBUnknown && layerProperty.geometryColName.isEmpty() )
5758
{
5859
wkbType = QGis::WKBNoGeometry;
5960
}
6061

61-
bool selectable = wkbType == QGis::WKBNoGeometry || ( wkbType != QGis::WKBUnknown && srid != INT_MIN );
62+
QString tip;
63+
if ( wkbType == QGis::WKBUnknown )
64+
{
65+
tip = tr( "Specify a geometry type" );
66+
}
67+
else if ( wkbType != QGis::WKBNoGeometry && srid == INT_MIN )
68+
{
69+
tip = tr( "Enter a SRID" );
70+
}
6271

6372
QStandardItem *schemaNameItem = new QStandardItem( layerProperty.schemaName );
6473
QStandardItem *typeItem = new QStandardItem( iconForWkbType( wkbType ), wkbType == QGis::WKBUnknown ? tr( "Select..." ) : QgsPostgresConn::displayStringForWkbType( wkbType ) );
@@ -115,13 +124,20 @@ void QgsPgTableModel::addTableEntry( const QgsPostgresLayerProperty& layerProper
115124

116125
foreach ( QStandardItem *item, childItemList )
117126
{
118-
if ( selectable )
127+
if ( tip.isEmpty() )
119128
{
120-
item->setFlags( item->flags() | Qt::ItemIsSelectable );
129+
item->setFlags( item->flags() | Qt::ItemIsSelectable | Qt::ItemIsEnabled );
130+
item->setToolTip( "" );
121131
}
122132
else
123133
{
124134
item->setFlags( item->flags() & ~Qt::ItemIsSelectable );
135+
136+
if ( item == schemaNameItem || item == tableItem || item == geomItem )
137+
{
138+
item->setFlags( item->flags() & ~Qt::ItemIsEnabled );
139+
item->setToolTip( tip );
140+
}
125141
}
126142
}
127143

@@ -245,27 +261,46 @@ bool QgsPgTableModel::setData( const QModelIndex &idx, const QVariant &value, in
245261

246262
if ( idx.column() == dbtmType || idx.column() == dbtmSrid || idx.column() == dbtmPkCol )
247263
{
248-
QGis::WkbType geomType = ( QGis::WkbType ) idx.sibling( idx.row(), dbtmType ).data( Qt::UserRole + 2 ).toInt();
264+
QGis::WkbType wkbType = ( QGis::WkbType ) idx.sibling( idx.row(), dbtmType ).data( Qt::UserRole + 2 ).toInt();
249265

250-
bool ok = geomType != QGis::WKBUnknown;
251-
252-
if ( ok && geomType != QGis::WKBNoGeometry )
266+
QString tip;
267+
if ( wkbType == QGis::WKBUnknown )
253268
{
269+
tip = tr( "Specify a geometry type" );
270+
}
271+
else if ( wkbType != QGis::WKBNoGeometry )
272+
{
273+
bool ok;
254274
int srid = idx.sibling( idx.row(), dbtmSrid ).data().toInt( &ok );
255-
ok &= srid != INT_MIN;
275+
276+
if ( !ok || srid == INT_MIN )
277+
tip = tr( "Enter a SRID" );
256278
}
257279

258280
QStringList pkCols = idx.sibling( idx.row(), dbtmPkCol ).data( Qt::UserRole + 1 ).toStringList();
259-
if ( ok && pkCols.size() > 0 )
260-
ok = pkCols.contains( idx.sibling( idx.row(), dbtmPkCol ).data().toString() );
281+
if ( tip.isEmpty() && pkCols.size() > 0 )
282+
{
283+
if ( !pkCols.contains( idx.sibling( idx.row(), dbtmPkCol ).data().toString() ) )
284+
tip = tr( "Select a primary key" );
285+
}
261286

262287
for ( int i = 0; i < dbtmColumns; i++ )
263288
{
264289
QStandardItem *item = itemFromIndex( idx.sibling( idx.row(), i ) );
265-
if ( ok )
266-
item->setFlags( item->flags() | Qt::ItemIsSelectable );
290+
if ( tip.isEmpty() )
291+
{
292+
item->setFlags( item->flags() | Qt::ItemIsSelectable | Qt::ItemIsEnabled );
293+
item->setToolTip( "" );
294+
}
267295
else
296+
{
268297
item->setFlags( item->flags() & ~Qt::ItemIsSelectable );
298+
if ( i == dbtmSchema || i == dbtmTable || i == dbtmGeomCol )
299+
{
300+
item->setFlags( item->flags() & ~Qt::ItemIsEnabled );
301+
item->setToolTip( tip );
302+
}
303+
}
269304
}
270305
}
271306

0 commit comments

Comments
 (0)
Please sign in to comment.