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