aboutsummaryrefslogtreecommitdiffstats
path: root/src
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
parentad6a1b0d26dee4e6474b73f9363fb6726e304e14 (diff)
QQuickAbstractTextField: inherit QQuickTextInput
Change-Id: Ibd98bd712fa247b2c20c1099fa031ab8184b7f20 Reviewed-by: Jari-Pekka Nurmi <jpnurmi@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r--src/controls/qquickabstracttextfield.cpp141
-rw-r--r--src/controls/qquickabstracttextfield_p.h34
-rw-r--r--src/imports/controls/TextField.qml32
-rw-r--r--src/imports/controls/qtquickcontrols2plugin.cpp2
4 files changed, 141 insertions, 68 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
diff --git a/src/imports/controls/TextField.qml b/src/imports/controls/TextField.qml
index cad8c329..ded85e84 100644
--- a/src/imports/controls/TextField.qml
+++ b/src/imports/controls/TextField.qml
@@ -34,40 +34,24 @@
**
****************************************************************************/
-import QtQuick 2.4
+import QtQuick 2.6
import QtQuick.Controls 2.0
AbstractTextField {
id: control
- implicitWidth: Math.max(background ? background.implicitWidth : 0,
- Math.max(input ? input.implicitWidth : 0,
- placeholder ? placeholder.implicitWidth : 0) + leftPadding + rightPadding)
- implicitHeight: Math.max(background ? background.implicitHeight : 0,
- Math.max(input ? input.implicitHeight : 0,
- placeholder ? placeholder.implicitHeight : 0) + topPadding + bottomPadding)
-
Accessible.name: text
Accessible.role: Accessible.EditableText
- Accessible.readOnly: !input || input.readOnly
+ Accessible.readOnly: readOnly
Accessible.description: placeholder ? placeholder.text : ""
- Accessible.passwordEdit: !!input && (input.echoMode == TextInput.Password ||
- input.echoMode === TextInput.PasswordEchoOnEdit)
+ Accessible.passwordEdit: echoMode === TextInput.Password || echoMode === TextInput.PasswordEchoOnEdit
padding: style.padding
- input: TextInput {
- x: control.leftPadding
- y: control.topPadding
- width: parent.width - control.leftPadding - control.rightPadding
- height: parent.height - control.topPadding - control.bottomPadding
-
- color: style.textColor
- selectionColor: style.selectionColor
- selectedTextColor: style.selectedTextColor
- verticalAlignment: TextInput.AlignVCenter
- Keys.forwardTo: control
- }
+ color: style.textColor
+ selectionColor: style.selectionColor
+ selectedTextColor: style.selectedTextColor
+ verticalAlignment: TextInput.AlignVCenter
placeholder: Text {
x: control.leftPadding
@@ -77,7 +61,7 @@ AbstractTextField {
color: control.style.textColor
opacity: control.style.disabledOpacity
- visible: input ? !input.displayText : !control.text
+ visible: !control.displayText
}
background: Rectangle {
diff --git a/src/imports/controls/qtquickcontrols2plugin.cpp b/src/imports/controls/qtquickcontrols2plugin.cpp
index dc768fb1..a418e5d0 100644
--- a/src/imports/controls/qtquickcontrols2plugin.cpp
+++ b/src/imports/controls/qtquickcontrols2plugin.cpp
@@ -112,6 +112,8 @@ void QtQuickControls2Plugin::registerTypes(const char *uri)
qmlRegisterType<QQuickControl>(uri, 2, 0, "Control");
qmlRegisterType<QQuickExclusiveGroup>(uri, 2, 0, "ExclusiveGroup");
qmlRegisterType<QQuickStyle>(uri, 2, 0, "Style");
+
+ qmlRegisterRevision<QQuickTextInput, 6>(uri, 2, 0);
}
void QtQuickControls2Plugin::initializeEngine(QQmlEngine *engine, const char *uri)