# HG changeset patch # User Chris Cannam # Date 1223558013 0 # Node ID ba7aaacb7211663780b9409a3a0c8088adf4e484 # Parent 1f15beefcd76caf8e102f8f3335ea4ced9b3bff7 * Support transforms that output regions with more than one bin (by creating more than one region) * When model displayed in the spreadsheet dialog is deleted, close the dialog in preference to crashing diff -r 1f15beefcd76 -r ba7aaacb7211 data/model/ModelDataTableModel.cpp --- a/data/model/ModelDataTableModel.cpp Thu Oct 09 12:22:02 2008 +0000 +++ b/data/model/ModelDataTableModel.cpp Thu Oct 09 13:13:33 2008 +0000 @@ -33,6 +33,8 @@ connect(baseModel, SIGNAL(modelChanged()), this, SLOT(modelChanged())); connect(baseModel, SIGNAL(modelChanged(size_t, size_t)), this, SLOT(modelChanged(size_t, size_t))); + connect(baseModel, SIGNAL(aboutToBeDeleted()), + this, SLOT(modelAboutToBeDeleted())); } ModelDataTableModel::~ModelDataTableModel() @@ -42,6 +44,7 @@ QVariant ModelDataTableModel::data(const QModelIndex &index, int role) const { + if (!m_model) return QVariant(); if (role != Qt::EditRole && role != Qt::DisplayRole) return QVariant(); if (!index.isValid()) return QVariant(); return m_model->getData(getUnsorted(index.row()), index.column(), role); @@ -50,6 +53,7 @@ bool ModelDataTableModel::setData(const QModelIndex &index, const QVariant &value, int role) { + if (!m_model) return false; if (!index.isValid()) return false; Command *command = m_model->getSetDataCommand(getUnsorted(index.row()), index.column(), @@ -65,6 +69,7 @@ bool ModelDataTableModel::insertRow(int row, const QModelIndex &parent) { + if (!m_model) return false; if (parent.isValid()) return false; emit beginInsertRows(parent, row, row); @@ -83,6 +88,7 @@ bool ModelDataTableModel::removeRow(int row, const QModelIndex &parent) { + if (!m_model) return false; if (parent.isValid()) return false; emit beginRemoveRows(parent, row, row); @@ -109,6 +115,8 @@ QVariant ModelDataTableModel::headerData(int section, Qt::Orientation orientation, int role) const { + if (!m_model) return QVariant(); + if (orientation == Qt::Vertical && role == Qt::DisplayRole) { return section + 1; } @@ -133,6 +141,7 @@ int ModelDataTableModel::rowCount(const QModelIndex &parent) const { + if (!m_model) return 0; if (parent.isValid()) return 0; return m_model->getRowCount(); } @@ -140,6 +149,7 @@ int ModelDataTableModel::columnCount(const QModelIndex &parent) const { + if (!m_model) return 0; if (parent.isValid()) return 0; return m_model->getColumnCount(); } @@ -147,6 +157,7 @@ QModelIndex ModelDataTableModel::getModelIndexForFrame(size_t frame) const { + if (!m_model) return createIndex(0, 0); int row = m_model->getRowForFrame(frame); return createIndex(getSorted(row), 0, 0); } @@ -154,6 +165,7 @@ size_t ModelDataTableModel::getFrameForModelIndex(const QModelIndex &index) const { + if (!m_model) return 0; return m_model->getFrameForRow(getUnsorted(index.row())); } @@ -191,9 +203,18 @@ emit layoutChanged(); } +void +ModelDataTableModel::modelAboutToBeDeleted() +{ + m_model = 0; + emit modelRemoved(); +} + int ModelDataTableModel::getSorted(int row) const { + if (!m_model) return row; + if (m_model->isColumnTimeValue(m_sortColumn)) { if (m_sortOrdering == Qt::AscendingOrder) { return row; @@ -219,6 +240,8 @@ int ModelDataTableModel::getUnsorted(int row) const { + if (!m_model) return row; + if (m_model->isColumnTimeValue(m_sortColumn)) { if (m_sortOrdering == Qt::AscendingOrder) { return row; @@ -246,6 +269,8 @@ void ModelDataTableModel::resort() const { + if (!m_model) return; + bool numeric = (m_model->getSortType(m_sortColumn) == TabularModel::SortNumeric); @@ -275,6 +300,8 @@ void ModelDataTableModel::resortNumeric() const { + if (!m_model) return; + typedef std::multimap MapType; MapType rowMap; @@ -295,6 +322,8 @@ void ModelDataTableModel::resortAlphabetical() const { + if (!m_model) return; + typedef std::multimap MapType; MapType rowMap; diff -r 1f15beefcd76 -r ba7aaacb7211 data/model/ModelDataTableModel.h --- a/data/model/ModelDataTableModel.h Thu Oct 09 12:22:02 2008 +0000 +++ b/data/model/ModelDataTableModel.h Thu Oct 09 13:13:33 2008 +0000 @@ -63,10 +63,12 @@ void frameSelected(size_t); void addCommand(Command *); void currentChanged(const QModelIndex &); + void modelRemoved(); protected slots: void modelChanged(); void modelChanged(size_t, size_t); + void modelAboutToBeDeleted(); protected: TabularModel *m_model; diff -r 1f15beefcd76 -r ba7aaacb7211 transform/FeatureExtractionModelTransformer.cpp --- a/transform/FeatureExtractionModelTransformer.cpp Thu Oct 09 12:22:02 2008 +0000 +++ b/transform/FeatureExtractionModelTransformer.cpp Thu Oct 09 13:13:33 2008 +0000 @@ -633,15 +633,21 @@ } else if (isOutput()) { - float value = 0.0; - if (feature.values.size() > 0) value = feature.values[0]; - SparseTimeValueModel *model = getConformingOutput(); if (!model) return; - model->addPoint(SparseTimeValueModel::Point - (frame, value, feature.label.c_str())); + for (int i = 0; i < feature.values.size(); ++i) { + + float value = feature.values[i]; + + QString label = feature.label.c_str(); + if (feature.values.size() > 1) { + label = QString("[%1] %2").arg(i+1).arg(label); + } + + model->addPoint(SparseTimeValueModel::Point(frame, value, label)); + } } else if (isOutput() || isOutput()) { @@ -678,11 +684,29 @@ feature.label.c_str())); } else { RegionModel *model = getConformingOutput(); - if (model) { + if (!model) return; + + if (feature.hasDuration) { + + for (int i = 0; i < feature.values.size(); ++i) { + + float value = feature.values[i]; + + QString label = feature.label.c_str(); + if (feature.values.size() > 1) { + label = QString("[%1] %2").arg(i+1).arg(label); + } + + model->addPoint(RegionModel::Point(frame, value, + lrintf(duration), + label)); + } + } else { + model->addPoint(RegionModel::Point(frame, value, lrintf(duration), feature.label.c_str())); - } else return; + } } } else if (isOutput()) {