15#include <QAbstractItemModel>
21#include <QTextTableCell>
25class KDReports::AutoTableElementPrivate
30 void createHorizontalHeader(ReportBuilder &builder,
QTextDocument &textDoc,
QTextTable *textTable,
int columns,
int headerColumnCount)
const;
31 void createVerticalHeader(ReportBuilder &builder,
QTextDocument &textDoc,
QTextTable *textTable,
int rows,
int headerRowCount)
const;
35 bool m_verticalHeaderVisible =
true;
36 bool m_horizontalHeaderVisible =
true;
49 , cellDecoration(tableModel->headerData(section, orientation,
Qt::
DecorationRole))
50 , cellFont(tableModel->headerData(section, orientation,
Qt::
FontRole))
51 , cellText(tableModel->headerData(section, orientation,
Qt::
DisplayRole).toString())
52 , foreground(tableModel->headerData(section, orientation,
Qt::
ForegroundRole))
53 , background(tableModel->headerData(section, orientation,
Qt::
BackgroundRole))
55 , decorationAlignment(tableModel->headerData(section, orientation,
KDReports::AutoTableElement::DecorationAlignmentRole))
56 , nonBreakableLines(tableModel->headerData(section, orientation,
KDReports::AutoTableElement::NonBreakableLinesRole).toBool())
63 , cellFont(tableModel->data(index,
Qt::
FontRole))
64 , cellText(displayText(tableModel->data(index,
Qt::
DisplayRole)))
68 , decorationAlignment(tableModel->data(index,
KDReports::AutoTableElement::DecorationAlignmentRole))
69 , nonBreakableLines(tableModel->data(index,
KDReports::AutoTableElement::NonBreakableLinesRole).toBool())
87 bool nonBreakableLines;
97 if (background.canConvert<
QBrush>()) {
108 cellCursor.setBlockFormat(blockFormat);
110 const bool hasIcon = !cellDecoration.isNull();
111 const bool iconAfterText = decorationAlignment.isValid() && (decorationAlignment.toInt() &
Qt::AlignRight);
112 if (hasIcon && !iconAfterText) {
113 insertDecoration(builder, textDoc);
117 if (cellFont.isValid()) {
118 QFont cellQFont = qvariant_cast<QFont>(cellFont);
119#if QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)
127 if (foreground.canConvert<
QBrush>()) {
130 cellCursor.setCharFormat(charFormat);
132 if (hasIcon && !iconAfterText) {
138 cellCursor.insertHtml(cellText);
140 cellCursor.insertText(cellText);
142 if (hasIcon && iconAfterText) {
144 insertDecoration(builder, textDoc);
147 if (span.width() > 1 || span.height() > 1)
153 QImage img = qvariant_cast<QImage>(cellDecoration);
155 img = qvariant_cast<QIcon>(cellDecoration).pixmap(iconSize).toImage();
158 static int imageNumber = 0;
159 const QString name = QStringLiteral(
"cell-image%1.png").
arg(++imageNumber);
162 cellCursor.insertImage(name);
204 : d(new AutoTableElementPrivate)
210 : d(new AutoTableElementPrivate)
216 : AbstractTableElement(other)
217 , d(new AutoTableElementPrivate(*other.d))
225 AbstractTableElement::operator=(other);
237 FillCellHelper helper(m_tableModel, section, orientation, m_iconSize);
238 helper.fill(textTable, builder, textDoc, cell);
243 const QModelIndex index = m_tableModel->index(row, column);
244 const QSize span = m_tableModel->span(index);
245 FillCellHelper helper(m_tableModel, index, span, m_iconSize);
246 helper.fill(textTable, builder, textDoc, cell);
250void KDReports::AutoTableElementPrivate::createHorizontalHeader(ReportBuilder &builder,
QTextDocument &textDoc,
QTextTable *textTable,
int columns,
int headerColumnCount)
const
252 if (m_horizontalHeaderVisible) {
253 for (
int column = 0; column < columns; column++) {
258 if (m_horizontalHeaderFormatFunc)
259 m_horizontalHeaderFormatFunc(column, tableHeaderFormat);
261 fillCellFromHeaderData(column,
Qt::Horizontal, cell, textDoc, textTable, builder);
266void KDReports::AutoTableElementPrivate::createVerticalHeader(ReportBuilder &builder,
QTextDocument &textDoc,
QTextTable *textTable,
int rows,
int headerRowCount)
const
268 if (m_verticalHeaderVisible) {
269 for (
int row = 0; row < rows; row++) {
274 if (m_verticalHeaderFormatFunc)
275 m_verticalHeaderFormatFunc(row, tableHeaderFormat);
277 fillCellFromHeaderData(row,
Qt::Vertical, cell, textDoc, textTable, builder);
284 if (!d->m_tableModel) {
292 const int headerRowCount = d->m_horizontalHeaderVisible ? 1 : 0;
293 const int headerColumnCount = d->m_verticalHeaderVisible ? 1 : 0;
298 fillTableFormat(tableFormat, textDocCursor);
300 while (d->m_tableModel->canFetchMore(
QModelIndex()))
303 const int rows = d->m_tableModel->rowCount();
304 const int columns = d->m_tableModel->columnCount();
306 QTextTable *textTable = textDocCursor.
insertTable(rows + headerRowCount, columns + headerColumnCount, tableFormat);
310 d->createHorizontalHeader(builder, textDoc, textTable, columns, headerColumnCount);
311 d->createVerticalHeader(builder, textDoc, textTable, rows, headerRowCount);
314 coveredCells.
resize(rows);
315 for (
int row = 0; row < rows; row++)
316 coveredCells[row].resize(columns);
319 for (
int row = 0; row < rows; row++) {
320 for (
int column = 0; column < columns; column++) {
321 if (coveredCells[row].testBit(column))
325 const QSize span = d->fillTableCell(row, column, cell, textDoc, textTable, builder);
327 for (
int r = row; r < row + span.
height() && r < rows; ++r) {
328 for (
int c = column; c < column + span.
width() && c < columns; ++c) {
329 coveredCells[r].setBit(c);
350 d->m_verticalHeaderVisible = visible;
355 d->m_horizontalHeaderVisible = visible;
360 d->m_headerBackground = brush;
365 return d->m_verticalHeaderVisible;
370 return d->m_horizontalHeaderVisible;
375 d->m_iconSize = iconSize;
380 return d->m_iconSize;
385 return d->m_tableModel;
390 d->m_tableModel = tableModel;
400 return d->m_headerBackground;
405 d->m_horizontalHeaderFormatFunc = func;
410 d->m_verticalHeaderFormatFunc = func;
~AutoTableElement() override
QAbstractItemModel * tableModel() const
AutoTableElement(QAbstractItemModel *tableModel)
AutoTableElement & operator=(const AutoTableElement &other)
void setHorizontalHeaderVisible(bool visible)
QBrush headerBackground() const
void setModelKey(const QString &modelKey)
bool isHorizontalHeaderVisible() const
bool isVerticalHeaderVisible() const
void setVerticalHeaderFormatFunction(const CellFormatFunc &func)
Sets the function to call in order to customize the format of the cells created for the horizontal he...
void setTableModel(QAbstractItemModel *tableModel)
void setVerticalHeaderVisible(bool visible)
void setHorizontalHeaderFormatFunction(const CellFormatFunc &func)
Sets the function to call in order to customize the format of the cells created for the horizontal he...
void setIconSize(QSize iconSize)
std::function< void(int, QTextTableCellFormat &)> CellFormatFunc
void build(ReportBuilder &) const override
void setHeaderBackground(const QBrush &brush)
Element * clone() const override
TextDocumentData & currentDocumentData()
QTextDocument & currentDocument()
static QTextCharFormat::VerticalAlignment toVerticalAlignment(Qt::Alignment alignment)
void setupBlockFormat(QTextBlockFormat &blockFormat) const
QFont defaultFont() const
void addResourceName(const QString &resourceName)
void registerAutoTable(QTextTable *table, const KDReports::AutoTableElement *element)
QAbstractItemModel * modelForKey(const QString &key)
bool isNull() const const
QString toString(qlonglong i) const const
bool isValid() const const
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
Qt::Alignment alignment() const const
void setAlignment(Qt::Alignment alignment)
void setNonBreakableLines(bool b)
FontPropertiesSpecifiedOnly
void setFont(const QFont &font, QTextCharFormat::FontPropertiesInheritanceBehavior behavior)
void setVerticalAlignment(QTextCharFormat::VerticalAlignment alignment)
QTextBlockFormat blockFormat() const const
QTextTable * insertTable(int rows, int columns, const QTextTableFormat &format)
bool movePosition(QTextCursor::MoveOperation operation, QTextCursor::MoveMode mode, int n)
void addResource(int type, const QUrl &name, const QVariant &resource)
void setBackground(const QBrush &brush)
void setForeground(const QBrush &brush)
void setProperty(int propertyId, const QVariant &value)
QTextTableCell cellAt(int row, int column) const const
void mergeCells(int row, int column, int numRows, int numCols)
QTextCursor firstCursorPosition() const const
QTextCharFormat format() const const
bool isValid() const const
void setFormat(const QTextCharFormat &format)
void setAlignment(Qt::Alignment alignment)
QDate toDate() const const
QDateTime toDateTime() const const
qlonglong toLongLong(bool *ok) const const
qreal toReal(bool *ok) const const
QString toString() const const
QTime toTime() const const
qulonglong toULongLong(bool *ok) const const
int userType() const const