diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-05-06 11:18:17 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-05-10 15:01:06 +0200 |
commit | 7eefe6232e2f7a189650b36cb321135442c71f06 (patch) | |
tree | c2ffdeb1b5a28c717cf34de130a49dd5645e0722 | |
parent | 3b3516b60998e1e7f551422fe4ec11ed2e7c2a2a (diff) | |
download | qttools-7eefe6232e2f7a189650b36cb321135442c71f06.tar.gz |
Qt Designer: Fix alignment of horizontal QTableWidget headers
The horizontal QTableWidget headers are centered by default.
This is a problem since QTableWidgetItem::textAlignment() returns 0
for the default value and the header items are presented as list
widget items in the editor which have default alignment.
Populate the header list in the item editor correctly.
Add a default value to the property manager (in the form
of an attribute) and add a reset function.
Also pass a default for saving.
Fixes: QTBUG-85513
Change-Id: I78b95515f829cfb280f19a674575c8bd91fbb948
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
(cherry picked from commit 3ecd3398218f4bddebeb034b4914699132cd5288)
9 files changed, 105 insertions, 30 deletions
diff --git a/src/designer/src/components/propertyeditor/designerpropertymanager.cpp b/src/designer/src/components/propertyeditor/designerpropertymanager.cpp index fad975542..e434f0507 100644 --- a/src/designer/src/components/propertyeditor/designerpropertymanager.cpp +++ b/src/designer/src/components/propertyeditor/designerpropertymanager.cpp @@ -1151,6 +1151,7 @@ void DesignerPropertyManager::slotPropertyDestroyed(QtProperty *property) m_fontManager.slotPropertyDestroyed(property); m_brushManager.slotPropertyDestroyed(property); } + m_alignDefault.remove(property); } QStringList DesignerPropertyManager::attributes(int propertyType) const @@ -1255,6 +1256,12 @@ QVariant DesignerPropertyManager::attributeValue(const QtProperty *property, con return itIcon.value(); } + if (attribute == alignDefaultAttribute()) { + Qt::Alignment v = m_alignDefault.value(property, + Qt::Alignment(Qt::AlignLeading | Qt::AlignHCenter)); + return QVariant(uint(v)); + } + return QtVariantPropertyManager::attributeValue(property, attribute); } @@ -1430,6 +1437,8 @@ void DesignerPropertyManager::setAttribute(QtProperty *property, emit attributeChanged(property, attribute, v); emit propertyChanged(property); + } else if (attribute == alignDefaultAttribute()) { + m_alignDefault[property] = Qt::Alignment(value.toUInt()); } QtVariantPropertyManager::setAttribute(property, attribute, value); } @@ -1477,6 +1486,16 @@ int DesignerPropertyManager::designerKeySequenceTypeId() return qMetaTypeId<PropertySheetKeySequenceValue>(); } +QString DesignerPropertyManager::alignDefaultAttribute() +{ + return QStringLiteral("alignDefault"); +} + +uint DesignerPropertyManager::alignDefault(const QtVariantProperty *prop) +{ + return prop->attributeValue(DesignerPropertyManager::alignDefaultAttribute()).toUInt(); +} + bool DesignerPropertyManager::isPropertyTypeSupported(int propertyType) const { switch (propertyType) { @@ -2184,6 +2203,16 @@ void DesignerPropertyManager::uninitializeProperty(QtProperty *property) QtVariantPropertyManager::uninitializeProperty(property); } +bool DesignerPropertyManager::resetTextAlignmentProperty(QtProperty *property) +{ + const auto it = m_alignDefault.constFind(property); + if (it == m_alignDefault.cend()) + return false; + QtVariantProperty *alignProperty = variantProperty(property); + alignProperty->setValue(DesignerPropertyManager::alignDefault(alignProperty)); + alignProperty->setModified(false); + return true; +} bool DesignerPropertyManager::resetFontSubProperty(QtProperty *property) { diff --git a/src/designer/src/components/propertyeditor/designerpropertymanager.h b/src/designer/src/components/propertyeditor/designerpropertymanager.h index 25c45f855..8af2b79c1 100644 --- a/src/designer/src/components/propertyeditor/designerpropertymanager.h +++ b/src/designer/src/components/propertyeditor/designerpropertymanager.h @@ -135,6 +135,7 @@ public: QString valueText(const QtProperty *property) const override; QIcon valueIcon(const QtProperty *property) const override; + bool resetTextAlignmentProperty(QtProperty *property); bool resetFontSubProperty(QtProperty *property); bool resetIconSubProperty(QtProperty *subProperty); @@ -156,6 +157,10 @@ public: static bool useIdBasedTranslations() { return m_IdBasedTranslations; } + static QString alignDefaultAttribute(); + + static uint alignDefault(const QtVariantProperty *prop); + public Q_SLOTS: void setAttribute(QtProperty *property, const QString &attribute, const QVariant &value) override; void setValue(QtProperty *property, const QVariant &value) override; @@ -200,6 +205,7 @@ private: PropertyToPropertyMap m_propertyToAlignV; PropertyToPropertyMap m_alignHToProperty; PropertyToPropertyMap m_alignVToProperty; + QHash<const QtProperty *, Qt::Alignment> m_alignDefault; QMap<QtProperty *, QMap<QPair<QIcon::Mode, QIcon::State>, QtProperty *> > m_propertyToIconSubProperties; QMap<QtProperty *, QPair<QIcon::Mode, QIcon::State> > m_iconSubPropertyToState; diff --git a/src/designer/src/components/propertyeditor/propertyeditor.cpp b/src/designer/src/components/propertyeditor/propertyeditor.cpp index d4740cc4b..35135645b 100644 --- a/src/designer/src/components/propertyeditor/propertyeditor.cpp +++ b/src/designer/src/components/propertyeditor/propertyeditor.cpp @@ -1187,6 +1187,9 @@ void PropertyEditor::slotResetProperty(QtProperty *property) if (m_propertyManager->resetIconSubProperty(property)) return; + if (m_propertyManager->resetTextAlignmentProperty(property)) + return; + if (!m_propertyToGroup.contains(property)) return; diff --git a/src/designer/src/components/taskmenu/itemlisteditor.cpp b/src/designer/src/components/taskmenu/itemlisteditor.cpp index 2f8ce159b..0549f9e69 100644 --- a/src/designer/src/components/taskmenu/itemlisteditor.cpp +++ b/src/designer/src/components/taskmenu/itemlisteditor.cpp @@ -116,12 +116,17 @@ static QStringList c2qStringList(const char * const in[]) return out; } -void AbstractItemEditor::setupProperties(PropertyDefinition *propList) +void AbstractItemEditor::setupProperties(const PropertyDefinition *propList, + Qt::Alignment alignDefault) { for (int i = 0; propList[i].name; i++) { int type = propList[i].typeFunc ? propList[i].typeFunc() : propList[i].type; int role = propList[i].role; QtVariantProperty *prop = m_propertyManager->addProperty(type, QLatin1String(propList[i].name)); + if (role == Qt::TextAlignmentRole) { + prop->setAttribute(DesignerPropertyManager::alignDefaultAttribute(), + QVariant(uint(alignDefault))); + } Q_ASSERT(prop); if (role == Qt::ToolTipPropertyRole || role == Qt::WhatsThisPropertyRole) prop->setAttribute(QStringLiteral("validationMode"), ValidationRichText); @@ -148,9 +153,11 @@ void AbstractItemEditor::setupObject(QWidget *object) m_editorFactory->setFormWindowBase(fwb); } -void AbstractItemEditor::setupEditor(QWidget *object, PropertyDefinition *propList) +void AbstractItemEditor::setupEditor(QWidget *object, + const PropertyDefinition *propList, + Qt::Alignment alignDefault) { - setupProperties(propList); + setupProperties(propList, alignDefault); setupObject(object); } @@ -208,6 +215,9 @@ void AbstractItemEditor::resetProperty(QtProperty *property) if (m_propertyManager->resetIconSubProperty(property)) return; + if (m_propertyManager->resetTextAlignmentProperty(property)) + return; + BoolBlocker block(m_updatingBrowser); QtVariantProperty *prop = m_propertyManager->variantProperty(property); @@ -243,15 +253,18 @@ void AbstractItemEditor::updateBrowser() for (QtVariantProperty *prop : qAsConst(m_properties)) { int role = m_propertyToRole.value(prop); QVariant val = getItemData(role); + + bool modified = false; if (!val.isValid()) { if (role == ItemFlagsShadowRole) val = QVariant::fromValue(defaultItemFlags()); else val = QVariant(int(prop->value().userType()), nullptr); - prop->setModified(false); } else { - prop->setModified(true); + modified = role != Qt::TextAlignmentRole + || val.toUInt() != DesignerPropertyManager::alignDefault(prop); } + prop->setModified(modified); prop->setValue(val); } @@ -296,9 +309,11 @@ ItemListEditor::ItemListEditor(QDesignerFormWindowInterface *form, QWidget *pare connect(iconCache(), &DesignerIconCache::reloaded, this, &AbstractItemEditor::cacheReloaded); } -void ItemListEditor::setupEditor(QWidget *object, PropertyDefinition *propList) +void ItemListEditor::setupEditor(QWidget *object, + const PropertyDefinition *propList, + Qt::Alignment alignDefault) { - AbstractItemEditor::setupEditor(object, propList); + AbstractItemEditor::setupEditor(object, propList, alignDefault); if (ui.listWidget->count() > 0) ui.listWidget->setCurrentRow(0); diff --git a/src/designer/src/components/taskmenu/itemlisteditor.h b/src/designer/src/components/taskmenu/itemlisteditor.h index d35415fa1..a12591b5d 100644 --- a/src/designer/src/components/taskmenu/itemlisteditor.h +++ b/src/designer/src/components/taskmenu/itemlisteditor.h @@ -86,9 +86,11 @@ private slots: protected: virtual int defaultItemFlags() const = 0; - void setupProperties(PropertyDefinition *propDefs); + void setupProperties(const PropertyDefinition *propList, + Qt::Alignment alignDefault = Qt::AlignLeading | Qt::AlignVCenter); void setupObject(QWidget *object); - void setupEditor(QWidget *object, PropertyDefinition *propDefs); + void setupEditor(QWidget *object, const PropertyDefinition *propDefs, + Qt::Alignment alignDefault = Qt::AlignLeading | Qt::AlignVCenter); void injectPropertyBrowser(QWidget *parent, QWidget *widget); void updateBrowser(); virtual void setItemData(int role, const QVariant &v) = 0; @@ -112,7 +114,8 @@ class ItemListEditor: public AbstractItemEditor public: explicit ItemListEditor(QDesignerFormWindowInterface *form, QWidget *parent); - void setupEditor(QWidget *object, PropertyDefinition *propDefs); + void setupEditor(QWidget *object, const PropertyDefinition *propDefs, + Qt::Alignment alignDefault = Qt::AlignLeading | Qt::AlignVCenter); QListWidget *listWidget() const { return ui.listWidget; } void setNewItemText(const QString &tpl) { m_newItemText = tpl; } QString newItemText() const { return m_newItemText; } diff --git a/src/designer/src/components/taskmenu/tablewidgeteditor.cpp b/src/designer/src/components/taskmenu/tablewidgeteditor.cpp index dd309f2e9..0f24e00dd 100644 --- a/src/designer/src/components/taskmenu/tablewidgeteditor.cpp +++ b/src/designer/src/components/taskmenu/tablewidgeteditor.cpp @@ -136,11 +136,19 @@ TableWidgetContents TableWidgetEditor::fillContentsFromTableWidget(QTableWidget tblCont.fromTableWidget(tableWidget, false); tblCont.applyToTableWidget(ui.tableWidget, iconCache(), true); - tblCont.m_verticalHeader.applyToListWidget(m_rowEditor->listWidget(), iconCache(), true); - m_rowEditor->setupEditor(tableWidget, tableHeaderPropList); - - tblCont.m_horizontalHeader.applyToListWidget(m_columnEditor->listWidget(), iconCache(), true); - m_columnEditor->setupEditor(tableWidget, tableHeaderPropList); + auto *header = tableWidget->verticalHeader(); + auto headerAlignment = header != nullptr + ? header->defaultAlignment() : Qt::Alignment(Qt::AlignLeading | Qt::AlignVCenter); + tblCont.m_verticalHeader.applyToListWidget(m_rowEditor->listWidget(), iconCache(), + true, headerAlignment); + m_rowEditor->setupEditor(tableWidget, tableHeaderPropList, headerAlignment); + + header = tableWidget->horizontalHeader(); + headerAlignment = header != nullptr + ? header->defaultAlignment() : Qt::Alignment(Qt::AlignCenter); + tblCont.m_horizontalHeader.applyToListWidget(m_columnEditor->listWidget(), iconCache(), + true, headerAlignment); + m_columnEditor->setupEditor(tableWidget, tableHeaderPropList, headerAlignment); setupEditor(tableWidget, tableItemPropList); if (ui.tableWidget->columnCount() > 0 && ui.tableWidget->rowCount() > 0) diff --git a/src/designer/src/lib/shared/qdesigner_command.cpp b/src/designer/src/lib/shared/qdesigner_command.cpp index 8ebd343e1..54234089b 100644 --- a/src/designer/src/lib/shared/qdesigner_command.cpp +++ b/src/designer/src/lib/shared/qdesigner_command.cpp @@ -2269,16 +2269,19 @@ void ListContents::createFromListWidget(const QListWidget *listWidget, bool edit m_items.append(ItemData(listWidget->item(i), editor)); } -void ListContents::applyToListWidget(QListWidget *listWidget, DesignerIconCache *iconCache, bool editor) const +void ListContents::applyToListWidget(QListWidget *listWidget, DesignerIconCache *iconCache, + bool editor, Qt::Alignment alignmentDefault) const { listWidget->clear(); int i = 0; for (const ItemData &entry : m_items) { - if (!entry.isValid()) - new QListWidgetItem(TableWidgetContents::defaultHeaderText(i), listWidget); - else - listWidget->addItem(entry.createListItem(iconCache, editor)); + auto *item = entry.isValid() + ? entry.createListItem(iconCache, editor) + : new QListWidgetItem(TableWidgetContents::defaultHeaderText(i)); + if (item->textAlignment() == 0) + item->setTextAlignment(alignmentDefault); + listWidget->addItem(item); i++; } } diff --git a/src/designer/src/lib/shared/qdesigner_command_p.h b/src/designer/src/lib/shared/qdesigner_command_p.h index a62e84ca5..e9be58bda 100644 --- a/src/designer/src/lib/shared/qdesigner_command_p.h +++ b/src/designer/src/lib/shared/qdesigner_command_p.h @@ -865,7 +865,9 @@ struct QDESIGNER_SHARED_EXPORT ListContents { QTreeWidgetItem *createTreeItem(DesignerIconCache *iconCache) const; void createFromListWidget(const QListWidget *listWidget, bool editor); - void applyToListWidget(QListWidget *listWidget, DesignerIconCache *iconCache, bool editor) const; + void applyToListWidget(QListWidget *listWidget, DesignerIconCache *iconCache, + bool editor, + Qt::Alignment alignmentDefault = Qt::AlignLeading | Qt::AlignVCenter) const; void createFromComboBox(const QComboBox *listWidget); void applyToComboBox(QComboBox *listWidget, DesignerIconCache *iconCache) const; diff --git a/src/designer/src/lib/uilib/abstractformbuilder.cpp b/src/designer/src/lib/uilib/abstractformbuilder.cpp index 41f0e37a4..fa144b49f 100644 --- a/src/designer/src/lib/uilib/abstractformbuilder.cpp +++ b/src/designer/src/lib/uilib/abstractformbuilder.cpp @@ -1634,24 +1634,28 @@ static void storeItemFlags(const T *item, QList<DomProperty*> *properties) template<class T> static void storeItemProps(QAbstractFormBuilder *abstractFormBuilder, const T *item, - QList<DomProperty*> *properties) + QList<DomProperty*> *properties, + Qt::Alignment defaultAlign = Qt::AlignLeading | Qt::AlignVCenter) { static const QFormBuilderStrings &strings = QFormBuilderStrings::instance(); FriendlyFB * const formBuilder = static_cast<FriendlyFB *>(abstractFormBuilder); DomProperty *p; - QVariant v; for (const QFormBuilderStrings::TextRoleNName &it : strings.itemTextRoles) if ((p = formBuilder->saveText(it.second, item->data(it.first.second)))) properties->append(p); - for (const QFormBuilderStrings::RoleNName &it : strings.itemRoles) - if ((v = item->data(it.first)).isValid() && - (p = variantToDomProperty(abstractFormBuilder, - static_cast<const QMetaObject *>(&QAbstractFormBuilderGadget::staticMetaObject), - it.second, v))) + auto *mo = static_cast<const QMetaObject *>(&QAbstractFormBuilderGadget::staticMetaObject); + for (const QFormBuilderStrings::RoleNName &it : strings.itemRoles) { + const QVariant v = item->data(it.first); + const bool isModified = v.isValid() + && (it.first != Qt::TextAlignmentRole || v.toUInt() != uint(defaultAlign)); + if (isModified && + (p = variantToDomProperty(abstractFormBuilder, mo, it.second, v))) { properties->append(p); + } + } if ((p = formBuilder->saveResource(item->data(Qt::DecorationPropertyRole)))) properties->append(p); @@ -1809,11 +1813,12 @@ void QAbstractFormBuilder::saveTableWidgetExtraInfo(QTableWidget *tableWidget, D // save the horizontal header QVector<DomColumn *> columns; + auto *header = tableWidget->horizontalHeader(); for (int c = 0; c < tableWidget->columnCount(); c++) { QList<DomProperty*> properties; QTableWidgetItem *item = tableWidget->horizontalHeaderItem(c); if (item) - storeItemProps(this, item, &properties); + storeItemProps(this, item, &properties, header->defaultAlignment()); DomColumn *column = new DomColumn; column->setElementProperty(properties); @@ -1823,11 +1828,12 @@ void QAbstractFormBuilder::saveTableWidgetExtraInfo(QTableWidget *tableWidget, D // save the vertical header QVector<DomRow *> rows; + header = tableWidget->verticalHeader(); for (int r = 0; r < tableWidget->rowCount(); r++) { QList<DomProperty*> properties; QTableWidgetItem *item = tableWidget->verticalHeaderItem(r); if (item) - storeItemProps(this, item, &properties); + storeItemProps(this, item, &properties, header->defaultAlignment()); DomRow *row = new DomRow; row->setElementProperty(properties); |