attribute editor fixes:

- in attribute table: set minimum width of editor to columns width and height
  of filename widget to two times the lineedit height
- fix non-editable unique value editor (was editable)
- fix enum support
- add support for symbology-ng categories



git-svn-id: http://svn.osgeo.org/qgis/trunk@12545 c8812cc2-4d05-0410-92ff-de0c093fc19c
This commit is contained in:
jef 2009-12-20 18:13:22 +00:00
parent cace1e2468
commit e863e7d596
4 changed files with 92 additions and 54 deletions

View File

@ -59,10 +59,25 @@ QWidget *QgsAttributeTableDelegate::createEditor(
const QModelIndex &index ) const
{
QgsVectorLayer *vl = layer( index.model() );
if ( vl == NULL )
if ( !vl )
return NULL;
return QgsAttributeEditor::createAttributeEditor( parent, 0, vl, fieldIdx( index ), index.model()->data( index, Qt::EditRole ) );
QWidget *w = QgsAttributeEditor::createAttributeEditor( parent, 0, vl, fieldIdx( index ), index.model()->data( index, Qt::EditRole ) );
if ( parent )
{
QgsAttributeTableView *tv = dynamic_cast<QgsAttributeTableView *>( parent->parentWidget() );
w->setMinimumWidth( tv->columnWidth( index.column() ) );
if ( vl->editType( fieldIdx( index ) ) == QgsVectorLayer::FileName )
{
QLineEdit *le = w->findChild<QLineEdit*>();
le->adjustSize();
w->setMinimumHeight( le->height()*2 ); // FIXME: there must be a better way to do this
}
}
return w;
}
void QgsAttributeTableDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
@ -85,7 +100,6 @@ void QgsAttributeTableDelegate::setEditorData( QWidget *editor, const QModelInde
return;
QgsAttributeEditor::setValue( editor, vl, fieldIdx( index ), index.model()->data( index, Qt::EditRole ) );
editor->adjustSize();
}
void QgsAttributeTableDelegate::paint( QPainter * painter,

View File

@ -66,7 +66,6 @@ class QgsAttributeTableDelegate : public QItemDelegate
* @param index index of field which is to be retrieved
*/
void setEditorData( QWidget *editor, const QModelIndex &index ) const;
};
#endif //QGSATTRIBUTETABLEDELEGATE_H

View File

