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