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);
1571 QList<DomProperty*> *properties,
1574 static const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1575 auto *
const formBuilder =
static_cast<FriendlyFB *>(abstractFormBuilder);
1577 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
1578 if (DomProperty *p = formBuilder->saveText(it.second, item->data(it.first.second)))
1579 properties->append(p);
1582 const auto *mo = &QAbstractFormBuilderGadget::staticMetaObject;
1583 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1584 const QVariant v = item->data(it.first);
1585 const bool isModified = v.isValid()
1586 && (it.first != Qt::TextAlignmentRole || v.toUInt() != uint(defaultAlign));
1588 if (DomProperty *p = variantToDomProperty(abstractFormBuilder, mo, it.second, v))
1589 properties->append(p);
1593 if (DomProperty *p = formBuilder->saveResource(item->data(Qt::DecorationPropertyRole)))
1594 properties->append(p);
1607 const QHash<QString, DomProperty*> &properties)
1609 static const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1610 auto *
const formBuilder =
static_cast<FriendlyFB *>(abstractFormBuilder);
1612 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles)
1613 if (DomProperty *p = properties.value(it.second)) {
1614 const QVariant v = formBuilder->textBuilder()->loadText(p);
1615 QVariant nativeValue = formBuilder->textBuilder()->toNativeValue(v);
1616 item->setData(it.first.first, qvariant_cast<QString>(nativeValue));
1617 item->setData(it.first.second, v);
1620 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1621 if (DomProperty *p = properties.value(it.second)) {
1622 if (
const QVariant v = formBuilder->toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p); v.isValid())
1623 item->setData(it.first, v);
1627 if (DomProperty *p = properties.value(strings.iconAttribute)) {
1628 const QVariant v = formBuilder->resourceBuilder()->loadResource(formBuilder->workingDirectory(), p);
1629 QVariant nativeValue = formBuilder->resourceBuilder()->toNativeValue(v);
1630 item->setIcon(qvariant_cast<QIcon>(nativeValue));
1631 item->setData(Qt::DecorationPropertyRole, v);
1651void QAbstractFormBuilder::saveTreeWidgetExtraInfo(QTreeWidget *treeWidget, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1653 Q_UNUSED(ui_parentWidget);
1655 QList<DomColumn *> columns;
1657 const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
1659 for (
int c = 0; c<treeWidget->columnCount(); ++c) {
1660 auto *column =
new DomColumn;
1662 QList<DomProperty*> properties;
1664 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
1665 DomProperty *p = saveText(it.second, treeWidget->headerItem()->data(c, it.first.second));
1667 if (!p && it.first.first == Qt::EditRole && it.second ==
"text"_L1) {
1668 auto *defaultHeader =
new DomString;
1669 defaultHeader->setText(QString::number(c + 1));
1670 defaultHeader->setAttributeNotr(u"true"_s);
1671 p =
new DomProperty;
1672 p->setAttributeName(it.second);
1673 p->setElementString(defaultHeader);
1676 properties.append(p);
1679 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1680 if (
const QVariant v = treeWidget->headerItem()->data(c, it.first); v.isValid()) {
1681 if (DomProperty *p = variantToDomProperty(
this, &QAbstractFormBuilderGadget::staticMetaObject, it.second, v))
1682 properties.append(p);
1686 if (DomProperty *p = saveResource(treeWidget->headerItem()->data(c, Qt::DecorationPropertyRole)))
1687 properties.append(p);
1689 column->setElementProperty(properties);
1690 columns.append(column);
1693 ui_widget->setElementColumn(columns);
1695 auto items = ui_widget->elementItem();
1697 QQueue<std::pair<QTreeWidgetItem *, DomItem *> > pendingQueue;
1698 for (
int i = 0; i < treeWidget->topLevelItemCount(); i++)
1699 pendingQueue.enqueue(std::make_pair(treeWidget->topLevelItem(i),
nullptr));
1701 while (!pendingQueue.isEmpty()) {
1702 const std::pair<QTreeWidgetItem *, DomItem *> pair = pendingQueue.dequeue();
1703 QTreeWidgetItem *item = pair.first;
1704 DomItem *parentDomItem = pair.second;
1706 auto *currentDomItem =
new DomItem;
1708 QList<DomProperty*> properties;
1709 for (
int c = 0; c < treeWidget->columnCount(); c++) {
1710 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
1711 if (DomProperty *p = saveText(it.second, item->data(c, it.first.second)))
1712 properties.append(p);
1715 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
1716 if (
const QVariant v = item->data(c, it.first); v.isValid()) {
1717 if (DomProperty *p = variantToDomProperty(
this, &QAbstractFormBuilderGadget::staticMetaObject, it.second, v))
1718 properties.append(p);
1722 if (DomProperty *p = saveResource(item->data(c, Qt::DecorationPropertyRole)))
1723 properties.append(p);
1725 storeItemFlags(item, &properties);
1726 currentDomItem->setElementProperty(properties);
1728 if (parentDomItem) {
1729 auto childrenItems = parentDomItem->elementItem();
1730 childrenItems.append(currentDomItem);
1731 parentDomItem->setElementItem(childrenItems);
1733 items.append(currentDomItem);
1735 for (
int i = 0; i < item->childCount(); i++)
1736 pendingQueue.enqueue(std::make_pair(item->child(i), currentDomItem));
1739 ui_widget->setElementItem(items);
1745void QAbstractFormBuilder::saveTableWidgetExtraInfo(QTableWidget *tableWidget, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1747 Q_UNUSED(ui_parentWidget);
1750 QList<DomColumn *> columns;
1751 auto *header = tableWidget->horizontalHeader();
1752 for (
int c = 0; c < tableWidget->columnCount(); c++) {
1753 QList<DomProperty*> properties;
1754 QTableWidgetItem *item = tableWidget->horizontalHeaderItem(c);
1756 storeItemProps(
this, item, &properties, header->defaultAlignment());
1758 auto *column =
new DomColumn;
1759 column->setElementProperty(properties);
1760 columns.append(column);
1762 ui_widget->setElementColumn(columns);
1765 QList<DomRow *> rows;
1766 header = tableWidget->verticalHeader();
1767 for (
int r = 0; r < tableWidget->rowCount(); r++) {
1768 QList<DomProperty*> properties;
1769 QTableWidgetItem *item = tableWidget->verticalHeaderItem(r);
1771 storeItemProps(
this, item, &properties, header->defaultAlignment());
1773 auto *row =
new DomRow;
1774 row->setElementProperty(properties);
1777 ui_widget->setElementRow(rows);
1779 auto items = ui_widget->elementItem();
1780 for (
int r = 0; r < tableWidget->rowCount(); r++)
1781 for (
int c = 0; c < tableWidget->columnCount(); c++) {
1782 QTableWidgetItem *item = tableWidget->item(r, c);
1784 QList<DomProperty*> properties;
1785 storeItemPropsNFlags(
this, item, &properties);
1787 auto *domItem =
new DomItem;
1788 domItem->setAttributeRow(r);
1789 domItem->setAttributeColumn(c);
1790 domItem->setElementProperty(properties);
1791 items.append(domItem);
1795 ui_widget->setElementItem(items);
1821void QAbstractFormBuilder::saveComboBoxExtraInfo(QComboBox *comboBox, DomWidget *ui_widget, DomWidget *ui_parentWidget)
1823 Q_UNUSED(ui_parentWidget);
1824 auto ui_items = ui_widget->elementItem();
1826 const int count = comboBox->count();
1827 for (
int i=0; i < count; ++i) {
1830 DomProperty *textProperty = saveText(QFormBuilderStrings::textAttribute,
1831 comboBox->itemData(i, Qt::DisplayPropertyRole));
1832 DomProperty *iconProperty = saveResource(comboBox->itemData(i, Qt::DecorationPropertyRole));
1833 if (textProperty || iconProperty) {
1834 QList<DomProperty*> properties;
1836 properties.push_back(textProperty);
1838 properties.push_back(iconProperty);
1840 auto *ui_item =
new DomItem();
1841 ui_item->setElementProperty(properties);
1842 ui_items.push_back(ui_item);
1846 ui_widget->setElementItem(ui_items);
1891void QAbstractFormBuilder::saveItemViewExtraInfo(
const QAbstractItemView *itemView,
1892 DomWidget *ui_widget, DomWidget *)
1894 if (
const auto *treeView = qobject_cast<
const QTreeView*>(itemView)) {
1895 auto viewProperties = ui_widget->elementAttribute();
1896 const auto &headerProperties = computeProperties(treeView->header());
1897 for (
const QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
1898 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
1899 + realPropertyName.mid(1);
1900 const QString fakePropertyName =
"header"_L1 + upperPropertyName;
1901 for (DomProperty *property : headerProperties) {
1902 if (property->attributeName() == realPropertyName) {
1903 property->setAttributeName(fakePropertyName);
1904 viewProperties << property;
1908 ui_widget->setElementAttribute(viewProperties);
1909 }
else if (
const auto *tableView = qobject_cast<
const QTableView*>(itemView)) {
1910 auto viewProperties = ui_widget->elementAttribute();
1911 for (QLatin1StringView headerPrefix : tableHeaderPrefixes) {
1912 const auto &headerProperties = headerPrefix ==
"horizontalHeader"_L1
1913 ? computeProperties(tableView->horizontalHeader())
1914 : computeProperties(tableView->verticalHeader());
1915 for (
const QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
1916 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
1917 + realPropertyName.mid(1);
1918 const QString fakePropertyName = headerPrefix + upperPropertyName;
1919 for (DomProperty *property : std::as_const(headerProperties)) {
1920 if (property->attributeName() == realPropertyName) {
1921 property->setAttributeName(fakePropertyName);
1922 viewProperties << property;
1927 ui_widget->setElementAttribute(viewProperties);
1974void QAbstractFormBuilder::saveExtraInfo(QWidget *widget, DomWidget *ui_widget,
1975 DomWidget *ui_parentWidget)
1978#if QT_CONFIG(listwidget)
1979 }
else if (
auto *listWidget = qobject_cast<QListWidget*>(widget)) {
1980 saveListWidgetExtraInfo(listWidget, ui_widget, ui_parentWidget);
1982#if QT_CONFIG(treewidget)
1983 }
else if (
auto *treeWidget = qobject_cast<QTreeWidget*>(widget)) {
1984 saveTreeWidgetExtraInfo(treeWidget, ui_widget, ui_parentWidget);
1986#if QT_CONFIG(tablewidget)
1987 }
else if (
auto *tableWidget = qobject_cast<QTableWidget*>(widget)) {
1988 saveTableWidgetExtraInfo(tableWidget, ui_widget, ui_parentWidget);
1990#if QT_CONFIG(combobox)
1991 }
else if (
auto *comboBox = qobject_cast<QComboBox*>(widget)) {
1992 if (!QFormBuilderExtra::isQFontComboBox(widget))
1993 saveComboBoxExtraInfo(comboBox, ui_widget, ui_parentWidget);
1995 }
else if (
auto *ab = qobject_cast<QAbstractButton *>(widget)) {
1996 saveButtonExtraInfo(ab, ui_widget, ui_parentWidget);
1998 if (
auto *itemView = qobject_cast<QAbstractItemView *>(widget)) {
1999 saveItemViewExtraInfo(itemView, ui_widget, ui_parentWidget);
2023void QAbstractFormBuilder::loadTreeWidgetExtraInfo(DomWidget *ui_widget, QTreeWidget *treeWidget, QWidget *parentWidget)
2025 Q_UNUSED(parentWidget);
2026 const QFormBuilderStrings &strings = QFormBuilderStrings::instance();
2027 const QMetaEnum itemFlags_enum = metaEnum<QAbstractFormBuilderGadget>(
"itemFlags");
2028 const auto &columns = ui_widget->elementColumn();
2029 if (!columns.isEmpty())
2030 treeWidget->setColumnCount(columns.size());
2032 for (qsizetype i = 0, size = columns.size(); i < size; ++i) {
2033 const DomColumn *c = columns.at(i);
2034 const DomPropertyHash properties = propertyMap(c->elementProperty());
2036 for (
const QFormBuilderStrings::RoleNName &it : strings.itemRoles) {
2037 if (DomProperty *p = properties.value(it.second)) {
2038 if (
const QVariant v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, p); v.isValid())
2039 treeWidget->headerItem()->setData(i, it.first, v);
2043 for (
const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) {
2044 if (DomProperty *p = properties.value(it.second)) {
2045 const QVariant v = textBuilder()->loadText(p);
2046 QVariant nativeValue = textBuilder()->toNativeValue(v);
2047 treeWidget->headerItem()->setData(i, it.first.first, qvariant_cast<QString>(nativeValue));
2048 treeWidget->headerItem()->setData(i, it.first.second, v);
2052 if (DomProperty *p = properties.value(QFormBuilderStrings::iconAttribute)) {
2053 const QVariant v = resourceBuilder()->loadResource(workingDirectory(), p);
2054 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
2055 treeWidget->headerItem()->setIcon(i, qvariant_cast<QIcon>(nativeValue));
2056 treeWidget->headerItem()->setData(i, Qt::DecorationPropertyRole, v);
2060 QQueue<std::pair<DomItem *, QTreeWidgetItem *> > pendingQueue;
2061 const auto &widgetElementItem = ui_widget->elementItem();
2062 for (DomItem *ui_item : widgetElementItem)
2063 pendingQueue.enqueue(std::make_pair(ui_item,
nullptr));
2065 while (!pendingQueue.isEmpty()) {
2066 const std::pair<DomItem *, QTreeWidgetItem *> pair = pendingQueue.dequeue();
2067 const DomItem *domItem = pair.first;
2068 QTreeWidgetItem *parentItem = pair.second;
2070 QTreeWidgetItem *currentItem =
nullptr;
2073 currentItem =
new QTreeWidgetItem(parentItem);
2075 currentItem =
new QTreeWidgetItem(treeWidget);
2077 const auto &properties = domItem->elementProperty();
2079 for (DomProperty *property : properties) {
2080 if (property->attributeName() == QFormBuilderStrings::flagsAttribute
2081 && !property->elementSet().isEmpty()) {
2082 currentItem->setFlags(enumKeysToValue<Qt::ItemFlags>(itemFlags_enum, property->elementSet().toLatin1()));
2083 }
else if (property->attributeName() == QFormBuilderStrings::textAttribute
2084 && property->elementString()) {
2086 QVariant textV = textBuilder()->loadText(property);
2087 QVariant nativeValue = textBuilder()->toNativeValue(textV);
2088 currentItem->setText(col, qvariant_cast<QString>(nativeValue));
2089 currentItem->setData(col, Qt::DisplayPropertyRole, textV);
2090 }
else if (col >= 0) {
2091 if (property->attributeName() == QFormBuilderStrings::iconAttribute) {
2092 QVariant v = resourceBuilder()->loadResource(workingDirectory(), property);
2094 QVariant nativeValue = resourceBuilder()->toNativeValue(v);
2095 currentItem->setIcon(col, qvariant_cast<QIcon>(nativeValue));
2096 currentItem->setData(col, Qt::DecorationPropertyRole, v);
2099 int role = strings.treeItemRoleHash.value(property->attributeName(), (Qt::ItemDataRole)-1);
2101 if (
const QVariant v = toVariant(&QAbstractFormBuilderGadget::staticMetaObject, property); v.isValid())
2102 currentItem->setData(col, role, v);
2104 std::pair<Qt::ItemDataRole, Qt::ItemDataRole> rolePair =
2105 strings.treeItemTextRoleHash.value(property->attributeName(),
2106 std::make_pair((Qt::ItemDataRole)-1, (Qt::ItemDataRole)-1));
2107 if (rolePair.first >= 0) {
2108 QVariant textV = textBuilder()->loadText(property);
2109 QVariant nativeValue = textBuilder()->toNativeValue(textV);
2110 currentItem->setData(col, rolePair.first, qvariant_cast<QString>(nativeValue));
2111 currentItem->setData(col, rolePair.second, textV);
2118 const auto &elementItem = domItem->elementItem();
2119 for (DomItem *childItem : elementItem)
2120 pendingQueue.enqueue(std::make_pair(childItem, currentItem));
2128void QAbstractFormBuilder::loadTableWidgetExtraInfo(DomWidget *ui_widget, QTableWidget *tableWidget, QWidget *parentWidget)
2130 Q_UNUSED(parentWidget);
2132 const auto &columns = ui_widget->elementColumn();
2133 if (!columns.isEmpty())
2134 tableWidget->setColumnCount(columns.size());
2135 for (qsizetype i = 0, size = columns.size(); i < size; ++i) {
2136 DomColumn *c = columns.at(i);
2137 const DomPropertyHash properties = propertyMap(c->elementProperty());
2139 if (!properties.isEmpty()) {
2140 auto *item =
new QTableWidgetItem;
2141 loadItemProps(
this, item, properties);
2142 tableWidget->setHorizontalHeaderItem(i, item);
2146 const auto &rows = ui_widget->elementRow();
2147 if (!rows.isEmpty())
2148 tableWidget->setRowCount(rows.size());
2149 for (qsizetype i = 0, size = rows.size(); i < size; ++i) {
2150 const DomRow *r = rows.at(i);
2151 const DomPropertyHash properties = propertyMap(r->elementProperty());
2153 if (!properties.isEmpty()) {
2154 auto *item =
new QTableWidgetItem;
2155 loadItemProps(
this, item, properties);
2156 tableWidget->setVerticalHeaderItem(i, item);
2160 const auto &elementItem = ui_widget->elementItem();
2161 for (DomItem *ui_item : elementItem) {
2162 if (ui_item->hasAttributeRow() && ui_item->hasAttributeColumn()) {
2163 const DomPropertyHash properties = propertyMap(ui_item->elementProperty());
2164 auto *item =
new QTableWidgetItem;
2165 loadItemPropsNFlags(
this, item, properties);
2166 tableWidget->setItem(ui_item->attributeRow(), ui_item->attributeColumn(), item);
2174void QAbstractFormBuilder::loadComboBoxExtraInfo(DomWidget *ui_widget, QComboBox *comboBox, QWidget *parentWidget)
2176 Q_UNUSED(parentWidget);
2177 const auto &elementItem = ui_widget->elementItem();
2178 for (DomItem *ui_item : elementItem) {
2179 const auto &properties = ui_item->elementProperty();
2185 DomProperty *p = QFBE::propertyByName(properties, QFormBuilderStrings::textAttribute);
2186 if (p && p->elementString()) {
2187 textData = textBuilder()->loadText(p);
2188 text = qvariant_cast<QString>(textBuilder()->toNativeValue(textData));
2191 p = QFBE::propertyByName(properties, QFormBuilderStrings::iconAttribute);
2193 iconData = resourceBuilder()->loadResource(workingDirectory(), p);
2194 icon = qvariant_cast<QIcon>(resourceBuilder()->toNativeValue(iconData));
2197 comboBox->addItem(icon, text);
2198 comboBox->setItemData((comboBox->count()-1), iconData, Qt::DecorationPropertyRole);
2199 comboBox->setItemData((comboBox->count()-1), textData, Qt::DisplayPropertyRole);
2202 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2203 comboBox->setCurrentIndex(currentIndex->elementNumber());
2225void QAbstractFormBuilder::loadButtonExtraInfo(
const DomWidget *ui_widget, QAbstractButton *button, QWidget *)
2227 using ButtonGroupHash = QFormBuilderExtra::ButtonGroupHash;
2229 const QString groupName = buttonGroupName(ui_widget);
2230 if (groupName.isEmpty())
2233 ButtonGroupHash &buttonGroups = d->buttonGroups();
2234 const auto it = buttonGroups.find(groupName);
2235 if (it == buttonGroups.end()) {
2236#ifdef QFORMINTERNAL_NAMESPACE
2237 uiLibWarning(QCoreApplication::translate(
"QAbstractFormBuilder",
"Invalid QButtonGroup reference '%1' referenced by '%2'.").arg(groupName, button->objectName()));
2242 QButtonGroup *&group = it.value().second;
2243 if (group ==
nullptr) {
2244 group =
new QButtonGroup;
2245 group->setObjectName(groupName);
2246 applyProperties(group, it.value().first->elementProperty());
2248 group->addButton(button);
2255void QAbstractFormBuilder::loadItemViewExtraInfo(DomWidget *ui_widget, QAbstractItemView *itemView,
2258 if (
auto *treeView = qobject_cast<QTreeView*>(itemView)) {
2259 const auto &allAttributes = ui_widget->elementAttribute();
2260 QList<DomProperty *> headerProperties;
2261 for (QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
2262 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
2263 + realPropertyName.mid(1);
2264 const QString fakePropertyName =
"header"_L1 + upperPropertyName;
2265 for (DomProperty *attr : allAttributes) {
2266 if (attr->attributeName() == fakePropertyName) {
2267 attr->setAttributeName(realPropertyName);
2268 headerProperties << attr;
2272 applyProperties(treeView->header(), headerProperties);
2273 }
else if (
auto *tableView = qobject_cast<QTableView*>(itemView)) {
2274 const auto &allAttributes = ui_widget->elementAttribute();
2275 for (QLatin1StringView headerPrefix : tableHeaderPrefixes) {
2276 QList<DomProperty*> headerProperties;
2277 for (QLatin1StringView realPropertyName : itemViewHeaderRealPropertyNames) {
2278 const QString upperPropertyName = QChar(realPropertyName.at(0)).toUpper()
2279 + realPropertyName.mid(1);
2280 const QString fakePropertyName = headerPrefix + upperPropertyName;
2281 for (DomProperty *attr : allAttributes) {
2282 if (attr->attributeName() == fakePropertyName) {
2283 attr->setAttributeName(realPropertyName);
2284 headerProperties << attr;
2288 if (headerPrefix ==
"horizontalHeader"_L1)
2289 applyProperties(tableView->horizontalHeader(), headerProperties);
2291 applyProperties(tableView->verticalHeader(), headerProperties);
2299void QAbstractFormBuilder::loadExtraInfo(DomWidget *ui_widget, QWidget *widget, QWidget *parentWidget)
2302#if QT_CONFIG(listwidget)
2303 }
else if (
auto *listWidget = qobject_cast<QListWidget*>(widget)) {
2304 loadListWidgetExtraInfo(ui_widget, listWidget, parentWidget);
2306#if QT_CONFIG(treewidget)
2307 }
else if (
auto *treeWidget = qobject_cast<QTreeWidget*>(widget)) {
2308 loadTreeWidgetExtraInfo(ui_widget, treeWidget, parentWidget);
2310#if QT_CONFIG(tablewidget)
2311 }
else if (
auto *tableWidget = qobject_cast<QTableWidget*>(widget)) {
2312 loadTableWidgetExtraInfo(ui_widget, tableWidget, parentWidget);
2314#if QT_CONFIG(combobox)
2315 }
else if (
auto *comboBox = qobject_cast<QComboBox*>(widget)) {
2316 if (!QFormBuilderExtra::isQFontComboBox(widget))
2317 loadComboBoxExtraInfo(ui_widget, comboBox, parentWidget);
2319#if QT_CONFIG(tabwidget)
2320 }
else if (
auto *tabWidget = qobject_cast<QTabWidget*>(widget)) {
2321 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2322 tabWidget->setCurrentIndex(currentIndex->elementNumber());
2324#if QT_CONFIG(stackedwidget)
2325 }
else if (
auto *stackedWidget = qobject_cast<QStackedWidget*>(widget)) {
2326 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2327 stackedWidget->setCurrentIndex(currentIndex->elementNumber());
2329#if QT_CONFIG(toolbox)
2330 }
else if (
auto *toolBox = qobject_cast<QToolBox*>(widget)) {
2331 if (
auto *currentIndex = currentIndexProperty(ui_widget->elementProperty()))
2332 toolBox->setCurrentIndex(currentIndex->elementNumber());
2333 if (
auto *tabSpacing = QFBE::propertyByName(ui_widget->elementProperty(),
"tabSpacing"))
2334 toolBox->layout()->setSpacing(tabSpacing->elementNumber());
2336 }
else if (
auto *ab = qobject_cast<QAbstractButton *>(widget)) {
2337 loadButtonExtraInfo(ui_widget, ab, parentWidget);
2339 if (
auto *itemView = qobject_cast<QAbstractItemView *>(widget)) {
2340 loadItemViewExtraInfo(ui_widget, itemView, parentWidget);