aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2015-03-03 09:39:40 +0100
committerJari-Pekka Nurmi <jpnurmi@theqtcompany.com>2015-03-06 08:46:40 +0200
commitf50aafacfa18bf7ab12433076ef95d9af9b80c71 (patch)
treeb6824edd2528dc71f9cddad9f18c119c07d7ad08 /src
parent02c7a226b69b2ad1acf86fa76553a9ede9870e42 (diff)
QQuickAbstractTextArea: inherit QQuickTextEdit
Change-Id: I974dd801d3cd3cf3d7024e1c8727ec0607e084f3 Reviewed-by: Jari-Pekka Nurmi <jpnurmi@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r--src/controls/qquickabstracttextarea.cpp140
-rw-r--r--src/controls/qquickabstracttextarea_p.h34
-rw-r--r--src/imports/controls/TextArea.qml25
-rw-r--r--src/imports/controls/qtquickcontrols2plugin.cpp1
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 <QtQuick/private/qquickitem_p.h>
#include <QtQuick/private/qquicktext_p.h>
-#include <QtQuick/private/qquicktextedit_p.h>
+#include <QtQuick/private/qquickclipnode_p.h>
+#include <QtCore/qcoreapplication.h>
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<QQuickAbstractTextArea *>(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<QObject *>()) {
+ if (qobject_cast<QQuickStylable *>(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<QQuickDefaultClipNode *>(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 <QtQuickControls/private/qquickcontrol_p.h>
+#include <QtQuick/private/qquicktextedit_p.h>
+#include <QtQuickControls/private/qtquickcontrolsglobal_p.h>
+#include <QtQuickControls/private/qquickstylable_p.h>
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<QQuickAbstractTextAreaPrivate> 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<QQuickStyle>(uri, 2, 0, "Style");
qmlRegisterRevision<QQuickTextInput, 6>(uri, 2, 0);
+ qmlRegisterRevision<QQuickTextEdit, 6>(uri, 2, 0);
}
void QtQuickControls2Plugin::initializeEngine(QQmlEngine *engine, const char *uri)