1069DomWidget *QAbstractFormBuilder::createDom(QWidget *widget, DomWidget *ui_parentWidget,
bool recursive)
1071 DomWidget *ui_widget =
new DomWidget();
1072 ui_widget->setAttributeClass(QLatin1StringView(widget->metaObject()->className()));
1073 ui_widget->setAttributeName(widget->objectName());
1075 ui_widget->setElementProperty(computeProperties(widget));
1078 if (QLayout *layout = widget->layout()) {
1079 if (DomLayout *ui_layout = createDom(layout,
nullptr, ui_parentWidget)) {
1080 QList<DomLayout *> ui_layouts;
1081 ui_layouts.append(ui_layout);
1083 ui_widget->setElementLayout(ui_layouts);
1089 QList<DomWidget *> ui_widgets;
1090 QList<DomAction *> ui_actions;
1091 QList<DomActionGroup *> ui_action_groups;
1093 QObjectList children;
1097#if QT_CONFIG(splitter)
1098 if (
const QSplitter *splitter = qobject_cast<
const QSplitter*>(widget)) {
1099 const int count = splitter->count();
1100 for (
int i = 0; i < count; ++i)
1101 children.append(splitter->widget(i));
1105 QObjectList childObjects = widget->children();
1107 const QWidgetList list = qvariant_cast<QWidgetList>(widget->property(
"_q_widgetOrder"));
1108 for (QWidget *w : list) {
1109 if (childObjects.contains(w)) {
1111 childObjects.removeAll(w);
1114 children += childObjects;
1116 const QWidgetList zOrder = qvariant_cast<QWidgetList>(widget->property(
"_q_zOrder"));
1117 if (list != zOrder) {
1118 QStringList zOrderList;
1119 zOrderList.reserve(zOrder.size());
1120 std::transform(zOrder.cbegin(), zOrder.cend(),
1121 std::back_inserter(zOrderList),
1122 [] (
const QWidget *w) {
return w->objectName(); });
1123 ui_widget->setElementZOrder(zOrderList);
1127 for (QObject *obj : std::as_const(children)) {
1128 if (QWidget *childWidget = qobject_cast<QWidget*>(obj)) {
1129 if (d->m_laidout.contains(childWidget) || !recursive)
1132 if (QMenu *menu = qobject_cast<QMenu *>(childWidget)) {
1133 const auto actions = menu->parentWidget()->actions();
1135 std::any_of(actions.cbegin(), actions.cend(),
1136 [menu] (
const QAction *a) {
return a->menu() == menu; });
1141 if (DomWidget *ui_child = createDom(childWidget, ui_widget)) {
1142 ui_widgets.append(ui_child);
1144 }
else if (QAction *childAction = qobject_cast<QAction*>(obj)) {
1145 if (childAction->actionGroup() !=
nullptr) {
1150 if (DomAction *ui_action = createDom(childAction)) {
1151 ui_actions.append(ui_action);
1153 }
else if (QActionGroup *childActionGroup = qobject_cast<QActionGroup*>(obj)) {
1154 if (DomActionGroup *ui_action_group = createDom(childActionGroup)) {
1155 ui_action_groups.append(ui_action_group);
1161 QList<DomActionRef *> ui_action_refs;
1162 const auto &actions = widget->actions();
1163 ui_action_refs.reserve(actions.size());
1164 for (QAction *action : actions) {
1165 if (DomActionRef *ui_action_ref = createActionRefDom(action)) {
1166 ui_action_refs.append(ui_action_ref);
1171 ui_widget->setElementWidget(ui_widgets);
1173 ui_widget->setElementAction(ui_actions);
1174 ui_widget->setElementActionGroup(ui_action_groups);
1175 ui_widget->setElementAddAction(ui_action_refs);
1177 saveExtraInfo(widget, ui_widget, ui_parentWidget);
1292DomLayout *QAbstractFormBuilder::createDom(QLayout *layout, DomLayout *ui_layout, DomWidget *ui_parentWidget)
1294 Q_UNUSED(ui_layout);
1295 DomLayout *lay =
new DomLayout();
1296 lay->setAttributeClass(QLatin1StringView(layout->metaObject()->className()));
1297 const QString objectName = layout->objectName();
1298 if (!objectName.isEmpty())
1299 lay->setAttributeName(objectName);
1300 lay->setElementProperty(computeProperties(layout));
1302 QList<FormBuilderSaveLayoutEntry> newList;
1303 if (QGridLayout *gridLayout = qobject_cast<QGridLayout *>(layout)) {
1304 newList = saveGridLayoutEntries(gridLayout);
1305#if QT_CONFIG(formlayout)
1306 }
else if (
const QFormLayout *formLayout = qobject_cast<
const QFormLayout *>(layout)) {
1307 newList = saveFormLayoutEntries(formLayout);
1310 newList = saveLayoutEntries(layout);
1313 QList<DomLayoutItem *> ui_items;
1314 ui_items.reserve(newList.size());
1315 for (
const FormBuilderSaveLayoutEntry &item : std::as_const(newList)) {
1316 if (DomLayoutItem *ui_item = createDom(item.item, lay, ui_parentWidget)) {
1318 ui_item->setAttributeRow(item.row);
1319 if (item.column >= 0)
1320 ui_item->setAttributeColumn(item.column);
1321 if (item.rowSpan > 1)
1322 ui_item->setAttributeRowSpan(item.rowSpan);
1323 if (item.columnSpan > 1)
1324 ui_item->setAttributeColSpan(item.columnSpan);
1326 ui_item->setAttributeAlignment(alignmentValue(item.alignment,
1327 d->m_fullyQualifiedEnums));
1328 ui_items.append(ui_item);
1332 lay->setElementItem(ui_items);
1403QList<DomProperty*> QAbstractFormBuilder::computeProperties(QObject *obj)
1405 QList<DomProperty*> lst;
1407 const QMetaObject *meta = obj->metaObject();
1409 QHash<QByteArray,
bool> properties;
1410 const int propertyCount = meta->propertyCount();
1411 for(
int i=0; i < propertyCount; ++i)
1412 properties.insert(meta->property(i).name(),
true);
1414 const auto propertyNames = properties.keys();
1416 const int propertyNamesCount = propertyNames.size();
1417 for(
int i=0; i<propertyNamesCount ; ++i) {
1418 const QString pname = QString::fromUtf8(propertyNames.at(i));
1419 const QMetaProperty prop = meta->property(meta->indexOfProperty(pname.toUtf8()));
1421 if (!prop.isWritable() || !checkProperty(obj, QLatin1StringView(prop.name())))
1424 const QVariant v = prop.read(obj);
1426 DomProperty *dom_prop =
nullptr;
1427 if (v.metaType().id() == QMetaType::Int) {
1428 dom_prop =
new DomProperty();
1430 if (prop.isFlagType())
1431 uiLibWarning(QCoreApplication::translate(
"QAbstractFormBuilder",
"Flags property are not supported yet."));
1433 if (prop.isEnumType()) {
1434 QString scope = QString::fromUtf8(prop.enumerator().scope());
1437 const QString e = QString::fromUtf8(prop.enumerator().valueToKey(v.toInt()));
1439 dom_prop->setElementEnum(scope + e);
1441 dom_prop->setElementNumber(v.toInt());
1442 dom_prop->setAttributeName(pname);
1444 dom_prop = createProperty(obj, pname, v);
1447 if (!dom_prop || dom_prop->kind() == DomProperty::Unknown)
1450 lst.append(dom_prop);
1595 QList<DomProperty*> *properties,
1598 static const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1599 FriendlyFB *
const formBuilder =
static_cast<FriendlyFB *>(abstractFormBuilder);
1603 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles)
1604 if ((p = formBuilder->saveText(it.second, item->data(it.first.second))))
1605 properties->append(p);
1607 auto *mo =
static_cast<
const QMetaObject *>(&QAbstractFormBuilderGadget::staticMetaObject);
1608 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1609 const QVariant v = item->data(it.first);
1610 const bool isModified = v.isValid()
1611 && (it.first != Qt::TextAlignmentRole || v.toUInt() != uint(defaultAlign));
1613 (p = variantToDomProperty(abstractFormBuilder, mo, it.second, v))) {
1614 properties->append(p);
1618 if ((p = formBuilder->saveResource(item->data(Qt::DecorationPropertyRole))))
1619 properties->append(p);
1632 const QHash<QString, DomProperty*> &properties)
1634 static const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1635 FriendlyFB *
const formBuilder =
static_cast<FriendlyFB *>(abstractFormBuilder);
1640 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles)
1641 if ((p = properties.value(it.second))) {
1642 v = formBuilder->textBuilder()->loadText(p);
1643 QVariant nativeValue = formBuilder->textBuilder()->toNativeValue(v);
1644 item->setData(it.first.first, qvariant_cast<QString>(nativeValue));
1645 item->setData(it.first.second, v);
1648 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles)
1649 if ((p = properties.value(it.second)) &&
1650 (v = formBuilder->toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p)).isValid())
1651 item->setData(it.first, v);
1653 if ((p = properties.value(strings.iconAttribute))) {
1654 v = formBuilder->resourceBuilder()->loadResource(formBuilder->workingDirectory(), p);
1655 QVariant nativeValue = formBuilder->resourceBuilder()->toNativeValue(v);
1656 item->setIcon(qvariant_cast<QIcon>(nativeValue));
1657 item->setData(Qt::DecorationPropertyRole, v);
1677void QAbstractFormBuilder::saveTreeWidgetExtraInfo(QTreeWidget *treeWidget, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1679 Q_UNUSED(ui_parentWidget);
1681 QList<DomColumn *> columns;
1684 const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1686 for (
int c = 0; c<treeWidget->columnCount(); ++c) {
1687 DomColumn *column =
new DomColumn;
1689 QList<DomProperty*> properties;
1691 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
1692 p = saveText(it.second, treeWidget->headerItem()->data(c, it.first.second));
1694 if (!p && it.first.first == Qt::EditRole && it.second ==
"text"_L1) {
1695 DomString *defaultHeader =
new DomString;
1696 defaultHeader->setText(QString::number(c + 1));
1697 defaultHeader->setAttributeNotr(u"true"_s);
1698 p =
new DomProperty;
1699 p->setAttributeName(it.second);
1700 p->setElementString(defaultHeader);
1703 properties.append(p);
1706 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles)
1707 if ((v = treeWidget->headerItem()->data(c, it.first)).isValid() &&
1708 (p = variantToDomProperty(
this, &QAbstractFormBuilderGadget::staticMetaObject, it.second, v)))
1709 properties.append(p);
1711 if ((p = saveResource(treeWidget->headerItem()->data(c, Qt::DecorationPropertyRole))))
1712 properties.append(p);
1714 column->setElementProperty(properties);
1715 columns.append(column);
1718 ui_widget->setElementColumn(columns);
1720 auto items = ui_widget->elementItem();
1722 QQueue<std::pair<QTreeWidgetItem *, DomItem *> > pendingQueue;
1723 for (
int i = 0; i < treeWidget->topLevelItemCount(); i++)
1724 pendingQueue.enqueue(std::make_pair(treeWidget->topLevelItem(i),
nullptr));
1726 while (!pendingQueue.isEmpty()) {
1727 const std::pair<QTreeWidgetItem *, DomItem *> pair = pendingQueue.dequeue();
1728 QTreeWidgetItem *item = pair.first;
1729 DomItem *parentDomItem = pair.second;
1731 DomItem *currentDomItem =
new DomItem;
1733 QList<DomProperty*> properties;
1734 for (
int c = 0; c < treeWidget->columnCount(); c++) {
1735 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles)
1736 if ((p = saveText(it.second, item->data(c, it.first.second))))
1737 properties.append(p);
1739 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles)
1740 if ((v = item->data(c, it.first)).isValid() &&
1741 (p = variantToDomProperty(
this, &QAbstractFormBuilderGadget::staticMetaObject, it.second, v)))
1742 properties.append(p);
1744 if ((p = saveResource(item->data(c, Qt::DecorationPropertyRole))))
1745 properties.append(p);
1747 storeItemFlags(item, &properties);
1748 currentDomItem->setElementProperty(properties);
1750 if (parentDomItem) {
1751 auto childrenItems = parentDomItem->elementItem();
1752 childrenItems.append(currentDomItem);
1753 parentDomItem->setElementItem(childrenItems);
1755 items.append(currentDomItem);
1757 for (
int i = 0; i < item->childCount(); i++)
1758 pendingQueue.enqueue(std::make_pair(item->child(i), currentDomItem));
1761 ui_widget->setElementItem(items);
1767void QAbstractFormBuilder::saveTableWidgetExtraInfo(QTableWidget *tableWidget, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1769 Q_UNUSED(ui_parentWidget);
1772 QList<DomColumn *> columns;
1773 auto *header = tableWidget->horizontalHeader();
1774 for (
int c = 0; c < tableWidget->columnCount(); c++) {
1775 QList<DomProperty*> properties;
1776 QTableWidgetItem *item = tableWidget->horizontalHeaderItem(c);
1778 storeItemProps(
this, item, &properties, header->defaultAlignment());
1780 DomColumn *column =
new DomColumn;
1781 column->setElementProperty(properties);
1782 columns.append(column);
1784 ui_widget->setElementColumn(columns);
1787 QList<DomRow *> rows;
1788 header = tableWidget->verticalHeader();
1789 for (
int r = 0; r < tableWidget->rowCount(); r++) {
1790 QList<DomProperty*> properties;
1791 QTableWidgetItem *item = tableWidget->verticalHeaderItem(r);
1793 storeItemProps(
this, item, &properties, header->defaultAlignment());
1795 DomRow *row =
new DomRow;
1796 row->setElementProperty(properties);
1799 ui_widget->setElementRow(rows);
1801 auto items = ui_widget->elementItem();
1802 for (
int r = 0; r < tableWidget->rowCount(); r++)
1803 for (
int c = 0; c < tableWidget->columnCount(); c++) {
1804 QTableWidgetItem *item = tableWidget->item(r, c);
1806 QList<DomProperty*> properties;
1807 storeItemPropsNFlags(
this, item, &properties);
1809 DomItem *domItem =
new DomItem;
1810 domItem->setAttributeRow(r);
1811 domItem->setAttributeColumn(c);
1812 domItem->setElementProperty(properties);
1813 items.append(domItem);
1817 ui_widget->setElementItem(items);
1843void QAbstractFormBuilder::saveComboBoxExtraInfo(QComboBox *comboBox, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1845 Q_UNUSED(ui_parentWidget);
1846 auto ui_items = ui_widget->elementItem();
1848 const int count = comboBox->count();
1849 for (
int i=0; i < count; ++i) {
1852 DomProperty *textProperty = saveText(QFormBuilderStrings::textAttribute,
1853 comboBox->itemData(i, Qt::DisplayPropertyRole));
1854 DomProperty *iconProperty = saveResource(comboBox->itemData(i, Qt::DecorationPropertyRole));
1855 if (textProperty || iconProperty) {
1856 QList<DomProperty*> properties;
1858 properties.push_back(textProperty);
1860 properties.push_back(iconProperty);
1862 DomItem *ui_item =
new DomItem();
1863 ui_item->setElementProperty(properties);
1864 ui_items.push_back(ui_item);
1868 ui_widget->setElementItem(ui_items);
1913void QAbstractFormBuilder::saveItemViewExtraInfo(
const QAbstractItemView *itemView,
1914 DomWidget *ui_widget, DomWidget *)
1916 if (
const QTreeView *treeView = qobject_cast<
const QTreeView*>(itemView)) {
1917 auto viewProperties = ui_widget->elementAttribute();
1918 const auto &headerProperties = computeProperties(treeView->header());
1919 for (
const QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
1920 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
1921 + realPropertyName.mid(1);
1922 const QString fakePropertyName =
"header"_L1 + upperPropertyName;
1923 for (DomProperty *property : headerProperties) {
1924 if (property->attributeName() == realPropertyName) {
1925 property->setAttributeName(fakePropertyName);
1926 viewProperties << property;
1930 ui_widget->setElementAttribute(viewProperties);
1931 }
else if (
const QTableView *tableView = qobject_cast<
const QTableView*>(itemView)) {
1932 auto viewProperties = ui_widget->elementAttribute();
1933 for (QLatin1StringView headerPrefix : tableHeaderPrefixes) {
1934 const auto &headerProperties = headerPrefix ==
"horizontalHeader"_L1
1935 ? computeProperties(tableView->horizontalHeader())
1936 : computeProperties(tableView->verticalHeader());
1937 for (
const QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
1938 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
1939 + realPropertyName.mid(1);
1940 const QString fakePropertyName = headerPrefix + upperPropertyName;
1941 for (DomProperty *property : std::as_const(headerProperties)) {
1942 if (property->attributeName() == realPropertyName) {
1943 property->setAttributeName(fakePropertyName);
1944 viewProperties << property;
1949 ui_widget->setElementAttribute(viewProperties);
1996void QAbstractFormBuilder::saveExtraInfo(QWidget *widget, DomWidget *ui_widget,
1997 DomWidget *ui_parentWidget)
2000#if QT_CONFIG(listwidget)
2001 }
else if (QListWidget *listWidget = qobject_cast<QListWidget*>(widget)) {
2002 saveListWidgetExtraInfo(listWidget, ui_widget, ui_parentWidget);
2004#if QT_CONFIG(treewidget)
2005 }
else if (QTreeWidget *treeWidget = qobject_cast<QTreeWidget*>(widget)) {
2006 saveTreeWidgetExtraInfo(treeWidget, ui_widget, ui_parentWidget);
2008#if QT_CONFIG(tablewidget)
2009 }
else if (QTableWidget *tableWidget = qobject_cast<QTableWidget*>(widget)) {
2010 saveTableWidgetExtraInfo(tableWidget, ui_widget, ui_parentWidget);
2012#if QT_CONFIG(combobox)
2013 }
else if (QComboBox *comboBox = qobject_cast<QComboBox*>(widget)) {
2014 if (!QFormBuilderExtra::isQFontComboBox(widget))
2015 saveComboBoxExtraInfo(comboBox, ui_widget, ui_parentWidget);
2017 }
else if(QAbstractButton *ab = qobject_cast<QAbstractButton *>(widget)) {
2018 saveButtonExtraInfo(ab, ui_widget, ui_parentWidget);
2020 if (QAbstractItemView *itemView = qobject_cast<QAbstractItemView *>(widget)) {
2021 saveItemViewExtraInfo(itemView, ui_widget, ui_parentWidget);
2045void QAbstractFormBuilder::loadTreeWidgetExtraInfo(DomWidget *ui_widget, QTreeWidget *treeWidget, QWidget *parentWidget)
2047 Q_UNUSED(parentWidget);
2048 const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
2049 const QMetaEnum itemFlags_enum = metaEnum<QAbstractFormBuilderGadget>(
"itemFlags");
2050 const auto &columns = ui_widget->elementColumn();
2051 if (!columns.isEmpty())
2052 treeWidget->setColumnCount(columns.size());
2054 for (qsizetype i = 0, size = columns.size(); i < size; ++i) {
2055 const DomColumn *c = columns.at(i);
2056 const DomPropertyHash properties = propertyMap(c->elementProperty());
2061 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles)
2062 if ((p = properties.value(it.second)) &&
2063 (v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p)).isValid())
2064 treeWidget->headerItem()->setData(i, it.first, v);
2066 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles)
2067 if ((p = properties.value(it.second))) {
2068 v = textBuilder()->loadText(p);
2069 QVariant nativeValue = textBuilder()->toNativeValue(v);
2070 treeWidget->headerItem()->setData(i, it.first.first, qvariant_cast<QString>(nativeValue));
2071 treeWidget->headerItem()->setData(i, it.first.second, v);
2074 if ((p = properties.value(QFormBuilderStrings::iconAttribute))) {
2075 v = resourceBuilder()->loadResource(workingDirectory(), p);
2076 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
2077 treeWidget->headerItem()->setIcon(i, qvariant_cast<QIcon>(nativeValue));
2078 treeWidget->headerItem()->setData(i, Qt::DecorationPropertyRole, v);
2082 QQueue<std::pair<DomItem *, QTreeWidgetItem *> > pendingQueue;
2083 const auto &widgetElementItem = ui_widget->elementItem();
2084 for (DomItem *ui_item : widgetElementItem)
2085 pendingQueue.enqueue(std::make_pair(ui_item,
nullptr));
2087 while (!pendingQueue.isEmpty()) {
2088 const std::pair<DomItem *, QTreeWidgetItem *> pair = pendingQueue.dequeue();
2089 const DomItem *domItem = pair.first;
2090 QTreeWidgetItem *parentItem = pair.second;
2092 QTreeWidgetItem *currentItem =
nullptr;
2095 currentItem =
new QTreeWidgetItem(parentItem);
2097 currentItem =
new QTreeWidgetItem(treeWidget);
2099 const auto &properties = domItem->elementProperty();
2101 for (DomProperty *property : properties) {
2102 if (property->attributeName() == QFormBuilderStrings::flagsAttribute
2103 && !property->elementSet().isEmpty()) {
2104 currentItem->setFlags(enumKeysToValue<Qt::ItemFlags>(itemFlags_enum, property->elementSet().toLatin1()));
2105 }
else if (property->attributeName() == QFormBuilderStrings::textAttribute
2106 && property->elementString()) {
2108 QVariant textV = textBuilder()->loadText(property);
2109 QVariant nativeValue = textBuilder()->toNativeValue(textV);
2110 currentItem->setText(col, qvariant_cast<QString>(nativeValue));
2111 currentItem->setData(col, Qt::DisplayPropertyRole, textV);
2112 }
else if (col >= 0) {
2113 if (property->attributeName() == QFormBuilderStrings::iconAttribute) {
2114 QVariant v = resourceBuilder()->loadResource(workingDirectory(), property);
2116 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
2117 currentItem->setIcon(col, qvariant_cast<QIcon>(nativeValue));
2118 currentItem->setData(col, Qt::DecorationPropertyRole, v);
2122 int role = strings.treeItemRoleHash.value(property->attributeName(), (Qt::ItemDataRole)-1);
2124 if ((v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, property)).isValid())
2125 currentItem->setData(col, role, v);
2127 std::pair<Qt::ItemDataRole, Qt::ItemDataRole> rolePair =
2128 strings.treeItemTextRoleHash.value(property->attributeName(),
2129 std::make_pair((Qt::ItemDataRole)-1, (Qt::ItemDataRole)-1));
2130 if (rolePair.first >= 0) {
2131 QVariant textV = textBuilder()->loadText(property);
2132 QVariant nativeValue = textBuilder()->toNativeValue(textV);
2133 currentItem->setData(col, rolePair.first, qvariant_cast<QString>(nativeValue));
2134 currentItem->setData(col, rolePair.second, textV);
2141 const auto &elementItem = domItem->elementItem();
2142 for (DomItem *childItem : elementItem)
2143 pendingQueue.enqueue(std::make_pair(childItem, currentItem));
2151void QAbstractFormBuilder::loadTableWidgetExtraInfo(DomWidget *ui_widget, QTableWidget *tableWidget, QWidget *parentWidget)
2153 Q_UNUSED(parentWidget);
2155 const auto &columns = ui_widget->elementColumn();
2156 if (!columns.isEmpty())
2157 tableWidget->setColumnCount(columns.size());
2158 for (qsizetype i = 0, size = columns.size(); i < size; ++i) {
2159 DomColumn *c = columns.at(i);
2160 const DomPropertyHash properties = propertyMap(c->elementProperty());
2162 if (!properties.isEmpty()) {
2163 QTableWidgetItem *item =
new QTableWidgetItem;
2164 loadItemProps(
this, item, properties);
2165 tableWidget->setHorizontalHeaderItem(i, item);
2169 const auto &rows = ui_widget->elementRow();
2170 if (!rows.isEmpty())
2171 tableWidget->setRowCount(rows.size());
2172 for (qsizetype i = 0, size = rows.size(); i < size; ++i) {
2173 const DomRow *r = rows.at(i);
2174 const DomPropertyHash properties = propertyMap(r->elementProperty());
2176 if (!properties.isEmpty()) {
2177 QTableWidgetItem *item =
new QTableWidgetItem;
2178 loadItemProps(
this, item, properties);
2179 tableWidget->setVerticalHeaderItem(i, item);
2183 const auto &elementItem = ui_widget->elementItem();
2184 for (DomItem *ui_item : elementItem) {
2185 if (ui_item->hasAttributeRow() && ui_item->hasAttributeColumn()) {
2186 const DomPropertyHash properties = propertyMap(ui_item->elementProperty());
2187 QTableWidgetItem *item =
new QTableWidgetItem;
2188 loadItemPropsNFlags(
this, item, properties);
2189 tableWidget->setItem(ui_item->attributeRow(), ui_item->attributeColumn(), item);
2197void QAbstractFormBuilder::loadComboBoxExtraInfo(DomWidget *ui_widget, QComboBox *comboBox, QWidget *parentWidget)
2199 Q_UNUSED(parentWidget);
2200 const auto &elementItem = ui_widget->elementItem();
2201 for (DomItem *ui_item : elementItem) {
2202 const auto &properties = ui_item->elementProperty();
2208 DomProperty *p = QFBE::propertyByName(properties, QFormBuilderStrings::textAttribute);
2209 if (p && p->elementString()) {
2210 textData = textBuilder()->loadText(p);
2211 text = qvariant_cast<QString>(textBuilder()->toNativeValue(textData));
2214 p = QFBE::propertyByName(properties, QFormBuilderStrings::iconAttribute);
2216 iconData = resourceBuilder()->loadResource(workingDirectory(), p);
2217 icon = qvariant_cast<QIcon>(resourceBuilder()->toNativeValue(iconData));
2220 comboBox->addItem(icon, text);
2221 comboBox->setItemData((comboBox->count()-1), iconData, Qt::DecorationPropertyRole);
2222 comboBox->setItemData((comboBox->count()-1), textData, Qt::DisplayPropertyRole);
2225 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2226 comboBox->setCurrentIndex(currentIndex->elementNumber());
2248void QAbstractFormBuilder::loadButtonExtraInfo(
const DomWidget *ui_widget, QAbstractButton *button, QWidget *)
2250 using ButtonGroupHash = QFormBuilderExtra::ButtonGroupHash;
2252 const QString groupName = buttonGroupName(ui_widget);
2253 if (groupName.isEmpty())
2256 ButtonGroupHash &buttonGroups = d->buttonGroups();
2257 const auto it = buttonGroups.find(groupName);
2258 if (it == buttonGroups.end()) {
2259#ifdef QFORMINTERNAL_NAMESPACE
2260 uiLibWarning(QCoreApplication::translate(
"QAbstractFormBuilder",
"Invalid QButtonGroup reference '%1' referenced by '%2'.").arg(groupName, button->objectName()));
2265 QButtonGroup *&group = it.value().second;
2266 if (group ==
nullptr) {
2267 group =
new QButtonGroup;
2268 group->setObjectName(groupName);
2269 applyProperties(group, it.value().first->elementProperty());
2271 group->addButton(button);
2278void QAbstractFormBuilder::loadItemViewExtraInfo(DomWidget *ui_widget, QAbstractItemView *itemView,
2281 if (QTreeView *treeView = qobject_cast<QTreeView*>(itemView)) {
2282 const auto &allAttributes = ui_widget->elementAttribute();
2283 QList<DomProperty *> headerProperties;
2284 for (QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
2285 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
2286 + realPropertyName.mid(1);
2287 const QString fakePropertyName =
"header"_L1 + upperPropertyName;
2288 for (DomProperty *attr : allAttributes) {
2289 if (attr->attributeName() == fakePropertyName) {
2290 attr->setAttributeName(realPropertyName);
2291 headerProperties << attr;
2295 applyProperties(treeView->header(), headerProperties);
2296 }
else if (QTableView *tableView = qobject_cast<QTableView*>(itemView)) {
2297 const auto &allAttributes = ui_widget->elementAttribute();
2298 for (QLatin1StringView headerPrefix : tableHeaderPrefixes) {
2299 QList<DomProperty*> headerProperties;
2300 for (QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
2301 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
2302 + realPropertyName.mid(1);
2303 const QString fakePropertyName = headerPrefix + upperPropertyName;
2304 for (DomProperty *attr : allAttributes) {
2305 if (attr->attributeName() == fakePropertyName) {
2306 attr->setAttributeName(realPropertyName);
2307 headerProperties << attr;
2311 if (headerPrefix ==
"horizontalHeader"_L1)
2312 applyProperties(tableView->horizontalHeader(), headerProperties);
2314 applyProperties(tableView->verticalHeader(), headerProperties);
2322void QAbstractFormBuilder::loadExtraInfo(DomWidget *ui_widget, QWidget *widget, QWidget *parentWidget)
2325#if QT_CONFIG(listwidget)
2326 }
else if (QListWidget *listWidget = qobject_cast<QListWidget*>(widget)) {
2327 loadListWidgetExtraInfo(ui_widget, listWidget, parentWidget);
2329#if QT_CONFIG(treewidget)
2330 }
else if (QTreeWidget *treeWidget = qobject_cast<QTreeWidget*>(widget)) {
2331 loadTreeWidgetExtraInfo(ui_widget, treeWidget, parentWidget);
2333#if QT_CONFIG(tablewidget)
2334 }
else if (QTableWidget *tableWidget = qobject_cast<QTableWidget*>(widget)) {
2335 loadTableWidgetExtraInfo(ui_widget, tableWidget, parentWidget);
2337#if QT_CONFIG(combobox)
2338 }
else if (QComboBox *comboBox = qobject_cast<QComboBox*>(widget)) {
2339 if (!QFormBuilderExtra::isQFontComboBox(widget))
2340 loadComboBoxExtraInfo(ui_widget, comboBox, parentWidget);
2342#if QT_CONFIG(tabwidget)
2343 }
else if (QTabWidget *tabWidget = qobject_cast<QTabWidget*>(widget)) {
2344 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2345 tabWidget->setCurrentIndex(currentIndex->elementNumber());
2347#if QT_CONFIG(stackedwidget)
2348 }
else if (QStackedWidget *stackedWidget = qobject_cast<QStackedWidget*>(widget)) {
2349 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2350 stackedWidget->setCurrentIndex(currentIndex->elementNumber());
2352#if QT_CONFIG(toolbox)
2353 }
else if (QToolBox *toolBox = qobject_cast<QToolBox*>(widget)) {
2354 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2355 toolBox->setCurrentIndex(currentIndex->elementNumber());
2356 if (
auto *tabSpacing = QFBE::propertyByName(ui_widget->elementProperty(),
"tabSpacing"))
2357 toolBox->layout()->setSpacing(tabSpacing->elementNumber());
2359 }
else if (QAbstractButton *ab = qobject_cast<QAbstractButton *>(widget)) {
2360 loadButtonExtraInfo(ui_widget, ab, parentWidget);
2362 if (QAbstractItemView *itemView = qobject_cast<QAbstractItemView *>(widget)) {
2363 loadItemViewExtraInfo(ui_widget, itemView, parentWidget);