# HG changeset patch # User Chris Cannam # Date 1279559336 0 # Node ID aced8ec09bc839a95049699f12602e3543764fd8 # Parent e15afed2bfeb5ab91fb039d0d1a97353a447113e * Complete the overhaul of CSV file import; now you can pick the purpose for each column in the file, and SV should do the rest. The most significant practical improvement here is that we can now handle files in which time and duration do not necessarily appear in known columns. diff -r e15afed2bfeb -r aced8ec09bc8 widgets/CSVFormatDialog.cpp --- a/widgets/CSVFormatDialog.cpp Fri Jul 16 16:51:39 2010 +0000 +++ b/widgets/CSVFormatDialog.cpp Mon Jul 19 17:08:56 2010 +0000 @@ -15,6 +15,8 @@ #include "CSVFormatDialog.h" +#include "layer/LayerFactory.h" + #include #include #include @@ -45,6 +47,7 @@ exampleFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); exampleFrame->setLineWidth(2); QGridLayout *exampleLayout = new QGridLayout; + exampleLayout->setSpacing(4); exampleFrame->setLayout(exampleLayout); QPalette palette = exampleFrame->palette(); @@ -52,9 +55,10 @@ exampleFrame->setPalette(palette); QFont fp; - fp.setFixedPitch(true); - fp.setStyleHint(QFont::TypeWriter); - fp.setFamily("Monospaced"); + fp.setPointSize(fp.pointSize() * 0.9); +// fp.setFixedPitch(true); +// fp.setStyleHint(QFont::TypeWriter); +// fp.setFamily("Monospaced"); int columns = format.getColumnCount(); QList example = m_format.getExample(); @@ -82,6 +86,7 @@ label->setText(example[j][i]); label->setFont(fp); label->setPalette(palette); + label->setIndent(8); exampleLayout->addWidget(label, j+1, i); } } @@ -91,18 +96,6 @@ layout->setColumnStretch(3, 10); layout->setRowStretch(row++, 10); - layout->addWidget(new QLabel(tr("Each row describes:")), row, 0); - - m_modelTypeCombo = new QComboBox; - m_modelTypeCombo->addItem(tr("A point in time")); - m_modelTypeCombo->addItem(tr("A value at a time")); - m_modelTypeCombo->addItem(tr("A value across a time range")); - m_modelTypeCombo->addItem(tr("A set of values")); - layout->addWidget(m_modelTypeCombo, row++, 1, 1, 2); - connect(m_modelTypeCombo, SIGNAL(activated(int)), - this, SLOT(modelTypeChanged(int))); - m_modelTypeCombo->setCurrentIndex(int(m_format.getModelType())); - layout->addWidget(new QLabel(tr("Timing is specified:")), row, 0); m_timingTypeCombo = new QComboBox; @@ -158,6 +151,12 @@ connect(m_windowSizeCombo, SIGNAL(editTextChanged(QString)), this, SLOT(windowSizeChanged(QString))); + m_modelLabel = new QLabel; + QFont f(m_modelLabel->font()); + f.setItalic(true); + m_modelLabel->setFont(f); + layout->addWidget(m_modelLabel, row++, 0, 1, 4); + QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); layout->addWidget(bb, row++, 0, 1, 4); @@ -166,8 +165,8 @@ setLayout(layout); - modelTypeChanged(m_modelTypeCombo->currentIndex()); timingTypeChanged(m_timingTypeCombo->currentIndex()); + updateModelLabel(); } CSVFormatDialog::~CSVFormatDialog() @@ -181,9 +180,27 @@ } void -CSVFormatDialog::modelTypeChanged(int type) +CSVFormatDialog::updateModelLabel() { - m_format.setModelType((CSVFormat::ModelType)type); + LayerFactory *f = LayerFactory::getInstance(); + + QString s; + switch (m_format.getModelType()) { + case CSVFormat::OneDimensionalModel: + s = f->getLayerPresentationName(LayerFactory::TimeInstants); + break; + case CSVFormat::TwoDimensionalModel: + s = f->getLayerPresentationName(LayerFactory::TimeValues); + break; + case CSVFormat::TwoDimensionalModelWithDuration: + s = f->getLayerPresentationName(LayerFactory::Regions); + break; + case CSVFormat::ThreeDimensionalModel: + s = f->getLayerPresentationName(LayerFactory::Colour3DPlot); + break; + } + + m_modelLabel->setText("\n" + QString("Data will be displayed in a %1 layer.").arg(s)); } void @@ -237,23 +254,87 @@ } void -CSVFormatDialog::columnPurposeChanged(int purpose) +CSVFormatDialog::columnPurposeChanged(int p) { QObject *o = sender(); + QComboBox *cb = qobject_cast(o); if (!cb) return; - int changedCol = -1; + + CSVFormat::ColumnPurpose purpose = (CSVFormat::ColumnPurpose)p; + + bool haveStartTime = false; + bool haveDuration = false; + int valueCount = 0; + for (int i = 0; i < m_columnPurposeCombos.size(); ++i) { - if (cb == m_columnPurposeCombos[i]) { - changedCol = i; - break; + + CSVFormat::ColumnPurpose cp = m_format.getColumnPurpose(i); + + bool thisChanged = (cb == m_columnPurposeCombos[i]); + + if (thisChanged) { + + cp = purpose; + + } else { + + // We can only have one ColumnStartTime column, and only + // one of either ColumnDuration or ColumnEndTime + + if (purpose == CSVFormat::ColumnStartTime) { + if (cp == purpose) { + cp = CSVFormat::ColumnValue; + } + } else if (purpose == CSVFormat::ColumnDuration || + purpose == CSVFormat::ColumnEndTime) { + if (cp == CSVFormat::ColumnDuration || + cp == CSVFormat::ColumnEndTime) { + cp = CSVFormat::ColumnValue; + } + } + + // And we can only have one label + if (purpose == CSVFormat::ColumnLabel) { + if (cp == purpose) { + cp = CSVFormat::ColumnUnknown; + } + } + } + + if (cp == CSVFormat::ColumnStartTime) { + haveStartTime = true; + } + if (cp == CSVFormat::ColumnEndTime || + cp == CSVFormat::ColumnDuration) { + haveDuration = true; + } + if (cp == CSVFormat::ColumnValue) { + ++valueCount; + } + + m_columnPurposeCombos[i]->setCurrentIndex(int(cp)); + m_format.setColumnPurpose(i, cp); + } + + if (!haveStartTime) { + m_timingTypeCombo->setCurrentIndex(2); + timingTypeChanged(2); + } + + if (haveStartTime && haveDuration) { + m_format.setModelType(CSVFormat::TwoDimensionalModelWithDuration); + } else { + if (valueCount > 1) { + m_format.setModelType(CSVFormat::ThreeDimensionalModel); + } else if (valueCount > 0) { + m_format.setModelType(CSVFormat::TwoDimensionalModel); + } else { + m_format.setModelType(CSVFormat::OneDimensionalModel); } } - if (changedCol < 0) { - std::cerr << "Hm, some problem here -- column combo changed, but cannot locate column" << std::endl; - return; - } - + + updateModelLabel(); } diff -r e15afed2bfeb -r aced8ec09bc8 widgets/CSVFormatDialog.h --- a/widgets/CSVFormatDialog.h Fri Jul 16 16:51:39 2010 +0000 +++ b/widgets/CSVFormatDialog.h Mon Jul 19 17:08:56 2010 +0000 @@ -35,21 +35,21 @@ CSVFormat getFormat() const; protected slots: - void modelTypeChanged(int type); void timingTypeChanged(int type); void sampleRateChanged(QString); void windowSizeChanged(QString); void columnPurposeChanged(int purpose); + void updateModelLabel(); protected: CSVFormat m_format; - QComboBox *m_modelTypeCombo; QComboBox *m_timingTypeCombo; QLabel *m_sampleRateLabel; QComboBox *m_sampleRateCombo; QLabel *m_windowSizeLabel; QComboBox *m_windowSizeCombo; + QLabel *m_modelLabel; QList m_columnPurposeCombos; };