diff options
author | Piotr Mikolajczyk <piotr.mikolajczyk@qt.io> | 2021-02-18 12:00:07 +0100 |
---|---|---|
committer | Piotr Mikolajczyk <piotr.mikolajczyk@qt.io> | 2021-03-31 14:07:57 +0200 |
commit | 99f08e98be434f2b0d2ae2f310db0ca25ee919a7 (patch) | |
tree | 083bcf48302a4972b78227c53e7986c603022f6b /src/quick/items/qquicktextcontrol.cpp | |
parent | 3d09e9c2f521c638a312378e3c7f137accfe8212 (diff) |
Android: Add possibility to copy text from read-only Qml TextEdit
In case of a read-only TextEdit it was imposibble to move text selection
handles and copy the selected text from.
You could see the handles but you couldn't move them, neither you could
copy the text.
Fixes: QTBUG-75556
Change-Id: I23e9a1948d01b5078046fe33559d13949bbde5d5
Reviewed-by: Rami Potinkara <rami.potinkara@qt.io>
Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
Diffstat (limited to 'src/quick/items/qquicktextcontrol.cpp')
-rw-r--r-- | src/quick/items/qquicktextcontrol.cpp | 81 |
1 files changed, 44 insertions, 37 deletions
diff --git a/src/quick/items/qquicktextcontrol.cpp b/src/quick/items/qquicktextcontrol.cpp index 8e45baf863..0da082d512 100644 --- a/src/quick/items/qquicktextcontrol.cpp +++ b/src/quick/items/qquicktextcontrol.cpp @@ -1316,10 +1316,11 @@ bool QQuickTextControlPrivate::sendMouseEventToInputContext(QMouseEvent *e, cons void QQuickTextControlPrivate::inputMethodEvent(QInputMethodEvent *e) { Q_Q(QQuickTextControl); - if (!(interactionFlags & Qt::TextEditable) || cursor.isNull()) { + if (cursor.isNull()) { e->ignore(); return; } + bool textEditable = interactionFlags.testFlag(Qt::TextEditable); bool isGettingInput = !e->commitString().isEmpty() || e->preeditString() != cursor.block().layout()->preeditAreaText() || e->replacementLength() > 0; @@ -1327,14 +1328,14 @@ void QQuickTextControlPrivate::inputMethodEvent(QInputMethodEvent *e) int oldCursorPos = cursor.position(); cursor.beginEditBlock(); - if (isGettingInput) { + if (isGettingInput && textEditable) { cursor.removeSelectedText(); } QTextBlock block; // insert commit string - if (!e->commitString().isEmpty() || e->replacementLength()) { + if (textEditable && (!e->commitString().isEmpty() || e->replacementLength())) { if (e->commitString().endsWith(QChar::LineFeed)) block = cursor.block(); // Remember the block where the preedit text is QTextCursor c = cursor; @@ -1343,50 +1344,54 @@ void QQuickTextControlPrivate::inputMethodEvent(QInputMethodEvent *e) c.insertText(e->commitString()); } - for (int i = 0; i < e->attributes().size(); ++i) { - const QInputMethodEvent::Attribute &a = e->attributes().at(i); - if (a.type == QInputMethodEvent::Selection) { - QTextCursor oldCursor = cursor; - int blockStart = a.start + cursor.block().position(); - cursor.setPosition(blockStart, QTextCursor::MoveAnchor); - cursor.setPosition(blockStart + a.length, QTextCursor::KeepAnchor); - repaintOldAndNewSelection(oldCursor); - forceSelectionChanged = true; + if (interactionFlags & (Qt::TextSelectableByKeyboard | Qt::TextSelectableByMouse)) { + for (int i = 0; i < e->attributes().size(); ++i) { + const QInputMethodEvent::Attribute &a = e->attributes().at(i); + if (a.type == QInputMethodEvent::Selection) { + QTextCursor oldCursor = cursor; + int blockStart = a.start + cursor.block().position(); + cursor.setPosition(blockStart, QTextCursor::MoveAnchor); + cursor.setPosition(blockStart + a.length, QTextCursor::KeepAnchor); + repaintOldAndNewSelection(oldCursor); + forceSelectionChanged = true; + } } } if (!block.isValid()) block = cursor.block(); - QTextLayout *layout = block.layout(); - if (isGettingInput) { - layout->setPreeditArea(cursor.position() - block.position(), e->preeditString()); - emit q->preeditTextChanged(); - } - QVector<QTextLayout::FormatRange> overrides; const int oldPreeditCursor = preeditCursor; - preeditCursor = e->preeditString().length(); - hasImState = !e->preeditString().isEmpty(); - cursorVisible = true; - for (int i = 0; i < e->attributes().size(); ++i) { - const QInputMethodEvent::Attribute &a = e->attributes().at(i); - if (a.type == QInputMethodEvent::Cursor) { - hasImState = true; - preeditCursor = a.start; - cursorVisible = a.length != 0; - } else if (a.type == QInputMethodEvent::TextFormat) { - hasImState = true; - QTextCharFormat f = qvariant_cast<QTextFormat>(a.value).toCharFormat(); - if (f.isValid()) { - QTextLayout::FormatRange o; - o.start = a.start + cursor.position() - block.position(); - o.length = a.length; - o.format = f; - overrides.append(o); + if (textEditable) { + QTextLayout *layout = block.layout(); + if (isGettingInput) { + layout->setPreeditArea(cursor.position() - block.position(), e->preeditString()); + emit q->preeditTextChanged(); + } + QVector<QTextLayout::FormatRange> overrides; + preeditCursor = e->preeditString().length(); + hasImState = !e->preeditString().isEmpty(); + cursorVisible = true; + for (int i = 0; i < e->attributes().size(); ++i) { + const QInputMethodEvent::Attribute &a = e->attributes().at(i); + if (a.type == QInputMethodEvent::Cursor) { + hasImState = true; + preeditCursor = a.start; + cursorVisible = a.length != 0; + } else if (a.type == QInputMethodEvent::TextFormat) { + hasImState = true; + QTextCharFormat f = qvariant_cast<QTextFormat>(a.value).toCharFormat(); + if (f.isValid()) { + QTextLayout::FormatRange o; + o.start = a.start + cursor.position() - block.position(); + o.length = a.length; + o.format = f; + overrides.append(o); + } } } + layout->setFormats(overrides); } - layout->setFormats(overrides); cursor.endEditBlock(); @@ -1470,6 +1475,8 @@ QVariant QQuickTextControl::inputMethodQuery(Qt::InputMethodQuery property, cons result += QStringView{block.text()}.mid(0,localPos); return QVariant(result); } + case Qt::ImReadOnly: + return QVariant(!d->interactionFlags.testFlag(Qt::TextEditable)); default: return QVariant(); } |