Skip to content

Commit bb66189

Browse files
committedMar 31, 2023
Truncate text on line annotation text when line is too short instead
of hiding all text
1 parent c8db000 commit bb66189

File tree

5 files changed

+53
-4
lines changed

5 files changed

+53
-4
lines changed
 

‎src/core/textrenderer/qgstextrenderer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ void QgsTextRenderer::drawDocumentOnLine( const QPolygonF &line, const QgsTextFo
295295
QgsTextRendererUtils::RespectPainterOrientation,
296296
-1, -1,
297297
QgsTextRendererUtils::CurvedTextFlag::UseBaselinePlacement
298+
| QgsTextRendererUtils::CurvedTextFlag::TruncateStringWhenLineIsTooShort
298299
| QgsTextRendererUtils::CurvedTextFlag::UprightCharactersOnly );
299300

300301
if ( placement->graphemePlacement.empty() )

‎src/core/textrenderer/qgstextrendererutils.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ std::unique_ptr< QgsTextRendererUtils::CurvePlacementProperties > QgsTextRendere
215215
return output;
216216
}
217217

218-
const int characterCount = metrics.count();
218+
int characterCount = metrics.count();
219219

220220
if ( direction == RespectPainterOrientation && !isSecondAttempt )
221221
{
@@ -234,7 +234,15 @@ std::unique_ptr< QgsTextRendererUtils::CurvePlacementProperties > QgsTextRendere
234234
double characterStartX, characterStartY;
235235
if ( !nextCharPosition( characterWidth, pathDistances[endindex], x, y, numPoints, endindex, distance, characterStartX, characterStartY, endLabelX, endLabelY ) )
236236
{
237-
return output;
237+
if ( flags & QgsTextRendererUtils::CurvedTextFlag::TruncateStringWhenLineIsTooShort )
238+
{
239+
characterCount = i + 1;
240+
break;
241+
}
242+
else
243+
{
244+
return output;
245+
}
238246
}
239247
if ( i == 0 )
240248
{
@@ -289,8 +297,16 @@ std::unique_ptr< QgsTextRendererUtils::CurvePlacementProperties > QgsTextRendere
289297
double characterEndY = 0;
290298
if ( !nextCharPosition( characterWidth, pathDistances[index], x, y, numPoints, index, offsetAlongSegment, characterStartX, characterStartY, characterEndX, characterEndY ) )
291299
{
292-
output->graphemePlacement.clear();
293-
return output;
300+
if ( flags & QgsTextRendererUtils::CurvedTextFlag::TruncateStringWhenLineIsTooShort )
301+
{
302+
characterCount = i + 1;
303+
break;
304+
}
305+
else
306+
{
307+
output->graphemePlacement.clear();
308+
return output;
309+
}
294310
}
295311

296312
// Calculate angle from the start of the character to the end based on start/end of character

‎src/core/textrenderer/qgstextrendererutils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ class CORE_EXPORT QgsTextRendererUtils
148148
*/
149149
enum class CurvedTextFlag : int
150150
{
151+
TruncateStringWhenLineIsTooShort = 1 << 0, //!< When a string is too long for the line, truncate characters instead of aborting the placement
151152
UseBaselinePlacement = 1 << 1, //!< Generate placement based on the character baselines instead of centers
152153
UprightCharactersOnly = 1 << 2, //!< Permit upright characters only. If not present then upside down text placement is permitted.
153154
};

‎tests/src/python/test_qgsannotationlinetextitem.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,37 @@ def testRenderLine(self):
205205

206206
self.assertTrue(self.imageCheck('linetext_item', 'linetext_item', image))
207207

208+
def testRenderLineTruncate(self):
209+
item = QgsAnnotationLineTextItem('my text', QgsLineString(((12, 13), (13, 13.1), (14, 12))))
210+
211+
format = QgsTextFormat.fromQFont(getTestFont('Bold'))
212+
format.setColor(QColor(255, 0, 0))
213+
format.setOpacity(150 / 255)
214+
format.setSize(75)
215+
item.setFormat(format)
216+
217+
settings = QgsMapSettings()
218+
settings.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:4326'))
219+
settings.setExtent(QgsRectangle(11.9, 11.9, 14.5, 14))
220+
settings.setOutputSize(QSize(600, 300))
221+
222+
settings.setFlag(QgsMapSettings.Antialiasing, False)
223+
224+
rc = QgsRenderContext.fromMapSettings(settings)
225+
image = QImage(600, 300, QImage.Format_ARGB32)
226+
image.setDotsPerMeterX(int(96 / 25.4 * 1000))
227+
image.setDotsPerMeterY(int(96 / 25.4 * 1000))
228+
image.fill(QColor(255, 255, 255))
229+
painter = QPainter(image)
230+
rc.setPainter(painter)
231+
232+
try:
233+
item.render(rc, None)
234+
finally:
235+
painter.end()
236+
237+
self.assertTrue(self.imageCheck('linetext_item_truncate', 'linetext_item_truncate', image))
238+
208239
def testRenderLineTextExpression(self):
209240
item = QgsAnnotationLineTextItem('[% 1 + 1.5 %]', QgsLineString(((12, 13), (13, 13.1), (14, 12))))
210241

0 commit comments

Comments
 (0)
Please sign in to comment.