diff --git a/piqt/piqt.cpp b/piqt/piqt.cpp index d346193..dfb1f19 100644 --- a/piqt/piqt.cpp +++ b/piqt/piqt.cpp @@ -46,6 +46,7 @@ const QVariant PI2QVariant(const PIVariant & v) { case PIVariant::pivColor: return QVariant::fromValue(PI2QColor(v.toColor())); case PIVariant::pivPoint: return QVariant(PI2QPoint(v.toPoint())); case PIVariant::pivRect: return QVariant(PI2QRect(v.toRect())); + case PIVariant::pivIODevice: return QVariant::fromValue(PI2QADIODevice(v.toIODevice())); //case PIVariant::pivSystemTime: return QVariant(v.to()); default: return QVariant(); } @@ -76,6 +77,7 @@ const PIVariant Q2PIVariant(const QVariant & v) { } if (v.canConvert()) return PIVariant(QAD2PIEnum(v.value())); if (v.canConvert()) return PIVariant(QAD2PIFile(v.value())); - if (v.canConvert()) return PIVariant(QAD2PIDir(v.value())); + if (v.canConvert()) return PIVariant(QAD2PIDir(v.value())); + if (v.canConvert()) return PIVariant(QAD2PIIODevice(v.value())); return PIVariant(); } diff --git a/piqt/piqt.h b/piqt/piqt.h index d4370d1..7622581 100644 --- a/piqt/piqt.h +++ b/piqt/piqt.h @@ -72,6 +72,9 @@ inline PropertyStorage PI2QPropertyStorage(const PIPropertyStorage & props) { const QAD::Enum PI2QADEnum(const PIVariantTypes::Enum & el); inline const QAD::File PI2QADFile(const PIVariantTypes::File & v) {return QAD::File(PI2QString(v.file), PI2QString(v.filter), v.is_abs);} inline const QAD::Dir PI2QADDir(const PIVariantTypes::Dir & v) {return QAD::Dir(PI2QString(v.dir), v.is_abs);} +inline const QAD::IODevice PI2QADIODevice(const PIVariantTypes::IODevice & v) { + return QAD::IODevice(PI2QString(v.prefix), PI2QPropertyStorage(v.get()), v.mode, v.options); +} const PIVariantTypes::Enum QAD2PIEnum(const QAD::Enum & el); inline const PIVariantTypes::File QAD2PIFile(const QAD::File & v) {return PIVariantTypes::File(Q2PIString(v.file), Q2PIString(v.filter), v.is_abs);} inline const PIVariantTypes::Dir QAD2PIDir(const QAD::Dir & v) {return PIVariantTypes::Dir(Q2PIString(v.dir), v.is_abs);} @@ -80,12 +83,9 @@ inline const PIVariantTypes::IODevice QAD2PIIODevice(const QAD::IODevice & v) { d.set(Q2PIPropertyStorage(v.props)); d.prefix = Q2PIString(v.prefix); d.mode = v.mode; - d.options = v.opts; + d.options = v.options; return d; } -inline const QAD::IODevice QAD2PIIODevice(const PIVariantTypes::IODevice & v) { - return QAD::IODevice(PI2QString(v.prefix), PI2QPropertyStorage(v.get()), v.mode, v.options); -} //inline const PIVariant QString2PIVariant(const QString & v) {return PIVariant::readFromString(QString2PIString(v));} diff --git a/piqt_utils/CMakeLists.txt b/piqt_utils/CMakeLists.txt index 921d84a..8cbf976 100644 --- a/piqt_utils/CMakeLists.txt +++ b/piqt_utils/CMakeLists.txt @@ -28,7 +28,7 @@ pip_code_model(CCM "../pip/src_main/io_devices/piiodevice.h" "../pip/src_main/io find_qt(${QtVersions} Core Gui) qt_wrap(${SRC} HDRS out_HDR CPPS out_CPP QMS out_QM) qt_add_library(${PROJECT_NAME} ${LIBTYPE} out_CPP CCM) -qt_target_link_libraries(${PROJECT_NAME} pip qad_utils qad_widgets qad_blockview) +qt_target_link_libraries(${PROJECT_NAME} pip qad_utils qad_widgets qad_blockview piqt) message(STATUS "Building ${PROJECT_NAME}") if (LIBPROJECT) diff --git a/piqt_utils/piqt_connection_edit.h b/piqt_utils/piqt_connection_edit.h index 7ae9a42..8dafe84 100644 --- a/piqt_utils/piqt_connection_edit.h +++ b/piqt_utils/piqt_connection_edit.h @@ -6,7 +6,7 @@ namespace Ui { class ConnectionEdit; -}; +} class FilterItem; class DeviceItem; diff --git a/piqt_utils/piqt_iodevice_edit.cpp b/piqt_utils/piqt_iodevice_edit.cpp new file mode 100644 index 0000000..00bde64 --- /dev/null +++ b/piqt_utils/piqt_iodevice_edit.cpp @@ -0,0 +1,75 @@ +#include "piqt_iodevice_edit.h" +#include "piqt_iodevice_edit_dialog.h" +#include "qvariantedit_custom.h" +#include +#include +#include + + +IODeviceEdit::IODeviceEdit(QWidget * parent): QWidget(parent) { + dlg = new IODeviceEditDialog(); + line = new QLineEdit(); + btn = new QToolButton(); + setLayout(new QBoxLayout(QBoxLayout::LeftToRight)); + layout()->setContentsMargins(0, 0, 0, 0); + layout()->addWidget(line); + layout()->addWidget(btn); + connect(btn, SIGNAL(clicked(bool)), this, SLOT(buttonDlg_clicked())); + line->setReadOnly(true); + btn->setText(QString()); + btn->setIcon(QIcon(":/icons/configure.png")); + btn->setToolTip(tr("Edit ...")); +} + + +IODeviceEdit::~IODeviceEdit() { + delete dlg; +} + + +QVariant IODeviceEdit::value() const { + return QVariant::fromValue(dev); +} + + +bool IODeviceEdit::isReadOnly() const { + return btn->isHidden(); +} + + +void IODeviceEdit::setDevice(const QAD::IODevice & d) { + if (dev.toString() == d.toString()) return; + dev = d; + line->setText(dev.toString()); + emit valueChanged(); +} + + +void IODeviceEdit::setValue(const QVariant & v) { + setDevice(v.value()); +} + + +void IODeviceEdit::setReadOnly(bool yes) { + btn->setHidden(yes); +} + + +void IODeviceEdit::buttonDlg_clicked() { + QAD::IODevice d = dlg->exec(dev); + if (!d.isValid()) return; + setDevice(d); +} + + + +class Factory: public QVariantEditorFactoryBase { +public: + Factory() {} + virtual QWidget * createEditor() {return new IODeviceEdit();} +}; + + +__IODeviceEditRegistrator__::__IODeviceEditRegistrator__() { + QVariantEditorFactories::registerEditorFactory(qMetaTypeId(), new Factory()); +} diff --git a/piqt_utils/piqt_iodevice_edit.h b/piqt_utils/piqt_iodevice_edit.h new file mode 100644 index 0000000..95ca616 --- /dev/null +++ b/piqt_utils/piqt_iodevice_edit.h @@ -0,0 +1,51 @@ +#ifndef PIQT_IODEVICE_EDIT_H +#define PIQT_IODEVICE_EDIT_H + +#include +#include "qad_types.h" + +class QLineEdit; +class QToolButton; +class IODeviceEditDialog; + + +class IODeviceEdit: public QWidget { + Q_OBJECT + Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged) + Q_PROPERTY(bool readOnly READ isReadOnly WRITE setReadOnly) +public: + explicit IODeviceEdit(QWidget * parent = 0); + ~IODeviceEdit(); + + QVariant value() const; + bool isReadOnly() const; + +private: + void setDevice(const QAD::IODevice & d); + + QLineEdit * line; + QToolButton * btn; + IODeviceEditDialog * dlg; + QAD::IODevice dev; + +public slots: + void setValue(const QVariant & v); + void setReadOnly(bool yes); + +private slots: + void buttonDlg_clicked(); + +signals: + void valueChanged(); + +}; + + +class __IODeviceEditRegistrator__ { +public: + __IODeviceEditRegistrator__(); +}; + +static __IODeviceEditRegistrator__ __iodeviceeditregistrator__; + +#endif // PIQT_IODEVICE_EDIT_H diff --git a/piqt_utils/piqt_iodevice_edit_dialog.cpp b/piqt_utils/piqt_iodevice_edit_dialog.cpp new file mode 100644 index 0000000..e004ab0 --- /dev/null +++ b/piqt_utils/piqt_iodevice_edit_dialog.cpp @@ -0,0 +1,103 @@ +#include "ui_piqt_iodevice_edit_dialog.h" +#include "piqt_iodevice_edit_dialog.h" +#include "piqt.h" +#include "picodeinfo.h" +#include "piiodevice.h" +#include + + +IODeviceEditDialog::IODeviceEditDialog(QWidget * parent): QDialog(parent) { + ui = new Ui::IODeviceEditDialog(); + ui->setupUi(this); + PICodeInfo::EnumInfo * ei = PICodeInfo::enumsInfo->value("PIIODevice::DeviceMode"); + if (ei) { + piForeachC (PICodeInfo::EnumeratorInfo & e, ei->members) + ui->comboMode->addItem(PI2QString(e.name + " (" + PIString::fromNumber(e.value) + ")"), QVariant::fromValue(e.value)); + } + ui->comboMode->setCurrentIndex(ui->comboMode->count() - 1); + ei = PICodeInfo::enumsInfo->value("PIIODevice::DeviceOption"); + if (ei) { + piForeachC (PICodeInfo::EnumeratorInfo & e, ei->members) { + QCheckBox * cb = new QCheckBox(); + cb->setText(PI2QString(e.name + " (" + PIString::fromNumber(e.value) + ")")); + cb->setProperty("__value", e.value); + ui->layoutOptions->addWidget(cb); + } + } + PIStringList pl = PIIODevice::availablePrefixes(); + piForeachC (PIString & p, pl) { + ui->comboType->addItem(PI2QString(p)); + } +} + + +IODeviceEditDialog::~IODeviceEditDialog() { +} + + +int IODeviceEditDialog::getOptions() const { + int ret = 0; + for (int i = 0; i < ui->layoutOptions->count(); ++i) { + QCheckBox * cb = qobject_cast(ui->layoutOptions->itemAt(i)->widget()); + if (!cb) continue; + if (cb->isChecked()) + ret |= cb->property("__value").toInt(); + } + return ret; +} + + +void IODeviceEditDialog::setOptions(int o) { + for (int i = 0; i < ui->layoutOptions->count(); ++i) { + QCheckBox * cb = qobject_cast(ui->layoutOptions->itemAt(i)->widget()); + if (!cb) continue; + int cbf = cb->property("__value").toInt(); + cb->setChecked((o & cbf) == cbf); + } +} + + +void IODeviceEditDialog::on_comboType_currentIndexChanged(int index) { + PIString prefix = Q2PIString(ui->comboType->currentText()); + PIVector rd(PICollection::groupElements("__PIIODevices__")); + piForeachC (PIObject * d, rd) { + const PIIODevice * dev = ((const PIIODevice * )d); + if (prefix != dev->fullPathPrefix()) + continue; + ps = PI2QPropertyStorage(dev->constructVariant().get()); + ui->widgetProperties->setStorage(&ps); + return; + } +} + + +QAD::IODevice IODeviceEditDialog::exec(const QAD::IODevice & d) { + setValue(d); + if (QDialog::exec() != QDialog::Accepted) + return QAD::IODevice(); + return value(); +} + + +QAD::IODevice IODeviceEditDialog::value() const { + QAD::IODevice d; + ui->widgetProperties->applyProperties(); + d.prefix = ui->comboType->currentText(); + d.mode = ui->comboMode->itemData(ui->comboMode->currentIndex()).toInt(); + d.options = getOptions(); + d.props = ps; + return d; +} + + +void IODeviceEditDialog::setValue(const QAD::IODevice & d) { + ui->comboType->setCurrentText(d.prefix); + for (int i = 0; i < ui->comboMode->count(); ++i) + if (ui->comboMode->itemData(i).toInt() == d.mode) { + ui->comboMode->setCurrentIndex(i); + break; + } + setOptions(d.options); + ps = d.props; + ui->widgetProperties->setStorage(&ps); +} diff --git a/piqt_utils/piqt_iodevice_edit_dialog.h b/piqt_utils/piqt_iodevice_edit_dialog.h new file mode 100644 index 0000000..1f15a75 --- /dev/null +++ b/piqt_utils/piqt_iodevice_edit_dialog.h @@ -0,0 +1,34 @@ +#ifndef PIQT_IODEVICE_EDIT_DIALOG_H +#define PIQT_IODEVICE_EDIT_DIALOG_H + +#include +#include "qad_types.h" +#include "propertystorage.h" + +namespace Ui { + class IODeviceEditDialog; +} + +class IODeviceEditDialog: public QDialog { + Q_OBJECT +public: + explicit IODeviceEditDialog(QWidget * parent = 0); + ~IODeviceEditDialog(); + + QAD::IODevice exec(const QAD::IODevice & d); + +private: + QAD::IODevice value() const; + void setValue(const QAD::IODevice & d); + int getOptions() const; + void setOptions(int o); + + PropertyStorage ps; + Ui::IODeviceEditDialog * ui; + +private slots: + void on_comboType_currentIndexChanged(int index); + +}; + +#endif // PIQT_IODEVICE_EDIT_DIALOG_H diff --git a/piqt_utils/piqt_iodevice_edit_dialog.ui b/piqt_utils/piqt_iodevice_edit_dialog.ui new file mode 100644 index 0000000..f69db58 --- /dev/null +++ b/piqt_utils/piqt_iodevice_edit_dialog.ui @@ -0,0 +1,138 @@ + + + IODeviceEditDialog + + + + 0 + 0 + 387 + 345 + + + + IODevice + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + Type: + + + + + + + + + + Mode: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + Options: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 2 + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + PropertyStorageEditor + QWidget +
propertystorage_editor.h
+ 1 +
+
+ + + + buttonBox + accepted() + IODeviceEditDialog + accept() + + + 227 + 326 + + + 144 + 302 + + + + + buttonBox + rejected() + IODeviceEditDialog + reject() + + + 325 + 315 + + + 304 + 306 + + + + + + recreateConnection() + +
diff --git a/qad/utils/qad_types.cpp b/qad/utils/qad_types.cpp index c18bec4..af0dbef 100644 --- a/qad/utils/qad_types.cpp +++ b/qad/utils/qad_types.cpp @@ -34,7 +34,7 @@ __QADTypesRegistrator__::__QADTypesRegistrator__() { QMetaType::registerConverter(&QAD::Enum::selectedName); QMetaType::registerConverter(&QAD::File::toString); QMetaType::registerConverter(&QAD::Dir::toString); - /// TDOD : //QMetaType::registerConverter(&QAD::IODevice::constructFullPath); + QMetaType::registerConverter(&QAD::IODevice::toString); #endif } @@ -122,6 +122,30 @@ QAD::Enum & QAD::Enum::operator <<(const QStringList & v) { +QString QAD::IODevice::toString() const { + QString s; + s += "IODevice(" + prefix + ", "; + int rwc = 0; + if (mode & QIODevice::ReadOnly) {s += "r"; ++rwc;} + if (mode & QIODevice::WriteOnly) {s += "w"; ++rwc;} + if (rwc == 1) s += "o"; + if (options != 0) { + if (options & 1) + s += " br"; + if (options & 2) + s += " bw"; + } + PropertyStorage ps = props; + foreach (const PropertyStorage::Property & p, ps) { + s += ", " + p.name + "=\"" + p.value.toString() + "\""; + } + s += ")"; + return s; +} + + + + QVariant::Type typeFromLetter(const QString & l) { if (l.isEmpty()) return QVariant::String; QString ft = l.left(1); diff --git a/qad/utils/qad_types.h b/qad/utils/qad_types.h index 69cd690..761315a 100644 --- a/qad/utils/qad_types.h +++ b/qad/utils/qad_types.h @@ -48,11 +48,14 @@ namespace QAD { }; struct IODevice { - IODevice(const QString & devece_prefix = QString(), const PropertyStorage & device_properties = PropertyStorage(), int open_mode = QIODevice::ReadWrite, int device_options = 0) - : prefix(devece_prefix), mode(open_mode), opts(device_options), props(device_properties) {} + IODevice(const QString & device_prefix = QString(), const PropertyStorage & device_properties = PropertyStorage(), + int open_mode = QIODevice::ReadWrite, int device_options = 0) + : prefix(device_prefix), mode(open_mode), options(device_options), props(device_properties) {} + QString toString() const; + bool isValid() const {return !prefix.isEmpty();} QString prefix; int mode; - int opts; + int options; PropertyStorage props; }; @@ -79,29 +82,10 @@ inline QDataStream & operator >>(QDataStream & s, QAD::Dir & v) {s >> v.dir >> v inline QDebug operator <<(QDebug s, const QAD::Dir & v) {s.nospace() << v.dir; return s.space();} Q_DECLARE_METATYPE(QAD::IODevice) -inline QDataStream & operator <<(QDataStream & s, const QAD::IODevice & v) {s << v.prefix << v.mode << v.opts << v.props; return s;} -inline QDataStream & operator >>(QDataStream & s, QAD::IODevice & v) {s >> v.prefix >> v.mode >> v.opts >> v.props; return s;} -inline QDebug operator <<(QDebug d, const QAD::IODevice & v) { - QString s; - s += "IODevice(" + v.prefix + ", "; - int rwc = 0; - if (v.mode & QIODevice::ReadOnly) {s += "r"; ++rwc;} - if (v.mode & QIODevice::WriteOnly) {s += "w"; ++rwc;} - if (rwc == 1) s += "o"; - if (v.opts != 0) { - if (v.opts & 1) - s += " br"; - if (v.opts & 2) - s += " bw"; - } - PropertyStorage ps = v.props; - foreach (const PropertyStorage::Property & p, ps) { - s += ", " + p.name + "=\"" + p.value.toString() + "\""; - } - s += ")"; - d.noquote() << s; - return d; -} +inline QDataStream & operator <<(QDataStream & s, const QAD::IODevice & v) {s << v.prefix << v.mode << v.options << v.props; return s;} +inline QDataStream & operator >>(QDataStream & s, QAD::IODevice & v) {s >> v.prefix >> v.mode >> v.options >> v.props; return s;} +inline QDebug operator <<(QDebug s, const QAD::IODevice & v) {s.nospace() << v.toString(); return s.space();} + class __QADTypesRegistrator__ { public: diff --git a/qad/widgets/propertystorage_editor.h b/qad/widgets/propertystorage_editor.h index 3f51d16..05fa4cf 100644 --- a/qad/widgets/propertystorage_editor.h +++ b/qad/widgets/propertystorage_editor.h @@ -22,6 +22,8 @@ private: signals: void resetStorageRequest(PropertyStorage * ); + void changed(); + }; #endif // PROPERTYSTORAGEEDITOR_H diff --git a/qad/widgets/qvariantedit.cpp b/qad/widgets/qvariantedit.cpp index 14aa6ae..64131e4 100644 --- a/qad/widgets/qvariantedit.cpp +++ b/qad/widgets/qvariantedit.cpp @@ -163,7 +163,7 @@ QVariantEdit::QVariantEdit(QWidget * parent): QWidget(parent) { _point = 0; _path = 0; _enum = 0; - _cur_edit = 0; + _custom =_cur_edit = 0; _recreate(QVariant()); } @@ -314,6 +314,18 @@ void QVariantEdit::_recreate(const QVariant & new_value) { _cur_edit = _path; connect(_path, SIGNAL(valueChanged()), this, SLOT(_changed())); } + if (!_cur_edit) { // try custom + QVariantEditorFactoryBase * f = QVariantEditorFactories::editorFactory(new_value.userType()); + if (f) { + QWidget * fw = f->createEditor(); + if (fw) { + fw->setParent(this); + _custom = fw; + _cur_edit = _custom; + connect(_custom, SIGNAL(valueChanged()), this, SLOT(_changed())); + } + } + } } //qDebug() << _cur_edit; if (_cur_edit) { @@ -368,6 +380,9 @@ QVariant QVariantEdit::value() const { return QVariant::fromValue(ret); } } + if (_custom) { + return _custom->property("value"); + } } return QVariant(); } @@ -390,6 +405,7 @@ void QVariantEdit::setValue(const QVariant & v) { else _setFile(v.value()); } if (_enum) {_setEnum(v.value());} + if (_custom) {_setCustom(v);} if (_cur_edit) _cur_edit->blockSignals(false); } @@ -398,6 +414,7 @@ void QVariantEdit::_delete() { if (_cur_edit) delete _cur_edit; _cur_edit = 0; + _custom = 0; _empty = 0; _line = 0; _check = 0; @@ -460,6 +477,12 @@ void QVariantEdit::_setDir(const QAD::Dir & v) { _path->is_abs = v.is_abs; } + +void QVariantEdit::_setCustom(const QVariant & v) { + _custom->setProperty("value", v); +} + + void QVariantEdit::_changed() { if (_check) _check->setText(_check->isChecked() ? "true" : "false"); emit valueChanged(value()); diff --git a/qad/widgets/qvariantedit.h b/qad/widgets/qvariantedit.h index 6dbeda3..7954281 100644 --- a/qad/widgets/qvariantedit.h +++ b/qad/widgets/qvariantedit.h @@ -1,6 +1,7 @@ #ifndef QVARIANTEDIT_H #define QVARIANTEDIT_H +#include "qvariantedit_custom.h" #include "qad_types.h" #include "clineedit.h" #include "ecombobox.h" @@ -102,6 +103,7 @@ protected: void _setEnum(const QAD::Enum & v); void _setFile(const QAD::File & v); void _setDir(const QAD::Dir & v); + void _setCustom(const QVariant & v); QLabel * _empty; @@ -116,7 +118,7 @@ protected: QPointEdit * _point; PathEdit * _path; EComboBox * _enum; - QWidget * _cur_edit; + QWidget * _custom, * _cur_edit; QVariant _value; private slots: