Skip to content
Snippets Groups Projects
Commit 22b92bd0 authored by David Li's avatar David Li
Browse files

making real time tuning work smoothly

parent 4a16c456
No related branches found
No related tags found
No related merge requests found
Showing
with 86 additions and 27 deletions
......@@ -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);
}
}
......@@ -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;
};
......
......@@ -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;
......
......@@ -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));
}
......@@ -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
......@@ -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)) {
......
......@@ -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");
......
......@@ -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());
......
......@@ -43,6 +43,7 @@ public slots:
void onJobItemFinished(const QString &identifier);
void onResetParameters();
void updateCurrentItem();
void onModelLoaded();
private:
ModelTuningWidget *getCurrentModelTuningWidget();
......
......@@ -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);
......
......@@ -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;
};
......
......@@ -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);
}
......
......@@ -52,9 +52,9 @@ protected:
private slots:
void onPropertyChanged(const QString &property_name);
void updateParameterModel();
private:
void updateParameterModel();
void backupModels();
QPoint getPositionForWarningSign();
......
......@@ -311,7 +311,7 @@ void MainWindow::resetModels()
m_materialModel->addMaterial("Substrate", 6e-6, 2e-8);
m_sampleModel->clear();
//testGUIObjectBuilder();
testGUIObjectBuilder();
m_jobModel->clear();
......
......@@ -302,6 +302,7 @@ void ProjectDocument::readFrom(QIODevice *device)
connectModel(m_instrumentModel);
connectModel(m_sampleModel);
connectModel(m_jobModel);
m_jobModel->modelLoaded();
//connectModel(m_fitModel);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment