25 #include <QFormLayout>
27 #include <QTableWidget>
28 #include <QVBoxLayout>
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)
555 VariantDataWidgets::VariantDataWidgetBase*
561 ErrorMessageWidget(
const std::string& errorMessage)
563 setLayout(
new QVBoxLayout);
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();
581 if (VariantDataWidgetFactory::has(type))
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"};