diff --git a/src/controls/Private/Control.qml b/src/controls/Private/Control.qml index 6b9a44155a59d9c40f8dd876eacf59ac88b9b9ab..f2b234fd839ff300700c8f1837abfcb9db20f17d 100644 --- a/src/controls/Private/Control.qml +++ b/src/controls/Private/Control.qml @@ -68,6 +68,7 @@ FocusScope { implicitWidth: __panel ? __panel.implicitWidth: 0 implicitHeight: __panel ? __panel.implicitHeight: 0 + baselineOffset: __panel ? __panel.baselineOffset: 0 activeFocusOnTab: false /*! \internal */ diff --git a/src/controls/Private/qquickstyleitem.cpp b/src/controls/Private/qquickstyleitem.cpp index 82e503ddf7cdeacb7125d9dbbc4be0b6bd154acb..7278ae5b7aeaac6db366f677231e8c45c074d747 100644 --- a/src/controls/Private/qquickstyleitem.cpp +++ b/src/controls/Private/qquickstyleitem.cpp @@ -165,6 +165,10 @@ QQuickStyleItem::QQuickStyleItem(QQuickItem *parent) connect(this, SIGNAL(contentWidthChanged(int)), this, SLOT(updateSizeHint())); connect(this, SIGNAL(contentHeightChanged(int)), this, SLOT(updateSizeHint())); connect(this, SIGNAL(widthChanged()), this, SLOT(updateRect())); + connect(this, SIGNAL(heightChanged()), this, SLOT(updateRect())); + + connect(this, SIGNAL(heightChanged()), this, SLOT(updateBaselineOffset())); + connect(this, SIGNAL(contentHeightChanged(int)), this, SLOT(updateBaselineOffset())); } QQuickStyleItem::~QQuickStyleItem() @@ -879,6 +883,69 @@ QSize QQuickStyleItem::sizeFromContents(int width, int height) } return size; } +qreal QQuickStyleItem::baselineOffset() +{ + QRect r; + switch (m_itemType) { + case RadioButton: + r = qApp->style()->subElementRect(QStyle::SE_RadioButtonContents, m_styleoption); + break; + case Button: + r = qApp->style()->subElementRect(QStyle::SE_PushButtonContents, m_styleoption); + break; + case CheckBox: + r = qApp->style()->subElementRect(QStyle::SE_CheckBoxContents, m_styleoption); + break; + case Edit: + r = qApp->style()->subElementRect(QStyle::SE_LineEditContents, m_styleoption); + break; + case ComboBox: + if (const QStyleOptionComboBox *combo = qstyleoption_cast<const QStyleOptionComboBox *>(m_styleoption)) { + r = qApp->style()->subControlRect(QStyle::CC_ComboBox, combo, QStyle::SC_ComboBoxEditField); + if (style() != QStringLiteral("mac")) + r.adjust(0,0,0,1); + } + break; + case SpinBox: + if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox *>(m_styleoption)) + r = qApp->style()->subControlRect(QStyle::CC_SpinBox, spinbox, QStyle::SC_SpinBoxEditField); + break; + default: + break; + } + if (r.isValid()) { + const QFontMetrics &fm = m_styleoption->fontMetrics; + const float surplus = r.height() - fm.height(); + float result = float(r.top()) + surplus/2.0 + fm.ascent(); +#ifdef Q_OS_OSX + if (style() == QStringLiteral("mac")) { + switch (m_itemType) { + case Button: + case Edit: + result -= 1; + break; + case ComboBox: + // adjust back the adjustments done in drawControl(CE_ComboBoxLabel) + result += 1; + break; + default: + break; + } + } +#endif + return result; + } + + return 0.; +} + +void QQuickStyleItem::updateBaselineOffset() +{ + const qreal baseline = baselineOffset(); + if (baseline > 0) + setBaselineOffset(baseline); +} + void QQuickStyleItem::setContentWidth(int arg) { if (m_contentWidth != arg) { @@ -905,6 +972,7 @@ void QQuickStyleItem::updateRect() { initStyleOption(); m_styleoption->rect.setWidth(width()); + m_styleoption->rect.setHeight(height()); } int QQuickStyleItem::pixelMetric(const QString &metric) diff --git a/src/controls/Private/qquickstyleitem_p.h b/src/controls/Private/qquickstyleitem_p.h index cfe9866ebdb14592ffd8040270f369212d631270..336d3b46233e0c48ff8f6f3b66251a8b6c2ecadb 100644 --- a/src/controls/Private/qquickstyleitem_p.h +++ b/src/controls/Private/qquickstyleitem_p.h @@ -184,6 +184,7 @@ public Q_SLOTS: QVariant styleHint(const QString&); void updateSizeHint(); void updateRect(); + void updateBaselineOffset(); void updateItem(){polish();} QString hitTest(int x, int y); QRectF subControlRect(const QString &subcontrolString); @@ -224,6 +225,7 @@ protected: private: QSize sizeFromContents(int width, int height); + qreal baselineOffset(); protected: QWidget *m_dummywidget; diff --git a/src/controls/Styles/Desktop/CheckBoxStyle.qml b/src/controls/Styles/Desktop/CheckBoxStyle.qml index 2cc688a7c6b39d212a03abad5faa46b9cbffb7b7..819c6a8198877e6580591a5db7491da47413431e 100644 --- a/src/controls/Styles/Desktop/CheckBoxStyle.qml +++ b/src/controls/Styles/Desktop/CheckBoxStyle.qml @@ -47,7 +47,7 @@ Style { implicitWidth: styleitem.implicitWidth implicitHeight: styleitem.implicitHeight - + baselineOffset: styleitem.baselineOffset StyleItem { id: styleitem elementType: "checkbox" diff --git a/src/controls/Styles/Desktop/ComboBoxStyle.qml b/src/controls/Styles/Desktop/ComboBoxStyle.qml index 2c1cd7c2d01d88aa9860b2ddfc21642a6f3c44b9..fd4b6cfe2c96b45258a58b635ea8b5da3a804987 100644 --- a/src/controls/Styles/Desktop/ComboBoxStyle.qml +++ b/src/controls/Styles/Desktop/ComboBoxStyle.qml @@ -51,6 +51,7 @@ Style { implicitWidth: 125 implicitHeight: styleItem.implicitHeight + baselineOffset: styleItem.baselineOffset anchors.fill: parent StyleItem { id: styleItem diff --git a/src/controls/Styles/Desktop/RadioButtonStyle.qml b/src/controls/Styles/Desktop/RadioButtonStyle.qml index 34d1efa8e01e62ba233b9238a157b3b02a7d8b97..4a00ee22a6d62f044fbf95fa93470e301e347ddd 100644 --- a/src/controls/Styles/Desktop/RadioButtonStyle.qml +++ b/src/controls/Styles/Desktop/RadioButtonStyle.qml @@ -48,6 +48,7 @@ Style { implicitWidth: styleitem.implicitWidth implicitHeight: styleitem.implicitHeight + baselineOffset: styleitem.baselineOffset StyleItem { id: styleitem diff --git a/src/controls/Styles/Desktop/SpinBoxStyle.qml b/src/controls/Styles/Desktop/SpinBoxStyle.qml index 6fdd407e7e3f3be9943fa80e1bed95f4f41c1e37..7e19037045768d78dbb3e2071a75222903bbda07 100644 --- a/src/controls/Styles/Desktop/SpinBoxStyle.qml +++ b/src/controls/Styles/Desktop/SpinBoxStyle.qml @@ -81,6 +81,7 @@ Style { implicitWidth: styleitem.implicitWidth implicitHeight: styleitem.implicitHeight + baselineOffset: styleitem.baselineOffset Item { id: edit