@ -20,6 +20,7 @@
#include <qgsvectorlayer.h>
#include <qgsvectordataprovider.h>
#include <qgsuniquevaluerenderer.h>
#include <qgscategorizedsymbolrendererv2.h>
#include <qgssymbol.h>
#include <QPushButton>
@ -88,10 +89,10 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
QComboBox *cb = comboBox( editor, parent );
if ( cb )
{
cb->setEditable( true );
cb->setEditable( false );
for ( QList<QVariant>::iterator it = values.begin(); it != values.end(); it++ )
cb->addItem( it->toString() );
cb->addItem( it->toString(), it->toString() );
myWidget = cb;
}
@ -109,7 +110,7 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
QStringList::const_iterator s_it = enumValues.constBegin();
for ( ; s_it != enumValues.constEnd(); ++s_it )
{
cb->addItem( *s_it );
cb->addItem( *s_it, *s_it );
}
myWidget = cb;
@ -136,14 +137,11 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
case QgsVectorLayer::Classification:
{
int classificationField = -1;
QMap<QString, QString> classes;
const QgsUniqueValueRenderer *uvr = dynamic_cast<const QgsUniqueValueRenderer *>( vl->renderer() );
if ( uvr )
{
classificationField = uvr->classificationField();
const QList<QgsSymbol *> symbols = uvr->symbols();
for ( int i = 0; i < symbols.size(); i++ )
@ -158,6 +156,20 @@ QWidget *QgsAttributeEditor::createAttributeEditor( QWidget *parent, QWidget *ed
}
}
const QgsCategorizedSymbolRendererV2 *csr = dynamic_cast<const QgsCategorizedSymbolRendererV2 *>( vl->rendererV2() );
if ( csr )
{
const QgsCategoryList &categories = (( QgsCategorizedSymbolRendererV2 * )csr )->categories(); // FIXME: QgsCategorizedSymbolRendererV2::categories() should be const
for ( int i = 0; i < categories.size(); i++ )
{
QString label = categories[i].label();
QString value = categories[i].value().toString();
if ( label.isEmpty() )
label = value;
classes.insert( label, value );
}
}
QComboBox *cb = comboBox( editor, parent );
if ( cb )
{

View File

@ -344,61 +344,74 @@ void QgsAttributeTypeDialog::setIndex( int index, int editTypeInt )
//setPageForIndex( index );
setPageForEditType( editType );
if ( editType == QgsVectorLayer::ValueMap )
switch ( editType )
{
case QgsVectorLayer::ValueMap:
{
tableWidget->clearContents();
for ( int i = tableWidget->rowCount() - 1; i > 0; i-- )
{
tableWidget->removeRow( i );
}
// if some value map already present use it
QMap<QString, QVariant> map;
if ( !mValueMap.empty() )
{
map = mValueMap;
}
else
{
map = mLayer->valueMap( index );
}
int row = 0;
for ( QMap<QString, QVariant>::iterator mit = map.begin(); mit != map.end(); mit++, row++ )
{
tableWidget->insertRow( row );
if ( mit.value().isNull() )
tableWidget->clearContents();
for ( int i = tableWidget->rowCount() - 1; i > 0; i-- )
{
tableWidget->setItem( row, 0, new QTableWidgetItem( mit.key() ) );
tableWidget->removeRow( i );
}
// if some value map already present use it
QMap<QString, QVariant> map;
if ( !mValueMap.empty() )
{
map = mValueMap;
}
else
{
tableWidget->setItem( row, 0, new QTableWidgetItem( mit.value().toString() ) );
tableWidget->setItem( row, 1, new QTableWidgetItem( mit.key() ) );
map = mLayer->valueMap( index );
}
int row = 0;
for ( QMap<QString, QVariant>::iterator mit = map.begin(); mit != map.end(); mit++, row++ )
{
tableWidget->insertRow( row );
if ( mit.value().isNull() )
{
tableWidget->setItem( row, 0, new QTableWidgetItem( mit.key() ) );
}
else
{
tableWidget->setItem( row, 0, new QTableWidgetItem( mit.value().toString() ) );
tableWidget->setItem( row, 1, new QTableWidgetItem( mit.key() ) );
}
}
}
}
else if ( editType == QgsVectorLayer::EditRange ||
editType == QgsVectorLayer::SliderRange )
{
if ( mLayer->pendingFields()[mIndex].type() != QVariant::Int )
{
minimumSpinBox->setValue( mLayer->range( index ).mMin.toInt() );
maximumSpinBox->setValue( mLayer->range( index ).mMax.toInt() );
stepSpinBox->setValue( mLayer->range( index ).mStep.toInt() );
}
else if ( mLayer->pendingFields()[mIndex].type() == QVariant::Double )
break;
case QgsVectorLayer::EditRange:
case QgsVectorLayer::SliderRange:
{
minimumDoubleSpinBox->setValue( mLayer->range( index ).mMin.toDouble() );
maximumDoubleSpinBox->setValue( mLayer->range( index ).mMax.toDouble() );
stepDoubleSpinBox->setValue( mLayer->range( index ).mStep.toDouble() );
if ( mLayer->pendingFields()[mIndex].type() != QVariant::Int )
{
minimumSpinBox->setValue( mLayer->range( index ).mMin.toInt() );
maximumSpinBox->setValue( mLayer->range( index ).mMax.toInt() );
stepSpinBox->setValue( mLayer->range( index ).mStep.toInt() );
}
else if ( mLayer->pendingFields()[mIndex].type() == QVariant::Double )
{
minimumDoubleSpinBox->setValue( mLayer->range( index ).mMin.toDouble() );
maximumDoubleSpinBox->setValue( mLayer->range( index ).mMax.toDouble() );
stepDoubleSpinBox->setValue( mLayer->range( index ).mStep.toDouble() );
}
if ( editType == QgsVectorLayer::EditRange )
editableRadioButton->setChecked( true );
else //slider range
sliderRadioButton->setChecked( true );
}
if ( editType == QgsVectorLayer::EditRange )
editableRadioButton->setChecked( true );
else //slider range
sliderRadioButton->setChecked( true );
break;
case QgsVectorLayer::UniqueValuesEditable:
editableUniqueValues->setChecked( editType == QgsVectorLayer::UniqueValuesEditable );
break;
default:
break;
}
}