BCDWidget::BCDWidget(TypeDescriptor_ptr reflective, QWidget * parent) : IntegerWidget(reflective, parent) { using namespace gsim::core; const descriptor_type type = reflective->get_type(); switch(type) { case TYPE_OCTET: setRange(0, max_bcd< unsigned char >()); break; case TYPE_USHORT: setRange(0, max_bcd< unsigned short >()); break; case TYPE_ULONG: setRange(0, max_bcd< uint32_t >()); break; case TYPE_ULONGLONG: setRange(0, max_bcd< uint64_t >()); break; default: break; } }
StringWidget::StringWidget(TypeDescriptor_ptr reflective, QWidget * parent) : QLineEdit(parent), ReflectiveWidget(reflective) { using namespace gsim::core; bool array = reflective->get_type() == TYPE_ARRAY && reflective->get_slice()->get_type() == TYPE_CHAR; assert(reflective->get_type() == TYPE_STRING || array); if (array) { Holder dummy; unsigned length = reflective->get_length(dummy); setMaxLength((int) length); } }
BitSetWidget::BitSetWidget(TypeDescriptor_ptr reflective, const QString& tags, QWidget * parent) : FormWidget(parent), ReflectiveWidget(reflective) { const QStringList tagList (tags.split(';')); setBigWidget(true); using namespace gsim::core; const descriptor_type type = reflective->get_type(); int bits = 0; switch(type) { case TYPE_OCTET: case TYPE_CHAR: bits = 8; break; case TYPE_SHORT: case TYPE_USHORT: bits = 16; break; case TYPE_LONG: case TYPE_ULONG: bits = 32; break; case TYPE_LONGLONG: case TYPE_ULONGLONG: bits = 64; break; default: break; } for (int i = 0; i < bits; i++) { const QString tag = ((i < tagList.size() && !tagList.at(i).isEmpty())? tagList.at(i): QString::number(i)); QCheckBox * sp = new QCheckBox(); addField(tag, sp); m_spinBoxes.push_back(sp); connect(sp, SIGNAL(stateChanged(int)), this, SIGNAL(editingFinished())); } }
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))
IntegerWidget::IntegerWidget(TypeDescriptor_ptr reflective, QWidget * parent) : QSpinBox(parent), ReflectiveWidgetBase(reflective) { using namespace corbasim::core; const reflective_type type = reflective->get_type(); switch(type) { case TYPE_OCTET: setRange(std::numeric_limits< unsigned char >::min(), std::numeric_limits< unsigned char >::max()); break; case TYPE_CHAR: setRange(std::numeric_limits< char >::min(), std::numeric_limits< char >::max()); break; case TYPE_SHORT: setRange(std::numeric_limits< short >::min(), std::numeric_limits< short >::max()); break; case TYPE_USHORT: setRange(std::numeric_limits< unsigned short >::min(), std::numeric_limits< unsigned short >::max()); break; case TYPE_LONG: setRange(std::numeric_limits< int32_t >::min(), std::numeric_limits< int32_t >::max()); break; // TODO custom widget case TYPE_ULONG: setRange(std::numeric_limits< uint32_t >::min(), std::numeric_limits< int32_t >::max()); break; case TYPE_LONGLONG: setRange(std::numeric_limits< int32_t >::min(), std::numeric_limits< int32_t >::max()); break; case TYPE_ULONGLONG: setRange(std::numeric_limits< uint32_t >::min(), std::numeric_limits< int32_t >::max()); break; default: break; } }
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); } } }
FloatWidget::FloatWidget(TypeDescriptor_ptr reflective, QWidget * parent) : QDoubleSpinBox(parent), ReflectiveWidgetBase(reflective) { using namespace corbasim::core; setDecimals(10); const reflective_type type = reflective->get_type(); switch(type) { case TYPE_DOUBLE: setRange(-std::numeric_limits< double >::max(), std::numeric_limits< double >::max()); break; case TYPE_FLOAT: setRange(-std::numeric_limits< float >::max(), std::numeric_limits< float >::max()); break; default: break; } }