Add method to change capitalization of QgsTextDocument

This commit is contained in:
Nyall Dawson 2020-09-21 09:50:31 +10:00
parent 772181bc16
commit 620948f809
12 changed files with 89 additions and 3 deletions

View File

@ -62,6 +62,13 @@ Returns ``True`` if the block is empty.
int size() const; int size() const;
%Docstring %Docstring
Returns the number of fragments in the block. 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 %End
int __len__() const; int __len__() const;

View File

@ -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. if ``False`` then the lines are wrapped to an ideal minimum length of ``autoWrapLength`` characters.
%End %End
void applyCapitalization( QgsStringUtils::Capitalization capitalization );
%Docstring
Applies a ``capitalization`` style to the document's text.
.. versionadded:: 3.16
%End
}; };

View File

@ -76,6 +76,13 @@ The optional ``scaleFactor`` parameter can specify a font size scaling factor. I
QgsTextRenderer.FONT_WORKAROUND_SCALE and then manually calculations 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 based on the resultant font metrics. Failure to do so will result in poor quality text rendering
at small font sizes. at small font sizes.
%End
void applyCapitalization( QgsStringUtils::Capitalization capitalization );
%Docstring
Applies a ``capitalization`` style to the fragment's text.
.. versionadded:: 3.16
%End %End
}; };

View File

@ -56,6 +56,14 @@ int QgsTextBlock::size() const
return mFragments.size(); return mFragments.size();
} }
void QgsTextBlock::applyCapitalization( QgsStringUtils::Capitalization capitalization )
{
for ( QgsTextFragment &fragment : mFragments )
{
fragment.applyCapitalization( capitalization );
}
}
const QgsTextFragment &QgsTextBlock::at( int index ) const const QgsTextFragment &QgsTextBlock::at( int index ) const
{ {
return mFragments.at( index ); return mFragments.at( index );

View File

@ -19,6 +19,7 @@
#include "qgis_sip.h" #include "qgis_sip.h"
#include "qgis_core.h" #include "qgis_core.h"
#include "qgstextfragment.h" #include "qgstextfragment.h"
#include "qgsstringutils.h"
#include <QVector> #include <QVector>
/** /**
@ -78,6 +79,13 @@ class CORE_EXPORT QgsTextBlock
*/ */
int size() const; 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 #ifdef SIP_RUN
int __len__() const; int __len__() const;
% MethodCode % MethodCode

View File

@ -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 ///@cond PRIVATE
QVector< QgsTextBlock >::const_iterator QgsTextDocument::begin() const QVector< QgsTextBlock >::const_iterator QgsTextDocument::begin() const
{ {

View File

@ -18,6 +18,7 @@
#include "qgis_sip.h" #include "qgis_sip.h"
#include "qgis_core.h" #include "qgis_core.h"
#include "qgsstringutils.h"
#include <QVector> #include <QVector>
@ -137,6 +138,13 @@ class CORE_EXPORT QgsTextDocument
*/ */
void splitLines( const QString &wrapCharacter, int autoWrapLength = 0, bool useMaxLineLengthWhenAutoWrapping = true ); 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 #ifndef SIP_RUN
///@cond PRIVATE ///@cond PRIVATE
QVector< QgsTextBlock >::const_iterator begin() const; QVector< QgsTextBlock >::const_iterator begin() const;

View File

@ -68,3 +68,8 @@ double QgsTextFragment::horizontalAdvance( const QFont &font, bool fontHasBeenUp
} }
} }
void QgsTextFragment::applyCapitalization( QgsStringUtils::Capitalization capitalization )
{
mText = QgsStringUtils::capitalize( mText, capitalization );
}

View File

@ -19,6 +19,7 @@
#include "qgis_sip.h" #include "qgis_sip.h"
#include "qgis_core.h" #include "qgis_core.h"
#include "qgstextcharacterformat.h" #include "qgstextcharacterformat.h"
#include "qgsstringutils.h"
class QTextFragment; class QTextFragment;
@ -87,6 +88,13 @@ class CORE_EXPORT QgsTextFragment
*/ */
double horizontalAdvance( const QFont &font, bool fontHasBeenUpdatedForFragment = false, double scaleFactor = 1.0 ) const; 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: private:
QString mText; QString mText;

View File

@ -16,7 +16,8 @@ import qgis # NOQA
from qgis.core import ( from qgis.core import (
QgsTextBlock, QgsTextBlock,
QgsTextFragment QgsTextFragment,
QgsStringUtils
) )
from qgis.testing import start_app, unittest from qgis.testing import start_app, unittest
@ -85,6 +86,13 @@ class TestQgsTextBlock(unittest.TestCase):
self.assertEqual(len(block), 0) self.assertEqual(len(block), 0)
self.assertTrue(block.empty()) 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__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -18,7 +18,8 @@ from qgis.core import (
QgsTextDocument, QgsTextDocument,
QgsTextBlock, QgsTextBlock,
QgsTextFragment, QgsTextFragment,
QgsTextCharacterFormat QgsTextCharacterFormat,
QgsStringUtils
) )
from qgis.testing import start_app, unittest from qgis.testing import start_app, unittest
@ -160,6 +161,11 @@ class TestQgsTextDocument(unittest.TestCase):
self.assertEqual(len(doc[2]), 1) self.assertEqual(len(doc[2]), 1)
self.assertEqual(doc[2][0].text(), 'red') 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__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -16,7 +16,8 @@ import qgis # NOQA
from qgis.core import ( from qgis.core import (
QgsTextFragment, QgsTextFragment,
QgsTextCharacterFormat QgsTextCharacterFormat,
QgsStringUtils
) )
from qgis.PyQt.QtGui import QColor from qgis.PyQt.QtGui import QColor
from qgis.testing import start_app, unittest from qgis.testing import start_app, unittest
@ -49,6 +50,11 @@ class TestQgsTextFragment(unittest.TestCase):
self.assertTrue(fragment.characterFormat().textColor().isValid()) self.assertTrue(fragment.characterFormat().textColor().isValid())
self.assertEqual(fragment.characterFormat().textColor().name(), '#ff0000') 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__': if __name__ == '__main__':
unittest.main() unittest.main()