git-svn-id: svn://db.shs.com.ru/libs@502 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
53
qad/widgets/mathmatrixedit.cpp
Normal file
53
qad/widgets/mathmatrixedit.cpp
Normal 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);
|
||||
}
|
||||
40
qad/widgets/mathmatrixedit.h
Normal file
40
qad/widgets/mathmatrixedit.h
Normal 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
|
||||
53
qad/widgets/mathvectoredit.cpp
Normal file
53
qad/widgets/mathvectoredit.cpp
Normal 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);
|
||||
}
|
||||
40
qad/widgets/mathvectoredit.h
Normal file
40
qad/widgets/mathvectoredit.h
Normal 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
149
qad/widgets/matrixedit.cpp
Normal 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
43
qad/widgets/matrixedit.h
Normal 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
125
qad/widgets/matrixedit.ui
Normal 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>
|
||||
Reference in New Issue
Block a user