From f50aafacfa18bf7ab12433076ef95d9af9b80c71 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Tue, 3 Mar 2015 09:39:40 +0100 Subject: QQuickAbstractTextArea: inherit QQuickTextEdit Change-Id: I974dd801d3cd3cf3d7024e1c8727ec0607e084f3 Reviewed-by: Jari-Pekka Nurmi --- src/controls/qquickabstracttextarea.cpp | 140 ++++++++++++++++++------ src/controls/qquickabstracttextarea_p.h | 34 ++++-- src/imports/controls/TextArea.qml | 25 +---- src/imports/controls/qtquickcontrols2plugin.cpp | 1 + 4 files changed, 137 insertions(+), 63 deletions(-) diff --git a/src/controls/qquickabstracttextarea.cpp b/src/controls/qquickabstracttextarea.cpp index 41e24684..0da6cdb1 100644 --- a/src/controls/qquickabstracttextarea.cpp +++ b/src/controls/qquickabstracttextarea.cpp @@ -35,76 +35,107 @@ ****************************************************************************/ #include "qquickabstracttextarea_p.h" -#include "qquickcontrol_p_p.h" +#include "qquickabstractapplicationwindow_p.h" +#include "qquickstyle_p_p.h" +#include "qquickstyle_p.h" +#include #include -#include +#include +#include QT_BEGIN_NAMESPACE -class QQuickAbstractTextAreaPrivate : public QQuickControlPrivate +class QQuickAbstractTextAreaPrivate { Q_DECLARE_PUBLIC(QQuickAbstractTextArea) public: - QQuickAbstractTextAreaPrivate() : edit(Q_NULLPTR), placeholder(Q_NULLPTR) { } + QQuickAbstractTextAreaPrivate() : hasStyle(false), style(Q_NULLPTR), + background(Q_NULLPTR), placeholder(Q_NULLPTR) { } - void updateText(); + void resolveStyle(QQuickStyle *other = 0); // TODO - QString text; - QQuickTextEdit *edit; + bool hasStyle; + QQuickStyle *style; + QQuickItem *background; QQuickText *placeholder; + QQuickAbstractTextArea *q_ptr; }; -void QQuickAbstractTextAreaPrivate::updateText() +void QQuickAbstractTextAreaPrivate::resolveStyle(QQuickStyle *res) { Q_Q(QQuickAbstractTextArea); - q->setText(edit->text()); + res = QQuickStylePrivate::resolve(q, res); + if (style != res) { + style = res; + emit q->styleChanged(); + } } QQuickAbstractTextArea::QQuickAbstractTextArea(QQuickItem *parent) : - QQuickControl(*(new QQuickAbstractTextAreaPrivate), parent) + QQuickTextEdit(parent), d_ptr(new QQuickAbstractTextAreaPrivate) +{ + Q_D(QQuickAbstractTextArea); + d->q_ptr = this; +} + +QQuickAbstractTextArea::~QQuickAbstractTextArea() { - setFlag(ItemIsFocusScope); - setActiveFocusOnTab(true); } -QString QQuickAbstractTextArea::text() const +QQuickStyle *QQuickAbstractTextArea::style() const { Q_D(const QQuickAbstractTextArea); - return d->text; + if (!d->style) + const_cast(this)->d_func()->resolveStyle(); + return d->style; } -void QQuickAbstractTextArea::setText(const QString &text) +void QQuickAbstractTextArea::setStyle(QQuickStyle *style) { Q_D(QQuickAbstractTextArea); - if (d->text != text) { - d->text = text; - if (d->edit) - d->edit->setText(text); - emit textChanged(); + if (d->style != style) { + d->hasStyle = true; + d->resolveStyle(style); + + QEvent change(QEvent::StyleChange); + foreach (QObject *object, findChildren()) { + if (qobject_cast(object)) + QCoreApplication::sendEvent(object, &change); + } } } -QQuickTextEdit *QQuickAbstractTextArea::edit() const +bool QQuickAbstractTextArea::hasStyle() const +{ + Q_D(const QQuickAbstractTextArea); + return d->hasStyle; +} + +void QQuickAbstractTextArea::resetStyle() +{ + setStyle(Q_NULLPTR); +} + +QQuickItem *QQuickAbstractTextArea::background() const { Q_D(const QQuickAbstractTextArea); - return d->edit; + return d->background; } -void QQuickAbstractTextArea::setEdit(QQuickTextEdit *edit) +void QQuickAbstractTextArea::setBackground(QQuickItem *background) { Q_D(QQuickAbstractTextArea); - if (d->edit != edit) { - delete d->edit; - d->edit = edit; - if (edit) { - if (!edit->parentItem()) - edit->setParentItem(this); - edit->setText(d->text); - QObjectPrivate::connect(edit, &QQuickTextEdit::textChanged, d, &QQuickAbstractTextAreaPrivate::updateText); + if (d->background != background) { + delete d->background; + d->background = background; + if (background) { + background->setParentItem(this); + if (qFuzzyIsNull(background->z())) + background->setZ(-1); } - emit editChanged(); + emit backgroundChanged(); } } @@ -126,4 +157,49 @@ void QQuickAbstractTextArea::setPlaceholder(QQuickText *placeholder) } } +bool QQuickAbstractTextArea::event(QEvent *event) +{ + Q_D(QQuickAbstractTextArea); + if (event->type() == QEvent::StyleChange) + d->resolveStyle(); + return QQuickTextEdit::event(event); +} + +void QQuickAbstractTextArea::itemChange(ItemChange change, const ItemChangeData &data) +{ + Q_D(QQuickAbstractTextArea); + QQuickTextEdit::itemChange(change, data); + if (change == ItemSceneChange || change == ItemParentHasChanged) + d->resolveStyle(); +} + +void QQuickAbstractTextArea::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) +{ + Q_D(QQuickAbstractTextArea); + QQuickTextEdit::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 *QQuickAbstractTextArea::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data) +{ + QQuickDefaultClipNode *clipNode = static_cast(oldNode); + if (!clipNode) + clipNode = new QQuickDefaultClipNode(QRectF()); + + clipNode->setRect(clipRect().adjusted(leftPadding(), topPadding(), -rightPadding(), -bottomPadding())); + clipNode->update(); + + QSGNode *textNode = QQuickTextEdit::updatePaintNode(clipNode->firstChild(), data); + if (!textNode->parent()) + clipNode->appendChildNode(textNode); + + return clipNode; +} + QT_END_NAMESPACE diff --git a/src/controls/qquickabstracttextarea_p.h b/src/controls/qquickabstracttextarea_p.h index 66375aa6..e937a16a 100644 --- a/src/controls/qquickabstracttextarea_p.h +++ b/src/controls/qquickabstracttextarea_p.h @@ -48,41 +48,53 @@ // We mean it. // -#include +#include +#include +#include QT_BEGIN_NAMESPACE class QQuickText; -class QQuickTextEdit; class QQuickAbstractTextAreaPrivate; -class Q_QUICKCONTROLS_EXPORT QQuickAbstractTextArea : public QQuickControl +class Q_QUICKCONTROLS_EXPORT QQuickAbstractTextArea : public QQuickTextEdit, public QQuickStylable { Q_OBJECT - Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged FINAL) - Q_PROPERTY(QQuickTextEdit *edit READ edit WRITE setEdit NOTIFY editChanged 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 QQuickAbstractTextArea(QQuickItem *parent = Q_NULLPTR); + ~QQuickAbstractTextArea(); - QString text() const; - void setText(const QString &text); + QQuickStyle *style() const; + void setStyle(QQuickStyle *style); + bool hasStyle() const; + void resetStyle(); - QQuickTextEdit *edit() const; - void setEdit(QQuickTextEdit *edit); + QQuickItem *background() const; + void setBackground(QQuickItem *background); QQuickText *placeholder() const; void setPlaceholder(QQuickText *placeholder); Q_SIGNALS: - void textChanged(); - void editChanged(); + 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(QQuickAbstractTextArea) Q_DECLARE_PRIVATE(QQuickAbstractTextArea) + QScopedPointer d_ptr; }; QT_END_NAMESPACE diff --git a/src/imports/controls/TextArea.qml b/src/imports/controls/TextArea.qml index 699221f4..ea2bb68e 100644 --- a/src/imports/controls/TextArea.qml +++ b/src/imports/controls/TextArea.qml @@ -40,30 +40,15 @@ import QtQuick.Controls 2.0 AbstractTextArea { id: control - implicitWidth: Math.max(background ? background.implicitWidth : 0, - Math.max(edit ? edit.implicitWidth : 0, - placeholder ? placeholder.implicitWidth : 0) + leftPadding + rightPadding) - implicitHeight: Math.max(background ? background.implicitHeight : 0, - Math.max(edit ? edit.implicitHeight : 0, - placeholder ? placeholder.implicitHeight : 0) + topPadding + bottomPadding) - Accessible.name: text Accessible.multiLine: true Accessible.role: Accessible.EditableText - Accessible.readOnly: !edit || edit.readOnly + Accessible.readOnly: readOnly Accessible.description: placeholder ? placeholder.text : "" - edit: TextEdit { - 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 - Keys.forwardTo: control - } + color: style.textColor + selectionColor: style.selectionColor + selectedTextColor: style.selectedTextColor placeholder: Text { x: control.leftPadding @@ -73,6 +58,6 @@ AbstractTextArea { color: control.style.textColor opacity: control.style.disabledOpacity - visible: edit ? !edit.length : !control.text + visible: !control.length } } diff --git a/src/imports/controls/qtquickcontrols2plugin.cpp b/src/imports/controls/qtquickcontrols2plugin.cpp index a418e5d0..8a992758 100644 --- a/src/imports/controls/qtquickcontrols2plugin.cpp +++ b/src/imports/controls/qtquickcontrols2plugin.cpp @@ -114,6 +114,7 @@ void QtQuickControls2Plugin::registerTypes(const char *uri) qmlRegisterType(uri, 2, 0, "Style"); qmlRegisterRevision(uri, 2, 0); + qmlRegisterRevision(uri, 2, 0); } void QtQuickControls2Plugin::initializeEngine(QQmlEngine *engine, const char *uri) -- cgit v1.2.3