This repository has been archived on 2020-09-07. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
libs/qad/widgets/matrixedit.cpp
2020-05-25 16:59:19 +03:00

162 lines
3.2 KiB
C++

#include "matrixedit.h"
#include "ui_matrixedit.h"
#include <QBoxLayout>
MatrixEdit::MatrixEdit(QWidget * parent): QWidget(parent) {
ui = new Ui::MatrixEdit();
ui->setupUi(this);
connect(ui->table, SIGNAL(cellChanged(int,int)), this, SIGNAL(changed()));
ro = false;
}
MatrixEdit::~MatrixEdit() {
delete ui;
}
bool MatrixEdit::isReadOnly() const {
return ro;
}
void MatrixEdit::setReadOnly(bool yes) {
ro = yes;
/// TODO
}
void MatrixEdit::setVectorMode(bool yes) {
if (yes)
ui->spinCols->setValue(1);
ui->labelCols->setHidden(yes);
ui->spinCols->setHidden(yes);
ui->buttonIdentity->setHidden(yes);
}
void MatrixEdit::clear(bool ident) {
int cc = ui->table->columnCount();
for (int r = 0; r < ui->table->rowCount(); ++r) {
for (int c = 0; c < cc; ++c) {
QTableWidgetItem * i = ui->table->item(r, c);
if (!i) {
i = new QTableWidgetItem();
ui->table->setItem(r, c, i);
}
i->setText((ident && (r == c)) ? "1" : "0");
}
}
}
void MatrixEdit::changeEvent(QEvent * e) {
QWidget::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
QVector<double> MatrixEdit::vector() const {
QVector<double> ret;
if (ui->table->columnCount() < 1) return ret;
ret.resize(ui->table->rowCount());
ret.fill(0.);
for (int r = 0; r < ret.size(); ++r) {
QTableWidgetItem * i = ui->table->item(r, 0);
if (!i) continue;
ret[r] = i->text().toDouble();
}
return ret;
}
QVector<QVector<double> > MatrixEdit::matrix() const {
QVector<QVector<double> > ret;
if (ui->table->columnCount() < 1 || ui->table->rowCount() < 1) return ret;
int cc = ui->table->columnCount();
ret.resize(ui->table->rowCount());
for (int r = 0; r < ret.size(); ++r) {
ret[r].resize(cc);
ret[r].fill(0.);
for (int c = 0; c < cc; ++c) {
QTableWidgetItem * i = ui->table->item(r, c);
if (!i) continue;
ret[r][c] = i->text().toDouble();
}
}
return ret;
}
void MatrixEdit::setVector(const QVector<double> & v) {
clear();
if (v.isEmpty()) return;
blockSignals(true);
ui->spinRows->setValue(v.size());
setVectorMode(true);
for (int r = 0; r < v.size(); ++r) {
QTableWidgetItem * i = ui->table->item(r, 0);
if (!i) {
i = new QTableWidgetItem();
ui->table->setItem(r, 0, i);
}
i->setText(QString::number(v[r]));
}
blockSignals(false);
emit changed();
}
void MatrixEdit::setMatrix(const QVector<QVector<double> > & v) {
clear();
if (v.isEmpty()) return;
if (v[0].isEmpty()) return;
blockSignals(true);
int cc = v[0].size();
ui->spinRows->setValue(v.size());
ui->spinCols->setValue(cc);
setVectorMode(false);
for (int r = 0; r < v.size(); ++r) {
for (int c = 0; c < v[r].size(); ++c) {
QTableWidgetItem * i = ui->table->item(r, c);
if (!i) {
i = new QTableWidgetItem();
ui->table->setItem(r, c, i);
}
i->setText(QString::number(v[r][c]));
}
}
blockSignals(false);
emit changed();
}
void MatrixEdit::on_spinRows_valueChanged(int cnt) {
ui->table->setRowCount(cnt);
emit changed();
}
void MatrixEdit::on_spinCols_valueChanged(int cnt) {
ui->table->setColumnCount(cnt);
emit changed();
}
void MatrixEdit::on_buttonNull_clicked() {
clear();
}
void MatrixEdit::on_buttonIdentity_clicked() {
clear(true);
}