TypeDescriptor_ptr followPath( TypeDescriptor_ptr message, const ReflectivePath_t& path) { TypeDescriptor_ptr res = message; ReflectivePath_t::const_iterator it = path.begin(); for (; it != path.end() && res; ++it) { res = res->get_child(*it); } return res; }
UnionWidget::UnionWidget( TypeDescriptor_ptr reflective, WidgetFactory_t factory, QWidget * parent) : QWidget(parent), ReflectiveWidgetBase(reflective) { assert(reflective->get_type() == core::TYPE_UNION); QGridLayout * layout = new QGridLayout(this); unsigned int count = reflective->get_children_count(); m_widgets.resize(count, NULL); // discriminator { const char * child_name = reflective->get_child_name(0); core::reflective_base const * child = reflective->get_child(0); QWidget * child_widget = factory(child, this); child_widget->setObjectName(child_name); m_widgets[0] = dynamic_cast< ReflectiveWidgetBase* >(child_widget); child_widget->setObjectName(child_name); layout->addWidget(new QLabel(child_name), 0, 0); layout->addWidget(child_widget, 0, 1); if (qobject_cast< QComboBox * >(child_widget)) { connect(child_widget, SIGNAL(currentIndexChanged(int)), this, SLOT(discriminatorChanged())); } else if (qobject_cast< QSpinBox * >(child_widget)) { connect(child_widget, SIGNAL(valueChanged(int)), this, SLOT(discriminatorChanged())); } else if (qobject_cast< QDoubleSpinBox * >(child_widget))
bool followPath( TypeDescriptor_ptr message, Holder holder, const ReflectivePath_t& path, TypeDescriptor_ptr& descriptor, Holder& value) { value = holder; descriptor = message; ReflectivePath_t::const_iterator it = path.begin(); for (; it != path.end() && descriptor; ++it) { if (descriptor->is_variable_length()) return false; value = descriptor->get_child_value(value, *it); descriptor = descriptor->get_child(*it); } // valid if descriptor not null return (descriptor); }
StructWidget::StructWidget( TypeDescriptor_ptr reflective, WidgetFactory_t factory, QWidget * parent) : qt::FormWidget(parent), ReflectiveWidgetBase(reflective) { assert(reflective->get_type() == core::TYPE_STRUCT); unsigned int count = reflective->get_children_count(); m_widgets.resize(count, NULL); for (unsigned int i = 0; i < count; i++) { core::reflective_base const * child = reflective->get_child(i); const char * child_name = reflective->get_child_name(i); QWidget * child_widget = factory(child, this); m_widgets[i] = dynamic_cast< ReflectiveWidgetBase* >( child_widget); child_widget->setObjectName(child_name); if (child->is_primitive() || child->is_enum()) { addField(child_name, child_widget); } else { addBigField(child_name, child_widget); } } }