aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquicktextcontrol.cpp
diff options
context:
space:
mode:
authorPiotr Mikolajczyk <piotr.mikolajczyk@qt.io>2021-02-18 12:00:07 +0100
committerPiotr Mikolajczyk <piotr.mikolajczyk@qt.io>2021-03-31 14:07:57 +0200
commit99f08e98be434f2b0d2ae2f310db0ca25ee919a7 (patch)
tree083bcf48302a4972b78227c53e7986c603022f6b /src/quick/items/qquicktextcontrol.cpp
parent3d09e9c2f521c638a312378e3c7f137accfe8212 (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.cpp81
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();
}