aboutsummaryrefslogtreecommitdiffstats
path: root/src/controls
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2015-03-02 18:11:12 +0100
committerJari-Pekka Nurmi <jpnurmi@theqtcompany.com>2015-03-06 08:46:30 +0200
commit02c7a226b69b2ad1acf86fa76553a9ede9870e42 (patch)
tree01383fa1a91ebfe946815a7a878d14b666a8c69d /src/controls
parentad6a1b0d26dee4e6474b73f9363fb6726e304e14 (diff)
QQuickAbstractTextField: inherit QQuickTextInput
Change-Id: Ibd98bd712fa247b2c20c1099fa031ab8184b7f20 Reviewed-by: Jari-Pekka Nurmi <jpnurmi@theqtcompany.com>
Diffstat (limited to 'src/controls')
-rw-r--r--src/controls/qquickabstracttextfield.cpp141
-rw-r--r--src/controls/qquickabstracttextfield_p.h34
2 files changed, 131 insertions, 44 deletions
diff --git a/src/controls/qquickabstracttextfield.cpp b/src/controls/qquickabstracttextfield.cpp
index 70e53ab3..ced75544 100644
--- a/src/controls/qquickabstracttextfield.cpp
+++ b/src/controls/qquickabstracttextfield.cpp
@@ -35,77 +35,107 @@
****************************************************************************/
#include "qquickabstracttextfield_p.h"
-#include "qquickcontrol_p_p.h"
+#include "qquickabstractapplicationwindow_p.h"
+#include "qquickstyle_p_p.h"
+#include "qquickstyle_p.h"
+#include <QtQuick/private/qquickitem_p.h>
#include <QtQuick/private/qquicktext_p.h>
-#include <QtQuick/private/qquicktextinput_p.h>
+#include <QtQuick/private/qquickclipnode_p.h>
+#include <QtCore/qcoreapplication.h>
QT_BEGIN_NAMESPACE
-class QQuickAbstractTextFieldPrivate : public QQuickControlPrivate
+class QQuickAbstractTextFieldPrivate
{
Q_DECLARE_PUBLIC(QQuickAbstractTextField)
public:
- QQuickAbstractTextFieldPrivate() : input(Q_NULLPTR), placeholder(Q_NULLPTR) { }
+ QQuickAbstractTextFieldPrivate() : hasStyle(false), style(Q_NULLPTR),
+ background(Q_NULLPTR), placeholder(Q_NULLPTR) { }
- void updateText();
+ void resolveStyle(QQuickStyle *other = 0); // TODO
- QString text;
- QQuickTextInput *input;
+ bool hasStyle;
+ QQuickStyle *style;
+ QQuickItem *background;
QQuickText *placeholder;
+ QQuickAbstractTextField *q_ptr;
};
-
-void QQuickAbstractTextFieldPrivate::updateText()
+void QQuickAbstractTextFieldPrivate::resolveStyle(QQuickStyle *res)
{
Q_Q(QQuickAbstractTextField);
- q->setText(input->text());
+ res = QQuickStylePrivate::resolve(q, res);
+ if (style != res) {
+ style = res;
+ emit q->styleChanged();
+ }
}
QQuickAbstractTextField::QQuickAbstractTextField(QQuickItem *parent) :
- QQuickControl(*(new QQuickAbstractTextFieldPrivate), parent)
+ QQuickTextInput(parent), d_ptr(new QQuickAbstractTextFieldPrivate)
{
- setFlag(ItemIsFocusScope);
- setActiveFocusOnTab(true);
+ Q_D(QQuickAbstractTextField);
+ d->q_ptr = this;
}
-QString QQuickAbstractTextField::text() const
+QQuickAbstractTextField::~QQuickAbstractTextField()
+{
+}
+
+QQuickStyle *QQuickAbstractTextField::style() const
{
Q_D(const QQuickAbstractTextField);
- return d->text;
+ if (!d->style)
+ const_cast<QQuickAbstractTextField *>(this)->d_func()->resolveStyle();
+ return d->style;
}
-void QQuickAbstractTextField::setText(const QString &text)
+void QQuickAbstractTextField::setStyle(QQuickStyle *style)
{
Q_D(QQuickAbstractTextField);
- if (d->text != text) {
- d->text = text;
- if (d->input)
- d->input->setText(text);
- emit textChanged();
+ if (d->style != style) {
+ d->hasStyle = true;
+ d->resolveStyle(style);
+
+ QEvent change(QEvent::StyleChange);
+ foreach (QObject *object, findChildren<QObject *>()) {
+ if (qobject_cast<QQuickStylable *>(object))
+ QCoreApplication::sendEvent(object, &change);
+ }
}
}
-QQuickTextInput *QQuickAbstractTextField::input() const
+bool QQuickAbstractTextField::hasStyle() const
{
Q_D(const QQuickAbstractTextField);
- return d->input;
+ return d->hasStyle;
}
-void QQuickAbstractTextField::setInput(QQuickTextInput *input)
+void QQuickAbstractTextField::resetStyle()
+{
+ setStyle(Q_NULLPTR);
+}
+
+QQuickItem *QQuickAbstractTextField::background() const
+{
+ Q_D(const QQuickAbstractTextField);
+ return d->background;
+}
+
+void QQuickAbstractTextField::setBackground(QQuickItem *background)
{
Q_D(QQuickAbstractTextField);
- if (d->input != input) {
- delete d->input;
- d->input = input;
- if (input) {
- if (!input->parentItem())
- input->setParentItem(this);
- input->setText(d->text);
- QObjectPrivate::connect(input, &QQuickTextInput::textChanged, d, &QQuickAbstractTextFieldPrivate::updateText);
+ if (d->background != background) {
+ delete d->background;
+ d->background = background;
+ if (background) {
+ background->setParentItem(this);
+ if (qFuzzyIsNull(background->z()))
+ background->setZ(-1);
}
- emit inputChanged();
+ emit backgroundChanged();
}
}
@@ -127,4 +157,49 @@ void QQuickAbstractTextField::setPlaceholder(QQuickText *placeholder)
}
}
+bool QQuickAbstractTextField::event(QEvent *event)
+{
+ Q_D(QQuickAbstractTextField);
+ if (event->type() == QEvent::StyleChange)
+ d->resolveStyle();
+ return QQuickTextInput::event(event);
+}
+
+void QQuickAbstractTextField::itemChange(ItemChange change, const ItemChangeData &data)
+{
+ Q_D(QQuickAbstractTextField);
+ QQuickTextInput::itemChange(change, data);
+ if (change == ItemSceneChange || change == ItemParentHasChanged)
+ d->resolveStyle();
+}
+
+void QQuickAbstractTextField::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ Q_D(QQuickAbstractTextField);
+ QQuickTextInput::geometryChanged(newGeometry, oldGeometry);
+ if (d->background) {
+ QQuickItemPrivate *p = QQuickItemPrivate::get(d->background);
+ if (!p->widthValid || qFuzzyCompare(d->background->width(), oldGeometry.width()))
+ d->background->setWidth(newGeometry.width());
+ if (!p->heightValid || qFuzzyCompare(d->background->height(), oldGeometry.height()))
+ d->background->setHeight(newGeometry.height());
+ }
+}
+
+QSGNode *QQuickAbstractTextField::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
+{
+ QQuickDefaultClipNode *clipNode = static_cast<QQuickDefaultClipNode *>(oldNode);
+ if (!clipNode)
+ clipNode = new QQuickDefaultClipNode(QRectF());
+
+ clipNode->setRect(clipRect().adjusted(leftPadding(), topPadding(), -rightPadding(), -bottomPadding()));
+ clipNode->update();
+
+ QSGNode *textNode = QQuickTextInput::updatePaintNode(clipNode->firstChild(), data);
+ if (!textNode->parent())
+ clipNode->appendChildNode(textNode);
+
+ return clipNode;
+}
+
QT_END_NAMESPACE
diff --git a/src/controls/qquickabstracttextfield_p.h b/src/controls/qquickabstracttextfield_p.h
index 7469c58d..e666fa9b 100644
--- a/src/controls/qquickabstracttextfield_p.h
+++ b/src/controls/qquickabstracttextfield_p.h
@@ -48,41 +48,53 @@
// We mean it.
//
-#include <QtQuickControls/private/qquickcontrol_p.h>
+#include <QtQuick/private/qquicktextinput_p.h>
+#include <QtQuickControls/private/qtquickcontrolsglobal_p.h>
+#include <QtQuickControls/private/qquickstylable_p.h>
QT_BEGIN_NAMESPACE
class QQuickText;
-class QQuickTextInput;
class QQuickAbstractTextFieldPrivate;
-class Q_QUICKCONTROLS_EXPORT QQuickAbstractTextField : public QQuickControl
+class Q_QUICKCONTROLS_EXPORT QQuickAbstractTextField : public QQuickTextInput, public QQuickStylable
{
Q_OBJECT
- Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged FINAL)
- Q_PROPERTY(QQuickTextInput *input READ input WRITE setInput NOTIFY inputChanged FINAL)
+ Q_INTERFACES(QQuickStylable)
+ Q_PROPERTY(QQuickStyle *style READ style WRITE setStyle RESET resetStyle NOTIFY styleChanged FINAL)
+ Q_PROPERTY(QQuickItem *background READ background WRITE setBackground NOTIFY backgroundChanged FINAL)
Q_PROPERTY(QQuickText *placeholder READ placeholder WRITE setPlaceholder NOTIFY placeholderChanged FINAL)
public:
explicit QQuickAbstractTextField(QQuickItem *parent = Q_NULLPTR);
+ ~QQuickAbstractTextField();
- QString text() const;
- void setText(const QString &text);
+ QQuickStyle *style() const;
+ void setStyle(QQuickStyle *style);
+ bool hasStyle() const;
+ void resetStyle();
- QQuickTextInput *input() const;
- void setInput(QQuickTextInput *input);
+ QQuickItem *background() const;
+ void setBackground(QQuickItem *background);
QQuickText *placeholder() const;
void setPlaceholder(QQuickText *placeholder);
Q_SIGNALS:
- void textChanged();
- void inputChanged();
+ void styleChanged();
+ void backgroundChanged();
void placeholderChanged();
+protected:
+ bool event(QEvent *event) Q_DECL_OVERRIDE;
+ void itemChange(ItemChange, const ItemChangeData &data) Q_DECL_OVERRIDE;
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE;
+ QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) Q_DECL_OVERRIDE;
+
private:
Q_DISABLE_COPY(QQuickAbstractTextField)
Q_DECLARE_PRIVATE(QQuickAbstractTextField)
+ QScopedPointer<QQuickAbstractTextFieldPrivate> d_ptr;
};
QT_END_NAMESPACE