From db4bd0d616a6bd4d252a944796fcb294f2167699 Mon Sep 17 00:00:00 2001 From: Ronan Le Tiec Date: Sun, 15 Nov 2020 22:34:24 +0100 Subject: [PATCH] Improve tiles decoration --- src/app/puzzle/share/resources/puzzleicon.qrc | 3 + .../puzzleicon/svg/icon_scissors.svg | 75 +++++++++ .../svg/icon_scissors_horizontal.svg | 77 +++++++++ .../puzzleicon/svg/icon_scissors_vertical.svg | 77 +++++++++ src/app/puzzle/vpmainwindow.cpp | 158 ++++++++++++++++-- 5 files changed, 379 insertions(+), 11 deletions(-) create mode 100644 src/app/puzzle/share/resources/puzzleicon/svg/icon_scissors.svg create mode 100644 src/app/puzzle/share/resources/puzzleicon/svg/icon_scissors_horizontal.svg create mode 100644 src/app/puzzle/share/resources/puzzleicon/svg/icon_scissors_vertical.svg diff --git a/src/app/puzzle/share/resources/puzzleicon.qrc b/src/app/puzzle/share/resources/puzzleicon.qrc index 50e94a444..12c2a72ee 100644 --- a/src/app/puzzle/share/resources/puzzleicon.qrc +++ b/src/app/puzzle/share/resources/puzzleicon.qrc @@ -11,5 +11,8 @@ puzzleicon/64x64/iconGrainlineHorizontal.png puzzleicon/64x64/cursorRotate.png puzzleicon/64x64/iconProperties.png + puzzleicon/svg/icon_scissors.svg + puzzleicon/svg/icon_scissors_vertical.svg + puzzleicon/svg/icon_scissors_horizontal.svg diff --git a/src/app/puzzle/share/resources/puzzleicon/svg/icon_scissors.svg b/src/app/puzzle/share/resources/puzzleicon/svg/icon_scissors.svg new file mode 100644 index 000000000..fd1bd78c7 --- /dev/null +++ b/src/app/puzzle/share/resources/puzzleicon/svg/icon_scissors.svg @@ -0,0 +1,75 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/src/app/puzzle/share/resources/puzzleicon/svg/icon_scissors_horizontal.svg b/src/app/puzzle/share/resources/puzzleicon/svg/icon_scissors_horizontal.svg new file mode 100644 index 000000000..03d29b139 --- /dev/null +++ b/src/app/puzzle/share/resources/puzzleicon/svg/icon_scissors_horizontal.svg @@ -0,0 +1,77 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/src/app/puzzle/share/resources/puzzleicon/svg/icon_scissors_vertical.svg b/src/app/puzzle/share/resources/puzzleicon/svg/icon_scissors_vertical.svg new file mode 100644 index 000000000..c88794863 --- /dev/null +++ b/src/app/puzzle/share/resources/puzzleicon/svg/icon_scissors_vertical.svg @@ -0,0 +1,77 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/src/app/puzzle/vpmainwindow.cpp b/src/app/puzzle/vpmainwindow.cpp index 14f621bc3..6efa30b7e 100644 --- a/src/app/puzzle/vpmainwindow.cpp +++ b/src/app/puzzle/vpmainwindow.cpp @@ -713,7 +713,6 @@ void VPMainWindow::generateTiledPdf(QString fileName) QSizeF tilesSize = m_layout->GetTilesSize(); QMarginsF tilesMargins = m_layout->GetTilesMargins(); - // ------------- Set up the printer QPrinter* printer = new QPrinter(); @@ -739,8 +738,7 @@ void VPMainWindow::generateTiledPdf(QString fileName) printer->setOutputFileName(fileName); printer->setResolution(static_cast(PrintDPI)); - - printer->setDocName("Test"); + printer->setDocName("Test"); // FIXME // ------------- Set up the painter @@ -752,8 +750,10 @@ void VPMainWindow::generateTiledPdf(QString fileName) } 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 ) ); + QPen penTileInfos = QPen(QColor(180,180,180), qApp->Settings()->WidthHairLine(), Qt::DashLine, Qt::RoundCap, Qt::RoundJoin); + QPen penTileDrawing = QPen(Qt::black, qApp->Settings()->WidthMainLine(), Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); + if(tilesOrientation == PageOrientation::Landscape) { @@ -797,12 +797,67 @@ void VPMainWindow::generateTiledPdf(QString fileName) int nbCol = qCeil(drawingWidth/tilesDrawingAreaWidth); int nbRow = qCeil(drawingHeight/tilesDrawingAreaHeight); + + // ------------- prepare triangles for positioning + // top triangle + QRectF rectTop = QRectF(tilesMargins.left()+ tilesDrawingAreaWidth/2 - UnitConvertor(0.5, Unit::Cm, Unit::Px), + tilesMargins.top(), + UnitConvertor(1, Unit::Cm, Unit::Px), + UnitConvertor(0.5, Unit::Cm, Unit::Px) + ); + QPainterPath triangleTop; + triangleTop.moveTo(rectTop.topLeft()); + triangleTop.lineTo(rectTop.topRight()); + triangleTop.lineTo(rectTop.left() + (rectTop.width() / 2), rectTop.bottom()); + triangleTop.lineTo(rectTop.topLeft()); + + // left triangle + QRectF rectLeft = QRectF(tilesMargins.left(), + tilesMargins.top() + tilesDrawingAreaHeight/2 - UnitConvertor(0.5, Unit::Cm, Unit::Px), + UnitConvertor(0.5, Unit::Cm, Unit::Px), + UnitConvertor(1, Unit::Cm, Unit::Px) + ); + QPainterPath triangleLeft; + triangleLeft.moveTo(rectLeft.topLeft()); + triangleLeft.lineTo(rectLeft.right(), rectLeft.top() + (rectLeft.height() / 2)); + triangleLeft.lineTo(rectLeft.bottomLeft()); + triangleLeft.lineTo(rectLeft.topLeft()); + + // bottom triangle + QRectF rectBottom = QRectF(tilesMargins.left()+ tilesDrawingAreaWidth/2 - UnitConvertor(0.5, Unit::Cm, Unit::Px), + tilesMargins.top()+tilesDrawingAreaHeight - UnitConvertor(0.5, Unit::Cm, Unit::Px), + UnitConvertor(1, Unit::Cm, Unit::Px), + UnitConvertor(0.5, Unit::Cm, Unit::Px) + ); + QPainterPath triangleBottom; + triangleBottom.moveTo(rectBottom.bottomLeft()); + triangleBottom.lineTo(rectBottom.left() + (rectBottom.width() / 2), rectBottom.top()); + triangleBottom.lineTo(rectBottom.bottomRight()); + triangleBottom.lineTo(rectBottom.bottomLeft()); + + // right triangle + QRectF rectRight = QRectF(tilesMargins.left() + tilesDrawingAreaWidth - UnitConvertor(0.5, Unit::Cm, Unit::Px), + tilesMargins.top() + tilesDrawingAreaHeight/2 - UnitConvertor(0.5, Unit::Cm, Unit::Px), + UnitConvertor(0.5, Unit::Cm, Unit::Px), + UnitConvertor(1, Unit::Cm, Unit::Px) + ); + QPainterPath triangleRight; + triangleRight.moveTo(rectRight.topRight()); + triangleRight.lineTo(rectRight.bottomRight()); + triangleRight.lineTo(rectRight.left(), rectRight.top() + (rectRight.height() / 2)); + triangleRight.lineTo(rectRight.topRight()); + + QBrush triangleBush = QBrush(QColor(200,200,200)); + + // ------------- Perform the tiling - for(int i=0;inewPage()) { @@ -811,12 +866,93 @@ void VPMainWindow::generateTiledPdf(QString fileName) } } - QRectF source = QRectF(j*tilesDrawingAreaWidth, i*tilesDrawingAreaHeight, tilesDrawingAreaWidth, tilesDrawingAreaHeight); - QRectF target = QRectF(m_layout->GetTilesMargins().left(), m_layout->GetTilesMargins().top(), - source.width(), source.height()); + // add the tiles decorations (cutting and gluing lines, scissors, infos etc.) + penTileInfos.setStyle(Qt::DashLine); + painter.setPen(penTileInfos); - // TODO: add the lines etc + if(row > 0) + { + // add top triangle + painter.fillPath(triangleTop, triangleBush); + // scissors along the top line + svgRenderer->load(QStringLiteral("://puzzleicon/svg/icon_scissors_horizontal.svg")); + svgRenderer->render(&painter, QRectF(tilesMargins.left()+tilesDrawingAreaWidth, + tilesMargins.top(), + UnitConvertor(1, Unit::Cm, Unit::Px), + UnitConvertor(0.56, Unit::Cm, Unit::Px) + )); + + // top line + painter.drawLine(QPointF(tilesMargins.left(), + tilesMargins.top()), + QPointF(tilesMargins.left() + tilesDrawingAreaWidth + UnitConvertor(1, Unit::Cm, Unit::Px), + tilesMargins.top()) + ); + } + if(col > 0) + { + // add left triangle + painter.fillPath(triangleLeft, triangleBush); + + // scissors along the left line + svgRenderer->load(QStringLiteral("://puzzleicon/svg/icon_scissors_vertical.svg")); + svgRenderer->render(&painter, QRectF(tilesMargins.left(), + tilesMargins.top()+tilesDrawingAreaHeight, + UnitConvertor(0.56, Unit::Cm, Unit::Px), + UnitConvertor(1, Unit::Cm, Unit::Px) + )); + + // left line + painter.drawLine(QPointF(tilesMargins.left(), + tilesMargins.top()), + QPointF(tilesMargins.left(), + tilesMargins.top() + tilesDrawingAreaHeight + UnitConvertor(1, Unit::Cm, Unit::Px)) + ); + } + + penTileInfos.setStyle(Qt::DotLine); + painter.setPen(penTileInfos); + + if(row < nbRow-1) + { + // add bottom triangle + painter.fillPath(triangleBottom, triangleBush); + + // bottom line + painter.drawLine(QPointF(tilesMargins.left(), + tilesMargins.top() + tilesDrawingAreaHeight), + QPointF(tilesMargins.left() + tilesDrawingAreaWidth + UnitConvertor(1, Unit::Cm, Unit::Px), + tilesMargins.top() + tilesDrawingAreaHeight) + ); + } + + if(col < nbCol-1) + { + // add right triangle + painter.fillPath(triangleRight, triangleBush); + + // right line + painter.drawLine(QPointF(tilesMargins.left() + tilesDrawingAreaWidth, + tilesMargins.top()), + QPointF(tilesMargins.left() + tilesDrawingAreaWidth, + tilesMargins.top()+ tilesDrawingAreaHeight + UnitConvertor(1, Unit::Cm, Unit::Px)) + ); + } + + // paint the page + QRectF source = QRectF(col*tilesDrawingAreaWidth, + row*tilesDrawingAreaHeight, + tilesDrawingAreaWidth + UnitConvertor(1, Unit::Cm, Unit::Px), + tilesDrawingAreaHeight + UnitConvertor(1, Unit::Cm, Unit::Px) + ); + QRectF target = QRectF(tilesMargins.left(), + tilesMargins.top(), + source.width(), + source.height() + ); + + painter.setPen(penTileDrawing); m_graphicsView->GetScene()->render(&painter, target, source, Qt::IgnoreAspectRatio); } }