widgets/matrixeditor.cpp

changeset 252
da4876bfd822
parent 250
2837b549e616
child 264
76a025db4948
equal deleted inserted replaced
251:94b0a30a1886 252:da4876bfd822
1 #include "matrixeditor.h"
2 #include "ui_matrixeditor.h"
3 #include "multiplyfactordialog.h"
4
5 constexpr char BUTTON_COLUMN_PROPERTY[] = "_ldforge_column";
6
7 MatrixEditor::MatrixEditor(const glm::mat4 value, QWidget* parent) :
8 QWidget(parent),
9 ui(new Ui::MatrixEditor)
10 {
11 ui->setupUi(this);
12 for (int column = 0; column < (int)glm::countof(this->spinboxes); column += 1)
13 {
14 for (int row = 0; row < (int)glm::countof(this->spinboxes[0]); row += 1)
15 {
16 const QString name = QStringLiteral("cell%1%2").arg(column).arg(row);
17 QDoubleSpinBox** spinbox = &this->spinboxes[column][row];
18 *spinbox = this->findChild<QDoubleSpinBox*>(name);
19 connect(*spinbox, qOverload<double>(&QDoubleSpinBox::valueChanged), [&]()
20 {
21 Q_EMIT this->valueChanged(this->value());
22 });
23 Q_ASSERT(*spinbox != nullptr);
24 }
25 const QString multiplyButtonName = QStringLiteral("multiply%1").arg(column);
26 QAbstractButton* button = this->findChild<QAbstractButton*>(multiplyButtonName);
27 button->setProperty(BUTTON_COLUMN_PROPERTY, column);
28 connect(button, &QAbstractButton::clicked, this, &MatrixEditor::multiplyButtonPressed);
29 }
30 this->setValue(value);
31 }
32
33 MatrixEditor::MatrixEditor(QWidget *parent) :
34 MatrixEditor{glm::mat4{1}, parent}
35 {
36 }
37
38 MatrixEditor::~MatrixEditor()
39 {
40 delete ui;
41 }
42
43 glm::mat4 MatrixEditor::value() const
44 {
45 glm::mat4 result{1};
46 for (int column = 0; column < (int)glm::countof(this->spinboxes); column += 1)
47 {
48 for (int row = 0; row < (int)glm::countof(this->spinboxes[0]); row += 1)
49 {
50 result[column][row] = static_cast<float>(this->spinboxes[column][row]->value());
51 }
52 }
53 return result;
54 }
55
56 void MatrixEditor::setValue(const glm::mat4& value)
57 {
58 for (int column = 0; column < (int)glm::countof(this->spinboxes); column += 1)
59 {
60 for (int row = 0; row < (int)glm::countof(this->spinboxes[0]); row += 1)
61 {
62 QDoubleSpinBox* spinbox = this->spinboxes[column][row];
63 QSignalBlocker blocker{spinbox};
64 spinbox->setValue(value[column][row]);
65 }
66 }
67 }
68
69 void MatrixEditor::multiplyButtonPressed()
70 {
71 QAbstractButton* button = qobject_cast<QAbstractButton*>(this->sender());
72 if (button != nullptr)
73 {
74 bool ok;
75 const int column = button->property(BUTTON_COLUMN_PROPERTY).toInt(&ok);
76 if (ok and column >= 0 and column < this->matrixSize())
77 {
78 glm::mat4 newValue = this->value();
79 MultiplyFactorDialog dialog{newValue[column], this};
80 const int result = dialog.exec();
81 if (result == QDialog::Accepted)
82 {
83 newValue[column] = glm::vec4{dialog.value(), (column == 3) ? 1 : 0};
84 this->setValue(newValue);
85 Q_EMIT valueChanged(newValue);
86 }
87 }
88 }
89 }

mercurial