MNE-CPP 0.1.9
A Framework for Electrophysiology
Loading...
Searching...
No Matches
scalecontrol.cpp
Go to the documentation of this file.
1//=============================================================================================================
35#include "scalecontrol.h"
36#include "ui_scalecontrol.h"
37#include <math.h>
38
39#include <QInputDialog>
40
41using namespace DISPLIB;
42
43const static float m_dDefaultMin(0.0f);
44const static float m_dDefaultMax(1.0f);
45const static float m_dDefaultMaxSensitivityPoint((m_dDefaultMin+m_dDefaultMax)/2.0f);
46const static float m_dDefaultSensitivity(0.3f);
47const static int m_iDefaultSliderMin(1);
48const static int m_iDefaultSliderMax(1000);
49const static int m_iDefaultSliderStep(1);
50const static int m_iDefaultSliderPageStep(10);
51
52//=============================================================================================================
53
55: ScaleControl(label, nullptr, m_dDefaultMin, m_dDefaultMax)
56{ }
57
58//=============================================================================================================
59
61 QWidget* parent)
62: ScaleControl(label, parent, m_dDefaultMin, m_dDefaultMax)
63{ }
64
65//=============================================================================================================
66
68 QWidget* parent,
69 double min,
70 double max)
71: QWidget(parent)
72, m_pUi(new Ui::ScaleControlWidget)
73, m_bManagingSpinBoxChange(false)
74, m_bManagingSliderChange(false)
75, m_fSensitivity(m_dDefaultSensitivity)
76, m_fMaxSensitivityPoint(m_dDefaultMaxSensitivityPoint)
77, m_fMapYconstant(0.0f)
78, m_fMapKconstant(0.0f)
79, m_bSliderInverted(false)
80{
81 m_pUi->setupUi(this);
82 initLabel(label);
83 initSpinBox();
84 initSlider();
85 initMenu();
86 updateNLMapConstants();
87 setRange(min, max);
88}
89
90//=============================================================================================================
91
92void ScaleControl::initLabel(const char* charTextLabel)
93{
94 m_pUi->label->setText(charTextLabel);
95}
96
97//=============================================================================================================
98
99void ScaleControl::initSpinBox()
100{
101 m_pUi->spinBox->setKeyboardTracking(false);
102 m_pUi->spinBox->setPrefix("+/- ");
103
104 connect(m_pUi->spinBox,static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
105 this,&ScaleControl::spinBoxChanged);
106}
107
108//=============================================================================================================
109
110void ScaleControl::initSlider()
111{
112 m_pUi->slider->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred));
113 m_pUi->slider->setSingleStep(m_iDefaultSliderStep);
114 m_pUi->slider->setPageStep(m_iDefaultSliderPageStep);
115 setSliderRange(m_iDefaultSliderMin, m_iDefaultSliderMax);
116
117 connect(m_pUi->slider,static_cast<void (QSlider::*)(int)>(&QSlider::valueChanged),
118 this,&ScaleControl::sliderChanged);
119}
120
121//=============================================================================================================
122
123Ui::ScaleControlWidget* ScaleControl::getUI()
124{
125 return m_pUi;
126}
127
128//=============================================================================================================
129
130void ScaleControl::setValue(double dScale)
131{
132 m_pUi->spinBox->setValue(dScale);
133}
134
135//=============================================================================================================
136
138{
139 if(m_pUi->spinBox->minimum() < s && s < m_pUi->spinBox->maximum())
140 {
141 m_fMaxSensitivityPoint = s;
142 updateNLMapConstants();
143 }
144}
145
146//=============================================================================================================
147
149{
150 if(0.0 < s && s < 1.0)
151 {
152 m_fSensitivity = s;
153 updateNLMapConstants();
154 }
155}
156
157//=============================================================================================================
158
160 double max)
161{
162 m_pUi->spinBox->setRange(min, max);
163 if(m_fMaxSensitivityPoint < m_pUi->spinBox->minimum() || m_pUi->spinBox->maximum() < m_fMaxSensitivityPoint)
164 {
165 m_fMaxSensitivityPoint = (m_pUi->spinBox->minimum() + m_pUi->spinBox->maximum())/2;
166 }
167 updateNLMapConstants();
168}
169
170//=============================================================================================================
171
172void ScaleControl::invertSlider(bool inverted)
173{
174 m_bSliderInverted = inverted;
175}
176
177//=============================================================================================================
178
179void ScaleControl::setSliderRange(int min,
180 int max)
181{
182 if( (0 < min) && (min < max) )
183 {
184 m_pUi->slider->setRange(min, max);
185 updateNLMapConstants();
186 }
187}
188
189//=============================================================================================================
190
192{
193 m_pUi->spinBox->setDecimals(d);
194}
195
196//=============================================================================================================
197
198void ScaleControl::spinBoxChanged(double dScale)
199{
200 m_bManagingSpinBoxChange = true;
201 if(!m_bManagingSliderChange)
202 {
203 m_pUi->slider->setValue(mapSpinBoxToSlider(dScale));
204 }
205 m_bManagingSpinBoxChange = false;
206 emit valueChanged(dScale);
207}
208
209//=============================================================================================================
210
211void ScaleControl::sliderChanged(int dScale)
212{
213 m_bManagingSliderChange = true;
214 if(!m_bManagingSpinBoxChange)
215 {
216 m_pUi->spinBox->setValue(mapSliderToSpinBox(dScale));
217 }
218 m_bManagingSliderChange = false;
219}
220
221//=============================================================================================================
222
223inline float ScaleControl::weightedSensitivity(float s)
224{
225 return s * s * s * 100 / m_pUi->spinBox->maximum();
226}
227
228//=============================================================================================================
229
230void ScaleControl::updateNLMapConstants()
231{
232 m_fMapYconstant = atanf(weightedSensitivity(m_fSensitivity) * (m_pUi->spinBox->minimum() - m_fMaxSensitivityPoint));
233 m_fMapKconstant = (m_pUi->slider->maximum() - m_pUi->slider->minimum()) / (atanf(weightedSensitivity(m_fSensitivity) * (m_pUi->spinBox->maximum() - m_fMaxSensitivityPoint)) - m_fMapYconstant);
234}
235
236//=============================================================================================================
237
238int ScaleControl::mapSpinBoxToSlider(double dScale)
239{
240 float map = m_fMapKconstant * (atanf(weightedSensitivity(m_fSensitivity) * (static_cast<float>(dScale) - m_fMaxSensitivityPoint)) - m_fMapYconstant);
241 int out;
242 if(m_bSliderInverted)
243 {
244 out = m_pUi->slider->maximum() - static_cast<int>(roundf(map));
245 } else {
246 out = static_cast<int> (roundf(map));
247 }
248 return out;
249}
250
251//=============================================================================================================
252
253double ScaleControl::mapSliderToSpinBox(int dScale)
254{
255 int valueCorrected = m_bSliderInverted? m_pUi->slider->maximum() - dScale : dScale;
256 float map = (1/weightedSensitivity(m_fSensitivity)) * tanf((static_cast<float>(valueCorrected) / m_fMapKconstant) + m_fMapYconstant) + m_fMaxSensitivityPoint;
257 return static_cast<double>(map);
258}
259
260//=============================================================================================================
261
263{
264 return m_pUi->spinBox->value();
265}
266
267//=============================================================================================================
268
269void ScaleControl::initMenu()
270{
271 m_pSettingsMenu = new QMenu(this); //Scale Control takes ownership of this QMenu and will trigger its deletion.
272
273 QAction* minVal = new QAction("Edit minimum value");
274 connect(minVal, &QAction::triggered,
275 this, &ScaleControl::promptMinValueChange,
276 Qt::UniqueConnection);
277 m_pSettingsMenu->addAction(minVal);//takes ownership
278
279 QAction* maxVal = new QAction("Edit maximum value");
280 connect(maxVal, &QAction::triggered,
281 this, &ScaleControl::promptMaxValueChange,
282 Qt::UniqueConnection);
283 m_pSettingsMenu->addAction(maxVal);//takes ownership
284
285 m_pUi->toolButton->setMenu(m_pSettingsMenu);
286 m_pUi->toolButton->setPopupMode(QToolButton::InstantPopup);
287 m_pUi->toolButton->setArrowType(Qt::ArrowType::NoArrow);
288}
289
290//=============================================================================================================
291
292void ScaleControl::promptMinValueChange()
293{
294 bool ok;
295 double min = QInputDialog::getDouble(this, tr("Minimum Value"),
296 tr("Please input a new minumum value:"),
297 m_pUi->spinBox->minimum(), 0.01, 100000,
298 2, &ok, Qt::WindowFlags(), 1);
299 if(ok && min <= m_pUi->spinBox->maximum()){
300 setRange(min, m_pUi->spinBox->maximum());
301 }
302}
303
304//=============================================================================================================
305
306void ScaleControl::promptMaxValueChange()
307{
308 bool ok;
309 double max = QInputDialog::getDouble(this, tr("Maximum Value"),
310 tr("Please input a new maximum value:"),
311 m_pUi->spinBox->maximum(), 0.01, 100000,
312 2, &ok, Qt::WindowFlags(), 1);
313 if(ok && max >= m_pUi->spinBox->minimum()){
314 setRange(m_pUi->spinBox->minimum(), max);
315 }
316}
Declaration of the ScaleControl Class.
The ScaleControl class packs together a QLabel, a DoubleSpinbox and a Slider with the necessary facil...
Ui::ScaleControlWidget * getUI()
void invertSlider(bool inverted)
void setSensitivity(double s)
void setRange(double min, double max)
void setMaxSensitivityPoint(double s)
ScaleControl(const char *label)
void valueChanged(double dScale)
void setValue(double dScale)