src/widgets/matrixeditor.cpp

Sun, 25 Jul 2021 20:39:21 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Sun, 25 Jul 2021 20:39:21 +0300
changeset 112
5760cbb32bc0
parent 85
40e2940605a3
child 206
654661eab7f3
permissions
-rw-r--r--

use QT_NO_KEYWORDS

#include "main.h"
#include "matrixeditor.h"
#include "ui_matrixeditor.h"
#include "../ui/multiplyfactordialog.h"

constexpr char BUTTON_COLUMN_PROPERTY[] = "_ldforge_column";

MatrixEditor::MatrixEditor(const glm::mat4 value, QWidget* parent) :
	QWidget(parent),
	ui(new Ui::MatrixEditor)
{
	ui->setupUi(this);
	for (int column = 0; column < countof(this->spinboxes); column += 1)
	{
		for (int row = 0; row < countof(this->spinboxes[0]); row += 1)
		{
			const QString name = "cell"_q + QString::number(column) + QString::number(row);
			QDoubleSpinBox** spinbox = &this->spinboxes[column][row];
			*spinbox = this->findChild<QDoubleSpinBox*>(name);
			connect(*spinbox, qOverload<double>(&QDoubleSpinBox::valueChanged), [&]()
			{
				Q_EMIT this->valueChanged(this->value());
			});
			Q_ASSERT(*spinbox != nullptr);
		}
		QAbstractButton* button = this->findChild<QAbstractButton*>("multiply"_q + QString::number(column));
		button->setProperty(BUTTON_COLUMN_PROPERTY, column);
		connect(button, &QAbstractButton::clicked, this, &MatrixEditor::multiplyButtonPressed);
	}
	this->setValue(value);
}

MatrixEditor::MatrixEditor(QWidget *parent) :
	MatrixEditor{glm::mat4{1}, parent}
{
}

MatrixEditor::~MatrixEditor()
{
	delete ui;
}

glm::mat4 MatrixEditor::value() const
{
	glm::mat4 result{1};
	for (int column = 0; column < countof(this->spinboxes); column += 1)
	{
		for (int row = 0; row < countof(this->spinboxes[0]); row += 1)
		{
			result[column][row] = this->spinboxes[column][row]->value();
		}
	}
	return result;
}

void MatrixEditor::setValue(const glm::mat4& value)
{
	for (int column = 0; column < countof(this->spinboxes); column += 1)
	{
		for (int row = 0; row < countof(this->spinboxes[0]); row += 1)
		{
			QDoubleSpinBox* spinbox = this->spinboxes[column][row];
			QSignalBlocker blocker{spinbox};
			spinbox->setValue(value[column][row]);
		}
	}
}

void MatrixEditor::multiplyButtonPressed()
{
	QAbstractButton* button = qobject_cast<QAbstractButton*>(this->sender());
	if (button != nullptr)
	{
		bool ok;
		const int column = button->property(BUTTON_COLUMN_PROPERTY).toInt(&ok);
		if (ok and column >= 0 and column < this->matrixSize())
		{
			glm::mat4 newValue = this->value();
			MultiplyFactorDialog dialog{newValue[column], this};
			const int result = dialog.exec();
			if (result == QDialog::Accepted)
			{
				newValue[column] = glm::vec4{dialog.value(), (column == 3) ? 1 : 0};
				this->setValue(newValue);
				Q_EMIT valueChanged(newValue);
			}
		}
	}
}

mercurial