[TD]prevent crash on attempt to print hidden page

This commit is contained in:
wandererfan
2024-11-19 17:58:08 -05:00
committed by WandererFan
parent 2e82c330d4
commit 8581cd01e2
4 changed files with 224 additions and 304 deletions

View File

@@ -119,14 +119,14 @@ MDIViewPage::MDIViewPage(ViewProviderPage* pageVp, Gui::Document* doc, QWidget*
connectDeletedObject = appDoc->signalDeletedObject.connect(bnd);
//NOLINTEND
m_pagePrinter = new PagePrinter(m_vpPage);
m_pagePrinter->setOwner(this);
// m_pagePrinter = new PagePrinter(m_vpPage);
// m_pagePrinter->setOwner(this);
}
MDIViewPage::~MDIViewPage()
{
connectDeletedObject.disconnect();
delete m_pagePrinter;
// delete m_pagePrinter;
}
void MDIViewPage::setScene(QGSPage* scene, QGVPage* viewWidget)
@@ -134,9 +134,9 @@ void MDIViewPage::setScene(QGSPage* scene, QGVPage* viewWidget)
m_scene = scene;
setCentralWidget(viewWidget);//this makes viewWidget a Qt child of MDIViewPage
QObject::connect(scene, &QGSPage::selectionChanged, this, &MDIViewPage::sceneSelectionChanged);
if (m_pagePrinter) {
m_pagePrinter->setScene(m_scene);
}
// if (m_pagePrinter) {
// m_pagePrinter->setScene(m_scene);
// }
}
void MDIViewPage::setDocumentObject(const std::string& name)
@@ -309,35 +309,6 @@ void MDIViewPage::fixSceneDependencies()
/// as file name selection and error messages
/// PagePrinter handles the actual printing mechanics.
/// save the page state so it can be restore after printing
void MDIViewPage::savePageExportState(ViewProviderPage* page)
{
auto guiDoc = page->getDocument();
if (!guiDoc) {
return;
}
m_docModStateBeforePrint = guiDoc->isModified();
}
/// ensure that the page reverts to its normal state after any changes made for printing.
void MDIViewPage::resetPageExportState(ViewProviderPage* page) const
{
auto pageFeature = page->getDrawPage();
if (!pageFeature) {
// how did this happen?
return;
}
auto guiDoc = page->getDocument();
if (!guiDoc) {
return;
}
auto scene = page->getQGSPage();
scene->setExportingPdf(false);
scene->setExportingSvg(false);
guiDoc->setModified(m_docModStateBeforePrint);
pageFeature->redrawCommand();
}
/// overrides of MDIView print methods so that they print the QGraphicsScene instead
/// of the COIN3d scenegraph.
@@ -354,72 +325,46 @@ void MDIViewPage::printPdf()
}
Gui::WaitCursor wc;
auto vpp = getViewProviderPage();
if (!vpp) {
// how did this happen?
return;
}
savePageExportState(vpp);
std::string utf8Content = fn.toUtf8().constData();
if (m_pagePrinter) {
m_pagePrinter->printPdf(utf8Content);
resetPageExportState(vpp);
}
PagePrinter::printPdf(getViewProviderPage(), utf8Content);
}
void MDIViewPage::print()
{
if (!m_pagePrinter) {
return;
}
auto vpp = getViewProviderPage();
if (!vpp) {
// how did this happen?
return;
}
savePageExportState(vpp);
m_pagePrinter->getPaperAttributes();
auto pageAttr = PagePrinter::getPaperAttributes(getViewProviderPage());
QPrinter printer(QPrinter::HighResolution);
printer.setFullPage(true);
if (m_pagePrinter->getPaperSize() == QPageSize::Custom) {
printer.setPageSize(QPageSize(QSizeF(m_pagePrinter->getPageWidth(), m_pagePrinter->getPageHeight()), QPageSize::Millimeter));
if (pageAttr.pageSize() == QPageSize::Custom) {
printer.setPageSize(
QPageSize(QSizeF(pageAttr.pageWidth(), pageAttr.pageHeight()), QPageSize::Millimeter));
}
else {
printer.setPageSize(QPageSize(m_pagePrinter->getPaperSize()));
printer.setPageSize(QPageSize(pageAttr.pageSize()));
}
printer.setPageOrientation(m_pagePrinter->getOrientation());
printer.setPageOrientation(pageAttr.orientation());
QPrintDialog dlg(&printer, this);
if (dlg.exec() == QDialog::Accepted) {
print(&printer);
resetPageExportState(vpp);
}
}
void MDIViewPage::printPreview()
{
// Base::Console().Message("MDIVP::printPreview()\n");
if (!m_pagePrinter) {
return;
}
m_pagePrinter->getPaperAttributes();
auto pageAttr = PagePrinter::getPaperAttributes(getViewProviderPage());
QPrinter printer(QPrinter::HighResolution);
printer.setFullPage(true);
if (m_pagePrinter->getPaperSize() == QPageSize::Custom) {
printer.setPageSize(QPageSize(QSizeF(m_pagePrinter->getPageWidth(), m_pagePrinter->getPageHeight()), QPageSize::Millimeter));
if (pageAttr.pageSize() == QPageSize::Custom) {
printer.setPageSize(
QPageSize(QSizeF(pageAttr.pageWidth(), pageAttr.pageHeight()), QPageSize::Millimeter));
}
else {
printer.setPageSize(QPageSize(m_pagePrinter->getPaperSize()));
printer.setPageSize(QPageSize(pageAttr.pageSize()));
}
printer.setPageOrientation(m_pagePrinter->getOrientation());
printer.setPageOrientation(pageAttr.orientation());
QPrintPreviewDialog dlg(&printer, this);
connect(&dlg, &QPrintPreviewDialog::paintRequested, this, qOverload<QPrinter*>(&MDIViewPage::print));
@@ -429,18 +374,6 @@ void MDIViewPage::printPreview()
void MDIViewPage::print(QPrinter* printer)
{
// Base::Console().Message("MDIVP::print(printer)\n");
if (!m_pagePrinter) {
return;
}
auto vpp = getViewProviderPage();
if (!vpp) {
// how did this happen?
return;
}
savePageExportState(vpp);
m_pagePrinter->getPaperAttributes();
// As size of the render area paperRect() should be used. When performing a real
// print pageRect() may also work but the output is cropped at the bottom part.
// So, independent whether pageRect() or paperRect() is used there is no scaling effect.
@@ -452,7 +385,9 @@ void MDIViewPage::print(QPrinter* printer)
//
// When showing the preview of a print paperRect() must be used because with pageRect()
// a certain scaling effect can be observed and the content becomes smaller.
QPaintEngine::Type paintType = printer->paintEngine()->type();
auto pageAttr = PagePrinter::getPaperAttributes(getViewProviderPage());
if (printer->outputFormat() == QPrinter::NativeFormat) {
QPageSize::PageSizeId psPrtSetting = printer->pageLayout().pageSize().id();
@@ -460,7 +395,7 @@ void MDIViewPage::print(QPrinter* printer)
// care if it uses wrong printer settings
bool doPrint = paintType != QPaintEngine::Picture;
if (doPrint && printer->pageLayout().orientation() != m_pagePrinter->getOrientation()) {
if (doPrint && printer->pageLayout().orientation() != pageAttr.orientation()) {
int ret = QMessageBox::warning(
this, tr("Different orientation"),
tr("The printer uses a different orientation than the drawing.\n"
@@ -470,7 +405,7 @@ void MDIViewPage::print(QPrinter* printer)
return;
}
}
if (doPrint && psPrtSetting != m_pagePrinter->getPaperSize()) {
if (doPrint && psPrtSetting != pageAttr.pageSize()) {
int ret = QMessageBox::warning(
this, tr("Different paper size"),
tr("The printer uses a different paper size than the drawing.\n"
@@ -482,17 +417,12 @@ void MDIViewPage::print(QPrinter* printer)
}
}
if (m_pagePrinter) {
m_pagePrinter->print(printer);
resetPageExportState(vpp);
}
PagePrinter::print(getViewProviderPage(), printer);
}
//static routine to print all pages in a document
void MDIViewPage::printAll(QPrinter* printer, App::Document* doc)
{
// Base::Console().Message("MDIVP::printAll()\n");
PagePrinter::printAll(printer, doc);
}
@@ -538,14 +468,9 @@ void MDIViewPage::saveSVG(std::string filename)
{
auto vpp = getViewProviderPage();
if (!vpp) {
// how did this happen?
return;
}
savePageExportState(vpp);
if (m_pagePrinter) {
m_pagePrinter->saveSVG(filename);
resetPageExportState(vpp);
}
PagePrinter::saveSVG(vpp, filename);
}
@@ -567,9 +492,7 @@ void MDIViewPage::saveSVG()
void MDIViewPage::saveDXF(std::string filename)
{
if (m_pagePrinter) {
m_pagePrinter->saveDXF(filename);
}
PagePrinter::saveDXF(getViewProviderPage(), filename);
}
void MDIViewPage::saveDXF()
@@ -590,14 +513,9 @@ void MDIViewPage::savePDF(std::string filename)
{
auto vpp = getViewProviderPage();
if (!vpp) {
// how did this happen?
return;
}
savePageExportState(vpp);
if (m_pagePrinter) {
m_pagePrinter->savePDF(filename);
resetPageExportState(vpp);
}
PagePrinter::savePDF(vpp, filename);
}
void MDIViewPage::savePDF()
@@ -614,7 +532,7 @@ void MDIViewPage::savePDF()
savePDF(sFileName);
}
/// a slot for printing all the pages
/// a slot for printing all the pages. just redirects to printAllPages
void MDIViewPage::printAll()
{
MDIViewPage::printAllPages();