git-svn-id: svn://db.shs.com.ru/libs@502 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2019-02-27 12:53:46 +00:00
parent e049cd5594
commit 816c119eb9
7 changed files with 503 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
#include "mathmatrixedit.h"
#include "qvariantedit_custom.h"
#include "matrixedit.h"
#include <QBoxLayout>
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<QAD::MathMatrix>().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<QAD::MathMatrix>(), new Factory());
//__QADTypesRegistrator__::instance()->toString_funcs.insert(qMetaTypeId<QAD::IODevice>(), &QAD_IODevice_toString);
}

View File

@@ -0,0 +1,40 @@
#ifndef MATH_MATRIX_EDIT_H
#define MATH_MATRIX_EDIT_H
#include <QWidget>
#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

View File

@@ -0,0 +1,53 @@
#include "mathvectoredit.h"
#include "qvariantedit_custom.h"
#include "matrixedit.h"
#include <QBoxLayout>
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<QAD::MathVector>().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<QAD::MathVector>(), new Factory());
//__QADTypesRegistrator__::instance()->toString_funcs.insert(qMetaTypeId<QAD::IODevice>(), &QAD_IODevice_toString);
}

View File

@@ -0,0 +1,40 @@
#ifndef MATH_VECTOR_EDIT_H
#define MATH_VECTOR_EDIT_H
#include <QWidget>
#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

149
qad/widgets/matrixedit.cpp Normal file
View File

@@ -0,0 +1,149 @@
#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");
}
}
}
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);
}

43
qad/widgets/matrixedit.h Normal file
View File

@@ -0,0 +1,43 @@
#ifndef MATRIXEDIT_H
#define MATRIXEDIT_H
#include <QWidget>
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<double> vector() const;
QVector<QVector<double> > matrix() const;
void setVector(const QVector<double> & v);
void setMatrix(const QVector<QVector<double> > & 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

125
qad/widgets/matrixedit.ui Normal file
View File

@@ -0,0 +1,125 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MatrixEdit</class>
<widget class="QWidget" name="MatrixEdit">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>283</width>
<height>264</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="rowWrapPolicy">
<enum>QFormLayout::DontWrapRows</enum>
</property>
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Rows:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinRows">
<property name="maximum">
<number>65536</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelCols">
<property name="text">
<string>Cols:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="spinCols">
<property name="maximum">
<number>65536</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="buttonNull">
<property name="toolTip">
<string>Null</string>
</property>
<property name="text">
<string>0</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="buttonIdentity">
<property name="toolTip">
<string>Identity</string>
</property>
<property name="text">
<string>I</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QTableWidget" name="table">
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="horizontalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
<slots>
<slot>search(QString)</slot>
<slot>searchNext()</slot>
<slot>searchPrevious()</slot>
<slot>searchAll()</slot>
<slot>hideSearch()</slot>
</slots>
</ui>