void QSimpleResource::applyExtensionDataFromDOM(QAbstractFormBuilder *afb, QDesignerFormEditorInterface *core, DomWidget *ui_widget, QWidget *widget, bool applyState) { QExtensionManager *emgr = core->extensionManager(); if (QDesignerExtraInfoExtension *extra = qt_extension<QDesignerExtraInfoExtension*>(emgr, widget)) { extra->loadWidgetExtraInfo(ui_widget); } if (applyState) { if (QDesignerScriptExtension *scriptExt = qt_extension<QDesignerScriptExtension*>(emgr, widget)) { // Apply the state. // We pass on the widget for property introspection. Thus, non-designable properties // that have to be converted using QMetaObject (enums and the like) will work. QVariantMap data; DomWidgetDataList domDataList = ui_widget->elementWidgetData(); if (!domDataList.empty()) { foreach (const DomWidgetData *domData, domDataList) { const DomPropertyList properties = domData->elementProperty(); foreach(const DomProperty *prop, properties) { const QVariant vprop = domPropertyToVariant(afb, widget->metaObject(), prop); if (vprop.type() != QVariant::Invalid) data.insert(prop->attributeName(), vprop); } } } scriptExt->setData(data); }
// Convert complex DOM types with the help of QAbstractFormBuilder QVariant domPropertyToVariant(QAbstractFormBuilder *afb,const QMetaObject *meta,const DomProperty *p) { // Complex types that need functions from QAbstractFormBuilder switch(p->kind()) { case DomProperty::String: { const int index = meta->indexOfProperty(p->attributeName().toUtf8()); if (index != -1 && meta->property(index).type() == QVariant::KeySequence) return QVariant::fromValue(QKeySequence(p->elementString()->text())); } break; case DomProperty::Palette: { const DomPalette *dom = p->elementPalette(); QPalette palette; if (dom->elementActive()) afb->setupColorGroup(palette, QPalette::Active, dom->elementActive()); if (dom->elementInactive()) afb->setupColorGroup(palette, QPalette::Inactive, dom->elementInactive()); if (dom->elementDisabled()) afb->setupColorGroup(palette, QPalette::Disabled, dom->elementDisabled()); palette.setCurrentColorGroup(QPalette::Active); return QVariant::fromValue(palette); } case DomProperty::Set: { const QByteArray pname = p->attributeName().toUtf8(); const int index = meta->indexOfProperty(pname); if (index == -1) { uiLibWarning(QCoreApplication::translate("QFormBuilder", "The set-type property %1 could not be read.").arg(p->attributeName())); return QVariant(); } const QMetaEnum e = meta->property(index).enumerator(); Q_ASSERT(e.isFlag() == true); return QVariant(e.keysToValue(p->elementSet().toUtf8())); } case DomProperty::Enum: { const QByteArray pname = p->attributeName().toUtf8(); const int index = meta->indexOfProperty(pname); QString enumValue = p->elementEnum(); // Triggers in case of objects in Designer like Spacer/Line for which properties // are serialized using language introspection. On preview, however, these objects are // emulated by hacks in the formbuilder (size policy/orientation) fixEnum(enumValue); if (index == -1) { // ### special-casing for Line (QFrame) -- fix for 4.2. Jambi hack for enumerations if (!qstrcmp(meta->className(), "QFrame") && (pname == QByteArray("orientation"))) { return QVariant(enumValue == QFormBuilderStrings::instance().horizontalPostFix ? QFrame::HLine : QFrame::VLine); } else { uiLibWarning(QCoreApplication::translate("QFormBuilder", "The enumeration-type property %1 could not be read.").arg(p->attributeName())); return QVariant(); } } const QMetaEnum e = meta->property(index).enumerator(); return QVariant(e.keyToValue(enumValue.toUtf8())); } case DomProperty::Brush: return QVariant::fromValue(afb->setupBrush(p->elementBrush())); default: if (afb->resourceBuilder()->isResourceProperty(p)) { return afb->resourceBuilder()->loadResource(afb->workingDirectory(), p); } break; } // simple type return domPropertyToVariant(p); }