diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/CMakeLists.txt b/source/RobotAPI/gui-plugins/SkillManagerPlugin/CMakeLists.txt index 9450ff9ebb1ace95ca7a96d8bc631ecde8a2a145..e3c6112a1dda404dd72af32403f9512f9eccd014 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/CMakeLists.txt +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/CMakeLists.txt @@ -11,13 +11,15 @@ set(SOURCES aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp aronTreeWidget/visitors/AronTreeWidgetContextMenu.cpp aronTreeWidget/Data.cpp - aronTreeWidget/NDArrayHelper.cpp aronTreeWidget/EditMatrixWidget.cpp - aronTreeWidget/QuaternionWidget.cpp aronTreeWidget/AronTreeWidgetItem.cpp aronTreeWidget/AronTreeWidgetController.cpp - aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.cpp aronTreeWidget/modal/AronTreeWidgetModal.cpp + aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.cpp + aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.cpp + aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.cpp + aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.cpp + aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.cpp SkillManagerMonitorWidgetController.cpp ) @@ -28,19 +30,25 @@ set(HEADERS aronTreeWidget/visitors/AronTreeWidgetModalCreator.h aronTreeWidget/visitors/AronTreeWidgetContextMenu.h aronTreeWidget/Data.h - aronTreeWidget/NDArrayHelper.h aronTreeWidget/EditMatrixWidget.h - aronTreeWidget/QuaternionWidget.h aronTreeWidget/AronTreeWidgetItem.h aronTreeWidget/AronTreeWidgetController.h aronTreeWidget/modal/AronTreeWidgetModal.h + aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.h + aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.h + aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.h aronTreeWidget/modal/text/AronTreeWidgetTextInputModalController.h + aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.h SkillManagerMonitorWidgetController.h ) set(GUI_UIS SkillManagerMonitorWidget.ui + aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModal.ui + aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModal.ui + aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModal.ui aronTreeWidget/modal/text/AronTreeWidgetTextInputModal.ui + aronTreeWidget/modal/dict/AronTreeWidgetDictInputModal.ui ) # Add more libraries you depend on here, e.g. ${QT_LIBRARIES}. diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp index b90e4f6b5c76022d1a87c7afc0f484cf1993d01f..0811cfffe3b243b57a656b1f88beaa40bbfe916f 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/SkillManagerMonitorWidgetController.cpp @@ -181,6 +181,11 @@ namespace armarx if (!connected) return; + // TODO: this can hang the whole gui! (if the skills do not respond in time.) Move into Future calculation? + // for example set to pending in GUI while calculating, update on this thread once results are there. + // (GUIs do not like to be called from seperate threads) + // The Furure can calculate a set of actions to perform on gui elements? + // remove non-existing ones auto managerSkills = manager->getSkillDescriptions(); std::vector<std::string> removedProviders; diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.cpp index 2bffc07e7b8aacdad7bb2eabda044795a7714277..3399138ef033c86698345f4e068c7fc0a57d7ab4 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.cpp +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetController.cpp @@ -127,31 +127,16 @@ namespace armarx AronTreeWidgetController::onTreeWidgetItemChanged(QTreeWidgetItem* item, int column) { auto* aronElem = AronTreeWidgetItem::DynamicCast(item); - auto* parent = AronTreeWidgetItem::DynamicCast(item->parent()); - - if (!aronElem || !parent) + if (column != 1 || !aronElem) { return; } - if (column == 1) - { - // Try to convert the type into aron to find errors - AronTreeWidgetConverterVisitor v(item->parent(), item->parent()->indexOfChild(item)); - aron::type::visit(v, aronElem->aronType); - // set the state accordingly - aronElem->setValueErrorState(!v.isConversionSuccessful()); - } - else if (column == 0) - { - // check if the element is child of a dict. If so, validate uniqueness of keys - if (parent->aronType->getDescriptor() == aron::type::Descriptor::DICT) - { - parent->checkKeyValidityOfChildren(); - } - // maybe while editing keys, we try to edit a key that should not change by tabbing. - // Catch that here and undo the edit - aronElem->preventIllegalKeyChange(); - } + ARMARX_CHECK(item->parent()); + // Try to convert the type into aron to find errors + AronTreeWidgetConverterVisitor v(item->parent(), item->parent()->indexOfChild(item)); + aron::type::visit(v, aronElem->aronType); + // set the state accordingly + aronElem->setValueErrorState(!v.isConversionSuccessful()); } } // namespace armarx diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.cpp index 7ab2989457d0071b76f8951d3bf77b22b2b1062f..239921ff7f811fb119435a4fdf6c7d02a2b7d5a2 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.cpp +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.cpp @@ -7,14 +7,26 @@ namespace armarx { - AronTreeWidgetItem* - AronTreeWidgetItem::DynamicCast(QTreeWidgetItem* i) + AronTreeWidgetItem* AronTreeWidgetItem::DynamicCast(QTreeWidgetItem* i) { return dynamic_cast<AronTreeWidgetItem*>(i); } - AronTreeWidgetItem* - AronTreeWidgetItem::DynamicCastAndCheck(QTreeWidgetItem* i) + AronTreeWidgetItem::AronTreeWidgetItem(const AronTreeWidgetItem &other) : + QObject(), + QTreeWidgetItem(other) + { + aronType = other.aronType; + setValueErrorState(true); + } + + AronTreeWidgetItem* AronTreeWidgetItem::copy() + { + AronTreeWidgetItem* ret = new AronTreeWidgetItem(*this); + return ret; + } + + AronTreeWidgetItem* AronTreeWidgetItem::DynamicCastAndCheck(QTreeWidgetItem* i) { if (!i) { @@ -25,123 +37,24 @@ namespace armarx return c; } - bool - AronTreeWidgetItem::isValueErrorneous() + bool AronTreeWidgetItem::isValueErrorneous() { return itemValueError; } - void - AronTreeWidgetItem::setValueErrorState(bool hasError) + void AronTreeWidgetItem::setValueErrorState(bool hasError) { itemValueError = hasError; - if (hasError) - { + if(hasError){ QTreeWidgetItem::setBackgroundColor(1, Qt::red); - } - else - { + }else{ QTreeWidgetItem::setBackground(1, Qt::white); } } - void - AronTreeWidgetItem::setKeyErrorState(bool hasError) + AronTreeWidgetItem::AronTreeWidgetItem(bool editKey, bool editVal) : + col0Editable(editKey), col1Editable(editVal) { - ARMARX_CHECK(col0Editable); //only editable keys should call this function! - keyValueError = hasError; - if (hasError) - { - QTreeWidgetItem::setBackgroundColor(0, Qt::red); - } - else - { - QTreeWidgetItem::setBackground(0, Qt::white); - } - } - - - void - AronTreeWidgetItem::checkKeyValidityOfChildren() - { - ARMARX_CHECK(aronType->getDescriptor() == aron::type::Descriptor::DICT); - // return if check failed - if (aronType->getDescriptor() != aron::type::Descriptor::DICT) - { - return; - } - // iterate through children; memorize keys - std::map<QString, std::vector<int>> found_keys; - auto numChildren = childCount(); - for (int i = 0; i < numChildren; ++i) - { - auto* casted = AronTreeWidgetItem::DynamicCastAndCheck(child(i)); - if (!casted) - { - // soft error here, we already report it above. - Definetly programming error - continue; - } - auto& vec = found_keys[casted->text(0)]; - vec.push_back(i); - } - // highlight keys that conflict - // memorize children that are not ok - std::set<int> errorneous_indices; - for (auto [key, vals] : found_keys) - { - if (vals.size() > 1) - { - for (int i : vals) - { - auto* casted = AronTreeWidgetItem::DynamicCastAndCheck(child(i)); - if (!casted) - { - // soft error here, we already report it above. - Definetly programming error - continue; - } - casted->setKeyErrorState(true); - errorneous_indices.emplace(i); - } - } - } - // clear potential error state of other elements - for (int i = 0; i < numChildren; ++i) - { - if (errorneous_indices.find(i) != errorneous_indices.end()) - { - continue; - } - auto* casted = AronTreeWidgetItem::DynamicCastAndCheck(child(i)); - if (!casted) - { - // soft error here, we already report it above. - Definetly programming error - continue; - } - casted->setKeyErrorState(false); - } - } - - void - AronTreeWidgetItem::preventIllegalKeyChange() - { - if (!col0Editable) - { - setText(0, unchangeableKey); - } - } - - AronTreeWidgetItem::AronTreeWidgetItem(bool editKey, - bool editVal, - QString key, - aron::type::VariantPtr type) : - aronType(type), col0Editable(editKey), col1Editable(editVal) - { - this->setText(0, key); - // add hook to check for edited keys for children of dictionaries - if (!editKey) - { - unchangeableKey = std::move(key); - } } } // namespace armarx diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.h index b93f0e3e757a1bb937f8d1f3365bd7d6dd90a621..fe177100283826563ce23dd327ead2c7e494cde7 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.h +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/AronTreeWidgetItem.h @@ -17,14 +17,18 @@ namespace armarx { Q_OBJECT public: - AronTreeWidgetItem(bool editKey, bool editVal, QString key, aron::type::VariantPtr type); + AronTreeWidgetItem(const AronTreeWidgetItem& other); + AronTreeWidgetItem(bool editKey, bool editVal); using QTreeWidgetItem::QTreeWidgetItem; + AronTreeWidgetItem* copy(); // differs from clone!!!! + static AronTreeWidgetItem* DynamicCast(QTreeWidgetItem*); + static AronTreeWidgetItem* DynamicCastAndCheck(QTreeWidgetItem*); - const aron::type::VariantPtr aronType; + aron::type::VariantPtr aronType; // if editing the first column should be allowed const bool col0Editable = false; // if editing the second column should be allowed @@ -32,19 +36,8 @@ namespace armarx bool isValueErrorneous(); void setValueErrorState(bool hasError); - void setKeyErrorState(bool hasError); - - // Checks if the children of a dict are unique - // should not be called on other types! (does nothing then) - void checkKeyValidityOfChildren(); - - // because the editable keyword counts for all columns, it is possible to TAB into uneditable keys. - // We do not want those to change, so just change them back once they finished editing. - void preventIllegalKeyChange(); private: bool itemValueError = false; - bool keyValueError = false; - QString unchangeableKey = ""; }; } // namespace armarx diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/EditMatrixWidget.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/EditMatrixWidget.cpp index 223e5e8d9f71bfa03938c87d20862d1c58c1959a..7a0d9f4e939daf31b7ef838fbfb7fcede7aa9aa1 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/EditMatrixWidget.cpp +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/EditMatrixWidget.cpp @@ -6,7 +6,6 @@ #include "ArmarXCore/core/exceptions/local/ExpressionException.h" #include "ArmarXCore/core/logging/Logging.h" -#include "NDArrayHelper.h" #include "visitors/AronTreeWidgetCreator.h" namespace armarx @@ -204,24 +203,25 @@ namespace armarx EditMatrixWidget::parseElement(size_t row, size_t col) { std::string str = getText(row, col); + // TODO improve! Exceptions in control flow are a *really* bad smell try { switch (elemType) { case armarx::aron::type::matrix::INT16: - return NDArrayHelper::toByteVector<int16_t>(str); + return toByteVector<int16_t>(str); case armarx::aron::type::matrix::INT32: - return NDArrayHelper::toByteVector<int32_t>(str); + return toByteVector<int32_t>(str); case armarx::aron::type::matrix::INT64: - return NDArrayHelper::toByteVector<int64_t>(str); + return toByteVector<int64_t>(str); case armarx::aron::type::matrix::FLOAT32: - return NDArrayHelper::toByteVector<float>(str); + return toByteVector<float>(str); case armarx::aron::type::matrix::FLOAT64: - return NDArrayHelper::toByteVector<double>(str); + return toByteVector<double>(str); } } catch (const simox::error::SimoxError& err) diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/EditMatrixWidget.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/EditMatrixWidget.h index 3c3f9f5140d4a9820cc964fd98acf36927d9806b..fd39da5d21569d1b4dd6b30b74c8e2b05af2b06c 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/EditMatrixWidget.h +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/EditMatrixWidget.h @@ -51,9 +51,21 @@ namespace armarx template <typename T> static std::vector<unsigned char> toByteVector(const std::string& str); + // TODO: It would be nice to have this code somewhere else, this way, at least the GUI-responses + // are restricted to this Widget (signal & slot stuff) aron::type::matrix::ElementType elemType; private slots: void matrixElementChanged(); }; + + template <typename T> + std::vector<unsigned char> + EditMatrixWidget::toByteVector(const std::string& str) + { + auto val = simox::alg::to_<T>(str); + std::vector<unsigned char> res(sizeof(val), 0); + *reinterpret_cast<T*>(res.data()) = val; + return res; + } } // namespace armarx diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/QuaternionWidget.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/QuaternionWidget.cpp deleted file mode 100644 index 67a5a62a19c25f2c3b15058f8e3b0e9472fad1c5..0000000000000000000000000000000000000000 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/QuaternionWidget.cpp +++ /dev/null @@ -1,163 +0,0 @@ -#include "QuaternionWidget.h" - -#include <QHBoxLayout> -#include <QLabel> -#include <QLineEdit> - -#include "NDArrayHelper.h" -namespace armarx -{ - - QuaternionWidget* - QuaternionWidget::DynamicCast(QWidget* elem) - { - return dynamic_cast<QuaternionWidget*>(elem); - } - - QuaternionWidget* - QuaternionWidget::DynamicCastAndCheck(QWidget* elem) - { - if (!elem) - { - return nullptr; - } - auto* casted = DynamicCast(elem); - ARMARX_CHECK_NOT_NULL(casted); - return casted; - } - - void - QuaternionWidget::setText(QuaternionComponents col, const std::string& str) - { - size_t idx = (size_t)col; - xyzw_components.at(idx)->setText(str.c_str()); - highlightUnparsableEntries(); - } - - bool - QuaternionWidget::hasParseErrors() - { - return !noParseErrors; - } - - armarx::QuaternionWidget::QuaternionWidget(aron::type::quaternion::ElementType elType) : - element_type(elType) - { - auto outerLayout = new QHBoxLayout(); - auto labelCol1 = new QVBoxLayout(); - auto labelCol2 = new QVBoxLayout(); - auto xzEdit = new QVBoxLayout(); - auto ywEdit = new QVBoxLayout(); - - outerLayout->addLayout(labelCol1); - outerLayout->addLayout(xzEdit); - outerLayout->addLayout(labelCol2); - outerLayout->addLayout(ywEdit); - - xyzw_components.reserve(4); - for (size_t i = 0; i < 4; ++i) - { - xyzw_components.push_back(new QLineEdit()); - } - - // Tabbing order >> Viewing order. Thats why the indeces are a bit switched - labelCol1->addWidget(new QLabel("x")); - xzEdit->addWidget(xyzw_components.at(0)); - - labelCol2->addWidget(new QLabel("z")); - ywEdit->addWidget(xyzw_components.at(2)); - - labelCol1->addWidget(new QLabel("y")); - xzEdit->addWidget(xyzw_components.at(1)); - - labelCol2->addWidget(new QLabel("w")); - ywEdit->addWidget(xyzw_components.at(3)); - - for (const auto& el : xyzw_components) - { - connect(el, SIGNAL(editingFinished()), this, SLOT(quaternionElementChanged())); - } - - setLayout(outerLayout); - highlightUnparsableEntries(); - } - - void - QuaternionWidget::highlightUnparsableEntries() - { - QPalette normalPalette; - normalPalette.setColor(QPalette::Base, Qt::white); - normalPalette.setColor(QPalette::Text, Qt::black); - - QPalette errorPalette; - errorPalette.setColor(QPalette::Base, Qt::red); - errorPalette.setColor(QPalette::Text, Qt::black); - - noParseErrors = true; - for (size_t i = 0; i < 4; ++i) - { - bool ok = false; - switch (element_type) - { - case armarx::aron::type::quaternion::FLOAT32: - { - float flt; - std::tie(ok, flt) = parseQuatVals<float>((QuaternionComponents)i); - break; - } - - case armarx::aron::type::quaternion::FLOAT64: - { - double dbl; - std::tie(ok, dbl) = parseQuatVals<double>((QuaternionComponents)i); - break; - } - } - if (ok) - { - xyzw_components.at(i)->setPalette(normalPalette); - } - else - { - xyzw_components.at(i)->setPalette(errorPalette); - noParseErrors = false; - } - } - } - - std::vector<unsigned char> - QuaternionWidget::parseAllToNDArray() - { - std::vector<unsigned char> res; - bool success = true; - if (element_type == aron::type::quaternion::FLOAT32) - { - res.reserve(16); - for (size_t i = 0; i < 4; ++i) - { - auto bytevec = - NDArrayHelper::toByteVector<float>(xyzw_components.at(i)->text().toStdString()); - success &= bytevec.size(); - res.insert(res.end(), bytevec.begin(), bytevec.end()); - } - } - else - { - res.reserve(32); - for (size_t i = 0; i < 4; ++i) - { - auto bytevec = NDArrayHelper::toByteVector<double>( - xyzw_components.at(i)->text().toStdString()); - success &= !bytevec.empty(); - res.insert(res.end(), bytevec.begin(), bytevec.end()); - } - } - return (success) ? res : std::vector<unsigned char>(); - } - - void - QuaternionWidget::quaternionElementChanged() - { - highlightUnparsableEntries(); - } -} // namespace armarx diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/QuaternionWidget.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/QuaternionWidget.h deleted file mode 100644 index c75e0fad87b50c8a1225dbdcc4fc901b7c088650..0000000000000000000000000000000000000000 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/QuaternionWidget.h +++ /dev/null @@ -1,65 +0,0 @@ -#pragma once -#include <vector> - -#include <QLineEdit> -#include <QObject> -#include <QVBoxLayout> -#include <QWidget> - -#include "RobotAPI/libraries/aron/core/type/variant/ndarray/Matrix.h" - - -namespace armarx -{ - class QuaternionWidget : public QWidget - { - Q_OBJECT - public: - QuaternionWidget(aron::type::quaternion::ElementType); - - static QuaternionWidget* DynamicCast(QWidget*); - static QuaternionWidget* DynamicCastAndCheck(QWidget*); - - enum struct QuaternionComponents - { - X = 0, - Y, - Z, - W - }; - void setText(QuaternionComponents col, const std::string& str); - std::string getText(QuaternionComponents col); - bool hasParseErrors(); - std::vector<unsigned char> parseAllToNDArray(); - - private: - std::vector<QLineEdit*> xyzw_components; - aron::type::quaternion::ElementType element_type; - bool noParseErrors = true; - - void highlightUnparsableEntries(); - template <typename T> - std::pair<bool, T> parseQuatVals(QuaternionComponents comp); - - private slots: - void quaternionElementChanged(); - }; - - template <typename T> - std::pair<bool, T> - QuaternionWidget::parseQuatVals(QuaternionWidget::QuaternionComponents comp) - { - // size_t data_size = element_type == aron::type::quaternion::ElementType::FLOAT32 ? 4 : 8; - try - { - T val = simox::alg::to_<T>(xyzw_components.at((size_t)comp)->text().toStdString()); - return {true, val}; - } - catch (const simox::error::SimoxError& err) - { - return {false, NAN}; - } - } - - -} // namespace armarx diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.cpp index 8af5b0c9ba513773b7666369080ba4a0dced4a93..8fbd9c5ba1abdb5e2d2175b1ff545579034c7376 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.cpp +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.cpp @@ -2,27 +2,19 @@ namespace armarx { - AronTreeWidgetModal::AronTreeWidgetModal(const std::string& label, - AronTreeWidgetItem* item, - QTreeWidget* parent) : + AronTreeWidgetModal::AronTreeWidgetModal(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) : QDialog(parent), - init(false, - false, - item->text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME), - item->aronType), item(item), label(label), parent(parent) { - init.setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME, - item->text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME)); - init.setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, - item->text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE)); - init.setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE, - item->text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE)); + init.aronType = item->aronType; + init.setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME, item->text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME)); + init.setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, item->text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE)); + init.setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE, item->text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE)); for (int i = 0; i < item->childCount(); ++i) { init.addChild(item->child(i)->clone()); } } -} // namespace armarx +} diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.h index 03c01a9843da2c6a55bf0710dbddb31b16887624..cda9f7e728df6da713fb1e09001bc37e8502b9e6 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.h +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/AronTreeWidgetModal.h @@ -1,39 +1,34 @@ #pragma once #include <stack> - -#include <QDialog> -#include <QTreeWidget> - #include <ArmarXCore/core/system/ImportExportComponent.h> -#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h> -#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h> - #include "../AronTreeWidgetItem.h" #include "../Data.h" +#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h> +#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h> + +#include <QDialog> +#include <QTreeWidget> + namespace armarx { - class AronTreeWidgetModal : public QDialog + class AronTreeWidgetModal : + public QDialog { Q_OBJECT public: - AronTreeWidgetModal(const std::string& label, - AronTreeWidgetItem* item, - QTreeWidget* parent); + AronTreeWidgetModal(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent); protected slots: - virtual void - reset() + virtual void reset() { - item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME, - init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME)); - item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, - init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE)); - item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE, - init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE)); + item->aronType = init.aronType; + item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME, init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME)); + item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE)); + item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE, init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_TYPE)); for (int i = 0; i < item->childCount(); ++i) { item->removeChild(item->child(i)); @@ -43,13 +38,13 @@ namespace armarx item->addChild(init.child(i)->clone()); } } - virtual void - submit() + virtual void submit() { accept(); } protected: + AronTreeWidgetItem init; AronTreeWidgetItem* item; @@ -59,4 +54,4 @@ namespace armarx }; using AronTreeWidgetModalControllerPtr = std::shared_ptr<AronTreeWidgetModal>; -} // namespace armarx +} diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModal.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModal.ui new file mode 100644 index 0000000000000000000000000000000000000000..69f4a5c99b277ba4808ecc45081df86e0ab55ef0 --- /dev/null +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModal.ui @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>AronTreeWidgetBoolInputModalWidget</class> + <widget class="QWidget" name="AronTreeWidgetBoolInputModalWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>1015</width> + <height>498</height> + </rect> + </property> + <property name="windowTitle"> + <string>SkillManagerMonitorWidget</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QSplitter" name="splitter"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <widget class="QGroupBox" name="groupBoxInput"> + <property name="title"> + <string>InputField</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="1" column="0"> + <widget class="QPushButton" name="pushButtonReset"> + <property name="text"> + <string>Reset</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QPushButton" name="pushButtonSubmit"> + <property name="text"> + <string>Submit</string> + </property> + </widget> + </item> + <item row="0" column="0" colspan="2"> + <widget class="QTextEdit" name="textEditInput"/> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7bc282597909fef3dcd538724cb2bf52f05893d2 --- /dev/null +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.cpp @@ -0,0 +1,27 @@ +#include "AronTreeWidgetBoolInputModalController.h" + +namespace armarx +{ + AronTreeWidgetBoolInputModalController::AronTreeWidgetBoolInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) : + AronTreeWidgetModal(label, item, parent) + { + widget.setupUi(this); + + // TODO + } + + void AronTreeWidgetBoolInputModalController::submit() + { + item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, widget.textEditInput->toPlainText()); + + AronTreeWidgetModal::submit(); + } + + void AronTreeWidgetBoolInputModalController::reset() + { + AronTreeWidgetModal::reset(); + + // reset to initial value + widget.textEditInput->setPlainText(init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE)); + } +} diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.h new file mode 100644 index 0000000000000000000000000000000000000000..1a1c60a07665fae06869962bc9a66c84da4cef12 --- /dev/null +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/AronTreeWidgetBoolInputModalController.h @@ -0,0 +1,27 @@ +#pragma once + +#include "../AronTreeWidgetModal.h" + +#include <RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/bool/ui_AronTreeWidgetBoolInputModal.h> + +#include <QDialog> + +namespace armarx +{ + class AronTreeWidgetBoolInputModalController : + public AronTreeWidgetModal + { + + public: + + AronTreeWidgetBoolInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent); + + private slots: + + void submit() final; + void reset() final; + + private: + Ui::AronTreeWidgetBoolInputModalWidget widget; + }; +} diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModal.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModal.ui new file mode 100644 index 0000000000000000000000000000000000000000..b9b800ed26a2b2170b8ab06633e8e795b1957be4 --- /dev/null +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModal.ui @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>AronTreeWidgetDictInputModalWidget</class> + <widget class="QWidget" name="AronTreeWidgetDictInputModalWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>1015</width> + <height>498</height> + </rect> + </property> + <property name="windowTitle"> + <string>SkillManagerMonitorWidget</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QSplitter" name="splitter"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <widget class="QGroupBox" name="groupBoxInput"> + <property name="title"> + <string>InputField</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0" colspan="5"> + <widget class="QTreeWidget" name="treeWidgetDict"> + <column> + <property name="text"> + <string>Key</string> + </property> + </column> + <column> + <property name="text"> + <string>Value</string> + </property> + </column> + <column> + <property name="text"> + <string>Type</string> + </property> + </column> + </widget> + </item> + <item row="1" column="3" colspan="2"> + <widget class="QPushButton" name="pushButtonAddElement"> + <property name="text"> + <string>+ Add element</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="3"> + <widget class="QLineEdit" name="lineEditKey"> + <property name="maximumSize"> + <size> + <width>880</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string>Enter Key</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QPushButton" name="pushButtonReset"> + <property name="text"> + <string>Reset</string> + </property> + </widget> + </item> + <item row="2" column="1" colspan="4"> + <widget class="QPushButton" name="pushButtonSubmit"> + <property name="text"> + <string>Submit</string> + </property> + </widget> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0e96cb6245384234e01f6d312866495f619e51f8 --- /dev/null +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.cpp @@ -0,0 +1,76 @@ +#include "AronTreeWidgetDictInputModalController.h" + +#include <RobotAPI/libraries/aron/core/type/variant/All.h> + +#include "../../visitors/AronTreeWidgetCreator.h" + +namespace armarx +{ + AronTreeWidgetDictInputModalController::AronTreeWidgetDictInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) : + AronTreeWidgetModal(label, item, parent) + { + widget.setupUi(this); + + // set header + widget.groupBoxInput->setTitle(QString::fromStdString(label)); + reset(); + + // connect signals + connect(widget.pushButtonAddElement, &QPushButton::clicked, + this, &AronTreeWidgetDictInputModalController::addEmptyElement); + + connect(widget.pushButtonReset, &QPushButton::clicked, + this, &AronTreeWidgetDictInputModalController::reset); + connect(widget.pushButtonSubmit, &QPushButton::clicked, + this, &AronTreeWidgetDictInputModalController::submit); + + } + + void AronTreeWidgetDictInputModalController::submit() + { + for (const auto& added : addedItems) + { + item->addChild(added->copy()); + } + + AronTreeWidgetModal::submit(); + } + + void AronTreeWidgetDictInputModalController::reset() + { + AronTreeWidgetModal::reset(); + + // reset to initial value + widget.treeWidgetDict->clear(); + for (int i = 0; i < init.childCount(); ++i) + { + auto el = init.child(i); + widget.treeWidgetDict->addTopLevelItem(el->clone()); + } + } + + void AronTreeWidgetDictInputModalController::addEmptyElement() + { + QString s = widget.lineEditKey->text(); + widget.lineEditKey->setText("Enter Key"); + + if (widget.treeWidgetDict->findItems(s, Qt::MatchFlag::MatchExactly, 0).empty()) + { + auto t = item->aronType; + auto d = aron::type::Dict::DynamicCastAndCheck(t); + auto ac = d->getAcceptedType(); + + AronTreeWidgetCreatorVisitor v(nullptr); + v.setTopLevelWidget(widget.treeWidgetDict); + aron::type::visit(v, ac); + + if (v.createdQWidgetItem) + { + v.createdQWidgetItem->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_NAME, + s); + addedItems.push_back(v.createdQWidgetItem); + widget.treeWidgetDict->addTopLevelItem(v.createdQWidgetItem); + } + } + } +} diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.h new file mode 100644 index 0000000000000000000000000000000000000000..f5d94a04b46994220fb0ff9c81e1fff50a9c3091 --- /dev/null +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/AronTreeWidgetDictInputModalController.h @@ -0,0 +1,36 @@ +#pragma once + +#include <stack> +#include <ArmarXCore/core/system/ImportExportComponent.h> + +#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h> +#include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h> +#include <ArmarXGui/libraries/SimpleConfigDialog/SimpleConfigDialog.h> + +#include "../AronTreeWidgetModal.h" + +#include <RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/dict/ui_AronTreeWidgetDictInputModal.h> + +#include <QDialog> + +namespace armarx +{ + class AronTreeWidgetDictInputModalController : + public AronTreeWidgetModal + { + public: + + AronTreeWidgetDictInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent); + + private slots: + + void submit() final; + void reset() final; + + void addEmptyElement(); + + private: + std::vector<AronTreeWidgetItem*> addedItems; + Ui::AronTreeWidgetDictInputModalWidget widget; + }; +} diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModal.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModal.ui new file mode 100644 index 0000000000000000000000000000000000000000..ba3734066df16e227142f6636d7cb6e39c415646 --- /dev/null +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModal.ui @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>AronTreeWidgetFloatInputModalWidget</class> + <widget class="QWidget" name="AronTreeWidgetFloatInputModalWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>1015</width> + <height>498</height> + </rect> + </property> + <property name="windowTitle"> + <string>SkillManagerMonitorWidget</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QSplitter" name="splitter"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <widget class="QGroupBox" name="groupBoxInput"> + <property name="title"> + <string>InputField</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="1" column="0"> + <widget class="QPushButton" name="pushButtonReset"> + <property name="text"> + <string>Reset</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QPushButton" name="pushButtonSubmit"> + <property name="text"> + <string>Submit</string> + </property> + </widget> + </item> + <item row="0" column="0" colspan="2"> + <widget class="QTextEdit" name="textEditInput"/> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ae9cbe6aac34390785cdc410508681ff0b79a9f6 --- /dev/null +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.cpp @@ -0,0 +1,27 @@ +#include "AronTreeWidgetFloatInputModalController.h" + +namespace armarx +{ + AronTreeWidgetFloatInputModalController::AronTreeWidgetFloatInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) : + AronTreeWidgetModal(label, item, parent) + { + widget.setupUi(this); + + // TODO + } + + void AronTreeWidgetFloatInputModalController::submit() + { + item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, widget.textEditInput->toPlainText()); + + AronTreeWidgetModal::submit(); + } + + void AronTreeWidgetFloatInputModalController::reset() + { + AronTreeWidgetModal::reset(); + + // reset to initial value + widget.textEditInput->setPlainText(init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE)); + } +} diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.h new file mode 100644 index 0000000000000000000000000000000000000000..debd50e9f04eae0d35c161d9124e7876d3eacc6c --- /dev/null +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/AronTreeWidgetFloatInputModalController.h @@ -0,0 +1,27 @@ +#pragma once + +#include "../AronTreeWidgetModal.h" + +#include <RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/float_double/ui_AronTreeWidgetFloatInputModal.h> + +#include <QDialog> + +namespace armarx +{ + class AronTreeWidgetFloatInputModalController : + public AronTreeWidgetModal + { + + public: + + AronTreeWidgetFloatInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent); + + private slots: + + void submit() final; + void reset() final; + + private: + Ui::AronTreeWidgetFloatInputModalWidget widget; + }; +} diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModal.ui b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModal.ui new file mode 100644 index 0000000000000000000000000000000000000000..538a78e766e997ad9811ff11b6036f088de332e2 --- /dev/null +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModal.ui @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>AronTreeWidgetIntInputModalWidget</class> + <widget class="QWidget" name="AronTreeWidgetIntInputModalWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>1015</width> + <height>498</height> + </rect> + </property> + <property name="windowTitle"> + <string>SkillManagerMonitorWidget</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QSplitter" name="splitter"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <widget class="QGroupBox" name="groupBoxInput"> + <property name="title"> + <string>InputField</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="1" column="0"> + <widget class="QPushButton" name="pushButtonReset"> + <property name="text"> + <string>Reset</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QPushButton" name="pushButtonSubmit"> + <property name="text"> + <string>Submit</string> + </property> + </widget> + </item> + <item row="0" column="0" colspan="2"> + <widget class="QTextEdit" name="textEditInput"/> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dd9b19e06494c8720f7cc2e172b0caecad3fc7d2 --- /dev/null +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.cpp @@ -0,0 +1,27 @@ +#include "AronTreeWidgetIntInputModalController.h" + +namespace armarx +{ + AronTreeWidgetIntInputModalController::AronTreeWidgetIntInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) : + AronTreeWidgetModal(label, item, parent) + { + widget.setupUi(this); + + // TODO + } + + void AronTreeWidgetIntInputModalController::submit() + { + item->setText(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE, widget.textEditInput->toPlainText()); + + AronTreeWidgetModal::submit(); + } + + void AronTreeWidgetIntInputModalController::reset() + { + AronTreeWidgetModal::reset(); + + // reset to initial value + widget.textEditInput->setPlainText(init.text(aron_tree_widget::constantes::TREE_WIDGET_ITEM_VALUE)); + } +} diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.h b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.h new file mode 100644 index 0000000000000000000000000000000000000000..1de43a0870b2af8ff4edbc974c13f826d31e67ef --- /dev/null +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/AronTreeWidgetIntInputModalController.h @@ -0,0 +1,27 @@ +#pragma once + +#include "../AronTreeWidgetModal.h" + +#include <RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/modal/int_long/ui_AronTreeWidgetIntInputModal.h> + +#include <QDialog> + +namespace armarx +{ + class AronTreeWidgetIntInputModalController : + public AronTreeWidgetModal + { + + public: + + AronTreeWidgetIntInputModalController(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent); + + private slots: + + void submit() final; + void reset() final; + + private: + Ui::AronTreeWidgetIntInputModalWidget widget; + }; +} diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetContextMenu.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetContextMenu.cpp index 76c38e9a27d686d40e7dce7d29380074957f5dde..3f484b85d92717f332aa7d72f8890bebbce443c6 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetContextMenu.cpp +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetContextMenu.cpp @@ -85,12 +85,6 @@ namespace armarx currFont.setItalic(true); castedContainer->setFont(1, currFont); } - // if it's a dict, we might have resolved key conflicts this way. - else if (castedContainer && - castedContainer->aronType->getDescriptor() == aron::type::Descriptor::DICT) - { - castedContainer->checkKeyValidityOfChildren(); - } } diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.cpp index 10fa387251f71fefbacfd95b39d1510ce7163db7..5a5d52c03c9fd37027c55b22a46e4904bad918a1 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.cpp +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetConverter.cpp @@ -35,8 +35,7 @@ // qt #include <QTreeWidgetItem> -#include "../EditMatrixWidget.h" -#include "../QuaternionWidget.h" +#include <RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/EditMatrixWidget.h> namespace armarx @@ -86,16 +85,7 @@ namespace armarx if (v.createdAron && !v.errorOccured) { - // TODO find more elegant solution that does not crash aron code - auto key = it->text(0).toStdString(); - if (createdAronDict->hasElement(key)) - { - errorOccured = true; - } - else - { - createdAronDict->addElement(key, v.createdAron); - } + createdAronDict->addElement(it->text(0).toStdString(), v.createdAron); } else { @@ -152,7 +142,6 @@ namespace armarx void AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::TuplePtr& i) { - // CAUTION; UNTESTED auto createdAronTuple = std::make_shared<aron::data::List>(i->getPath()); createdAron = createdAronTuple; auto* currElem = parentItem->child(index); @@ -232,26 +221,7 @@ namespace armarx void AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::QuaternionPtr& i) { - auto createdQuat = std::make_shared<aron::data::NDArray>(i->getPath()); - createdAron = createdQuat; - int dataSize = i->getElementType() == aron::type::quaternion::ElementType::FLOAT32 ? 4 : 8; - createdQuat->setShape({1, 4, dataSize}); - createdQuat->setType(i->getFullName()); - auto* currTreeElem = parentItem->child(index); - auto* itemWidget = currTreeElem->treeWidget()->itemWidget(currTreeElem, 1); - auto* quatWidget = QuaternionWidget::DynamicCastAndCheck(itemWidget); - if (quatWidget->hasParseErrors()) - { - errorOccured = true; - return; - } - auto serialized = quatWidget->parseAllToNDArray(); - if ((int)serialized.size() != dataSize * 4) - { - ARMARX_ERROR - << "serialized quaternions did not return byte sequence of correct length!"; - } - createdQuat->setData(serialized.size(), serialized.data()); + // TODO } void diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.cpp index e7dde099a79a7bab378e82b71270e8ec090dcee2..de92a507c4a030c1f4c26ff784aee2f2c78edfc9 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.cpp +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetCreator.cpp @@ -23,7 +23,6 @@ #include <string> #include "../EditMatrixWidget.h" -#include "../QuaternionWidget.h" // base class #include "AronTreeWidgetCreator.h" @@ -31,7 +30,6 @@ // data #include "../AronTreeWidgetItem.h" #include "../Data.h" -#include "AronTreeWidgetContextMenu.h" namespace armarx { @@ -95,8 +93,9 @@ namespace armarx key = std::to_string(parentOfCreatedObj->childCount()); } - createdQWidgetItem = - new AronTreeWidgetItem(isDictChild, editableValue, QString::fromStdString(key), i); + createdQWidgetItem = new AronTreeWidgetItem(isDictChild, editableValue); + createdQWidgetItem->aronType = i; + createdQWidgetItem->setText(0, QString::fromStdString(key)); createdQWidgetItem->setText(1, QString::fromStdString(defaul)); createdQWidgetItem->setText(2, QString::fromStdString(i->getShortName())); createdQWidgetItem->setText( @@ -123,8 +122,9 @@ namespace armarx key = i->getPath().getLastElement(); } - createdQWidgetItem = - new AronTreeWidgetItem(editableValue, false, QString::fromStdString(key), i); + createdQWidgetItem = new AronTreeWidgetItem(editableValue, false); + createdQWidgetItem->setText(0, QString::fromStdString(key)); + createdQWidgetItem->aronType = i; parentOfCreatedObj->addChild(createdQWidgetItem); for (const auto& [key, value] : i->getMemberTypes()) @@ -166,7 +166,6 @@ namespace armarx void AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::TuplePtr& tuple) { - // CAUTION; UNTESTED // create default, uneditable tree widget item. insertNewTreeViewWidget(tuple, ""); // attach all children @@ -185,9 +184,6 @@ namespace armarx AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::ListPtr& i) { insertNewTreeViewWidget(i, ""); - // TODO: Move to external helper class - auto txt = AronTreeWidgetContextMenuVisitor::generateNumElementsText(0); - createdQWidgetItem->setText(1, txt); } void AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::NDArrayPtr& i) @@ -201,6 +197,7 @@ namespace armarx editableValue = true; insertNewTreeViewWidget(i, ""); // TODO add size and type info to 2nd column manually here + // TODO: make hello world execution work! // Widget fiddling source: https://blog.manash.io/quick-qt-6-how-to-add-qpushbutton-or-widgets-to-a-qtreewidget-as-qtreewidgetitem-2ae9f54c0e5f // overlay custom widget in column 1 @@ -212,11 +209,7 @@ namespace armarx void AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::QuaternionPtr& i) { - editableValue = true; insertNewTreeViewWidget(i, ""); - auto* toplevelWidget = createdQWidgetItem->treeWidget(); - QuaternionWidget* quatWidget = new QuaternionWidget(i->getElementType()); - toplevelWidget->setItemWidget(createdQWidgetItem, 1, quatWidget); } void AronTreeWidgetCreatorVisitor::visitAronVariant(const aron::type::ImagePtr& i) diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp index edb553e2d840dc0651c191c5d13159c9605d50ce..50a5753b7c5fb2f069885e6c0c242bc055c7fa23 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetModalCreator.cpp @@ -20,14 +20,15 @@ * GNU General Public License */ -#include "AronTreeWidgetModalCreator.h" - #include <string> +#include "AronTreeWidgetModalCreator.h" + #include <SimoxUtility/algorithm/string.h> // modals #include "../modal/text/AronTreeWidgetTextInputModalController.h" +#include "../modal/dict/AronTreeWidgetDictInputModalController.h" // qt #include <QTreeWidget> @@ -38,6 +39,7 @@ namespace armarx void AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::ObjectPtr& i) { + // should not happen, right? } void @@ -103,14 +105,12 @@ namespace armarx void AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::StringPtr& i) { - createdModal = - std::make_shared<AronTreeWidgetTextInputModalController>(label, item, parent); + createdModal = std::make_shared<AronTreeWidgetTextInputModalController>(label, item, parent); } - void - AronTreeWidgetModalCreatorVisitor::visitUnknown(Input&) + void AronTreeWidgetModalCreatorVisitor::visitUnknown(Input&) { - ARMARX_WARNING_S << "Received an unknown type when trying to create a tree view widget " - "modal for a skill argument type."; + ARMARX_WARNING_S << "Received an unknown type when trying to create a tree view widget modal for a skill argument type."; } -} // namespace armarx +} + diff --git a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetSetter.cpp b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetSetter.cpp index 6c03126d63948bd1f89446dc6fabea89755d25e5..63b29b930c468a1c47e0afe1099616ad9686bc51 100644 --- a/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetSetter.cpp +++ b/source/RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/visitors/AronTreeWidgetSetter.cpp @@ -24,25 +24,11 @@ #include <string> -#include "../EditMatrixWidget.h" -#include "../QuaternionWidget.h" +#include <RobotAPI/gui-plugins/SkillManagerPlugin/aronTreeWidget/EditMatrixWidget.h> + #include "AronTreeWidgetContextMenu.h" #include "AronTreeWidgetCreator.h" - -template <typename T> -std::string -usString(T number, size_t precision = 3) -{ - std::stringstream ss; - const char* locale = "C"; - ss.imbue(std::locale(locale)); - - ss << std::fixed << std::setprecision(precision) << number; - return ss.str(); -} - - //visitors namespace armarx { @@ -139,7 +125,7 @@ namespace armarx AronTreeWidgetSetterVisitor v(el, x); aron::data::visit(v, value); auto* currChild = el->child(x); - std::string listNum = usString(x); + std::string listNum = std::to_string(x); currChild->setText(0, listNum.c_str()); ++x; @@ -163,15 +149,11 @@ namespace armarx auto* castedEl = AronTreeWidgetItem::DynamicCast(parentItem->child(index)); ARMARX_CHECK(castedEl); auto matrixCast = aron::type::Matrix::DynamicCast(castedEl->aronType); - auto quaternionCast = aron::type::Quaternion::DynamicCast(castedEl->aronType); auto* rootWidget = castedEl->treeWidget(); ARMARX_CHECK(rootWidget); - EditMatrixWidget* matrixWidget = + EditMatrixWidget* widget = EditMatrixWidget::DynamicCast(rootWidget->itemWidget(castedEl, 1)); - QuaternionWidget* quaternionWidget = - QuaternionWidget::DynamicCast(rootWidget->itemWidget(castedEl, 1)); - - if (matrixCast && matrixWidget) + if (matrixCast && widget) { auto elemType = matrixCast->getElementType(); auto* rawData = arr->getData(); @@ -183,34 +165,29 @@ namespace armarx case aron::type::matrix::ElementType::FLOAT32: { static_assert(sizeof(float) == 4); - float* interpreted = reinterpret_cast<float*>(rawData); - float laundered = std::launder(interpreted)[elementNr]; - return usString<float>(laundered); + float interpreted = reinterpret_cast<float*>(rawData)[elementNr]; + return std::to_string(interpreted); } case aron::type::matrix::ElementType::FLOAT64: { static_assert(sizeof(double) == 8); - double* interpreted = reinterpret_cast<double*>(rawData); - float laundered = std::launder(interpreted)[elementNr]; - return usString<double>(laundered); + double interpreted = reinterpret_cast<double*>(rawData)[elementNr]; + return std::to_string(interpreted); } case aron::type::matrix::ElementType::INT16: { - int16_t* interpreted = reinterpret_cast<int16_t*>(rawData); - int16_t laudered = std::launder(interpreted)[elementNr]; - return usString<int16_t>(laudered); + int16_t interpreted = reinterpret_cast<int16_t*>(rawData)[elementNr]; + return std::to_string(interpreted); } case aron::type::matrix::ElementType::INT32: { - int32_t* interpreted = reinterpret_cast<int32_t*>(rawData); - int32_t laudered = std::launder(interpreted)[elementNr]; - return usString<int32_t>(laudered); + int32_t interpreted = reinterpret_cast<int32_t*>(rawData)[elementNr]; + return std::to_string(interpreted); } case aron::type::matrix::ElementType::INT64: { - int64_t* interpreted = reinterpret_cast<int64_t*>(rawData); - int64_t laudered = std::launder(interpreted)[elementNr]; - return usString<int64_t>(laudered); + int64_t interpreted = reinterpret_cast<int64_t*>(rawData)[elementNr]; + return std::to_string(interpreted); } } return "Error!"; @@ -221,48 +198,12 @@ namespace armarx { for (size_t col = 0; (int)col < matrixCast->getCols(); ++col) { - matrixWidget->setText(row, col, toString(col * matrixCast->getRows() + row)); + widget->setText(row, col, toString(col * matrixCast->getRows() + row)); } } } - else if (quaternionCast && quaternionWidget) - { - auto elemType = quaternionCast->getElementType(); - auto rawData = arr->getData(); - auto shape = arr->getShape(); - // string can convert any item - auto toString = [elemType, rawData](size_t elementNr) -> std::string - { - switch (elemType) - { - case aron::type::quaternion::ElementType::FLOAT32: - { - static_assert(sizeof(float) == 4); - float* interpreted = reinterpret_cast<float*>(rawData); - float laundered = std::launder(interpreted)[elementNr]; - return usString<float>(laundered); - } - case aron::type::quaternion::ElementType::FLOAT64: - { - static_assert(sizeof(double) == 8); - double* interpreted = reinterpret_cast<double*>(rawData); - //TODO: Note to future Tobi: Fix pls. Does not find correct number. May also be export error from component! - // also: skill execution crashes. See into Skill provider - float laundered = std::launder(interpreted)[elementNr]; - return usString<double>(laundered); - } - } - return "Error!"; - }; - for (size_t i = 0; i < 4; ++i) - { - quaternionWidget->setText((QuaternionWidget::QuaternionComponents)i, toString(i)); - } - } else { - ARMARX_ERROR - << "we do not support raw NDArrays. Ask Fabian Peller for more information."; } } @@ -272,7 +213,7 @@ namespace armarx if (checkTreeWidgetItemForSimilarName(i->getPath().getLastElement())) { QTreeWidgetItem* el = parentItem->child(index); - el->setText(1, QString::fromStdString(usString<int>(i->getValue()))); + el->setText(1, QString::fromStdString(std::to_string(i->getValue()))); } } @@ -282,7 +223,7 @@ namespace armarx if (checkTreeWidgetItemForSimilarName(i->getPath().getLastElement())) { QTreeWidgetItem* el = parentItem->child(index); - el->setText(1, QString::fromStdString(usString<long>(i->getValue()))); + el->setText(1, QString::fromStdString(std::to_string(i->getValue()))); } } @@ -292,7 +233,7 @@ namespace armarx if (checkTreeWidgetItemForSimilarName(i->getPath().getLastElement())) { QTreeWidgetItem* el = parentItem->child(index); - el->setText(1, QString::fromStdString(usString<float>(i->getValue()))); + el->setText(1, QString::fromStdString(std::to_string(i->getValue()))); } } @@ -302,7 +243,7 @@ namespace armarx if (checkTreeWidgetItemForSimilarName(i->getPath().getLastElement())) { QTreeWidgetItem* el = parentItem->child(index); - el->setText(1, QString::fromStdString(usString<double>(i->getValue()))); + el->setText(1, QString::fromStdString(std::to_string(i->getValue()))); } } @@ -312,7 +253,7 @@ namespace armarx if (checkTreeWidgetItemForSimilarName(i->getPath().getLastElement())) { QTreeWidgetItem* el = parentItem->child(index); - el->setText(1, QString::fromStdString(usString<bool>(i->getValue()))); + el->setText(1, QString::fromStdString(std::to_string(i->getValue()))); } }