src/widgets/vec3editor.cpp

Tue, 01 Mar 2022 17:00:19 +0200

author
Teemu Piippo <teemu@hecknology.net>
date
Tue, 01 Mar 2022 17:00:19 +0200
changeset 149
008989bc7d6e
parent 86
4bec0525ef1b
child 206
654661eab7f3
permissions
-rw-r--r--

work on edit history

#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());
	}
}

mercurial