From ac4faa4eaa9ba28b9792222d476941a27e67271e Mon Sep 17 00:00:00 2001 From: Gennady Pospelov <g.pospelov@fz-juelich.de> Date: Thu, 6 Oct 2016 14:13:25 +0200 Subject: [PATCH] LinkInstrumentManager now rebuild maps of instrument->data only on top item insert/remove --- GUI/coregui/Models/RealDataItem.cpp | 4 +- .../LinkInstrumentManager.cpp | 76 ++++++++++++------- .../ImportDataWidgets/LinkInstrumentManager.h | 3 + 3 files changed, 53 insertions(+), 30 deletions(-) diff --git a/GUI/coregui/Models/RealDataItem.cpp b/GUI/coregui/Models/RealDataItem.cpp index 84b25ac5657..df1fcf3d391 100644 --- a/GUI/coregui/Models/RealDataItem.cpp +++ b/GUI/coregui/Models/RealDataItem.cpp @@ -110,8 +110,8 @@ void RealDataItem::setOutputData(OutputData<double> *data) void RealDataItem::linkToInstrument(const InstrumentItem *instrument) { - if(m_linkedInstrument == instrument) - return; +// if(m_linkedInstrument == instrument) +// return; m_linkedInstrument = instrument; updateToInstrument(); diff --git a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp index 41a2b49ff2f..98824ffd7c2 100644 --- a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp +++ b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp @@ -48,7 +48,7 @@ LinkInstrumentManager::LinkInstrumentManager(QObject *parent) , m_instrumentModel(0) , m_realDataModel(0) { - connect(this, SIGNAL(instrumentMapUpdated()), this, SLOT(updateLinks())); +// connect(this, SIGNAL(instrumentMapUpdated()), this, SLOT(updateLinks())); } void LinkInstrumentManager::setModels(InstrumentModel *instrumentModel, @@ -57,6 +57,8 @@ void LinkInstrumentManager::setModels(InstrumentModel *instrumentModel, setInstrumentModel(instrumentModel); setRealDataModel(realDataModel); updateInstrumentMap(); + updateRealDataMap(); + updateLinks(); } @@ -64,7 +66,7 @@ void LinkInstrumentManager::setOnInstrumentPropertyChange(SessionItem *instrumen { Q_ASSERT(instrument); qDebug() << "LinkInstrumentManager::setOnInstrumentPropertyChange" << instrument->itemName() << property; - if(property == SessionItem::P_NAME) { + if(property == SessionItem::P_NAME || property == InstrumentItem::P_IDENTIFIER) { updateInstrumentMap(); } } @@ -72,7 +74,6 @@ void LinkInstrumentManager::setOnInstrumentPropertyChange(SessionItem *instrumen void LinkInstrumentManager::setOnRealDataPropertyChange(SessionItem *dataItem, const QString &property) { qDebug() << "AAAAA setOnRealDataPropertyChange" << dataItem << property; - if(property == RealDataItem::P_INSTRUMENT_ID) { qDebug() << "AAAAA 2.1"; RealDataItem *realDataItem = dynamic_cast<RealDataItem *>(dataItem); @@ -80,25 +81,48 @@ void LinkInstrumentManager::setOnRealDataPropertyChange(SessionItem *dataItem, c realDataItem->linkToInstrument(getInstrument(identifier)); qDebug() << "AAAAA 2.2"; } +} + +//! Updates map of instruments on insert/remove instrument. + +void LinkInstrumentManager::onInstrumentRowsChange(const QModelIndex &parent, int, int) +{ + // valid parent means not an instrument (which is top level item) but something below + if(parent.isValid()) + return; + updateInstrumentMap(); + updateLinks(); +} + +//! Updates map of data on insert/remove event. + +void LinkInstrumentManager::onRealDataRowsChange(const QModelIndex &parent, int, int) +{ + // valid parent means not a data (which is top level item) but something below + if(parent.isValid()) + return; + + updateRealDataMap(); + updateLinks(); } void LinkInstrumentManager::setInstrumentModel(InstrumentModel *model) { if (m_instrumentModel) { disconnect(m_instrumentModel, SIGNAL(rowsInserted(QModelIndex, int, int)), - this, SLOT(updateInstrumentMap())); + this, SLOT(onInstrumentRowsChange(QModelIndex,int,int))); disconnect(m_instrumentModel, SIGNAL(rowsRemoved(QModelIndex, int, int)), - this, SLOT(updateInstrumentMap())); + this, SLOT(onInstrumentRowsChange(QModelIndex, int, int))); } m_instrumentModel = model; if (m_instrumentModel) { connect(m_instrumentModel, SIGNAL(rowsInserted(QModelIndex, int, int)), - this, SLOT(updateInstrumentMap())); + this, SLOT(onInstrumentRowsChange(QModelIndex, int, int))); connect(m_instrumentModel, SIGNAL(rowsRemoved(QModelIndex, int, int)), - this, SLOT(updateInstrumentMap())); + this, SLOT(onInstrumentRowsChange(QModelIndex, int, int))); } } @@ -107,18 +131,18 @@ void LinkInstrumentManager::setRealDataModel(RealDataModel *model) { if (m_realDataModel) { disconnect(m_realDataModel, SIGNAL(rowsInserted(QModelIndex, int, int)), - this, SLOT(updateRealDataMap())); + this, SLOT(onRealDataRowsChange(QModelIndex, int, int))); disconnect(m_realDataModel, SIGNAL(rowsRemoved(QModelIndex, int, int)), - this, SLOT(updateRealDataMap())); + this, SLOT(onRealDataRowsChange(QModelIndex, int, int))); } m_realDataModel = model; if (m_realDataModel) { connect(m_realDataModel, SIGNAL(rowsInserted(QModelIndex, int, int)), - this, SLOT(updateRealDataMap())); + this, SLOT(onRealDataRowsChange(QModelIndex, int, int))); connect(m_realDataModel, SIGNAL(rowsRemoved(QModelIndex, int, int)), - this, SLOT(updateRealDataMap())); + this, SLOT(onRealDataRowsChange(QModelIndex, int, int))); } } @@ -187,7 +211,7 @@ bool LinkInstrumentManager::canLinkDataToInstrument(const RealDataItem *realData { InstrumentItem *instrumentItem = getInstrument(identifier); - // linking to null instrument is possible, it means unlinking from previous one + // linking to null instrument is possible, it means unlinking from currently linked if(instrumentItem == nullptr) return true; @@ -224,11 +248,19 @@ bool LinkInstrumentManager::canLinkDataToInstrument(const RealDataItem *realData void LinkInstrumentManager::updateLinks() { - foreach(SessionItem *dataItem, m_realDataModel->topItems(Constants::RealDataType)) { - QString identifier = dataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString(); - if(!getInstrument(identifier)) { - dataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, QString()); + foreach(SessionItem *item, m_realDataModel->topItems(Constants::RealDataType)) { + RealDataItem *realDataItem = dynamic_cast<RealDataItem *>(item); + Q_ASSERT(realDataItem); + + QString identifier = realDataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString(); + InstrumentItem *instrumentItem = getInstrument(identifier); + + if(!instrumentItem) { + realDataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, QString()); + } else { + realDataItem->linkToInstrument(instrumentItem); } + } } @@ -260,18 +292,6 @@ void LinkInstrumentManager::updateRealDataMap() foreach(SessionItem *dataItem, m_realDataModel->topItems(Constants::RealDataType)) { dataItem->mapper()->unsubscribe(this); -// QString identifier = dataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString(); -// QString instrName = instrumentNameFromIdentifier(identifier); -// if(instrName == undefinedInstrumentName) { -// dataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, QString()); -// } - -// ComboProperty combo = ComboProperty() << instrumentNames(); -// combo.setValue(instrName); - -// dataItem->setItemValue(RealDataItem::P_INSTRUMENT_COMBO, combo.getVariant()); -// dataItem->setItemValue(RealDataItem::P_INSTRUMENT_NAME, instrName); - dataItem->mapper()->setOnPropertyChange( [this, dataItem](const QString &name) { diff --git a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h index e73d6b202a6..32b7d7fc87d 100644 --- a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h +++ b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.h @@ -57,6 +57,9 @@ public slots: void setOnInstrumentPropertyChange(SessionItem *instrument, const QString &property); void setOnRealDataPropertyChange(SessionItem *dataItem, const QString &property); + void onInstrumentRowsChange(const QModelIndex & parent, int, int); + void onRealDataRowsChange(const QModelIndex & parent, int, int); + private slots: void updateLinks(); void updateInstrumentMap(); -- GitLab