BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
ParameterTuningWidget.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/JobWidgets/ParameterTuningWidget.cpp
6 //! @brief Implements class ParameterTuningWidget
7 //!
8 //! @homepage http://www.bornagainproject.org
9 //! @license GNU General Public License v3 or higher (see COPYING)
10 //! @copyright Forschungszentrum Jülich GmbH 2018
11 //! @authors Scientific Computing Group at MLZ (see CITATION, AUTHORS)
12 //
13 // ************************************************************************************************
14 
26 #include <QTreeView>
27 #include <QVBoxLayout>
28 
30  : SessionItemWidget(parent)
31  , m_toolBar(new JobRealTimeToolBar(this))
32  , m_jobModel(nullptr)
33  , m_parameterTuningModel(nullptr)
34  , m_sliderSettingsWidget(new SliderSettingsWidget(this))
35  , m_treeView(new QTreeView)
36  , m_delegate(new ParameterTuningDelegate(this))
37  , m_warningSign(new WarningSign(m_treeView))
38 {
39  setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
40 
41  m_treeView->setItemDelegate(m_delegate);
42  m_treeView->setContextMenuPolicy(Qt::CustomContextMenu);
43  m_treeView->setDragDropMode(QAbstractItemView::NoDragDrop);
44  m_treeView->setAttribute(Qt::WA_MacShowFocusRect, false);
45 
46  auto mainLayout = new QVBoxLayout;
47  mainLayout->setMargin(0);
48  mainLayout->setSpacing(0);
49  mainLayout->addWidget(m_toolBar);
50  mainLayout->addWidget(m_sliderSettingsWidget);
51  mainLayout->addWidget(m_treeView);
52  setLayout(mainLayout);
53 
60  connect(m_treeView, &QTreeView::customContextMenuRequested, this,
64 }
65 
67 {
69  return m_treeView->selectionModel();
70 }
71 
72 //! Returns list of ParameterItem's currently selected in parameter tree
73 
75 {
76  QVector<ParameterItem*> result;
77  QModelIndexList proxyIndexes = selectionModel()->selectedIndexes();
78  for (auto proxyIndex : proxyIndexes) {
79  if (ParameterItem* parItem = m_parameterTuningModel->getParameterItem(proxyIndex))
80  result.push_back(parItem);
81  }
82  return result;
83 }
84 
86 {
87  ASSERT(jobItem());
88 
89  if (jobItem()->isRunning())
90  return;
91 
92  if (item) {
93  // link.updateItem(); // FIXME circular dependency if uncomment
94  m_jobModel->runJob(jobItem()->index());
95  }
96 }
97 
99 {
101 }
102 
104 {
105  if (!jobItem())
106  return;
109 }
110 
112 {
114 
115  if (!jobItem())
116  return;
117 
118  if (!jobItem()->multiLayerItem() || !jobItem()->instrumentItem())
119  throw GUIHelpers::Error("ModelTuningWidget::updateParameterModel() -> Error."
120  "JobItem doesn't have sample or instrument model.");
121 
122  delete m_parameterTuningModel;
124  m_parameterTuningModel->setSourceModel(m_jobModel);
125 
127  m_treeView->setRootIndex(
128  m_parameterTuningModel->mapFromSource(jobItem()->parameterContainerItem()->index()));
129  if (m_treeView->columnWidth(0) < 170)
130  m_treeView->setColumnWidth(0, 170);
131  m_treeView->expandAll();
132 }
133 
135 {
136  emit itemContextMenuRequest(m_treeView->mapToGlobal(point + QPoint(2, 22)));
137 }
138 
140 {
142  ASSERT(jobItem());
143 
144  if (jobItem()->isRunning())
145  return;
146 
148 
150  m_jobModel->runJob(jobItem()->index());
151 }
152 
154 {
155  QModelIndex proxyIndex = m_parameterTuningModel->mapFromSource(item->index());
156  if (proxyIndex.isValid())
157  selectionModel()->select(proxyIndex, QItemSelectionModel::Select);
158 }
159 
161 {
162  // reimplemented to suppress context menu from QMainWindow
163 }
164 
166 {
167  m_jobModel = dynamic_cast<JobModel*>(jobItem()->model());
168 
171 
173  [this](const QString& name) { onPropertyChanged(name); }, this);
174 
176 }
177 
178 void ParameterTuningWidget::onPropertyChanged(const QString& property_name)
179 {
180  if (property_name == JobItem::P_STATUS) {
181  m_warningSign->clear();
182 
183  if (jobItem()->isFailed()) {
184  QString message;
185  message.append("Current parameter values cause simulation failure.\n\n");
186  message.append(jobItem()->getComments());
188  }
189 
191  }
192 }
193 
195 {
196  return dynamic_cast<JobItem*>(currentItem());
197 }
198 
199 //! Disable drag-and-drop abilities, if job is in fit running state.
200 
202 {
203  ASSERT(jobItem());
204  if (jobItem()->getStatus() == "Fitting") {
206  m_treeView->setDragDropMode(QAbstractItemView::NoDragDrop);
207  } else {
209  if (jobItem()->isValidForFitting())
210  m_treeView->setDragDropMode(QAbstractItemView::DragOnly);
211  }
212 }
213 
214 //! Sets delegate to enabled/disabled state.
215 //! In 'disabled' state the delegate is in ReadOnlyMode, if it was containing already some
216 //! editing widget, it will be forced to close.
218 {
219  if (enabled) {
220  m_delegate->setReadOnly(false);
221  } else {
222  m_delegate->setReadOnly(true);
224  }
225 }
226 
228 {
229  QModelIndex index = m_treeView->currentIndex();
230  QWidget* editor = m_treeView->indexWidget(index);
231  if (editor) {
232  // m_delegate->commitData(editor);
233  m_delegate->closeEditor(editor, QAbstractItemDelegate::NoHint);
234  }
235  m_treeView->selectionModel()->clearSelection();
236 }
#define ASSERT(condition)
Definition: Assert.h:31
Defines class GUIHelpers functions.
Defines class IntensityDataItem.
Defines class JobItem.
Defines class JobModel.
Defines class JobRealTimeToolBar.
Defines classes for ParameterTreeItems.
Defines class ParameterTuningDelegate.
Defines class ParameterTuningModel.
Defines class ParameterTuningWidget.
Defines class SliderSettingsWidget.
Defines class WarningSign.
void setZAxisLocked(bool state)
static const QString P_STATUS
Definition: JobItem.h:40
void runJob(const QModelIndex &index)
Definition: JobModel.cpp:179
void restore(JobItem *jobItem)
restore instrument and sample model from backup for given JobItem
Definition: JobModel.cpp:111
Represents a toolbar with buttons for ParameterTuningWidget.
void setOnPropertyChange(std::function< void(QString)> f, const void *caller=0)
Definition: ModelMapper.cpp:35
The ParameterItem class represent a tuning value in a parameter tuning tree.
void setReadOnly(bool isReadOnly)
void setSliderRangeFactor(double value)
void currentLinkChanged(SessionItem *item)
The ParameterTuningModel class represents parameters which can be tuned in real time in ParameterTuni...
ParameterItem * getParameterItem(const QModelIndex &proxyIndex) const
Returns ParameterItem from given proxy index.
void onCustomContextMenuRequested(const QPoint &point)
void makeSelected(ParameterItem *item)
ParameterTuningWidget(QWidget *parent=0)
void onCurrentLinkChanged(SessionItem *item)
ParameterTuningModel * m_parameterTuningModel
JobRealTimeToolBar * m_toolBar
void contextMenuEvent(QContextMenuEvent *)
void setTuningDelegateEnabled(bool enabled)
Sets delegate to enabled/disabled state.
QVector< ParameterItem * > getSelectedParameters()
Returns list of ParameterItem's currently selected in parameter tree.
void itemContextMenuRequest(const QPoint &point)
void onLockZValueChanged(bool value)
QItemSelectionModel * selectionModel()
SliderSettingsWidget * m_sliderSettingsWidget
ParameterTuningDelegate * m_delegate
void onPropertyChanged(const QString &property_name)
void updateDragAndDropSettings()
Disable drag-and-drop abilities, if job is in fit running state.
void onSliderValueChanged(double value)
The SessionItemWidget class is a base for all widgets representing the content of SessionItem.
SessionItem * currentItem()
ModelMapper * mapper()
Returns the current model mapper of this item. Creates new one if necessary.
SessionModel * model() const
Returns model of this item.
Definition: SessionItem.cpp:66
QModelIndex index() const
Returns model index of this item.
Definition: SessionItem.cpp:80
void sliderRangeFactorChanged(double value)
void lockzChanged(bool value)
The WarningSign controls appearance of WarningSignWidget on top of parent widget.
Definition: WarningSign.h:25
void clear()
Clears warning message;.
Definition: WarningSign.cpp:40
void setWarningMessage(const QString &warningMessage)
Shows warning sign on the screen.
Definition: WarningSign.cpp:58
IntensityDataItem * intensityDataItem(SessionItem *parent)
Returns IntensityDataItem contained as a child in givent parent.
QString const & name(EShape k)
Definition: particles.cpp:21