summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/text/qfontmetrics.cpp17
-rw-r--r--tests/auto/qfontmetrics/tst_qfontmetrics.cpp30
2 files changed, 42 insertions, 5 deletions
diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp
index 47d3864..5c5320f 100644
--- a/src/gui/text/qfontmetrics.cpp
+++ b/src/gui/text/qfontmetrics.cpp
@@ -859,8 +859,21 @@ QRect QFontMetrics::tightBoundingRect(const QString &text) const
language.
*/
-QString QFontMetrics::elidedText(const QString &text, Qt::TextElideMode mode, int width, int flags) const
-{
+QString QFontMetrics::elidedText(const QString &_text, Qt::TextElideMode mode, int width, int flags) const
+{
+ QString text = _text;
+ if (!(flags & Qt::TextLongestVariant)) {
+ int posA = 0;
+ int posB = text.indexOf(QLatin1Char('\x9c'));
+ while (posB >= 0) {
+ QString portion = text.mid(posA, posB - posA);
+ if (size(flags, portion).width() <= width)
+ return portion;
+ posA = posB + 1;
+ posB = text.indexOf(QLatin1Char('\x9c'), posA);
+ }
+ text = text.mid(posA);
+ }
QStackTextEngine engine(text, QFont(d));
return engine.elidedText(mode, width, flags);
}
diff --git a/tests/auto/qfontmetrics/tst_qfontmetrics.cpp b/tests/auto/qfontmetrics/tst_qfontmetrics.cpp
index 5658055..cae1126 100644
--- a/tests/auto/qfontmetrics/tst_qfontmetrics.cpp
+++ b/tests/auto/qfontmetrics/tst_qfontmetrics.cpp
@@ -71,6 +71,7 @@ private slots:
void elidedText();
void veryNarrowElidedText();
void averageCharWidth();
+ void elidedMultiLenght();
};
tst_QFontMetrics::tst_QFontMetrics()
@@ -168,7 +169,8 @@ void tst_QFontMetrics::elidedText_data()
QTest::addColumn<QFont>("font");
QTest::addColumn<QString>("text");
- QTest::newRow("helvetica hello") << QFont("helvetica",10) << QString("hello");
+ QTest::newRow("helvetica hello") << QFont("helvetica",10) << QString("hello") ;
+ QTest::newRow("helvetica hello &Bye") << QFont("helvetica",10) << QString("hello&Bye") ;
}
@@ -178,9 +180,9 @@ void tst_QFontMetrics::elidedText()
QFETCH(QString, text);
QFontMetrics fm(font);
int w = fm.width(text);
- QString newtext = fm.elidedText(text,Qt::ElideRight,w);
+ QString newtext = fm.elidedText(text,Qt::ElideRight,w, 0);
QCOMPARE(text,newtext); // should not elide
- newtext = fm.elidedText(text,Qt::ElideRight,w-1);
+ newtext = fm.elidedText(text,Qt::ElideRight,w-1, 0);
QVERIFY(text != newtext); // should elide
}
@@ -201,5 +203,27 @@ void tst_QFontMetrics::averageCharWidth()
QVERIFY(fmf.averageCharWidth() != 0);
}
+void tst_QFontMetrics::elidedMultiLenght()
+{
+ QString text1 = "Long Text 1\x9cShorter\x9csmall";
+ QString text1_long = "Long Text 1";
+ QString text1_short = "Shorter";
+ QString text1_small = "small";
+ QFontMetrics fm = QFontMetrics(QFont());
+ int width_long = fm.width(text1_long);
+ QCOMPARE(fm.elidedText(text1,Qt::ElideRight, 8000), text1_long);
+ QCOMPARE(fm.elidedText(text1,Qt::ElideRight, width_long), text1_long);
+ QCOMPARE(fm.elidedText(text1,Qt::ElideRight, width_long - 1), text1_short);
+ int width_short = fm.width(text1_short);
+ QCOMPARE(fm.elidedText(text1,Qt::ElideRight, width_short), text1_short);
+ QCOMPARE(fm.elidedText(text1,Qt::ElideRight, width_short - 1), text1_small);
+
+ QChar ellipsisChar(0x2026);
+ QString text1_el = QString::fromLatin1("sm") + ellipsisChar;
+ int width_small = fm.width(text1_el);
+ QCOMPARE(fm.elidedText(text1,Qt::ElideRight, width_small + 1), text1_el);
+
+}
+
QTEST_MAIN(tst_QFontMetrics)
#include "tst_qfontmetrics.moc"