QGIS API Documentation  3.14.0-Pi (9f7028fd23)
qgslayoutitemlabel.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayoutitemlabel.cpp
3  -------------------
4  begin : October 2017
5  copyright : (C) 2017 by Nyall Dawson
6  email : nyall dot dawson at gmail dot com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "qgslayoutitemlabel.h"
19 #include "qgslayoutitemregistry.h"
20 #include "qgslayout.h"
21 #include "qgslayoututils.h"
22 #include "qgslayoutmodel.h"
23 #include "qgsexpression.h"
25 #include "qgsvectorlayer.h"
26 #include "qgsproject.h"
27 #include "qgsdistancearea.h"
28 #include "qgsfontutils.h"
29 #include "qgsexpressioncontext.h"
30 #include "qgsmapsettings.h"
31 #include "qgslayoutitemmap.h"
32 #include "qgssettings.h"
33 
34 #include "qgswebview.h"
35 #include "qgswebframe.h"
36 #include "qgswebpage.h"
37 
38 #include <QCoreApplication>
39 #include <QDate>
40 #include <QDomElement>
41 #include <QPainter>
42 #include <QTimer>
43 #include <QEventLoop>
44 
46  : QgsLayoutItem( layout )
47 {
48  mDistanceArea.reset( new QgsDistanceArea() );
49  mHtmlUnitsToLayoutUnits = htmlUnitsToLayoutUnits();
50 
51  //get default layout font from settings
52  QgsSettings settings;
53  QString defaultFontString = settings.value( QStringLiteral( "LayoutDesigner/defaultFont" ), QVariant(), QgsSettings::Gui ).toString();
54  if ( !defaultFontString.isEmpty() )
55  {
56  mFont.setFamily( defaultFontString );
57  }
58 
59  //default to a 10 point font size
60  mFont.setPointSizeF( 10 );
61 
62  //default to no background
63  setBackgroundEnabled( false );
64 
65  //a label added while atlas preview is enabled needs to have the expression context set,
66  //otherwise fields in the label aren't correctly evaluated until atlas preview feature changes (#9457)
67  refreshExpressionContext();
68 
69  // only possible on the main thread!
70  if ( QThread::currentThread() == QApplication::instance()->thread() )
71  {
72  mWebPage.reset( new QgsWebPage( this ) );
73  }
74  else
75  {
76  QgsMessageLog::logMessage( QObject::tr( "Cannot load HTML based item label in background threads" ) );
77  }
78  if ( mWebPage )
79  {
80  mWebPage->setIdentifier( tr( "Layout label item" ) );
81  mWebPage->setNetworkAccessManager( QgsNetworkAccessManager::instance() );
82 
83  //This makes the background transparent. Found on http://blog.qt.digia.com/blog/2009/06/30/transparent-qwebview-or-qwebpage/
84  QPalette palette = mWebPage->palette();
85  palette.setBrush( QPalette::Base, Qt::transparent );
86  mWebPage->setPalette( palette );
87 
88  mWebPage->mainFrame()->setZoomFactor( 10.0 );
89  mWebPage->mainFrame()->setScrollBarPolicy( Qt::Horizontal, Qt::ScrollBarAlwaysOff );
90  mWebPage->mainFrame()->setScrollBarPolicy( Qt::Vertical, Qt::ScrollBarAlwaysOff );
91 
92  connect( mWebPage.get(), &QWebPage::loadFinished, this, &QgsLayoutItemLabel::loadingHtmlFinished );
93  }
94 }
95 
97 {
98  return new QgsLayoutItemLabel( layout );
99 }
100 
102 {
104 }
105 
107 {
108  return QgsApplication::getThemeIcon( QStringLiteral( "/mLayoutItemLabel.svg" ) );
109 }
110 
112 {
113  QPainter *painter = context.renderContext().painter();
114  painter->save();
115 
116  // painter is scaled to dots, so scale back to layout units
117  painter->scale( context.renderContext().scaleFactor(), context.renderContext().scaleFactor() );
118 
119  double penWidth = frameEnabled() ? ( pen().widthF() / 2.0 ) : 0;
120  double xPenAdjust = mMarginX < 0 ? -penWidth : penWidth;
121  double yPenAdjust = mMarginY < 0 ? -penWidth : penWidth;
122  QRectF painterRect( xPenAdjust + mMarginX, yPenAdjust + mMarginY, rect().width() - 2 * xPenAdjust - 2 * mMarginX, rect().height() - 2 * yPenAdjust - 2 * mMarginY );
123 
124  switch ( mMode )
125  {
126  case ModeHtml:
127  {
128  if ( mFirstRender )
129  {
130  contentChanged();
131  mFirstRender = false;
132  }
133 
134  if ( mWebPage )
135  {
136  painter->scale( 1.0 / mHtmlUnitsToLayoutUnits / 10.0, 1.0 / mHtmlUnitsToLayoutUnits / 10.0 );
137  mWebPage->setViewportSize( QSize( painterRect.width() * mHtmlUnitsToLayoutUnits * 10.0, painterRect.height() * mHtmlUnitsToLayoutUnits * 10.0 ) );
138  mWebPage->settings()->setUserStyleSheetUrl( createStylesheetUrl() );
139  mWebPage->mainFrame()->render( painter );
140  }
141  break;
142  }
143 
144  case ModeFont:
145  {
146  const QString textToDraw = currentText();
147  painter->setFont( mFont );
148  QgsLayoutUtils::drawText( painter, painterRect, textToDraw, mFont, mFontColor, mHAlignment, mVAlignment, Qt::TextWordWrap );
149  break;
150  }
151  }
152 
153  painter->restore();
154 }
155 
156 void QgsLayoutItemLabel::contentChanged()
157 {
158  switch ( mMode )
159  {
160  case ModeHtml:
161  {
162  const QString textToDraw = currentText();
163  if ( !mWebPage )
164  {
165  mHtmlLoaded = true;
166  return;
167  }
168 
169  //mHtmlLoaded tracks whether the QWebPage has completed loading
170  //its html contents, set it initially to false. The loadingHtmlFinished slot will
171  //set this to true after html is loaded.
172  mHtmlLoaded = false;
173 
174  const QUrl baseUrl = QUrl::fromLocalFile( mLayout->project()->absoluteFilePath() );
175  mWebPage->mainFrame()->setHtml( textToDraw, baseUrl );
176 
177  //For very basic html labels with no external assets, the html load will already be
178  //complete before we even get a chance to start the QEventLoop. Make sure we check
179  //this before starting the loop
180 
181  // important -- we CAN'T do this when it's a render inside the designer, otherwise the
182  // event loop will mess with the paint event and cause it to be deleted, and BOOM!
183  if ( !mHtmlLoaded && ( !mLayout || !mLayout->renderContext().isPreviewRender() ) )
184  {
185  //Setup event loop and timeout for rendering html
186  QEventLoop loop;
187 
188  //Connect timeout and webpage loadFinished signals to loop
189  connect( mWebPage.get(), &QWebPage::loadFinished, &loop, &QEventLoop::quit );
190 
191  // Start a 20 second timeout in case html loading will never complete
192  QTimer timeoutTimer;
193  timeoutTimer.setSingleShot( true );
194  connect( &timeoutTimer, &QTimer::timeout, &loop, &QEventLoop::quit );
195  timeoutTimer.start( 20000 );
196 
197  // Pause until html is loaded
198  loop.exec( QEventLoop::ExcludeUserInputEvents );
199  }
200  break;
201  }
202  case ModeFont:
203  break;
204  }
205 }
206 
207 void QgsLayoutItemLabel::loadingHtmlFinished( bool result )
208 {
209  Q_UNUSED( result )
210  mHtmlLoaded = true;
211  invalidateCache();
212  update();
213 }
214 
215 double QgsLayoutItemLabel::htmlUnitsToLayoutUnits()
216 {
217  if ( !mLayout )
218  {
219  return 1.0;
220  }
221 
222  //TODO : fix this more precisely so that the label's default text size is the same with or without "display as html"
223  return mLayout->convertToLayoutUnits( QgsLayoutMeasurement( mLayout->renderContext().dpi() / 72.0, QgsUnitTypes::LayoutMillimeters ) ); //webkit seems to assume a standard dpi of 72
224 }
225 
226 void QgsLayoutItemLabel::setText( const QString &text )
227 {
228  mText = text;
229  emit changed();
230 
231  contentChanged();
232 
233  if ( mLayout && id().isEmpty() && mMode != ModeHtml )
234  {
235  //notify the model that the display name has changed
236  mLayout->itemsModel()->updateItemDisplayName( this );
237  }
238 }
239 
241 {
242  if ( mode == mMode )
243  {
244  return;
245  }
246 
247  mMode = mode;
248  contentChanged();
249 
250  if ( mLayout && id().isEmpty() )
251  {
252  //notify the model that the display name has changed
253  mLayout->itemsModel()->updateItemDisplayName( this );
254  }
255 }
256 
257 void QgsLayoutItemLabel::refreshExpressionContext()
258 {
259  if ( !mLayout )
260  return;
261 
262  QgsVectorLayer *layer = mLayout->reportContext().layer();
263  //setup distance area conversion
264  if ( layer )
265  {
266  mDistanceArea->setSourceCrs( layer->crs(), mLayout->project()->transformContext() );
267  }
268  else
269  {
270  //set to composition's reference map's crs
271  QgsLayoutItemMap *referenceMap = mLayout->referenceMap();
272  if ( referenceMap )
273  mDistanceArea->setSourceCrs( referenceMap->crs(), mLayout->project()->transformContext() );
274  }
275  mDistanceArea->setEllipsoid( mLayout->project()->ellipsoid() );
276  contentChanged();
277 
278  update();
279 }
280 
282 {
283  QString displayText = mText;
284  replaceDateText( displayText );
285 
287 
288  return QgsExpression::replaceExpressionText( displayText, &context, mDistanceArea.get() );
289 }
290 
291 void QgsLayoutItemLabel::replaceDateText( QString &text ) const
292 {
293  QString constant = QStringLiteral( "$CURRENT_DATE" );
294  int currentDatePos = text.indexOf( constant );
295  if ( currentDatePos != -1 )
296  {
297  //check if there is a bracket just after $CURRENT_DATE
298  QString formatText;
299  int openingBracketPos = text.indexOf( '(', currentDatePos );
300  int closingBracketPos = text.indexOf( ')', openingBracketPos + 1 );
301  if ( openingBracketPos != -1 &&
302  closingBracketPos != -1 &&
303  ( closingBracketPos - openingBracketPos ) > 1 &&
304  openingBracketPos == currentDatePos + constant.size() )
305  {
306  formatText = text.mid( openingBracketPos + 1, closingBracketPos - openingBracketPos - 1 );
307  text.replace( currentDatePos, closingBracketPos - currentDatePos + 1, QDate::currentDate().toString( formatText ) );
308  }
309  else //no bracket
310  {
311  text.replace( QLatin1String( "$CURRENT_DATE" ), QDate::currentDate().toString() );
312  }
313  }
314 }
315 
316 void QgsLayoutItemLabel::setFont( const QFont &f )
317 {
318  mFont = f;
319 }
320 
321 void QgsLayoutItemLabel::setMargin( const double m )
322 {
323  mMarginX = m;
324  mMarginY = m;
325  prepareGeometryChange();
326 }
327 
328 void QgsLayoutItemLabel::setMarginX( const double margin )
329 {
330  mMarginX = margin;
331  prepareGeometryChange();
332 }
333 
334 void QgsLayoutItemLabel::setMarginY( const double margin )
335 {
336  mMarginY = margin;
337  prepareGeometryChange();
338 }
339 
341 {
342  QSizeF newSize = sizeForText();
343 
344  //keep alignment point constant
345  double xShift = 0;
346  double yShift = 0;
347 
348  itemShiftAdjustSize( newSize.width(), newSize.height(), xShift, yShift );
349 
350  //update rect for data defined size and position
351  attemptSetSceneRect( QRectF( pos().x() + xShift, pos().y() + yShift, newSize.width(), newSize.height() ) );
352 }
353 
355 {
356  double textWidth = QgsLayoutUtils::textWidthMM( mFont, currentText() );
357  double fontHeight = QgsLayoutUtils::fontHeightMM( mFont );
358 
359  double penWidth = frameEnabled() ? ( pen().widthF() / 2.0 ) : 0;
360 
361  double width = textWidth + 2 * mMarginX + 2 * penWidth;
362  double height = fontHeight + 2 * mMarginY + 2 * penWidth;
363 
364  return mLayout->convertToLayoutUnits( QgsLayoutSize( width, height, QgsUnitTypes::LayoutMillimeters ) );
365 }
366 
368 {
369  return mFont;
370 }
371 
372 bool QgsLayoutItemLabel::writePropertiesToElement( QDomElement &layoutLabelElem, QDomDocument &doc, const QgsReadWriteContext & ) const
373 {
374  layoutLabelElem.setAttribute( QStringLiteral( "htmlState" ), static_cast< int >( mMode ) );
375 
376  layoutLabelElem.setAttribute( QStringLiteral( "labelText" ), mText );
377  layoutLabelElem.setAttribute( QStringLiteral( "marginX" ), QString::number( mMarginX ) );
378  layoutLabelElem.setAttribute( QStringLiteral( "marginY" ), QString::number( mMarginY ) );
379  layoutLabelElem.setAttribute( QStringLiteral( "halign" ), mHAlignment );
380  layoutLabelElem.setAttribute( QStringLiteral( "valign" ), mVAlignment );
381 
382  //font
383  QDomElement labelFontElem = QgsFontUtils::toXmlElement( mFont, doc, QStringLiteral( "LabelFont" ) );
384  layoutLabelElem.appendChild( labelFontElem );
385 
386  //font color
387  QDomElement fontColorElem = doc.createElement( QStringLiteral( "FontColor" ) );
388  fontColorElem.setAttribute( QStringLiteral( "red" ), mFontColor.red() );
389  fontColorElem.setAttribute( QStringLiteral( "green" ), mFontColor.green() );
390  fontColorElem.setAttribute( QStringLiteral( "blue" ), mFontColor.blue() );
391  fontColorElem.setAttribute( QStringLiteral( "alpha" ), mFontColor.alpha() );
392  layoutLabelElem.appendChild( fontColorElem );
393 
394  return true;
395 }
396 
397 bool QgsLayoutItemLabel::readPropertiesFromElement( const QDomElement &itemElem, const QDomDocument &, const QgsReadWriteContext & )
398 {
399  //restore label specific properties
400 
401  //text
402  mText = itemElem.attribute( QStringLiteral( "labelText" ) );
403 
404  //html state
405  mMode = static_cast< Mode >( itemElem.attribute( QStringLiteral( "htmlState" ) ).toInt() );
406 
407  //margin
408  bool marginXOk = false;
409  bool marginYOk = false;
410  mMarginX = itemElem.attribute( QStringLiteral( "marginX" ) ).toDouble( &marginXOk );
411  mMarginY = itemElem.attribute( QStringLiteral( "marginY" ) ).toDouble( &marginYOk );
412  if ( !marginXOk || !marginYOk )
413  {
414  //upgrade old projects where margins where stored in a single attribute
415  double margin = itemElem.attribute( QStringLiteral( "margin" ), QStringLiteral( "1.0" ) ).toDouble();
416  mMarginX = margin;
417  mMarginY = margin;
418  }
419 
420  //Horizontal alignment
421  mHAlignment = static_cast< Qt::AlignmentFlag >( itemElem.attribute( QStringLiteral( "halign" ) ).toInt() );
422 
423  //Vertical alignment
424  mVAlignment = static_cast< Qt::AlignmentFlag >( itemElem.attribute( QStringLiteral( "valign" ) ).toInt() );
425 
426  //font
427  QgsFontUtils::setFromXmlChildNode( mFont, itemElem, QStringLiteral( "LabelFont" ) );
428 
429  //font color
430  QDomNodeList fontColorList = itemElem.elementsByTagName( QStringLiteral( "FontColor" ) );
431  if ( !fontColorList.isEmpty() )
432  {
433  QDomElement fontColorElem = fontColorList.at( 0 ).toElement();
434  int red = fontColorElem.attribute( QStringLiteral( "red" ), QStringLiteral( "0" ) ).toInt();
435  int green = fontColorElem.attribute( QStringLiteral( "green" ), QStringLiteral( "0" ) ).toInt();
436  int blue = fontColorElem.attribute( QStringLiteral( "blue" ), QStringLiteral( "0" ) ).toInt();
437  int alpha = fontColorElem.attribute( QStringLiteral( "alpha" ), QStringLiteral( "255" ) ).toInt();
438  mFontColor = QColor( red, green, blue, alpha );
439  }
440  else
441  {
442  mFontColor = QColor( 0, 0, 0 );
443  }
444 
445  return true;
446 }
447 
449 {
450  if ( !id().isEmpty() )
451  {
452  return id();
453  }
454 
455  switch ( mMode )
456  {
457  case ModeHtml:
458  return tr( "<HTML Label>" );
459 
460  case ModeFont:
461  {
462 
463  //if no id, default to portion of label text
464  QString text = mText;
465  if ( text.isEmpty() )
466  {
467  return tr( "<Label>" );
468  }
469  if ( text.length() > 25 )
470  {
471  return QString( tr( "%1…" ) ).arg( text.left( 25 ).simplified() );
472  }
473  else
474  {
475  return text.simplified();
476  }
477  }
478  }
479  return QString(); // no warnings
480 }
481 
483 {
484  QRectF rectangle = rect();
485  double penWidth = frameEnabled() ? ( pen().widthF() / 2.0 ) : 0;
486  rectangle.adjust( -penWidth, -penWidth, penWidth, penWidth );
487 
488  if ( mMarginX < 0 )
489  {
490  rectangle.adjust( mMarginX, 0, -mMarginX, 0 );
491  }
492  if ( mMarginY < 0 )
493  {
494  rectangle.adjust( 0, mMarginY, 0, -mMarginY );
495  }
496 
497  return rectangle;
498 }
499 
500 void QgsLayoutItemLabel::setFrameEnabled( const bool drawFrame )
501 {
503  prepareGeometryChange();
504 }
505 
507 {
508  QgsLayoutItem::setFrameStrokeWidth( strokeWidth );
509  prepareGeometryChange();
510 }
511 
513 {
514  invalidateCache();
516  refreshExpressionContext();
517 }
518 
519 void QgsLayoutItemLabel::itemShiftAdjustSize( double newWidth, double newHeight, double &xShift, double &yShift ) const
520 {
521  //keep alignment point constant
522  double currentWidth = rect().width();
523  double currentHeight = rect().height();
524  xShift = 0;
525  yShift = 0;
526 
527  double r = rotation();
528  if ( r >= 0 && r < 90 )
529  {
530  if ( mHAlignment == Qt::AlignHCenter )
531  {
532  xShift = - ( newWidth - currentWidth ) / 2.0;
533  }
534  else if ( mHAlignment == Qt::AlignRight )
535  {
536  xShift = - ( newWidth - currentWidth );
537  }
538  if ( mVAlignment == Qt::AlignVCenter )
539  {
540  yShift = -( newHeight - currentHeight ) / 2.0;
541  }
542  else if ( mVAlignment == Qt::AlignBottom )
543  {
544  yShift = - ( newHeight - currentHeight );
545  }
546  }
547  if ( r >= 90 && r < 180 )
548  {
549  if ( mHAlignment == Qt::AlignHCenter )
550  {
551  yShift = -( newHeight - currentHeight ) / 2.0;
552  }
553  else if ( mHAlignment == Qt::AlignRight )
554  {
555  yShift = -( newHeight - currentHeight );
556  }
557  if ( mVAlignment == Qt::AlignTop )
558  {
559  xShift = -( newWidth - currentWidth );
560  }
561  else if ( mVAlignment == Qt::AlignVCenter )
562  {
563  xShift = -( newWidth - currentWidth / 2.0 );
564  }
565  }
566  else if ( r >= 180 && r < 270 )
567  {
568  if ( mHAlignment == Qt::AlignHCenter )
569  {
570  xShift = -( newWidth - currentWidth ) / 2.0;
571  }
572  else if ( mHAlignment == Qt::AlignLeft )
573  {
574  xShift = -( newWidth - currentWidth );
575  }
576  if ( mVAlignment == Qt::AlignVCenter )
577  {
578  yShift = ( newHeight - currentHeight ) / 2.0;
579  }
580  else if ( mVAlignment == Qt::AlignTop )
581  {
582  yShift = ( newHeight - currentHeight );
583  }
584  }
585  else if ( r >= 270 && r < 360 )
586  {
587  if ( mHAlignment == Qt::AlignHCenter )
588  {
589  yShift = -( newHeight - currentHeight ) / 2.0;
590  }
591  else if ( mHAlignment == Qt::AlignLeft )
592  {
593  yShift = -( newHeight - currentHeight );
594  }
595  if ( mVAlignment == Qt::AlignBottom )
596  {
597  xShift = -( newWidth - currentWidth );
598  }
599  else if ( mVAlignment == Qt::AlignVCenter )
600  {
601  xShift = -( newWidth - currentWidth / 2.0 );
602  }
603  }
604 }
605 
606 QUrl QgsLayoutItemLabel::createStylesheetUrl() const
607 {
608  QString stylesheet;
609  stylesheet += QStringLiteral( "body { margin: %1 %2;" ).arg( std::max( mMarginY * mHtmlUnitsToLayoutUnits, 0.0 ) ).arg( std::max( mMarginX * mHtmlUnitsToLayoutUnits, 0.0 ) );
610  stylesheet += QgsFontUtils::asCSS( mFont, 0.352778 * mHtmlUnitsToLayoutUnits );
611  stylesheet += QStringLiteral( "color: rgba(%1,%2,%3,%4);" ).arg( mFontColor.red() ).arg( mFontColor.green() ).arg( mFontColor.blue() ).arg( QString::number( mFontColor.alphaF(), 'f', 4 ) );
612  stylesheet += QStringLiteral( "text-align: %1; }" ).arg( mHAlignment == Qt::AlignLeft ? QStringLiteral( "left" ) : mHAlignment == Qt::AlignRight ? QStringLiteral( "right" ) : mHAlignment == Qt::AlignHCenter ? QStringLiteral( "center" ) : QStringLiteral( "justify" ) );
613 
614  QByteArray ba;
615  ba.append( stylesheet.toUtf8() );
616  QUrl cssFileURL = QUrl( "data:text/css;charset=utf-8;base64," + ba.toBase64() );
617 
618  return cssFileURL;
619 }
QgsExpressionContext
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
Definition: qgsexpressioncontext.h:369
QgsMapLayer::crs
QgsCoordinateReferenceSystem crs
Definition: qgsmaplayer.h:88
QgsLayoutItem::id
QString id() const
Returns the item's ID name.
Definition: qgslayoutitem.h:354
QgsLayoutObject::layout
const QgsLayout * layout() const
Returns the layout the object is attached to.
Definition: qgslayoutobject.cpp:118
QgsLayoutItemLabel::adjustSizeToText
void adjustSizeToText()
Resizes the item so that the label's text fits to the item.
Definition: qgslayoutitemlabel.cpp:340
QgsLayoutItemLabel::readPropertiesFromElement
bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets item state from a DOM element.
Definition: qgslayoutitemlabel.cpp:397
QgsApplication::getThemeIcon
static QIcon getThemeIcon(const QString &name)
Helper to get a theme icon.
Definition: qgsapplication.cpp:605
QgsLayoutItem::setFrameEnabled
virtual void setFrameEnabled(bool drawFrame)
Sets whether this item has a frame drawn around it or not.
Definition: qgslayoutitem.cpp:834
QgsLayoutItem::frameEnabled
bool frameEnabled() const
Returns true if the item includes a frame.
Definition: qgslayoutitem.h:727
QgsSettings::value
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
Definition: qgssettings.cpp:174
QgsReadWriteContext
Definition: qgsreadwritecontext.h:34
QgsFontUtils::asCSS
static QString asCSS(const QFont &font, double pointToPixelMultiplier=1.0)
Returns a CSS string representing the specified font as closely as possible.
Definition: qgsfontutils.cpp:460
QgsLayoutItem::setFrameStrokeWidth
virtual void setFrameStrokeWidth(QgsLayoutMeasurement width)
Sets the frame stroke width.
Definition: qgslayoutitem.cpp:860
qgsexpression.h
qgswebframe.h
QgsLayoutItemLabel::setMarginY
void setMarginY(double margin)
Sets the vertical margin between the edge of the frame and the label contents, in layout units.
Definition: qgslayoutitemlabel.cpp:334
QgsLayoutItemLabel::setMargin
void setMargin(double margin)
Sets the margin between the edge of the frame and the label contents.
Definition: qgslayoutitemlabel.cpp:321
QgsLayoutItemRenderContext
Definition: qgslayoutitem.h:44
QgsLayoutItem::attemptSetSceneRect
void attemptSetSceneRect(const QRectF &rect, bool includesFrame=false)
Attempts to update the item's position and size to match the passed rect in layout coordinates.
Definition: qgslayoutitem.cpp:514
QgsLayoutItemLabel::currentText
QString currentText() const
Returns the text as it appears on the label (with evaluated expressions and other dynamic content).
Definition: qgslayoutitemlabel.cpp:281
QgsLayoutItemLabel::setFrameStrokeWidth
void setFrameStrokeWidth(QgsLayoutMeasurement strokeWidth) override
Sets the frame stroke width.
Definition: qgslayoutitemlabel.cpp:506
QgsLayoutItemLabel::ModeFont
@ ModeFont
Label displays text rendered using a single font.
Definition: qgslayoutitemlabel.h:43
QgsLayoutItemLabel::icon
QIcon icon() const override
Returns the item's icon.
Definition: qgslayoutitemlabel.cpp:106
QgsLayoutItemLabel::boundingRect
QRectF boundingRect() const override
Definition: qgslayoutitemlabel.cpp:482
QgsSettings
Definition: qgssettings.h:61
QgsLayoutItemLabel::type
int type() const override
Definition: qgslayoutitemlabel.cpp:101
qgslayoutitemlabel.h
QgsLayoutItem::drawFrame
virtual void drawFrame(QgsRenderContext &context)
Draws the frame around the item.
Definition: qgslayoutitem.cpp:1210
qgsmapsettings.h
qgsfontutils.h
QgsRenderContext::scaleFactor
double scaleFactor() const
Returns the scaling factor for the render to convert painter units to physical sizes.
Definition: qgsrendercontext.h:317
QgsLayoutItemLabel::sizeForText
QSizeF sizeForText() const
Returns the required item size (in layout units) for the label's text to fill the item.
Definition: qgslayoutitemlabel.cpp:354
QgsLayoutObject::changed
void changed()
Emitted when the object's properties change.
QgsLayoutItemLabel::mode
Mode mode() const
Returns the label's current mode.
Definition: qgslayoutitemlabel.h:100
QgsLayoutItemLabel::writePropertiesToElement
bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores item state within an XML DOM element.
Definition: qgslayoutitemlabel.cpp:372
qgslayoututils.h
QgsWebPage
QWebPage subclass which redirects JavaScript errors and console output to the QGIS message log.
Definition: qgswebpage.h:216
qgswebpage.h
qgsexpressioncontext.h
qgsnetworkaccessmanager.h
QgsLayoutItemLabel::setText
void setText(const QString &text)
Sets the label's preset text.
Definition: qgslayoutitemlabel.cpp:226
QgsLayoutItem::invalidateCache
virtual void invalidateCache()
Forces a deferred update of any cached image the item uses.
Definition: qgslayoutitem.cpp:1180
QgsLayoutItem::setBackgroundEnabled
void setBackgroundEnabled(bool drawBackground)
Sets whether this item has a background drawn under it or not.
Definition: qgslayoutitem.cpp:887
QgsLayoutItemLabel::setFont
void setFont(const QFont &font)
Sets the label's current font.
Definition: qgslayoutitemlabel.cpp:316
QgsLayoutItemLabel::draw
void draw(QgsLayoutItemRenderContext &context) override
Draws the item's contents using the specified item render context.
Definition: qgslayoutitemlabel.cpp:111
QgsLayoutItemLabel::setMarginX
void setMarginX(double margin)
Sets the horizontal margin between the edge of the frame and the label contents, in layout units.
Definition: qgslayoutitemlabel.cpp:328
QgsLayoutItem
Base class for graphical items within a QgsLayout.
Definition: qgslayoutitem.h:112
qgslayout.h
QgsLayoutItemMap::crs
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used for rendering the map.
Definition: qgslayoutitemmap.cpp:264
QgsNetworkAccessManager::instance
static QgsNetworkAccessManager * instance(Qt::ConnectionType connectionType=Qt::BlockingQueuedConnection)
Returns a pointer to the active QgsNetworkAccessManager for the current thread.
Definition: qgsnetworkaccessmanager.cpp:121
QgsLayoutItemLabel::ModeHtml
@ ModeHtml
Label displays rendered HTML content.
Definition: qgslayoutitemlabel.h:44
QgsLayoutItem::refresh
void refresh() override
Refreshes the item, causing a recalculation of any property overrides and recalculation of its positi...
Definition: qgslayoutitem.cpp:1172
qgsvectorlayer.h
QgsLayoutItemMap
Layout graphical items for displaying a map.
Definition: qgslayoutitemmap.h:39
QgsLayoutItemLabel::setMode
void setMode(Mode mode)
Sets the label's current mode, allowing the label to switch between font based and HTML based renderi...
Definition: qgslayoutitemlabel.cpp:240
QgsLayoutItemLabel::text
QString text() const
Returns the label's preset text.
Definition: qgslayoutitemlabel.h:81
QgsLayoutItemLabel::Mode
Mode
Label modes.
Definition: qgslayoutitemlabel.h:41
QgsFontUtils::setFromXmlChildNode
static bool setFromXmlChildNode(QFont &font, const QDomElement &element, const QString &childNode)
Sets the properties of a font to match the properties stored in an XML child node.
Definition: qgsfontutils.cpp:348
QgsLayoutItemRenderContext::renderContext
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
Definition: qgslayoutitem.h:72
QgsLayoutItemRegistry::LayoutLabel
@ LayoutLabel
Label item.
Definition: qgslayoutitemregistry.h:319
QgsLayoutItemLabel::displayName
QString displayName() const override
Gets item display name.
Definition: qgslayoutitemlabel.cpp:448
QgsFontUtils::toXmlElement
static QDomElement toXmlElement(const QFont &font, QDomDocument &document, const QString &elementName)
Returns a DOM element containing the properties of the font.
Definition: qgsfontutils.cpp:324
QgsLayoutObject::mLayout
QPointer< QgsLayout > mLayout
Definition: qgslayoutobject.h:335
QgsLayoutUtils::drawText
static void drawText(QPainter *painter, QPointF position, const QString &text, const QFont &font, const QColor &color=QColor())
Draws text on a painter at a specific position, taking care of layout specific issues (calculation to...
Definition: qgslayoututils.cpp:244
QgsLayout
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition: qgslayout.h:49
QgsLayoutItemLabel::QgsLayoutItemLabel
QgsLayoutItemLabel(QgsLayout *layout)
Constructor for QgsLayoutItemLabel, with the specified parent layout.
Definition: qgslayoutitemlabel.cpp:45
QgsVectorLayer
Definition: qgsvectorlayer.h:385
QgsLayoutItemLabel::create
static QgsLayoutItemLabel * create(QgsLayout *layout)
Returns a new label item for the specified layout.
Definition: qgslayoutitemlabel.cpp:96
qgssettings.h
QgsMessageLog::logMessage
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
Definition: qgsmessagelog.cpp:27
QgsLayoutItemLabel::setFrameEnabled
void setFrameEnabled(bool drawFrame) override
Sets whether this item has a frame drawn around it or not.
Definition: qgslayoutitemlabel.cpp:500
QgsLayoutUtils::fontHeightMM
static double fontHeightMM(const QFont &font)
Calculate a font height in millimeters, including workarounds for QT font rendering issues.
Definition: qgslayoututils.cpp:200
QgsLayoutSize
This class provides a method of storing sizes, consisting of a width and height, for use in QGIS layo...
Definition: qgslayoutsize.h:40
QgsDistanceArea
Definition: qgsdistancearea.h:49
qgsdistancearea.h
qgswebview.h
QgsUnitTypes::LayoutMillimeters
@ LayoutMillimeters
Millimeters.
Definition: qgsunittypes.h:182
QgsLayoutItemLabel
Definition: qgslayoutitemlabel.h:34
QgsRenderContext::painter
QPainter * painter()
Returns the destination QPainter for the render operation.
Definition: qgsrendercontext.h:174
qgslayoutitemregistry.h
QgsExpression::replaceExpressionText
static QString replaceExpressionText(const QString &action, const QgsExpressionContext *context, const QgsDistanceArea *distanceArea=nullptr)
This function replaces each expression between [% and %] in the string with the result of its evaluat...
Definition: qgsexpression.cpp:430
QgsLayoutItem::createExpressionContext
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
Definition: qgslayoutitem.cpp:1159
qgslayoutmodel.h
qgsproject.h
QgsLayoutMeasurement
This class provides a method of storing measurements for use in QGIS layouts using a variety of diffe...
Definition: qgslayoutmeasurement.h:33
QgsLayoutItemLabel::font
QFont font() const
Returns the label's current font.
Definition: qgslayoutitemlabel.cpp:367
QgsSettings::Gui
@ Gui
Definition: qgssettings.h:71
QgsLayoutItemLabel::refresh
void refresh() override
Definition: qgslayoutitemlabel.cpp:512
qgslayoutitemmap.h
QgsLayoutUtils::textWidthMM
static double textWidthMM(const QFont &font, const QString &text)
Calculate a font width in millimeters for a text string, including workarounds for QT font rendering ...
Definition: qgslayoututils.cpp:219