From 2ab5962b7a8af8d63023b8118082b49c33493121 Mon Sep 17 00:00:00 2001 From: Jan Arve Saether <jan-arve.saether@digia.com> Date: Mon, 9 Sep 2013 12:51:13 +0200 Subject: [PATCH] Pick up baselineOffset from the style. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I126fd3d9b399fa3a7c62685060fd49b1cea4df62 Reviewed-by: Jan Arve Sæther <jan-arve.saether@digia.com> --- src/controls/Private/Control.qml | 1 + src/controls/Private/qquickstyleitem.cpp | 68 +++++++++++++++++++ src/controls/Private/qquickstyleitem_p.h | 2 + src/controls/Styles/Desktop/CheckBoxStyle.qml | 2 +- src/controls/Styles/Desktop/ComboBoxStyle.qml | 1 + .../Styles/Desktop/RadioButtonStyle.qml | 1 + src/controls/Styles/Desktop/SpinBoxStyle.qml | 1 + 7 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/controls/Private/Control.qml b/src/controls/Private/Control.qml index 6b9a44155..f2b234fd8 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 82e503ddf..7278ae5b7 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 cfe9866eb..336d3b462 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 2cc688a7c..819c6a819 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 2c1cd7c2d..fd4b6cfe2 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 34d1efa8e..4a00ee22a 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 6fdd407e7..7e1903704 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 -- GitLab