Skip to content

Commit 4363198

Browse files
committedMay 24, 2013
[Fix #7867] Fix field properties config dialog
1 parent 06836fb commit 4363198

File tree

2 files changed

+124
-66
lines changed

2 files changed

+124
-66
lines changed
 

‎src/app/qgsfieldsproperties.cpp

Lines changed: 101 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ void QgsFieldsProperties::loadRows()
316316
void QgsFieldsProperties::setRow( int row, int idx, const QgsField &field )
317317
{
318318
mAttributesList->setItem( row, attrIdCol, new QTableWidgetItem( QString::number( idx ) ) );
319+
mIndexedWidgets.insert( idx, mAttributesList->item( row, 0 ) );
319320
mAttributesList->setItem( row, attrNameCol, new QTableWidgetItem( field.name() ) );
320321
mAttributesList->setItem( row, attrTypeCol, new QTableWidgetItem( field.typeName() ) );
321322
mAttributesList->setItem( row, attrLengthCol, new QTableWidgetItem( QString::number( field.length() ) ) );
@@ -325,10 +326,14 @@ void QgsFieldsProperties::setRow( int row, int idx, const QgsField &field )
325326
for ( int i = 0; i < attrEditTypeCol; i++ )
326327
mAttributesList->item( row, i )->setFlags( mAttributesList->item( row, i )->flags() & ~Qt::ItemIsEditable );
327328

328-
QPushButton *pb = new QPushButton( editTypeButtonText( mLayer->editType( idx ) ) );
329+
FieldConfig cfg( mLayer, idx );
330+
cfg.mEditType = mLayer->editType( idx );
331+
QPushButton *pb = new QPushButton( editTypeButtonText( cfg.mEditType ) );
329332
mAttributesList->setCellWidget( row, attrEditTypeCol, pb );
330333
connect( pb, SIGNAL( pressed() ), this, SLOT( attributeTypeDialog( ) ) );
331-
mButtonMap.insert( idx, pb );
334+
335+
cfg.mButton = pb;
336+
setConfigForRow( row, cfg );
332337

333338
//set the alias for the attribute
334339
mAttributesList->setItem( row, attrAliasCol, new QTableWidgetItem( mLayer->attributeAlias( idx ) ) );
@@ -455,56 +460,66 @@ void QgsFieldsProperties::attributeTypeDialog()
455460
if ( !pb )
456461
return;
457462

458-
int index = mButtonMap.key( pb, -1 );
463+
FieldConfig cfg;
464+
int index = -1;
465+
int row = -1;
466+
467+
foreach ( QTableWidgetItem* wdg, mIndexedWidgets )
468+
{
469+
cfg = wdg->data( Qt::UserRole ).value<FieldConfig>();
470+
if ( cfg.mButton == pb )
471+
{
472+
index = mIndexedWidgets.indexOf( wdg );
473+
row = wdg->row();
474+
break;
475+
}
476+
}
477+
459478
if ( index == -1 )
460479
return;
461480

462481
QgsAttributeTypeDialog attributeTypeDialog( mLayer );
463482

464-
attributeTypeDialog.setValueMap( mValueMaps.value( index, mLayer->valueMap( index ) ) );
465-
attributeTypeDialog.setRange( mRanges.value( index, mLayer->range( index ) ) );
466-
attributeTypeDialog.setValueRelation( mValueRelationData.value( index, mLayer->valueRelation( index ) ) );
483+
attributeTypeDialog.setValueMap( cfg.mValueMap );
484+
attributeTypeDialog.setRange( cfg.mRange );
485+
attributeTypeDialog.setValueRelation( cfg.mValueRelationData );
467486

468-
QPair<QString, QString> checkStates = mCheckedStates.value( index, mLayer->checkedState( index ) );
487+
QPair<QString, QString> checkStates = cfg.mCheckedState;
469488
attributeTypeDialog.setCheckedState( checkStates.first, checkStates.second );
470489

471-
attributeTypeDialog.setDateFormat( mDateFormat.value( index, mLayer->dateFormat( index ) ) );
472-
attributeTypeDialog.setWidgetSize( mWidgetSize.value( index, mLayer->widgetSize( index ) ) );
473-
attributeTypeDialog.setFieldEditable( mFieldEditables.value( index, mLayer->fieldEditable( index ) ) );
490+
attributeTypeDialog.setDateFormat( cfg.mDateFormat );
491+
attributeTypeDialog.setWidgetSize( cfg.mWidgetSize );
492+
attributeTypeDialog.setFieldEditable( cfg.mEditable );
474493

475-
attributeTypeDialog.setIndex( index, mEditTypeMap.value( index, mLayer->editType( index ) ) );
494+
attributeTypeDialog.setIndex( index, cfg.mEditType );
476495

477496
if ( !attributeTypeDialog.exec() )
478497
return;
479498

480-
QgsVectorLayer::EditType editType = attributeTypeDialog.editType();
481-
mEditTypeMap.insert( index, editType );
499+
cfg.mEditType = attributeTypeDialog.editType();
500+
cfg.mEditable = attributeTypeDialog.fieldEditable();
482501

483-
bool isFieldEditable = attributeTypeDialog.fieldEditable();
484-
mFieldEditables.insert( index, isFieldEditable );
485-
486-
QString buttonText;
487-
switch ( editType )
502+
switch ( cfg.mEditType )
488503
{
489504
case QgsVectorLayer::ValueMap:
490-
mValueMaps.insert( index, attributeTypeDialog.valueMap() );
505+
cfg.mValueMap = attributeTypeDialog.valueMap();
491506
break;
492507
case QgsVectorLayer::EditRange:
493508
case QgsVectorLayer::SliderRange:
494509
case QgsVectorLayer::DialRange:
495-
mRanges.insert( index, attributeTypeDialog.rangeData() );
510+
cfg.mRange = attributeTypeDialog.rangeData();
496511
break;
497512
case QgsVectorLayer::CheckBox:
498-
mCheckedStates.insert( index, attributeTypeDialog.checkedState() );
513+
cfg.mCheckedState = attributeTypeDialog.checkedState();
499514
break;
500515
case QgsVectorLayer::ValueRelation:
501-
mValueRelationData.insert( index, attributeTypeDialog.valueRelationData() );
516+
cfg.mValueRelationData = attributeTypeDialog.valueRelationData();
502517
break;
503518
case QgsVectorLayer::Calendar:
504-
mDateFormat.insert( index, attributeTypeDialog.dateFormat() );
519+
cfg.mDateFormat = attributeTypeDialog.dateFormat();
505520
break;
506521
case QgsVectorLayer::Photo:
507-
mWidgetSize.insert( index, attributeTypeDialog.widgetSize() );
522+
cfg.mWidgetSize = attributeTypeDialog.widgetSize();
508523
break;
509524
case QgsVectorLayer::LineEdit:
510525
case QgsVectorLayer::TextEdit:
@@ -521,7 +536,9 @@ void QgsFieldsProperties::attributeTypeDialog()
521536
break;
522537
}
523538

524-
pb->setText( editTypeButtonText( editType ) );
539+
setConfigForRow( row, cfg );
540+
541+
pb->setText( editTypeButtonText( cfg.mEditType ) );
525542
}
526543

527544

@@ -533,7 +550,6 @@ void QgsFieldsProperties::attributeAdded( int idx )
533550
int row = mAttributesList->rowCount();
534551
mAttributesList->insertRow( row );
535552
setRow( row, idx, fields[idx] );
536-
mIndexedWidgets.insert( idx, mAttributesList->item( row, 0 ) );
537553

538554
for ( int i = idx; i < mIndexedWidgets.count(); i++ )
539555
{
@@ -594,6 +610,36 @@ void QgsFieldsProperties::editingToggled()
594610
updateButtons();
595611
}
596612

613+
QgsFieldsProperties::FieldConfig QgsFieldsProperties::configForRow( int row )
614+
{
615+
foreach ( QTableWidgetItem* wdg , mIndexedWidgets )
616+
{
617+
if ( wdg->row() == row )
618+
{
619+
return wdg->data( Qt::UserRole ).value<FieldConfig>();
620+
}
621+
}
622+
623+
// Should never get here
624+
Q_ASSERT( false );
625+
return FieldConfig();
626+
}
627+
628+
void QgsFieldsProperties::setConfigForRow( int row, QgsFieldsProperties::FieldConfig cfg )
629+
{
630+
foreach ( QTableWidgetItem* wdg , mIndexedWidgets )
631+
{
632+
if ( wdg->row() == row )
633+
{
634+
wdg->setData( Qt::UserRole, QVariant::fromValue<FieldConfig>( cfg ) );
635+
return;
636+
}
637+
}
638+
639+
// Should never get here
640+
Q_ASSERT( false );
641+
}
642+
597643
void QgsFieldsProperties::on_mAddAttributeButton_clicked()
598644
{
599645
QgsAddAttrDialog dialog( mLayer, this );
@@ -790,63 +836,42 @@ void QgsFieldsProperties::apply()
790836
for ( int i = 0; i < mAttributesList->rowCount(); i++ )
791837
{
792838
int idx = mAttributesList->item( i, attrIdCol )->text().toInt();
839+
FieldConfig cfg = configForRow( i );
793840

794841
QPushButton *pb = qobject_cast<QPushButton *>( mAttributesList->cellWidget( i, attrEditTypeCol ) );
795842
if ( !pb )
796843
continue;
797844

798-
QgsVectorLayer::EditType editType = editTypeFromButtonText( pb->text() );
799-
mLayer->setEditType( idx, editType );
845+
mLayer->setEditType( idx, cfg.mEditType );
800846

801-
if ( mFieldEditables.contains( idx ) )
802-
mLayer->setFieldEditable( idx, mFieldEditables[idx] );
847+
mLayer->setFieldEditable( idx, cfg.mEditable );
803848

804-
switch ( editType )
849+
switch ( cfg.mEditType )
805850
{
806851
case QgsVectorLayer::ValueMap:
807-
if ( mValueMaps.contains( idx ) )
808-
{
809-
QMap<QString, QVariant> &map = mLayer->valueMap( idx );
810-
map.clear();
811-
map = mValueMaps[idx];
812-
}
852+
mLayer->valueMap( idx ) = cfg.mValueMap;
813853
break;
814854

815855
case QgsVectorLayer::EditRange:
816856
case QgsVectorLayer::SliderRange:
817857
case QgsVectorLayer::DialRange:
818-
if ( mRanges.contains( idx ) )
819-
{
820-
mLayer->range( idx ) = mRanges[idx];
821-
}
858+
mLayer->range( idx ) = cfg.mRange;
822859
break;
823860

824861
case QgsVectorLayer::CheckBox:
825-
if ( mCheckedStates.contains( idx ) )
826-
{
827-
mLayer->setCheckedState( idx, mCheckedStates[idx].first, mCheckedStates[idx].second );
828-
}
862+
mLayer->setCheckedState( idx, cfg.mCheckedState.first, cfg.mCheckedState.second );
829863
break;
830864

831865
case QgsVectorLayer::ValueRelation:
832-
if ( mValueRelationData.contains( idx ) )
833-
{
834-
mLayer->valueRelation( idx ) = mValueRelationData[idx];
835-
}
866+
mLayer->valueRelation( idx ) = cfg.mValueRelationData;
836867
break;
837868

838869
case QgsVectorLayer::Calendar:
839-
if ( mDateFormat.contains( idx ) )
840-
{
841-
mLayer->dateFormat( idx ) = mDateFormat[idx];
842-
}
870+
mLayer->dateFormat( idx ) = cfg.mDateFormat;
843871
break;
844872

845873
case QgsVectorLayer::Photo:
846-
if ( mWidgetSize.contains( idx ) )
847-
{
848-
mLayer->widgetSize( idx ) = mWidgetSize[idx];
849-
}
874+
mLayer->widgetSize( idx ) = cfg.mWidgetSize;
850875
break;
851876

852877
case QgsVectorLayer::LineEdit:
@@ -890,3 +915,22 @@ void QgsFieldsProperties::apply()
890915
mLayer->setExcludeAttributesWMS( excludeAttributesWMS );
891916
mLayer->setExcludeAttributesWFS( excludeAttributesWFS );
892917
}
918+
919+
920+
QgsFieldsProperties::FieldConfig::FieldConfig()
921+
: mButton( NULL )
922+
{
923+
}
924+
925+
QgsFieldsProperties::FieldConfig::FieldConfig( QgsVectorLayer* layer, int idx )
926+
: mButton( NULL )
927+
{
928+
mEditable = layer->fieldEditable( idx );
929+
mValueRelationData = layer->valueRelation( idx );
930+
mValueMap = layer->valueMap( idx );
931+
mRange = layer->range( idx );
932+
mCheckedState = layer->checkedState( idx );
933+
mEditType = layer->editType( idx );
934+
mDateFormat = layer->dateFormat( idx );
935+
mWidgetSize = layer->widgetSize( idx );
936+
}

‎src/app/qgsfieldsproperties.h

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,24 @@ class QgsFieldsProperties : public QWidget, private Ui_QgsFieldsPropertiesBase
4646
{
4747
Q_OBJECT
4848

49+
public:
50+
class FieldConfig
51+
{
52+
public:
53+
FieldConfig();
54+
FieldConfig( QgsVectorLayer* layer, int idx );
55+
56+
bool mEditable;
57+
QgsVectorLayer::ValueRelationData mValueRelationData;
58+
QMap<QString, QVariant> mValueMap;
59+
QgsVectorLayer::RangeData mRange;
60+
QPair<QString, QString> mCheckedState;
61+
QgsVectorLayer::EditType mEditType;
62+
QPushButton* mButton;
63+
QString mDateFormat;
64+
QSize mWidgetSize;
65+
};
66+
4967
public:
5068
QgsFieldsProperties( QgsVectorLayer *layer, QWidget* parent = 0 );
5169

@@ -101,19 +119,13 @@ class QgsFieldsProperties : public QWidget, private Ui_QgsFieldsPropertiesBase
101119
void editingToggled();
102120

103121
protected:
122+
FieldConfig configForRow( int row );
123+
void setConfigForRow( int row, FieldConfig cfg );
124+
104125
QgsVectorLayer* mLayer;
105126
QgsAttributesTree* mAttributesTree;
106127
QTableWidget* mAttributesList;
107128

108-
QMap<int, bool> mFieldEditables;
109-
QMap<int, QgsVectorLayer::ValueRelationData> mValueRelationData;
110-
QMap<int, QMap<QString, QVariant> > mValueMaps;
111-
QMap<int, QgsVectorLayer::RangeData> mRanges;
112-
QMap<int, QPair<QString, QString> > mCheckedStates;
113-
QMap<int, QgsVectorLayer::EditType> mEditTypeMap;
114-
QMap<int, QPushButton*> mButtonMap;
115-
QMap<int, QString> mDateFormat;
116-
QMap<int, QSize> mWidgetSize;
117129
// Holds all the first column items (header: id) of the table.
118130
// The index in the list is the fieldIdx, and therefore acts as a mapping
119131
// between fieldIdx and QTableWidgetItem->row()
@@ -141,4 +153,6 @@ class QgsFieldsProperties : public QWidget, private Ui_QgsFieldsPropertiesBase
141153

142154
};
143155

156+
Q_DECLARE_METATYPE( QgsFieldsProperties::FieldConfig )
157+
144158
#endif // QGSFIELDSPROPERTIES_H

0 commit comments

Comments
 (0)
Please sign in to comment.