21 #include <QAbstractItemModel>
26 #include <QTextCursor>
27 #include <QTextTableCell>
31 class KDReports::AutoTableElementPrivate
39 bool m_verticalHeaderVisible =
true;
40 bool m_horizontalHeaderVisible =
true;
51 , cellDecoration(tableModel->headerData(section, orientation,
Qt::
DecorationRole))
52 , cellFont(tableModel->headerData(section, orientation,
Qt::
FontRole))
53 , cellText(tableModel->headerData(section, orientation,
Qt::
DisplayRole).toString())
54 , foreground(tableModel->headerData(section, orientation,
Qt::
ForegroundRole))
55 , background(tableModel->headerData(section, orientation,
Qt::
BackgroundRole))
57 , decorationAlignment(tableModel->headerData(section, orientation,
KDReports::AutoTableElement::DecorationAlignmentRole))
58 , nonBreakableLines(tableModel->headerData(section, orientation,
KDReports::AutoTableElement::NonBreakableLinesRole).toBool())
65 , cellFont(tableModel->data(index,
Qt::
FontRole))
66 , cellText(displayText(tableModel->data(index,
Qt::
DisplayRole)))
70 , decorationAlignment(tableModel->data(index,
KDReports::AutoTableElement::DecorationAlignmentRole))
71 , nonBreakableLines(tableModel->data(index,
KDReports::AutoTableElement::NonBreakableLinesRole).toBool())
89 bool nonBreakableLines;
114 if (background.canConvert<
QBrush>()) {
125 cellCursor.setBlockFormat(blockFormat);
127 const bool hasIcon = !cellDecoration.isNull();
128 const bool iconAfterText = decorationAlignment.isValid() && (decorationAlignment.toInt() &
Qt::AlignRight);
129 if (hasIcon && !iconAfterText) {
130 insertDecoration(builder, textDoc);
134 if (cellFont.isValid()) {
135 QFont cellQFont = qvariant_cast<QFont>(cellFont);
136 #if QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)
144 if (foreground.canConvert<
QBrush>()) {
147 cellCursor.setCharFormat(charFormat);
149 if (hasIcon && !iconAfterText) {
155 cellCursor.insertHtml(cellText);
157 cellCursor.insertText(cellText);
159 if (hasIcon && iconAfterText) {
161 insertDecoration(builder, textDoc);
164 if (span.width() > 1 || span.height() > 1)
170 QImage img = qvariant_cast<QImage>(cellDecoration);
172 img = qvariant_cast<QIcon>(cellDecoration).pixmap(iconSize).toImage();
175 static int imageNumber = 0;
176 const QString name = QStringLiteral(
"cell-image%1.png").
arg(++imageNumber);
179 cellCursor.insertImage(name);
221 : d(new AutoTableElementPrivate)
227 : d(new AutoTableElementPrivate)
234 , d(new AutoTableElementPrivate(*other.d))
254 FillCellHelper helper(m_tableModel, section, orientation, m_iconSize);
255 helper.fill(textTable, builder, textDoc, cell);
260 const QModelIndex index = m_tableModel->index(row, column);
261 const QSize span = m_tableModel->span(index);
262 FillCellHelper helper(m_tableModel, index, span, m_iconSize);
263 helper.fill(textTable, builder, textDoc, cell);
269 if (!d->m_tableModel) {
277 const int headerRowCount = d->m_horizontalHeaderVisible ? 1 : 0;
278 const int headerColumnCount = d->m_verticalHeaderVisible ? 1 : 0;
283 fillTableFormat(tableFormat, textDocCursor);
285 while (d->m_tableModel->canFetchMore(
QModelIndex()))
288 const int rows = d->m_tableModel->rowCount();
289 const int columns = d->m_tableModel->columnCount();
291 QTextTable *textTable = textDocCursor.
insertTable(rows + headerRowCount, columns + headerColumnCount, tableFormat);
297 if (d->m_horizontalHeaderVisible) {
298 for (
int column = 0; column < columns; column++) {
302 d->fillCellFromHeaderData(column,
Qt::Horizontal, cell, textDoc, textTable, builder);
306 if (d->m_verticalHeaderVisible) {
307 for (
int row = 0; row < rows; row++) {
311 d->fillCellFromHeaderData(row,
Qt::Vertical, cell, textDoc, textTable, builder);
316 coveredCells.
resize(rows);
317 for (
int row = 0; row < rows; row++)
318 coveredCells[row].resize(columns);
321 for (
int row = 0; row < rows; row++) {
322 for (
int column = 0; column < columns; column++) {
323 if (coveredCells[row].testBit(column))
327 const QSize span = d->fillTableCell(row, column, cell, textDoc, textTable, builder);
329 for (
int r = row; r < row + span.
height() && r < rows; ++r) {
330 for (
int c = column; c < column + span.
width() && c < columns; ++c) {
331 coveredCells[r].setBit(c);
352 d->m_verticalHeaderVisible = visible;
357 d->m_horizontalHeaderVisible = visible;
362 d->m_headerBackground = brush;
367 return d->m_verticalHeaderVisible;
372 return d->m_horizontalHeaderVisible;
377 d->m_iconSize = iconSize;
382 return d->m_iconSize;
387 return d->m_tableModel;
392 d->m_tableModel = tableModel;
402 return d->m_headerBackground;