All tiles exported
This commit is contained in:
parent
f90f8ca01b
commit
cbf0651486
|
@ -702,6 +702,132 @@ bool VPMainWindow::MaybeSave()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VPMainWindow::generateTiledPdf(QString fileName)
|
||||||
|
{
|
||||||
|
if(not fileName.isEmpty())
|
||||||
|
{
|
||||||
|
m_graphicsView->PrepareForExport();
|
||||||
|
|
||||||
|
PageOrientation tilesOrientation = m_layout->GetTilesOrientation();
|
||||||
|
QSizeF tilesSize = m_layout->GetTilesSize();
|
||||||
|
QMarginsF tilesMargins = m_layout->GetTilesMargins();
|
||||||
|
|
||||||
|
|
||||||
|
// ------------- Set up the printer
|
||||||
|
QPrinter* printer = new QPrinter();
|
||||||
|
|
||||||
|
printer->setCreator(QGuiApplication::applicationDisplayName()+QChar(QChar::Space)+
|
||||||
|
QCoreApplication::applicationVersion());
|
||||||
|
printer->setOrientation(QPrinter::Portrait); // in the pdf file the pages should always be in portrait
|
||||||
|
|
||||||
|
// here we might need to so some rounding for the size.
|
||||||
|
printer->setPageSize(QPageSize(m_layout->GetTilesSize(Unit::Mm),
|
||||||
|
QPageSize::Millimeter));
|
||||||
|
printer->setFullPage(true);
|
||||||
|
const bool success = printer->setPageMargins(m_layout->GetTilesMargins(Unit::Mm), QPageLayout::Millimeter);
|
||||||
|
if (not success)
|
||||||
|
{
|
||||||
|
qWarning() << tr("Cannot set printer margins");
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef Q_OS_MAC
|
||||||
|
printer->setOutputFormat(QPrinter::NativeFormat);
|
||||||
|
#else
|
||||||
|
printer->setOutputFormat(QPrinter::PdfFormat);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
printer->setOutputFileName(fileName);
|
||||||
|
printer->setResolution(static_cast<int>(PrintDPI));
|
||||||
|
|
||||||
|
printer->setDocName("Test");
|
||||||
|
|
||||||
|
|
||||||
|
// ------------- Set up the painter
|
||||||
|
QPainter painter;
|
||||||
|
if (not painter.begin(printer))
|
||||||
|
{ // failed to open file
|
||||||
|
qCritical() << tr("Failed to open file, is it writable?");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
painter.setFont( QFont( QStringLiteral("Arial"), 8, QFont::Normal ) );
|
||||||
|
painter.setRenderHint(QPainter::Antialiasing, true);
|
||||||
|
painter.setPen(QPen(Qt::black, qApp->Settings()->WidthMainLine(), Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
|
||||||
|
painter.setBrush ( QBrush ( Qt::NoBrush ) );
|
||||||
|
|
||||||
|
if(tilesOrientation == PageOrientation::Landscape)
|
||||||
|
{
|
||||||
|
// The landscape tiles have to be rotated, because the pages
|
||||||
|
// stay portrait in the pdf
|
||||||
|
painter.rotate(90);
|
||||||
|
painter.translate(0, -ToPixel(printer->pageRect(QPrinter::Millimeter).width(), Unit::Mm));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ------------- Prepare infos for the tiling
|
||||||
|
qreal tilesDrawingAreaHeight = (tilesOrientation == PageOrientation::Portrait)?
|
||||||
|
tilesSize.height() : tilesSize.width();
|
||||||
|
tilesDrawingAreaHeight -=
|
||||||
|
tilesMargins.top() + tilesMargins.bottom() + UnitConvertor(1, Unit::Cm, Unit::Px);
|
||||||
|
|
||||||
|
// the -1cm is for test purpuses, it correspondings to the overlaping for gluing the parts,
|
||||||
|
// later we'll have a proper abstract value
|
||||||
|
|
||||||
|
qreal tilesDrawingAreaWidth = (tilesOrientation == PageOrientation::Portrait)?
|
||||||
|
tilesSize.width() : tilesSize.height();
|
||||||
|
tilesDrawingAreaWidth -=
|
||||||
|
tilesMargins.left() + tilesMargins.right() + UnitConvertor(1, Unit::Cm, Unit::Px);
|
||||||
|
|
||||||
|
|
||||||
|
QSizeF sheetSize = m_layout->GetFocusedSheet()->GetSheetSize();
|
||||||
|
qreal drawingWidth = 0;
|
||||||
|
qreal drawingHeight = 0;
|
||||||
|
|
||||||
|
if(m_layout->GetFocusedSheet()->GetOrientation() == PageOrientation::Portrait)
|
||||||
|
{
|
||||||
|
drawingWidth = sheetSize.width();
|
||||||
|
drawingHeight = sheetSize.height();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
drawingWidth = sheetSize.height();
|
||||||
|
drawingHeight = sheetSize.width();
|
||||||
|
}
|
||||||
|
|
||||||
|
int nbCol = qCeil(drawingWidth/tilesDrawingAreaWidth);
|
||||||
|
int nbRow = qCeil(drawingHeight/tilesDrawingAreaHeight);
|
||||||
|
|
||||||
|
// ------------- Perform the tiling
|
||||||
|
for(int i=0;i<nbRow;i++) // for each row of the tiling grid
|
||||||
|
{
|
||||||
|
for(int j=0;j<nbCol;j++) // for each column of tiling grid
|
||||||
|
{
|
||||||
|
if(not (i == 0 && j == 0))
|
||||||
|
{
|
||||||
|
if (not printer->newPage())
|
||||||
|
{
|
||||||
|
qWarning("failed in flushing page to disk, disk full?");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF source = QRectF(j*tilesDrawingAreaWidth, i*tilesDrawingAreaHeight, tilesDrawingAreaWidth, tilesDrawingAreaHeight);
|
||||||
|
QRectF target = QRectF(m_layout->GetTilesMargins().left(), m_layout->GetTilesMargins().top(),
|
||||||
|
source.width(), source.height());
|
||||||
|
|
||||||
|
// TODO: add the lines etc
|
||||||
|
|
||||||
|
m_graphicsView->GetScene()->render(&painter, target, source, Qt::IgnoreAspectRatio);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
painter.end();
|
||||||
|
|
||||||
|
m_graphicsView->CleanAfterExport();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void VPMainWindow::on_actionNew_triggered()
|
void VPMainWindow::on_actionNew_triggered()
|
||||||
{
|
{
|
||||||
|
@ -811,7 +937,8 @@ void VPMainWindow::on_actionSave_triggered()
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
void VPMainWindow::on_actionSaveAs_triggered()
|
void VPMainWindow::on_actionSaveAs_triggered()
|
||||||
{
|
{
|
||||||
// TODO / FIXME : See valentina how the save is done over there. we need to add the extension .vlt, check for empty file names etc.
|
// TODO / FIXME : See valentina how the save is done over there. we need to add the
|
||||||
|
// extension .vlt, check for empty file names etc.
|
||||||
|
|
||||||
//Get list last open files
|
//Get list last open files
|
||||||
QStringList recentFiles = qApp->PuzzleSettings()->GetRecentFileList();
|
QStringList recentFiles = qApp->PuzzleSettings()->GetRecentFileList();
|
||||||
|
@ -1060,101 +1187,7 @@ void VPMainWindow::on_pushButtonTilesExport_clicked()
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
|
||||||
if(not fileName.isEmpty())
|
generateTiledPdf(fileName);
|
||||||
{
|
|
||||||
// tests for now, later we want this in a separated function
|
|
||||||
|
|
||||||
m_graphicsView->PrepareForExport();
|
|
||||||
|
|
||||||
PageOrientation tilesOrientation = m_layout->GetTilesOrientation();
|
|
||||||
QSizeF tilesSize = m_layout->GetTilesSize();
|
|
||||||
QMarginsF tilesMargins = m_layout->GetTilesMargins();
|
|
||||||
|
|
||||||
|
|
||||||
// ------------- Set up the printer
|
|
||||||
QPrinter* printer = new QPrinter();
|
|
||||||
|
|
||||||
printer->setCreator(QGuiApplication::applicationDisplayName()+QChar(QChar::Space)+
|
|
||||||
QCoreApplication::applicationVersion());
|
|
||||||
printer->setOrientation(QPrinter::Portrait); // in the pdf file the pages should always be in portrait
|
|
||||||
|
|
||||||
// here we might need to so some rounding for the size.
|
|
||||||
printer->setPageSize(QPageSize(m_layout->GetTilesSize(Unit::Mm),
|
|
||||||
QPageSize::Millimeter));
|
|
||||||
printer->setFullPage(true);
|
|
||||||
const bool success = printer->setPageMargins(m_layout->GetTilesMargins(Unit::Mm), QPageLayout::Millimeter);
|
|
||||||
if (not success)
|
|
||||||
{
|
|
||||||
qWarning() << tr("Cannot set printer margins");
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef Q_OS_MAC
|
|
||||||
printer->setOutputFormat(QPrinter::NativeFormat);
|
|
||||||
#else
|
|
||||||
printer->setOutputFormat(QPrinter::PdfFormat);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
printer->setOutputFileName(fileName);
|
|
||||||
printer->setResolution(static_cast<int>(PrintDPI));
|
|
||||||
|
|
||||||
printer->setDocName("Test");
|
|
||||||
|
|
||||||
|
|
||||||
// ------------- Set up the painter
|
|
||||||
QPainter painter;
|
|
||||||
if (not painter.begin(printer))
|
|
||||||
{ // failed to open file
|
|
||||||
qCritical() << tr("Failed to open file, is it writable?");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
painter.setFont( QFont( QStringLiteral("Arial"), 8, QFont::Normal ) );
|
|
||||||
painter.setRenderHint(QPainter::Antialiasing, true);
|
|
||||||
painter.setPen(QPen(Qt::black, qApp->Settings()->WidthMainLine(), Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
|
|
||||||
painter.setBrush ( QBrush ( Qt::NoBrush ) );
|
|
||||||
|
|
||||||
if(tilesOrientation == PageOrientation::Landscape)
|
|
||||||
{
|
|
||||||
// The landscape tiles have to be rotated, because the pages
|
|
||||||
// stay portrait in the pdf
|
|
||||||
painter.rotate(90);
|
|
||||||
painter.translate(0, -ToPixel(printer->pageRect(QPrinter::Millimeter).width(), Unit::Mm));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ------------- Perform the Tiling
|
|
||||||
qreal tilesDrawingAreaHeight = (tilesOrientation == PageOrientation::Portrait)?
|
|
||||||
tilesSize.height() : tilesSize.width();
|
|
||||||
tilesDrawingAreaHeight -=
|
|
||||||
tilesMargins.top() + tilesMargins.bottom() + UnitConvertor(1, Unit::Cm, Unit::Px);
|
|
||||||
|
|
||||||
// the -1cm is for test purpuses, it correspondings to the overlaping for gluing the parts,
|
|
||||||
// later we'll have a proper abstract value
|
|
||||||
|
|
||||||
qreal tilesDrawingAreaWidth = (tilesOrientation == PageOrientation::Portrait)?
|
|
||||||
tilesSize.width() : tilesSize.height();
|
|
||||||
tilesDrawingAreaWidth -=
|
|
||||||
tilesMargins.left() + tilesMargins.right() + UnitConvertor(1, Unit::Cm, Unit::Px);
|
|
||||||
|
|
||||||
|
|
||||||
QRectF source = QRectF(0,0,tilesDrawingAreaWidth, tilesDrawingAreaHeight);
|
|
||||||
|
|
||||||
QRectF target = QRectF(m_layout->GetTilesMargins().left(), m_layout->GetTilesMargins().top(),
|
|
||||||
source.width(), source.height());
|
|
||||||
m_graphicsView->GetScene()->render(&painter, target, source, Qt::IgnoreAspectRatio);
|
|
||||||
|
|
||||||
if (not printer->newPage())
|
|
||||||
{
|
|
||||||
qWarning("failed in flushing page to disk, disk full?");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
source = QRectF(tilesDrawingAreaWidth,0,tilesDrawingAreaWidth, tilesDrawingAreaHeight);
|
|
||||||
m_graphicsView->GetScene()->render(&painter, target, source, Qt::IgnoreAspectRatio);
|
|
||||||
|
|
||||||
painter.end();
|
|
||||||
|
|
||||||
m_graphicsView->CleanAfterExport();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -217,6 +217,12 @@ private:
|
||||||
|
|
||||||
bool MaybeSave();
|
bool MaybeSave();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief generateTiledPdf Generates the tiled Pdf in the given filename
|
||||||
|
* @param filename
|
||||||
|
*/
|
||||||
|
void generateTiledPdf(QString fileName);
|
||||||
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue
Block a user