QGIS API Documentation  3.4.15-Madeira (e83d02e274)
qgslayouttable.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayouttable.h
3  ----------------
4  begin : November 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 #ifndef QGSLAYOUTTABLE_H
19 #define QGSLAYOUTTABLE_H
20 
21 #include "qgis_core.h"
22 #include "qgis_sip.h"
23 #include "qgis.h"
24 #include "qgslayoutmultiframe.h"
25 #include <QFont>
26 #include <QColor>
27 #include <QPair>
28 
30 
37 typedef QVector< QVariant > QgsLayoutTableRow;
38 
45 #ifndef SIP_RUN
46 typedef QVector< QgsLayoutTableRow > QgsLayoutTableContents;
47 #else
48 typedef QVector< QVector< QVariant > > QgsLayoutTableContents;
49 #endif
50 
51 
57 typedef QVector< QgsLayoutTableColumn * > QgsLayoutTableColumns;
58 
59 
67 class CORE_EXPORT QgsLayoutTableStyle
68 {
69  public:
70 
72  QgsLayoutTableStyle() = default;
73 
75  bool enabled = false;
76 
78  QColor cellBackgroundColor = QColor( 255, 255, 255, 255 );
79 
86  bool writeXml( QDomElement &styleElem, QDomDocument &doc ) const;
87 
93  bool readXml( const QDomElement &styleElem );
94 
95 };
96 
103 class CORE_EXPORT QgsLayoutTable: public QgsLayoutMultiFrame
104 {
105  Q_OBJECT
106 
107  public:
108 
113  {
117  HeaderRight
118  };
119 
124  {
125  FirstFrame = 0,
127  NoHeaders
128  };
129 
134  {
135  HeadersOnly = 0,
137  ShowMessage
138  };
139 
144  {
145  TruncateText = 0,
146  WrapText
147  };
148 
153  {
162  LastRow
163  };
164 
168  QgsLayoutTable( QgsLayout *layout );
169 
170  ~QgsLayoutTable() override;
171 
176  void setCellMargin( double margin );
177 
182  double cellMargin() const { return mCellMargin; }
183 
188  void setEmptyTableBehavior( EmptyTableMode mode );
189 
195  EmptyTableMode emptyTableBehavior() const { return mEmptyTableMode; }
196 
204  void setEmptyTableMessage( const QString &message );
205 
213  QString emptyTableMessage() const { return mEmptyTableMessage; }
214 
220  void setShowEmptyRows( bool showEmpty );
221 
226  bool showEmptyRows() const { return mShowEmptyRows; }
227 
233  void setHeaderFont( const QFont &font );
234 
240  QFont headerFont() const { return mHeaderFont; }
241 
248  void setHeaderFontColor( const QColor &color );
249 
256  QColor headerFontColor() const { return mHeaderFontColor; }
257 
262  void setHeaderHAlignment( HeaderHAlignment alignment );
263 
268  HeaderHAlignment headerHAlignment() const { return mHeaderHAlignment; }
269 
275  void setHeaderMode( HeaderMode mode );
276 
282  HeaderMode headerMode() const { return mHeaderMode; }
283 
289  void setContentFont( const QFont &font );
290 
296  QFont contentFont() const { return mContentFont; }
297 
304  void setContentFontColor( const QColor &color );
305 
312  QColor contentFontColor() const { return mContentFontColor; }
313 
321  void setShowGrid( bool showGrid );
322 
329  bool showGrid() const { return mShowGrid; }
330 
337  void setGridStrokeWidth( double width );
338 
345  double gridStrokeWidth() const { return mGridStrokeWidth; }
346 
353  void setGridColor( const QColor &color );
354 
361  QColor gridColor() const { return mGridColor; }
362 
371  void setHorizontalGrid( bool horizontalGrid );
372 
380  bool horizontalGrid() const { return mHorizontalGrid; }
381 
390  void setVerticalGrid( bool verticalGrid );
391 
399  bool verticalGrid() const { return mVerticalGrid; }
400 
406  void setBackgroundColor( const QColor &color );
407 
413  QColor backgroundColor() const { return mBackgroundColor; }
414 
420  void setWrapBehavior( WrapBehavior behavior );
421 
427  WrapBehavior wrapBehavior() const { return mWrapBehavior; }
428 
433  QgsLayoutTableColumns &columns() { return mColumns; }
434 
440  void setColumns( const QgsLayoutTableColumns &columns );
441 
446  void setCellStyle( CellStyleGroup group, const QgsLayoutTableStyle &style );
447 
452  const QgsLayoutTableStyle *cellStyle( CellStyleGroup group ) const;
453 
460  virtual QMap<int, QString> headerLabels() const SIP_SKIP;
461 
467  virtual bool getTableContents( QgsLayoutTableContents &contents ) = 0;
468 
472  QgsLayoutTableContents &contents() { return mTableContents; }
473 
474  QSizeF fixedFrameSize( int frameIndex = -1 ) const override;
475  QSizeF minFrameSize( int frameIndex = -1 ) const override;
476 
477  bool writePropertiesToElement( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const override;
478  bool readPropertiesFromElement( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context ) override;
479  QSizeF totalSize() const override;
480  void render( QgsLayoutItemRenderContext &context, const QRectF &renderExtent, int frameIndex ) override;
481 
482  public slots:
483 
484  void refresh() override;
485 
491  virtual void refreshAttributes();
492 
493  void recalculateFrameSizes() override;
494 
495  protected:
497  double mCellMargin = 1.0;
498 
500  EmptyTableMode mEmptyTableMode = HeadersOnly;
501 
504 
506  bool mShowEmptyRows = false;
507 
509  QFont mHeaderFont;
510 
512  QColor mHeaderFontColor = Qt::black;
513 
515  HeaderHAlignment mHeaderHAlignment = FollowColumn;
516 
518  HeaderMode mHeaderMode = FirstFrame;
519 
522 
524  QColor mContentFontColor = Qt::black;
525 
527  bool mShowGrid = true;
528 
530  double mGridStrokeWidth = 0.5;
531 
533  QColor mGridColor = Qt::black;
534 
536  bool mHorizontalGrid = true;
537 
539  bool mVerticalGrid = true;
540 
542  QColor mBackgroundColor = Qt::white;
543 
546 
549 
551  QMap<int, double> mMaxColumnWidthMap;
552 
554  QMap<int, double> mMaxRowHeightMap;
555 
556  QSizeF mTableSize;
557 
558  WrapBehavior mWrapBehavior = TruncateText;
559 
560  QMap< CellStyleGroup, QgsLayoutTableStyle * > mCellStyles;
561 
565  virtual bool calculateMaxColumnWidths();
566 
570  virtual bool calculateMaxRowHeights();
571 
577  //not const, as needs to call calculateMaxColumnWidths()
578  double totalWidth();
579 
584  //not const, as needs to call calculateMaxRowHeights()
585  double totalHeight();
586 
598  int rowsVisible( double frameHeight, int firstRow, bool includeHeader, bool includeEmptyRows ) const;
599 
609  int rowsVisible( int frameIndex, int firstRow, bool includeEmptyRows ) const;
610 
616  QPair<int, int> rowRange( int frameIndex ) const;
617 
627  void drawHorizontalGridLines( QPainter *painter, int firstRow, int lastRow, bool drawHeaderLines ) const;
628 
644  void drawVerticalGridLines( QPainter *painter, const QMap<int, double> &maxWidthMap, int firstRow, int lastRow, bool hasHeader, bool mergeCells = false ) const SIP_SKIP;
645 
649  void recalculateTableSize();
650 
657  bool contentsContainsRow( const QgsLayoutTableContents &contents, const QgsLayoutTableRow &row ) const;
658 
659  private:
660 
661  QMap< CellStyleGroup, QString > mCellStyleNames;
662 
664  void initStyles();
665 
666  bool textRequiresWrapping( const QString &text, double columnWidth, const QFont &font ) const;
667 
668  QString wrappedText( const QString &value, double columnWidth, const QFont &font ) const;
669 
676  QColor backgroundColor( int row, int column ) const;
677 
678  friend class TestQgsLayoutTable;
680 };
681 
682 #endif // QGSLAYOUTTABLE_H
EmptyTableMode
Controls how empty tables are displayed.
The class is used as a container of context for various read/write operations on other objects...
QMap< int, double > mMaxRowHeightMap
Map of maximum height for each row.
QFont contentFont() const
Returns the font used to draw text in table body cells.
bool verticalGrid() const
Returns whether the grid&#39;s vertical lines are drawn in the table.
virtual QSizeF totalSize() const =0
Returns the total size of the multiframe&#39;s content, in layout units.
void refresh() override
Refreshes the multiframe, causing a recalculation of any property overrides.
QMap< CellStyleGroup, QgsLayoutTableStyle * > mCellStyles
Style odd numbered columns.
Style first column only.
double cellMargin() const
Returns the margin distance between cell borders and their contents in mm.
WrapBehavior
Controls how long strings in the table are handled.
double gridStrokeWidth() const
Returns the width of grid lines in the table in mm.
Header uses the same alignment as the column.
A class to display a table in the print layout, and allow the table to span over multiple frames...
Styling option for a composer table cell.
QVector< QgsLayoutTableColumn * > QgsLayoutTableColumns
List of column definitions for a QgsLayoutTable.
Style odd numbered rows.
Style even numbered columns.
QString mEmptyTableMessage
String to show in empty tables.
QString emptyTableMessage() const
Returns the message for empty tables with no content rows.
QColor headerFontColor() const
Returns the color used to draw header text in the table.
Stores properties of a column for a QgsLayoutTable.
HeaderMode headerMode() const
Returns the display mode for headers in the table.
Abstract base class for layout items with the ability to distribute the content to several frames (Qg...
bool horizontalGrid() const
Returns whether the grid&#39;s horizontal lines are drawn in the table.
QColor contentFontColor() const
Returns the color used to draw text in table body cells.
bool showEmptyRows() const
Returns whether empty rows are drawn in the table.
Style first row only.
#define SIP_SKIP
Definition: qgis_sip.h:119
QColor gridColor() const
Returns the color used for grid lines in the table.
QColor backgroundColor() const
Returns the color used for the background of the table.
virtual QSizeF minFrameSize(int frameIndex=-1) const
Returns the minimum size for a frames, if desired.
virtual bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const
Stores multiframe state within an XML DOM element.
bool showGrid() const
Returns whether grid lines are drawn in the table.
QFont mHeaderFont
Header font.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition: qgslayout.h:49
HeaderHAlignment headerHAlignment() const
Returns the horizontal alignment for table headers.
virtual void recalculateFrameSizes()
Recalculates the portion of the multiframe item which is shown in each of its component frames...
QFont mContentFont
Table contents font.
WrapBehavior wrapBehavior() const
Returns the wrap behavior for the table, which controls how text within cells is automatically wrappe...
Contains settings and helpers relating to a render of a QgsLayoutItem.
Definition: qgslayoutitem.h:43
Style header row.
virtual bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context)
Sets multiframe state from a DOM element.
Align headers left.
QgsCompositionConverter class converts a QGIS 2.x composition to a QGIS 3.x layout.
QgsLayoutTableColumns mColumns
Columns to show in table.
virtual void render(QgsLayoutItemRenderContext &context, const QRectF &renderExtent, int frameIndex)=0
Renders a portion of the multiframe&#39;s content into a render context.
QgsLayoutTableContents & contents()
Returns the current contents of the table.
Headers shown on all frames.
QgsLayoutTableContents mTableContents
Contents to show in table.
QMap< int, double > mMaxColumnWidthMap
Map of maximum width for each column.
HeaderMode
Controls where headers are shown in the table.
HeaderHAlignment
Controls how headers are horizontally aligned in a table.
Style even numbered rows.
QgsLayoutTableColumns & columns()
Returns a reference to the list of QgsLayoutTableColumns shown in the table.
Align headers to center.
EmptyTableMode emptyTableBehavior() const
Returns the behavior mode for empty tables.
virtual QSizeF fixedFrameSize(int frameIndex=-1) const
Returns the fixed size for a frame, if desired.
QFont headerFont() const
Returns the font used to draw header text in the table.
CellStyleGroup
Row or column groups for cell styling.
QVector< QgsLayoutTableRow > QgsLayoutTableContents
List of QgsLayoutTableRows, representing rows and column cell contents for a QgsLayoutTable.
Style last column only.
Hides entire table if empty.
QVector< QVariant > QgsLayoutTableRow
List of QVariants, representing a the contents of a single row in a QgsComposerTable.