diff --git a/libs/piqt_widgets/pivaluetree_edit.cpp b/libs/piqt_widgets/pivaluetree_edit.cpp index 56f2783..01c4005 100644 --- a/libs/piqt_widgets/pivaluetree_edit.cpp +++ b/libs/piqt_widgets/pivaluetree_edit.cpp @@ -240,16 +240,14 @@ void PIValueTreeEdit::actionTriggered(QToolButton * button, const PIString & vn, comm_labels.remove(vt.name()); } else { auto * ve = new PIVariantEdit(); - ve->setAttributes(vt.attributes()); - ve->setValue(vt.value()); + applyVariantEdit(ve, vt); grid->replace(grid->getRow(button), PI2QString(vt.name()), ve, PI2QString(vt.comment())); value_edits[vt.name()] = ve; } ve = nullptr; } if (ve) { - ve->setAttributes(vt.attributes()); - ve->setValue(vt.value()); + applyVariantEdit(ve, vt); } if (now_label) { label_labels[vt.name()]->setStyleSheet(PI2QString(vt.attribute(Attribute::style).toString())); @@ -301,8 +299,7 @@ PIValueTreeEdit * PIValueTreeEdit::addTreeEdit(const PIValueTree & vt) { void PIValueTreeEdit::addValueEdit(const PIValueTree & vt) { auto * ve = new PIVariantEdit(); - ve->setAttributes(vt.attributes()); - ve->setValue(vt.value()); + applyVariantEdit(ve, vt); grid->add(vt, PI2QString(vt.name()), ve, PI2QString(vt.comment())); value_edits[vt.name()] = ve; } @@ -332,6 +329,13 @@ QLabel * PIValueTreeEdit::newLabel(const PIValueTree & vt) { } +void PIValueTreeEdit::applyVariantEdit(PIVariantEdit * ve, const PIValueTree & vt) { + ve->setFullEditMode(is_full_edit); + ve->setAttributes(vt.attributes()); + ve->setValue(vt.value()); +} + + void PIValueTreeEdit::newRequest(NewType type) { PIString nn = Q2PIString(QInputDialog::getText(nullptr, tr("New item"), tr("Input new name:"))); if (nn.isEmpty()) return; diff --git a/libs/piqt_widgets/pivaluetree_edit.h b/libs/piqt_widgets/pivaluetree_edit.h index 9c603cf..221bcb6 100644 --- a/libs/piqt_widgets/pivaluetree_edit.h +++ b/libs/piqt_widgets/pivaluetree_edit.h @@ -77,6 +77,7 @@ private: void addValueEdit(const PIValueTree & vt); void applyArrayAttributes(); QLabel * newLabel(const PIValueTree & vt); + void applyVariantEdit(PIVariantEdit * ve, const PIValueTree & vt); class GridWidgets: public QWidget { public: diff --git a/libs/piqt_widgets/pivariant_edit_enum.cpp b/libs/piqt_widgets/pivariant_edit_enum.cpp new file mode 100644 index 0000000..f41a8b5 --- /dev/null +++ b/libs/piqt_widgets/pivariant_edit_enum.cpp @@ -0,0 +1,74 @@ +#include "pivariant_edit_enum.h" + +#include "piqt.h" + + +PIValueTreeEditEnum::PIValueTreeEditEnum(QWidget * parent): QDialog(parent) { + setupUi(this); +} + + +PIValueTreeEditEnum::~PIValueTreeEditEnum() {} + + +bool PIValueTreeEditEnum::showFor(const PIVariantTypes::Enum & v) { + ret = PIVariantTypes::Enum(); + + treeWidget->clear(); + for (auto e: v.enum_list) + addItem(PI2QString(e.name), e.value); + + if (exec() != QDialog::Accepted) return false; + + for (int i = 0; i < treeWidget->topLevelItemCount(); ++i) { + auto * ti = treeWidget->topLevelItem(i); + ret << PIVariantTypes::Enumerator(ti->text(1).toInt(), Q2PIString(ti->text(0))); + } + + return true; +} + + +QTreeWidgetItem * PIValueTreeEditEnum::addItem(QString n, int v) { + auto * ti = new QTreeWidgetItem({n, QString::number(v)}); + treeWidget->addTopLevelItem(ti); + auto f = ti->flags(); + f.setFlag(Qt::ItemIsEditable); + ti->setFlags(f); + return ti; +} + + +void PIValueTreeEditEnum::on_buttonAdd_clicked() { + bool is_edit = false; + for (int i = 0; i < treeWidget->topLevelItemCount(); ++i) { + auto * ti = treeWidget->topLevelItem(i); + for (int c = 0; c < treeWidget->columnCount(); ++c) { + if (treeWidget->isPersistentEditorOpen(ti, c)) { + is_edit = true; + break; + } + } + if (is_edit) break; + } + if (is_edit) { + buttonAdd->setFocus(); + treeWidget->setFocus(); + } + int max = -1; + for (int i = 0; i < treeWidget->topLevelItemCount(); ++i) + max = piMaxi(max, treeWidget->topLevelItem(i)->text(1).toInt()); + + auto * ti = addItem("name", max + 1); + treeWidget->editItem(ti, 0); +} + + +void PIValueTreeEditEnum::on_buttonRemove_clicked() { + qDeleteAll(treeWidget->selectedItems()); +} + + +void PIValueTreeEditEnum::on_buttonClear_clicked() { + treeWidget->clear(); +} diff --git a/libs/piqt_widgets/pivariant_edit_enum.h b/libs/piqt_widgets/pivariant_edit_enum.h new file mode 100644 index 0000000..686450e --- /dev/null +++ b/libs/piqt_widgets/pivariant_edit_enum.h @@ -0,0 +1,52 @@ +/* + PIQt Utils - Qt utilites for PIP + + Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#ifndef pivariant_edit_enum_H +#define pivariant_edit_enum_H + +#include "ui_pivariant_edit_enum.h" + +#include +#include + + +class PIValueTreeEditEnum + : public QDialog + , public Ui::PIValueTreeEditEnum { + Q_OBJECT + +public: + PIValueTreeEditEnum(QWidget * parent = nullptr); + ~PIValueTreeEditEnum(); + + bool showFor(const PIVariantTypes::Enum & v); + + PIVariantTypes::Enum ret; + +private: + QTreeWidgetItem * addItem(QString n, int v); + +private slots: + void on_buttonAdd_clicked(); + void on_buttonRemove_clicked(); + void on_buttonClear_clicked(); +}; + + +#endif diff --git a/libs/piqt_widgets/pivariant_edit_enum.ui b/libs/piqt_widgets/pivariant_edit_enum.ui new file mode 100644 index 0000000..0553e2e --- /dev/null +++ b/libs/piqt_widgets/pivariant_edit_enum.ui @@ -0,0 +1,223 @@ + + + PIValueTreeEditEnum + + + + 0 + 0 + 457 + 347 + + + + Edit Enum + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + :/icons/list-add.png:/icons/list-add.png + + + + + + + + :/icons/edit-delete.png:/icons/edit-delete.png + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 5 + + + + + + + + + :/icons/edit-clear.png:/icons/edit-clear.png + + + + + + + Qt::Horizontal + + + + + + + + + + QAbstractItemView::ExtendedSelection + + + QAbstractItemView::ScrollPerPixel + + + false + + + false + + + false + + + + Name + + + + + Value + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + :/icons/edit-delete.png:/icons/edit-delete.png + + + Remove + + + + + + :/icons/configure.png:/icons/configure.png + + + Change ... + + + + + + :/icons/border-line.png:/icons/border-line.png + + + Rename ... + + + + + + :/icons/code-variable.png:/icons/code-variable.png + + + Value + + + + + + :/icons/code-struct.png:/icons/code-struct.png + + + Group + + + + + + :/icons/code-union.png:/icons/code-union.png + + + Array + + + + + + :/icons/legend.png:/icons/legend.png + + + Reorder ... + + + + + + + + + + + + buttonBox + accepted() + PIValueTreeEditEnum + accept() + + + 260 + 333 + + + 196 + 221 + + + + + buttonBox + rejected() + PIValueTreeEditEnum + reject() + + + 330 + 333 + + + 291 + 222 + + + + + diff --git a/libs/piqt_widgets/pivariant_edit_widgets.cpp b/libs/piqt_widgets/pivariant_edit_widgets.cpp index 26d393d..580e634 100644 --- a/libs/piqt_widgets/pivariant_edit_widgets.cpp +++ b/libs/piqt_widgets/pivariant_edit_widgets.cpp @@ -1,10 +1,12 @@ #include "pivariant_edit_widgets.h" #include "pivaluetree.h" +#include "pivariant_edit_enum.h" #include "pivarianttypes.h" #include #include +#include REGISTER_PIVARIANTEDITOR(bool, PIVariantEditors::Bool); REGISTER_PIVARIANTEDITOR(short, PIVariantEditors::Int); @@ -153,6 +155,31 @@ void PIVariantEditors::DateTime::applyAttributes(const PIVariantMap & a) { // PIVariantEditors::Enum +PIVariantEditors::Enum::Enum() { + widget = new QComboBox(); + layout()->addWidget(widget); + edit_widget = new QWidget(); + edit_widget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + edit_widget->setLayout(new QBoxLayout(QBoxLayout::LeftToRight)); + QMargins m = edit_widget->layout()->contentsMargins(); + m.setTop(0); + m.setBottom(0); + m.setRight(0); + edit_widget->layout()->setContentsMargins(m); + auto * b = new QToolButton(); + b->setIcon(QIcon(":/icons/document-edit.png")); + connect(b, &QToolButton::clicked, this, [this]() { + PIValueTreeEditEnum dlg; + if (!dlg.showFor(src)) return; + setValue(PIVariant(dlg.ret)); + }); + edit_widget->layout()->addWidget(b); + layout()->setSpacing(0); + layout()->addWidget(edit_widget); + setFullEditMode(false); +} + + void PIVariantEditors::Enum::setValue(const PIVariant & v) { src = v.toEnum(); int sv = src.selectedValue(); @@ -173,3 +200,8 @@ PIVariant PIVariantEditors::Enum::value() const { void PIVariantEditors::Enum::applyAttributes(const PIVariantMap & a) { widget->setEnabled(!a.value(Attribute::readOnly, !widget->isEnabled()).toBool()); } + + +void PIVariantEditors::Enum::setFullEditMode(bool on) { + edit_widget->setVisible(on); +} diff --git a/libs/piqt_widgets/pivariant_edit_widgets.h b/libs/piqt_widgets/pivariant_edit_widgets.h index f36c8b6..8e173f3 100644 --- a/libs/piqt_widgets/pivariant_edit_widgets.h +++ b/libs/piqt_widgets/pivariant_edit_widgets.h @@ -190,18 +190,17 @@ class QAD_PIQT_UTILS_EXPORT Enum: public PIVariantEditorBase { Q_OBJECT public: - Enum() { - widget = new QComboBox(); - layout()->addWidget(widget); - } + Enum(); void setValue(const PIVariant & v) override; PIVariant value() const override; PIVariantMap attributes() const override { return {}; } private: void applyAttributes(const PIVariantMap & a) override; + void setFullEditMode(bool on) override; mutable PIVariantTypes::Enum src; QComboBox * widget; + QWidget * edit_widget; }; diff --git a/libs/piqt_widgets/qad_piqt_widgets.qrc b/libs/piqt_widgets/qad_piqt_widgets.qrc index ebda946..04c8e6a 100644 --- a/libs/piqt_widgets/qad_piqt_widgets.qrc +++ b/libs/piqt_widgets/qad_piqt_widgets.qrc @@ -7,5 +7,6 @@ ../../icons/code-struct.png ../../icons/code-union.png ../../icons/legend.png + ../../icons/document-edit.png diff --git a/utils/piconnedit/piconnedit_main.cpp b/utils/piconnedit/piconnedit_main.cpp index 44c1aab..6b17ff5 100644 --- a/utils/piconnedit/piconnedit_main.cpp +++ b/utils/piconnedit/piconnedit_main.cpp @@ -55,10 +55,10 @@ int main(int argc, char * argv[]) { area.setWidgetResizable(true); PIValueTreeEdit e; e.setGroupingEnabled(false); - e.setFullEditMode(true); + e.setFullEditMode(false); e.setGeometry(500, 400, 100, 50); // e.setValue(PIValueTreeConversions::fromJSON(PIJSON::fromJSON(PIValueTreeConversions::toJSON(vt).toJSON()))); - e.setValue(root); + e.setValue(vt); area.setWidget(&e); area.show(); // piCout << PIValueTreeConversions::toText(e.value()); //.toJSON(PIJSON::Tree);