From 816c119eb93708019caceb71917576e343d905a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Wed, 27 Feb 2019 12:53:46 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@502 a8b55f48-bf90-11e4-a774-851b48703e85 --- qad/widgets/mathmatrixedit.cpp | 53 ++++++++++++ qad/widgets/mathmatrixedit.h | 40 +++++++++ qad/widgets/mathvectoredit.cpp | 53 ++++++++++++ qad/widgets/mathvectoredit.h | 40 +++++++++ qad/widgets/matrixedit.cpp | 149 +++++++++++++++++++++++++++++++++ qad/widgets/matrixedit.h | 43 ++++++++++ qad/widgets/matrixedit.ui | 125 +++++++++++++++++++++++++++ 7 files changed, 503 insertions(+) create mode 100644 qad/widgets/mathmatrixedit.cpp create mode 100644 qad/widgets/mathmatrixedit.h create mode 100644 qad/widgets/mathvectoredit.cpp create mode 100644 qad/widgets/mathvectoredit.h create mode 100644 qad/widgets/matrixedit.cpp create mode 100644 qad/widgets/matrixedit.h create mode 100644 qad/widgets/matrixedit.ui diff --git a/qad/widgets/mathmatrixedit.cpp b/qad/widgets/mathmatrixedit.cpp new file mode 100644 index 0000000..758cb99 --- /dev/null +++ b/qad/widgets/mathmatrixedit.cpp @@ -0,0 +1,53 @@ +#include "mathmatrixedit.h" +#include "qvariantedit_custom.h" +#include "matrixedit.h" +#include + + +MathMatrixEdit::MathMatrixEdit(QWidget * parent): QWidget(parent) { + edit = new MatrixEdit(); + setLayout(new QBoxLayout(QBoxLayout::LeftToRight)); + layout()->setContentsMargins(0, 0, 0, 0); + layout()->addWidget(edit); + connect(edit, SIGNAL(changed()), this, SIGNAL(valueChanged())); +} + + +MathMatrixEdit::~MathMatrixEdit() { + delete edit; +} + + +QVariant MathMatrixEdit::value() const { + return QVariant::fromValue(QAD::MathMatrix(edit->matrix())); +} + + +bool MathMatrixEdit::isReadOnly() const { + return edit->isReadOnly(); +} + + +void MathMatrixEdit::setValue(const QVariant & v) { + edit->setMatrix(v.value().m); +} + + +void MathMatrixEdit::setReadOnly(bool yes) { + edit->setReadOnly(yes); +} + + + + +class Factory: public QVariantEditorFactoryBase { +public: + Factory() {} + virtual QWidget * createEditor() {return new MathMatrixEdit();} +}; + + +__MathMatrixEditRegistrator__::__MathMatrixEditRegistrator__() { + QVariantEditorFactories::registerEditorFactory(qMetaTypeId(), new Factory()); + //__QADTypesRegistrator__::instance()->toString_funcs.insert(qMetaTypeId(), &QAD_IODevice_toString); +} diff --git a/qad/widgets/mathmatrixedit.h b/qad/widgets/mathmatrixedit.h new file mode 100644 index 0000000..c4da51a --- /dev/null +++ b/qad/widgets/mathmatrixedit.h @@ -0,0 +1,40 @@ +#ifndef MATH_MATRIX_EDIT_H +#define MATH_MATRIX_EDIT_H + +#include +#include "qad_types.h" + +class MatrixEdit; + +class MathMatrixEdit: public QWidget { + Q_OBJECT + Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged) + Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly) +public: + explicit MathMatrixEdit(QWidget * parent = 0); + ~MathMatrixEdit(); + + QVariant value() const; + bool isReadOnly() const; + +private: + MatrixEdit * edit; + +public slots: + void setValue(const QVariant & v); + void setReadOnly(bool yes); + +signals: + void valueChanged(); + +}; + + +class __MathMatrixEditRegistrator__ { +public: + __MathMatrixEditRegistrator__(); +}; + +static __MathMatrixEditRegistrator__ __mathmatrixeditregistrator__; + +#endif // MATH_MATRIX_EDIT_H diff --git a/qad/widgets/mathvectoredit.cpp b/qad/widgets/mathvectoredit.cpp new file mode 100644 index 0000000..b9ff8f8 --- /dev/null +++ b/qad/widgets/mathvectoredit.cpp @@ -0,0 +1,53 @@ +#include "mathvectoredit.h" +#include "qvariantedit_custom.h" +#include "matrixedit.h" +#include + + +MathVectorEdit::MathVectorEdit(QWidget * parent): QWidget(parent) { + edit = new MatrixEdit(); + setLayout(new QBoxLayout(QBoxLayout::LeftToRight)); + layout()->setContentsMargins(0, 0, 0, 0); + layout()->addWidget(edit); + connect(edit, SIGNAL(changed()), this, SIGNAL(valueChanged())); +} + + +MathVectorEdit::~MathVectorEdit() { + delete edit; +} + + +QVariant MathVectorEdit::value() const { + return QVariant::fromValue(QAD::MathVector(edit->vector())); +} + + +bool MathVectorEdit::isReadOnly() const { + return edit->isReadOnly(); +} + + +void MathVectorEdit::setValue(const QVariant & v) { + edit->setVector(v.value().v); +} + + +void MathVectorEdit::setReadOnly(bool yes) { + edit->setReadOnly(yes); +} + + + + +class Factory: public QVariantEditorFactoryBase { +public: + Factory() {} + virtual QWidget * createEditor() {return new MathVectorEdit();} +}; + + +__MathVectorEditRegistrator__::__MathVectorEditRegistrator__() { + QVariantEditorFactories::registerEditorFactory(qMetaTypeId(), new Factory()); + //__QADTypesRegistrator__::instance()->toString_funcs.insert(qMetaTypeId(), &QAD_IODevice_toString); +} diff --git a/qad/widgets/mathvectoredit.h b/qad/widgets/mathvectoredit.h new file mode 100644 index 0000000..fd41066 --- /dev/null +++ b/qad/widgets/mathvectoredit.h @@ -0,0 +1,40 @@ +#ifndef MATH_VECTOR_EDIT_H +#define MATH_VECTOR_EDIT_H + +#include +#include "qad_types.h" + +class MatrixEdit; + +class MathVectorEdit: public QWidget { + Q_OBJECT + Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged) + Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly) +public: + explicit MathVectorEdit(QWidget * parent = 0); + ~MathVectorEdit(); + + QVariant value() const; + bool isReadOnly() const; + +private: + MatrixEdit * edit; + +public slots: + void setValue(const QVariant & v); + void setReadOnly(bool yes); + +signals: + void valueChanged(); + +}; + + +class __MathVectorEditRegistrator__ { +public: + __MathVectorEditRegistrator__(); +}; + +static __MathVectorEditRegistrator__ __mathvectoreditregistrator__; + +#endif // MATH_VECTOR_EDIT_H diff --git a/qad/widgets/matrixedit.cpp b/qad/widgets/matrixedit.cpp new file mode 100644 index 0000000..bed96f2 --- /dev/null +++ b/qad/widgets/matrixedit.cpp @@ -0,0 +1,149 @@ +#include "matrixedit.h" +#include "ui_matrixedit.h" +#include + + +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"); + } + } + +} + + +QVector MatrixEdit::vector() const { + QVector 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 > MatrixEdit::matrix() const { + QVector > 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 & 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 > & 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); +} diff --git a/qad/widgets/matrixedit.h b/qad/widgets/matrixedit.h new file mode 100644 index 0000000..e8c2c8d --- /dev/null +++ b/qad/widgets/matrixedit.h @@ -0,0 +1,43 @@ +#ifndef MATRIXEDIT_H +#define MATRIXEDIT_H + +#include + +namespace Ui { + class MatrixEdit; +} + +class MatrixEdit: public QWidget { + Q_OBJECT +public: + explicit MatrixEdit(QWidget * parent = 0); + ~MatrixEdit(); + + bool isReadOnly() const; + void setReadOnly(bool yes); + + QVector vector() const; + QVector > matrix() const; + void setVector(const QVector & v); + void setMatrix(const QVector > & v); + +private: + void setVectorMode(bool yes); + void clear(bool ident = false); + + Ui::MatrixEdit * ui; + bool ro; + +private slots: + void on_spinRows_valueChanged(int cnt); + void on_spinCols_valueChanged(int cnt); + void on_buttonNull_clicked(); + void on_buttonIdentity_clicked(); + +signals: + void changed(); + +}; + + +#endif // MATRIXEDIT_H diff --git a/qad/widgets/matrixedit.ui b/qad/widgets/matrixedit.ui new file mode 100644 index 0000000..64b56f6 --- /dev/null +++ b/qad/widgets/matrixedit.ui @@ -0,0 +1,125 @@ + + + MatrixEdit + + + + 0 + 0 + 283 + 264 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + QFormLayout::DontWrapRows + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + Rows: + + + + + + + 65536 + + + + + + + Cols: + + + + + + + 65536 + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Null + + + 0 + + + + + + + Identity + + + I + + + + + + + + + QAbstractItemView::ScrollPerPixel + + + QAbstractItemView::ScrollPerPixel + + + + + + + + + search(QString) + searchNext() + searchPrevious() + searchAll() + hideSearch() + +