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)
43:
ScaleControl(label, parent, m_dDefaultMin, m_dDefaultMax)
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)
68 updateNLMapConstants();
74void ScaleControl::initLabel(
const char* charTextLabel)
76 m_pUi->label->setText(charTextLabel);
81void ScaleControl::initSpinBox()
83 m_pUi->spinBox->setKeyboardTracking(
false);
84 m_pUi->spinBox->setPrefix(
"+/- ");
86 connect(m_pUi->spinBox,
static_cast<void (QDoubleSpinBox::*)(
double)
>(&QDoubleSpinBox::valueChanged),
87 this, &ScaleControl::spinBoxChanged);
92void ScaleControl::initSlider()
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);
99 connect(m_pUi->slider,
static_cast<void (QSlider::*)(
int)
>(&QSlider::valueChanged),
100 this, &ScaleControl::sliderChanged);
114 m_pUi->spinBox->setValue(dScale);
121 if (m_pUi->spinBox->minimum() < s && s < m_pUi->spinBox->maximum()) {
122 m_fMaxSensitivityPoint = s;
123 updateNLMapConstants();
131 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) {
144 m_fMaxSensitivityPoint = (m_pUi->spinBox->minimum() + m_pUi->spinBox->maximum()) / 2;
146 updateNLMapConstants();
153 m_bSliderInverted = inverted;
158void ScaleControl::setSliderRange(
int min,
161 if ((0 < min) && (min < max)) {
162 m_pUi->slider->setRange(min, max);
163 updateNLMapConstants();
171 m_pUi->spinBox->setDecimals(d);
176void ScaleControl::spinBoxChanged(
double dScale)
178 m_bManagingSpinBoxChange =
true;
179 if (!m_bManagingSliderChange) {
180 m_pUi->slider->setValue(mapSpinBoxToSlider(dScale));
182 m_bManagingSpinBoxChange =
false;
188void ScaleControl::sliderChanged(
int dScale)
190 m_bManagingSliderChange =
true;
191 if (!m_bManagingSpinBoxChange) {
192 m_pUi->spinBox->setValue(mapSliderToSpinBox(dScale));
194 m_bManagingSliderChange =
false;
199inline float ScaleControl::weightedSensitivity(
float s)
201 return static_cast<double>(s) * s * s * 100 / m_pUi->spinBox->maximum();
206void ScaleControl::updateNLMapConstants()
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);
214int ScaleControl::mapSpinBoxToSlider(
double dScale)
216 float map = m_fMapKconstant * (atanf(weightedSensitivity(m_fSensitivity) * (
static_cast<float>(dScale) - m_fMaxSensitivityPoint)) - m_fMapYconstant);
218 if (m_bSliderInverted) {
219 out = m_pUi->slider->maximum() -
static_cast<int>(roundf(map));
221 out =
static_cast<int>(roundf(map));
228double ScaleControl::mapSliderToSpinBox(
int dScale)
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);
239 return m_pUi->spinBox->value();
244void ScaleControl::initMenu()
246 m_pSettingsMenu =
new QMenu(
this);
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);
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);
260 m_pUi->toolButton->setMenu(m_pSettingsMenu);
261 m_pUi->toolButton->setPopupMode(QToolButton::InstantPopup);
262 m_pUi->toolButton->setArrowType(Qt::ArrowType::NoArrow);
267void ScaleControl::promptMinValueChange()
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());
281void ScaleControl::promptMaxValueChange()
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);
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)