Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Correctly apply capitalization setting whenever QgsTextRenderer is used #38899

Merged
merged 2 commits into from
Sep 21, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions python/core/auto_generated/textrenderer/qgstextblock.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,13 @@ Returns ``True`` if the block is empty.
int size() const;
%Docstring
Returns the number of fragments in the block.
%End

void applyCapitalization( QgsStringUtils::Capitalization capitalization );
%Docstring
Applies a ``capitalization`` style to the block's text.

.. versionadded:: 3.16
%End

int __len__() const;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,13 @@ argument controls whether the lines should be wrapped to an ideal maximum of ``a
if ``False`` then the lines are wrapped to an ideal minimum length of ``autoWrapLength`` characters.
%End

void applyCapitalization( QgsStringUtils::Capitalization capitalization );
%Docstring
Applies a ``capitalization`` style to the document's text.

.. versionadded:: 3.16
%End


};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,13 @@ The optional ``scaleFactor`` parameter can specify a font size scaling factor. I
QgsTextRenderer.FONT_WORKAROUND_SCALE and then manually calculations
based on the resultant font metrics. Failure to do so will result in poor quality text rendering
at small font sizes.
%End

void applyCapitalization( QgsStringUtils::Capitalization capitalization );
%Docstring
Applies a ``capitalization`` style to the fragment's text.

.. versionadded:: 3.16
%End

};
Expand Down
8 changes: 8 additions & 0 deletions src/core/textrenderer/qgstextblock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,14 @@ int QgsTextBlock::size() const
return mFragments.size();
}

void QgsTextBlock::applyCapitalization( QgsStringUtils::Capitalization capitalization )
{
for ( QgsTextFragment &fragment : mFragments )
{
fragment.applyCapitalization( capitalization );
}
}

const QgsTextFragment &QgsTextBlock::at( int index ) const
{
return mFragments.at( index );
Expand Down
8 changes: 8 additions & 0 deletions src/core/textrenderer/qgstextblock.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "qgis_sip.h"
#include "qgis_core.h"
#include "qgstextfragment.h"
#include "qgsstringutils.h"
#include <QVector>

/**
Expand Down Expand Up @@ -78,6 +79,13 @@ class CORE_EXPORT QgsTextBlock
*/
int size() const;

/**
* Applies a \a capitalization style to the block's text.
*
* \since QGIS 3.16
*/
void applyCapitalization( QgsStringUtils::Capitalization capitalization );

#ifdef SIP_RUN
int __len__() const;
% MethodCode
Expand Down
8 changes: 8 additions & 0 deletions src/core/textrenderer/qgstextdocument.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,14 @@ void QgsTextDocument::splitLines( const QString &wrapCharacter, int autoWrapLeng
}
}

void QgsTextDocument::applyCapitalization( QgsStringUtils::Capitalization capitalization )
{
for ( QgsTextBlock &block : mBlocks )
{
block.applyCapitalization( capitalization );
}
}

///@cond PRIVATE
QVector< QgsTextBlock >::const_iterator QgsTextDocument::begin() const
{
Expand Down
8 changes: 8 additions & 0 deletions src/core/textrenderer/qgstextdocument.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

#include "qgis_sip.h"
#include "qgis_core.h"
#include "qgsstringutils.h"

#include <QVector>

Expand Down Expand Up @@ -137,6 +138,13 @@ class CORE_EXPORT QgsTextDocument
*/
void splitLines( const QString &wrapCharacter, int autoWrapLength = 0, bool useMaxLineLengthWhenAutoWrapping = true );

/**
* Applies a \a capitalization style to the document's text.
*
* \since QGIS 3.16
*/
void applyCapitalization( QgsStringUtils::Capitalization capitalization );

#ifndef SIP_RUN
///@cond PRIVATE
QVector< QgsTextBlock >::const_iterator begin() const;
Expand Down
5 changes: 5 additions & 0 deletions src/core/textrenderer/qgstextfragment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,8 @@ double QgsTextFragment::horizontalAdvance( const QFont &font, bool fontHasBeenUp
}
}

void QgsTextFragment::applyCapitalization( QgsStringUtils::Capitalization capitalization )
{
mText = QgsStringUtils::capitalize( mText, capitalization );
}

8 changes: 8 additions & 0 deletions src/core/textrenderer/qgstextfragment.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "qgis_sip.h"
#include "qgis_core.h"
#include "qgstextcharacterformat.h"
#include "qgsstringutils.h"

class QTextFragment;

Expand Down Expand Up @@ -87,6 +88,13 @@ class CORE_EXPORT QgsTextFragment
*/
double horizontalAdvance( const QFont &font, bool fontHasBeenUpdatedForFragment = false, double scaleFactor = 1.0 ) const;

/**
* Applies a \a capitalization style to the fragment's text.
*
* \since QGIS 3.16
*/
void applyCapitalization( QgsStringUtils::Capitalization capitalization );

private:

