- training_area_telegrams.cpp: Fixed QJsonObject initializer syntax (Qt6 requires {{}} not ({}))
- training_area_telegrams.cpp: Fixed fromJson() methods to access m_* members directly
- training_area_telegrams.cpp: Fixed brace mismatches in multiple toJson() methods
- training_area_telegrams.h: Changed Header struct to public members for consistency
- tx_mixin.cpp: Fixed getEquipmentNumber() template for direct member access
- lts_coordinate.cpp: Added missing #include <iomanip>
- MIGRATION_STATUS.md: Added migration progress tracking document
C++17 constraint enforced due to RTI Connext DDS 7.7.0 incompatibility with C++20+
Build status: BUILD_RTI=OFF successful (0 errors, warnings only)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
387 lines
14 KiB
C++
387 lines
14 KiB
C++
|
|
|
|
#include "printing.h"
|
|
|
|
#include "printing_base.h"
|
|
|
|
#include <KDReports/KDReportsReport>
|
|
#include <LtsSession/lts_session.h>
|
|
#include <LtsSession/lts_session_data.h>
|
|
#include <LtsWidgets/lts_base_layout_widget.h>
|
|
#include <QtCore/QAbstractItemModel>
|
|
#include <QtCore/QDebug>
|
|
#include <QtGui/QImage>
|
|
#include <QtWidgets/QLabel>
|
|
#include <QtWidgets/QListView>
|
|
#include <QtGui/QPainter>
|
|
#include <QPrintDialog>
|
|
#include <QPrinter>
|
|
#include <QtCore/QString>
|
|
#include <QtWidgets/QTableView>
|
|
#include <QtWidgets/QTableWidget>
|
|
#include <QtGui/QTextCursor>
|
|
#include <QtGui/QTextDocument>
|
|
#include <QtWidgets/QTextEdit>
|
|
#include <QTextTable>
|
|
#include <QtWidgets/QTreeView>
|
|
|
|
namespace LtsPrinting
|
|
{
|
|
|
|
bool itemsHaveNoChildren(const QTreeView* view)
|
|
{
|
|
const QAbstractItemModel* itemModel = view->model();
|
|
int rowCount = itemModel->rowCount();
|
|
for (int row = 0; row < rowCount; ++row)
|
|
{
|
|
if (itemModel->hasChildren(itemModel->index(row, 0)))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void setNameOfExerciseAndOperator(LtsSession::LtsSession* session, LtsPrinting::Base& nglPrinter)
|
|
{
|
|
if (session->exerciseId() != 0)
|
|
nglPrinter.setCurrentExerciseName(
|
|
QObject::tr("Exercise: %1 %2").arg(session->exerciseData()->exName, session->exerciseData()->phName));
|
|
else
|
|
nglPrinter.setCurrentExerciseName(QObject::tr("Exercise: Administration"));
|
|
|
|
LtsSessionData::LtsSessionData* sessionData = LtsSessionData::LtsSessionData::getInstance();
|
|
nglPrinter.setOperatorName(sessionData->getOperatorName());
|
|
}
|
|
|
|
void printView(LtsSession::LtsSession* session, QWidget* dialogParent, const QAbstractItemView* view,
|
|
const QString& headingHtml)
|
|
{
|
|
const QTableView* tableView = dynamic_cast<const QTableView*>(view);
|
|
const QTreeView* treeView = dynamic_cast<const QTreeView*>(view);
|
|
QSet<int> hiddenCols;
|
|
|
|
int switchNum = 0;
|
|
if (tableView != nullptr)
|
|
{
|
|
switchNum = 1;
|
|
hiddenCols = LtsPrinting::Base::getHiddenCols(tableView);
|
|
}
|
|
else if (treeView != nullptr)
|
|
{
|
|
switchNum = 2;
|
|
hiddenCols = LtsPrinting::Base::getHiddenCols(treeView);
|
|
if (itemsHaveNoChildren(treeView))
|
|
switchNum = 1;
|
|
}
|
|
else if (dynamic_cast<const QListView*>(view) != nullptr)
|
|
switchNum = 3;
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
|
|
QTextDocument doc;
|
|
QTextCursor cursor(&doc);
|
|
|
|
doc.setMetaInformation(QTextDocument::DocumentTitle, dialogParent->windowTitle());
|
|
LtsPrinting::Base nglPrinter(doc, dialogParent, QObject::tr("Print %1").arg(dialogParent->windowTitle()),
|
|
dialogParent->windowTitle(), QPrinter::A4, QPrinter::Landscape);
|
|
if (!nglPrinter.printer())
|
|
return;
|
|
|
|
setNameOfExerciseAndOperator(session, nglPrinter);
|
|
|
|
cursor.movePosition(QTextCursor::End);
|
|
QString htmlStr;
|
|
|
|
switch (switchNum)
|
|
{
|
|
case 1:
|
|
nglPrinter.printTableData(htmlStr, view, QString(), hiddenCols);
|
|
break;
|
|
case 2:
|
|
nglPrinter.printTreeData(htmlStr, view, QString(), hiddenCols);
|
|
break;
|
|
case 3:
|
|
nglPrinter.printListData(htmlStr, view, QString());
|
|
break;
|
|
}
|
|
cursor.insertHtml(headingHtml);
|
|
cursor.insertHtml(htmlStr);
|
|
nglPrinter.print(&doc);
|
|
}
|
|
|
|
void printView(LtsSession::LtsSession* session, QWidget* dialogParent, QAbstractItemView* view,
|
|
const QString& headingHtml)
|
|
{
|
|
const QAbstractItemView* itemView = static_cast<const QAbstractItemView*>(view);
|
|
printView(session, dialogParent, itemView, headingHtml);
|
|
}
|
|
|
|
void printImage(LtsSession::LtsSession* session, QWidget* dialogParent, const QImage& image, const QString& imageTitle,
|
|
const QString& description, const QPrinter::PageSize& pageSize,
|
|
const QPrinter::Orientation& pageOrientation)
|
|
{
|
|
QTextDocument doc;
|
|
QTextCursor cursor(&doc);
|
|
|
|
QString windowTitle = dialogParent->windowTitle();
|
|
doc.setMetaInformation(QTextDocument::DocumentTitle, dialogParent->windowTitle());
|
|
LtsPrinting::Base nglPrinter(doc, dialogParent, QObject::tr("Print %1").arg(windowTitle), windowTitle, pageSize,
|
|
pageOrientation);
|
|
if (!nglPrinter.printer())
|
|
return;
|
|
|
|
setNameOfExerciseAndOperator(session, nglPrinter);
|
|
|
|
cursor.movePosition(QTextCursor::End);
|
|
|
|
nglPrinter.printDocImage(doc, image, imageTitle, description);
|
|
nglPrinter.print(&doc);
|
|
}
|
|
|
|
void printImages(LtsSession::LtsSession* session, QWidget* dialogParent, const QString& docName,
|
|
QVector<QImage>& images, QVector<QString>& imageTitles, QVector<QString>& descriptions,
|
|
const QPrinter::PageSize& pageSize, const QPrinter::Orientation& pageOrientation)
|
|
|
|
{
|
|
QTextDocument doc;
|
|
QTextCursor cursor(&doc);
|
|
|
|
doc.setMetaInformation(QTextDocument::DocumentTitle, docName);
|
|
LtsPrinting::Base nglPrinter(doc, dialogParent, QObject::tr("Print %1").arg(docName), docName, pageSize,
|
|
pageOrientation);
|
|
if (!nglPrinter.printer())
|
|
return;
|
|
|
|
setNameOfExerciseAndOperator(session, nglPrinter);
|
|
|
|
cursor.movePosition(QTextCursor::End);
|
|
|
|
for (int i = 0; i < images.size(); i++)
|
|
{
|
|
QString imageTitle, imageDescription;
|
|
if (imageTitles.size() > i && imageTitles[i].size() > 0)
|
|
imageTitle = imageTitles[i];
|
|
if (descriptions.size() > i && descriptions[i].size() > 0)
|
|
imageDescription = descriptions[i];
|
|
nglPrinter.printDocImage(doc, images[i], imageTitle, imageDescription);
|
|
nglPrinter.printSinglePage(&doc);
|
|
doc.clear();
|
|
|
|
if (i != images.size() - 1)
|
|
nglPrinter.newPage();
|
|
}
|
|
|
|
nglPrinter.printDone();
|
|
}
|
|
|
|
void printPDFImages(QWidget* dialogParent, const QString& docName, const QString& printPath, QVector<QImage>& images)
|
|
|
|
{
|
|
QPrinter printer;
|
|
|
|
printer.setColorMode(QPrinter::ColorMode::Color);
|
|
printer.setOrientation(QPrinter::Orientation::Portrait);
|
|
printer.setPageSize(QPrinter::PageSize::A4);
|
|
QString fn = docName;
|
|
fn = fn.remove(QLatin1Char(' '));
|
|
fn = fn.remove(QLatin1String(".."));
|
|
fn = fn.remove(QLatin1Char('/'));
|
|
fn = printPath + fn;
|
|
if (!fn.endsWith(QLatin1String(".pdf"), Qt::CaseInsensitive))
|
|
fn += QLatin1String(".pdf");
|
|
#ifndef WIN32
|
|
printer.setOutputFileName(fn);
|
|
#endif
|
|
printer.setOutputFormat(QPrinter::NativeFormat);
|
|
|
|
QPrintDialog* dialog = new QPrintDialog(&printer, dialogParent);
|
|
dialog->setWindowTitle(QObject::tr("Print %1").arg(docName));
|
|
if (dialog->exec() != QDialog::Accepted)
|
|
return;
|
|
|
|
QPainter painter;
|
|
painter.begin(&printer);
|
|
int lastItem = images.size() - 1;
|
|
for (int i = 0; i < images.size(); ++i)
|
|
{
|
|
QRect rect = painter.viewport();
|
|
QSize size = images.at(i).size();
|
|
size.scale(rect.size(), Qt::KeepAspectRatio);
|
|
painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
|
|
painter.setWindow(images.at(i).rect());
|
|
painter.drawImage(0, 0, images.at(i));
|
|
if (i != lastItem)
|
|
printer.newPage();
|
|
}
|
|
painter.end();
|
|
}
|
|
|
|
void printReport(LtsSession::LtsSession* session, QWidget* dialogParent, KDReports::Report& report)
|
|
{
|
|
QTextDocument doc;
|
|
QTextCursor cursor(&doc);
|
|
|
|
doc.setMetaInformation(QTextDocument::DocumentTitle, dialogParent->windowTitle());
|
|
LtsPrinting::Base nglPrinter(doc, dialogParent, QObject::tr("Print %1").arg(dialogParent->windowTitle()),
|
|
dialogParent->windowTitle(), QPrinter::A3, QPrinter::Landscape);
|
|
if (!nglPrinter.printer())
|
|
return;
|
|
|
|
setNameOfExerciseAndOperator(session, nglPrinter);
|
|
|
|
cursor.movePosition(QTextCursor::End);
|
|
|
|
report.setWidthForEndlessPrinter(0);
|
|
report.setPageSize(QPrinter::A3);
|
|
report.setOrientation(QPrinter::Landscape);
|
|
|
|
LtsPrinting::Base::printReportData(doc, report);
|
|
nglPrinter.print(&doc);
|
|
}
|
|
|
|
void printWidget(LtsSession::LtsSession* session, QWidget* dialogParent, QWidget* widget, const QString& title)
|
|
{
|
|
QTextDocument doc;
|
|
QTextCursor cursor(&doc);
|
|
QImage image(widget->size(), QImage::Format_ARGB32);
|
|
widget->render(&image);
|
|
|
|
QString windowTitle = dialogParent->windowTitle();
|
|
doc.setMetaInformation(QTextDocument::DocumentTitle, dialogParent->windowTitle());
|
|
LtsPrinting::Base nglPrinter(doc, dialogParent, QObject::tr("Print %1").arg(windowTitle), windowTitle, QPrinter::A3,
|
|
QPrinter::Landscape);
|
|
if (!nglPrinter.printer())
|
|
return;
|
|
|
|
setNameOfExerciseAndOperator(session, nglPrinter);
|
|
|
|
cursor.movePosition(QTextCursor::End);
|
|
|
|
nglPrinter.printDocImage(doc, image, title);
|
|
nglPrinter.print(&doc);
|
|
}
|
|
|
|
void printMessage(LtsSession::LtsSession* session, QWidget* dialogParent, const QString& subject,
|
|
const QString& subjectContent, const QString& from, const QString& fromContent, const QString& to,
|
|
const QString& toContent, const QString& msgTextContent, const QString& time,
|
|
const QString& timeContent)
|
|
{
|
|
QTextDocument doc;
|
|
QString windowTitle = subject;
|
|
|
|
doc.setMetaInformation(QTextDocument::DocumentTitle, subject);
|
|
LtsPrinting::Base nglPrinter(doc, dialogParent, QObject::tr("Print %1").arg(windowTitle), windowTitle, QPrinter::A4,
|
|
QPrinter::Portrait);
|
|
|
|
QString str = QString(QStringLiteral("<H2><strong>%1</strong> %2 </H2>")).arg(subject).arg(subjectContent);
|
|
str.append(QString(QStringLiteral("<strong>%1</strong> %2<br>")).arg(time).arg(timeContent));
|
|
str.append(QString(QStringLiteral("<strong>%1</strong> %2<br>")).arg(from).arg(fromContent));
|
|
str.append(QString(QStringLiteral("<strong>%1</strong> %2<hr>")).arg(to).arg(toContent));
|
|
str.append(QString(QStringLiteral("%1")).arg(msgTextContent));
|
|
|
|
doc.setHtml(str);
|
|
if (!nglPrinter.printer())
|
|
return;
|
|
|
|
setNameOfExerciseAndOperator(session, nglPrinter);
|
|
|
|
nglPrinter.print(&doc);
|
|
}
|
|
|
|
void printStoryboard(LtsSession::LtsSession* session, QWidget* dialogParent, QAbstractItemView* view,
|
|
const QString& headingHtml)
|
|
{
|
|
QTableWidget* tbl = dynamic_cast<QTableWidget*>(view);
|
|
QTextDocument doc;
|
|
QTextCursor cursor(&doc);
|
|
|
|
QTextBlockFormat tbfFormat;
|
|
tbfFormat.setPageBreakPolicy(QTextFormat::PageBreakFlag::PageBreak_Auto);
|
|
|
|
QString windowTitle = dialogParent->windowTitle();
|
|
doc.setMetaInformation(QTextDocument::DocumentTitle, dialogParent->windowTitle());
|
|
|
|
LtsPrinting::Base nglPrinter(doc, dialogParent, QObject::tr("Print %1").arg(windowTitle), windowTitle, QPrinter::A4,
|
|
QPrinter::Portrait);
|
|
|
|
if (!nglPrinter.printer())
|
|
return;
|
|
|
|
const int rows = tbl->rowCount();
|
|
cursor.insertHtml(headingHtml);
|
|
|
|
double currentHeight = 0;
|
|
double previousPagesHeight = 0;
|
|
QString htmlStr;
|
|
for (int rowCounter = 0; rowCounter < rows; rowCounter++)
|
|
{
|
|
|
|
htmlStr.append(QStringLiteral("<table>"));
|
|
QTextEdit* labelForFirstCell = (QTextEdit*)tbl->cellWidget(rowCounter, 0);
|
|
QString stringFirstColumn = labelForFirstCell->toHtml();
|
|
|
|
QTextEdit* labelSecondColumn = (QTextEdit*)tbl->cellWidget(rowCounter, 1);
|
|
QString stringSecondColumn = labelSecondColumn->toHtml();
|
|
|
|
QTextEdit* labelThirdColumn = (QTextEdit*)tbl->cellWidget(rowCounter, 2);
|
|
QString stringThirdColumn = labelThirdColumn->toHtml();
|
|
|
|
for (int rowInCellCounter = 0; rowInCellCounter < stringSecondColumn.split(QStringLiteral("<br>")).size();
|
|
++rowInCellCounter)
|
|
{
|
|
htmlStr.append(QStringLiteral("<tr>"));
|
|
|
|
if (rowInCellCounter < stringFirstColumn.split(QStringLiteral("<br>")).size())
|
|
{
|
|
htmlStr.append(QStringLiteral("<td width = \"25%\">"));
|
|
htmlStr.append(stringFirstColumn.split(QStringLiteral("<br>"))[rowInCellCounter]);
|
|
htmlStr.append(QStringLiteral("</td>"));
|
|
}
|
|
else
|
|
{
|
|
htmlStr.append(QStringLiteral("<td width = \"25%\"> "));
|
|
htmlStr.append(QStringLiteral("</td>"));
|
|
}
|
|
QString currentTextSecond = stringSecondColumn.split(QStringLiteral("<br>"))[rowInCellCounter];
|
|
htmlStr.append(QStringLiteral("<td width = \"37%\">"));
|
|
htmlStr.append(currentTextSecond);
|
|
htmlStr.append(QStringLiteral("</td>"));
|
|
|
|
QString currentTextThird = stringThirdColumn.split(QStringLiteral("<br>"))[rowInCellCounter];
|
|
htmlStr.append(QStringLiteral("<td width = \"37%\">"));
|
|
htmlStr.append(currentTextThird);
|
|
htmlStr.append(QStringLiteral("</td>"));
|
|
htmlStr.append(QStringLiteral("</tr>"));
|
|
}
|
|
QTextDocument tempDoc;
|
|
tempDoc.setPageSize(doc.pageSize());
|
|
tempDoc.setHtml(htmlStr);
|
|
currentHeight = doc.size().height() - previousPagesHeight;
|
|
|
|
if (currentHeight + tempDoc.size().height() > nglPrinter.pageSizeInMM().height())
|
|
{
|
|
tbfFormat.setPageBreakPolicy(QTextFormat::PageBreakFlag::PageBreak_AlwaysBefore);
|
|
cursor.insertBlock(tbfFormat);
|
|
previousPagesHeight = doc.size().height();
|
|
currentHeight = doc.size().height() - previousPagesHeight;
|
|
}
|
|
else
|
|
{
|
|
tbfFormat.setPageBreakPolicy(QTextFormat::PageBreakFlag::PageBreak_Auto);
|
|
currentHeight = doc.size().height() - previousPagesHeight;
|
|
}
|
|
cursor.insertHtml(htmlStr);
|
|
htmlStr.clear();
|
|
}
|
|
htmlStr.append(QStringLiteral("</table>"));
|
|
cursor.insertHtml(htmlStr);
|
|
|
|
cursor.movePosition(QTextCursor::End);
|
|
|
|
setNameOfExerciseAndOperator(session, nglPrinter);
|
|
nglPrinter.print(&doc);
|
|
}
|
|
|
|
} // namespace LtsPrinting
|