@@ -163,8 +163,11 @@ class OptBox {
163163 dic->Set (w->objectName (), &b, asTYPEID_BOOL);
164164 } break ;
165165 case ControlType::BoolOptItems: {
166- bool b = w->property (PROPERTY_VALUE ).toBool ();
167- dic->Set (w->objectName (), &b, asTYPEID_BOOL);
166+ QString v = w->property (PROPERTY_VALUE ).toString ();
167+ auto engine = ctx->GetEngine ();
168+ auto type = static_cast <asITypeInfo *>(engine->GetUserData (
169+ AsUserDataType::UserData_StringTypeInfo));
170+ dic->Set (w->objectName (), &v, type->GetTypeId ());
168171 } break ;
169172 case ControlType::Int: {
170173 int v = w->property (" value" ).toInt ();
@@ -418,55 +421,88 @@ class OptBox {
418421 auto layout = new QHBoxLayout (w);
419422 layout->setParent (w);
420423 auto data = obj.value (" data" ).toArray ();
424+ QStringList usedNames;
425+ usedNames.reserve (data.size ());
421426 for (auto p = data.begin (); p != data.end (); p++) {
422427 if (!p->isObject ()) {
423428 qWarning (" [optbox::createWidget] Invalid data for 'bools'" );
424429 continue ;
425430 }
426431 auto obj = p->toObject ();
427- auto cb = new QCheckBox;
432+ auto cb = new QCheckBox (w) ;
428433 cb->setText (obj.value (" text" ).toString ());
429434 auto dv = obj.value (" value" ).toBool ();
430435 cb->setProperty (PROPERTY_DEFAULT , dv);
431- cb->setObjectName (obj.value (" name" ).toString ());
436+ auto name = obj.value (" name" ).toString ();
437+ if (name.isEmpty ()) {
438+ qWarning (" [optbox::createWidget] Cannot create widget "
439+ " without a name." );
440+ return {};
441+ }
442+ if (_usedObjNames.contains (name) || usedNames.contains (name)) {
443+ qWarning (" [optbox::createWidget] Cannot create widget with "
444+ " a used name." );
445+ return {};
446+ }
447+ usedNames.append (name);
448+ cb->setObjectName (name);
432449 cb->setToolTip (obj.value (" tooltip" ).toString ());
433450 cb->setChecked (dv);
434451 _data.insert (cb, ControlType::Bool);
435452 layout->addWidget (cb);
436453 }
454+ _usedObjNames.append (usedNames);
437455 ret.widget = w;
438456 } break ;
439457 case ControlType::BoolOptItems: {
440458 auto w = new QWidget;
441- auto layout = QHBoxLayout (w);
459+ auto layout = new QHBoxLayout (w);
460+ layout->setParent (w);
442461 auto dv = obj.value (" value" ).toString ();
443- w->setProperty (PROPERTY_DEFAULT , dv);
444462 auto group = QButtonGroup (w);
445463 group.setExclusive (true );
446464 auto data = obj.value (" data" ).toArray ();
465+ QStringList usedNames;
466+ usedNames.reserve (data.size ());
447467 for (auto p = data.begin (); p != data.end (); p++) {
448468 if (!p->isObject ()) {
449469 qWarning (
450470 " [optbox::createWidget] Invalid data for 'boolopt'" );
451471 continue ;
452472 }
453473 auto obj = p->toObject ();
454- auto rb = new QRadioButton;
474+ auto rb = new QRadioButton (w) ;
455475 rb->setText (obj.value (" text" ).toString ());
456476 auto name = obj.value (" name" ).toString ();
477+ if (name.isEmpty ()) {
478+ qWarning (" [optbox::createWidget] Cannot create widget "
479+ " without a name." );
480+ return {};
481+ }
482+ if (usedNames.contains (name)) {
483+ qWarning (" [optbox::createWidget] Cannot create widget with "
484+ " a used name." );
485+ return {};
486+ }
487+ usedNames.append (name);
488+ if (dv.isEmpty ()) {
489+ dv = name;
490+ }
457491 rb->setObjectName (name);
458492 rb->setToolTip (obj.value (" tooltip" ).toString ());
459- if (name == dv) {
460- rb->setChecked (true );
461- }
462493 QObject::connect (
463494 rb, &QRadioButton::toggled, w, [rb, w](bool b) {
464495 if (b) {
465496 w->setProperty (PROPERTY_VALUE , rb->objectName ());
466497 }
467498 });
499+ if (name == dv) {
500+ rb->setChecked (true );
501+ }
502+ layout->addWidget (rb);
468503 group.addButton (rb);
469504 }
505+ w->setProperty (PROPERTY_DEFAULT , dv);
470506 ret.widget = w;
471507 _data.insert (w, type);
472508 } break ;
0 commit comments