27 #include <QDoubleSpinBox>
28 #include <QDoubleValidator>
29 #include <QFormLayout>
31 #include <QHBoxLayout>
36 #include <QSpacerItem>
38 #include <QStandardItemModel>
39 #include <QStyledItemDelegate>
40 #include <QVBoxLayout>
46 #include <ArmarXGui/interface/WidgetDescription.h>
48 #pragma GCC diagnostic push
49 #pragma GCC diagnostic ignored "-Wpedantic"
50 #include <qwt_slider.h>
53 #pragma GCC diagnostic pop
65 std::map<std::string, VariantBasePtr>
73 Widget::ice_staticId()};
82 VBoxLayoutPtr ptr = VBoxLayoutPtr::dynamicCast(p);
84 setLayout(
new QVBoxLayout);
85 layout()->setContentsMargins(0, 0, 0, 0);
86 for (
const WidgetPtr& childPtr : ptr->children)
88 layout()->addWidget(
addChild(childPtr));
94 VBoxLayout::ice_staticId()};
102 HBoxLayoutPtr ptr = HBoxLayoutPtr::dynamicCast(p);
104 setLayout(
new QHBoxLayout);
105 layout()->setContentsMargins(0, 0, 0, 0);
106 for (
const WidgetPtr& childPtr : ptr->children)
108 layout()->addWidget(
addChild(childPtr));
114 HBoxLayout::ice_staticId()};
122 FormLayoutPtr ptr = FormLayoutPtr::dynamicCast(p);
124 auto l =
new QFormLayout;
126 layout()->setContentsMargins(0, 0, 0, 0);
127 for (
const FormLayoutElementPtr& child : ptr->children)
129 if (child->childIsSpanning)
134 if (child->labelWidget)
139 l->addRow(QString::fromStdString(child->label),
addChild(child->child));
145 FormLayout::ice_staticId()};
153 FormLayoutElementPtr ptr = FormLayoutElementPtr::dynamicCast(p);
155 auto l =
new QFormLayout;
157 layout()->setContentsMargins(0, 0, 0, 0);
158 if (ptr->childIsSpanning)
162 if (ptr->labelWidget)
166 l->addRow(QString::fromStdString(ptr->label),
addChild(ptr->child));
170 DescribedWidgetFactoryRegistration<DescribedFormLayoutElement>
179 GroupBoxPtr ptr = GroupBoxPtr::dynamicCast(p);
181 auto ltop =
new QHBoxLayout;
183 layout()->setContentsMargins(0, 0, 0, 0);
184 QGroupBox* grp =
new QGroupBox;
185 ltop->addWidget(grp);
186 grp->setTitle(QString::fromStdString(ptr->label));
187 auto l =
new QHBoxLayout;
189 l->setContentsMargins(0, 9, 0, 0);
195 GroupBox::ice_staticId()};
204 setLayout(
new QVBoxLayout);
205 layout()->setContentsMargins(0, 0, 0, 0);
206 layout()->addItem(
new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding));
209 std::map<std::string, VariantBasePtr>
217 HSpacer::ice_staticId()};
225 setLayout(
new QVBoxLayout);
226 layout()->setContentsMargins(0, 0, 0, 0);
227 layout()->addItem(
new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding));
230 std::map<std::string, VariantBasePtr>
238 VSpacer::ice_staticId()};
245 setFrameShape(QFrame::HLine);
246 setFrameShadow(QFrame::Sunken);
249 std::map<std::string, VariantBasePtr>
257 HLine::ice_staticId()};
264 setFrameShape(QFrame::VLine);
265 setFrameShadow(QFrame::Sunken);
268 std::map<std::string, VariantBasePtr>
276 VLine::ice_staticId()};
283 auto ptr = LabelPtr::dynamicCast(p);
285 setLayout(
new QVBoxLayout);
286 layout()->setContentsMargins(0, 0, 0, 0);
287 layout()->addWidget(
new QLabel(QString::fromStdString(ptr->text)));
290 std::map<std::string, VariantBasePtr>
298 Label::ice_staticId()};
307 auto ptr = VariantWidgetPtr::dynamicCast(p);
310 setLayout(
new QVBoxLayout);
312 layout()->setContentsMargins(0, 0, 0, 0);
313 layout()->addWidget(child);
318 VariantWidgetContent::VariantWidgetContentBasePtr
data)
override
328 else if (
data->ice_id() == VariantWidgetContent::SingleVariant::ice_staticId())
330 child->
update(VariantWidgetContent::SingleVariantPtr::dynamicCast(
data)->content);
332 else if (
data->ice_id() == VariantWidgetContent::VariantMap::ice_staticId())
334 child->
update(VariantWidgetContent::VariantMapPtr::dynamicCast(
data)->content);
336 else if (
data->ice_id() == VariantWidgetContent::VariantSeq::ice_staticId())
338 child->
update(VariantWidgetContent::VariantSeqPtr::dynamicCast(
data)->content);
347 VariantWidget::ice_staticId()};
356 CheckBoxPtr ptr = CheckBoxPtr::dynamicCast(p);
359 setLayout(
new QVBoxLayout);
360 layout()->setContentsMargins(0, 0, 0, 0);
361 child =
new QCheckBox{QString::fromStdString(ptr->label)};
362 child->setChecked(ptr->defaultValue);
363 layout()->addWidget(child);
364 connect(child, SIGNAL(clicked(
bool)),
this, SLOT(
contentUpdated()));
367 std::map<std::string, VariantBasePtr>
385 CheckBox::ice_staticId()};
393 IntSpinBoxPtr ptr = IntSpinBoxPtr::dynamicCast(p);
396 setLayout(
new QVBoxLayout);
397 layout()->setContentsMargins(0, 0, 0, 0);
398 child =
new QSpinBox{};
399 child->setMaximum(ptr->max);
400 child->setMinimum(ptr->min);
401 child->setValue(ptr->defaultValue);
402 layout()->addWidget(child);
403 connect(child, SIGNAL(valueChanged(
int)),
this, SLOT(
contentUpdated()));
406 std::map<std::string, VariantBasePtr>
424 IntSpinBox::ice_staticId()};
432 DoubleSpinBoxPtr ptr = DoubleSpinBoxPtr::dynamicCast(p);
435 setLayout(
new QVBoxLayout);
436 layout()->setContentsMargins(0, 0, 0, 0);
437 child =
new QDoubleSpinBox{};
438 child->setMaximum(ptr->max);
439 child->setMinimum(ptr->min);
440 child->setDecimals(ptr->decimals);
441 child->setValue(ptr->defaultValue);
442 child->setSingleStep((ptr->max - ptr->min) / ptr->steps);
443 layout()->addWidget(child);
444 connect(child, SIGNAL(valueChanged(
double)),
this, SLOT(
contentUpdated()));
447 std::map<std::string, VariantBasePtr>
454 QDoubleSpinBox* child;
465 DoubleSpinBox::ice_staticId()};
473 FloatSpinBoxPtr ptr = FloatSpinBoxPtr::dynamicCast(p);
476 setLayout(
new QVBoxLayout);
477 layout()->setContentsMargins(0, 0, 0, 0);
478 child =
new QDoubleSpinBox{};
479 child->setMaximum(ptr->max);
480 child->setMinimum(ptr->min);
481 child->setDecimals(ptr->decimals);
482 child->setValue(ptr->defaultValue);
483 child->setSingleStep((ptr->max - ptr->min) / ptr->steps);
484 layout()->addWidget(child);
485 connect(child, SIGNAL(valueChanged(
double)),
this, SLOT(
contentUpdated()));
488 std::map<std::string, VariantBasePtr>
491 return {{
getName(),
new Variant(
static_cast<float>(child->value()))}};
495 QDoubleSpinBox* child;
506 FloatSpinBox::ice_staticId()};
517 const QStyleOptionViewItem& option_,
518 const QModelIndex& index_)
const override
520 QStyleOptionViewItem& refToNonConstOption =
const_cast<QStyleOptionViewItem&
>(option_);
521 refToNonConstOption.showDecorationSelected =
false;
524 QStyledItemDelegate::paint(painter_, refToNonConstOption, index_);
534 StringComboBoxPtr ptr = StringComboBoxPtr::dynamicCast(p);
537 setLayout(
new QVBoxLayout);
538 layout()->setContentsMargins(0, 0, 0, 0);
539 child =
new QComboBox{};
540 multiSelect = ptr->multiSelect;
543 model =
new QStandardItemModel(ptr->options.size() + 1, 1);
544 QStandardItem* item =
new QStandardItem(
"Please select items");
545 item->setFlags(Qt::NoItemFlags);
546 model->setItem(0, 0, item);
549 for (
const auto& opt : ptr->options)
551 QStandardItem* item =
new QStandardItem(QString::fromStdString(opt));
553 item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
554 item->setData(Qt::Unchecked, Qt::CheckStateRole);
556 model->setItem(row, 0, item);
559 model->setParent(child);
560 child->setModel(model);
562 child->setItemDelegate(delegate);
563 child->setCurrentIndex(-1);
567 for (
const auto& opt : ptr->options)
569 child->addItem(QString::fromStdString(opt));
572 static_cast<std::size_t
>(ptr->defaultIndex));
573 child->setCurrentIndex(
574 child->findText(QString::fromStdString(ptr->options.at(ptr->defaultIndex))));
576 layout()->addWidget(child);
578 connect(child, SIGNAL(currentIndexChanged(
int)),
this, SLOT(
contentUpdated()));
581 std::map<std::string, VariantBasePtr>
587 for (
int i = 0; i < child->model()->rowCount(); ++i)
589 if (model->item(i)->checkState() == Qt::Checked)
592 list->addVariant(child->itemText(i).toStdString());
600 return {{
getName(),
new Variant{child->currentText().toStdString()}}};
605 QPointer<QStandardItemModel> model =
nullptr;
607 bool multiSelect =
false;
618 StringComboBox::ice_staticId()};
626 LineEditPtr ptr = LineEditPtr::dynamicCast(p);
629 setLayout(
new QVBoxLayout);
630 layout()->setContentsMargins(0, 0, 0, 0);
631 child =
new QLineEdit{};
632 child->setText(QString::fromStdString(ptr->defaultValue));
633 layout()->addWidget(child);
634 connect(child, SIGNAL(editingFinished()),
this, SLOT(
contentUpdated()));
637 std::map<std::string, VariantBasePtr>
655 LineEdit::ice_staticId()};
663 DoubleLineEditPtr ptr = DoubleLineEditPtr::dynamicCast(p);
666 setLayout(
new QVBoxLayout);
667 layout()->setContentsMargins(0, 0, 0, 0);
668 child =
new QLineEdit{};
669 child->setText(QString::number(ptr->defaultValue));
670 child->setValidator(
new QDoubleValidator{
this});
671 layout()->addWidget(child);
672 connect(child, SIGNAL(editingFinished()),
this, SLOT(
contentUpdated()));
675 std::map<std::string, VariantBasePtr>
693 DoubleLineEdit::ice_staticId()};
701 FloatLineEditPtr ptr = FloatLineEditPtr::dynamicCast(p);
704 setLayout(
new QVBoxLayout);
705 layout()->setContentsMargins(0, 0, 0, 0);
706 child =
new QLineEdit{};
707 child->setText(QString::number(ptr->defaultValue));
708 child->setValidator(
new QDoubleValidator{
this});
709 layout()->addWidget(child);
710 connect(child, SIGNAL(editingFinished()),
this, SLOT(
contentUpdated()));
713 std::map<std::string, VariantBasePtr>
716 return {{
getName(),
new Variant{
static_cast<float>(child->text().toDouble())}}};
727 new Variant{
static_cast<float>(child->text().toDouble())});
732 FloatLineEdit::ice_staticId()};
740 IntSliderPtr ptr = IntSliderPtr::dynamicCast(p);
743 setLayout(
new QVBoxLayout);
744 layout()->setContentsMargins(0, 0, 0, 0);
745 child =
new QSlider{};
746 child->setMaximum(ptr->max);
747 child->setMinimum(ptr->min);
748 child->setValue(ptr->defaultValue);
749 layout()->addWidget(child);
750 connect(child, SIGNAL(valueChanged(
int)),
this, SLOT(
contentUpdated()));
753 std::map<std::string, VariantBasePtr>
771 IntSlider::ice_staticId()};
779 DoubleSliderPtr ptr = DoubleSliderPtr::dynamicCast(p);
782 setLayout(
new QVBoxLayout);
783 layout()->setContentsMargins(0, 0, 0, 0);
784 child =
new QwtSlider{
this};
785 child->setScale(ptr->min, ptr->max);
786 child->setOrientation(Qt::Horizontal);
787 child->setValue(ptr->defaultValue);
788 doubleLabel =
new QLabel(QString::number(ptr->defaultValue,
'g', 4),
this);
789 layout()->addWidget(child);
790 connect(child, SIGNAL(valueChanged(
double)),
this, SLOT(
contentUpdated()));
793 std::map<std::string, VariantBasePtr>
807 doubleLabel->setText(QString::number(child->value(),
'g', 4));
813 DoubleSlider::ice_staticId()};
821 FloatSliderPtr ptr = FloatSliderPtr::dynamicCast(p);
824 setLayout(
new QHBoxLayout);
825 layout()->setContentsMargins(0, 0, 0, 0);
826 child =
new QwtSlider{
this};
827 child->setScale(ptr->min, ptr->max);
828 child->setOrientation(Qt::Horizontal);
829 child->setValue(ptr->defaultValue);
830 floatLabel =
new QLabel(QString::number(ptr->defaultValue,
'g', 4),
this);
831 layout()->addWidget(child);
832 layout()->addWidget(floatLabel);
833 connect(child, SIGNAL(valueChanged(
double)),
this, SLOT(
contentUpdated()));
836 std::map<std::string, VariantBasePtr>
839 return {{
getName(),
new Variant(
static_cast<float>(child->value()))}};
850 floatLabel->setText(QString::number(child->value(),
'g', 4));
856 FloatSlider::ice_staticId()};
865 std::map<std::string, VariantBasePtr>
868 std::map<std::string, VariantBasePtr> result;
884 std::string, VariantWidgetContent::VariantWidgetContentBasePtr)),
887 VariantWidgetContent::VariantWidgetContentBasePtr)));
899 setLayout(
new QVBoxLayout);
900 setName(
".ErrorMessageWidget");
901 layout()->setContentsMargins(0, 0, 0, 0);
902 QLabel* label =
new QLabel{QString::fromStdString(errorMessage)};
903 layout()->addWidget(label);
904 label->setStyleSheet(
"QLabel { background-color : yellow; color : red; }");
910 return new ErrorMessageWidget{
"Null WidgetPtr"};
912 auto type = p->ice_id();
927 catch (std::exception& e)
929 return new ErrorMessageWidget{
"DescribedWidgetFactory for " + type +
930 " threw exception\n" + e.what()};
934 return new ErrorMessageWidget{
"DescribedWidgetFactory for " + type +
940 return new ErrorMessageWidget{
"No DescribedWidgetFactory for " + type};
942 return new ErrorMessageWidget{
"makeDescribedWidget: Unknown error"};
947 if (ptr && ptr->framed)
949 setFrameShape(QFrame::StyledPanel);
955 setFrameShape(QFrame::NoFrame);
956 setFrameShadow(QFrame::Raised);