QQuickTextInput: move paddings into extraData
authorLiang Qi <liang.qi@theqtcompany.com>
Mon, 8 Jun 2015 11:59:09 +0000 (13:59 +0200)
committerSimon Hausmann <simon.hausmann@theqtcompany.com>
Mon, 15 Jun 2015 09:31:01 +0000 (09:31 +0000)
Task-number: QTBUG-46529
Change-Id: Ifa072dccdf2dc8c52c6865d13ccf1930c92ec51d
Reviewed-by: Alan Alpert <aalpert@blackberry.com>
src/quick/items/qquicktextinput.cpp
src/quick/items/qquicktextinput_p_p.h

index 8a8d96d..cb5df32 100644 (file)
@@ -2492,6 +2492,19 @@ bool QQuickTextInput::isInputMethodComposing() const
 #endif
 }
 
+QQuickTextInputPrivate::ExtraData::ExtraData()
+    : padding(0)
+    , topPadding(0)
+    , leftPadding(0)
+    , rightPadding(0)
+    , bottomPadding(0)
+    , explicitTopPadding(false)
+    , explicitLeftPadding(false)
+    , explicitRightPadding(false)
+    , explicitBottomPadding(false)
+{
+}
+
 void QQuickTextInputPrivate::init()
 {
     Q_Q(QQuickTextInput);
@@ -2714,9 +2727,11 @@ void QQuickTextInputPrivate::setTopPadding(qreal value, bool reset)
 {
     Q_Q(QQuickTextInput);
     qreal oldPadding = q->topPadding();
-    topPadding = value;
-    explicitTopPadding = !reset;
-    if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding))) {
+    if (!reset || extra.isAllocated()) {
+        extra.value().topPadding = value;
+        extra.value().explicitTopPadding = !reset;
+    }
+    if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding()))) {
         updateLayout();
         emit q->topPaddingChanged();
     }
@@ -2726,9 +2741,11 @@ void QQuickTextInputPrivate::setLeftPadding(qreal value, bool reset)
 {
     Q_Q(QQuickTextInput);
     qreal oldPadding = q->leftPadding();
-    leftPadding = value;
-    explicitLeftPadding = !reset;
-    if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding))) {
+    if (!reset || extra.isAllocated()) {
+        extra.value().leftPadding = value;
+        extra.value().explicitLeftPadding = !reset;
+    }
+    if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding()))) {
         updateLayout();
         emit q->leftPaddingChanged();
     }
@@ -2738,9 +2755,11 @@ void QQuickTextInputPrivate::setRightPadding(qreal value, bool reset)
 {
     Q_Q(QQuickTextInput);
     qreal oldPadding = q->rightPadding();
-    rightPadding = value;
-    explicitRightPadding = !reset;
-    if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding))) {
+    if (!reset || extra.isAllocated()) {
+        extra.value().rightPadding = value;
+        extra.value().explicitRightPadding = !reset;
+    }
+    if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding()))) {
         updateLayout();
         emit q->rightPaddingChanged();
     }
