1070DomWidget *QAbstractFormBuilder::createDom(QWidget *widget, DomWidget *ui_parentWidget,
bool recursive)
1072 auto *ui_widget =
new DomWidget();
1073 ui_widget->setAttributeClass(QLatin1StringView(widget->metaObject()->className()));
1074 ui_widget->setAttributeName(widget->objectName());
1076 ui_widget->setElementProperty(computeProperties(widget));
1079 if (QLayout *layout = widget->layout()) {
1080 if (DomLayout *ui_layout = createDom(layout,
nullptr, ui_parentWidget)) {
1081 QList<DomLayout *> ui_layouts;
1082 ui_layouts.append(ui_layout);
1084 ui_widget->setElementLayout(ui_layouts);
1090 QList<DomWidget *> ui_widgets;
1091 QList<DomAction *> ui_actions;
1092 QList<DomActionGroup *> ui_action_groups;
1094 QObjectList children;
1098#if QT_CONFIG(splitter)
1099 if (
const auto *splitter = qobject_cast<
const QSplitter*>(widget)) {
1100 const int count = splitter->count();
1101 for (
int i = 0; i < count; ++i)
1102 children.append(splitter->widget(i));
1106 QObjectList childObjects = widget->children();
1108 const auto list = qvariant_cast<QWidgetList>(widget->property(
"_q_widgetOrder"));
1109 for (QWidget *w : list) {
1110 if (childObjects.contains(w)) {
1112 childObjects.removeAll(w);
1115 children += childObjects;
1117 const auto zOrder = qvariant_cast<QWidgetList>(widget->property(
"_q_zOrder"));
1118 if (list != zOrder) {
1119 QStringList zOrderList;
1120 zOrderList.reserve(zOrder.size());
1121 std::transform(zOrder.cbegin(), zOrder.cend(),
1122 std::back_inserter(zOrderList),
1123 [] (
const QWidget *w) {
return w->objectName(); });
1124 ui_widget->setElementZOrder(zOrderList);
1128 for (QObject *obj : std::as_const(children)) {
1129 if (
auto *childWidget = qobject_cast<QWidget*>(obj)) {
1130 if (d->m_laidout.contains(childWidget) || !recursive)
1133 if (
auto *menu = qobject_cast<QMenu *>(childWidget)) {
1134 const auto actions = menu->parentWidget()->actions();
1136 std::any_of(actions.cbegin(), actions.cend(),
1137 [menu] (
const QAction *a) {
return a->menu() == menu; });
1142 if (DomWidget *ui_child = createDom(childWidget, ui_widget)) {
1143 ui_widgets.append(ui_child);
1145 }
else if (
auto *childAction = qobject_cast<QAction*>(obj)) {
1146 if (childAction->actionGroup() !=
nullptr) {
1151 if (DomAction *ui_action = createDom(childAction)) {
1152 ui_actions.append(ui_action);
1154 }
else if (
auto *childActionGroup = qobject_cast<QActionGroup*>(obj)) {
1155 if (DomActionGroup *ui_action_group = createDom(childActionGroup)) {
1156 ui_action_groups.append(ui_action_group);
1162 QList<DomActionRef *> ui_action_refs;
1163 const auto &actions = widget->actions();
1164 ui_action_refs.reserve(actions.size());
1165 for (QAction *action : actions) {
1166 if (DomActionRef *ui_action_ref = createActionRefDom(action)) {
1167 ui_action_refs.append(ui_action_ref);
1172 ui_widget->setElementWidget(ui_widgets);
1174 ui_widget->setElementAction(ui_actions);
1175 ui_widget->setElementActionGroup(ui_action_groups);
1176 ui_widget->setElementAddAction(ui_action_refs);
1178 saveExtraInfo(widget, ui_widget, ui_parentWidget);
1293DomLayout *QAbstractFormBuilder::createDom(QLayout *layout, DomLayout *ui_layout, DomWidget *ui_parentWidget)
1295 Q_UNUSED(ui_layout);
1296 auto *lay =
new DomLayout();
1297 lay->setAttributeClass(QLatin1StringView(layout->metaObject()->className()));
1298 const QString objectName = layout->objectName();
1299 if (!objectName.isEmpty())
1300 lay->setAttributeName(objectName);
1301 lay->setElementProperty(computeProperties(layout));
1303 QList<FormBuilderSaveLayoutEntry> newList;
1304 if (
auto *gridLayout = qobject_cast<QGridLayout *>(layout)) {
1305 newList = saveGridLayoutEntries(gridLayout);
1306#if QT_CONFIG(formlayout)
1307 }
else if (
const auto *formLayout = qobject_cast<
const QFormLayout *>(layout)) {
1308 newList = saveFormLayoutEntries(formLayout);
1311 newList = saveLayoutEntries(layout);
1314 QList<DomLayoutItem *> ui_items;
1315 ui_items.reserve(newList.size());
1316 for (
const FormBuilderSaveLayoutEntry &item : std::as_const(newList)) {
1317 if (DomLayoutItem *ui_item = createDom(item.item, lay, ui_parentWidget)) {
1319 ui_item->setAttributeRow(item.row);
1320 if (item.column >= 0)
1321 ui_item->setAttributeColumn(item.column);
1322 if (item.rowSpan > 1)
1323 ui_item->setAttributeRowSpan(item.rowSpan);
1324 if (item.columnSpan > 1)
1325 ui_item->setAttributeColSpan(item.columnSpan);
1327 ui_item->setAttributeAlignment(alignmentValue(item.alignment,
1328 d->m_fullyQualifiedEnums));
1329 ui_items.append(ui_item);
1333 lay->setElementItem(ui_items);
1404QList<DomProperty*> QAbstractFormBuilder::computeProperties(QObject *obj)
1406 QList<DomProperty*> lst;
1408 const QMetaObject *meta = obj->metaObject();
1410 QHash<QByteArray,
bool> properties;
1411 const int propertyCount = meta->propertyCount();
1412 for(
int i=0; i < propertyCount; ++i)
1413 properties.insert(meta->property(i).name(),
true);
1415 const auto propertyNames = properties.keys();
1417 const int propertyNamesCount = propertyNames.size();
1418 for(
int i=0; i<propertyNamesCount ; ++i) {
1419 const QString pname = QString::fromUtf8(propertyNames.at(i));
1420 const QMetaProperty prop = meta->property(meta->indexOfProperty(pname.toUtf8()));
1422 if (!prop.isWritable() || !checkProperty(obj, QLatin1StringView(prop.name())))
1425 const QVariant v = prop.read(obj);
1427 DomProperty *dom_prop =
nullptr;
1428 if (v.metaType().id() == QMetaType::Int) {
1429 dom_prop =
new DomProperty();
1431 if (prop.isFlagType())
1432 uiLibWarning(QCoreApplication::translate(
"QAbstractFormBuilder",
"Flags property are not supported yet."));
1434 if (prop.isEnumType()) {
1435 QString scope = QString::fromUtf8(prop.enumerator().scope());
1438 const QString e = QString::fromUtf8(prop.enumerator().valueToKey(v.toInt()));
1440 dom_prop->setElementEnum(scope + e);
1442 dom_prop->setElementNumber(v.toInt());
1443 dom_prop->setAttributeName(pname);
1445 dom_prop = createProperty(obj, pname, v);
1448 if (!dom_prop || dom_prop->kind() == DomProperty::Unknown)
1451 lst.append(dom_prop);
1596 QList<DomProperty*> *properties,
1599 static const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1600 auto *
const formBuilder =
static_cast<FriendlyFB *>(abstractFormBuilder);
1602 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
1603 if (DomProperty *p = formBuilder->saveText(it.second, item->data(it.first.second)))
1604 properties->append(p);
1607 const auto *mo = &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 if (DomProperty *p = variantToDomProperty(abstractFormBuilder, mo, it.second, v))
1614 properties->append(p);
1618 if (DomProperty *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 auto *
const formBuilder =
static_cast<FriendlyFB *>(abstractFormBuilder);
1637 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles)
1638 if (DomProperty *p = properties.value(it.second)) {
1639 const QVariant v = formBuilder->textBuilder()->loadText(p);
1640 QVariant nativeValue = formBuilder->textBuilder()->toNativeValue(v);
1641 item->setData(it.first.first, qvariant_cast<QString>(nativeValue));
1642 item->setData(it.first.second, v);
1645 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1646 if (DomProperty *p = properties.value(it.second)) {
1647 if (
const QVariant v = formBuilder->toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p); v.isValid())
1648 item->setData(it.first, v);
1652 if (DomProperty *p = properties.value(strings.iconAttribute)) {
1653 const QVariant v = formBuilder->resourceBuilder()->loadResource(formBuilder->workingDirectory(), p);
1654 QVariant nativeValue = formBuilder->resourceBuilder()->toNativeValue(v);
1655 item->setIcon(qvariant_cast<QIcon>(nativeValue));
1656 item->setData(Qt::DecorationPropertyRole, v);
1676void QAbstractFormBuilder::saveTreeWidgetExtraInfo(QTreeWidget *treeWidget, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1678 Q_UNUSED(ui_parentWidget);
1680 QList<DomColumn *> columns;
1682 const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1684 for (
int c = 0; c<treeWidget->columnCount(); ++c) {
1685 auto *column =
new DomColumn;
1687 QList<DomProperty*> properties;
1689 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
1690 DomProperty *p = saveText(it.second, treeWidget->headerItem()->data(c, it.first.second));
1692 if (!p && it.first.first == Qt::EditRole && it.second ==
"text"_L1) {
1693 auto *defaultHeader =
new DomString;
1694 defaultHeader->setText(QString::number(c + 1));
1695 defaultHeader->setAttributeNotr(u"true"_s);
1696 p =
new DomProperty;
1697 p->setAttributeName(it.second);
1698 p->setElementString(defaultHeader);
1701 properties.append(p);
1704 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1705 if (
const QVariant v = treeWidget->headerItem()->data(c, it.first); v.isValid()) {
1706 if (DomProperty *p = variantToDomProperty(
this, &QAbstractFormBuilderGadget::staticMetaObject, it.second, v))
1707 properties.append(p);
1711 if (DomProperty *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 auto *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 (DomProperty *p = saveText(it.second, item->data(c, it.first.second)))
1737 properties.append(p);
1740 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1741 if (
const QVariant v = item->data(c, it.first); v.isValid()) {
1742 if (DomProperty *p = variantToDomProperty(
this, &QAbstractFormBuilderGadget::staticMetaObject, it.second, v))
1743 properties.append(p);
1747 if (DomProperty *p = saveResource(item->data(c, Qt::DecorationPropertyRole)))
1748 properties.append(p);
1750 storeItemFlags(item, &properties);
1751 currentDomItem->setElementProperty(properties);
1753 if (parentDomItem) {
1754 auto childrenItems = parentDomItem->elementItem();
1755 childrenItems.append(currentDomItem);
1756 parentDomItem->setElementItem(childrenItems);
1758 items.append(currentDomItem);
1760 for (
int i = 0; i < item->childCount(); i++)
1761 pendingQueue.enqueue(std::make_pair(item->child(i), currentDomItem));
1764 ui_widget->setElementItem(items);
1770void QAbstractFormBuilder::saveTableWidgetExtraInfo(QTableWidget *tableWidget, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1772 Q_UNUSED(ui_parentWidget);
1775 QList<DomColumn *> columns;
1776 auto *header = tableWidget->horizontalHeader();
1777 for (
int c = 0; c < tableWidget->columnCount(); c++) {
1778 QList<DomProperty*> properties;
1779 QTableWidgetItem *item = tableWidget->horizontalHeaderItem(c);
1781 storeItemProps(
this, item, &properties, header->defaultAlignment());
1783 auto *column =
new DomColumn;
1784 column->setElementProperty(properties);
1785 columns.append(column);
1787 ui_widget->setElementColumn(columns);
1790 QList<DomRow *> rows;
1791 header = tableWidget->verticalHeader();
1792 for (
int r = 0; r < tableWidget->rowCount(); r++) {
1793 QList<DomProperty*> properties;
1794 QTableWidgetItem *item = tableWidget->verticalHeaderItem(r);
1796 storeItemProps(
this, item, &properties, header->defaultAlignment());
1798 auto *row =
new DomRow;
1799 row->setElementProperty(properties);
1802 ui_widget->setElementRow(rows);
1804 auto items = ui_widget->elementItem();
1805 for (
int r = 0; r < tableWidget->rowCount(); r++)
1806 for (
int c = 0; c < tableWidget->columnCount(); c++) {
1807 QTableWidgetItem *item = tableWidget->item(r, c);
1809 QList<DomProperty*> properties;
1810 storeItemPropsNFlags(
this, item, &properties);
1812 auto *domItem =
new DomItem;
1813 domItem->setAttributeRow(r);
1814 domItem->setAttributeColumn(c);
1815 domItem->setElementProperty(properties);
1816 items.append(domItem);
1820 ui_widget->setElementItem(items);
1846void QAbstractFormBuilder::saveComboBoxExtraInfo(QComboBox *comboBox, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1848 Q_UNUSED(ui_parentWidget);
1849 auto ui_items = ui_widget->elementItem();
1851 const int count = comboBox->count();
1852 for (
int i=0; i < count; ++i) {
1855 DomProperty *textProperty = saveText(QFormBuilderStrings::textAttribute,
1856 comboBox->itemData(i, Qt::DisplayPropertyRole));
1857 DomProperty *iconProperty = saveResource(comboBox->itemData(i, Qt::DecorationPropertyRole));
1858 if (textProperty || iconProperty) {
1859 QList<DomProperty*> properties;
1861 properties.push_back(textProperty);
1863 properties.push_back(iconProperty);
1865 auto *ui_item =
new DomItem();
1866 ui_item->setElementProperty(properties);
1867 ui_items.push_back(ui_item);
1871 ui_widget->setElementItem(ui_items);
1916void QAbstractFormBuilder::saveItemViewExtraInfo(
const QAbstractItemView *itemView,
1917 DomWidget *ui_widget, DomWidget *)
1919 if (
const auto *treeView = qobject_cast<
const QTreeView*>(itemView)) {
1920 auto viewProperties = ui_widget->elementAttribute();
1921 const auto &headerProperties = computeProperties(treeView->header());
1922 for (
const QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
1923 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
1924 + realPropertyName.mid(1);
1925 const QString fakePropertyName =
"header"_L1 + upperPropertyName;
1926 for (DomProperty *property : headerProperties) {
1927 if (property->attributeName() == realPropertyName) {
1928 property->setAttributeName(fakePropertyName);
1929 viewProperties << property;
1933 ui_widget->setElementAttribute(viewProperties);
1934 }
else if (
const auto *tableView = qobject_cast<
const QTableView*>(itemView)) {
1935 auto viewProperties = ui_widget->elementAttribute();
1936 for (QLatin1StringView headerPrefix : tableHeaderPrefixes) {
1937 const auto &headerProperties = headerPrefix ==
"horizontalHeader"_L1
1938 ? computeProperties(tableView->horizontalHeader())
1939 : computeProperties(tableView->verticalHeader());
1940 for (
const QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
1941 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
1942 + realPropertyName.mid(1);
1943 const QString fakePropertyName = headerPrefix + upperPropertyName;
1944 for (DomProperty *property : std::as_const(headerProperties)) {
1945 if (property->attributeName() == realPropertyName) {
1946 property->setAttributeName(fakePropertyName);
1947 viewProperties << property;
1952 ui_widget->setElementAttribute(viewProperties);
1999void QAbstractFormBuilder::saveExtraInfo(QWidget *widget, DomWidget *ui_widget,
2000 DomWidget *ui_parentWidget)
2003#if QT_CONFIG(listwidget)
2004 }
else if (
auto *listWidget = qobject_cast<QListWidget*>(widget)) {
2005 saveListWidgetExtraInfo(listWidget, ui_widget, ui_parentWidget);
2007#if QT_CONFIG(treewidget)
2008 }
else if (
auto *treeWidget = qobject_cast<QTreeWidget*>(widget)) {
2009 saveTreeWidgetExtraInfo(treeWidget, ui_widget, ui_parentWidget);
2011#if QT_CONFIG(tablewidget)
2012 }
else if (
auto *tableWidget = qobject_cast<QTableWidget*>(widget)) {
2013 saveTableWidgetExtraInfo(tableWidget, ui_widget, ui_parentWidget);
2015#if QT_CONFIG(combobox)
2016 }
else if (
auto *comboBox = qobject_cast<QComboBox*>(widget)) {
2017 if (!QFormBuilderExtra::isQFontComboBox(widget))
2018 saveComboBoxExtraInfo(comboBox, ui_widget, ui_parentWidget);
2020 }
else if (
auto *ab = qobject_cast<QAbstractButton *>(widget)) {
2021 saveButtonExtraInfo(ab, ui_widget, ui_parentWidget);
2023 if (
auto *itemView = qobject_cast<QAbstractItemView *>(widget)) {
2024 saveItemViewExtraInfo(itemView, ui_widget, ui_parentWidget);
2048void QAbstractFormBuilder::loadTreeWidgetExtraInfo(DomWidget *ui_widget, QTreeWidget *treeWidget, QWidget *parentWidget)
2050 Q_UNUSED(parentWidget);
2051 const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
2052 const QMetaEnum itemFlags_enum = metaEnum<QAbstractFormBuilderGadget>(
"itemFlags");
2053 const auto &columns = ui_widget->elementColumn();
2054 if (!columns.isEmpty())
2055 treeWidget->setColumnCount(columns.size());
2057 for (qsizetype i = 0, size = columns.size(); i < size; ++i) {
2058 const DomColumn *c = columns.at(i);
2059 const DomPropertyHash properties = propertyMap(c->elementProperty());
2061 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
2062 if (DomProperty *p = properties.value(it.second)) {
2063 if (
const QVariant v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p); v.isValid())
2064 treeWidget->headerItem()->setData(i, it.first, v);
2068 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
2069 if (DomProperty *p = properties.value(it.second)) {
2070 const QVariant v = textBuilder()->loadText(p);
2071 QVariant nativeValue = textBuilder()->toNativeValue(v);
2072 treeWidget->headerItem()->setData(i, it.first.first, qvariant_cast<QString>(nativeValue));
2073 treeWidget->headerItem()->setData(i, it.first.second, v);
2077 if (DomProperty *p = properties.value(QFormBuilderStrings::iconAttribute)) {
2078 const QVariant v = resourceBuilder()->loadResource(workingDirectory(), p);
2079 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
2080 treeWidget->headerItem()->setIcon(i, qvariant_cast<QIcon>(nativeValue));
2081 treeWidget->headerItem()->setData(i, Qt::DecorationPropertyRole, v);
2085 QQueue<std::pair<DomItem *, QTreeWidgetItem *> > pendingQueue;
2086 const auto &widgetElementItem = ui_widget->elementItem();
2087 for (DomItem *ui_item : widgetElementItem)
2088 pendingQueue.enqueue(std::make_pair(ui_item,
nullptr));
2090 while (!pendingQueue.isEmpty()) {
2091 const std::pair<DomItem *, QTreeWidgetItem *> pair = pendingQueue.dequeue();
2092 const DomItem *domItem = pair.first;
2093 QTreeWidgetItem *parentItem = pair.second;
2095 QTreeWidgetItem *currentItem =
nullptr;
2098 currentItem =
new QTreeWidgetItem(parentItem);
2100 currentItem =
new QTreeWidgetItem(treeWidget);
2102 const auto &properties = domItem->elementProperty();
2104 for (DomProperty *property : properties) {
2105 if (property->attributeName() == QFormBuilderStrings::flagsAttribute
2106 && !property->elementSet().isEmpty()) {
2107 currentItem->setFlags(enumKeysToValue<Qt::ItemFlags>(itemFlags_enum, property->elementSet().toLatin1()));
2108 }
else if (property->attributeName() == QFormBuilderStrings::textAttribute
2109 && property->elementString()) {
2111 QVariant textV = textBuilder()->loadText(property);
2112 QVariant nativeValue = textBuilder()->toNativeValue(textV);
2113 currentItem->setText(col, qvariant_cast<QString>(nativeValue));
2114 currentItem->setData(col, Qt::DisplayPropertyRole, textV);
2115 }
else if (col >= 0) {
2116 if (property->attributeName() == QFormBuilderStrings::iconAttribute) {
2117 QVariant v = resourceBuilder()->loadResource(workingDirectory(), property);
2119 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
2120 currentItem->setIcon(col, qvariant_cast<QIcon>(nativeValue));
2121 currentItem->setData(col, Qt::DecorationPropertyRole, v);
2124 int role = strings.treeItemRoleHash.value(property->attributeName(), (Qt::ItemDataRole)-1);
2126 if (
const QVariant v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, property); v.isValid())
2127 currentItem->setData(col, role, v);
2129 std::pair<Qt::ItemDataRole, Qt::ItemDataRole> rolePair =
2130 strings.treeItemTextRoleHash.value(property->attributeName(),
2131 std::make_pair((Qt::ItemDataRole)-1, (Qt::ItemDataRole)-1));
2132 if (rolePair.first >= 0) {
2133 QVariant textV = textBuilder()->loadText(property);
2134 QVariant nativeValue = textBuilder()->toNativeValue(textV);
2135 currentItem->setData(col, rolePair.first, qvariant_cast<QString>(nativeValue));
2136 currentItem->setData(col, rolePair.second, textV);
2143 const auto &elementItem = domItem->elementItem();
2144 for (DomItem *childItem : elementItem)
2145 pendingQueue.enqueue(std::make_pair(childItem, currentItem));
2153void QAbstractFormBuilder::loadTableWidgetExtraInfo(DomWidget *ui_widget, QTableWidget *tableWidget, QWidget *parentWidget)
2155 Q_UNUSED(parentWidget);
2157 const auto &columns = ui_widget->elementColumn();
2158 if (!columns.isEmpty())
2159 tableWidget->setColumnCount(columns.size());
2160 for (qsizetype i = 0, size = columns.size(); i < size; ++i) {
2161 DomColumn *c = columns.at(i);
2162 const DomPropertyHash properties = propertyMap(c->elementProperty());
2164 if (!properties.isEmpty()) {
2165 auto *item =
new QTableWidgetItem;
2166 loadItemProps(
this, item, properties);
2167 tableWidget->setHorizontalHeaderItem(i, item);
2171 const auto &rows = ui_widget->elementRow();
2172 if (!rows.isEmpty())
2173 tableWidget->setRowCount(rows.size());
2174 for (qsizetype i = 0, size = rows.size(); i < size; ++i) {
2175 const DomRow *r = rows.at(i);
2176 const DomPropertyHash properties = propertyMap(r->elementProperty());
2178 if (!properties.isEmpty()) {
2179 auto *item =
new QTableWidgetItem;
2180 loadItemProps(
this, item, properties);
2181 tableWidget->setVerticalHeaderItem(i, item);
2185 const auto &elementItem = ui_widget->elementItem();
2186 for (DomItem *ui_item : elementItem) {
2187 if (ui_item->hasAttributeRow() && ui_item->hasAttributeColumn()) {
2188 const DomPropertyHash properties = propertyMap(ui_item->elementProperty());
2189 auto *item =
new QTableWidgetItem;
2190 loadItemPropsNFlags(
this, item, properties);
2191 tableWidget->setItem(ui_item->attributeRow(), ui_item->attributeColumn(), item);
2199void QAbstractFormBuilder::loadComboBoxExtraInfo(DomWidget *ui_widget, QComboBox *comboBox, QWidget *parentWidget)
2201 Q_UNUSED(parentWidget);
2202 const auto &elementItem = ui_widget->elementItem();
2203 for (DomItem *ui_item : elementItem) {
2204 const auto &properties = ui_item->elementProperty();
2210 DomProperty *p = QFBE::propertyByName(properties, QFormBuilderStrings::textAttribute);
2211 if (p && p->elementString()) {
2212 textData = textBuilder()->loadText(p);
2213 text = qvariant_cast<QString>(textBuilder()->toNativeValue(textData));
2216 p = QFBE::propertyByName(properties, QFormBuilderStrings::iconAttribute);
2218 iconData = resourceBuilder()->loadResource(workingDirectory(), p);
2219 icon = qvariant_cast<QIcon>(resourceBuilder()->toNativeValue(iconData));
2222 comboBox->addItem(icon, text);
2223 comboBox->setItemData((comboBox->count()-1), iconData, Qt::DecorationPropertyRole);
2224 comboBox->setItemData((comboBox->count()-1), textData, Qt::DisplayPropertyRole);
2227 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2228 comboBox->setCurrentIndex(currentIndex->elementNumber());
2250void QAbstractFormBuilder::loadButtonExtraInfo(
const DomWidget *ui_widget, QAbstractButton *button, QWidget *)
2252 using ButtonGroupHash = QFormBuilderExtra::ButtonGroupHash;
2254 const QString groupName = buttonGroupName(ui_widget);
2255 if (groupName.isEmpty())
2258 ButtonGroupHash &buttonGroups = d->buttonGroups();
2259 const auto it = buttonGroups.find(groupName);
2260 if (it == buttonGroups.end()) {
2261#ifdef QFORMINTERNAL_NAMESPACE
2262 uiLibWarning(QCoreApplication::translate(
"QAbstractFormBuilder",
"Invalid QButtonGroup reference '%1' referenced by '%2'.").arg(groupName, button->objectName()));
2267 QButtonGroup *&group = it.value().second;
2268 if (group ==
nullptr) {
2269 group =
new QButtonGroup;
2270 group->setObjectName(groupName);
2271 applyProperties(group, it.value().first->elementProperty());
2273 group->addButton(button);
2280void QAbstractFormBuilder::loadItemViewExtraInfo(DomWidget *ui_widget, QAbstractItemView *itemView,
2283 if (
auto *treeView = qobject_cast<QTreeView*>(itemView)) {
2284 const auto &allAttributes = ui_widget->elementAttribute();
2285 QList<DomProperty *> headerProperties;
2286 for (QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
2287 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
2288 + realPropertyName.mid(1);
2289 const QString fakePropertyName =
"header"_L1 + upperPropertyName;
2290 for (DomProperty *attr : allAttributes) {
2291 if (attr->attributeName() == fakePropertyName) {
2292 attr->setAttributeName(realPropertyName);
2293 headerProperties << attr;
2297 applyProperties(treeView->header(), headerProperties);
2298 }
else if (
auto *tableView = qobject_cast<QTableView*>(itemView)) {
2299 const auto &allAttributes = ui_widget->elementAttribute();
2300 for (QLatin1StringView headerPrefix : tableHeaderPrefixes) {
2301 QList<DomProperty*> headerProperties;
2302 for (QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
2303 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
2304 + realPropertyName.mid(1);
2305 const QString fakePropertyName = headerPrefix + upperPropertyName;
2306 for (DomProperty *attr : allAttributes) {
2307 if (attr->attributeName() == fakePropertyName) {
2308 attr->setAttributeName(realPropertyName);
2309 headerProperties << attr;
2313 if (headerPrefix ==
"horizontalHeader"_L1)
2314 applyProperties(tableView->horizontalHeader(), headerProperties);
2316 applyProperties(tableView->verticalHeader(), headerProperties);
2324void QAbstractFormBuilder::loadExtraInfo(DomWidget *ui_widget, QWidget *widget, QWidget *parentWidget)
2327#if QT_CONFIG(listwidget)
2328 }
else if (
auto *listWidget = qobject_cast<QListWidget*>(widget)) {
2329 loadListWidgetExtraInfo(ui_widget, listWidget, parentWidget);
2331#if QT_CONFIG(treewidget)
2332 }
else if (
auto *treeWidget = qobject_cast<QTreeWidget*>(widget)) {
2333 loadTreeWidgetExtraInfo(ui_widget, treeWidget, parentWidget);
2335#if QT_CONFIG(tablewidget)
2336 }
else if (
auto *tableWidget = qobject_cast<QTableWidget*>(widget)) {
2337 loadTableWidgetExtraInfo(ui_widget, tableWidget, parentWidget);
2339#if QT_CONFIG(combobox)
2340 }
else if (
auto *comboBox = qobject_cast<QComboBox*>(widget)) {
2341 if (!QFormBuilderExtra::isQFontComboBox(widget))
2342 loadComboBoxExtraInfo(ui_widget, comboBox, parentWidget);
2344#if QT_CONFIG(tabwidget)
2345 }
else if (
auto *tabWidget = qobject_cast<QTabWidget*>(widget)) {
2346 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2347 tabWidget->setCurrentIndex(currentIndex->elementNumber());
2349#if QT_CONFIG(stackedwidget)
2350 }
else if (
auto *stackedWidget = qobject_cast<QStackedWidget*>(widget)) {
2351 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2352 stackedWidget->setCurrentIndex(currentIndex->elementNumber());
2354#if QT_CONFIG(toolbox)
2355 }
else if (
auto *toolBox = qobject_cast<QToolBox*>(widget)) {
2356 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2357 toolBox->setCurrentIndex(currentIndex->elementNumber());
2358 if (
auto *tabSpacing = QFBE::propertyByName(ui_widget->elementProperty(),
"tabSpacing"))
2359 toolBox->layout()->setSpacing(tabSpacing->elementNumber());
2361 }
else if (
auto *ab = qobject_cast<QAbstractButton *>(widget)) {
2362 loadButtonExtraInfo(ui_widget, ab, parentWidget);
2364 if (
auto *itemView = qobject_cast<QAbstractItemView *>(widget)) {
2365 loadItemViewExtraInfo(ui_widget, itemView, parentWidget);