QString mText;
Expand Down
18 changes: 13 additions & 5 deletions src/core/textrenderer/qgstextrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@ void QgsTextRenderer::drawText( const QRectF &rect, double rotation, QgsTextRend
tmpFormat.updateDataDefinedProperties( context );
tmpFormat = updateShadowPosition( tmpFormat );

const QgsTextDocument document = format.allowHtmlFormatting() ? QgsTextDocument::fromHtml( textLines ) : QgsTextDocument::fromPlainText( textLines );
QgsTextDocument document = format.allowHtmlFormatting() ? QgsTextDocument::fromHtml( textLines ) : QgsTextDocument::fromPlainText( textLines );
document.applyCapitalization( format.capitalization() );

if ( tmpFormat.background().enabled() )
{
Expand All @@ -101,7 +102,8 @@ void QgsTextRenderer::drawText( QPointF point, double rotation, QgsTextRenderer:
tmpFormat.updateDataDefinedProperties( context );
tmpFormat = updateShadowPosition( tmpFormat );

const QgsTextDocument document = format.allowHtmlFormatting() ? QgsTextDocument::fromHtml( textLines ) : QgsTextDocument::fromPlainText( textLines );
QgsTextDocument document = format.allowHtmlFormatting() ? QgsTextDocument::fromHtml( textLines ) : QgsTextDocument::fromPlainText( textLines );
document.applyCapitalization( format.capitalization() );

if ( tmpFormat.background().enabled() )
{
Expand Down Expand Up @@ -489,14 +491,17 @@ void QgsTextRenderer::drawMask( QgsRenderContext &context, const QgsTextRenderer

double QgsTextRenderer::textWidth( const QgsRenderContext &context, const QgsTextFormat &format, const QStringList &textLines, QFontMetricsF * )
{
QgsTextDocument doc;
if ( !format.allowHtmlFormatting() )
{
return textWidth( context, format, QgsTextDocument::fromPlainText( textLines ) );
doc = QgsTextDocument::fromPlainText( textLines );
}
else
{
return textWidth( context, format, QgsTextDocument::fromHtml( textLines ) );
doc = QgsTextDocument::fromHtml( textLines );
}
doc.applyCapitalization( format.capitalization() );
return textWidth( context, format, doc );
}

double QgsTextRenderer::textWidth( const QgsRenderContext &context, const QgsTextFormat &format, const QgsTextDocument &document )
Expand Down Expand Up @@ -600,8 +605,11 @@ double QgsTextRenderer::textHeight( const QgsRenderContext &context, const QgsTe
return height + maxExtension;
}

double QgsTextRenderer::textHeight( const QgsRenderContext &context, const QgsTextFormat &format, const QgsTextDocument &document, DrawMode mode )
double QgsTextRenderer::textHeight( const QgsRenderContext &context, const QgsTextFormat &format, const QgsTextDocument &doc, DrawMode mode )
{
QgsTextDocument document = doc;
document.applyCapitalization( format.capitalization() );

//calculate max height of text lines
const double scaleFactor = ( context.flags() & QgsRenderContext::ApplyScalingWorkaroundForTextRendering ) ? FONT_WORKAROUND_SCALE : 1.0;

Expand Down
10 changes: 9 additions & 1 deletion tests/src/python/test_qgstextblock.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@

from qgis.core import (
QgsTextBlock,
QgsTextFragment
QgsTextFragment,
QgsStringUtils
)
from qgis.testing import start_app, unittest

Expand Down Expand Up @@ -85,6 +86,13 @@ def testClear(self):
self.assertEqual(len(block), 0)
self.assertTrue(block.empty())

def testCapitalize(self):
fragment = QgsTextFragment('ludicrous gibs!')
block = QgsTextBlock(fragment)
block.append(QgsTextFragment('another part'))
block.applyCapitalization(QgsStringUtils.TitleCase)
self.assertEqual(block.toPlainText(), 'Ludicrous Gibs!Another Part')


if __name__ == '__main__':
unittest.main()
8 changes: 7 additions & 1 deletion tests/src/python/test_qgstextdocument.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
QgsTextDocument,
QgsTextBlock,
QgsTextFragment,
QgsTextCharacterFormat
QgsTextCharacterFormat,
QgsStringUtils
)
from qgis.testing import start_app, unittest

Expand Down Expand Up @@ -160,6 +161,11 @@ def testSplitLines(self):
self.assertEqual(len(doc[2]), 1)
self.assertEqual(doc[2][0].text(), 'red')

def testCapitalize(self):
doc = QgsTextDocument.fromPlainText(['abc def ghi', 'more text', 'another block'])
doc.applyCapitalization(QgsStringUtils.TitleCase)
self.assertEqual(doc.toPlainText(), ['Abc Def Ghi', 'More Text', 'Another Block'])


if __name__ == '__main__':
unittest.main()
8 changes: 7 additions & 1 deletion tests/src/python/test_qgstextfragment.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@

from qgis.core import (
QgsTextFragment,
QgsTextCharacterFormat
QgsTextCharacterFormat,
QgsStringUtils
)
from qgis.PyQt.QtGui import QColor
from qgis.testing import start_app, unittest
Expand Down Expand Up @@ -49,6 +50,11 @@ def testSetCharacterFormat(self):
self.assertTrue(fragment.characterFormat().textColor().isValid())
self.assertEqual(fragment.characterFormat().textColor().name(), '#ff0000')

def testCapitalize(self):
fragment = QgsTextFragment('ludicrous gibs!')
fragment.applyCapitalization(QgsStringUtils.TitleCase)
self.assertEqual(fragment.text(), 'Ludicrous Gibs!')


if __name__ == '__main__':
unittest.main()