diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/controls/qquickabstracttextfield.cpp | 141 | ||||
-rw-r--r-- | src/controls/qquickabstracttextfield_p.h | 34 | ||||
-rw-r--r-- | src/imports/controls/TextField.qml | 32 | ||||
-rw-r--r-- | src/imports/controls/qtquickcontrols2plugin.cpp | 2 |
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) |