Skip to content
Snippets Groups Projects
Commit 3441aed5 authored by Fabian Tërnava's avatar Fabian Tërnava
Browse files

fix runtime error in add_element context menu

parent af50e33b
Branches feature/skills-manager-edit-arguments
No related tags found
No related merge requests found
......@@ -143,21 +143,12 @@ ArmarX.ArMemExampleMemory.tpc.pub.MemoryListener = MemoryUpdates
# ArmarX.ExampleMemory.mem.MemoryName = Example
# ArmarX.ExampleMemory.mem.ltm..buffer.storeFreq: Frequency to store the buffer to the LTM in Hz.
# ArmarX.ExampleMemory.mem.ltm.configuration:
# Attributes:
# - Default: 10
# - Default: {}
# - Case sensitivity: yes
# - Required: no
# ArmarX.ExampleMemory.mem.ltm..buffer.storeFreq = 10
# ArmarX.ExampleMemory.mem.ltm.depthImageExtractor.Enabled:
# Attributes:
# - Default: true
# - Case sensitivity: yes
# - Required: no
# - Possible values: {0, 1, false, no, true, yes}
# ArmarX.ExampleMemory.mem.ltm.depthImageExtractor.Enabled = true
# ArmarX.ExampleMemory.mem.ltm.configuration = {}
# ArmarX.ExampleMemory.mem.ltm.enabled:
......@@ -169,100 +160,6 @@ ArmarX.ArMemExampleMemory.tpc.pub.MemoryListener = MemoryUpdates
# ArmarX.ExampleMemory.mem.ltm.enabled = false
# ArmarX.ExampleMemory.mem.ltm.exrConverter.Enabled:
# Attributes:
# - Default: true
# - Case sensitivity: yes
# - Required: no
# - Possible values: {0, 1, false, no, true, yes}
# ArmarX.ExampleMemory.mem.ltm.exrConverter.Enabled = true
# ArmarX.ExampleMemory.mem.ltm.imageExtractor.Enabled:
# Attributes:
# - Default: true
# - Case sensitivity: yes
# - Required: no
# - Possible values: {0, 1, false, no, true, yes}
# ArmarX.ExampleMemory.mem.ltm.imageExtractor.Enabled = true
# ArmarX.ExampleMemory.mem.ltm.memFreqFilter.Enabled:
# Attributes:
# - Default: false
# - Case sensitivity: yes
# - Required: no
# - Possible values: {0, 1, false, no, true, yes}
# ArmarX.ExampleMemory.mem.ltm.memFreqFilter.Enabled = false
# ArmarX.ExampleMemory.mem.ltm.memFreqFilter.WaitingTime: Waiting time in MS after each LTM update.
# Attributes:
# - Default: -1
# - Case sensitivity: yes
# - Required: no
# ArmarX.ExampleMemory.mem.ltm.memFreqFilter.WaitingTime = -1
# ArmarX.ExampleMemory.mem.ltm.pngConverter.Enabled:
# Attributes:
# - Default: true
# - Case sensitivity: yes
# - Required: no
# - Possible values: {0, 1, false, no, true, yes}
# ArmarX.ExampleMemory.mem.ltm.pngConverter.Enabled = true
# ArmarX.ExampleMemory.mem.ltm.sizeToCompressDataInMegaBytes: The size in MB to compress away the current export. Exports are numbered (lower number means newer).
# Attributes:
# - Default: 1024
# - Case sensitivity: yes
# - Required: no
# ArmarX.ExampleMemory.mem.ltm.sizeToCompressDataInMegaBytes = 1024
# ArmarX.ExampleMemory.mem.ltm.snapEqFilter.Enabled:
# Attributes:
# - Default: false
# - Case sensitivity: yes
# - Required: no
# - Possible values: {0, 1, false, no, true, yes}
# ArmarX.ExampleMemory.mem.ltm.snapEqFilter.Enabled = false
# ArmarX.ExampleMemory.mem.ltm.snapEqFilter.MaxWaitingTime: Max Waiting time in MS after each Entity update.
# Attributes:
# - Default: -1
# - Case sensitivity: yes
# - Required: no
# ArmarX.ExampleMemory.mem.ltm.snapEqFilter.MaxWaitingTime = -1
# ArmarX.ExampleMemory.mem.ltm.snapFreqFilter.Enabled:
# Attributes:
# - Default: false
# - Case sensitivity: yes
# - Required: no
# - Possible values: {0, 1, false, no, true, yes}
# ArmarX.ExampleMemory.mem.ltm.snapFreqFilter.Enabled = false
# ArmarX.ExampleMemory.mem.ltm.snapFreqFilter.WaitingTime: Waiting time in MS after each Entity update.
# Attributes:
# - Default: -1
# - Case sensitivity: yes
# - Required: no
# ArmarX.ExampleMemory.mem.ltm.snapFreqFilter.WaitingTime = -1
# ArmarX.ExampleMemory.mem.ltm.storagepath: The path to the memory storage (the memory will be stored in a seperate subfolder).
# Attributes:
# - Default: Default value not mapped.
# - Case sensitivity: yes
# - Required: no
# ArmarX.ExampleMemory.mem.ltm.storagepath = Default value not mapped.
# ArmarX.ExampleMemory.mns.MemoryNameSystemEnabled: Whether to use (and depend on) the Memory Name System (MNS).
# Set to false to use this memory as a stand-alone.
# Attributes:
......
......@@ -79,6 +79,8 @@ namespace armarx
void
AronTreeWidgetController::ShowContextMenu(const QPoint& pos)
{
tree->blockSignals(true);
auto idx = tree->indexAt(pos);
AronTreeWidgetItem* clickedItem = AronTreeWidgetItem::DynamicCast(tree->itemAt(pos));
if (clickedItem)
......@@ -88,6 +90,8 @@ namespace armarx
aron::type::visit(visitor, clickedItem->aronType);
visitor.showMenuAndExecute();
}
tree->blockSignals(false);
}
void
AronTreeWidgetController::onTreeWidgetItemDoubleClicked(QTreeWidgetItem* item, int column)
......@@ -96,6 +100,8 @@ namespace armarx
{
return;
}
tree->blockSignals(true);
auto* aronItem = AronTreeWidgetItem::DynamicCast(item);
if (column == 1 && aronItem)
{
......@@ -122,6 +128,8 @@ namespace armarx
{
item->treeWidget()->editItem(item, column);
}
tree->blockSignals(false);
}
void
......@@ -135,15 +143,19 @@ namespace armarx
aronElem->onUserChange(column);
}
// start conversion for entire tree -- this also sets the highlighting
ARMARX_CHECK(parent->childCount() == 1);
auto* aronTreeRoot = AronTreeWidgetItem::DynamicCast(parent->child(0));
aronTreeRoot->resetError();
if (aronTreeRoot)
if (parent->childCount() == 1)
{
AronTreeWidgetConverterVisitor v(parent, 0);
aron::type::visit(v, type);
aronTreeRoot->setValueErrorState(v.hasDirectError(), v.onlyChildFailedConversion());
auto* aronTreeRoot = AronTreeWidgetItem::DynamicCast(parent->child(0));
aronTreeRoot->resetError();
if (aronTreeRoot)
{
AronTreeWidgetConverterVisitor v(parent, 0);
aron::type::visit(v, type);
aronTreeRoot->setValueErrorState(v.hasDirectError(), v.onlyChildFailedConversion());
}
}
// else perhaps the GUI was stopped or died.
tree->blockSignals(false);
}
......
......@@ -64,6 +64,7 @@ namespace armarx
AronTreeWidgetConverterVisitor::handleErrors(AronTreeWidgetConverterVisitor childV,
bool ownFault)
{
ARMARX_TRACE;
isDirectError |= ownFault;
hasTransitiveError |= childV.isDirectError || childV.hasTransitiveError;
......@@ -75,6 +76,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::handleErrors(bool ownFault)
{
ARMARX_TRACE;
isDirectError = ownFault;
auto* aronItem = AronTreeWidgetItem::DynamicCast(parentItem->child(index));
ARMARX_CHECK(aronItem);
......@@ -85,6 +87,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::ObjectPtr& i)
{
ARMARX_TRACE;
auto createdAronDict = std::make_shared<aron::data::Dict>(i->getPath());
createdAron = createdAronDict;
QTreeWidgetItem* el = parentItem->child(index);
......@@ -92,6 +95,7 @@ namespace armarx
unsigned int x = 0;
for (const auto& [key, value] : i->getMemberTypes())
{
ARMARX_TRACE;
AronTreeWidgetConverterVisitor v(el, x++);
aron::type::visit(v, value);
......@@ -106,6 +110,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::DictPtr& i)
{
ARMARX_TRACE;
auto createdAronDict = std::make_shared<aron::data::Dict>(i->getPath());
createdAron = createdAronDict;
QTreeWidgetItem* el = parentItem->child(index);
......@@ -128,6 +133,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::ListPtr& i)
{
ARMARX_TRACE;
auto createdAronList = std::make_shared<aron::data::List>(i->getPath());
createdAron = createdAronList;
auto* elem = parentItem->child(index);
......@@ -150,6 +156,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::PairPtr& i)
{
ARMARX_TRACE;
auto createdAronPair = std::make_shared<aron::data::List>(i->getPath());
createdAron = createdAronPair;
auto* elem = parentItem->child(index);
......@@ -168,7 +175,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::TuplePtr& i)
{
ARMARX_TRACE;
auto createdAronList = std::make_shared<aron::data::List>(i->getPath());
createdAron = createdAronList;
QTreeWidgetItem* el = parentItem->child(index);
......@@ -190,12 +197,14 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::NDArrayPtr& i)
{
ARMARX_TRACE;
ARMARX_ERROR << "Currently do not support supplying raw NDArrays!";
}
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::MatrixPtr& i)
{
ARMARX_TRACE;
auto createdMatrix = std::make_shared<aron::data::NDArray>(i->getPath());
int dataSize = 0;
switch (i->getElementType())
......@@ -248,6 +257,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::QuaternionPtr& i)
{
ARMARX_TRACE;
auto createdQuat = std::make_shared<aron::data::NDArray>(i->getPath());
createdAron = createdQuat;
int dataSize = i->getElementType() == aron::type::quaternion::ElementType::FLOAT32 ? 4 : 8;
......@@ -277,18 +287,21 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::ImagePtr& i)
{
ARMARX_TRACE;
// TODO
}
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::PointCloudPtr& i)
{
ARMARX_TRACE;
// TODO
}
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::IntEnumPtr& i)
{
ARMARX_TRACE;
QTreeWidgetItem* el = parentItem->child(index);
auto* genericWidget = el->treeWidget()->itemWidget(el, 1);
auto* intEnumWidget = IntEnumWidget::DynamicCastAndCheck(genericWidget);
......@@ -306,6 +319,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::IntPtr& i)
{
ARMARX_TRACE;
auto createdAronInt = std::make_shared<aron::data::Int>(i->getPath());
createdAron = createdAronInt;
QTreeWidgetItem* el = parentItem->child(index);
......@@ -334,6 +348,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::LongPtr& i)
{
ARMARX_TRACE;
auto createdAronLong = std::make_shared<aron::data::Long>(i->getPath());
createdAron = createdAronLong;
QTreeWidgetItem* el = parentItem->child(index);
......@@ -361,6 +376,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::FloatPtr& i)
{
ARMARX_TRACE;
auto createdAronFloat = std::make_shared<aron::data::Float>(i->getPath());
createdAron = createdAronFloat;
QTreeWidgetItem* el = parentItem->child(index);
......@@ -387,6 +403,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::DoublePtr& i)
{
ARMARX_TRACE;
auto createdAronDouble = std::make_shared<aron::data::Double>(i->getPath());
createdAron = createdAronDouble;
QTreeWidgetItem* el = parentItem->child(index);
......@@ -413,6 +430,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::BoolPtr& i)
{
ARMARX_TRACE;
auto createdAronBool = std::make_shared<aron::data::Bool>(i->getPath());
createdAron = createdAronBool;
QTreeWidgetItem* el = parentItem->child(index);
......@@ -439,6 +457,7 @@ namespace armarx
void
AronTreeWidgetConverterVisitor::visitAronVariant(const aron::type::StringPtr& i)
{
ARMARX_TRACE;
auto createdAronString = std::make_shared<aron::data::String>(i->getPath());
createdAron = createdAronString;
QTreeWidgetItem* el = parentItem->child(index);
......
......@@ -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>
......@@ -36,81 +37,15 @@
namespace armarx
{
void AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::ObjectPtr& i)
{
}
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::DictPtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::PairPtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::TuplePtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::ListPtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::NDArrayPtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::MatrixPtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::QuaternionPtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::ImagePtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::PointCloudPtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::IntEnumPtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::IntPtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::LongPtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::FloatPtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::DoublePtr& i)
{ }
void
AronTreeWidgetModalCreatorVisitor::visitAronVariant(const aron::type::BoolPtr& i)
{ }
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
}
......@@ -29,15 +29,17 @@
namespace armarx
{
// Convert aron type to tree widget
// Convert aron type to tree widget.
// (Widgets are only created for string types to enter longer texts.
// However, the visitor implementation allows modals for differnt types. Might be useful in the future..)
class AronTreeWidgetModalCreatorVisitor :
public armarx::aron::type::ConstVariantVisitor
{
public:
std::string label;
AronTreeWidgetItem* item;
QTreeWidget* parent;
AronTreeWidgetModalControllerPtr createdModal;
std::string label = "";
AronTreeWidgetItem* item = nullptr;
QTreeWidget* parent = nullptr;
AronTreeWidgetModalControllerPtr createdModal = nullptr;
AronTreeWidgetModalCreatorVisitor() = delete;
AronTreeWidgetModalCreatorVisitor(const std::string& label, AronTreeWidgetItem* item, QTreeWidget* parent) :
......@@ -46,22 +48,6 @@ namespace armarx
parent(parent)
{}
void visitAronVariant(const aron::type::ObjectPtr&) final;
void visitAronVariant(const aron::type::DictPtr& i) final;
void visitAronVariant(const aron::type::PairPtr& i) final;
void visitAronVariant(const aron::type::TuplePtr& i) final;
void visitAronVariant(const aron::type::ListPtr& i) final;
void visitAronVariant(const aron::type::NDArrayPtr& i) final;
void visitAronVariant(const aron::type::MatrixPtr& i) final;
void visitAronVariant(const aron::type::QuaternionPtr& i) final;
void visitAronVariant(const aron::type::ImagePtr& i) final;
void visitAronVariant(const aron::type::PointCloudPtr& i) final;
void visitAronVariant(const aron::type::IntEnumPtr& i) final;
void visitAronVariant(const aron::type::IntPtr& i) final;
void visitAronVariant(const aron::type::LongPtr& i) final;
void visitAronVariant(const aron::type::FloatPtr& i) final;
void visitAronVariant(const aron::type::DoublePtr& i) final;
void visitAronVariant(const aron::type::BoolPtr& i) final;
void visitAronVariant(const aron::type::StringPtr& i) final;
void visitUnknown(Input&) final;
};
......
......@@ -12,8 +12,8 @@
namespace armarx
{
EditMatrixWidget::EditMatrixWidget(size_t numRows,
size_t numCols,
EditMatrixWidget::EditMatrixWidget(long numRows,
long numCols,
aron::type::matrix::ElementType elemType,
QTreeWidgetItem* currentItem) :
CustomWidget(currentItem)
......@@ -28,10 +28,10 @@ namespace armarx
QGridLayout* innerGrid = new QGridLayout();
const size_t createRows = std::min(numRows, MAX_ROWS_DISPLAY);
const size_t createCols = std::min(numCols, MAX_COLS_DISPLAY);
const long createRows = std::min(numRows, MAX_ROWS_DISPLAY);
const long createCols = std::min(numCols, MAX_COLS_DISPLAY);
for (size_t i = 0; i < createRows * createCols; ++i)
for (long i = 0; i < createRows * createCols; ++i)
{
auto* edit = new QLineEdit();
dispElements.push_back(edit);
......@@ -68,7 +68,7 @@ namespace armarx
hiddenElems.push_back(std::vector<std::string>(hiddenCols * createRows, ""));
// add all rows that are hidden
for (size_t i = 0; i < numRows - createRows; ++i)
for (long i = 0; i < numRows - createRows; ++i)
{
// add full cols; everything is hidden here
hiddenElems.push_back(std::vector<std::string>(numCols, ""));
......@@ -101,7 +101,7 @@ namespace armarx
}
void
EditMatrixWidget::setText(size_t row, size_t col, const std::string& str)
EditMatrixWidget::setText(long row, long col, const std::string& str)
{
ARMARX_CHECK(row < realRows);
ARMARX_CHECK(col < realCols);
......@@ -114,7 +114,7 @@ namespace armarx
}
else if (row < dispRows)
{
size_t idx = row * (realCols - dispCols) + col - dispCols;
long idx = row * (realCols - dispCols) + col - dispCols;
hiddenElems.at(0).at(idx) = str;
}
else
......@@ -124,7 +124,7 @@ namespace armarx
}
std::string
EditMatrixWidget::getText(size_t row, size_t col)
EditMatrixWidget::getText(long row, long col)
{
ARMARX_CHECK(row < realRows);
ARMARX_CHECK(col < realCols);
......@@ -138,7 +138,7 @@ namespace armarx
else if (row < getDisplayedRows())
{
// the stuff besides the displayed rows
size_t idx = row * (realCols - dispCols) + col - dispCols;
long idx = row * (realCols - dispCols) + col - dispCols;
return hiddenElems.at(0).at(idx);
}
else
......@@ -153,9 +153,9 @@ namespace armarx
{
auto dispRows = getDisplayedRows();
auto dispCols = getDisplayedCols();
for (size_t row = 0; row < dispRows; ++row)
for (long row = 0; row < dispRows; ++row)
{
for (size_t col = 0; col < dispCols; ++col)
for (long col = 0; col < dispCols; ++col)
{
auto parsed = parseElement(row, col);
if (parsed.empty())
......@@ -176,9 +176,9 @@ namespace armarx
EditMatrixWidget::hasParseErrors()
{
// also parse the hidden stuff!
for (size_t row = 0; row < realRows; ++row)
for (long row = 0; row < realRows; ++row)
{
for (size_t col = 0; col < realCols; ++col)
for (long col = 0; col < realCols; ++col)
{
auto parsed = parseElement(row, col);
if (parsed.empty())
......@@ -199,7 +199,7 @@ namespace armarx
}
std::vector<unsigned char>
EditMatrixWidget::parseElement(size_t row, size_t col)
EditMatrixWidget::parseElement(long row, long col)
{
std::string str = getText(row, col);
try
......@@ -229,12 +229,12 @@ namespace armarx
return {};
}
size_t
long
EditMatrixWidget::getDisplayedRows() const
{
return std::min(realRows, MAX_ROWS_DISPLAY);
}
size_t
long
EditMatrixWidget::getDisplayedCols() const
{
return std::min(realCols, MAX_COLS_DISPLAY);
......
......@@ -20,8 +20,9 @@ namespace armarx
{
Q_OBJECT
public:
EditMatrixWidget(size_t numRows,
size_t numCols,
EditMatrixWidget() = delete;
EditMatrixWidget(long numRows,
long numCols,
aron::type::matrix::ElementType elemType,
QTreeWidgetItem* currentWidget);
......@@ -29,24 +30,24 @@ namespace armarx
static EditMatrixWidget* DynamicCastAndCheck(QWidget*);
// Sets the text on all visible rows and cols.
void setText(size_t row, size_t col, const std::string& str);
std::string getText(size_t row, size_t col);
void setText(long row, long col, const std::string& str);
std::string getText(long row, long col);
void highlightUnparsableEntries();
bool hasParseErrors();
// returns an empty vector if parsing failed. Else, contains the individual bytes.
std::vector<unsigned char> parseElement(size_t row, size_t col);
std::vector<unsigned char> parseElement(long row, long col);
private:
// Dimensions of the underlying Type to represent
size_t realRows;
size_t realCols;
long realRows = 1;
long realCols = 1;
// maximum of rows / cols to display
static constexpr size_t MAX_ROWS_DISPLAY = 5;
static constexpr size_t MAX_COLS_DISPLAY = 5;
size_t getDisplayedRows() const;
size_t getDisplayedCols() const;
static constexpr long MAX_ROWS_DISPLAY = 5;
static constexpr long MAX_COLS_DISPLAY = 5;
long getDisplayedRows() const;
long getDisplayedCols() const;
// Want to add dots to show the user that not all is displayed. This needs some wrapping layouts
QVBoxLayout* outerVerticalLayout;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment