1
/***************************************************************************
2
qgsattributeeditor.cpp - description
5
copyright : (C) 2009 by Jürgen E. Fischer
7
***************************************************************************/
9
/***************************************************************************
11
* This program is free software; you can redistribute it and/or modify *
12
* it under the terms of the GNU General Public License as published by *
13
* the Free Software Foundation; either version 2 of the License, or *
14
* (at your option) any later version. *
16
***************************************************************************/
19
#include "qgsattributeeditor.h"
20
#include <qgsvectorlayer.h>
21
#include <qgsvectordataprovider.h>
22
#include <qgsuniquevaluerenderer.h>
23
#include <qgscategorizedsymbolrendererv2.h>
24
#include <qgssymbol.h>
26
#include <QPushButton>
29
#include <QFileDialog>
34
#include <QHBoxLayout>
36
#if QT_VERSION >= 0x040400
37
#include <QPlainTextEdit>
40
void QgsAttributeEditor::selectFileName( void )
42
QPushButton *pb = qobject_cast<QPushButton *>( sender() );
46
QWidget *hbox = qobject_cast<QWidget *>( pb->parent() );
50
QLineEdit *le = hbox->findChild<QLineEdit *>();
54
QString fileName = QFileDialog::getOpenFileName( 0 , tr( "Select a file" ) );
55
if ( fileName.isNull() )
58
le->setText( fileName );
61
QComboBox *QgsAttributeEditor::comboBox( QWidget *editor, QWidget *parent )
65
cb = qobject_cast<QComboBox *>( editor );
67
cb = new QComboBox( parent );
72
QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *editor, QgsVectorLayer *vl, int idx, const QVariant &value )
77
QWidget *myWidget = NULL;
78
QgsVectorLayer::EditType editType = vl->editType( idx );
79
const QgsField &field = vl->pendingFields()[idx];
80
QVariant::Type myFieldType = field.type();
84
case QgsVectorLayer::UniqueValues:
86
QList<QVariant> values;
87
vl->dataProvider()->uniqueValues( idx, values );
89
QComboBox *cb = comboBox( editor, parent );
92
cb->setEditable( false );
94
for ( QList<QVariant>::iterator it = values.begin(); it != values.end(); it++ )
95
cb->addItem( it->toString(), it->toString() );
102
case QgsVectorLayer::Enumeration:
104
QStringList enumValues;
105
vl->dataProvider()->enumValues( idx, enumValues );
107
QComboBox *cb = comboBox( editor, parent );
110
QStringList::const_iterator s_it = enumValues.constBegin();
111
for ( ; s_it != enumValues.constEnd(); ++s_it )
113
cb->addItem( *s_it, *s_it );
121
case QgsVectorLayer::ValueMap:
123
const QMap<QString, QVariant> &map = vl->valueMap( idx );
125
QComboBox *cb = comboBox( editor, parent );
128
for ( QMap<QString, QVariant>::const_iterator it = map.begin(); it != map.end(); it++ )
130
cb->addItem( it.key(), it.value() );
138
case QgsVectorLayer::Classification:
140
QMap<QString, QString> classes;
142
const QgsUniqueValueRenderer *uvr = dynamic_cast<const QgsUniqueValueRenderer *>( vl->renderer() );
145
const QList<QgsSymbol *> symbols = uvr->symbols();
147
for ( int i = 0; i < symbols.size(); i++ )
149
QString label = symbols[i]->label();
150
QString name = symbols[i]->lowerValue();
155
classes.insert( name, label );
159
const QgsCategorizedSymbolRendererV2 *csr = dynamic_cast<const QgsCategorizedSymbolRendererV2 *>( vl->rendererV2() );
162
const QgsCategoryList &categories = (( QgsCategorizedSymbolRendererV2 * )csr )->categories(); // FIXME: QgsCategorizedSymbolRendererV2::categories() should be const
163
for ( int i = 0; i < categories.size(); i++ )
165
QString label = categories[i].label();
166
QString value = categories[i].value().toString();
167
if ( label.isEmpty() )
169
classes.insert( label, value );
173
QComboBox *cb = comboBox( editor, parent );
176
for ( QMap<QString, QString>::const_iterator it = classes.begin(); it != classes.end(); it++ )
178
cb->addItem( it.value(), it.key() );
186
case QgsVectorLayer::SliderRange:
187
case QgsVectorLayer::EditRange:
189
if ( myFieldType == QVariant::Int )
191
int min = vl->range( idx ).mMin.toInt();
192
int max = vl->range( idx ).mMax.toInt();
193
int step = vl->range( idx ).mStep.toInt();
195
if ( editType == QgsVectorLayer::EditRange )
200
sb = qobject_cast<QSpinBox *>( editor );
202
sb = new QSpinBox( parent );
206
sb->setRange( min, max );
207
sb->setSingleStep( step );
217
sl = qobject_cast<QSlider*>( editor );
219
sl = new QSlider( Qt::Horizontal, parent );
223
sl->setRange( min, max );
224
sl->setSingleStep( step );
231
else if ( myFieldType == QVariant::Double )
233
QDoubleSpinBox *dsb = NULL;
235
dsb = qobject_cast<QDoubleSpinBox*>( editor );
237
dsb = new QDoubleSpinBox( parent );
241
double min = vl->range( idx ).mMin.toDouble();
242
double max = vl->range( idx ).mMax.toDouble();
243
double step = vl->range( idx ).mStep.toDouble();
245
dsb->setRange( min, max );
246
dsb->setSingleStep( step );
254
case QgsVectorLayer::CheckBox:
256
QCheckBox *cb = NULL;
258
cb = qobject_cast<QCheckBox*>( editor );
260
cb = new QCheckBox( parent );
271
case QgsVectorLayer::LineEdit:
272
case QgsVectorLayer::TextEdit:
273
case QgsVectorLayer::UniqueValuesEditable:
275
QLineEdit *le = NULL;
276
QTextEdit *te = NULL;
277
#if QT_VERSION >= 0x040400
278
QPlainTextEdit *pte = NULL;
283
le = qobject_cast<QLineEdit *>( editor );
284
te = qobject_cast<QTextEdit *>( editor );
285
#if QT_VERSION >= 0x040400
286
pte = qobject_cast<QPlainTextEdit *>( editor );
289
else if ( editType == QgsVectorLayer::TextEdit )
291
#if QT_VERSION >= 0x040400
292
pte = new QPlainTextEdit( parent );
294
te = new QTextEdit( parent );
295
te->setAcceptRichText( false );
300
le = new QLineEdit( parent );
306
if ( editType == QgsVectorLayer::UniqueValuesEditable )
308
QList<QVariant> values;
309
vl->dataProvider()->uniqueValues( idx, values );
312
for ( QList<QVariant>::const_iterator it = values.begin(); it != values.end(); it++ )
313
svalues << it->toString();
315
QCompleter *c = new QCompleter( svalues );
316
c->setCompletionMode( QCompleter::PopupCompletion );
317
le->setCompleter( c );
320
if ( myFieldType == QVariant::Int )
322
le->setValidator( new QIntValidator( le ) );
324
else if ( myFieldType == QVariant::Double )
326
le->setValidator( new QDoubleValidator( le ) );
334
#if QT_VERSION >= 0x040400
335
te->setAcceptRichText( true );
340
#if QT_VERSION >= 0x040400
349
case QgsVectorLayer::Hidden:
353
case QgsVectorLayer::FileName:
355
QPushButton *pb = NULL;
356
QLineEdit *le = qobject_cast<QLineEdit *>( editor );
362
if ( editor->parent() )
364
pb = editor->parent()->findChild<QPushButton *>();
369
le = new QLineEdit();
371
pb = new QPushButton( tr( "..." ) );
373
QHBoxLayout *hbl = new QHBoxLayout();
374
hbl->addWidget( le );
375
hbl->addWidget( pb );
377
myWidget = new QWidget( parent );
378
myWidget->setBackgroundRole( QPalette::Window );
379
myWidget->setAutoFillBackground( true );
380
myWidget->setLayout( hbl );
384
connect( pb, SIGNAL( clicked() ), new QgsAttributeEditor( pb ), SLOT( selectFileName() ) );
388
case QgsVectorLayer::Immutable:
393
if ( editType == QgsVectorLayer::Immutable )
395
myWidget->setEnabled( false );
398
setValue( myWidget, vl, idx, value );
403
bool QgsAttributeEditor::retrieveValue( QWidget *widget, QgsVectorLayer *vl, int idx, QVariant &value )
408
const QgsField &theField = vl->pendingFields()[idx];
409
QgsVectorLayer::EditType editType = vl->editType( idx );
410
bool modified = false;
413
QLineEdit *le = qobject_cast<QLineEdit *>( widget );
417
modified = le->isModified();
418
if ( text == "NULL" )
420
text = QString::null;
424
QTextEdit *te = qobject_cast<QTextEdit *>( widget );
427
#if QT_VERSION >= 0x040400
430
text = te->toPlainText();
432
modified = te->document()->isModified();
433
if ( text == "NULL" )
435
text = QString::null;
439
#if QT_VERSION >= 0x040400
440
QPlainTextEdit *pte = qobject_cast<QPlainTextEdit *>( widget );
443
text = pte->toPlainText();
444
modified = pte->document()->isModified();
445
if ( text == "NULL" )
447
text = QString::null;
452
QComboBox *cb = qobject_cast<QComboBox *>( widget );
455
if ( editType == QgsVectorLayer::UniqueValues ||
456
editType == QgsVectorLayer::ValueMap ||
457
editType == QgsVectorLayer::Classification )
459
text = cb->itemData( cb->currentIndex() ).toString();
463
text = cb->currentText();
467
QSpinBox *sb = qobject_cast<QSpinBox *>( widget );
470
text = QString::number( sb->value() );
473
QSlider *slider = qobject_cast<QSlider *>( widget );
476
text = QString::number( slider->value() );
479
QDoubleSpinBox *dsb = qobject_cast<QDoubleSpinBox *>( widget );
482
text = QString::number( dsb->value() );
485
QCheckBox *ckb = qobject_cast<QCheckBox *>( widget );
488
QPair<QString, QString> states = vl->checkedState( idx );
489
text = ckb->isChecked() ? states.first : states.second;
492
le = widget->findChild<QLineEdit *>();
498
switch ( theField.type() )
503
int myIntValue = text.toInt( &ok );
504
if ( ok && !text.isEmpty() )
506
value = QVariant( myIntValue );
511
value = QVariant( theField.type() );
515
case QVariant::Double:
518
double myDblValue = text.toDouble( &ok );
519
if ( ok && !text.isEmpty() )
521
value = QVariant( myDblValue );
526
value = QVariant( theField.type() );
532
value = QVariant( text );
539
bool QgsAttributeEditor::setValue( QWidget *editor, QgsVectorLayer *vl, int idx, const QVariant &value )
544
QgsVectorLayer::EditType editType = vl->editType( idx );
545
const QgsField &field = vl->pendingFields()[idx];
546
QVariant::Type myFieldType = field.type();
550
case QgsVectorLayer::Classification:
551
case QgsVectorLayer::UniqueValues:
552
case QgsVectorLayer::Enumeration:
553
case QgsVectorLayer::ValueMap:
555
QComboBox *cb = qobject_cast<QComboBox *>( editor );
559
int idx = cb->findData( value );
563
cb->setCurrentIndex( idx );
567
case QgsVectorLayer::SliderRange:
568
case QgsVectorLayer::EditRange:
570
if ( myFieldType == QVariant::Int )
572
if ( editType == QgsVectorLayer::EditRange )
574
QSpinBox *sb = qobject_cast<QSpinBox *>( editor );
577
sb->setValue( value.toInt() );
581
QSlider *sl = qobject_cast<QSlider *>( editor );
584
sl->setValue( value.toInt() );
588
else if ( myFieldType == QVariant::Double )
590
QDoubleSpinBox *dsb = qobject_cast<QDoubleSpinBox *>( editor );
593
dsb->setValue( value.toDouble() );
597
case QgsVectorLayer::CheckBox:
599
QCheckBox *cb = qobject_cast<QCheckBox *>( editor );
602
QPair<QString, QString> states = vl->checkedState( idx );
603
cb->setChecked( value == states.first );
610
case QgsVectorLayer::LineEdit:
611
case QgsVectorLayer::UniqueValuesEditable:
612
case QgsVectorLayer::Immutable:
615
QLineEdit *le = qobject_cast<QLineEdit *>( editor );
616
QTextEdit *te = qobject_cast<QTextEdit *>( editor );
617
#if QT_VERSION >= 0x040400
618
QPlainTextEdit *pte = qobject_cast<QPlainTextEdit *>( editor );
619
if ( !le && !te && !pte )
627
if ( value.isNull() )
628
if ( myFieldType == QVariant::Int || myFieldType == QVariant::Double )
633
text = value.toString();
637
#if QT_VERSION >= 0x040400
641
pte->setPlainText( text );
644
te->setPlainText( text );
649
case QgsVectorLayer::FileName:
651
QLineEdit *le = editor->findChild<QLineEdit *>();
654
le->setText( value.toString() );