ColorScaleEditor.cpp
174 lines
| 5.8 KiB
| text/x-c
|
CppLexer
Alexandre Leroux
|
r1001 | #include "Visualization/ColorScaleEditor.h" | ||
Alexandre Leroux
|
r1010 | #include "Visualization/SqpColorScale.h" | ||
Alexandre Leroux
|
r1001 | |||
#include "ui_ColorScaleEditor.h" | ||||
Alexandre Leroux
|
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 | ||||
Alexandre Leroux
|
r1010 | ColorScaleEditor::ColorScaleEditor(SqpColorScale &scale, QWidget *parent) | ||
: QDialog{parent}, | ||||
ui{new Ui::ColorScaleEditor}, | ||||
Alexandre Leroux
|
r1014 | m_ThresholdGroup{new QButtonGroup{this}}, | ||
m_Scale{scale} | ||||
Alexandre Leroux
|
r1001 | { | ||
ui->setupUi(this); | ||||
Alexandre Leroux
|
r1005 | |||
// Inits gradient combobox content | ||||
for (auto it = GRADIENTS.begin(), end = GRADIENTS.end(); it != end; ++it) { | ||||
ui->gradientComboBox->addItem(it.key(), it.value()); | ||||
} | ||||
Alexandre Leroux
|
r1003 | // Creates threshold group | ||
m_ThresholdGroup->addButton(ui->thresholdAutoButton); | ||||
m_ThresholdGroup->addButton(ui->thresholdManualButton); | ||||
Alexandre Leroux
|
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); | ||||
Alexandre Leroux
|
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); | ||||
Alexandre Leroux
|
r1003 | // Inits connections | ||
Alexandre Leroux
|
r1007 | connect(ui->gradientComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updatePreview())); | ||
Alexandre Leroux
|
r1003 | connect(ui->thresholdAutoButton, SIGNAL(toggled(bool)), this, SLOT(onThresholdChanged(bool))); | ||
connect(ui->thresholdManualButton, SIGNAL(toggled(bool)), this, SLOT(onThresholdChanged(bool))); | ||||
Alexandre Leroux
|
r1004 | connect(ui->minSpinBox, SIGNAL(editingFinished()), this, SLOT(onMinChanged())); | ||
connect(ui->maxSpinBox, SIGNAL(editingFinished()), this, SLOT(onMaxChanged())); | ||||
Alexandre Leroux
|
r1003 | |||
Alexandre Leroux
|
r1012 | // OK/cancel buttons | ||
connect(ui->okButton, SIGNAL(clicked(bool)), this, SLOT(accept())); | ||||
connect(ui->cancelButton, SIGNAL(clicked(bool)), this, SLOT(reject())); | ||||
Alexandre Leroux
|
r1011 | // Loads color scale | ||
loadScale(); | ||||
Alexandre Leroux
|
r1001 | } | ||
ColorScaleEditor::~ColorScaleEditor() noexcept | ||||
{ | ||||
delete ui; | ||||
} | ||||
Alexandre Leroux
|
r1004 | |||
Alexandre Leroux
|
r1011 | void ColorScaleEditor::loadScale() | ||
{ | ||||
// Gradient | ||||
auto gradientPresetIndex = ui->gradientComboBox->findData(m_Scale.m_GradientPreset); | ||||
ui->gradientComboBox->setCurrentIndex(gradientPresetIndex); | ||||
// Threshold mode | ||||
(m_Scale.m_AutomaticThreshold ? ui->thresholdAutoButton : ui->thresholdManualButton) | ||||
->setChecked(true); | ||||
// Min/max | ||||
auto qcpColorScale = m_Scale.m_Scale; | ||||
auto range = qcpColorScale->dataRange(); | ||||
ui->minSpinBox->setValue(range.lower); | ||||
ui->maxSpinBox->setValue(range.upper); | ||||
updatePreview(); | ||||
} | ||||
Alexandre Leroux
|
r1012 | void ColorScaleEditor::saveScale() | ||
{ | ||||
auto qcpColorScale = m_Scale.m_Scale; | ||||
// Gradient | ||||
auto gradientPreset | ||||
= ui->gradientComboBox->currentData().value<QCPColorGradient::GradientPreset>(); | ||||
qcpColorScale->setGradient(gradientPreset); | ||||
m_Scale.m_GradientPreset = gradientPreset; | ||||
// Threshold mode | ||||
m_Scale.m_AutomaticThreshold = ui->thresholdAutoButton->isChecked(); | ||||
// Min/max | ||||
qcpColorScale->setDataRange(QCPRange{ui->minSpinBox->value(), ui->maxSpinBox->value()}); | ||||
} | ||||
void ColorScaleEditor::accept() | ||||
{ | ||||
saveScale(); | ||||
QDialog::accept(); | ||||
} | ||||
Alexandre Leroux
|
r1004 | void ColorScaleEditor::onMaxChanged() | ||
{ | ||||
// Ensures that max >= min | ||||
auto maxValue = ui->maxSpinBox->value(); | ||||
if (maxValue < ui->minSpinBox->value()) { | ||||
ui->minSpinBox->setValue(maxValue); | ||||
} | ||||
Alexandre Leroux
|
r1007 | updatePreview(); | ||
Alexandre Leroux
|
r1004 | } | ||
void ColorScaleEditor::onMinChanged() | ||||
{ | ||||
// Ensures that min <= max | ||||
auto minValue = ui->minSpinBox->value(); | ||||
if (minValue > ui->maxSpinBox->value()) { | ||||
ui->maxSpinBox->setValue(minValue); | ||||
} | ||||
Alexandre Leroux
|
r1007 | updatePreview(); | ||
Alexandre Leroux
|
r1004 | } | ||
Alexandre Leroux
|
r1003 | void ColorScaleEditor::onThresholdChanged(bool checked) | ||
{ | ||||
if (checked) { | ||||
auto isAutomatic = ui->thresholdAutoButton == m_ThresholdGroup->checkedButton(); | ||||
ui->minSpinBox->setEnabled(!isAutomatic); | ||||
ui->maxSpinBox->setEnabled(!isAutomatic); | ||||
Alexandre Leroux
|
r1021 | |||
// Computes automatic thresholds | ||||
if (isAutomatic) { | ||||
double minThreshold, maxThreshold; | ||||
std::tie(minThreshold, maxThreshold) = SqpColorScale::computeThresholds(m_Scale); | ||||
ui->minSpinBox->setValue(minThreshold); | ||||
ui->maxSpinBox->setValue(maxThreshold); | ||||
updatePreview(); | ||||
} | ||||
Alexandre Leroux
|
r1003 | } | ||
} | ||||
Alexandre Leroux
|
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(); | ||||
} | ||||