summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2021-05-06 11:18:17 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2021-05-10 15:01:06 +0200
commit7eefe6232e2f7a189650b36cb321135442c71f06 (patch)
treec2ffdeb1b5a28c717cf34de130a49dd5645e0722
parent3b3516b60998e1e7f551422fe4ec11ed2e7c2a2a (diff)
downloadqttools-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)
-rw-r--r--src/designer/src/components/propertyeditor/designerpropertymanager.cpp29
-rw-r--r--src/designer/src/components/propertyeditor/designerpropertymanager.h6
-rw-r--r--src/designer/src/components/propertyeditor/propertyeditor.cpp3
-rw-r--r--src/designer/src/components/taskmenu/itemlisteditor.cpp29
-rw-r--r--src/designer/src/components/taskmenu/itemlisteditor.h9
-rw-r--r--src/designer/src/components/taskmenu/tablewidgeteditor.cpp18
-rw-r--r--src/designer/src/lib/shared/qdesigner_command.cpp13
-rw-r--r--src/designer/src/lib/shared/qdesigner_command_p.h4
-rw-r--r--src/designer/src/lib/uilib/abstractformbuilder.cpp24
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);