Skip to content

Commit

Permalink
Add method to change capitalization of QgsTextDocument
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Sep 21, 2020
1 parent 772181b commit 620948f
Show file tree
Hide file tree
Showing 12 changed files with 89 additions and 3 deletions.
7 changes: 7 additions & 0 deletions python/core/auto_generated/textrenderer/qgstextblock.sip.in
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
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
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
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
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
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
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
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
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
10 changes: 9 additions & 1 deletion tests/src/python/test_qgstextblock.py
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
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
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()

0 comments on commit 620948f

Please sign in to comment.