diff --git a/GUI/coregui/Models/InstrumentItems.cpp b/GUI/coregui/Models/InstrumentItems.cpp index 8874acf1db48509cf690147b5fba7080c303f127..4227eda766d2b397a7b791513bcce651e09bf9cb 100644 --- a/GUI/coregui/Models/InstrumentItems.cpp +++ b/GUI/coregui/Models/InstrumentItems.cpp @@ -131,14 +131,13 @@ void SpecularInstrumentItem::updateToRealData(const RealDataItem* item) throw GUIHelpers::Error("Error in SpecularInstrumentItem::updateToRealData: The type " "of instrument is incompatible with passed data shape."); - QString units = item->getItemValue(RealDataItem::P_NATIVE_DATA_UNITS).toString(); const auto& data = item->nativeData()->getOutputData()->axis(0); - beamItem()->updateToData(data, units); + beamItem()->updateToData(data, item->nativeDataUnits()); } bool SpecularInstrumentItem::alignedWith(const RealDataItem* item) const { - const QString native_units = item->getItemValue(RealDataItem::P_NATIVE_DATA_UNITS).toString(); + const QString native_units = item->nativeDataUnits(); if (native_units == "nbins") { return beamItem()->currentInclinationAxisItem()->modelType() == "BasicAxis" && shape() == item->shape(); diff --git a/GUI/coregui/Models/RealDataItem.cpp b/GUI/coregui/Models/RealDataItem.cpp index d708878d79face28972426da0b46f4500c91d6fb..30dcfdca7a8624b7b36d46fb582a6b4fb0078414 100644 --- a/GUI/coregui/Models/RealDataItem.cpp +++ b/GUI/coregui/Models/RealDataItem.cpp @@ -107,6 +107,11 @@ const DataItem* RealDataItem::nativeData() const return dynamic_cast<const DataItem*>(getItem(T_NATIVE_DATA)); } +QString RealDataItem::nativeDataUnits() const +{ + return getItemValue(P_NATIVE_DATA_UNITS).toString(); +} + //! Sets OutputData to underlying item. Creates it, if not exists. void RealDataItem::setOutputData(OutputData<double>* data) @@ -169,6 +174,21 @@ void RealDataItem::linkToInstrument(const InstrumentItem* instrument, bool make_ updateToInstrument(); } +QString RealDataItem::instrumentId() const +{ + return getItemValue(P_INSTRUMENT_ID).toString(); +} + +void RealDataItem::setInstrumentId(const QString& id) +{ + setItemValue(P_INSTRUMENT_ID, id); +} + +void RealDataItem::clearInstrumentId() +{ + setItemValue(P_INSTRUMENT_ID, QString()); +} + std::vector<int> RealDataItem::shape() const { auto data_item = dataItem(); diff --git a/GUI/coregui/Models/RealDataItem.h b/GUI/coregui/Models/RealDataItem.h index 97aa4886dd40640709cf31bd7e89ab51349a3731..a53bb8c3a111cb4889a571872a2c1f42f8d4e757 100644 --- a/GUI/coregui/Models/RealDataItem.h +++ b/GUI/coregui/Models/RealDataItem.h @@ -28,13 +28,19 @@ class ImportDataInfo; //! The RealDataItem class represents intensity data imported from file and intended for fitting. class BA_CORE_API_ RealDataItem : public SessionItem { + + friend class TestView; + public: - static const QString T_INTENSITY_DATA; static const QString P_INSTRUMENT_ID; + +private: + static const QString T_INTENSITY_DATA; static const QString P_INSTRUMENT_NAME; static const QString T_NATIVE_DATA; static const QString P_NATIVE_DATA_UNITS; +public: RealDataItem(); IntensityDataItem* intensityDataItem(); @@ -48,6 +54,7 @@ public: DataItem* nativeData(); const DataItem* nativeData() const; + QString nativeDataUnits() const; void setOutputData(OutputData<double>* data); void setImportData(ImportDataInfo data); @@ -55,6 +62,10 @@ public: void linkToInstrument(const InstrumentItem* instrument, bool make_update = true); + QString instrumentId() const; + void setInstrumentId(const QString& id); + void clearInstrumentId(); + //! Returns the shape of underlying data item std::vector<int> shape() const; diff --git a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp index 7469a8eaa5b5d24cb76498a144ebd8e262e96ddc..151b4e89cf606abfcd02140df4e1b7e4ea0c5ea7 100644 --- a/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp +++ b/GUI/coregui/Views/ImportDataWidgets/LinkInstrumentManager.cpp @@ -141,7 +141,7 @@ void LinkInstrumentManager::setOnRealDataPropertyChange(SessionItem* dataItem, { if (property == RealDataItem::P_INSTRUMENT_ID) { RealDataItem* realDataItem = dynamic_cast<RealDataItem*>(dataItem); - QString identifier = dataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString(); + const QString identifier = realDataItem->instrumentId(); realDataItem->linkToInstrument(instrument(identifier)); } } @@ -185,12 +185,12 @@ void LinkInstrumentManager::onRealDataRowsChange(const QModelIndex& parent, int, void LinkInstrumentManager::updateLinks() { for (auto realDataItem : m_realDataModel->topItems<RealDataItem>()) { - QString identifier = realDataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString(); + const QString identifier = realDataItem->instrumentId(); auto instrumentItem = instrument(identifier); if (!instrumentItem) { // if no instrument with P_INSTRUMENT_ID exists, break the link - realDataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, QString()); + realDataItem->clearInstrumentId(); } else { // refresh the link to update axes realDataItem->linkToInstrument(instrumentItem); @@ -249,7 +249,7 @@ void LinkInstrumentManager::onInstrumentLayoutChange(InstrumentItem* changedInst { for (auto realDataItem : linkedItems(changedInstrument)) if (!changedInstrument->alignedWith(realDataItem)) - realDataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, QString()); + realDataItem->clearInstrumentId(); else realDataItem->linkToInstrument(changedInstrument); } @@ -260,9 +260,8 @@ QList<RealDataItem*> LinkInstrumentManager::linkedItems(InstrumentItem* instrume { QList<RealDataItem*> result; for (auto realDataItem : m_realDataModel->topItems<RealDataItem>()) { - QString linkedIdentifier = - realDataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString(); - QString instrumentIdentifier = + const QString linkedIdentifier = realDataItem->instrumentId(); + const QString instrumentIdentifier = instrumentItem->getItemValue(InstrumentItem::P_IDENTIFIER).toString(); if (linkedIdentifier == instrumentIdentifier) diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.cpp b/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.cpp index 75b54ab76c48f31911279b8fcae064cc7cfdf174..b285a7b2a511ca9d6dd6593561b0de00eff59e66 100644 --- a/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.cpp +++ b/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.cpp @@ -44,7 +44,10 @@ RealDataPropertiesWidget::RealDataPropertiesWidget(QWidget* parent) mainLayout->addStretch(); setLayout(mainLayout); - setComboConnected(true); + connect(m_instrumentCombo, + static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, + &RealDataPropertiesWidget::onInstrumentComboIndexChanged); + connect(m_linkManager, &LinkInstrumentManager::instrumentMapUpdated, this, &RealDataPropertiesWidget::onInstrumentMapUpdate); @@ -85,7 +88,7 @@ void RealDataPropertiesWidget::setItem(SessionItem* item) this); // Set combo selector to show linked instrument - setComboToIdentifier(item->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString()); + setComboToIdentifier(m_currentDataItem->instrumentId()); } //! Processes user interaction with instrument selector combo. If there is realDataItem, @@ -98,17 +101,15 @@ void RealDataPropertiesWidget::onInstrumentComboIndexChanged(int index) if (!m_currentDataItem) return; - QString dataLink = m_currentDataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString(); + QString dataLink = m_currentDataItem->instrumentId(); if (m_current_id == dataLink) return; - if (m_linkManager->canLinkDataToInstrument(m_currentDataItem, m_current_id)) { - m_currentDataItem->setItemValue(RealDataItem::P_INSTRUMENT_ID, m_current_id); - - } else { + if (m_linkManager->canLinkDataToInstrument(m_currentDataItem, m_current_id)) + m_currentDataItem->setInstrumentId(m_current_id); + else // LinkManager doesn't allow to link data to instrument. setComboToIdentifier(dataLink); // Returning Combo selector to previous state - } } //! Updates instrument selector for new instruments and their names. @@ -116,7 +117,8 @@ void RealDataPropertiesWidget::onInstrumentComboIndexChanged(int index) void RealDataPropertiesWidget::onInstrumentMapUpdate() { - setComboConnected(false); + QSignalBlocker b(m_instrumentCombo); + m_instrumentCombo->clear(); m_instrumentCombo->addItems(m_linkManager->instrumentNames()); int index = m_linkManager->instrumentComboIndex(m_current_id); @@ -127,44 +129,26 @@ void RealDataPropertiesWidget::onInstrumentMapUpdate() m_current_id = ""; m_instrumentCombo->setCurrentIndex(0); } - setComboConnected(true); } //! Updates instrument combo on link change of current RealDataItem. void RealDataPropertiesWidget::onRealDataPropertyChanged(const QString& name) { - if (name == RealDataItem::P_INSTRUMENT_ID) { - setComboToIdentifier( - m_currentDataItem->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString()); - } + if (name == RealDataItem::P_INSTRUMENT_ID) + setComboToIdentifier(m_currentDataItem->instrumentId()); } //! Sets instrument combo selector to the state corresponding to given instrument identifier. void RealDataPropertiesWidget::setComboToIdentifier(const QString& identifier) { - setComboConnected(false); + QSignalBlocker b(m_instrumentCombo); + m_current_id = identifier; - int index = m_linkManager->instrumentComboIndex(identifier); + const int index = m_linkManager->instrumentComboIndex(identifier); ASSERT(index >= 0); m_instrumentCombo->setCurrentIndex(index); - setComboConnected(true); -} - -//! Sets connected/disconnected for instrument combo selector. - -void RealDataPropertiesWidget::setComboConnected(bool isConnected) -{ - if (isConnected) { - connect(m_instrumentCombo, - static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, - &RealDataPropertiesWidget::onInstrumentComboIndexChanged); - } else { - disconnect(m_instrumentCombo, - static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, - &RealDataPropertiesWidget::onInstrumentComboIndexChanged); - } } //! Sets all widget's children enabled/disabled. When no RealDataItem selected all diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.h b/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.h index 6f5d81384ed6b4ac1d1d1bdb1a85142329ffd8a7..fb2b159aa498bcb7d84be44d393c3ccfc50d4436 100644 --- a/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.h +++ b/GUI/coregui/Views/ImportDataWidgets/RealDataPropertiesWidget.h @@ -48,7 +48,6 @@ public slots: private: void setComboToIdentifier(const QString& identifier); - void setComboConnected(bool isConnected); void setPropertiesEnabled(bool enabled); LinkInstrumentManager* m_linkManager; diff --git a/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.cpp b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.cpp index f70833573febb09bd5ffb6a58abf4a96d495d3a3..6060066cb3312acf997542e3ec8514cef156a28e 100644 --- a/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.cpp +++ b/GUI/coregui/Views/ImportDataWidgets/RealDataSelectorActions.cpp @@ -45,7 +45,11 @@ bool openRotateWarningDialog(QWidget* parent) bool rotationAffectsSetup(IntensityDataItem& intensityItem) { - if (intensityItem.parent()->getItemValue(RealDataItem::P_INSTRUMENT_ID).toBool()) + const RealDataItem* parentRealDataItem = dynamic_cast<RealDataItem*>(intensityItem.parent()); + const bool hasLinkToInstrument = + parentRealDataItem != nullptr && !parentRealDataItem->instrumentId().isEmpty(); + + if (hasLinkToInstrument) return true; if (intensityItem.maskContainerItem() && intensityItem.maskContainerItem()->hasChildren()) @@ -62,10 +66,9 @@ bool rotationAffectsSetup(IntensityDataItem& intensityItem) void resetSetup(IntensityDataItem& intensityItem) { - - auto data_parent = intensityItem.parent(); - if (data_parent->getItemValue(RealDataItem::P_INSTRUMENT_ID).toBool()) - data_parent->setItemValue(RealDataItem::P_INSTRUMENT_ID, QString()); + RealDataItem* parentRealDataItem = dynamic_cast<RealDataItem*>(intensityItem.parent()); + if (parentRealDataItem) + parentRealDataItem->clearInstrumentId(); if (auto maskContainer = intensityItem.maskContainerItem()) maskContainer->model()->removeRows(0, maskContainer->numberOfChildren(), diff --git a/Tests/UnitTests/GUI/TestLinkInstrument.cpp b/Tests/UnitTests/GUI/TestLinkInstrument.cpp index 6828b9510462b8aad4bfd9299a397fb6973190f8..900ab24fcbee721b31071a76e8ce7c2dac1cdb61 100644 --- a/Tests/UnitTests/GUI/TestLinkInstrument.cpp +++ b/Tests/UnitTests/GUI/TestLinkInstrument.cpp @@ -78,5 +78,5 @@ TEST_F(TestLinkInstrument, test_canLinkToInstrument) x_axis->setItemValue(BasicAxisItem::P_NBINS, 10); EXPECT_EQ(manager.linkedItems(instrument), QList<RealDataItem*>()); - EXPECT_EQ(realData->getItemValue(RealDataItem::P_INSTRUMENT_ID).toString(), QString()); + EXPECT_EQ(realData->instrumentId(), QString()); }