aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquicktextnodeengine.cpp7
-rw-r--r--src/quick/items/qquicktextnodeengine_p.h12
-rw-r--r--tests/manual/scenegraph_lancelot/data/text/text_flow_image_start_ltr.qml14
-rw-r--r--tests/manual/scenegraph_lancelot/data/text/text_flow_image_start_rtl.qml14
4 files changed, 45 insertions, 2 deletions
diff --git a/src/quick/items/qquicktextnodeengine.cpp b/src/quick/items/qquicktextnodeengine.cpp
index 4631b2e724..538356e679 100644
--- a/src/quick/items/qquicktextnodeengine.cpp
+++ b/src/quick/items/qquicktextnodeengine.cpp
@@ -423,7 +423,10 @@ void QQuickTextNodeEngine::addImage(const QRectF &rect, const QImage &image, qre
QRectF searchRect = rect;
if (layoutPosition == QTextFrameFormat::InFlow) {
if (m_currentLineTree.isEmpty()) {
- searchRect.moveTopLeft(m_position + m_currentLine.position() + QPointF(0,1));
+ if (m_currentTextDirection == Qt::RightToLeft)
+ searchRect.moveTopRight(m_position + m_currentLine.rect().topRight() + QPointF(0, 1));
+ else
+ searchRect.moveTopLeft(m_position + m_currentLine.position() + QPointF(0,1));
} else {
const BinaryTreeNode *lastNode = m_currentLineTree.data() + m_currentLineTree.size() - 1;
if (lastNode->glyphRun.isRightToLeft()) {
@@ -952,6 +955,8 @@ void QQuickTextNodeEngine::addTextBlock(QTextDocument *textDocument, const QText
int preeditPosition = block.isValid() ? block.layout()->preeditAreaPosition() : -1;
#endif
+ setCurrentTextDirection(block.textDirection());
+
QVarLengthArray<QTextLayout::FormatRange> colorChanges;
mergeFormats(block.layout(), &colorChanges);
diff --git a/src/quick/items/qquicktextnodeengine_p.h b/src/quick/items/qquicktextnodeengine_p.h
index 91ed6f4430..18c624513a 100644
--- a/src/quick/items/qquicktextnodeengine_p.h
+++ b/src/quick/items/qquicktextnodeengine_p.h
@@ -144,7 +144,11 @@ public:
int selectionState;
};
- QQuickTextNodeEngine() : m_hasSelection(false), m_hasContents(false) {}
+ QQuickTextNodeEngine()
+ : m_currentTextDirection(Qt::LeftToRight)
+ , m_hasSelection(false)
+ , m_hasContents(false)
+ {}
bool hasContents() const { return m_hasContents; }
void addTextBlock(QTextDocument *, const QTextBlock &, const QPointF &position, const QColor &textColor, const QColor& anchorColor, int selectionStart, int selectionEnd);
@@ -158,6 +162,11 @@ public:
m_currentLine = currentLine;
}
+ void setCurrentTextDirection(Qt::LayoutDirection textDirection)
+ {
+ m_currentTextDirection = textDirection;
+ }
+
void addBorder(const QRectF &rect, qreal border, QTextFrameFormat::BorderStyle borderStyle,
const QBrush &borderBrush);
void addFrameDecorations(QTextDocument *document, QTextFrame *frame);
@@ -247,6 +256,7 @@ private:
QPointF m_position;
QTextLine m_currentLine;
+ Qt::LayoutDirection m_currentTextDirection;
QList<QPair<QRectF, QColor> > m_backgrounds;
QList<QRectF> m_selectionRects;
diff --git a/tests/manual/scenegraph_lancelot/data/text/text_flow_image_start_ltr.qml b/tests/manual/scenegraph_lancelot/data/text/text_flow_image_start_ltr.qml
new file mode 100644
index 0000000000..b8f0458818
--- /dev/null
+++ b/tests/manual/scenegraph_lancelot/data/text/text_flow_image_start_ltr.qml
@@ -0,0 +1,14 @@
+import QtQuick 2.0
+
+Item {
+ width: 320
+ height: 480
+
+ Text {
+ anchors.centerIn: parent
+ font.family: "Arial"
+ font.pixelSize: 16
+ textFormat: Text.RichText
+ text: "<img width=16 height=16 src=\"data/logo.png\" />This image is in the start of the text"
+ }
+}
diff --git a/tests/manual/scenegraph_lancelot/data/text/text_flow_image_start_rtl.qml b/tests/manual/scenegraph_lancelot/data/text/text_flow_image_start_rtl.qml
new file mode 100644
index 0000000000..e5bea08e62
--- /dev/null
+++ b/tests/manual/scenegraph_lancelot/data/text/text_flow_image_start_rtl.qml
@@ -0,0 +1,14 @@
+import QtQuick 2.0
+
+Item {
+ width: 320
+ height: 480
+
+ Text {
+ anchors.centerIn: parent
+ font.family: "Arial"
+ font.pixelSize: 16
+ textFormat: Text.RichText
+ text: "<img width=16 height=16 src=\"data/logo.png\" />هو أمّا حكومة"
+ }
+}