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);