17
17
18
18
#include " qgscomposerlabel.h"
19
19
#include " qgsexpression.h"
20
+ #include < QCoreApplication>
20
21
#include < QDate>
21
22
#include < QDomElement>
22
23
#include < QPainter>
24
+ #include < QWebFrame>
25
+ #include < QWebPage>
23
26
24
27
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 ) ),
26
29
mHAlignment( Qt::AlignLeft ), mVAlignment( Qt::AlignTop ),
27
- mExpressionFeature( 0 ), mExpressionLayer( 0 )
30
+ mExpressionFeature( 0 ), mExpressionLayer( 0 ), mHtmlUnitsToMM( 1.0 )
28
31
{
32
+ mHtmlUnitsToMM = htmlUnitsToMM ();
29
33
// default font size is 10 point
30
34
mFont .setPointSizeF ( 10 );
31
35
}
@@ -45,22 +49,46 @@ void QgsComposerLabel::paint( QPainter* painter, const QStyleOptionGraphicsItem*
45
49
46
50
drawBackground ( painter );
47
51
painter->save ();
48
- painter->setPen ( QPen ( QColor ( mFontColor ) ) ); // draw all text black
49
- painter->setFont ( mFont );
50
52
51
- QFontMetricsF fontSize ( mFont );
52
-
53
- // support multiline labels
54
53
double penWidth = pen ().widthF ();
55
54
QRectF painterRect ( penWidth + mMargin , penWidth + mMargin , mTextBoxWidth - 2 * penWidth - 2 * mMargin , mTextBoxHeight - 2 * penWidth - 2 * mMargin );
56
55
painter->translate ( rect ().width () / 2.0 , rect ().height () / 2.0 );
57
56
painter->rotate ( mRotation );
58
57
painter->translate ( -mTextBoxWidth / 2.0 , -mTextBoxHeight / 2.0 );
59
58
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
+
64
92
65
93
66
94
painter->restore ();
@@ -72,6 +100,17 @@ void QgsComposerLabel::paint( QPainter* painter, const QStyleOptionGraphicsItem*
72
100
}
73
101
}
74
102
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
+
75
114
void QgsComposerLabel::setText ( const QString& text )
76
115
{
77
116
mText = text;
@@ -181,6 +220,8 @@ bool QgsComposerLabel::writeXML( QDomElement& elem, QDomDocument & doc ) const
181
220
182
221
QDomElement composerLabelElem = doc.createElement ( " ComposerLabel" );
183
222
223
+ composerLabelElem.setAttribute ( " htmlState" , mHtmlState );
224
+
184
225
composerLabelElem.setAttribute ( " labelText" , mText );
185
226
composerLabelElem.setAttribute ( " margin" , QString::number ( mMargin ) );
186
227
@@ -217,6 +258,9 @@ bool QgsComposerLabel::readXML( const QDomElement& itemElem, const QDomDocument&
217
258
// text
218
259
mText = itemElem.attribute ( " labelText" );
219
260
261
+ // html state
262
+ mHtmlState = itemElem.attribute ( " htmlState" ).toInt ();
263
+
220
264
// margin
221
265
mMargin = itemElem.attribute ( " margin" ).toDouble ();
222
266
0 commit comments