Fix selections in tables that span over several cells
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
Tue, 28 Jul 2015 11:00:48 +0000 (13:00 +0200)
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
Tue, 4 Aug 2015 11:34:57 +0000 (11:34 +0000)
In the code that converts text layouts to subtrees in the scene
graph specifically for TextEdit, there was a cutoff to treat
text tables as single nodes in the graph (for simplicity).
However, this breaks selections, since the ranges spanned by
each cell will be interpreted as overlapping, messing up the
selection merging logic. We need the same approach here as for
any other text frame where we check frame boundaries.

[ChangeLog][TextEdit] Fixed issues with selections that spanned
several cells in a table.

Change-Id: I789041d84b5d163e209488f8f2f1f83a6471389f
Task-number: QTBUG-46928
Reviewed-by: Pierre Rossi <pierre.rossi@theqtcompany.com>
src/quick/items/qquicktextedit.cpp
tests/manual/scenegraph_lancelot/data/text/textedit_table_selected.qml [new file with mode: 0644]

index 8237ad10e4394aee06c0023ab881d7c4d45352c0..cd1cf5eef12a85e9e917e644714963ea014f792b 100644 (file)
@@ -1873,13 +1873,6 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *
                 node->m_engine->addTextObject(QPointF(0, 0), format, QQuickTextNodeEngine::Unselected, d->document,
                                               pos, textFrame->frameFormat().position());
                 nodeStart = pos;
-            } else if (qobject_cast<QTextTable*>(textFrame)) { // To keep things simple, map text tables as one text node
-                QTextFrame::iterator it = textFrame->begin();
-                nodeOffset =  d->document->documentLayout()->frameBoundingRect(textFrame).topLeft();
-                updateNodeTransform(node, nodeOffset);
-                while (!it.atEnd())
-                    node->m_engine->addTextBlock(d->document, (it++).currentBlock(), -nodeOffset, d->color, QColor(), selectionStart(), selectionEnd() - 1);
-                nodeStart = textFrame->firstPosition();
             } else {
                 // Having nodes spanning across frame boundaries will break the current bookkeeping mechanism. We need to prevent that.
                 QList<int> frameBoundaries;
diff --git a/tests/manual/scenegraph_lancelot/data/text/textedit_table_selected.qml b/tests/manual/scenegraph_lancelot/data/text/textedit_table_selected.qml
new file mode 100644 (file)
index 0000000..749c379
--- /dev/null
@@ -0,0 +1,40 @@
+import QtQuick 2.0
+
+Item {
+    width: 320
+    height: 480
+
+    TextEdit {
+        id: textEdit
+        anchors.centerIn: parent
+        verticalAlignment: Text.AlignBottom
+        font.family: "Arial"
+        font.pixelSize: 16
+        textFormat: Text.RichText
+        Component.onCompleted: textEdit.selectAll()
+        text:
+            "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
+            "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" +
+            "<body >\n" +
+            "<table >\n" +
+            "<tr >\n" +
+            "<td >\n" +
+            "Cell 1\n" +
+            "</td>\n" +
+            "</tr>\n" +
+            "<tr >\n" +
+            "<td >\n" +
+            "Cell 2\n" +
+            "</td>\n" +
+            "</tr>\n" +
+            "<tr >\n" +
+            "<td >\n" +
+            "Cell 3\n" +
+            "</td>\n" +
+            "</tr>\n" +
+            "</table>\n" +
+            "</body>\n" +
+            "</html>\n"
+
+    }
+}