ColorScaleEditor.cpp
116 lines
| 4.1 KiB
| text/x-c
|
CppLexer
|
r1001 | #include "Visualization/ColorScaleEditor.h" | ||
|
r1006 | #include "Visualization/qcustomplot.h" | ||
|
r1001 | |||
#include "ui_ColorScaleEditor.h" | ||||
|
r1005 | namespace { | ||
const auto GRADIENTS = QVariantMap{{"Candy", QCPColorGradient::gpCandy}, | ||||
{"Cold", QCPColorGradient::gpCold}, | ||||
{"Geography", QCPColorGradient::gpGeography}, | ||||
{"Grayscale", QCPColorGradient::gpGrayscale}, | ||||
{"Hot", QCPColorGradient::gpHot}, | ||||
{"Hues", QCPColorGradient::gpHues}, | ||||
{"Ion", QCPColorGradient::gpIon}, | ||||
{"Jet", QCPColorGradient::gpJet}, | ||||
{"Night", QCPColorGradient::gpNight}, | ||||
{"Polar", QCPColorGradient::gpPolar}, | ||||
{"Spectrum", QCPColorGradient::gpSpectrum}, | ||||
{"Thermal", QCPColorGradient::gpThermal}}; | ||||
} // namespace | ||||
|
r1003 | ColorScaleEditor::ColorScaleEditor(QWidget *parent) | ||
: QDialog{parent}, ui{new Ui::ColorScaleEditor}, m_ThresholdGroup{new QButtonGroup{this}} | ||||
|
r1001 | { | ||
ui->setupUi(this); | ||||
|
r1005 | |||
// Inits gradient combobox content | ||||
for (auto it = GRADIENTS.begin(), end = GRADIENTS.end(); it != end; ++it) { | ||||
ui->gradientComboBox->addItem(it.key(), it.value()); | ||||
} | ||||
|
r1003 | // Creates threshold group | ||
m_ThresholdGroup->addButton(ui->thresholdAutoButton); | ||||
m_ThresholdGroup->addButton(ui->thresholdManualButton); | ||||
|
r1004 | // Inits min/max spinboxes' properties | ||
auto setSpinBoxProperties = [](auto &spinBox) { | ||||
spinBox.setDecimals(3); | ||||
spinBox.setMinimum(-std::numeric_limits<double>::max()); | ||||
spinBox.setMaximum(std::numeric_limits<double>::max()); | ||||
}; | ||||
setSpinBoxProperties(*ui->minSpinBox); | ||||
setSpinBoxProperties(*ui->maxSpinBox); | ||||
|
r1006 | // Creates color scale preview | ||
m_PreviewScale = new QCPColorScale{ui->plot}; | ||||
m_PreviewScale->setType(QCPAxis::atTop); | ||||
m_PreviewScale->setMinimumMargins(QMargins{5, 5, 5, 5}); | ||||
m_PreviewScale->axis()->setScaleType(QCPAxis::stLogarithmic); | ||||
m_PreviewScale->axis()->setNumberPrecision(0); | ||||
m_PreviewScale->axis()->setNumberFormat("eb"); | ||||
m_PreviewScale->axis()->setTicker(QSharedPointer<QCPAxisTickerLog>::create()); | ||||
m_PreviewScale->setGradient(QCPColorGradient{QCPColorGradient::gpJet}); | ||||
ui->plot->plotLayout()->clear(); | ||||
ui->plot->plotLayout()->insertRow(0); | ||||
ui->plot->plotLayout()->addElement(0, 0, m_PreviewScale); | ||||
|
r1003 | // Inits connections | ||
|
r1007 | connect(ui->gradientComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updatePreview())); | ||
|
r1003 | connect(ui->thresholdAutoButton, SIGNAL(toggled(bool)), this, SLOT(onThresholdChanged(bool))); | ||
connect(ui->thresholdManualButton, SIGNAL(toggled(bool)), this, SLOT(onThresholdChanged(bool))); | ||||
|
r1004 | connect(ui->minSpinBox, SIGNAL(editingFinished()), this, SLOT(onMinChanged())); | ||
connect(ui->maxSpinBox, SIGNAL(editingFinished()), this, SLOT(onMaxChanged())); | ||||
|
r1003 | |||
// First update | ||||
onThresholdChanged(true); | ||||
|
r1007 | updatePreview(); | ||
|
r1001 | } | ||
ColorScaleEditor::~ColorScaleEditor() noexcept | ||||
{ | ||||
delete ui; | ||||
} | ||||
|
r1004 | |||
void ColorScaleEditor::onMaxChanged() | ||||
{ | ||||
// Ensures that max >= min | ||||
auto maxValue = ui->maxSpinBox->value(); | ||||
if (maxValue < ui->minSpinBox->value()) { | ||||
ui->minSpinBox->setValue(maxValue); | ||||
} | ||||
|
r1007 | updatePreview(); | ||
|
r1004 | } | ||
void ColorScaleEditor::onMinChanged() | ||||
{ | ||||
// Ensures that min <= max | ||||
auto minValue = ui->minSpinBox->value(); | ||||
if (minValue > ui->maxSpinBox->value()) { | ||||
ui->maxSpinBox->setValue(minValue); | ||||
} | ||||
|
r1007 | updatePreview(); | ||
|
r1004 | } | ||
|
r1003 | void ColorScaleEditor::onThresholdChanged(bool checked) | ||
{ | ||||
if (checked) { | ||||
auto isAutomatic = ui->thresholdAutoButton == m_ThresholdGroup->checkedButton(); | ||||
ui->minSpinBox->setEnabled(!isAutomatic); | ||||
ui->maxSpinBox->setEnabled(!isAutomatic); | ||||
} | ||||
} | ||||
|
r1007 | void ColorScaleEditor::updatePreview() | ||
{ | ||||
m_PreviewScale->setDataRange(QCPRange{ui->minSpinBox->value(), ui->maxSpinBox->value()}); | ||||
m_PreviewScale->setGradient( | ||||
ui->gradientComboBox->currentData().value<QCPColorGradient::GradientPreset>()); | ||||
ui->plot->replot(); | ||||
} | ||||