mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Print: improve table printing by using QTableView
The current QTextDocument implementation is slow due to HTML parsing. By using QTableView with QAbstractTableModel we boost the performance of the table print drastically. This patch completely replaces the old solution. There is a hidden QTableView widget which is populated with all data and rendered using a QPainter attached to the printer device. A couple of new classes are added in models.h/cpp that handle the table print model and these are then used in printlayout.h/cpp. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
1f976371bf
commit
e5b18db802
4 changed files with 259 additions and 132 deletions
106
qt-ui/models.cpp
106
qt-ui/models.cpp
|
@ -1438,3 +1438,109 @@ void YearlyStatisticsModel::update_yearly_stats()
|
|||
item->parent = rootItem;
|
||||
}
|
||||
}
|
||||
|
||||
/*#################################################################
|
||||
* #
|
||||
* # Table Print Model
|
||||
* #
|
||||
* ################################################################
|
||||
*/
|
||||
TablePrintModel::TablePrintModel()
|
||||
{
|
||||
columns = 7;
|
||||
rows = 0;
|
||||
}
|
||||
|
||||
TablePrintModel::~TablePrintModel()
|
||||
{
|
||||
for (int i = 0; i < list.size(); i++)
|
||||
delete list.at(i);
|
||||
}
|
||||
|
||||
void TablePrintModel::insertRow(int index)
|
||||
{
|
||||
struct TablePrintItem *item = new struct TablePrintItem();
|
||||
item->colorBackground = 0xffffffff;
|
||||
if (index == -1) {
|
||||
beginInsertRows(QModelIndex(), rows, rows);
|
||||
list.append(item);
|
||||
} else {
|
||||
beginInsertRows(QModelIndex(), index, index);
|
||||
list.insert(index, item);
|
||||
}
|
||||
endInsertRows();
|
||||
rows++;
|
||||
}
|
||||
|
||||
void TablePrintModel::callReset()
|
||||
{
|
||||
reset();
|
||||
}
|
||||
|
||||
QVariant TablePrintModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return QVariant();
|
||||
if (role == Qt::BackgroundRole)
|
||||
return QColor(list.at(index.row())->colorBackground);
|
||||
if (role == Qt::DisplayRole)
|
||||
switch (index.column()) {
|
||||
case 0:
|
||||
return list.at(index.row())->number;
|
||||
case 1:
|
||||
return list.at(index.row())->date;
|
||||
case 2:
|
||||
return list.at(index.row())->depth;
|
||||
case 3:
|
||||
return list.at(index.row())->duration;
|
||||
case 4:
|
||||
return list.at(index.row())->divemaster;
|
||||
case 5:
|
||||
return list.at(index.row())->buddy;
|
||||
case 6:
|
||||
return list.at(index.row())->location;
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
bool TablePrintModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||
{
|
||||
if (index.isValid()) {
|
||||
if (role == Qt::DisplayRole) {
|
||||
switch (index.column()) {
|
||||
case 0:
|
||||
list.at(index.row())->number = value.toString();
|
||||
case 1:
|
||||
list.at(index.row())->date = value.toString();
|
||||
case 2:
|
||||
list.at(index.row())->depth = value.toString();
|
||||
case 3:
|
||||
list.at(index.row())->duration = value.toString();
|
||||
case 4:
|
||||
list.at(index.row())->divemaster = value.toString();
|
||||
case 5:
|
||||
list.at(index.row())->buddy = value.toString();
|
||||
case 6:
|
||||
list.at(index.row())->location = value.toString();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (role == Qt::BackgroundRole) {
|
||||
list.at(index.row())->colorBackground = value.value<unsigned int>();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int TablePrintModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
Q_UNUSED(parent);
|
||||
return rows;
|
||||
}
|
||||
|
||||
int TablePrintModel::columnCount(const QModelIndex &parent) const
|
||||
{
|
||||
Q_UNUSED(parent);
|
||||
return columns;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue