16#include "ui_scalecontrol.h"
19#include <QInputDialog>
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);
35:
ScaleControl(label, nullptr, m_dDefaultMin, m_dDefaultMax)
42:
ScaleControl(label, parent, m_dDefaultMin, m_dDefaultMax)
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)
66 updateNLMapConstants();
72void ScaleControl::initLabel(
const char* charTextLabel)
74 m_pUi->label->setText(charTextLabel);
79void ScaleControl::initSpinBox()
81 m_pUi->spinBox->setKeyboardTracking(
false);
82 m_pUi->spinBox->setPrefix(
"+/- ");
84 connect(m_pUi->spinBox,
static_cast<void (QDoubleSpinBox::*)(
double)
>(&QDoubleSpinBox::valueChanged),
85 this,&ScaleControl::spinBoxChanged);
90void ScaleControl::initSlider()
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);
97 connect(m_pUi->slider,
static_cast<void (QSlider::*)(
int)
>(&QSlider::valueChanged),
98 this,&ScaleControl::sliderChanged);
112 m_pUi->spinBox->setValue(dScale);
119 if(m_pUi->spinBox->minimum() < s && s < m_pUi->spinBox->maximum())
121 m_fMaxSensitivityPoint = s;
122 updateNLMapConstants();
130 if(0.0 < s && s < 1.0)
133 updateNLMapConstants();
142 m_pUi->spinBox->setRange(min, max);
143 if(m_fMaxSensitivityPoint < m_pUi->spinBox->minimum() || m_pUi->spinBox->maximum() < m_fMaxSensitivityPoint)
145 m_fMaxSensitivityPoint = (m_pUi->spinBox->minimum() + m_pUi->spinBox->maximum())/2;
147 updateNLMapConstants();
154 m_bSliderInverted = inverted;
159void ScaleControl::setSliderRange(
int min,
162 if( (0 < min) && (min < max) )
164 m_pUi->slider->setRange(min, max);
165 updateNLMapConstants();
173 m_pUi->spinBox->setDecimals(d);
178void ScaleControl::spinBoxChanged(
double dScale)
180 m_bManagingSpinBoxChange =
true;
181 if(!m_bManagingSliderChange)
183 m_pUi->slider->setValue(mapSpinBoxToSlider(dScale));
185 m_bManagingSpinBoxChange =
false;
191void ScaleControl::sliderChanged(
int dScale)
193 m_bManagingSliderChange =
true;
194 if(!m_bManagingSpinBoxChange)
196 m_pUi->spinBox->setValue(mapSliderToSpinBox(dScale));
198 m_bManagingSliderChange =
false;
203inline float ScaleControl::weightedSensitivity(
float s)
205 return static_cast<double>(s) * s * s * 100 / m_pUi->spinBox->maximum();
210void ScaleControl::updateNLMapConstants()
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);
218int ScaleControl::mapSpinBoxToSlider(
double dScale)
220 float map = m_fMapKconstant * (atanf(weightedSensitivity(m_fSensitivity) * (
static_cast<float>(dScale) - m_fMaxSensitivityPoint)) - m_fMapYconstant);
222 if(m_bSliderInverted)
224 out = m_pUi->slider->maximum() -
static_cast<int>(roundf(map));
226 out =
static_cast<int> (roundf(map));
233double ScaleControl::mapSliderToSpinBox(
int dScale)
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);
244 return m_pUi->spinBox->value();
249void ScaleControl::initMenu()
251 m_pSettingsMenu =
new QMenu(
this);
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);
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);
265 m_pUi->toolButton->setMenu(m_pSettingsMenu);
266 m_pUi->toolButton->setPopupMode(QToolButton::InstantPopup);
267 m_pUi->toolButton->setArrowType(Qt::ArrowType::NoArrow);
272void ScaleControl::promptMinValueChange()
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());
286void ScaleControl::promptMaxValueChange()
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);
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)