diff --git a/GUI/coregui/Models/JobModel.cpp b/GUI/coregui/Models/JobModel.cpp index 27680d9550a5a2fa26b7c80a74fe74441414ae0f..e36b9a3ce8359af9a3e07e61705035db7a900b78 100644 --- a/GUI/coregui/Models/JobModel.cpp +++ b/GUI/coregui/Models/JobModel.cpp @@ -24,6 +24,7 @@ #include "MultiLayerItem.h" #include "InstrumentItem.h" #include "ParameterModelBuilder.h" +#include "ParameterTreeItems.h" #include <QUuid> #include <QDebug> #include <QItemSelection> @@ -168,15 +169,7 @@ void JobModel::backup(JobItem *jobItem) //! restore instrument and sample model from backup for given JobItem void JobModel::restore(JobItem *jobItem) { - MultiLayerItem *multilayer = jobItem->getMultiLayerItem(true); - Q_ASSERT(multilayer); - - setSampleForJobItem(jobItem, multilayer); - - InstrumentItem *instrument = jobItem->getInstrumentItem(true); - Q_ASSERT(instrument); - - setInstrumentForJobItem(jobItem, instrument); + restoreItem(jobItem->getItem(JobItem::T_PARAMETER_TREE)); } void JobModel::runJob(const QModelIndex &index) @@ -251,3 +244,13 @@ QString JobModel::generateJobIdentifier() return QUuid::createUuid().toString(); } +void JobModel::restoreItem(SessionItem *item) +{ + if (ParameterItem *parameter = dynamic_cast<ParameterItem*>(item)) { + parameter->propagateValueLink(true); + } + for (auto child : item->childItems()) { + restoreItem(child); + } +} + diff --git a/GUI/coregui/Models/JobModel.h b/GUI/coregui/Models/JobModel.h index b7af9658d350314ddc4f5c0e82fb8078eeed341e..7dbee7609f9bbb1fcb0ef478aaa1a508b6df7daa 100644 --- a/GUI/coregui/Models/JobModel.h +++ b/GUI/coregui/Models/JobModel.h @@ -56,6 +56,7 @@ signals: void aboutToDeleteJobItem(JobItem *item); void focusRequest(JobItem *item); void globalProgress(int); + void modelLoaded(); public slots: void runJob(const QModelIndex &index); @@ -67,6 +68,7 @@ public slots: private: QString generateJobName(); QString generateJobIdentifier(); + void restoreItem(SessionItem *item); JobQueueData *m_queue_data; }; diff --git a/GUI/coregui/Models/ParameterModelBuilder.cpp b/GUI/coregui/Models/ParameterModelBuilder.cpp index b044b1450d51674bc6d74c91d5f61e721f00f981..75d2e53a283f291df7a9925faaf3eb518a4e943a 100644 --- a/GUI/coregui/Models/ParameterModelBuilder.cpp +++ b/GUI/coregui/Models/ParameterModelBuilder.cpp @@ -192,9 +192,11 @@ void ParameterTreeBuilder::handleItem(SessionItem *tree, SessionItem *source) } else if (tree->modelType() == Constants::ParameterType) { tree->setDisplayName(source->itemName()); tree->setValue(source->value()); - tree->setDecimals(source->decimals()); - tree->setLimits(source->limits()); - tree->setItemValue(ParameterItem::P_LINK, ModelPath::getPathFromIndex(source->index())); + QString path = ModelPath::getPathFromIndex(source->index()); + int firstSlash = path.indexOf('/'); + path = path.mid(firstSlash + 1); + tree->setItemValue(ParameterItem::P_LINK, path); + tree->setItemValue(ParameterItem::P_BACKUP, source->value()); return; } else { return; diff --git a/GUI/coregui/Models/ParameterTreeItems.cpp b/GUI/coregui/Models/ParameterTreeItems.cpp index 943c7b8c3ab974f5cc6a9e202fd6967781ef7877..40bc61260745474366a25d3bdf95083874108831 100644 --- a/GUI/coregui/Models/ParameterTreeItems.cpp +++ b/GUI/coregui/Models/ParameterTreeItems.cpp @@ -27,8 +27,30 @@ ParameterLabelItem::ParameterLabelItem() } const QString ParameterItem::P_LINK = "Link"; +const QString ParameterItem::P_BACKUP = "Backup"; ParameterItem::ParameterItem() : SessionItem(Constants::ParameterType) { addProperty(P_LINK, ""); + addProperty(P_BACKUP, 0.0); +} + +void ParameterItem::propagateValueLink(bool backup) +{ + if (backup) + setValue(getItemValue(P_BACKUP)); + SessionItem *item = getLinkedItem(); + if (item) + item->setValue(value()); +} + +SessionItem *ParameterItem::getLinkedItem() +{ + QString link = getItemValue(P_LINK).toString(); + SessionItem *cur = this; + while (cur && cur->modelType() != Constants::JobItemType) { + cur = cur->parent(); + } + link = cur->itemName() + "/" + link; + return model()->itemForIndex(ModelPath::getIndexFromPath(model(), link)); } diff --git a/GUI/coregui/Models/ParameterTreeItems.h b/GUI/coregui/Models/ParameterTreeItems.h index 833c3f718e566402d7793bb2c1bd9b7522ba8bee..d3340d4e70bc8c26f4ffd8763fb0159660a4785c 100644 --- a/GUI/coregui/Models/ParameterTreeItems.h +++ b/GUI/coregui/Models/ParameterTreeItems.h @@ -29,7 +29,10 @@ class BA_CORE_API_ ParameterItem : public SessionItem { public: static const QString P_LINK; + static const QString P_BACKUP; ParameterItem(); + void propagateValueLink(bool backup = false); + SessionItem *getLinkedItem(); }; #endif diff --git a/GUI/coregui/Models/SessionXML.cpp b/GUI/coregui/Models/SessionXML.cpp index 3a018cc27bb1f91de71f8108c3b4e299cb9fb361..a7056e12bc90ebf51ae06df252f271ee97e323dd 100644 --- a/GUI/coregui/Models/SessionXML.cpp +++ b/GUI/coregui/Models/SessionXML.cpp @@ -52,6 +52,7 @@ void SessionWriter::writeItemAndChildItems(QXmlStreamWriter *writer, const Sessi if (tag == item->parent()->defaultTag()) tag = ""; writer->writeAttribute(SessionXML::TagAttribute, tag); + writer->writeAttribute(SessionXML::DisplayNameAttribute, item->data(SessionModel::DisplayNameRole).toString()); QVector<int> roles = item->getRoles(); foreach(int role, roles) { if (role == Qt::DisplayRole || role == Qt::EditRole) @@ -153,6 +154,9 @@ void SessionReader::readItems(QXmlStreamReader *reader, SessionItem *item, const } } else { SessionItem *new_item = ItemFactory::createItem(model_type); + if (reader->attributes().hasAttribute(SessionXML::DisplayNameAttribute)) { + new_item->setDisplayName(reader->attributes().value(SessionXML::DisplayNameAttribute).toString()); + } if (tag == "") tag = item->defaultTag(); if (!item->insertItem(-1, new_item, tag)) { diff --git a/GUI/coregui/Models/SessionXML.h b/GUI/coregui/Models/SessionXML.h index a5c2f9482dea5069fc348ed4284eee7894f6de46..eabc3a3e6f701c3e89a8d92ca01ba0cae5a8dcd0 100644 --- a/GUI/coregui/Models/SessionXML.h +++ b/GUI/coregui/Models/SessionXML.h @@ -40,7 +40,7 @@ const QString TagAttribute("Tag"); const QString ModelNameAttribute("Name"); const QString ItemTag("Item"); const QString ModelTypeAttribute("ModelType"); -const QString ItemNameAttribute("ItemName"); +const QString DisplayNameAttribute("DisplayName"); const QString ParameterTag("Parameter"); const QString ParameterNameAttribute("ParName"); const QString ParameterTypeAttribute("ParType"); diff --git a/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp b/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp index 28baf157c0ed4728a686aa8e992341595d3b7f26..fa059eff4b06d7796365819f223bc06c666f8fec 100644 --- a/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp +++ b/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.cpp @@ -56,6 +56,7 @@ JobRealTimeWidget::JobRealTimeWidget(JobModel *jobModel, QWidget *parent) setLayout(mainLayout); connect(m_toolBar, SIGNAL(resetParameters()), this, SLOT(onResetParameters())); + connect(m_jobModel, SIGNAL(modelLoaded()), this, SLOT(onModelLoaded())); } void JobRealTimeWidget::setJobModel(JobModel *jobModel) @@ -151,6 +152,16 @@ void JobRealTimeWidget::updateCurrentItem() setItem(m_currentJobItem); } +void JobRealTimeWidget::onModelLoaded() +{ + JobItem *item = dynamic_cast<JobItem*>(m_jobModel->rootItem()->getItem()); + if (item) { + setItem(item); + } else { + onJobItemDelete(m_currentJobItem); + } +} + ModelTuningWidget *JobRealTimeWidget::getCurrentModelTuningWidget() { ModelTuningWidget *result = dynamic_cast<ModelTuningWidget *>(m_stack->currentWidget()); diff --git a/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.h b/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.h index 5fe4fe500f620abfa37bb3d35f75cd6a0d643f0d..bd34019cc6c0b77446dd8dbfdc7239ca1dbb1081 100644 --- a/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.h +++ b/GUI/coregui/Views/JobWidgets/JobRealTimeWidget.h @@ -43,6 +43,7 @@ public slots: void onJobItemFinished(const QString &identifier); void onResetParameters(); void updateCurrentItem(); + void onModelLoaded(); private: ModelTuningWidget *getCurrentModelTuningWidget(); diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp b/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp index 219439cf0df0ab7a14c7ae0ea84359249be5feea..32576218f217dd03e5679f66dc59274da7229de5 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp +++ b/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.cpp @@ -142,16 +142,18 @@ QWidget *ModelTuningDelegate::createEditor(QWidget *parent, auto proxy = dynamic_cast<FilterPropertyProxy*>(const_cast<QAbstractItemModel*>(index.model())); - SessionItem *item = static_cast<SessionItem*>(proxy->mapToSource(index).internalPointer());//m_current_link.getItem(); - AttLimits limits = item->limits();//item->getItem(m_current_link.getPropertyName())->limits(); - m_currentItem = item; + m_currentItem = static_cast<ParameterItem*>(proxy->mapToSource(index).internalPointer());//m_current_link.getItem(); + + + + AttLimits limits = m_currentItem->getLinkedItem()->limits();//item->getItem(m_current_link.getPropertyName())->limits(); // initializing value box m_valueBox = new QDoubleSpinBox(); m_valueBox->setKeyboardTracking(false); m_valueBox->setFixedWidth(80); - m_valueBox->setDecimals(item->decimals()); - m_valueBox->setSingleStep(1./std::pow(10.,item->decimals()-1)); + m_valueBox->setDecimals(m_currentItem->getLinkedItem()->decimals()); + m_valueBox->setSingleStep(1./std::pow(10.,m_currentItem->getLinkedItem()->decimals()-1)); if(limits.hasLowerLimit()) { m_valueBox->setMinimum(limits.getLowerLimit()); @@ -186,6 +188,13 @@ QWidget *ModelTuningDelegate::createEditor(QWidget *parent, m_contentLayout->addWidget(m_valueBox); m_contentLayout->addWidget(m_slider); + ModelMapper *mapper = new ModelMapper(m_contentWidget); + mapper->setItem(m_currentItem); + mapper->setOnValueChange( + [this](){ + m_valueBox->setValue(m_currentItem->value().toDouble()); + }); + m_contentWidget->setLayout(m_contentLayout); return m_contentWidget; @@ -270,10 +279,7 @@ void ModelTuningDelegate::emitSignals(double value) { if(m_currentItem) { m_currentItem->setValue(value); - QString link = m_currentItem->getItemValue(ParameterItem::P_LINK).toString(); - SessionItem *item = m_currentItem->model()->itemForIndex(ModelPath::getIndexFromPath(m_currentItem->model(), link)); - if (item) - item->setValue(m_currentItem->value()); + m_currentItem->propagateValueLink(); //qDebug() << "SampleTuningDelegate::editorValueChanged() -> Working on item " << m_current_link.getItem()->modelType() << m_current_link.getPropertyName(); //m_current_link.getItem()->setRegisteredProperty(m_current_link.getPropertyName(), m_valueBox->value()); emit currentLinkChanged(m_currentItem); diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.h b/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.h index 6c172b782d4441247f0bc4fcb7a3204174d62239..d219396301e659f36172816338baa1ff945b1f9e 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.h +++ b/GUI/coregui/Views/JobWidgets/ModelTuningDelegate.h @@ -23,6 +23,7 @@ class QDoubleSpinBox; class QHBoxLayout; +class ParameterItem; class BA_CORE_API_ ModelTuningDelegate : public QItemDelegate { @@ -81,7 +82,7 @@ private: mutable QWidget *m_contentWidget; mutable QHBoxLayout * m_contentLayout; mutable ItemLink m_current_link; - mutable SessionItem *m_currentItem; + mutable ParameterItem *m_currentItem; mutable SliderData m_slider_data; }; diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp index 7b500d8dfe28ec838edecaf6da375b8277ab769c..e5ffeb23bac322abdf751384e63c528070d9f2ea 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp +++ b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp @@ -35,6 +35,8 @@ #include <QToolButton> #include <QDebug> #include <QScrollBar> +#include <QApplication> +#include <QKeyEvent> namespace { const int warning_sign_xpos = 38; @@ -168,7 +170,8 @@ void ModelTuningWidget::updateParameterModel() proxy->setSourceModel(m_jobModel); m_treeView->setModel(proxy); m_treeView->setRootIndex(proxy->mapFromSource(m_currentJobItem->getItem(JobItem::T_PARAMETER_TREE)->index())); - m_treeView->setColumnWidth(0, 240); + if (m_treeView->columnWidth(0) < 170) + m_treeView->setColumnWidth(0, 170); m_treeView->expandAll(); } @@ -191,7 +194,7 @@ void ModelTuningWidget::restoreModelsOfCurrentJobItem() m_jobModel->restore(m_currentJobItem); - updateParameterModel(); +// updateParameterModel(); m_jobModel->getJobQueueData()->runJob(m_currentJobItem); } diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h index 554e4df127cb86a24f3b0f90efb5e61de9cd40b8..40d1f2457c398b30a290bcad8fcdc420da916c3d 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h +++ b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.h @@ -52,9 +52,9 @@ protected: private slots: void onPropertyChanged(const QString &property_name); + void updateParameterModel(); private: - void updateParameterModel(); void backupModels(); QPoint getPositionForWarningSign(); diff --git a/GUI/coregui/mainwindow/mainwindow.cpp b/GUI/coregui/mainwindow/mainwindow.cpp index 40d987b73198db8ea9f22874966f8f2c74417eb2..e3d80dca7d560c999347433466848a021f45f4cb 100644 --- a/GUI/coregui/mainwindow/mainwindow.cpp +++ b/GUI/coregui/mainwindow/mainwindow.cpp @@ -311,7 +311,7 @@ void MainWindow::resetModels() m_materialModel->addMaterial("Substrate", 6e-6, 2e-8); m_sampleModel->clear(); - //testGUIObjectBuilder(); + testGUIObjectBuilder(); m_jobModel->clear(); diff --git a/GUI/coregui/mainwindow/projectdocument.cpp b/GUI/coregui/mainwindow/projectdocument.cpp index 7aa32593a838e872b82aabda9fc1a53ea92829e4..88406c26dffddb58d836a59cb6cee28a8a257bce 100644 --- a/GUI/coregui/mainwindow/projectdocument.cpp +++ b/GUI/coregui/mainwindow/projectdocument.cpp @@ -302,6 +302,7 @@ void ProjectDocument::readFrom(QIODevice *device) connectModel(m_instrumentModel); connectModel(m_sampleModel); connectModel(m_jobModel); + m_jobModel->modelLoaded(); //connectModel(m_fitModel); }