From 39d406d6aa8c41fd5316d406b36857df02270550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Tue, 16 Aug 2016 13:15:29 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@117 a8b55f48-bf90-11e4-a774-851b48703e85 --- cd_utils/CMakeLists.txt | 10 ++--- cd_utils/cdutils_types.cpp | 19 ++++++++ cd_utils/cdutils_types.h | 13 ++---- cd_utils/cdutilstest.cpp | 83 ++++++++++++++++++++-------------- cd_utils/pult/cd_kmodel.cpp | 86 ++++++++++++++++++++++++++++++++++-- cd_utils/pult/cd_kmodel.h | 19 ++++++++ cd_utils/pult/cd_pult.cpp | 4 ++ cd_utils/pult/cd_pult.h | 1 + qad_widgets/ecombobox.cpp | 7 +++ qad_widgets/ecombobox.h | 2 + qad_widgets/qvariantedit.cpp | 12 +++-- qad_widgets/qvariantedit.h | 4 +- 12 files changed, 204 insertions(+), 56 deletions(-) diff --git a/cd_utils/CMakeLists.txt b/cd_utils/CMakeLists.txt index ce6dcd6..81140cf 100644 --- a/cd_utils/CMakeLists.txt +++ b/cd_utils/CMakeLists.txt @@ -15,10 +15,10 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wall") if (DEBUG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") endif () -file(GLOB HDRS_UTILS "*.h") -file(GLOB CPPS_UTILS "*.cpp") -#set(CPPS_UTILS "cdutils_core.cpp" "cdutils_k_types.cpp" "cdutils_k_parser.cpp" "cdutils_k.cpp") -#set(HDRS_UTILS "cdutils_core.h" "cdutils_k_types.h" "cdutils_k_parser.h" "cdutils_k.h") +#file(GLOB HDRS_UTILS "*.h") +#file(GLOB CPPS_UTILS "*.cpp") +set(CPPS_UTILS "cdutils_core.cpp" "cdutils_types.cpp" "cdutils_parser.cpp" "cdutils_k.cpp") +set(HDRS_UTILS "cdutils_core.h" "cdutils_types.h" "cdutils_parser.h" "cdutils_k.h" "cdutils_protocol.h") if (DEFINED ENV{QNX_HOST}) add_library(${PROJECT_NAME} STATIC ${CPPS_UTILS} ${HDRS_UTILS}) else () @@ -26,7 +26,7 @@ else () endif () target_link_libraries(${PROJECT_NAME} ${PIP_LIBRARY}) -add_executable(cdutilstest "cdutilstest.cpp") +add_executable(cdutilstest "cdutilstest.cpp" "cdtest.h") target_link_libraries(cdutilstest ${PIP_LIBRARY} ${PROJECT_NAME}) if (NOT DEFINED ENV{QNX_HOST}) diff --git a/cd_utils/cdutils_types.cpp b/cd_utils/cdutils_types.cpp index f25f196..dd30692 100644 --- a/cd_utils/cdutils_types.cpp +++ b/cd_utils/cdutils_types.cpp @@ -31,6 +31,11 @@ CDType::CDType(int i, const PIString & n, const PIString & t, const PIString & v value_i = v.toInt(); value_b = v.toBool(); cd_type_ = cd_t; + if (type_ == "e") { + enum_values << comment_.inBrackets('{', '}').split(","); + piForeach(PIString &s, enum_values) s.trim(); +// piCout << enum_values.size() << enum_values; + } // piCout << type_.size() << type_.toUTF8(); // piCout << formula_.size() << formula_.toUTF8(); // piCout << comment_.size() << comment_.toUTF8(); @@ -47,8 +52,22 @@ PIString CDType::type() const { } +PIString CDType::value() const { + return PIString::fromBool(value_b); +} + + void CDType::setFormula(const PIString &f) { formula_ = f; + calculate(); +} + + +void CDType::calculate() { + value_s = formula_.trimmed(); + value_d = formula_.toDouble(); + value_i = formula_.toInt(); + value_b = formula_.toBool(); } diff --git a/cd_utils/cdutils_types.h b/cd_utils/cdutils_types.h index 52bb2fd..0924aa2 100644 --- a/cd_utils/cdutils_types.h +++ b/cd_utils/cdutils_types.h @@ -15,19 +15,14 @@ class CDSection; class CDType { friend class CDSection; - friend class ::CD_Pult; - //friend class ::CDKItem; public: enum cdT {cdNull, cdK, cdX, cdC}; CDType(); CDType(int i, const PIString & n, const PIString & t, const PIString & v, const PIString & f, const PIString & c, cdT cd_t); -// CDType(const CDType & cdt); -// CDType & operator =(const CDType & cdt); -// ~CDType(); int index() const {return index_;} PIString name() const {return name_;} PIString type() const; - PIString value() const {return value_s;} + PIString value() const; PIString formula() const {return formula_;} PIString comment() const {return comment_;} double toDouble() const {return value_d;} @@ -35,19 +30,19 @@ public: bool toBool() const {return value_b;} cdT cd_type() const {return cd_type_;} void setFormula(const PIString & formula); - + void calculate(); operator double() const {return value_d;} - + const PIStringList & enumValues() const {return enum_values;} protected: cdT cd_type_; int index_; PIString name_, type_; PIString value_s, formula_, comment_; + PIStringList enum_values; double value_d; int value_i; bool value_b; -// int debug_cnt; }; diff --git a/cd_utils/cdutilstest.cpp b/cd_utils/cdutilstest.cpp index ff9e45a..6118f0e 100644 --- a/cd_utils/cdutilstest.cpp +++ b/cd_utils/cdutilstest.cpp @@ -3,6 +3,7 @@ #include "piethernet.h" #include "piiostring.h" #include "pifile.h" +#include "pievaluator.h" #include "cdtest.h" using namespace CDUtils; @@ -60,38 +61,54 @@ private: #include "piscreen.h" #include "piscreentiles.h" -PIScreen screen(false); +//PIScreen screen; int main(int argc, char *argv[]) { PIString s; - int i = 0; - piCout << i++ << "!" << s << "!"; - piCout << i << "!" << s.trimmed() << "!"; - piCout << i << "!" << s.trim() << "!"; - s = ""; - piCout << i++ << "!" << s << "!"; - piCout << i << "!" << s.trimmed() << "!"; - piCout << i << "!" << s.trim() << "!"; - s = " "; - piCout << i++ << "!" << s << "!"; - piCout << i << "!" << s.trimmed() << "!"; - piCout << i << "!" << s.trim() << "!"; - s = " "; - piCout << i++ << "!" << s << "!"; - piCout << i << "!" << s.trimmed() << "!"; - piCout << i << "!" << s.trim() << "!"; - s = " s "; - piCout << i++ << "!" << s << "!"; - piCout << i << "!" << s.trimmed() << "!"; - piCout << i << "!" << s.trim() << "!"; - s = "f s "; - piCout << i++ << "!" << s << "!"; - piCout << i << "!" << s.trimmed() << "!"; - piCout << i << "!" << s.trim() << "!"; - s = " kjdfsnfv;kjsfd "; - piCout << i++ << "!" << s << "!"; - piCout << i << "!" << s.trimmed() << "!"; - piCout << i << "!" << s.trim() << "!"; + s = "df a)))(a(ttt){a(b(c)})d)e( d dws ) sds(()fads(fdas()))fda))))fdasf((((jhvw"; + piCout << s; + piCout << s.inBrackets('(', ')'); + piCout << s.cutLeft(s.find('(')).takeRange('(', ')'); + piCout << s; + piCout << "exit"; + s = "test"; + PIByteArray ba = s.toByteArray(); + piCout << PIString(ba); + piCout << PIString(ba.convertToBase64()); + piCout << PIString(ba.convertFromBase64()); + s = "dGVzdA=="; + ba = s.toByteArray(); + piCout << PIString(ba); + piCout << PIString(ba.convertFromBase64()); return 0; +// int i = 0; +// piCout << i++ << "!" << s << "!"; +// piCout << i << "!" << s.trimmed() << "!"; +// piCout << i << "!" << s.trim() << "!"; +// s = ""; +// piCout << i++ << "!" << s << "!"; +// piCout << i << "!" << s.trimmed() << "!"; +// piCout << i << "!" << s.trim() << "!"; +// s = " "; +// piCout << i++ << "!" << s << "!"; +// piCout << i << "!" << s.trimmed() << "!"; +// piCout << i << "!" << s.trim() << "!"; +// s = " "; +// piCout << i++ << "!" << s << "!"; +// piCout << i << "!" << s.trimmed() << "!"; +// piCout << i << "!" << s.trim() << "!"; +// s = " s "; +// piCout << i++ << "!" << s << "!"; +// piCout << i << "!" << s.trimmed() << "!"; +// piCout << i << "!" << s.trim() << "!"; +// s = "f s "; +// piCout << i++ << "!" << s << "!"; +// piCout << i << "!" << s.trimmed() << "!"; +// piCout << i << "!" << s.trim() << "!"; +// s = " kjdfsnfv;kjsfd "; +// piCout << i++ << "!" << s << "!"; +// piCout << i << "!" << s.trimmed() << "!"; +// piCout << i << "!" << s.trim() << "!"; +// return 0; // PIEthernet eth; // eth.send("127.0.0.1:16102", PIByteArray("data\n", 5)); // eth.send("127.0.0.1:26102", PIByteArray("data\n", 5)); @@ -140,9 +157,9 @@ int main(int argc, char *argv[]) { //CDUtils::Core::instance()->test(); //return 0; // piCout << "init"; - //screen.rootTile()->addTile(new TilePICout()); - screen.enableExitCapture('q'); - //screen.start(); +// screen.rootTile()->addTile(new TilePICout()); +// screen.enableExitCapture('q'); +// screen.start(); piCout << "start"; Core core; core.load(); @@ -151,7 +168,7 @@ int main(int argc, char *argv[]) { K.send(); - //screen.waitForFinish(); +// screen.waitForFinish(); return 0; } diff --git a/cd_utils/pult/cd_kmodel.cpp b/cd_utils/pult/cd_kmodel.cpp index 37987cc..de6d877 100644 --- a/cd_utils/pult/cd_kmodel.cpp +++ b/cd_utils/pult/cd_kmodel.cpp @@ -4,6 +4,7 @@ #include #include #include +#include "qvariantedit.h" using namespace CDUtils; @@ -74,12 +75,29 @@ Qt::ItemFlags CDKItemModel::flags(const QModelIndex &index) const { if (!index.isValid()) return 0; Qt::ItemFlags f = Qt::ItemIsEnabled | Qt::ItemIsSelectable; CDKItem * item = getItem(index); - if (index.column() == 3 && item->type_ == CDKItem::ItemCDType) f |= Qt::ItemIsEditable; + if ((index.column() == 3 || index.column() == 4) && item->type_ == CDKItem::ItemCDType) f |= Qt::ItemIsEditable; + if (item->type_ == CDKItem::ItemCDType && index.column() == 4) { + CDType t = K.section(item->buildPath())[item->index_]; + if (t.type() == "b") { + f |= Qt::ItemIsUserCheckable; +// piCout << "ItemIsUserCheckable"; + } + } return f; } bool CDKItemModel::setData(const QModelIndex &index, const QVariant &value, int role) { + if (role == Qt::CheckStateRole && index.column() == 4) { + CDKItem * item = getItem(index); + if (item->type_ == CDKItem::ItemCDType) { + CDType t = K.section(item->buildPath())[item->index_]; + if (t.type() == "b") { + bool result = item->setData(index.column(), PI2QString(PIString::fromBool(value.toBool()))); + return result; + } + } + } if (role != Qt::EditRole) return false; CDKItem * item = getItem(index); bool result = item->setData(index.column(), value); @@ -127,6 +145,8 @@ CDKItem * CDKItemModel::getItem(const QModelIndex &index) const { } +// CDKItem + CDKItem::CDKItem(int index, CDKItem::CDKItemType type, CDKItem *parent) { index_ = index; parent_ = parent; @@ -143,9 +163,14 @@ QVariant CDKItem::data(int column, int role) const { if (role == Qt::BackgroundRole) { switch (type_) { case ItemCDType: return QBrush(QColor(255, 250, 230)); - case ItemCDSection: return QBrush(QColor(220, 220, 250)); + case ItemCDSection: return QBrush(QColor(230, 250, 230)); } } + if (role == Qt::CheckStateRole && type_ == ItemCDType && column == 4) { + CDType & t = K.section(buildPath())[index_]; + if (t.type() == "b") return t.toBool() ? Qt::Checked : Qt::Unchecked; + else QVariant(); + } if (role != Qt::DisplayRole && role != Qt::EditRole) return QVariant(); PIDeque path = buildPath(); CDSection & rs = K.section(path); @@ -157,7 +182,7 @@ QVariant CDKItem::data(int column, int role) const { case 1: return PI2QString(rs[index_].name()); case 2: return stringType(rs[index_].type()); case 3: return PI2QString(rs[index_].formula()); - case 4: return PI2QString(rs[index_].value()); + case 4: return value(rs[index_], role); case 5: return PI2QString(rs[index_].comment()); default: break; @@ -179,8 +204,23 @@ QVariant CDKItem::data(int column, int role) const { } +QVariant CDKItem::value(CDType t, int role) const { + if (t.type() == "f") return t.toDouble(); + if (t.type() == "n") return t.toInt(); + if (t.type() == "b") return t.toBool(); + if (t.type() == "e") { + QVariantEdit::EnumType et; + et.enum_list = PI2QStringList(t.enumValues()); + et.value = et.enum_list.at(t.toInt());//et.enum_list.indexOf(""); + if (role == Qt::EditRole)return QVariant::fromValue(et); + else return et.value; + } + return PI2QString(t.value()); +} + + bool CDKItem::setData(int column, const QVariant &value) { - if (column == 3 && type_ == ItemCDType) { + if ((column == 3 || column == 4) && type_ == ItemCDType) { K.section(buildPath())[index_].setFormula(Q2PIString(value.toString())); return true; } @@ -221,3 +261,41 @@ QString CDKItem::stringType(const PIString & t) const { return QString("double"); } + +// CDKDelegate + +CDKDelegate::CDKDelegate(QObject *parent) : QStyledItemDelegate(parent) { +} + + +QWidget *CDKDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { + return new QVariantEdit(parent); +} + + +void CDKDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { + QVariantEdit *edit = static_cast(editor); + edit->setValue(index.model()->data(index, Qt::EditRole)); +} + + +void CDKDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { + QVariantEdit *edit = static_cast(editor); + QVariant v = edit->value(); + if (v.canConvert()) { + QVariantEdit::EnumType et = v.value(); + model->setData(index, et.enum_list.indexOf(et.value), Qt::EditRole); + } else model->setData(index, v, Qt::EditRole); +} + + +void CDKDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { + editor->setGeometry(option.rect); +} + + +QSize CDKDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { + QSize s = QStyledItemDelegate::sizeHint(option, index); + s.setWidth(s.width() + 20); + return s; +} diff --git a/cd_utils/pult/cd_kmodel.h b/cd_utils/pult/cd_kmodel.h index 796c8d2..3b275b4 100644 --- a/cd_utils/pult/cd_kmodel.h +++ b/cd_utils/pult/cd_kmodel.h @@ -3,10 +3,13 @@ //#include "cdutils_k.h" #include +#include +#include #include "pistring.h" namespace CDUtils { class CDSection; +class CDType; } class CDKItemModel; @@ -17,6 +20,7 @@ public: CDKItem(int index, CDKItemType type, CDKItem * parent); ~CDKItem(); QVariant data(int column, int role) const; + QVariant value(CDUtils::CDType t, int role) const; bool setData(int column, const QVariant & value); private: @@ -29,6 +33,21 @@ private: QList childs; }; + +class CDKDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + CDKDelegate(QObject *parent = 0); + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; + void setEditorData(QWidget *editor, const QModelIndex &index) const; + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; +}; + + class CDKItemModel : public QAbstractItemModel { Q_OBJECT public: diff --git a/cd_utils/pult/cd_pult.cpp b/cd_utils/pult/cd_pult.cpp index 45007f6..a68df89 100644 --- a/cd_utils/pult/cd_pult.cpp +++ b/cd_utils/pult/cd_pult.cpp @@ -53,6 +53,8 @@ config(piqt(config_), QIODevice::ReadWrite) { CONNECT(void, &coeffs, receiveSucceed, this, pip_receiveSucceed);*/ kmodel = new CDKItemModel(); ui->treeCDK->setModel(kmodel); + delegate = new CDKDelegate(); + ui->treeCDK->setItemDelegateForColumn(4, delegate); connect(this, SIGNAL(q_k_sendFailed()), this, SLOT(k_sendFailed()), Qt::QueuedConnection); connect(this, SIGNAL(q_k_sendSucceed()), this, SLOT(k_sendSucceed()), Qt::QueuedConnection); connect(this, SIGNAL(q_k_receiveFailed()), this, SLOT(k_receiveFailed()), Qt::QueuedConnection); @@ -463,6 +465,8 @@ void CD_Pult::updateTree(bool move) { //calculate(); filterTree(); kmodel->rebuildModel(); + ui->treeCDK->expandAll(); + for (int i=0; i<6; i++) ui->treeCDK->resizeColumnToContents(i); } diff --git a/cd_utils/pult/cd_pult.h b/cd_utils/pult/cd_pult.h index 934f08b..4a80eb9 100644 --- a/cd_utils/pult/cd_pult.h +++ b/cd_utils/pult/cd_pult.h @@ -71,6 +71,7 @@ private: SessionManager session; QPIConfig config; CDKItemModel * kmodel; + CDKDelegate * delegate; //QVector k, x; int clear_target, timer; bool needWrite, isPause, need_update, show_x; diff --git a/qad_widgets/ecombobox.cpp b/qad_widgets/ecombobox.cpp index 83a917d..00935c7 100644 --- a/qad_widgets/ecombobox.cpp +++ b/qad_widgets/ecombobox.cpp @@ -53,6 +53,13 @@ EComboBox::EComboBox(QWidget * parent): QComboBox(parent) { } +QSize EComboBox::sizeHint() const { + QSize s = QComboBox::sizeHint(); + s.setWidth(s.width() + 16); + return s; +} + + void EComboBox::showPopup() { filterChanged(filter.text(), true); QComboBox::showPopup(); diff --git a/qad_widgets/ecombobox.h b/qad_widgets/ecombobox.h index d77969e..4ad832a 100644 --- a/qad_widgets/ecombobox.h +++ b/qad_widgets/ecombobox.h @@ -14,6 +14,8 @@ class EComboBox: public QComboBox public: explicit EComboBox(QWidget * parent = 0); + QSize sizeHint() const; + public slots: virtual void showPopup(); diff --git a/qad_widgets/qvariantedit.cpp b/qad_widgets/qvariantedit.cpp index 77bf626..15eb388 100644 --- a/qad_widgets/qvariantedit.cpp +++ b/qad_widgets/qvariantedit.cpp @@ -192,6 +192,7 @@ void QVariantEdit::_recreate(const QVariant & new_value) { switch (new_value.type()) { case QVariant::Bool: _check = new QCheckBox(this); + _check->setAutoFillBackground(true); _cur_edit = _check; connect(_check, SIGNAL(toggled(bool)), this, SLOT(_changed())); break; @@ -225,7 +226,7 @@ void QVariantEdit::_recreate(const QVariant & new_value) { break; case QVariant::Double: _spin = new QDoubleSpinBox(this); - _spin->setDecimals(3); + _spin->setDecimals(5); _spin->setRange(-1E+199, 1E+199); _cur_edit = _spin; connect(_spin, SIGNAL(valueChanged(double)), this, SLOT(_changed())); @@ -289,7 +290,7 @@ void QVariantEdit::_recreate(const QVariant & new_value) { } if (!_cur_edit) { if (new_value.canConvert()) { - _enum = new QComboBox(this); + _enum = new EComboBox(this); _setEnum(new_value.value()); _cur_edit = _enum; connect(_enum, SIGNAL(currentIndexChanged(int)), this, SLOT(_changed())); @@ -368,7 +369,7 @@ void QVariantEdit::setValue(const QVariant & v) { _recreate(v); if (_cur_edit) _cur_edit->blockSignals(true); if (_line) {_line->setText(v.toString());} - if (_check) {_check->setChecked(v.toBool());} + if (_check) {_check->setChecked(v.toBool()); _check->setText(v.toBool() ? "true" : "false");} if (_color) {_color->setColor(v.value());} if (_list) {_list->setValue(v.toStringList());} if (_date) {_date->setDateTime(v.toDateTime());} @@ -441,3 +442,8 @@ void QVariantEdit::_setDir(const DirType & v) { _path->is_abs = v.is_abs; } +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 55fd472..84a0d66 100644 --- a/qad_widgets/qvariantedit.h +++ b/qad_widgets/qvariantedit.h @@ -130,12 +130,12 @@ protected: QRectEdit * _rect; QPointEdit * _point; PathEdit * _path; - QComboBox * _enum; + EComboBox * _enum; QWidget * _cur_edit; QVariant _value; private slots: - void _changed() {emit valueChanged(value());} + void _changed(); public slots: void setValue(const QVariant & v);