@@ -2750,9 +2769,11 @@ void QQuickTextInputPrivate::setBottomPadding(qreal value, bool reset)
 {
     Q_Q(QQuickTextInput);
     qreal oldPadding = q->bottomPadding();
-    bottomPadding = value;
-    explicitBottomPadding = !reset;
-    if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding))) {
+    if (!reset || extra.isAllocated()) {
+        extra.value().bottomPadding = value;
+        extra.value().explicitBottomPadding = !reset;
+    }
+    if ((!reset && !qFuzzyCompare(oldPadding, value)) || (reset && !qFuzzyCompare(oldPadding, padding()))) {
         updateLayout();
         emit q->bottomPaddingChanged();
     }
@@ -4405,24 +4426,25 @@ void QQuickTextInput::ensureVisible(int position)
 qreal QQuickTextInput::padding() const
 {
     Q_D(const QQuickTextInput);
-    return d->padding;
+    return d->padding();
 }
 
 void QQuickTextInput::setPadding(qreal padding)
 {
     Q_D(QQuickTextInput);
-    if (qFuzzyCompare(d->padding, padding))
+    if (qFuzzyCompare(d->padding(), padding))
         return;
-    d->padding = padding;
+
+    d->extra.value().padding = padding;
     d->updateLayout();
     emit paddingChanged();
-    if (!d->explicitTopPadding)
+    if (!d->extra.isAllocated() || !d->extra->explicitTopPadding)
         emit topPaddingChanged();
-    if (!d->explicitLeftPadding)
+    if (!d->extra.isAllocated() || !d->extra->explicitLeftPadding)
         emit leftPaddingChanged();
-    if (!d->explicitRightPadding)
+    if (!d->extra.isAllocated() || !d->extra->explicitRightPadding)
         emit rightPaddingChanged();
-    if (!d->explicitBottomPadding)
+    if (!d->extra.isAllocated() || !d->extra->explicitBottomPadding)
         emit bottomPaddingChanged();
 }
 
@@ -4434,9 +4456,9 @@ void QQuickTextInput::resetPadding()
 qreal QQuickTextInput::topPadding() const
 {
     Q_D(const QQuickTextInput);
-    if (d->explicitTopPadding)
-        return d->topPadding;
-    return d->padding;
+    if (d->extra.isAllocated() && d->extra->explicitTopPadding)
+        return d->extra->topPadding;
+    return d->padding();
 }
 
 void QQuickTextInput::setTopPadding(qreal padding)
@@ -4454,9 +4476,9 @@ void QQuickTextInput::resetTopPadding()
 qreal QQuickTextInput::leftPadding() const
 {
     Q_D(const QQuickTextInput);
-    if (d->explicitLeftPadding)
-        return d->leftPadding;
-    return d->padding;
+    if (d->extra.isAllocated() && d->extra->explicitLeftPadding)
+        return d->extra->leftPadding;
+    return d->padding();
 }
 
 void QQuickTextInput::setLeftPadding(qreal padding)
@@ -4474,9 +4496,9 @@ void QQuickTextInput::resetLeftPadding()
 qreal QQuickTextInput::rightPadding() const
 {
     Q_D(const QQuickTextInput);
-    if (d->explicitRightPadding)
-        return d->rightPadding;
-    return d->padding;
+    if (d->extra.isAllocated() && d->extra->explicitRightPadding)
+        return d->extra->rightPadding;
+    return d->padding();
 }
 
 void QQuickTextInput::setRightPadding(qreal padding)
@@ -4494,9 +4516,9 @@ void QQuickTextInput::resetRightPadding()
 qreal QQuickTextInput::bottomPadding() const
 {
     Q_D(const QQuickTextInput);
-    if (d->explicitBottomPadding)
-        return d->bottomPadding;
-    return d->padding;
+    if (d->extra.isAllocated() && d->extra->explicitBottomPadding)
+        return d->extra->bottomPadding;
+    return d->padding();
 }
 
 void QQuickTextInput::setBottomPadding(qreal padding)
index 25ee2e7..387eb29 100644 (file)
@@ -47,6 +47,7 @@
 #include <QtGui/qpalette.h>
 #include <QtGui/qtextlayout.h>
 #include <QtGui/qstylehints.h>
+#include <private/qlazilyallocated_p.h>
 
 #include "qplatformdefs.h"
 
@@ -71,18 +72,24 @@ public:
 
     typedef QQuickTextInput Public;
 
+    struct ExtraData {
+        ExtraData();
+
+        qreal padding;
+        qreal topPadding;
+        qreal leftPadding;
+        qreal rightPadding;
+        qreal bottomPadding;
+        bool explicitTopPadding : 1;
+        bool explicitLeftPadding : 1;
+        bool explicitRightPadding : 1;
+        bool explicitBottomPadding : 1;
+    };
+    QLazilyAllocated<ExtraData> extra;
+
     QQuickTextInputPrivate()
         : hscroll(0)
         , vscroll(0)
-        , padding(0)
-        , topPadding(0)
-        , leftPadding(0)
-        , rightPadding(0)
-        , bottomPadding(0)
-        , explicitTopPadding(false)
-        , explicitLeftPadding(false)
-        , explicitRightPadding(false)
-        , explicitBottomPadding(false)
         , cursorItem(0)
         , textNode(0)
         , m_maskData(0)
@@ -198,16 +205,6 @@ public:
     qreal hscroll;
     qreal vscroll;
 
-    qreal padding;
-    qreal topPadding;
-    qreal leftPadding;
-    qreal rightPadding;
-    qreal bottomPadding;
-    bool explicitTopPadding;
-    bool explicitLeftPadding;
-    bool explicitRightPadding;
-    bool explicitBottomPadding;
-
     QTextLayout m_textLayout;
     QString m_text;
     QString m_inputMask;
@@ -439,6 +436,7 @@ public:
 
     qreal getImplicitWidth() const Q_DECL_OVERRIDE;
 
+    inline qreal padding() const { return extra.isAllocated() ? extra->padding : 0.0; }
     void setTopPadding(qreal value, bool reset = false);
     void setLeftPadding(qreal value, bool reset = false);
     void setRightPadding(qreal value, bool reset = false);