14
14
***************************************************************************/
15
15
/* $Id$ */
16
16
#include < iostream>
17
- #include < q3listbox.h>
18
17
#include < QMessageBox>
18
+ #include < QListView>
19
19
#include " qgspgquerybuilder.h"
20
20
#include < qgslogger.h>
21
21
#include < QRegExp>
@@ -24,6 +24,7 @@ QgsPgQueryBuilder::QgsPgQueryBuilder(QWidget *parent, Qt::WFlags fl)
24
24
: QDialog(parent, fl)
25
25
{
26
26
setupUi (this );
27
+ setupListViews ();
27
28
}
28
29
// constructor used when the query builder must make its own
29
30
// connection to the database
@@ -32,6 +33,7 @@ QgsPgQueryBuilder::QgsPgQueryBuilder(QgsDataSourceURI *uri,
32
33
: QDialog(parent, fl), mUri(uri)
33
34
{
34
35
setupUi (this );
36
+ setupListViews ();
35
37
// The query builder must make its own connection to the database when
36
38
// using this constructor
37
39
QString connInfo = mUri ->connInfo ();
@@ -69,6 +71,7 @@ QgsPgQueryBuilder::QgsPgQueryBuilder(QString tableName, PGconn *con,
69
71
: QDialog(parent, fl), mPgConnection(con)
70
72
{
71
73
setupUi (this );
74
+ setupListViews ();
72
75
mOwnConnection = false ; // we don't own this connection since it was passed to us
73
76
mUri = new QgsDataSourceURI ( " table=" + tableName);
74
77
QString datasource = QString (tr (" Table <b>%1</b> in database <b>%2</b> on host <b>%3</b>, user <b>%4</b>" ))
@@ -133,7 +136,9 @@ void QgsPgQueryBuilder::populateFields()
133
136
#endif
134
137
QVariant::Type type = QVariant::String; // TODO: should be set correctly [MD]
135
138
mFieldMap [fieldName] = QgsField (fieldName, type, fieldType);
136
- lstFields->insertItem (fieldName);
139
+ QStandardItem *myItem = new QStandardItem (fieldName);
140
+ myItem->setEditable (false );
141
+ mModelFields ->insertRow (mModelFields ->rowCount (),myItem);
137
142
}
138
143
}
139
144
else
@@ -143,21 +148,39 @@ void QgsPgQueryBuilder::populateFields()
143
148
PQclear (result);
144
149
}
145
150
151
+ void QgsPgQueryBuilder::setupListViews ()
152
+ {
153
+ // Models
154
+ mModelFields = new QStandardItemModel ();
155
+ mModelValues = new QStandardItemModel ();
156
+ lstFields->setModel (mModelFields );
157
+ lstValues->setModel (mModelValues );
158
+ // Modes
159
+ lstFields->setViewMode (QListView::ListMode);
160
+ lstValues->setViewMode (QListView::ListMode);
161
+ lstFields->setSelectionBehavior (QAbstractItemView::SelectRows);
162
+ lstValues->setSelectionBehavior (QAbstractItemView::SelectRows);
163
+ // Performance tip since Qt 4.1
164
+ lstFields->setUniformItemSizes (true );
165
+ lstValues->setUniformItemSizes (true );
166
+ }
167
+
146
168
void QgsPgQueryBuilder::on_btnSampleValues_clicked ()
147
169
{
148
- if (lstFields->currentText ().isEmpty ())
170
+ QString myFieldName = mModelFields ->data (lstFields->currentIndex ()).toString ();
171
+ if (myFieldName.isEmpty ())
149
172
return ;
150
173
151
- QString sql = " SELECT DISTINCT \" " + lstFields-> currentText () + " \" " +
152
- " FROM (SELECT \" " + lstFields-> currentText () + " \" " +
174
+ QString sql = " SELECT DISTINCT \" " + myFieldName + " \" " +
175
+ " FROM (SELECT \" " + myFieldName + " \" " +
153
176
" FROM " + mUri ->quotedTablename () + " " +
154
177
" LIMIT 5000) AS foo " +
155
- " ORDER BY \" " + lstFields-> currentText () + " \" " +
178
+ " ORDER BY \" " + myFieldName + " \" " +
156
179
" LIMIT 25" ;
157
180
// clear the values list
158
- lstValues ->clear ();
181
+ mModelValues ->clear ();
159
182
// determine the field type
160
- QgsField field = mFieldMap [lstFields-> currentText () ];
183
+ QgsField field = mFieldMap [myFieldName ];
161
184
bool isCharField = field.typeName ().find (" char" ) > -1 ;
162
185
PGresult *result = PQexec (mPgConnection , (const char *) (sql.utf8 ()));
163
186
@@ -169,14 +192,12 @@ void QgsPgQueryBuilder::on_btnSampleValues_clicked()
169
192
QString value = QString::fromUtf8 (PQgetvalue (result, i, 0 ));
170
193
if (isCharField)
171
194
{
172
- lstValues->insertItem (" '" + value + " '" );
173
- }
174
- else
175
- {
176
- lstValues->insertItem (value);
195
+ value = " '" + value + " '" ;
177
196
}
197
+ QStandardItem *myItem = new QStandardItem (value);
198
+ myItem->setEditable (false );
199
+ mModelValues ->insertRow (mModelValues ->rowCount (),myItem);
178
200
}
179
-
180
201
}else
181
202
{
182
203
QMessageBox::warning (this , tr (" Database error" ), tr (" <p>Failed to get sample of field values using SQL:</p><p>" ) + sql + " </p><p>Error message was: " + QString (PQerrorMessage (mPgConnection )) + " </p>" );
@@ -187,36 +208,48 @@ void QgsPgQueryBuilder::on_btnSampleValues_clicked()
187
208
188
209
void QgsPgQueryBuilder::on_btnGetAllValues_clicked ()
189
210
{
190
- if (lstFields->currentText ().isEmpty ())
211
+ QString myFieldName = mModelFields ->data (lstFields->currentIndex ()).toString ();
212
+ if (myFieldName.isEmpty ())
191
213
return ;
192
214
193
- QString sql = " select distinct \" " + lstFields-> currentText ()
194
- + " \" from " + mUri ->quotedTablename () + " order by \" " + lstFields-> currentText () + " \" " ;
215
+ QString sql = " select distinct \" " + myFieldName
216
+ + " \" from " + mUri ->quotedTablename () + " order by \" " + myFieldName + " \" " ;
195
217
// clear the values list
196
- lstValues ->clear ();
218
+ mModelValues ->clear ();
197
219
// determine the field type
198
- QgsField field = mFieldMap [lstFields-> currentText () ];
220
+ QgsField field = mFieldMap [myFieldName ];
199
221
bool isCharField = field.typeName ().find (" char" ) > -1 ;
200
222
201
223
PGresult *result = PQexec (mPgConnection , (const char *) (sql.utf8 ()));
202
224
203
225
if (PQresultStatus (result) == PGRES_TUPLES_OK)
204
226
{
205
227
int rowCount = PQntuples (result);
228
+
229
+ lstValues->setCursor (Qt::WaitCursor);
230
+ // Block for better performance
231
+ mModelValues ->blockSignals (true );
232
+ lstValues->setUpdatesEnabled (false );
233
+
206
234
for (int i=0 ; i < rowCount; i++)
207
235
{
208
236
QString value = QString::fromUtf8 (PQgetvalue (result, i, 0 ));
209
-
210
237
if (isCharField)
211
238
{
212
- lstValues->insertItem (" '" + value + " '" );
213
- }
214
- else
215
- {
216
- lstValues->insertItem (value);
239
+ value = " '" + value + " '" ;
217
240
}
241
+ QStandardItem *myItem = new QStandardItem (value);
242
+ myItem->setEditable (false );
243
+ mModelValues ->insertRow (mModelValues ->rowCount (),myItem);
218
244
}
219
-
245
+
246
+ // Unblock for normal use
247
+ mModelValues ->blockSignals (false );
248
+ lstValues->setUpdatesEnabled (true );
249
+ // TODO: already sorted, signal emit to refresh model
250
+ mModelValues ->sort (0 );
251
+ lstValues->setCursor (Qt::ArrowCursor);
252
+
220
253
}else
221
254
{
222
255
QMessageBox::warning (this , tr (" Database error" ), tr (" Failed to get sample of field values" ) + QString (PQerrorMessage (mPgConnection )) );
@@ -365,14 +398,14 @@ void QgsPgQueryBuilder::setSql( QString sqlStatement)
365
398
txtSQL->setText (sqlStatement);
366
399
}
367
400
368
- void QgsPgQueryBuilder::on_lstFields_doubleClicked ( Q3ListBoxItem *item )
401
+ void QgsPgQueryBuilder::on_lstFields_doubleClicked ( const QModelIndex &index )
369
402
{
370
- txtSQL->insert (" \" " + item-> text () + " \" " );
403
+ txtSQL->insert (" \" " + mModelFields -> data ( index ). toString () + " \" " );
371
404
}
372
405
373
- void QgsPgQueryBuilder::on_lstValues_doubleClicked ( Q3ListBoxItem *item )
406
+ void QgsPgQueryBuilder::on_lstValues_doubleClicked ( const QModelIndex &index )
374
407
{
375
- txtSQL->insert (item-> text ());
408
+ txtSQL->insert (mModelValues -> data ( index ). toString ());
376
409
}
377
410
378
411
void QgsPgQueryBuilder::on_btnLessEqual_clicked ()
0 commit comments