diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2016-12-07 16:22:55 +0100 |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2016-12-13 09:25:33 +0000 |
commit | 97e4d5d5aeb0d415db18c075f905763ae5ba5f18 (patch) | |
tree | 25b2cf8ac56de5aabed96f193ab088043efbbf94 /src/quick/items | |
parent | 798b3e6fa65f0a35e22c446ea8582803f6ecf4d2 (diff) |
Accept PUA characters, ZWNJ and ZWJ as input in TextInput/Edit
Private Use Area characters are quite valid input characters when used
in combination with a custom font. Joiners also serve an important language
purpose in semitic writing systems.
[ChangeLog][QtWidgets][Input] Support characters in Private Use Area, as well as
zero-width joiners and zero-width non-joiners in input in TextInput and TextEdit.
Task-number: QTBUG-42074
Task-number: QTBUG-57003
Change-Id: I4a9d6b9ea172d29375c20abfb7aebb6748c5d300
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/qquicktextcontrol.cpp | 7 | ||||
-rw-r--r-- | src/quick/items/qquicktextcontrol_p.h | 3 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 8 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p_p.h | 2 |
4 files changed, 12 insertions, 8 deletions
diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index 887cc6fea7..66936b0943 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -608,7 +608,7 @@ void QQuickTextControl::clear() } QQuickTextControl::QQuickTextControl(QTextDocument *doc, QObject *parent) - : QObject(*new QQuickTextControlPrivate, parent) + : QInputControl(TextEdit, *new QQuickTextControlPrivate, parent) { Q_D(QQuickTextControl); Q_ASSERT(doc); @@ -980,8 +980,7 @@ void QQuickTextControlPrivate::keyPressEvent(QKeyEvent *e) process: { - QString text = e->text(); - if (!text.isEmpty() && (text.at(0).isPrint() || text.at(0) == QLatin1Char('\t'))) { + if (q->isAcceptableInput(e)) { if (overwriteMode // no need to call deleteChar() if we have a selection, insertText // does it already @@ -990,7 +989,7 @@ process: cursor.deleteChar(); } - cursor.insertText(text); + cursor.insertText(e->text()); selectionChanged(); } else { e->ignore(); diff --git a/src/quick/items/qquicktextcontrol_p.h b/src/quick/items/qquicktextcontrol_p.h index 7992d2943b..9bc5d057c7 100644 --- a/src/quick/items/qquicktextcontrol_p.h +++ b/src/quick/items/qquicktextcontrol_p.h @@ -59,6 +59,7 @@ #include <QtGui/qabstracttextdocumentlayout.h> #include <QtGui/qtextdocumentfragment.h> #include <QtGui/qclipboard.h> +#include <QtGui/private/qinputcontrol_p.h> #include <QtCore/qmimedata.h> QT_BEGIN_NAMESPACE @@ -71,7 +72,7 @@ class QAbstractScrollArea; class QEvent; class QTimerEvent; -class Q_AUTOTEST_EXPORT QQuickTextControl : public QObject +class Q_AUTOTEST_EXPORT QQuickTextControl : public QInputControl { Q_OBJECT Q_DECLARE_PRIVATE(QQuickTextControl) diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index 96a46df2f4..b3c7da1e3e 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -63,6 +63,7 @@ #endif #include <QtGui/private/qtextengine_p.h> +#include <QtGui/private/qinputcontrol_p.h> QT_BEGIN_NAMESPACE @@ -2695,6 +2696,8 @@ void QQuickTextInputPrivate::init() option.setUseDesignMetrics(renderType != QQuickTextInput::NativeRendering); m_textLayout.setTextOption(option); } + + m_inputControl = new QInputControl(QInputControl::LineEdit, q); } void QQuickTextInputPrivate::resetInputMethod() @@ -4528,8 +4531,7 @@ void QQuickTextInputPrivate::processKeyEvent(QKeyEvent* event) } if (unknown && !m_readOnly) { - QString t = event->text(); - if (!t.isEmpty() && t.at(0).isPrint()) { + if (m_inputControl->isAcceptableInput(event)) { if (overwriteMode // no need to call del() if we have a selection, insert // does it already @@ -4538,7 +4540,7 @@ void QQuickTextInputPrivate::processKeyEvent(QKeyEvent* event) del(); } - insert(t); + insert(event->text()); event->accept(); return; } diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h index d1aaefa6a7..0bf5779a53 100644 --- a/src/quick/items/qquicktextinput_p_p.h +++ b/src/quick/items/qquicktextinput_p_p.h @@ -70,6 +70,7 @@ QT_BEGIN_NAMESPACE class QQuickTextNode; +class QInputControl; class Q_QUICK_PRIVATE_EXPORT QQuickTextInputPrivate : public QQuickImplicitSizeItemPrivate { @@ -228,6 +229,7 @@ public: QQuickItem *cursorItem; QQuickTextNode *textNode; MaskInputData *m_maskData; + QInputControl *m_inputControl; QList<int> m_transactions; QVector<Command> m_history; |