From cce1b6a0c4da609c7dfdc7ecef7ad9fb311c90b2 Mon Sep 17 00:00:00 2001 From: peri4 Date: Tue, 20 Dec 2022 10:04:37 +0300 Subject: [PATCH] add QAD valuetreeeditor util --- libs/piqt_widgets/pivaluetree_edit.cpp | 4 +- libs/piqt_widgets/pivariant_edit_widgets.cpp | 3 +- utils/blockeditor/blockeditor_main.cpp | 4 +- utils/piconnedit/piconnedit_main.cpp | 102 +------ utils/qpicalculator/mainwindow.cpp | 81 +++--- utils/valuetreeeditor/CMakeLists.txt | 19 ++ .../valuetreeeditor/icons/valuetreeeditor.ico | Bin 0 -> 24875 bytes .../valuetreeeditor/icons/valuetreeeditor.png | Bin 0 -> 24496 bytes utils/valuetreeeditor/mainwindow.cpp | 90 ++++++ utils/valuetreeeditor/mainwindow.h | 32 +++ utils/valuetreeeditor/mainwindow.ui | 266 ++++++++++++++++++ utils/valuetreeeditor/valuetreeeditor.qrc | 5 + .../valuetreeeditor/valuetreeeditor_main.cpp | 17 ++ 13 files changed, 496 insertions(+), 127 deletions(-) create mode 100644 utils/valuetreeeditor/CMakeLists.txt create mode 100644 utils/valuetreeeditor/icons/valuetreeeditor.ico create mode 100644 utils/valuetreeeditor/icons/valuetreeeditor.png create mode 100644 utils/valuetreeeditor/mainwindow.cpp create mode 100644 utils/valuetreeeditor/mainwindow.h create mode 100644 utils/valuetreeeditor/mainwindow.ui create mode 100644 utils/valuetreeeditor/valuetreeeditor.qrc create mode 100644 utils/valuetreeeditor/valuetreeeditor_main.cpp diff --git a/libs/piqt_widgets/pivaluetree_edit.cpp b/libs/piqt_widgets/pivaluetree_edit.cpp index f327357..c488022 100644 --- a/libs/piqt_widgets/pivaluetree_edit.cpp +++ b/libs/piqt_widgets/pivaluetree_edit.cpp @@ -49,12 +49,14 @@ PIValueTree PIValueTreeEdit::value() const { void PIValueTreeEdit::setGroupingEnabled(bool yes) { + applyValues(); is_grouping = yes; build(); } void PIValueTreeEdit::setFullEditMode(bool yes) { + applyValues(); is_full_edit = yes; build(); } @@ -121,12 +123,12 @@ void PIValueTreeEdit::build() { grid->create_edit_buttons = false; removeAll(); // piCout << source.attributes().value(Attribute::arrayType) << array_type; + grid->button_add->hide(); if (current.isArray()) { widget_array = new QWidget(); ui_array->setupUi(widget_array); applyArrayAttributes(); ui_array->layoutArray->addWidget(grid); - grid->button_add->hide(); grid->show(); uint array_type = PIVariant::typeIDFromName(current.attribute(Attribute::arrayType).toString()); int index = 0; diff --git a/libs/piqt_widgets/pivariant_edit_widgets.cpp b/libs/piqt_widgets/pivariant_edit_widgets.cpp index 3c857dc..3de5aba 100644 --- a/libs/piqt_widgets/pivariant_edit_widgets.cpp +++ b/libs/piqt_widgets/pivariant_edit_widgets.cpp @@ -6,7 +6,7 @@ #include #include -#include > +#include #include #include @@ -349,6 +349,7 @@ void PIVariantEditors::FileBase::setFullEditMode(bool on) { edit_widget->setVisible(on); } + void PIVariantEditors::FileBase::createMenu() { act_abs = edit_menu.addAction(tr("Absolute path"), this, [this](bool on) { is_abs = on; }); act_abs->setCheckable(true); diff --git a/utils/blockeditor/blockeditor_main.cpp b/utils/blockeditor/blockeditor_main.cpp index 3bf3b37..05f04c5 100644 --- a/utils/blockeditor/blockeditor_main.cpp +++ b/utils/blockeditor/blockeditor_main.cpp @@ -1,12 +1,14 @@ #include "blockeditor.h" +#include "qad_locations.h" #include int main(int argc, char * argv[]) { QApplication a(argc, argv); - enableHighDPI(); a.setWindowIcon(QIcon(":/icons/blockview.png")); + enableHighDPI(); + QAD::loadTranslations(); BlockEditor w; if (a.arguments().size() > 1) w.loadFile(a.arguments().back()); w.show(); diff --git a/utils/piconnedit/piconnedit_main.cpp b/utils/piconnedit/piconnedit_main.cpp index 8a9db7e..43eee53 100644 --- a/utils/piconnedit/piconnedit_main.cpp +++ b/utils/piconnedit/piconnedit_main.cpp @@ -1,105 +1,33 @@ -#include "pifile.h" -#include "pijson.h" #include "piqt_connection_edit.h" -#include "pivaluetree_conversions.h" -#include "pivaluetree_edit.h" #include #include -#include -#include -#include -#include #include #include #include int main(int argc, char * argv[]) { - QApplication a(argc, argv); - - PIValueTree root, group, array; - root.addChild({"bool", false}); - root.addChild({ - "integer", - 256, - {{PIValueTree::Attribute::minimum, -100}, {PIValueTree::Attribute::maximum, 200}, {PIValueTree::Attribute::singleStep, 5}} - }); - root.addChild({"Label here", PIVariant(), {{PIValueTree::Attribute::isLabel, true}}}); - root.addChild({"string", "str"}); - group.addChild({"substr", "str2"}); - group.addChild({"real", 12.3}); - group.setName("group"); - array.setAttribute(PIValueTree::Attribute::arrayType, "string"); - array.setAttribute(PIValueTree::Attribute::arrayResize, true); - array.setAttribute(PIValueTree::Attribute::arrayMinCount, 0); - array.setAttribute(PIValueTree::Attribute::arrayMaxCount, 10); - array.setName("array"); - array.addChild({"0", "1E+2"}); - array.addChild({"1", -5}); - array.addChild({"3", 0.1}); - root.addChild(group); - root.addChild(array); - PIString json = PIValueTreeConversions::toJSON(root).toJSON(PIJSON::Tree); - // piCout << PIValueTreeConversions::fromJSON(PIJSON::fromJSON(json)); - - PIFile f("C:/work/config.conf", PIIODevice::ReadOnly); - auto vt = PIValueTreeConversions::fromText(&f); - PIVariantTypes::Enum en; - en << "first" - << "second"; - en << PIVariantTypes::Enumerator(10, "TEN"); - en.selectValue(1); - vt.addChild({"Enum", en}); - // piCout << PIValueTreeConversions::toText(vt); - - QScrollArea area; - area.setWidgetResizable(true); - PIValueTreeEdit e; - e.setGroupingEnabled(true); - e.setFullEditMode(true); - e.setGeometry(500, 400, 100, 50); - // e.setValue(PIValueTreeConversions::fromJSON(PIJSON::fromJSON(PIValueTreeConversions::toJSON(vt).toJSON()))); - e.setValue(vt); - area.setWidget(&e); - area.show(); - // piCout << PIValueTreeConversions::toText(e.value()); //.toJSON(PIJSON::Tree); - - QTimer timer; - QObject::connect(&timer, &QTimer::timeout, [&]() { e.rollback(); }); - // timer.start(5); - QTimer::singleShot(1000, [&e]() { - auto * qtr = new QTranslator(); - qtr->load("c:/work/test_ru.qm"); - qApp->installTranslator(qtr); - }); - // QTimer::singleShot(2000, [&e, vt]() { - // e.setValue(PIValueTreeConversions::fromText(PIValueTreeConversions::toText(vt) + "\n[]\nAHAHA = 123\n")); - //}); - // QTimer::singleShot(3000, [&e]() { e.setFullEditMode(false); }); - return a.exec(); - - /* PIINTROSPECTION_START(piconnedit) QApplication a(argc, argv); enableHighDPI(); ConnectionEdit w; if (a.arguments().size() > 1) { - QPIConfig cfg(a.arguments()[1]); - QByteArray model = cfg.getValue("connectionmodel").toByteArray(); - if (!model.isEmpty()) w.setModel(model); + QPIConfig cfg(a.arguments()[1]); + QByteArray model = cfg.getValue("connectionmodel").toByteArray(); + if (!model.isEmpty()) w.setModel(model); } else - w.recreateConnection(); + w.recreateConnection(); if (w.exec() == QDialog::Accepted) { - QString c = QFileDialog::getSaveFileName(&w, "Save config to file", a.applicationDirPath(), "*.conf"); - if (!c.isEmpty()) { - QFile f(c); - if (f.open(QIODevice::WriteOnly)) { - QTextStream ts(&f); - ts << w.configuration(); - ts << "connectionmodel = " << QByteArray2QString(w.model()) << "\n"; - f.close(); - } - } + QString c = QFileDialog::getSaveFileName(&w, "Save config to file", a.applicationDirPath(), "*.conf"); + if (!c.isEmpty()) { + QFile f(c); + if (f.open(QIODevice::WriteOnly)) { + QTextStream ts(&f); + ts << w.configuration(); + ts << "connectionmodel = " << QByteArray2QString(w.model()) << "\n"; + f.close(); + } + } } - return 0;*/ + return 0; } diff --git a/utils/qpicalculator/mainwindow.cpp b/utils/qpicalculator/mainwindow.cpp index 32f4601..b5446b6 100644 --- a/utils/qpicalculator/mainwindow.cpp +++ b/utils/qpicalculator/mainwindow.cpp @@ -1,4 +1,5 @@ #include "mainwindow.h" + #include "piqt.h" #include "qad_locations.h" @@ -16,8 +17,8 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow() #endif npal = epal = lineInput->palette(); epal.setColor(lineInput->backgroundRole(), QColor(Qt::red).lighter(150)); - connect(&session, SIGNAL(loading(QPIConfig & )), this, SLOT(loading(QPIConfig & ))); - connect(&session, SIGNAL(saving(QPIConfig & )), this, SLOT(saving(QPIConfig & ))); + connect(&session, SIGNAL(loading(QPIConfig &)), this, SLOT(loading(QPIConfig &))); + connect(&session, SIGNAL(saving(QPIConfig &)), this, SLOT(saving(QPIConfig &))); session.setFile(QAD::userPath(QAD::ltConfig, "session_qpicalc")); session.addEntry(this); session.addEntry(lineInput); @@ -28,18 +29,16 @@ MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), Ui::MainWindow() } -MainWindow::~MainWindow() {session.save(); +MainWindow::~MainWindow() { + session.save(); } void MainWindow::changeEvent(QEvent * e) { QMainWindow::changeEvent(e); switch (e->type()) { - case QEvent::LanguageChange: - retranslateUi(this); - break; - default: - break; + case QEvent::LanguageChange: retranslateUi(this); break; + default: break; } } @@ -82,9 +81,9 @@ void MainWindow::redrawGraphics() { void MainWindow::loading(QPIConfig & conf) { - active_ = false; + active_ = false; QStringList vars = conf.getValue("variables").toStringList(); - int vc = vars.size() / 2; + int vc = vars.size() / 2; for (int i = 0; i < vc; ++i) { QTreeWidgetItem * ti = new QTreeWidgetItem(treeVariables); ti->setText(0, vars[i * 2]); @@ -110,8 +109,7 @@ void MainWindow::loading(QPIConfig & conf) { buttonGraphicClear->setEnabled(treeGraphics->topLevelItemCount() > 0); graphic->setVisualRect(conf.getValue("graphicRect", QRectF(-1., -1., 2., 2.)).toRectF()); ba = conf.getValue("graphic_state").toByteArray(); - if (!ba.isEmpty()) - graphic->load(ba); + if (!ba.isEmpty()) graphic->load(ba); on_tabWidget_currentChanged(0); redrawGraphics(); active_ = true; @@ -133,7 +131,8 @@ void MainWindow::saving(QPIConfig & conf) { QTreeWidgetItem * ti = treeGraphics->topLevelItem(i); vars << QString::number(ti->background(1).color().rgb()) << ti->text(2); } - QByteArray ba; QDataStream s(&ba, QIODevice::WriteOnly); + QByteArray ba; + QDataStream s(&ba, QIODevice::WriteOnly); s << graphic->allGraphics(); conf.setValue("graphics", QByteArray2QString(ba)); conf.setValue("graphicRect", graphic->visualRect()); @@ -142,8 +141,10 @@ void MainWindow::saving(QPIConfig & conf) { void MainWindow::on_lineInput_textChanged(QString text) { - if (evaluator.check(Q2PIString(text))) lineInput->setPalette(npal); - else lineInput->setPalette(epal); + if (evaluator.check(Q2PIString(text))) + lineInput->setPalette(npal); + else + lineInput->setPalette(epal); labelParsed->setText(PI2QString(evaluator.expression())); labelError->setText(PI2QString(evaluator.error())); } @@ -151,36 +152,37 @@ void MainWindow::on_lineInput_textChanged(QString text) { void MainWindow::on_lineInput_returnPressed() { bool ret = evaluator.check(Q2PIString(lineInput->text())); - if (ret) lineInput->setPalette(npal); - else lineInput->setPalette(epal); + if (ret) + lineInput->setPalette(npal); + else + lineInput->setPalette(epal); labelParsed->setText(PI2QString(evaluator.expression())); labelError->setText(PI2QString(evaluator.error())); if (!ret) return; complexd val = evaluator.evaluate(); evaluator.setVariable(ans, val); - if (val.imag() == 0) labelResult->setText(QString::number(val.real())); + if (val.imag() == 0) + labelResult->setText(QString::number(val.real())); else { - if (val.real() == 0) labelResult->setText(QString::number(val.imag()) + "i"); + if (val.real() == 0) + labelResult->setText(QString::number(val.imag()) + "i"); else { - if (val.imag() > 0) labelResult->setText(QString::number(val.real()) - + " + " + QString::number(val.imag()) + "i"); - else labelResult->setText(QString::number(val.real()) - + " - " + QString::number(fabs(val.imag())) + "i"); + if (val.imag() > 0) + labelResult->setText(QString::number(val.real()) + " + " + QString::number(val.imag()) + "i"); + else + labelResult->setText(QString::number(val.real()) + " - " + QString::number(fabs(val.imag())) + "i"); } } if (lineInput->text().trimmed().isEmpty()) return; - QTreeWidgetItem * ti = 0, * pti = 0; - if (treeHistory->topLevelItemCount() > 0) - pti = treeHistory->topLevelItem(treeHistory->topLevelItemCount() - 1); + QTreeWidgetItem *ti = 0, *pti = 0; + if (treeHistory->topLevelItemCount() > 0) pti = treeHistory->topLevelItem(treeHistory->topLevelItemCount() - 1); if (pti != 0) - if (pti->text(0) == lineInput->text()) - return; + if (pti->text(0) == lineInput->text()) return; ti = new QTreeWidgetItem(treeHistory); ti->setText(0, lineInput->text()); ti->setText(1, labelResult->text()); treeHistory->addTopLevelItem(ti); - if (treeHistory->verticalScrollBar()->value() == treeHistory->verticalScrollBar()->maximum()) - treeHistory->scrollToBottom(); + if (treeHistory->verticalScrollBar()->value() == treeHistory->verticalScrollBar()->maximum()) treeHistory->scrollToBottom(); } @@ -196,11 +198,16 @@ void MainWindow::on_treeGraphics_itemSelectionChanged() { void MainWindow::on_treeGraphics_itemDoubleClicked(QTreeWidgetItem * item, int column) { Qt::ItemFlags f = item->flags(); - if (column != 1) f &= ~Qt::ItemIsEditable; - else f |= Qt::ItemIsEditable; + if (column != 1) + f &= ~Qt::ItemIsEditable; + else + f |= Qt::ItemIsEditable; item->setFlags(f); if (column != 0) return; - QColor col = QColorDialog::getColor(item->data(0, Qt::DecorationRole).value(), this, "Select color for graphic", QColorDialog::ShowAlphaChannel); + QColor col = QColorDialog::getColor(item->data(0, Qt::DecorationRole).value(), + this, + "Select color for graphic", + QColorDialog::ShowAlphaChannel); if (!col.isValid()) return; item->setData(0, Qt::DecorationRole, col); updateGraphics(); @@ -219,8 +226,8 @@ void MainWindow::on_buttonVarAdd_clicked() { void MainWindow::on_buttonVarDel_clicked() { - QList si = treeVariables->selectedItems(); - foreach (QTreeWidgetItem * i, si) + QList si = treeVariables->selectedItems(); + foreach(QTreeWidgetItem * i, si) delete i; buttonVarClear->setEnabled(treeVariables->topLevelItemCount() > 0); } @@ -243,8 +250,8 @@ void MainWindow::on_buttonGraphicAdd_clicked() { void MainWindow::on_buttonGraphicDel_clicked() { - QList si = treeGraphics->selectedItems(); - foreach (QTreeWidgetItem * i, si) + QList si = treeGraphics->selectedItems(); + foreach(QTreeWidgetItem * i, si) delete i; buttonGraphicClear->setEnabled(treeGraphics->topLevelItemCount() > 0); updateGraphics(); diff --git a/utils/valuetreeeditor/CMakeLists.txt b/utils/valuetreeeditor/CMakeLists.txt new file mode 100644 index 0000000..d51de14 --- /dev/null +++ b/utils/valuetreeeditor/CMakeLists.txt @@ -0,0 +1,19 @@ +project(valuetreeeditor) +if(APPLE) + set(APP_ICON "") +elseif(WIN32) + set(APP_ICON "icons/valuetreeeditor.ico") +else() + set(APP_ICON "icons/valuetreeeditor.png") +endif() +set(APP_INFO "Editor for PIValueTree") +qad_application(${PROJECT_NAME} "Gui;Widgets" "qad_utils;qad_widgets;qad_application;qad_piqt_utils") +if (NOT DEFINED ANDROID_PLATFORM) + foreach (_qv_ IN ITEMS 5 6) + if (${LOCAL_FOUND${_qv_}}) + import_version(${PROJECT_NAME}${_qv_} ${PROJECT_NAME}) + import_deploy_properties(${PROJECT_NAME}${_qv_} ${PROJECT_NAME}) + deploy_target(${PROJECT_NAME}${_qv_} DEPLOY_DIR ${CMAKE_CURRENT_BINARY_DIR} DESTINATION ${ROOT_DIR}/release ADD_MANIFEST) + endif() + endforeach() +endif() diff --git a/utils/valuetreeeditor/icons/valuetreeeditor.ico b/utils/valuetreeeditor/icons/valuetreeeditor.ico new file mode 100644 index 0000000000000000000000000000000000000000..831b3c2e40e9c1deeb518716a5d65b9c01b89ff4 GIT binary patch literal 24875 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 fuJ({?gG>05g?nY?2kcv54Id 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 hq2Q>#M;FL6v#8(?exDvyfZTS-#L&{Y>EH? literal 0 HcmV?d00001 diff --git a/utils/valuetreeeditor/mainwindow.cpp b/utils/valuetreeeditor/mainwindow.cpp new file mode 100644 index 0000000..3fb506d --- /dev/null +++ b/utils/valuetreeeditor/mainwindow.cpp @@ -0,0 +1,90 @@ +#include "mainwindow.h" + +#include "piqt.h" +#include "qad_locations.h" + +#include +#include +#include +#include +#include + + +MainWindow::MainWindow(QWidget * parent): EMainWindow(parent), Ui::MainWindow() { + setupUi(this); + session.setFile(QAD::userPath(QAD::ltConfig, "session_valuetreeeditor")); + session.addEntry(this); + session.load(); + widget->setGroupingEnabled(actionGrouping->isChecked()); + widget->setFullEditMode(actionFull_edit_mode->isChecked()); +} + + +MainWindow::~MainWindow() { + session.save(); + session.clear(true); +} + + +void MainWindow::reset(bool) { + widget->setValue(PIValueTree()); + setWindowTitle(tr("PIValueTree Editor")); +} + + +bool MainWindow::load(const QString & path) { + PIFile f(Q2PIString(path), PIIODevice::ReadOnly); + if (!f.isOpened()) return false; + PIString ext = PIFile::FileInfo(f.path()).extension().toLowerCase(); + PIValueTree v; + if (ext == "conf" || ext == "ini") + v = PIValueTreeConversions::fromText(&f); + else if (ext == "json") + v = PIValueTreeConversions::fromJSON(PIJSON::fromJSON(PIString::fromUTF8(f.readAll()))); + else if (ext == "bin") + v = piDeserialize(f.readAll()); + widget->setValue(v); + setWindowTitle(tr("PIValueTree Editor - %1").arg(QFileInfo(path).fileName())); + return true; +} + + +bool MainWindow::save(const QString & path) { + PIFile f(Q2PIString(path), PIIODevice::ReadWrite); + if (!f.isOpened()) return false; + f.clear(); + PIString ext = PIFile::FileInfo(f.path()).extension().toLowerCase(); + auto v = widget->value(); + if (ext == "conf" || ext == "ini") + f.write(PIValueTreeConversions::toText(v).toUTF8()); + else if (ext == "json") + f.write(PIValueTreeConversions::toJSON(v).toJSON(PIJSON::Tree, false).toUTF8()); + else if (ext == "bin") + f.write(piSerialize(v)); + setWindowTitle(tr("PIValueTree Editor - %1").arg(QFileInfo(path).fileName())); + return true; +} + + +void MainWindow::changeEvent(QEvent * e) { + QMainWindow::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: retranslateUi(this); break; + default: break; + } +} + + +QString MainWindow::loadFilter() { + return "All types(*.conf *.ini *.json *.bin);;INI format(*.conf *.ini);;JSON(*.json);;Binary(*.bin)"; +} + + +void MainWindow::on_actionGrouping_toggled(bool on) { + widget->setGroupingEnabled(on); +} + + +void MainWindow::on_actionFull_edit_mode_toggled(bool on) { + widget->setFullEditMode(on); +} diff --git a/utils/valuetreeeditor/mainwindow.h b/utils/valuetreeeditor/mainwindow.h new file mode 100644 index 0000000..b7651f9 --- /dev/null +++ b/utils/valuetreeeditor/mainwindow.h @@ -0,0 +1,32 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include "emainwindow.h" +#include "ui_mainwindow.h" + + +class MainWindow + : public EMainWindow + , private Ui::MainWindow { + Q_OBJECT + +public: + MainWindow(QWidget * parent = 0); + ~MainWindow(); + + void reset(bool full = false) override; + bool load(const QString & path) override; + bool save(const QString & path) override; + +protected: + void changeEvent(QEvent * e); + + QString loadFilter() override; + QString saveFilter() override { return loadFilter(); } + +private slots: + void on_actionGrouping_toggled(bool on); + void on_actionFull_edit_mode_toggled(bool on); +}; + +#endif // MAINWINDOW_H diff --git a/utils/valuetreeeditor/mainwindow.ui b/utils/valuetreeeditor/mainwindow.ui new file mode 100644 index 0000000..993e8f8 --- /dev/null +++ b/utils/valuetreeeditor/mainwindow.ui @@ -0,0 +1,266 @@ + + + MainWindow + + + + 0 + 0 + 780 + 521 + + + + PIValueTree Editor + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QFrame::NoFrame + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + 0 + 0 + 780 + 446 + + + + + + + + + + + + + + + File + + + TopToolBarArea + + + false + + + + + + + + + + 0 + 0 + 780 + 31 + + + + + File + + + + + + + + + View + + + + + + + + + + + :/icons/document-open.png:/icons/document-open.png + + + Open... + + + Ctrl+O + + + + + + :/icons/document-save.png:/icons/document-save.png + + + Save + + + Ctrl+S + + + + + + :/icons/document-save-as.png:/icons/document-save-as.png + + + Save As... + + + Alt+Shift+S + + + + + + :/icons/document-new.png:/icons/document-new.png + + + New + + + Ctrl+N + + + + + + :/icons/dialog-information.png:/icons/dialog-information.png + + + About ... + + + + + true + + + Grouping + + + + + true + + + true + + + Full edit mode + + + + + + + PIValueTreeEdit + QWidget +
pivaluetree_edit.h
+ 1 +
+
+ + + + + + + + actionNew + triggered() + MainWindow + newFile() + + + -1 + -1 + + + 389 + 260 + + + + + actionOpen + triggered() + MainWindow + openFile() + + + -1 + -1 + + + 389 + 260 + + + + + actionSaveAs + triggered() + MainWindow + saveAsFile() + + + -1 + -1 + + + 389 + 260 + + + + + actionSave + triggered() + MainWindow + saveFile() + + + -1 + -1 + + + 389 + 260 + + + + + + newFile() + openFile() + saveFile() + saveAsFile() + +
diff --git a/utils/valuetreeeditor/valuetreeeditor.qrc b/utils/valuetreeeditor/valuetreeeditor.qrc new file mode 100644 index 0000000..c0abf17 --- /dev/null +++ b/utils/valuetreeeditor/valuetreeeditor.qrc @@ -0,0 +1,5 @@ + + + icons/valuetreeeditor.png + + diff --git a/utils/valuetreeeditor/valuetreeeditor_main.cpp b/utils/valuetreeeditor/valuetreeeditor_main.cpp new file mode 100644 index 0000000..aa682b1 --- /dev/null +++ b/utils/valuetreeeditor/valuetreeeditor_main.cpp @@ -0,0 +1,17 @@ +#include "mainwindow.h" +#include "qad_locations.h" +#include "qad_types.h" + +#include + + +int main(int argc, char * argv[]) { + QApplication a(argc, argv); + a.setWindowIcon(QIcon(":/icons/valuetreeeditor.png")); + enableHighDPI(); + QAD::loadTranslations(); + MainWindow w; + if (a.arguments().size() > 1) w.load(a.arguments().back()); + w.show(); + return a.exec(); +}