Skip to content

Commit 526ab02

Browse files
committed
Merge pull request #413 from olivierdalang/labelCanDisplayHtml
[Feature] add HTML capabilities to composer labels
2 parents 81d865a + ec634a2 commit 526ab02

7 files changed

+233
-94
lines changed

src/app/composer/qgscomposerlabelwidget.cpp

+33-1
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,43 @@ QgsComposerLabelWidget::QgsComposerLabelWidget( QgsComposerLabel* label ): QWidg
3232
QgsComposerItemWidget* itemPropertiesWidget = new QgsComposerItemWidget( this, label );
3333
toolBox->addItem( itemPropertiesWidget, tr( "General options" ) );
3434

35+
3536
if ( mComposerLabel )
3637
{
3738
setGuiElementValues();
3839
connect( mComposerLabel, SIGNAL( itemChanged() ), this, SLOT( setGuiElementValues() ) );
3940
}
4041
}
4142

43+
void QgsComposerLabelWidget::on_mHtmlCheckBox_stateChanged( int state )
44+
{
45+
if ( mComposerLabel )
46+
{
47+
if (state)
48+
{
49+
mFontButton->setEnabled( false );
50+
mFontColorButton->setEnabled( false );
51+
mHorizontalAlignementGroup->setEnabled( false );
52+
mVerticalAlignementGroup->setEnabled( false );
53+
}
54+
else
55+
{
56+
mFontButton->setEnabled( true );
57+
mFontColorButton->setEnabled( true );
58+
mHorizontalAlignementGroup->setEnabled( true );
59+
mVerticalAlignementGroup->setEnabled( true );
60+
}
61+
62+
mComposerLabel->beginCommand( tr( "Label text HTML state changed" ), QgsComposerMergeCommand::ComposerLabelSetText );
63+
mComposerLabel->blockSignals( true );
64+
mComposerLabel->setHtmlSate(state);
65+
mComposerLabel->setText( mTextEdit->toPlainText() );
66+
mComposerLabel->update();
67+
mComposerLabel->blockSignals( false );
68+
mComposerLabel->endCommand();
69+
}
70+
}
71+
4272
void QgsComposerLabelWidget::on_mTextEdit_textChanged()
4373
{
4474
if ( mComposerLabel )
@@ -223,9 +253,10 @@ void QgsComposerLabelWidget::on_mRotationSpinBox_valueChanged( double v )
223253
void QgsComposerLabelWidget::setGuiElementValues()
224254
{
225255
blockAllSignals( true );
226-
mTextEdit->setText( mComposerLabel->text() );
256+
mTextEdit->setPlainText( mComposerLabel->text() );
227257
mTextEdit->moveCursor( QTextCursor::End, QTextCursor::MoveAnchor );
228258
mMarginDoubleSpinBox->setValue( mComposerLabel->margin() );
259+
mHtmlCheckBox->setChecked( mComposerLabel->htmlSate() );
229260
mTopRadioButton->setChecked( mComposerLabel->vAlign() == Qt::AlignTop );
230261
mMiddleRadioButton->setChecked( mComposerLabel->vAlign() == Qt::AlignVCenter );
231262
mBottomRadioButton->setChecked( mComposerLabel->vAlign() == Qt::AlignBottom );
@@ -239,6 +270,7 @@ void QgsComposerLabelWidget::setGuiElementValues()
239270
void QgsComposerLabelWidget::blockAllSignals( bool block )
240271
{
241272
mTextEdit->blockSignals( block );
273+
mHtmlCheckBox->blockSignals( block );
242274
mMarginDoubleSpinBox->blockSignals( block );
243275
mTopRadioButton->blockSignals( block );
244276
mMiddleRadioButton->blockSignals( block );

src/app/composer/qgscomposerlabelwidget.h

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class QgsComposerLabelWidget: public QWidget, private Ui::QgsComposerLabelWidget
3232
QgsComposerLabelWidget( QgsComposerLabel* label );
3333

3434
public slots:
35+
void on_mHtmlCheckBox_stateChanged( int i );
3536
void on_mTextEdit_textChanged();
3637
void on_mFontButton_clicked();
3738
void on_mInsertExpressionButton_clicked();

src/core/composer/qgscomposerhtml.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ double QgsComposerHtml::htmlUnitsToMM()
103103
return 1.0;
104104
}
105105

106-
return ( mComposition->printResolution() / 96.0 ); //webkit seems to assume a standard dpi of 96
106+
return ( mComposition->printResolution() / 72.0 ); //webkit seems to assume a standard dpi of 96
107107
}
108108

109109
void QgsComposerHtml::addFrame( QgsComposerFrame* frame, bool recalcFrameSizes )

src/core/composer/qgscomposerlabel.cpp

+55-11
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,19 @@
1717

1818
#include "qgscomposerlabel.h"
1919
#include "qgsexpression.h"
20+
#include <QCoreApplication>
2021
#include <QDate>
2122
#include <QDomElement>
2223
#include <QPainter>
24+
#include <QWebFrame>
25+
#include <QWebPage>
2326

2427
QgsComposerLabel::QgsComposerLabel( QgsComposition *composition ):
25-
QgsComposerItem( composition ), mMargin( 1.0 ), mFontColor( QColor( 0, 0, 0 ) ),
28+
QgsComposerItem( composition ), mMargin( 1.0 ), mHtmlState( 0 ), mFontColor( QColor( 0, 0, 0 ) ),
2629
mHAlignment( Qt::AlignLeft ), mVAlignment( Qt::AlignTop ),
27-
mExpressionFeature( 0 ), mExpressionLayer( 0 )
30+
mExpressionFeature( 0 ), mExpressionLayer( 0 ), mHtmlUnitsToMM( 1.0 )
2831
{
32+
mHtmlUnitsToMM = htmlUnitsToMM();
2933
//default font size is 10 point
3034
mFont.setPointSizeF( 10 );
3135
}
@@ -45,22 +49,46 @@ void QgsComposerLabel::paint( QPainter* painter, const QStyleOptionGraphicsItem*
4549

4650
drawBackground( painter );
4751
painter->save();
48-
painter->setPen( QPen( QColor( mFontColor ) ) ); //draw all text black
49-
painter->setFont( mFont );
5052

51-
QFontMetricsF fontSize( mFont );
52-
53-
//support multiline labels
5453
double penWidth = pen().widthF();
5554
QRectF painterRect( penWidth + mMargin, penWidth + mMargin, mTextBoxWidth - 2 * penWidth - 2 * mMargin, mTextBoxHeight - 2 * penWidth - 2 * mMargin );
5655
painter->translate( rect().width() / 2.0, rect().height() / 2.0 );
5756
painter->rotate( mRotation );
5857
painter->translate( -mTextBoxWidth / 2.0, -mTextBoxHeight / 2.0 );
5958

60-
//debug
61-
//painter->setPen( QColor( Qt::red ) );
62-
//painter->drawRect( painterRect );
63-
drawText( painter, painterRect, displayText(), mFont, mHAlignment, mVAlignment );
59+
if( mHtmlState )
60+
{
61+
painter->scale( 1.0 / mHtmlUnitsToMM / 10.0, 1.0 / mHtmlUnitsToMM / 10.0 );
62+
63+
QWebPage* webPage = new QWebPage();
64+
65+
//This makes the background transparent. Found on http://blog.qt.digia.com/blog/2009/06/30/transparent-qwebview-or-qwebpage/
66+
QPalette palette = webPage->palette();
67+
palette.setBrush(QPalette::Base, Qt::transparent);
68+
webPage->setPalette(palette);
69+
//webPage->setAttribute(Qt::WA_OpaquePaintEvent, false); //this does not compile, why ?
70+
71+
webPage->setViewportSize( QSize(painterRect.width() * mHtmlUnitsToMM * 10.0, painterRect.height() * mHtmlUnitsToMM * 10.0) );
72+
webPage->mainFrame()->setZoomFactor( 10.0 );
73+
webPage->mainFrame()->setScrollBarPolicy( Qt::Horizontal, Qt::ScrollBarAlwaysOff );
74+
webPage->mainFrame()->setScrollBarPolicy( Qt::Vertical, Qt::ScrollBarAlwaysOff );
75+
webPage->mainFrame()->setHtml( displayText() );
76+
webPage->mainFrame()->render( painter );//DELETE WEBPAGE ?
77+
}
78+
else
79+
{
80+
painter->setPen( QPen( QColor( mFontColor ) ) );
81+
painter->setFont( mFont );
82+
83+
QFontMetricsF fontSize( mFont );
84+
85+
//debug
86+
//painter->setPen( QColor( Qt::red ) );
87+
//painter->drawRect( painterRect );
88+
drawText( painter, painterRect, displayText(), mFont, mHAlignment, mVAlignment );
89+
}
90+
91+
6492

6593

6694
painter->restore();
@@ -72,6 +100,17 @@ void QgsComposerLabel::paint( QPainter* painter, const QStyleOptionGraphicsItem*
72100
}
73101
}
74102

103+
double QgsComposerLabel::htmlUnitsToMM()
104+
{
105+
if ( !mComposition )
106+
{
107+
return 1.0;
108+
}
109+
110+
//TODO : fix this more precisely so that the label's default text size is the same with or without "display as html"
111+
return ( mComposition->printResolution() / 72.0 ); //webkit seems to assume a standard dpi of 72
112+
}
113+
75114
void QgsComposerLabel::setText( const QString& text )
76115
{
77116
mText = text;
@@ -181,6 +220,8 @@ bool QgsComposerLabel::writeXML( QDomElement& elem, QDomDocument & doc ) const
181220

182221
QDomElement composerLabelElem = doc.createElement( "ComposerLabel" );
183222

223+
composerLabelElem.setAttribute( "htmlState", mHtmlState );
224+
184225
composerLabelElem.setAttribute( "labelText", mText );
185226
composerLabelElem.setAttribute( "margin", QString::number( mMargin ) );
186227

@@ -217,6 +258,9 @@ bool QgsComposerLabel::readXML( const QDomElement& itemElem, const QDomDocument&
217258
//text
218259
mText = itemElem.attribute( "labelText" );
219260

261+
//html state
262+
mHtmlState = itemElem.attribute( "htmlState" ).toInt();
263+
220264
//margin
221265
mMargin = itemElem.attribute( "margin" ).toDouble();
222266

src/core/composer/qgscomposerlabel.h

+8
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ class CORE_EXPORT QgsComposerLabel: public QgsComposerItem
4444
QString text() { return mText; }
4545
void setText( const QString& text );
4646

47+
int htmlSate() { return mHtmlState; }
48+
void setHtmlSate( int state ) {mHtmlState = state;}
49+
4750
/**Returns the text as it appears on screen (with replaced data field)
4851
@note this function was added in version 1.2*/
4952
QString displayText() const;
@@ -104,6 +107,11 @@ class CORE_EXPORT QgsComposerLabel: public QgsComposerItem
104107
// Text
105108
QString mText;
106109

110+
// Html state
111+
int mHtmlState;
112+
double mHtmlUnitsToMM;
113+
double htmlUnitsToMM(); //calculate scale factor
114+
107115
// Font
108116
QFont mFont;
109117

src/ui/qgscomposerhtmlwidgetbase.ui

+22-9
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<x>0</x>
88
<y>0</y>
99
<width>243</width>
10-
<height>116</height>
10+
<height>153</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
@@ -24,41 +24,54 @@
2424
<rect>
2525
<x>0</x>
2626
<y>0</y>
27-
<width>225</width>
28-
<height>72</height>
27+
<width>221</width>
28+
<height>100</height>
2929
</rect>
3030
</property>
3131
<attribute name="label">
3232
<string>HTML</string>
3333
</attribute>
3434
<layout class="QGridLayout" name="gridLayout">
35-
<item row="1" column="2">
35+
<item row="2" column="2">
3636
<widget class="QToolButton" name="mFileToolButton">
3737
<property name="text">
3838
<string>...</string>
3939
</property>
4040
</widget>
4141
</item>
42-
<item row="1" column="1">
42+
<item row="2" column="1">
4343
<widget class="QLineEdit" name="mUrlLineEdit"/>
4444
</item>
45-
<item row="1" column="0">
45+
<item row="2" column="0">
4646
<widget class="QLabel" name="mUrlLabel">
4747
<property name="text">
4848
<string>URL</string>
4949
</property>
5050
</widget>
5151
</item>
52+
<item row="0" column="1" colspan="2">
53+
<widget class="QComboBox" name="mResizeModeComboBox"/>
54+
</item>
55+
<item row="3" column="1">
56+
<spacer name="verticalSpacer">
57+
<property name="orientation">
58+
<enum>Qt::Vertical</enum>
59+
</property>
60+
<property name="sizeHint" stdset="0">
61+
<size>
62+
<width>20</width>
63+
<height>40</height>
64+
</size>
65+
</property>
66+
</spacer>
67+
</item>
5268
<item row="0" column="0">
5369
<widget class="QLabel" name="mResizeModeLabel">
5470
<property name="text">
5571
<string>Resize mode</string>
5672
</property>
5773
</widget>
5874
</item>
59-
<item row="0" column="1" colspan="2">
60-
<widget class="QComboBox" name="mResizeModeComboBox"/>
61-
</item>
6275
</layout>
6376
</widget>
6477
</widget>

0 commit comments

Comments
 (0)