Sun, 25 Jul 2021 20:39:21 +0300
use QT_NO_KEYWORDS
#include <QDialog> #include <QCheckBox> #include <QSignalBlocker> #include "vec3editor.h" #include "ui_vec3editor.h" #include "../ui/multiplyfactordialog.h" Vec3Editor::Vec3Editor(const glm::vec3& value, QWidget *parent, QFlags<Flag> flags) : QWidget{parent}, ui{new Ui::Vec3Editor} { this->ui->setupUi(this); this->setValue(value); if (flags.testFlag(NoMultiplyButton)) { this->ui->multiply->setVisible(false); } else { connect(this->ui->multiply, &QPushButton::clicked, this, &Vec3Editor::multiplyPressed); } for (QDoubleSpinBox* spinbox : this->spinboxes()) { connect(spinbox, qOverload<double>(&QDoubleSpinBox::valueChanged), [&](double) { Q_EMIT this->valueChanged(this->value()); }); } } Vec3Editor::~Vec3Editor() { } glm::vec3 Vec3Editor::value() const { auto get = [](DoubleSpinBox* spinbox){ return toFloat(spinbox->value()); }; return {get(this->ui->x), get(this->ui->y), get(this->ui->z)}; } void Vec3Editor::setValue(const glm::vec3& value) { auto set = [](DoubleSpinBox* spinbox, float value) { QSignalBlocker blocker{spinbox}; spinbox->setValue(toQreal(value)); }; set(this->ui->x, value.x); set(this->ui->y, value.y); set(this->ui->z, value.z); Q_EMIT this->valueChanged(value); } std::array<DoubleSpinBox*, 3> Vec3Editor::spinboxes() { return {this->ui->x, this->ui->y, this->ui->z}; } void Vec3Editor::multiplyPressed() { MultiplyFactorDialog dialog{this->value(), this}; const int dialogResult = dialog.exec(); if (dialogResult == QDialog::Accepted) { this->setValue(dialog.value()); } }