widgets/vec3editor.cpp

changeset 252
da4876bfd822
parent 206
654661eab7f3
child 254
b7b29cb82360
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/widgets/vec3editor.cpp	Wed Jun 22 20:27:53 2022 +0300
@@ -0,0 +1,67 @@
+#include <QDialog>
+#include <QCheckBox>
+#include <QSignalBlocker>
+#include "vec3editor.h"
+#include "ui_vec3editor.h"
+#include "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 static_cast<float>(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(static_cast<qreal>(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());
+	}
+}

mercurial