diff --git a/GUI/coregui/Models/JobItem.cpp b/GUI/coregui/Models/JobItem.cpp index eafd9731ae59929a0125017f9c4a7c4c55f6457d..ee059d21bde0b4f362788ba51c4baea8abe9ab2e 100644 --- a/GUI/coregui/Models/JobItem.cpp +++ b/GUI/coregui/Models/JobItem.cpp @@ -20,6 +20,7 @@ #include "InstrumentModel.h" #include "MultiLayerItem.h" #include "InstrumentItem.h" +#include <QDebug> namespace @@ -253,30 +254,38 @@ bool JobItem::runInBackground() const return combo_property.getValue() == Constants::JOB_RUN_IN_BACKGROUND; } -MultiLayerItem *JobItem::getMultiLayerItem() +//! Returns MultiLayerItem of this JobItem, if from_backup=true, then backup'ed version of +//! multilayer will be used +MultiLayerItem *JobItem::getMultiLayerItem(bool from_backup) { foreach(ParameterizedItem *item, childItems()) { - if(MultiLayerItem *multilayer = dynamic_cast<MultiLayerItem *>(item)) - return multilayer; + qDebug() << "XXX" << item->itemName(); + if(MultiLayerItem *multilayer = dynamic_cast<MultiLayerItem *>(item)) { + if(from_backup && multilayer->itemName().endsWith(Constants::JOB_BACKUP)) { + return multilayer; + } + if(!from_backup && !multilayer->itemName().endsWith(Constants::JOB_BACKUP)) { + return multilayer; + } + } } return 0; -// MultiLayerItem *result(0); -// if(m_sampleModel) { -// result = m_sampleModel->getMultiLayerItem(); -// } -// return result; } -InstrumentItem *JobItem::getInstrumentItem() +//! Returns InstrumentItem of this JobItem, if from_backup=true, then backup'ed version of +//! the instruyment will be used +InstrumentItem *JobItem::getInstrumentItem(bool from_backup) { foreach(ParameterizedItem *item, childItems()) { - if(InstrumentItem *instrument = dynamic_cast<InstrumentItem *>(item)) - return instrument; + if(InstrumentItem *instrument = dynamic_cast<InstrumentItem *>(item)) { + if(from_backup && instrument->itemName().endsWith(Constants::JOB_BACKUP)) { + return instrument; + } + if(!from_backup && !instrument->itemName().endsWith(Constants::JOB_BACKUP)) { + return instrument; + } + } } return 0; -// InstrumentItem *result(0); -// if(m_instrumentModel) { -// result = m_instrumentModel->getInstrumentItem(); -// } -// return result; } + diff --git a/GUI/coregui/Models/JobItem.h b/GUI/coregui/Models/JobItem.h index 6c15fe028c7f4a6cb874c38bed7c81686f2b9fc0..9de769ac284ef28d5939a7945603d5014b31370d 100644 --- a/GUI/coregui/Models/JobItem.h +++ b/GUI/coregui/Models/JobItem.h @@ -81,9 +81,9 @@ public: bool runImmediately() const; bool runInBackground() const; - MultiLayerItem *getMultiLayerItem(); + MultiLayerItem *getMultiLayerItem(bool from_backup = false); - InstrumentItem *getInstrumentItem(); + InstrumentItem *getInstrumentItem(bool from_backup = false); private: // SampleModel *m_sampleModel; diff --git a/GUI/coregui/Models/JobModel.cpp b/GUI/coregui/Models/JobModel.cpp index 12a36730cc7e3ac31e03b40989b1a141df48f9c1..663424276ad8b0bb63fc7bd0e8874f248ec8658e 100644 --- a/GUI/coregui/Models/JobModel.cpp +++ b/GUI/coregui/Models/JobModel.cpp @@ -89,22 +89,22 @@ JobItem *JobModel::getJobItemForIdentifier(const QString &identifier) // return jobItem; //} -JobItem *JobModel::addJob(const QString &sample_name, const QString &instrument_name, const QString &run_policy, int numberOfThreads) -{ - JobItem *jobItem = dynamic_cast<JobItem *>(insertNewItem(Constants::JobItemType)); - jobItem->setItemName(generateJobName()); - jobItem->setIdentifier(generateJobIdentifier()); - jobItem->setNumberOfThreads(numberOfThreads); - jobItem->setRunPolicy(run_policy); +//JobItem *JobModel::addJob(const QString &sample_name, const QString &instrument_name, const QString &run_policy, int numberOfThreads) +//{ +// JobItem *jobItem = dynamic_cast<JobItem *>(insertNewItem(Constants::JobItemType)); +// jobItem->setItemName(generateJobName()); +// jobItem->setIdentifier(generateJobIdentifier()); +// jobItem->setNumberOfThreads(numberOfThreads); +// jobItem->setRunPolicy(run_policy); - setSampleForJobItem(jobItem, sample_name); - setInstrumentForJobItem(jobItem, instrument_name); +// setSampleForJobItem(jobItem, sample_name); +// setInstrumentForJobItem(jobItem, instrument_name); - if(jobItem->runImmediately() || jobItem->runInBackground()) - m_queue_data->runJob(jobItem); +// if(jobItem->runImmediately() || jobItem->runInBackground()) +// m_queue_data->runJob(jobItem); - return jobItem; -} +// return jobItem; +//} JobItem *JobModel::addJob(MultiLayerItem *multiLayerItem, InstrumentItem *instrumentItem, const QString &run_policy, int numberOfThreads) { @@ -134,79 +134,145 @@ void JobModel::setInstrumentModel(InstrumentModel *instrumentModel) } //! The copy of sample with 'sample_name' from m_sampleModel will become a child of given job item -void JobModel::setSampleForJobItem(JobItem *jobItem, const QString &sample_name) -{ - Q_ASSERT(m_sampleModel); - Q_ASSERT(jobItem); +//void JobModel::setSampleForJobItem(JobItem *jobItem, const QString &sample_name) +//{ +// Q_ASSERT(m_sampleModel); +// Q_ASSERT(jobItem); - // removing old multilayer from children of given jobItem - MultiLayerItem *old_sample = jobItem->getMultiLayerItem(); - if(old_sample) { - removeRows(indexOfItem(old_sample).row(), 1, indexOfItem(old_sample->parent())); - } +// // removing old multilayer from children of given jobItem +// MultiLayerItem *old_sample = jobItem->getMultiLayerItem(); +// if(old_sample) { +// removeRows(indexOfItem(old_sample).row(), 1, indexOfItem(old_sample->parent())); +// } - // copying multilayer to jobItem - MultiLayerItem *multilayer = m_sampleModel->getMultiLayerItem(sample_name); - Q_ASSERT(multilayer); +// // copying multilayer to jobItem +// MultiLayerItem *multilayer = m_sampleModel->getMultiLayerItem(sample_name); +// Q_ASSERT(multilayer); - copyParameterizedItem(multilayer, jobItem); +// copyParameterizedItem(multilayer, jobItem); + +// jobItem->setRegisteredProperty(JobItem::P_SAMPLE_NAME, multilayer->itemName()); +//} - jobItem->setRegisteredProperty(JobItem::P_SAMPLE_NAME, multilayer->itemName()); -} -void JobModel::setSampleForJobItem(JobItem *jobItem, MultiLayerItem *multiLayerItem) +//! Adds a multilayer to children of given JobItem. If backup=true then multilayer will be added +//! as a backup. +void JobModel::setSampleForJobItem(JobItem *jobItem, MultiLayerItem *multiLayerItem, bool backup) { + qDebug() << "WWW 1.1"; Q_ASSERT(m_sampleModel); Q_ASSERT(jobItem); Q_ASSERT(multiLayerItem); - // removing old multilayer from children of given jobItem - MultiLayerItem *old_sample = jobItem->getMultiLayerItem(); + // removing old multilayer (or its backup version) from children of given jobItem + qDebug() << "WWW 1.2"; + MultiLayerItem *old_sample = jobItem->getMultiLayerItem(backup); if(old_sample) { removeRows(indexOfItem(old_sample).row(), 1, indexOfItem(old_sample->parent())); } - copyParameterizedItem(multiLayerItem, jobItem); + qDebug() << "WWW 1.3"; + ParameterizedItem *new_item = copyParameterizedItem(multiLayerItem, jobItem); + QString name = new_item->itemName(); + qDebug() << "WWW 1.4"; + qDebug() << "OOO "; + qDebug() << "000 " << backup << name << name.remove(Constants::JOB_BACKUP); + name.remove(Constants::JOB_BACKUP); + jobItem->setRegisteredProperty(JobItem::P_SAMPLE_NAME, name); + + if(backup) { + name.append(Constants::JOB_BACKUP); + } + + new_item->setItemName(name); + - jobItem->setRegisteredProperty(JobItem::P_SAMPLE_NAME, multiLayerItem->itemName()); } //! The copy of instrument with 'instrument_name' from m_instrumentModel will become a child of //! given job item -void JobModel::setInstrumentForJobItem(JobItem *jobItem, const QString &instrument_name) +//void JobModel::setInstrumentForJobItem(JobItem *jobItem, const QString &instrument_name) +//{ +// Q_ASSERT(m_instrumentModel); +// Q_ASSERT(jobItem); + +// // removing old instrument from children of given jobItem +// InstrumentItem *old = jobItem->getInstrumentItem(); +// if (old) { +// removeRows(indexOfItem(old).row(), 1, indexOfItem(old->parent())); +// } + +// // copying instrument to jobItem +// InstrumentItem *instrument = m_instrumentModel->getInstrumentItem(instrument_name); +// Q_ASSERT(instrument); +// copyParameterizedItem(instrument, jobItem); + +// jobItem->setRegisteredProperty(JobItem::P_INSTRUMENT_NAME, instrument->itemName()); +//} + +void JobModel::setInstrumentForJobItem(JobItem *jobItem, InstrumentItem *instrumentItem, bool backup) { Q_ASSERT(m_instrumentModel); Q_ASSERT(jobItem); + Q_ASSERT(instrumentItem); // removing old instrument from children of given jobItem - InstrumentItem *old = jobItem->getInstrumentItem(); + InstrumentItem *old = jobItem->getInstrumentItem(backup); if (old) { removeRows(indexOfItem(old).row(), 1, indexOfItem(old->parent())); } - // copying instrument to jobItem - InstrumentItem *instrument = m_instrumentModel->getInstrumentItem(instrument_name); - Q_ASSERT(instrument); - copyParameterizedItem(instrument, jobItem); + ParameterizedItem *new_item = copyParameterizedItem(instrumentItem, jobItem); + QString name = new_item->itemName(); + name.remove(Constants::JOB_BACKUP); + jobItem->setRegisteredProperty(JobItem::P_INSTRUMENT_NAME, name); + + if(backup) { + name.append(Constants::JOB_BACKUP); + } + + new_item->setItemName(name); - jobItem->setRegisteredProperty(JobItem::P_INSTRUMENT_NAME, instrument->itemName()); } -void JobModel::setInstrumentForJobItem(JobItem *jobItem, InstrumentItem *instrumentItem) +//! Backup instrument and sample model for given JobItem. If backup already exists, do nothing. +void JobModel::backup(JobItem *jobItem) { - Q_ASSERT(m_instrumentModel); - Q_ASSERT(jobItem); - Q_ASSERT(instrumentItem); + if(!jobItem->getMultiLayerItem(true)) { + MultiLayerItem *multilayer = jobItem->getMultiLayerItem(); + Q_ASSERT(multilayer); - // removing old instrument from children of given jobItem - InstrumentItem *old = jobItem->getInstrumentItem(); - if (old) { - removeRows(indexOfItem(old).row(), 1, indexOfItem(old->parent())); + setSampleForJobItem(jobItem, multilayer, true); } - copyParameterizedItem(instrumentItem, jobItem); + if(!jobItem->getInstrumentItem(true)) { + InstrumentItem *instrument = jobItem->getInstrumentItem(); + Q_ASSERT(instrument); + + setInstrumentForJobItem(jobItem, instrument, true); + } +} + +//! restore instrument and sample model from backup for given JobItem +void JobModel::restore(JobItem *jobItem) +{ + jobItem->blockSignals(true); + qDebug() << " "; + qDebug() << " "; + qDebug() << " "; + + MultiLayerItem *multilayer = jobItem->getMultiLayerItem(true); + qDebug() << "QQQ" << multilayer->itemName(); + Q_ASSERT(multilayer); + + setSampleForJobItem(jobItem, multilayer); + + InstrumentItem *instrument = jobItem->getInstrumentItem(true); + Q_ASSERT(instrument); + + setInstrumentForJobItem(jobItem, instrument); - jobItem->setRegisteredProperty(JobItem::P_INSTRUMENT_NAME, instrumentItem->itemName()); + jobItem->blockSignals(false); } void JobModel::runJob(const QModelIndex &index) diff --git a/GUI/coregui/Models/JobModel.h b/GUI/coregui/Models/JobModel.h index 6380244fc299623fef2933ee84bbe1a3f1f29a19..9fe4f93e28ebc7ad501698ed658eb546a4ff74d4 100644 --- a/GUI/coregui/Models/JobModel.h +++ b/GUI/coregui/Models/JobModel.h @@ -42,8 +42,8 @@ public: // JobItem *addJob(SampleModel *sampleModel, InstrumentModel *instrumentModel, // const QString &run_policy = QString(), int numberOfThreads=-1); - JobItem *addJob(const QString &sample_name, const QString &instrument_name, - const QString &run_policy = QString(), int numberOfThreads=-1); +// JobItem *addJob(const QString &sample_name, const QString &instrument_name, +// const QString &run_policy = QString(), int numberOfThreads=-1); JobItem *addJob(MultiLayerItem *multiLayerItem, InstrumentItem *instrumentItem, const QString &run_policy = QString(), int numberOfThreads=-1); @@ -52,13 +52,17 @@ public: void setInstrumentModel(InstrumentModel *instrumentModel); - void setSampleForJobItem(JobItem *jobItem, const QString &sample_name); +// void setSampleForJobItem(JobItem *jobItem, const QString &sample_name); + + void setSampleForJobItem(JobItem *jobItem, MultiLayerItem *multiLayerItem, bool backup = false); + - void setSampleForJobItem(JobItem *jobItem, MultiLayerItem *multiLayerItem); +// void setInstrumentForJobItem(JobItem *jobItem, const QString &instrument_name); + void setInstrumentForJobItem(JobItem *jobItem, InstrumentItem *instrumentItem, bool backup=false); + void backup(JobItem *jobItem); - void setInstrumentForJobItem(JobItem *jobItem, const QString &instrument_name); - void setInstrumentForJobItem(JobItem *jobItem, InstrumentItem *instrumentItem); + void restore(JobItem *jobItem); signals: void selectionChanged(JobItem *item); diff --git a/GUI/coregui/Models/ParameterizedItem.cpp b/GUI/coregui/Models/ParameterizedItem.cpp index 7f9001c2b8c1538b75a81020a84fd4cf54cde155..38914961e24f529b4cabba561a647544a2ea6c2b 100644 --- a/GUI/coregui/Models/ParameterizedItem.cpp +++ b/GUI/coregui/Models/ParameterizedItem.cpp @@ -255,16 +255,18 @@ QVariant ParameterizedItem::getRegisteredProperty(const QString &name) const void ParameterizedItem::removeRegisteredProperty(const QString &name) { - qDebug() << "ParameterizedItem::removeRegisteredProperty()" << name; - if (m_sub_items.contains(name)) { - qDebug() - << " ParameterizedItem::removeRegisteredProperty() -> Removing property iteme"; - delete m_sub_items[name]; - m_sub_items.remove(name); + if(isRegisteredProperty(name)) { + qDebug() << "ParameterizedItem::removeRegisteredProperty()" << name; + if (m_sub_items.contains(name)) { + qDebug() + << " ParameterizedItem::removeRegisteredProperty() -> Removing property iteme"; + delete m_sub_items[name]; + m_sub_items.remove(name); + } + m_registered_properties.removeOne(name); + m_property_attribute.remove(name); + setProperty(name.toUtf8().constData(), QVariant()); } - m_registered_properties.removeOne(name); - m_property_attribute.remove(name); - setProperty(name.toUtf8().constData(), QVariant()); } void ParameterizedItem::setPropertyAttribute(const QString &name, diff --git a/GUI/coregui/Models/SessionModel.cpp b/GUI/coregui/Models/SessionModel.cpp index 28ef8132b0fb07ef46178614a6db9cd47b40150d..de7481a35f79eeceea934b6382982e38f4de42ad 100644 --- a/GUI/coregui/Models/SessionModel.cpp +++ b/GUI/coregui/Models/SessionModel.cpp @@ -405,12 +405,12 @@ void SessionModel::moveParameterizedItem(ParameterizedItem *item, ParameterizedI } //! Copy given item to the new_parent at given raw. Item indended for copying can belong to -//! another model and it will remains intact. -void SessionModel::copyParameterizedItem(ParameterizedItem *item_to_copy, ParameterizedItem *new_parent, int row) +//! another model and it will remains intact. Returns pointer to the new child. +ParameterizedItem *SessionModel::copyParameterizedItem(ParameterizedItem *item_to_copy, ParameterizedItem *new_parent, int row) { if (new_parent) { if (!new_parent->acceptsAsChild(item_to_copy->modelType())) - return; + return 0; } else { new_parent = m_root_item; } @@ -426,6 +426,8 @@ void SessionModel::copyParameterizedItem(ParameterizedItem *item_to_copy, Parame beginInsertRows(indexOfItem(new_parent), row, row); readItems(&reader, new_parent, row); endInsertRows(); + + return new_parent->childAt(row); } SessionModel *SessionModel::createCopy(ParameterizedItem *parent) diff --git a/GUI/coregui/Models/SessionModel.h b/GUI/coregui/Models/SessionModel.h index de2864bfd61c2736c778d49a109f0b3d170b9f8a..410e4f25076c370836da7208ffb5f4aa3768cf29 100644 --- a/GUI/coregui/Models/SessionModel.h +++ b/GUI/coregui/Models/SessionModel.h @@ -117,7 +117,7 @@ public: void moveParameterizedItem(ParameterizedItem *item, ParameterizedItem *new_parent = 0, int row = -1); - void copyParameterizedItem(ParameterizedItem *item_to_copy, ParameterizedItem *new_parent = 0, int row = -1); + ParameterizedItem *copyParameterizedItem(ParameterizedItem *item_to_copy, ParameterizedItem *new_parent = 0, int row = -1); void setIconProvider(IconProvider *icon_provider) { m_iconProvider = icon_provider; } diff --git a/GUI/coregui/Models/item_constants.h b/GUI/coregui/Models/item_constants.h index d5afadaca633243a800ac83f73bb9f2026e2a1ef..b351efd41b68f366e10d50b1bf432e01cff2326a 100644 --- a/GUI/coregui/Models/item_constants.h +++ b/GUI/coregui/Models/item_constants.h @@ -163,6 +163,7 @@ const ModelType AXIS_CONSTK_BINNING = "Const KBin"; const ModelType JOB_RUN_IMMEDIATELY = "Immediately"; const ModelType JOB_RUN_IN_BACKGROUND = "In background"; const ModelType JOB_RUN_SUBMIT_ONLY = "Submit only"; +const ModelType JOB_BACKUP = "_backup"; } diff --git a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp index 81f955cf679926178c32b9c22bba7a8e3a780fac..204922ad213db511e0f1426219fa5ac94216e1e6 100644 --- a/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp +++ b/GUI/coregui/Views/JobWidgets/ModelTuningWidget.cpp @@ -187,6 +187,8 @@ void ModelTuningWidget::backupModels() qDebug() << "ModelTuningWidget::backupModels()"; if(!m_currentJobItem) return; + m_jobModel->backup(m_currentJobItem); + // if(!m_sampleModelBackup) // m_sampleModelBackup = m_currentJobItem->getSampleModel()->createCopy(); @@ -200,15 +202,16 @@ void ModelTuningWidget::restoreModelsOfCurrentJobItem() return; // qDebug() << "ModelTuningWidget::restoreModelsOfCurrentJobItem()"; - Q_ASSERT(m_sampleModelBackup); - Q_ASSERT(m_instrumentModelBackup); +// Q_ASSERT(m_sampleModelBackup); +// Q_ASSERT(m_instrumentModelBackup); Q_ASSERT(m_currentJobItem); + m_jobModel->restore(m_currentJobItem); + // qDebug() << "ModelTuningWidget::restoreModelsOfCurrentJobItem() current" // << m_currentJobItem->getSampleModel() << m_currentJobItem->getInstrumentModel() // << " backup" << m_sampleModelBackup << m_instrumentModelBackup; - Q_ASSERT(0); // m_currentJobItem->setSampleModel(m_sampleModelBackup->createCopy()); // m_currentJobItem->setInstrumentModel(m_instrumentModelBackup->createCopy());