177 d->registerButtonGroups(domButtonGroups);
179 if (QWidget *widget = create(ui_widget, parentWidget)) {
181 for (
const auto &bg : std::as_const(d->buttonGroups())) {
183 bg.second->setParent(widget);
185 createConnections(ui->elementConnections(), widget);
186 createResources(ui->elementResources());
187 applyTabStops(widget, ui->elementTabStops());
188 d->applyInternalProperties();
198
199
200
201
202
204void QAbstractFormBuilder::initialize(
const DomUI *ui)
206 DomCustomWidgets *domCustomWidgets = ui->elementCustomWidgets();
207 createCustomWidgets(domCustomWidgets);
209 if (domCustomWidgets) {
210 const auto &customWidgets = domCustomWidgets->elementCustomWidget();
211 for (
const DomCustomWidget *w : customWidgets)
212 d->storeCustomWidgetData(w->elementClass(), w);
217
218
219QWidget *QAbstractFormBuilder::create(DomWidget *ui_widget, QWidget *parentWidget)
221 QWidget *w = createWidget(ui_widget->attributeClass(), parentWidget, ui_widget->attributeName());
225 applyProperties(w, ui_widget->elementProperty());
227 const auto &elementAction = ui_widget->elementAction();
228 for (DomAction *ui_action : elementAction) {
229 QAction *child_action = create(ui_action, w);
230 Q_UNUSED( child_action );
233 const auto &elementActionGroup = ui_widget->elementActionGroup();
234 for (DomActionGroup *ui_action_group : elementActionGroup) {
235 QActionGroup *child_action_group = create(ui_action_group, w);
236 Q_UNUSED( child_action_group );
239 QWidgetList children;
240 const auto &elementWidget = ui_widget->elementWidget();
241 for (DomWidget *ui_child : elementWidget) {
242 if (QWidget *child = create(ui_child, w)) {
245 const QString className = ui_child->elementClass().value(0);
246 uiLibWarning(QCoreApplication::translate(
"QAbstractFormBuilder",
"The creation of a widget of the class '%1' failed.").arg(className));
250 const auto &elementLayout = ui_widget->elementLayout();
251 for (DomLayout *ui_lay : elementLayout) {
252 QLayout *child_lay = create(ui_lay,
nullptr, w);
253 Q_UNUSED( child_lay );
256 const auto &addActions = ui_widget->elementAddAction();
257 if (!addActions.isEmpty()) {
258 for (DomActionRef *ui_action_ref : addActions) {
259 const QString name = ui_action_ref->attributeName();
260 if (name ==
"separator"_L1) {
261 QAction *sep =
new QAction(w);
262 sep->setSeparator(
true);
265 }
else if (QAction *a = d->m_actions.value(name)) {
267 }
else if (QActionGroup *g = d->m_actionGroups.value(name)) {
268 w->addActions(g->actions());
269 }
else if (QMenu *menu = w->findChild<QMenu*>(name)) {
270 w->addAction(menu->menuAction());
271 addMenuAction(menu->menuAction());
276 loadExtraInfo(ui_widget, w, parentWidget);
277 addItem(ui_widget, w, parentWidget);
279 if (qobject_cast<QDialog *>(w) && parentWidget)
280 w->setAttribute(Qt::WA_Moved,
false);
282 const QStringList zOrderNames = ui_widget->elementZOrder();
283 if (!zOrderNames.isEmpty()) {
284 QWidgetList zOrder = qvariant_cast<QWidgetList>(w->property(
"_q_zOrder"));
285 for (
const QString &widgetName : zOrderNames) {
286 if (QWidget *child = w->findChild<QWidget*>(widgetName)) {
287 if (child->parentWidget() == w) {
288 zOrder.removeAll(child);
289 zOrder.append(child);
294 w->setProperty(
"_q_zOrder", QVariant::fromValue(zOrder));
301
302
303QAction *QAbstractFormBuilder::create(DomAction *ui_action, QObject *parent)
305 QAction *a = createAction(parent, ui_action->attributeName());
309 d->m_actions.insert(ui_action->attributeName(), a);
310 applyProperties(a, ui_action->elementProperty());
315
316
317QActionGroup *QAbstractFormBuilder::create(DomActionGroup *ui_action_group, QObject *parent)
319 QActionGroup *a = createActionGroup(parent, ui_action_group->attributeName());
322 d->m_actionGroups.insert(ui_action_group->attributeName(), a);
323 applyProperties(a, ui_action_group->elementProperty());
325 const auto &elementAction = ui_action_group->elementAction();
326 for (DomAction *ui_action : elementAction) {
327 QAction *child_action = create(ui_action, a);
328 Q_UNUSED( child_action );
331 const auto &elementActionGroup = ui_action_group->elementActionGroup();
332 for (DomActionGroup *g : elementActionGroup) {
333 QActionGroup *child_action_group = create(g, parent);
334 Q_UNUSED( child_action_group );
342Qt::ToolBarArea QAbstractFormBuilder::toolbarAreaFromDOMAttributes(
const DomPropertyHash &attributes)
344 const DomProperty *attr = attributes.value(
"toolBarArea"_L1);
346 return Qt::TopToolBarArea;
347 switch(attr->kind()) {
348 case DomProperty::Number:
349 return static_cast<Qt::ToolBarArea>(attr->elementNumber());
350 case DomProperty::Enum:
351 return enumKeyOfObjectToValue<QAbstractFormBuilderGadget, Qt::ToolBarArea>(
"toolBarArea",
352 attr->elementEnum().toLatin1().constData());
356 return Qt::TopToolBarArea;
360
361
362bool QAbstractFormBuilder::addItem(DomWidget *ui_widget, QWidget *widget, QWidget *parentWidget)
364 const DomPropertyHash attributes = propertyMap(ui_widget->elementAttribute());
366 if (parentWidget ==
nullptr)
369 const QString className = QLatin1StringView(parentWidget->metaObject()->className());
370 const QString addPageMethod = d->customWidgetAddPageMethod(className);
371 if (!addPageMethod.isEmpty()) {
373 return QMetaObject::invokeMethod(parentWidget, addPageMethod.toUtf8().constData(), Qt::DirectConnection, Q_ARG(QWidget*, widget));
376 if (QMainWindow *mw = qobject_cast<QMainWindow*>(parentWidget)) {
378#if QT_CONFIG(menubar)
380 if (QMenuBar *menuBar = qobject_cast<QMenuBar*>(widget)) {
381 mw->setMenuBar(menuBar);
386#if QT_CONFIG(toolbar)
388 if (QToolBar *toolBar = qobject_cast<QToolBar*>(widget)) {
389 mw->addToolBar(toolbarAreaFromDOMAttributes(attributes), toolBar);
391 if (
const DomProperty *attr = attributes.value(
"toolBarBreak"_L1))
392 if (attr->elementBool() ==
"true"_L1)
393 mw->insertToolBarBreak (toolBar);
399#if QT_CONFIG(statusbar)
401 if (QStatusBar *statusBar = qobject_cast<QStatusBar*>(widget)) {
402 mw->setStatusBar(statusBar);
407#if QT_CONFIG(dockwidget)
409 if (QDockWidget *dockWidget = qobject_cast<QDockWidget*>(widget)) {
410 if (
const DomProperty *attr = attributes.value(
"dockWidgetArea"_L1)) {
411 Qt::DockWidgetArea area =
static_cast<Qt::DockWidgetArea>(attr->elementNumber());
412 if (!dockWidget->isAreaAllowed(area)) {
413 if (dockWidget->isAreaAllowed(Qt::LeftDockWidgetArea))
414 area = Qt::LeftDockWidgetArea;
415 else if (dockWidget->isAreaAllowed(Qt::RightDockWidgetArea))
416 area = Qt::RightDockWidgetArea;
417 else if (dockWidget->isAreaAllowed(Qt::TopDockWidgetArea))
418 area = Qt::TopDockWidgetArea;
419 else if (dockWidget->isAreaAllowed(Qt::BottomDockWidgetArea))
420 area = Qt::BottomDockWidgetArea;
422 mw->addDockWidget(area, dockWidget);
424 mw->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
430 if (!mw->centralWidget()) {
431 mw->setCentralWidget(widget);
436#if QT_CONFIG(tabwidget)
437 else if (QTabWidget *tabWidget = qobject_cast<QTabWidget*>(parentWidget)) {
438 widget->setParent(
nullptr);
440 const int tabIndex = tabWidget->count();
441 if (
auto *titleP = attributes.value(QFormBuilderStrings::titleAttribute))
442 tabWidget->addTab(widget, toString(titleP->elementString()));
444 tabWidget->addTab(widget,
"Page"_L1);
446 if (
const auto *picon = attributes.value(QFormBuilderStrings::iconAttribute)) {
447 QVariant v = resourceBuilder()->loadResource(workingDirectory(), picon);
448 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
449 tabWidget->setTabIcon(tabIndex, qvariant_cast<QIcon>(nativeValue));
452#if QT_CONFIG(tooltip)
453 if (
const auto *ptoolTip = attributes.value(QFormBuilderStrings::toolTipAttribute)) {
454 tabWidget->setTabToolTip(tabIndex, toString(ptoolTip->elementString()));
458#if QT_CONFIG(whatsthis)
459 if (
const auto *pwhatsThis = attributes.value(QFormBuilderStrings::whatsThisAttribute)) {
460 tabWidget->setTabWhatsThis(tabIndex, toString(pwhatsThis->elementString()));
468#if QT_CONFIG(toolbox)
469 else if (QToolBox *toolBox = qobject_cast<QToolBox*>(parentWidget)) {
470 const int tabIndex = toolBox->count();
471 if (
const auto *labelP = attributes.value(QFormBuilderStrings::labelAttribute))
472 toolBox->addItem(widget, toString(labelP->elementString()));
474 toolBox->addItem(widget,
"Page"_L1);
476 if (
const auto *picon = attributes.value(QFormBuilderStrings::iconAttribute)) {
477 QVariant v = resourceBuilder()->loadResource(workingDirectory(), picon);
478 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
479 toolBox->setItemIcon(tabIndex, qvariant_cast<QIcon>(nativeValue));
482#if QT_CONFIG(tooltip)
483 if (
const auto *ptoolTip = attributes.value(QFormBuilderStrings::toolTipAttribute)) {
484 toolBox->setItemToolTip(tabIndex, toString(ptoolTip->elementString()));
492#if QT_CONFIG(stackedwidget)
493 else if (QStackedWidget *stackedWidget = qobject_cast<QStackedWidget*>(parentWidget)) {
494 stackedWidget->addWidget(widget);
499#if QT_CONFIG(splitter)
500 else if (QSplitter *splitter = qobject_cast<QSplitter*>(parentWidget)) {
501 splitter->addWidget(widget);
506#if QT_CONFIG(mdiarea)
507 else if (QMdiArea *mdiArea = qobject_cast<QMdiArea*>(parentWidget)) {
508 mdiArea->addSubWindow(widget);
513#if QT_CONFIG(dockwidget)
514 else if (QDockWidget *dockWidget = qobject_cast<QDockWidget*>(parentWidget)) {
515 dockWidget->setWidget(widget);
520#if QT_CONFIG(scrollarea)
521 else if (QScrollArea *scrollArea = qobject_cast<QScrollArea*>(parentWidget)) {
522 scrollArea->setWidget(widget);
528 else if (QWizard *wizard = qobject_cast<QWizard *>(parentWidget)) {
529 QWizardPage *page = qobject_cast<QWizardPage*>(widget);
531 uiLibWarning(QCoreApplication::translate(
"QAbstractFormBuilder",
"Attempt to add child that is not of class QWizardPage to QWizard."));
534 wizard->addPage(page);
542
543
544void QAbstractFormBuilder::layoutInfo(DomLayout *ui_layout, QObject *parent,
int *margin,
int *spacing)
547 auto properties = ui_layout->elementProperty();
551 if (
const DomProperty *p = QFBE::propertyByName(properties,
"margin"))
552 mar = p->elementNumber();
553 if (
const DomProperty *p = QFBE::propertyByName(properties,
"spacing"))
554 spac = p->elementNumber();
558 if (mar != INT_MIN) {
559 const int defaultMargin = parent->inherits(
"QLayoutWidget") ? 0 : 9;
560 if (mar == defaultMargin)
565 if (mar == INT_MIN || spac == INT_MIN) {
566 for (
auto it = properties.begin(); it != properties.end(); ) {
567 DomProperty *prop = *it;
568 if ((mar == INT_MIN && prop->attributeName() ==
"margin"_L1)
569 || (spac == INT_MIN && prop->attributeName() ==
"spacing"_L1)) {
571 it = properties.erase(it);
576 ui_layout->setElementProperty(properties);
587
588
589QLayout *QAbstractFormBuilder::create(DomLayout *ui_layout, QLayout *parentLayout, QWidget *parentWidget)
591 QObject *p = parentLayout;
596 Q_ASSERT(p !=
nullptr);
598 bool tracking =
false;
600 if (p == parentWidget && parentWidget->layout()) {
602 p = parentWidget->layout();
605 QLayout *layout = createLayout(ui_layout->attributeClass(), p, ui_layout->hasAttributeName() ? ui_layout->attributeName() : QString());
607 if (layout ==
nullptr)
610 if (tracking && layout->parent() ==
nullptr) {
611 QBoxLayout *box = qobject_cast<QBoxLayout*>(parentWidget->layout());
613 const QString widgetClass = QString::fromUtf8(parentWidget->metaObject()->className());
614 const QString layoutClass = QString::fromUtf8(parentWidget->layout()->metaObject()->className());
615 const QString msg = QCoreApplication::translate(
"QAbstractFormBuilder",
"Attempt to add a layout to a widget '%1' (%2) which already has a layout of non-box type %3.\n"
616 "This indicates an inconsistency in the ui-file.").
617 arg(parentWidget->objectName(), widgetClass, layoutClass);
621 box->addLayout(layout);
624 int margin = INT_MIN, spacing = INT_MIN;
625 layoutInfo(ui_layout, p, &margin, &spacing);
627 if (margin != INT_MIN) {
628 layout->setContentsMargins(margin, margin, margin, margin);
630 int left = -1, top = -1, right = -1, bottom = -1;
631 layout->getContentsMargins(&left, &top, &right, &bottom);
632 QFormBuilderExtra::getLayoutMargins(ui_layout->elementProperty(),
633 &left, &top, &right, &bottom);
634 layout->setContentsMargins(left, top, right, bottom);
637 if (spacing != INT_MIN) {
638 layout->setSpacing(spacing);
640 QGridLayout *grid = qobject_cast<QGridLayout *>(layout);
642 const auto &properties = ui_layout->elementProperty();
643 if (
const auto *p = QFBE::propertyByName(properties,
"horizontalSpacing"))
644 grid->setHorizontalSpacing(p->elementNumber());
645 if (
const auto *p = QFBE::propertyByName(properties,
"verticalSpacing"))
646 grid->setVerticalSpacing(p->elementNumber());
650 applyProperties(layout, ui_layout->elementProperty());
652 const auto &elementItem = ui_layout->elementItem();
653 for (DomLayoutItem *ui_item : elementItem) {
654 if (QLayoutItem *item = create(ui_item, layout, parentWidget)) {
655 addItem(ui_item, item, layout);
659 if (QBoxLayout *box = qobject_cast<QBoxLayout*>(layout)) {
660 const QString boxStretch = ui_layout->attributeStretch();
661 if (!boxStretch.isEmpty())
662 QFormBuilderExtra::setBoxLayoutStretch(boxStretch, box);
665 if (QGridLayout *grid = qobject_cast<QGridLayout*>(layout)) {
667 const QString gridRowStretch = ui_layout->attributeRowStretch();
668 if (!gridRowStretch.isEmpty())
669 QFormBuilderExtra::setGridLayoutRowStretch(gridRowStretch, grid);
670 const QString gridColumnStretch = ui_layout->attributeColumnStretch();
671 if (!gridColumnStretch.isEmpty())
672 QFormBuilderExtra::setGridLayoutColumnStretch(gridColumnStretch, grid);
674 const QString gridColumnMinimumWidth = ui_layout->attributeColumnMinimumWidth();
675 if (!gridColumnMinimumWidth.isEmpty())
676 QFormBuilderExtra::setGridLayoutColumnMinimumWidth(gridColumnMinimumWidth, grid);
677 const QString gridRowMinimumHeight = ui_layout->attributeRowMinimumHeight();
678 if (!gridRowMinimumHeight.isEmpty())
679 QFormBuilderExtra::setGridLayoutRowMinimumHeight(gridRowMinimumHeight, grid);
684#if QT_CONFIG(formlayout)
685static inline QFormLayout::ItemRole formLayoutRole(
int column,
int colspan)
688 return QFormLayout::SpanningRole;
689 return column == 0 ? QFormLayout::LabelRole : QFormLayout::FieldRole;
695 return fullyQualifiedEnums ?
"Qt::AlignmentFlag::"_L1 :
"Qt::"_L1;
702 switch (a & Qt::AlignHorizontal_Mask) {
709 case Qt::AlignHCenter:
710 h =
"AlignHCenter"_L1;
712 case Qt::AlignJustify:
713 h =
"AlignJustify"_L1;
716 switch (a & Qt::AlignVertical_Mask) {
720 case Qt::AlignBottom:
721 v =
"AlignBottom"_L1;
723 case Qt::AlignVCenter:
724 v =
"AlignVCenter"_L1;
729 result += alignmentPrefix(fullyQualifiedEnums) + h;
730 if (!h.isEmpty() && !v.isEmpty())
733 result += alignmentPrefix(fullyQualifiedEnums) + v;
741 for (
const auto &f : qTokenize(in, u'|')) {
742 if (f.endsWith(
"::AlignLeft"_L1)) {
744 }
else if (f.endsWith(
"::AlignRight"_L1)) {
745 rc |= Qt::AlignRight;
746 }
else if (f.endsWith(
"::AlignHCenter"_L1)) {
747 rc |= Qt::AlignHCenter;
748 }
else if (f.endsWith(
"::AlignJustify"_L1)) {
749 rc |= Qt::AlignJustify;
750 }
else if (f.endsWith(
"::AlignTop"_L1)) {
752 }
else if (f.endsWith(
"::AlignBottom"_L1)) {
753 rc |= Qt::AlignBottom;
754 }
else if (f.endsWith(
"::AlignVCenter"_L1)) {
755 rc |= Qt::AlignVCenter;
763
764
765bool QAbstractFormBuilder::addItem(DomLayoutItem *ui_item, QLayoutItem *item, QLayout *layout)
769 if (item->widget()) {
770 static_cast<QFriendlyLayout*>(layout)->addChildWidget(item->widget());
771 }
else if (item->layout()) {
772 static_cast<QFriendlyLayout*>(layout)->addChildLayout(item->layout());
773 }
else if (item->spacerItem()) {
779 if (QGridLayout *grid = qobject_cast<QGridLayout*>(layout)) {
780 const int rowSpan = ui_item->hasAttributeRowSpan() ? ui_item->attributeRowSpan() : 1;
781 const int colSpan = ui_item->hasAttributeColSpan() ? ui_item->attributeColSpan() : 1;
782 grid->addItem(item, ui_item->attributeRow(), ui_item->attributeColumn(),
783 rowSpan, colSpan, item->alignment());
786#if QT_CONFIG(formlayout)
787 if (QFormLayout *form = qobject_cast<QFormLayout *>(layout)) {
788 const int row = ui_item->attributeRow();
789 const int colSpan = ui_item->hasAttributeColSpan() ? ui_item->attributeColSpan() : 1;
790 form->setItem(row, formLayoutRole(ui_item->attributeColumn(), colSpan), item);
795 layout->addItem(item);
800
801
802QLayoutItem *QAbstractFormBuilder::create(DomLayoutItem *ui_layoutItem, QLayout *layout, QWidget *parentWidget)
804 switch (ui_layoutItem->kind()) {
805 case DomLayoutItem::Widget: {
806 if (QWidget *w = create(ui_layoutItem->elementWidget(), parentWidget)) {
807#ifdef QFORMINTERNAL_NAMESPACE
808 QWidgetItem *item =
new QWidgetItemV2(w);
810 QWidgetItem *item = QLayoutPrivate::createWidgetItem(layout, w);
812 item->setAlignment(alignmentFromDom(ui_layoutItem->attributeAlignment()));
815 qWarning() << QCoreApplication::translate(
"QAbstractFormBuilder",
"Empty widget item in %1 '%2'.").arg(QString::fromUtf8(layout->metaObject()->className()), layout->objectName());
818 case DomLayoutItem::Spacer: {
820 QSizePolicy::Policy sizeType = QSizePolicy::Expanding;
821 bool isVspacer =
false;
823 const DomSpacer *ui_spacer = ui_layoutItem->elementSpacer();
824 const auto &spacerProperties = ui_spacer->elementProperty();
825 if (!spacerProperties.isEmpty()) {
826 for (DomProperty *p : spacerProperties) {
827 const QVariant v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p);
830 if (p->attributeName() ==
"sizeHint"_L1 && p->kind() == DomProperty::Size) {
832 }
else if (p->attributeName() ==
"sizeType"_L1 && p->kind() == DomProperty::Enum) {
833 sizeType =
static_cast<QSizePolicy::Policy>(v.toInt());
834 }
else if (p->attributeName() ==
"orientation"_L1 && p->kind() == DomProperty::Enum) {
835 const Qt::Orientation o =
static_cast<Qt::Orientation>(v.toInt());
836 isVspacer = (o == Qt::Vertical);
841 QSpacerItem *spacer =
nullptr;
843 spacer =
new QSpacerItem(size.width(), size.height(), QSizePolicy::Minimum, sizeType);
845 spacer =
new QSpacerItem(size.width(), size.height(), sizeType, QSizePolicy::Minimum);
848 case DomLayoutItem::Layout:
849 return create(ui_layoutItem->elementLayout(), layout, parentWidget);
859
860
861void QAbstractFormBuilder::applyProperties(QObject *o,
const QList<DomProperty*> &properties)
863 for (DomProperty *p : properties) {
864 const QVariant v = toVariant(o->metaObject(), p);
866 QString attributeName = p->attributeName();
867 if (attributeName ==
"numDigits"_L1 && o->inherits(
"QLCDNumber"))
868 attributeName = u"digitCount"_s;
869 if (!d->applyPropertyInternally(o, attributeName, v))
870 o->setProperty(attributeName.toUtf8(), v);
877
878
879
880
882bool QAbstractFormBuilder::applyPropertyInternally(QObject *o,
const QString &propertyName,
const QVariant &value)
884 return d->applyPropertyInternally(o,propertyName, value);
888
889
891QVariant QAbstractFormBuilder::toVariant(
const QMetaObject *meta, DomProperty *p)
893 return domPropertyToVariant(
this, meta, p);
1053DomWidget *QAbstractFormBuilder::createDom(QWidget *widget, DomWidget *ui_parentWidget,
bool recursive)
1055 DomWidget *ui_widget =
new DomWidget();
1056 ui_widget->setAttributeClass(QLatin1StringView(widget->metaObject()->className()));
1057 ui_widget->setAttributeName(widget->objectName());
1059 ui_widget->setElementProperty(computeProperties(widget));
1062 if (QLayout *layout = widget->layout()) {
1063 if (DomLayout *ui_layout = createDom(layout,
nullptr, ui_parentWidget)) {
1064 QList<DomLayout *> ui_layouts;
1065 ui_layouts.append(ui_layout);
1067 ui_widget->setElementLayout(ui_layouts);
1073 QList<DomWidget *> ui_widgets;
1074 QList<DomAction *> ui_actions;
1075 QList<DomActionGroup *> ui_action_groups;
1077 QObjectList children;
1081#if QT_CONFIG(splitter)
1082 if (
const QSplitter *splitter = qobject_cast<
const QSplitter*>(widget)) {
1083 const int count = splitter->count();
1084 for (
int i = 0; i < count; ++i)
1085 children.append(splitter->widget(i));
1089 QObjectList childObjects = widget->children();
1091 const QWidgetList list = qvariant_cast<QWidgetList>(widget->property(
"_q_widgetOrder"));
1092 for (QWidget *w : list) {
1093 if (childObjects.contains(w)) {
1095 childObjects.removeAll(w);
1098 children += childObjects;
1100 const QWidgetList zOrder = qvariant_cast<QWidgetList>(widget->property(
"_q_zOrder"));
1101 if (list != zOrder) {
1102 QStringList zOrderList;
1103 zOrderList.reserve(zOrder.size());
1104 std::transform(zOrder.cbegin(), zOrder.cend(),
1105 std::back_inserter(zOrderList),
1106 [] (
const QWidget *w) {
return w->objectName(); });
1107 ui_widget->setElementZOrder(zOrderList);
1111 for (QObject *obj : std::as_const(children)) {
1112 if (QWidget *childWidget = qobject_cast<QWidget*>(obj)) {
1113 if (d->m_laidout.contains(childWidget) || !recursive)
1116 if (QMenu *menu = qobject_cast<QMenu *>(childWidget)) {
1117 const auto actions = menu->parentWidget()->actions();
1119 std::any_of(actions.cbegin(), actions.cend(),
1120 [menu] (
const QAction *a) {
return a->menu() == menu; });
1125 if (DomWidget *ui_child = createDom(childWidget, ui_widget)) {
1126 ui_widgets.append(ui_child);
1128 }
else if (QAction *childAction = qobject_cast<QAction*>(obj)) {
1129 if (childAction->actionGroup() !=
nullptr) {
1134 if (DomAction *ui_action = createDom(childAction)) {
1135 ui_actions.append(ui_action);
1137 }
else if (QActionGroup *childActionGroup = qobject_cast<QActionGroup*>(obj)) {
1138 if (DomActionGroup *ui_action_group = createDom(childActionGroup)) {
1139 ui_action_groups.append(ui_action_group);
1145 QList<DomActionRef *> ui_action_refs;
1146 const auto &actions = widget->actions();
1147 ui_action_refs.reserve(actions.size());
1148 for (QAction *action : actions) {
1149 if (DomActionRef *ui_action_ref = createActionRefDom(action)) {
1150 ui_action_refs.append(ui_action_ref);
1155 ui_widget->setElementWidget(ui_widgets);
1157 ui_widget->setElementAction(ui_actions);
1158 ui_widget->setElementActionGroup(ui_action_groups);
1159 ui_widget->setElementAddAction(ui_action_refs);
1161 saveExtraInfo(widget, ui_widget, ui_parentWidget);
1276DomLayout *QAbstractFormBuilder::createDom(QLayout *layout, DomLayout *ui_layout, DomWidget *ui_parentWidget)
1278 Q_UNUSED(ui_layout);
1279 DomLayout *lay =
new DomLayout();
1280 lay->setAttributeClass(QLatin1StringView(layout->metaObject()->className()));
1281 const QString objectName = layout->objectName();
1282 if (!objectName.isEmpty())
1283 lay->setAttributeName(objectName);
1284 lay->setElementProperty(computeProperties(layout));
1286 QList<FormBuilderSaveLayoutEntry> newList;
1287 if (QGridLayout *gridLayout = qobject_cast<QGridLayout *>(layout)) {
1288 newList = saveGridLayoutEntries(gridLayout);
1289#if QT_CONFIG(formlayout)
1290 }
else if (
const QFormLayout *formLayout = qobject_cast<
const QFormLayout *>(layout)) {
1291 newList = saveFormLayoutEntries(formLayout);
1294 newList = saveLayoutEntries(layout);
1297 QList<DomLayoutItem *> ui_items;
1298 ui_items.reserve(newList.size());
1299 for (
const FormBuilderSaveLayoutEntry &item : std::as_const(newList)) {
1300 if (DomLayoutItem *ui_item = createDom(item.item, lay, ui_parentWidget)) {
1302 ui_item->setAttributeRow(item.row);
1303 if (item.column >= 0)
1304 ui_item->setAttributeColumn(item.column);
1305 if (item.rowSpan > 1)
1306 ui_item->setAttributeRowSpan(item.rowSpan);
1307 if (item.columnSpan > 1)
1308 ui_item->setAttributeColSpan(item.columnSpan);
1310 ui_item->setAttributeAlignment(alignmentValue(item.alignment,
1311 d->m_fullyQualifiedEnums));
1312 ui_items.append(ui_item);
1316 lay->setElementItem(ui_items);
1387QList<DomProperty*> QAbstractFormBuilder::computeProperties(QObject *obj)
1389 QList<DomProperty*> lst;
1391 const QMetaObject *meta = obj->metaObject();
1393 QHash<QByteArray,
bool> properties;
1394 const int propertyCount = meta->propertyCount();
1395 for(
int i=0; i < propertyCount; ++i)
1396 properties.insert(meta->property(i).name(),
true);
1398 const auto propertyNames = properties.keys();
1400 const int propertyNamesCount = propertyNames.size();
1401 for(
int i=0; i<propertyNamesCount ; ++i) {
1402 const QString pname = QString::fromUtf8(propertyNames.at(i));
1403 const QMetaProperty prop = meta->property(meta->indexOfProperty(pname.toUtf8()));
1405 if (!prop.isWritable() || !checkProperty(obj, QLatin1StringView(prop.name())))
1408 const QVariant v = prop.read(obj);
1410 DomProperty *dom_prop =
nullptr;
1411 if (v.metaType().id() == QMetaType::Int) {
1412 dom_prop =
new DomProperty();
1414 if (prop.isFlagType())
1415 uiLibWarning(QCoreApplication::translate(
"QAbstractFormBuilder",
"Flags property are not supported yet."));
1417 if (prop.isEnumType()) {
1418 QString scope = QString::fromUtf8(prop.enumerator().scope());
1421 const QString e = QString::fromUtf8(prop.enumerator().valueToKey(v.toInt()));
1423 dom_prop->setElementEnum(scope + e);
1425 dom_prop->setElementNumber(v.toInt());
1426 dom_prop->setAttributeName(pname);
1428 dom_prop = createProperty(obj, pname, v);
1431 if (!dom_prop || dom_prop->kind() == DomProperty::Unknown)
1434 lst.append(dom_prop);
1579 QList<DomProperty*> *properties,
1582 static const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1583 FriendlyFB *
const formBuilder =
static_cast<FriendlyFB *>(abstractFormBuilder);
1587 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles)
1588 if ((p = formBuilder->saveText(it.second, item->data(it.first.second))))
1589 properties->append(p);
1591 auto *mo =
static_cast<
const QMetaObject *>(&QAbstractFormBuilderGadget::staticMetaObject);
1592 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1593 const QVariant v = item->data(it.first);
1594 const bool isModified = v.isValid()
1595 && (it.first != Qt::TextAlignmentRole || v.toUInt() != uint(defaultAlign));
1597 (p = variantToDomProperty(abstractFormBuilder, mo, it.second, v))) {
1598 properties->append(p);
1602 if ((p = formBuilder->saveResource(item->data(Qt::DecorationPropertyRole))))
1603 properties->append(p);
1616 const QHash<QString, DomProperty*> &properties)
1618 static const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1619 FriendlyFB *
const formBuilder =
static_cast<FriendlyFB *>(abstractFormBuilder);
1624 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles)
1625 if ((p = properties.value(it.second))) {
1626 v = formBuilder->textBuilder()->loadText(p);
1627 QVariant nativeValue = formBuilder->textBuilder()->toNativeValue(v);
1628 item->setData(it.first.first, qvariant_cast<QString>(nativeValue));
1629 item->setData(it.first.second, v);
1632 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles)
1633 if ((p = properties.value(it.second)) &&
1634 (v = formBuilder->toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p)).isValid())
1635 item->setData(it.first, v);
1637 if ((p = properties.value(strings.iconAttribute))) {
1638 v = formBuilder->resourceBuilder()->loadResource(formBuilder->workingDirectory(), p);
1639 QVariant nativeValue = formBuilder->resourceBuilder()->toNativeValue(v);
1640 item->setIcon(qvariant_cast<QIcon>(nativeValue));
1641 item->setData(Qt::DecorationPropertyRole, v);
1661void QAbstractFormBuilder::saveTreeWidgetExtraInfo(QTreeWidget *treeWidget, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1663 Q_UNUSED(ui_parentWidget);
1665 QList<DomColumn *> columns;
1668 const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1670 for (
int c = 0; c<treeWidget->columnCount(); ++c) {
1671 DomColumn *column =
new DomColumn;
1673 QList<DomProperty*> properties;
1675 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
1676 p = saveText(it.second, treeWidget->headerItem()->data(c, it.first.second));
1678 if (!p && it.first.first == Qt::EditRole && it.second ==
"text"_L1) {
1679 DomString *defaultHeader =
new DomString;
1680 defaultHeader->setText(QString::number(c + 1));
1681 defaultHeader->setAttributeNotr(u"true"_s);
1682 p =
new DomProperty;
1683 p->setAttributeName(it.second);
1684 p->setElementString(defaultHeader);
1687 properties.append(p);
1690 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles)
1691 if ((v = treeWidget->headerItem()->data(c, it.first)).isValid() &&
1692 (p = variantToDomProperty(
this, &QAbstractFormBuilderGadget::staticMetaObject, it.second, v)))
1693 properties.append(p);
1695 if ((p = saveResource(treeWidget->headerItem()->data(c, Qt::DecorationPropertyRole))))
1696 properties.append(p);
1698 column->setElementProperty(properties);
1699 columns.append(column);
1702 ui_widget->setElementColumn(columns);
1704 auto items = ui_widget->elementItem();
1706 QQueue<std::pair<QTreeWidgetItem *, DomItem *> > pendingQueue;
1707 for (
int i = 0; i < treeWidget->topLevelItemCount(); i++)
1708 pendingQueue.enqueue(std::make_pair(treeWidget->topLevelItem(i),
nullptr));
1710 while (!pendingQueue.isEmpty()) {
1711 const std::pair<QTreeWidgetItem *, DomItem *> pair = pendingQueue.dequeue();
1712 QTreeWidgetItem *item = pair.first;
1713 DomItem *parentDomItem = pair.second;
1715 DomItem *currentDomItem =
new DomItem;
1717 QList<DomProperty*> properties;
1718 for (
int c = 0; c < treeWidget->columnCount(); c++) {
1719 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles)
1720 if ((p = saveText(it.second, item->data(c, it.first.second))))
1721 properties.append(p);
1723 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles)
1724 if ((v = item->data(c, it.first)).isValid() &&
1725 (p = variantToDomProperty(
this, &QAbstractFormBuilderGadget::staticMetaObject, it.second, v)))
1726 properties.append(p);
1728 if ((p = saveResource(item->data(c, Qt::DecorationPropertyRole))))
1729 properties.append(p);
1731 storeItemFlags(item, &properties);
1732 currentDomItem->setElementProperty(properties);
1734 if (parentDomItem) {
1735 auto childrenItems = parentDomItem->elementItem();
1736 childrenItems.append(currentDomItem);
1737 parentDomItem->setElementItem(childrenItems);
1739 items.append(currentDomItem);
1741 for (
int i = 0; i < item->childCount(); i++)
1742 pendingQueue.enqueue(std::make_pair(item->child(i), currentDomItem));
1745 ui_widget->setElementItem(items);
1751void QAbstractFormBuilder::saveTableWidgetExtraInfo(QTableWidget *tableWidget, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1753 Q_UNUSED(ui_parentWidget);
1756 QList<DomColumn *> columns;
1757 auto *header = tableWidget->horizontalHeader();
1758 for (
int c = 0; c < tableWidget->columnCount(); c++) {
1759 QList<DomProperty*> properties;
1760 QTableWidgetItem *item = tableWidget->horizontalHeaderItem(c);
1762 storeItemProps(
this, item, &properties, header->defaultAlignment());
1764 DomColumn *column =
new DomColumn;
1765 column->setElementProperty(properties);
1766 columns.append(column);
1768 ui_widget->setElementColumn(columns);
1771 QList<DomRow *> rows;
1772 header = tableWidget->verticalHeader();
1773 for (
int r = 0; r < tableWidget->rowCount(); r++) {
1774 QList<DomProperty*> properties;
1775 QTableWidgetItem *item = tableWidget->verticalHeaderItem(r);
1777 storeItemProps(
this, item, &properties, header->defaultAlignment());
1779 DomRow *row =
new DomRow;
1780 row->setElementProperty(properties);
1783 ui_widget->setElementRow(rows);
1785 auto items = ui_widget->elementItem();
1786 for (
int r = 0; r < tableWidget->rowCount(); r++)
1787 for (
int c = 0; c < tableWidget->columnCount(); c++) {
1788 QTableWidgetItem *item = tableWidget->item(r, c);
1790 QList<DomProperty*> properties;
1791 storeItemPropsNFlags(
this, item, &properties);
1793 DomItem *domItem =
new DomItem;
1794 domItem->setAttributeRow(r);
1795 domItem->setAttributeColumn(c);
1796 domItem->setElementProperty(properties);
1797 items.append(domItem);
1801 ui_widget->setElementItem(items);
1827void QAbstractFormBuilder::saveComboBoxExtraInfo(QComboBox *comboBox, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1829 Q_UNUSED(ui_parentWidget);
1830 auto ui_items = ui_widget->elementItem();
1832 const int count = comboBox->count();
1833 for (
int i=0; i < count; ++i) {
1836 DomProperty *textProperty = saveText(QFormBuilderStrings::textAttribute,
1837 comboBox->itemData(i, Qt::DisplayPropertyRole));
1838 DomProperty *iconProperty = saveResource(comboBox->itemData(i, Qt::DecorationPropertyRole));
1839 if (textProperty || iconProperty) {
1840 QList<DomProperty*> properties;
1842 properties.push_back(textProperty);
1844 properties.push_back(iconProperty);
1846 DomItem *ui_item =
new DomItem();
1847 ui_item->setElementProperty(properties);
1848 ui_items.push_back(ui_item);
1852 ui_widget->setElementItem(ui_items);
1897void QAbstractFormBuilder::saveItemViewExtraInfo(
const QAbstractItemView *itemView,
1898 DomWidget *ui_widget, DomWidget *)
1900 if (
const QTreeView *treeView = qobject_cast<
const QTreeView*>(itemView)) {
1901 auto viewProperties = ui_widget->elementAttribute();
1902 const auto &headerProperties = computeProperties(treeView->header());
1903 for (
const QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
1904 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
1905 + realPropertyName.mid(1);
1906 const QString fakePropertyName =
"header"_L1 + upperPropertyName;
1907 for (DomProperty *property : headerProperties) {
1908 if (property->attributeName() == realPropertyName) {
1909 property->setAttributeName(fakePropertyName);
1910 viewProperties << property;
1914 ui_widget->setElementAttribute(viewProperties);
1915 }
else if (
const QTableView *tableView = qobject_cast<
const QTableView*>(itemView)) {
1916 auto viewProperties = ui_widget->elementAttribute();
1917 for (QLatin1StringView headerPrefix : tableHeaderPrefixes) {
1918 const auto &headerProperties = headerPrefix ==
"horizontalHeader"_L1
1919 ? computeProperties(tableView->horizontalHeader())
1920 : computeProperties(tableView->verticalHeader());
1921 for (
const QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
1922 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
1923 + realPropertyName.mid(1);
1924 const QString fakePropertyName = headerPrefix + upperPropertyName;
1925 for (DomProperty *property : std::as_const(headerProperties)) {
1926 if (property->attributeName() == realPropertyName) {
1927 property->setAttributeName(fakePropertyName);
1928 viewProperties << property;
1933 ui_widget->setElementAttribute(viewProperties);
1980void QAbstractFormBuilder::saveExtraInfo(QWidget *widget, DomWidget *ui_widget,
1981 DomWidget *ui_parentWidget)
1983 if (QListWidget *listWidget = qobject_cast<QListWidget*>(widget)) {
1984 saveListWidgetExtraInfo(listWidget, ui_widget, ui_parentWidget);
1985 }
else if (QTreeWidget *treeWidget = qobject_cast<QTreeWidget*>(widget)) {
1986 saveTreeWidgetExtraInfo(treeWidget, ui_widget, ui_parentWidget);
1987 }
else if (QTableWidget *tableWidget = qobject_cast<QTableWidget*>(widget)) {
1988 saveTableWidgetExtraInfo(tableWidget, ui_widget, ui_parentWidget);
1989 }
else if (QComboBox *comboBox = qobject_cast<QComboBox*>(widget)) {
1990 if (!qobject_cast<QFontComboBox*>(widget))
1991 saveComboBoxExtraInfo(comboBox, ui_widget, ui_parentWidget);
1992 }
else if(QAbstractButton *ab = qobject_cast<QAbstractButton *>(widget)) {
1993 saveButtonExtraInfo(ab, ui_widget, ui_parentWidget);
1995 if (QAbstractItemView *itemView = qobject_cast<QAbstractItemView *>(widget)) {
1996 saveItemViewExtraInfo(itemView, ui_widget, ui_parentWidget);
2020void QAbstractFormBuilder::loadTreeWidgetExtraInfo(DomWidget *ui_widget, QTreeWidget *treeWidget, QWidget *parentWidget)
2022 Q_UNUSED(parentWidget);
2023 const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
2024 const QMetaEnum itemFlags_enum = metaEnum<QAbstractFormBuilderGadget>(
"itemFlags");
2025 const auto &columns = ui_widget->elementColumn();
2026 if (!columns.isEmpty())
2027 treeWidget->setColumnCount(columns.size());
2029 for (qsizetype i = 0, size = columns.size(); i < size; ++i) {
2030 const DomColumn *c = columns.at(i);
2031 const DomPropertyHash properties = propertyMap(c->elementProperty());
2036 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles)
2037 if ((p = properties.value(it.second)) &&
2038 (v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p)).isValid())
2039 treeWidget->headerItem()->setData(i, it.first, v);
2041 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles)
2042 if ((p = properties.value(it.second))) {
2043 v = textBuilder()->loadText(p);
2044 QVariant nativeValue = textBuilder()->toNativeValue(v);
2045 treeWidget->headerItem()->setData(i, it.first.first, qvariant_cast<QString>(nativeValue));
2046 treeWidget->headerItem()->setData(i, it.first.second, v);
2049 if ((p = properties.value(QFormBuilderStrings::iconAttribute))) {
2050 v = resourceBuilder()->loadResource(workingDirectory(), p);
2051 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
2052 treeWidget->headerItem()->setIcon(i, qvariant_cast<QIcon>(nativeValue));
2053 treeWidget->headerItem()->setData(i, Qt::DecorationPropertyRole, v);
2057 QQueue<std::pair<DomItem *, QTreeWidgetItem *> > pendingQueue;
2058 const auto &widgetElementItem = ui_widget->elementItem();
2059 for (DomItem *ui_item : widgetElementItem)
2060 pendingQueue.enqueue(std::make_pair(ui_item,
nullptr));
2062 while (!pendingQueue.isEmpty()) {
2063 const std::pair<DomItem *, QTreeWidgetItem *> pair = pendingQueue.dequeue();
2064 const DomItem *domItem = pair.first;
2065 QTreeWidgetItem *parentItem = pair.second;
2067 QTreeWidgetItem *currentItem =
nullptr;
2070 currentItem =
new QTreeWidgetItem(parentItem);
2072 currentItem =
new QTreeWidgetItem(treeWidget);
2074 const auto &properties = domItem->elementProperty();
2076 for (DomProperty *property : properties) {
2077 if (property->attributeName() == QFormBuilderStrings::flagsAttribute
2078 && !property->elementSet().isEmpty()) {
2079 currentItem->setFlags(enumKeysToValue<Qt::ItemFlags>(itemFlags_enum, property->elementSet().toLatin1()));
2080 }
else if (property->attributeName() == QFormBuilderStrings::textAttribute
2081 && property->elementString()) {
2083 QVariant textV = textBuilder()->loadText(property);
2084 QVariant nativeValue = textBuilder()->toNativeValue(textV);
2085 currentItem->setText(col, qvariant_cast<QString>(nativeValue));
2086 currentItem->setData(col, Qt::DisplayPropertyRole, textV);
2087 }
else if (col >= 0) {
2088 if (property->attributeName() == QFormBuilderStrings::iconAttribute) {
2089 QVariant v = resourceBuilder()->loadResource(workingDirectory(), property);
2091 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
2092 currentItem->setIcon(col, qvariant_cast<QIcon>(nativeValue));
2093 currentItem->setData(col, Qt::DecorationPropertyRole, v);
2097 int role = strings.treeItemRoleHash.value(property->attributeName(), (Qt::ItemDataRole)-1);
2099 if ((v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, property)).isValid())
2100 currentItem->setData(col, role, v);
2102 std::pair<Qt::ItemDataRole, Qt::ItemDataRole> rolePair =
2103 strings.treeItemTextRoleHash.value(property->attributeName(),
2104 std::make_pair((Qt::ItemDataRole)-1, (Qt::ItemDataRole)-1));
2105 if (rolePair.first >= 0) {
2106 QVariant textV = textBuilder()->loadText(property);
2107 QVariant nativeValue = textBuilder()->toNativeValue(textV);
2108 currentItem->setData(col, rolePair.first, qvariant_cast<QString>(nativeValue));
2109 currentItem->setData(col, rolePair.second, textV);
2116 const auto &elementItem = domItem->elementItem();
2117 for (DomItem *childItem : elementItem)
2118 pendingQueue.enqueue(std::make_pair(childItem, currentItem));
2126void QAbstractFormBuilder::loadTableWidgetExtraInfo(DomWidget *ui_widget, QTableWidget *tableWidget, QWidget *parentWidget)
2128 Q_UNUSED(parentWidget);
2130 const auto &columns = ui_widget->elementColumn();
2131 if (!columns.isEmpty())
2132 tableWidget->setColumnCount(columns.size());
2133 for (qsizetype i = 0, size = columns.size(); i < size; ++i) {
2134 DomColumn *c = columns.at(i);
2135 const DomPropertyHash properties = propertyMap(c->elementProperty());
2137 if (!properties.isEmpty()) {
2138 QTableWidgetItem *item =
new QTableWidgetItem;
2139 loadItemProps(
this, item, properties);
2140 tableWidget->setHorizontalHeaderItem(i, item);
2144 const auto &rows = ui_widget->elementRow();
2145 if (!rows.isEmpty())
2146 tableWidget->setRowCount(rows.size());
2147 for (qsizetype i = 0, size = rows.size(); i < size; ++i) {
2148 const DomRow *r = rows.at(i);
2149 const DomPropertyHash properties = propertyMap(r->elementProperty());
2151 if (!properties.isEmpty()) {
2152 QTableWidgetItem *item =
new QTableWidgetItem;
2153 loadItemProps(
this, item, properties);
2154 tableWidget->setVerticalHeaderItem(i, item);
2158 const auto &elementItem = ui_widget->elementItem();
2159 for (DomItem *ui_item : elementItem) {
2160 if (ui_item->hasAttributeRow() && ui_item->hasAttributeColumn()) {
2161 const DomPropertyHash properties = propertyMap(ui_item->elementProperty());
2162 QTableWidgetItem *item =
new QTableWidgetItem;
2163 loadItemPropsNFlags(
this, item, properties);
2164 tableWidget->setItem(ui_item->attributeRow(), ui_item->attributeColumn(), item);
2172void QAbstractFormBuilder::loadComboBoxExtraInfo(DomWidget *ui_widget, QComboBox *comboBox, QWidget *parentWidget)
2174 Q_UNUSED(parentWidget);
2175 const auto &elementItem = ui_widget->elementItem();
2176 for (DomItem *ui_item : elementItem) {
2177 const auto &properties = ui_item->elementProperty();
2183 DomProperty *p = QFBE::propertyByName(properties, QFormBuilderStrings::textAttribute);
2184 if (p && p->elementString()) {
2185 textData = textBuilder()->loadText(p);
2186 text = qvariant_cast<QString>(textBuilder()->toNativeValue(textData));
2189 p = QFBE::propertyByName(properties, QFormBuilderStrings::iconAttribute);
2191 iconData = resourceBuilder()->loadResource(workingDirectory(), p);
2192 icon = qvariant_cast<QIcon>(resourceBuilder()->toNativeValue(iconData));
2195 comboBox->addItem(icon, text);
2196 comboBox->setItemData((comboBox->count()-1), iconData, Qt::DecorationPropertyRole);
2197 comboBox->setItemData((comboBox->count()-1), textData, Qt::DisplayPropertyRole);
2200 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2201 comboBox->setCurrentIndex(currentIndex->elementNumber());
2223void QAbstractFormBuilder::loadButtonExtraInfo(
const DomWidget *ui_widget, QAbstractButton *button, QWidget *)
2225 using ButtonGroupHash = QFormBuilderExtra::ButtonGroupHash;
2227 const QString groupName = buttonGroupName(ui_widget);
2228 if (groupName.isEmpty())
2231 ButtonGroupHash &buttonGroups = d->buttonGroups();
2232 const auto it = buttonGroups.find(groupName);
2233 if (it == buttonGroups.end()) {
2234#ifdef QFORMINTERNAL_NAMESPACE
2235 uiLibWarning(QCoreApplication::translate(
"QAbstractFormBuilder",
"Invalid QButtonGroup reference '%1' referenced by '%2'.").arg(groupName, button->objectName()));
2240 QButtonGroup *&group = it.value().second;
2241 if (group ==
nullptr) {
2242 group =
new QButtonGroup;
2243 group->setObjectName(groupName);
2244 applyProperties(group, it.value().first->elementProperty());
2246 group->addButton(button);
2253void QAbstractFormBuilder::loadItemViewExtraInfo(DomWidget *ui_widget, QAbstractItemView *itemView,
2256 if (QTreeView *treeView = qobject_cast<QTreeView*>(itemView)) {
2257 const auto &allAttributes = ui_widget->elementAttribute();
2258 QList<DomProperty *> headerProperties;
2259 for (QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
2260 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
2261 + realPropertyName.mid(1);
2262 const QString fakePropertyName =
"header"_L1 + upperPropertyName;
2263 for (DomProperty *attr : allAttributes) {
2264 if (attr->attributeName() == fakePropertyName) {
2265 attr->setAttributeName(realPropertyName);
2266 headerProperties << attr;
2270 applyProperties(treeView->header(), headerProperties);
2271 }
else if (QTableView *tableView = qobject_cast<QTableView*>(itemView)) {
2272 const auto &allAttributes = ui_widget->elementAttribute();
2273 for (QLatin1StringView headerPrefix : tableHeaderPrefixes) {
2274 QList<DomProperty*> headerProperties;
2275 for (QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
2276 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
2277 + realPropertyName.mid(1);
2278 const QString fakePropertyName = headerPrefix + upperPropertyName;
2279 for (DomProperty *attr : allAttributes) {
2280 if (attr->attributeName() == fakePropertyName) {
2281 attr->setAttributeName(realPropertyName);
2282 headerProperties << attr;
2286 if (headerPrefix ==
"horizontalHeader"_L1)
2287 applyProperties(tableView->horizontalHeader(), headerProperties);
2289 applyProperties(tableView->verticalHeader(), headerProperties);
2297void QAbstractFormBuilder::loadExtraInfo(DomWidget *ui_widget, QWidget *widget, QWidget *parentWidget)
2300#if QT_CONFIG(listwidget)
2301 }
else if (QListWidget *listWidget = qobject_cast<QListWidget*>(widget)) {
2302 loadListWidgetExtraInfo(ui_widget, listWidget, parentWidget);
2304#if QT_CONFIG(treewidget)
2305 }
else if (QTreeWidget *treeWidget = qobject_cast<QTreeWidget*>(widget)) {
2306 loadTreeWidgetExtraInfo(ui_widget, treeWidget, parentWidget);
2308#if QT_CONFIG(tablewidget)
2309 }
else if (QTableWidget *tableWidget = qobject_cast<QTableWidget*>(widget)) {
2310 loadTableWidgetExtraInfo(ui_widget, tableWidget, parentWidget);
2312#if QT_CONFIG(combobox)
2313 }
else if (QComboBox *comboBox = qobject_cast<QComboBox*>(widget)) {
2314 if (!qobject_cast<QFontComboBox *>(widget))
2315 loadComboBoxExtraInfo(ui_widget, comboBox, parentWidget);
2317#if QT_CONFIG(tabwidget)
2318 }
else if (QTabWidget *tabWidget = qobject_cast<QTabWidget*>(widget)) {
2319 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2320 tabWidget->setCurrentIndex(currentIndex->elementNumber());
2322#if QT_CONFIG(stackedwidget)
2323 }
else if (QStackedWidget *stackedWidget = qobject_cast<QStackedWidget*>(widget)) {
2324 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2325 stackedWidget->setCurrentIndex(currentIndex->elementNumber());
2327#if QT_CONFIG(toolbox)
2328 }
else if (QToolBox *toolBox = qobject_cast<QToolBox*>(widget)) {
2329 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2330 toolBox->setCurrentIndex(currentIndex->elementNumber());
2331 if (
auto *tabSpacing = QFBE::propertyByName(ui_widget->elementProperty(),
"tabSpacing"))
2332 toolBox->layout()->setSpacing(tabSpacing->elementNumber());
2334 }
else if (QAbstractButton *ab = qobject_cast<QAbstractButton *>(widget)) {
2335 loadButtonExtraInfo(ui_widget, ab, parentWidget);
2337 if (QAbstractItemView *itemView = qobject_cast<QAbstractItemView *>(widget)) {
2338 loadItemViewExtraInfo(ui_widget, itemView, parentWidget);