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