BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
RunFitControlWidget.cpp
Go to the documentation of this file.
1 // ************************************************************************************************
2 //
3 // BornAgain: simulate and fit reflection and scattering
4 //
5 //! @file GUI/coregui/Views/FitWidgets/RunFitControlWidget.cpp
6 //! @brief Implements class RunFitControlWidget
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 
21 #include <QFont>
22 #include <QHBoxLayout>
23 #include <QLabel>
24 #include <QPushButton>
25 #include <QSlider>
26 
27 namespace {
28 const int default_interval = 10;
29 const std::vector<int> slider_to_interval = {1, 2, 3, 4, 5, 10, 15, 20,
30  25, 30, 50, 100, 200, 500, 1000};
31 const QString slider_tooltip = "Updates fit progress every Nth iteration";
32 } // namespace
33 
35  : SessionItemWidget(parent)
36  , m_startButton(new QPushButton)
37  , m_stopButton(new QPushButton)
38  , m_intervalSlider(new QSlider)
39  , m_updateIntervalLabel(new QLabel)
40  , m_iterationsCountLabel(new QLabel)
41  , m_warningSign(new WarningSign(this))
42 {
43  setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
45 
46  m_startButton->setText("Run");
47  m_startButton->setToolTip("Run fitting");
48  m_startButton->setMaximumWidth(80);
49 
50  m_stopButton->setText("Stop");
51  m_stopButton->setToolTip("Interrupt fitting");
52  m_stopButton->setMaximumWidth(80);
53 
54  m_intervalSlider->setToolTip(slider_tooltip);
55  m_intervalSlider->setOrientation(Qt::Horizontal);
56  m_intervalSlider->setRange(0, static_cast<int>(slider_to_interval.size()) - 1);
57  m_intervalSlider->setMaximumWidth(120);
58  m_intervalSlider->setMinimumWidth(120);
59  m_intervalSlider->setFocusPolicy(Qt::NoFocus);
60  m_intervalSlider->setValue(5);
61 
62  QFont font("Monospace", DesignerHelper::getLabelFontSize(), QFont::Normal);
63  font.setPointSize(DesignerHelper::getPortFontSize());
64  m_updateIntervalLabel->setToolTip(slider_tooltip);
65  m_updateIntervalLabel->setFont(font);
66  m_updateIntervalLabel->setText(QString::number(sliderUpdateInterval()));
67 
68  auto layout = new QHBoxLayout;
69  layout->setSpacing(0);
70  layout->addWidget(m_startButton);
71  layout->addSpacing(5);
72  layout->addWidget(m_stopButton);
73  layout->addSpacing(5);
74  layout->addWidget(m_intervalSlider);
75  layout->addSpacing(2);
76  layout->addWidget(m_updateIntervalLabel);
77  layout->addSpacing(5);
78  layout->addStretch();
79  layout->addWidget(m_iterationsCountLabel);
80  setLayout(layout);
81 
82  connect(m_startButton, &QPushButton::clicked, [&]() { startFittingPushed(); });
83  connect(m_stopButton, &QPushButton::clicked, this, [&]() { stopFittingPushed(); });
84  connect(m_intervalSlider, &QSlider::valueChanged, this,
86 
87  setEnabled(false);
88 }
89 
91 {
93 }
94 
95 void RunFitControlWidget::onFittingError(const QString& what)
96 {
98  m_iterationsCountLabel->setText("");
100 }
101 
103 {
104  int interval = sliderValueToUpdateInterval(value);
105  m_updateIntervalLabel->setText(QString::number(interval));
106  if (fitSuiteItem())
108 }
109 
111 {
114  m_iterationsCountLabel->setText(QString::number(niter));
115  }
116 }
117 
119 {
121 
123 
125  [this](const QString& name) { onFitSuitePropertyChange(name); }, this);
126 
128 
130  [this](const QString& name) {
131  if (name == JobItem::P_STATUS)
133  },
134  this);
135 }
136 
138 {
139  setEnabled(false);
141 }
142 
144 {
146 }
147 
148 //! converts slider value (1-15) to update interval to be propagated to FitSuiteWidget
149 
151 {
152  size_t svalue = static_cast<size_t>(value);
153  return svalue < slider_to_interval.size() ? slider_to_interval[svalue] : default_interval;
154 }
155 
156 //! Updates button "enabled" status and warning status depending on current job conditions.
157 
159 {
160  setEnabled(isValidJobItem());
161 
162  if (jobItem()->getStatus() == "Fitting") {
163  m_startButton->setEnabled(false);
164  m_stopButton->setEnabled(true);
165  m_warningSign->clear();
166  } else {
167  m_startButton->setEnabled(true);
168  m_stopButton->setEnabled(false);
169  }
170 }
171 
173 {
174  return dynamic_cast<JobItem*>(currentItem());
175 }
176 
178 {
179  return jobItem() ? jobItem()->fitSuiteItem() : nullptr;
180 }
181 
183 {
184  return jobItem() ? jobItem()->isValidForFitting() : false;
185 }
186 
188 {
189  if (fitSuiteItem())
190  fitSuiteItem()->mapper()->unsubscribe(this);
191 }
Defines class DesignerHelper.
Defines class FitSuiteItem.
Defines class JobItem.
Defines class RunFitControlWidget.
Defines class WarningSign.
static int getLabelFontSize()
static int getPortFontSize()
static const QString P_UPDATE_INTERVAL
Definition: FitSuiteItem.h:26
static const QString P_ITERATION_COUNT
Definition: FitSuiteItem.h:27
static const QString P_STATUS
Definition: JobItem.h:40
FitSuiteItem * fitSuiteItem()
Definition: JobItem.cpp:235
bool isValidForFitting()
Definition: JobItem.cpp:165
void unsubscribe(const void *caller)
Cancells all subscribtion of given caller.
Definition: ModelMapper.cpp:98
void setOnPropertyChange(std::function< void(QString)> f, const void *caller=0)
Definition: ModelMapper.cpp:35
void onFittingError(const QString &what)
QPushButton * m_stopButton
virtual void subscribeToItem()
QPushButton * m_startButton
virtual void unsubscribeFromItem()
FitSuiteItem * fitSuiteItem()
void updateControlElements()
Updates button "enabled" status and warning status depending on current job conditions.
int sliderValueToUpdateInterval(int value)
converts slider value (1-15) to update interval to be propagated to FitSuiteWidget
WarningSign * m_warningSign
RunFitControlWidget(QWidget *parent=0)
void onFitSuitePropertyChange(const QString &name)
void onSliderValueChanged(int value)
The SessionItemWidget class is a base for all widgets representing the content of SessionItem.
SessionItem * currentItem()
QVariant getItemValue(const QString &tag) const
Directly access value of item under given tag.
ModelMapper * mapper()
Returns the current model mapper of this item. Creates new one if necessary.
void setItemValue(const QString &tag, const QVariant &variant)
Directly set value of item under given tag.
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
Defines namespace Constants.
const unsigned int RUN_FIT_CONTROL_WIDGET_HEIGHT
QString const & name(EShape k)
Definition: particles.cpp:21