27#include <QTableWidget>
32#include <ArmarXCore/interface/observers/Complex.h>
33#include <ArmarXCore/interface/observers/Matrix.h>
34#include <ArmarXCore/interface/observers/Timestamp.h>
35#include <ArmarXCore/interface/observers/VariantContainers.h>
54 auto l =
new QVBoxLayout;
55 l->setContentsMargins(0, 0, 0, 0);
63 update(
const VariantDataPtr& p)
override
65 BoolVariantDataPtr v = BoolVariantDataPtr::dynamicCast(p);
70 label->setText(v->b ?
"true" :
"false");
73 label->setText(v->b ?
"True" :
"False");
76 label->setText(v->b ?
"TRUE" :
"FALSE");
79 label->setText(v->b ?
"1" :
"0");
82 label->setText(v->b ?
"X" :
"O");
85 label->setText(v->b ?
"X" :
" ");
96 BoolVariantData::ice_staticId()};
103 auto l =
new QVBoxLayout;
104 l->setContentsMargins(0, 0, 0, 0);
114 DoubleVariantDataPtr v = DoubleVariantDataPtr::dynamicCast(p);
116 label->setText(QString::number(v->d));
124 DoubleVariantData::ice_staticId()};
131 auto l =
new QVBoxLayout;
132 l->setContentsMargins(0, 0, 0, 0);
142 FloatVariantDataPtr v = FloatVariantDataPtr::dynamicCast(p);
144 label->setText(QString::number(v->f));
152 FloatVariantData::ice_staticId()};
159 auto l =
new QVBoxLayout;
160 l->setContentsMargins(0, 0, 0, 0);
170 IntVariantDataPtr v = IntVariantDataPtr::dynamicCast(p);
172 label->setText(QString::number(v->n));
180 IntVariantData::ice_staticId()};
187 auto l =
new QVBoxLayout;
188 l->setContentsMargins(0, 0, 0, 0);
198 LongVariantDataPtr v = LongVariantDataPtr::dynamicCast(p);
200 label->setText(QString::number(v->n));
208 LongVariantData::ice_staticId()};
215 auto l =
new QVBoxLayout;
216 l->setContentsMargins(0, 0, 0, 0);
226 StringVariantDataPtr v = StringVariantDataPtr::dynamicCast(p);
228 label->setText(QString::fromStdString(v->s));
236 StringVariantData::ice_staticId()};
243 auto l =
new QVBoxLayout;
244 l->setContentsMargins(0, 0, 0, 0);
254 TimestampBasePtr v = TimestampBasePtr::dynamicCast(p);
256 label->setText(QString::number(v->timestamp) + suffix);
265 TimestampBase::ice_staticId()};
272 auto l =
new QFormLayout;
273 l->setContentsMargins(0, 0, 0, 0);
277 l->addRow(
"Real", labelR);
278 l->addRow(
"Imag", labelI);
285 ComplexFloatBasePtr v = ComplexFloatBasePtr::dynamicCast(p);
287 labelR->setText(QString::number(v->real));
288 labelI->setText(QString::number(v->imag));
297 ComplexFloatBase::ice_staticId()};
304 auto l =
new QFormLayout;
305 l->setContentsMargins(0, 0, 0, 0);
309 l->addRow(
"Real", labelR);
310 l->addRow(
"Imag", labelI);
317 ComplexDoubleBasePtr v = ComplexDoubleBasePtr::dynamicCast(p);
319 labelR->setText(QString::number(v->real));
320 labelI->setText(QString::number(v->imag));
329 ComplexDoubleBase::ice_staticId()};
336 auto l =
new QVBoxLayout;
337 l->setContentsMargins(0, 0, 0, 0);
339 table =
new QTableWidget;
347 MatrixDoubleBasePtr v = MatrixDoubleBasePtr::dynamicCast(p);
349 table->setRowCount(v->rows);
350 table->setColumnCount(v->cols);
351 for (
int row = 0; row < v->rows; ++row)
353 for (
int col = 0; col < v->cols; ++col)
355 int i = row + col * v->rows;
356 table->setItem(row, col,
new QTableWidgetItem{QString::number(v->data.at(i))});
366 MatrixDoubleBase::ice_staticId()};
373 auto l =
new QVBoxLayout;
374 l->setContentsMargins(0, 0, 0, 0);
376 table =
new QTableWidget;
384 MatrixFloatBasePtr v = MatrixFloatBasePtr::dynamicCast(p);
386 table->setRowCount(v->rows);
387 table->setColumnCount(v->cols);
388 for (
int row = 0; row < v->rows; ++row)
390 for (
int col = 0; col < v->cols; ++col)
392 int i = row + col * v->rows;
393 table->setItem(row, col,
new QTableWidgetItem{QString::number(v->data.at(i))});
403 MatrixFloatBase::ice_staticId()};
416 VariantWidget::reset(Mode newMode)
418 if (mode != Mode::Empty)
421 while (QLayoutItem* item = l->takeAt(0))
423 QWidget* widget = item->widget();
426 widget->deleteLater();
433 if (mode == Mode::Map)
435 l->setHorizontalSpacing(6);
439 l->setHorizontalSpacing(0);
446 if (mode != Mode::SingleEntry)
448 reset(Mode::SingleEntry);
450 updateEntry(
"SingleEntry", v);
456 if (mode != Mode::Vector)
460 for (std::size_t i = 0; i < vec.size(); ++i)
469 if (mode != Mode::Map)
473 for (
const auto& entry : map)
475 updateEntry(entry.first, entry.second);
480 VariantWidget::updateEntry(
const std::string& name,
const VariantBasePtr& v)
483 if (entries.count(name))
486 VariantDataWidgetBase* entryOld = entries.at(name);
490 if (mode == Mode::Map)
493 auto label = l->labelForField(entryOld);
494 l->removeWidget(label);
495 label->deleteLater();
497 l->removeWidget(entryOld);
498 entryOld->deleteLater();
504 std::string type =
v->data->ice_id();
505 if (entryOld->getTypeName() != type)
510 int row = getEntryRow(entryOld);
513 l->removeWidget(entryOld);
514 entryOld->deleteLater();
515 l->setWidget(row, QFormLayout::FieldRole, entries[name]);
520 entryOld->update(
v->data);
528 if (mode == Mode::Map)
530 l->addRow(QString::fromStdString(name), entries[name]);
534 l->addRow(
"", entries[name]);
540 VariantWidget::getEntryRow(VariantWidget::VariantDataWidgetBase* entry)
const
544 for (
int row = 0; row < l->rowCount(); ++row)
546 QLayoutItem* it = l->itemAt(row, QFormLayout::FieldRole);
547 if (it && it->widget() == entry)
561 ErrorMessageWidget(
const std::string& errorMessage)
563 setLayout(
new QVBoxLayout);
564 setTypeName(
".ErrorMessageWidget");
565 layout()->setContentsMargins(0, 0, 0, 0);
566 QLabel* label =
new QLabel{QString::fromStdString(errorMessage)};
567 layout()->addWidget(label);
568 label->setStyleSheet(
"QLabel { background-color : yellow; color : red; }");
574 return new ErrorMessageWidget{
"Null VariantBasePtr"};
578 return new ErrorMessageWidget{
"Null VariantBasePtr::data"};
580 auto type = p->data->ice_id();
589 catch (std::exception& e)
591 return new ErrorMessageWidget{
"VariantDataWidgetFactory for " + type +
592 " threw exception\n" + e.what()};
596 return new ErrorMessageWidget{
"VariantDataWidgetFactory for " + type +
602 return new ErrorMessageWidget{
"No VariantDataWidgetFactory for " + type};
604 return new ErrorMessageWidget{
"makeVariantDataWidget: Unknown error"};
static bool has(const std::string &key)
static const std::function< VariantDataWidgetBase *(const VariantDataPtr &)> & get(const std::string &key)
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
double v(double t, double v0, double a0, double j)
This file offers overloads of toIce() and fromIce() functions for STL container types.
::IceInternal::Handle<::armarx::VariantBase > VariantBasePtr
const std::string & to_string(const std::string &s)