aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/desktop-utils/lumina-pdf/PrintWidget.cpp
diff options
context:
space:
mode:
authorKen Moore <ken@ixsystems.com>2018-03-20 13:26:15 -0400
committerKen Moore <ken@ixsystems.com>2018-03-20 13:26:15 -0400
commite8a1a0cd0fd113960d8199799e7c8b2e5194e9eb (patch)
tree02ca053195c87f97bfb1c2903d31d4f762e63ffd /src-qt5/desktop-utils/lumina-pdf/PrintWidget.cpp
parentQuick checkpoint on the new NativeWindow class (Widgets). (diff)
parentDisabled Properties, Find, and Bookmarks for Poppler but enabled by default f... (diff)
downloadlumina-e8a1a0cd0fd113960d8199799e7c8b2e5194e9eb.tar.gz
lumina-e8a1a0cd0fd113960d8199799e7c8b2e5194e9eb.tar.bz2
lumina-e8a1a0cd0fd113960d8199799e7c8b2e5194e9eb.zip
Merge branch 'master' of github.com:trueos/lumina
Diffstat (limited to 'src-qt5/desktop-utils/lumina-pdf/PrintWidget.cpp')
-rw-r--r--src-qt5/desktop-utils/lumina-pdf/PrintWidget.cpp391
1 files changed, 190 insertions, 201 deletions
diff --git a/src-qt5/desktop-utils/lumina-pdf/PrintWidget.cpp b/src-qt5/desktop-utils/lumina-pdf/PrintWidget.cpp
index 5c7fa1dd..7c0fd323 100644
--- a/src-qt5/desktop-utils/lumina-pdf/PrintWidget.cpp
+++ b/src-qt5/desktop-utils/lumina-pdf/PrintWidget.cpp
@@ -1,7 +1,8 @@
#include "PrintWidget.h"
-PrintWidget::PrintWidget(QWidget *parent) : QGraphicsView(parent), scene(0), curPage(1),
- viewMode(SinglePageView), zoomMode(FitInView), zoomFactor(1), initialized(false), fitting(true) {
+PrintWidget::PrintWidget(Renderer *backend, QWidget *parent) :
+ QGraphicsView(parent), scene(0), curPage(1), viewMode(SinglePageView),
+ zoomMode(FitInView), zoomFactor(1), initialized(false), fitting(true), BACKEND(backend) {
this->setMouseTracking(true);
QList<QWidget*> children = this->findChildren<QWidget*>("",Qt::FindChildrenRecursively);
@@ -9,24 +10,22 @@ PrintWidget::PrintWidget(QWidget *parent) : QGraphicsView(parent), scene(0), cur
children[i]->setContextMenuPolicy(Qt::CustomContextMenu);
connect(children[i], SIGNAL(customContextMenuRequested(const QPoint&)), this, SIGNAL(customContextMenuRequested(const QPoint&)) );
}
- this->setInteractive(false);
- this->setDragMode(QGraphicsView::ScrollHandDrag);
- this->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
+ this->setInteractive(false);
+ this->setDragMode(QGraphicsView::ScrollHandDrag);
+ this->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
this->setFocusPolicy(Qt::NoFocus);
- QObject::connect(this->verticalScrollBar(), SIGNAL(valueChanged(int)),
- this, SLOT(updateCurrentPage()));
- QObject::connect(this, SIGNAL(resized()), this, SLOT(fit()));
-
- scene = new QGraphicsScene(this);
- scene->setBackgroundBrush(Qt::gray);
- this->setScene(scene);
- this->degrees = 0;
- this->rotMatrix = QMatrix(1, 0, 0, 1, 0 ,0);
-
- /*QVBoxLayout *layout = new QVBoxLayout;
- setLayout(layout);
- layout->setContentsMargins(0, 0, 0, 0);
- layout->addWidget(this);*/
+ QObject::connect(this->verticalScrollBar(), SIGNAL(valueChanged(int)),
+ this, SLOT(updateCurrentPage()));
+ QObject::connect(this, SIGNAL(resized()), this, SLOT(fit()));
+
+ scene = new QGraphicsScene(this);
+ scene->setBackgroundBrush(Qt::gray);
+ this->setScene(scene);
+
+ /*QVBoxLayout *layout = new QVBoxLayout;
+ setLayout(layout);
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->addWidget(this);*/
}
PrintWidget::~PrintWidget() {
@@ -48,8 +47,8 @@ void PrintWidget::fitToWidth() {
void PrintWidget::setZoomMode(ZoomMode mode) {
zoomMode = mode;
- fitting = true;
- fit(true);
+ fitting = true;
+ fit(true);
}
void PrintWidget::setAllPagesViewMode() {
@@ -65,31 +64,31 @@ void PrintWidget::setFacingPagesViewMode() {
}
void PrintWidget::setViewMode(ViewMode mode) {
- viewMode = mode;
- layoutPages();
- if (viewMode == AllPagesView) {
- this->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
- fitting = false;
- zoomMode = CustomZoom;
- //zoomFactor = this->transform().m11() * (double(printer->logicalDpiY()) / logicalDpiY());
- } else {
- fitting = true;
- fit();
- }
+ viewMode = mode;
+ layoutPages();
+ if (viewMode == AllPagesView) {
+ this->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
+ fitting = false;
+ zoomMode = CustomZoom;
+ //zoomFactor = this->transform().m11() * (double(printer->logicalDpiY()) / logicalDpiY());
+ } else {
+ fitting = true;
+ fit();
+ }
}
void PrintWidget::zoomIn(double factor) {
- fitting = false;
- zoomMode = CustomZoom;
- zoomFactor *= factor;
- this->scale(factor, factor);
+ fitting = false;
+ zoomMode = CustomZoom;
+ zoomFactor *= factor;
+ this->scale(factor, factor);
}
void PrintWidget::zoomOut(double factor) {
- fitting = false;
- zoomMode = CustomZoom;
- zoomFactor *= factor;
- this->scale(1/factor, 1/factor);
+ fitting = false;
+ zoomMode = CustomZoom;
+ zoomFactor *= factor;
+ this->scale(1/factor, 1/factor);
}
void PrintWidget::updatePreview() {
@@ -99,43 +98,63 @@ void PrintWidget::updatePreview() {
}
void PrintWidget::setVisible(bool visible) {
- if(visible and !initialized)
- updatePreview();
- QGraphicsView::setVisible(visible);
+ if(visible and !initialized)
+ updatePreview();
+ QGraphicsView::setVisible(visible);
}
void PrintWidget::setCurrentPage(int pageNumber) {
- if(pageNumber < 0 || pageNumber > (pages.count()+1) ){ return; }
- publicPageNum = pageNumber; //publicly requested page number (+/- 1 from actual page range)
- emit currentPageChanged();
- if(pageNumber < 1 || pageNumber > pages.count())
- return;
- int lastPage = curPage;
- curPage = pageNumber;
-
- if (lastPage != curPage && lastPage > 0 && lastPage <= pages.count()) {
- if (zoomMode != FitInView) {
- QScrollBar *hsc = this->horizontalScrollBar();
- QScrollBar *vsc = this->verticalScrollBar();
- QPointF pt = this->transform().map(pages.at(curPage-1)->pos());
- vsc->setValue(int(pt.y()) - 10);
- hsc->setValue(int(pt.x()) - 10);
- } else {
- this->centerOn(pages.at(curPage-1));
- }
- }
+ if(pageNumber < 0 || pageNumber > (pages.count()+1) ){ return; }
+ publicPageNum = pageNumber; //publicly requested page number (+/- 1 from actual page range)
+ emit currentPageChanged();
+ if(pageNumber < 1 || pageNumber > pages.count())
+ return;
+ int lastPage = curPage;
+ curPage = pageNumber;
+
+ if (lastPage != curPage && lastPage > 0 && lastPage <= pages.count()) {
+ if (zoomMode != FitInView) {
+ QScrollBar *hsc = this->horizontalScrollBar();
+ QScrollBar *vsc = this->verticalScrollBar();
+ QPointF pt = this->transform().map(pages.at(curPage-1)->pos());
+ vsc->setValue(int(pt.y()) - 10);
+ hsc->setValue(int(pt.x()) - 10);
+ } else {
+ this->centerOn(pages.at(curPage-1));
+ }
+ }
}
void PrintWidget::highlightText(TextData *text) {
//Creates a rectangle around the text if the text has not already been highlighted
if(!text->highlighted()) {
- //qDebug() << "Highlighting text: " << text->text() << "At page: " << text->page();
- QRect rect = text->loc();
- double pageHeight = pages.at(0)->boundingRect().height();
- QRectF textRect = rect.adjusted(0, pageHeight*(text->page()-1), 0, 0); //move the rectangle onto the right page
- QBrush highlightFill(QColor(255, 255, 177, 50));
- QPen highlightOutline(QColor(255, 255, 100, 98));
- scene->addRect(textRect, highlightOutline, highlightFill);
+ double pageHeight = pages.at(text->page()-1)->boundingRect().height();
+ int degrees = BACKEND->rotatedDegrees();
+ //Shows the text's location on a non-rotated page
+ QRectF rect = text->loc();
+ //Rotates the rectangle by the page's center and gets the right calculation for text's new location
+ if(degrees != 0) {
+ QSize center = BACKEND->imageHash(text->page()-1).size()/2;
+
+ if(degrees == 90 or degrees == 270)
+ center.transpose();
+
+ double cx = center.width(), cy = center.height();
+ rect.adjust(-cx, -cy, -cx, -cy);
+ QMatrix matrix;
+ matrix.rotate(BACKEND->rotatedDegrees());
+ rect = matrix.mapRect(rect);
+ if(BACKEND->rotatedDegrees() == 180)
+ rect.adjust(cx, cy, cx, cy);
+ else
+ rect.adjust(cy, cx, cy, cx);
+ }
+ //Moves the rectangle onto the right page
+ rect.moveTop(rect.y() + pageHeight*(text->page()-1));
+ //Transparent yellow for the highlight box
+ QBrush highlightFill(QColor(255, 255, 177, 100));
+ QPen highlightOutline(QColor(255, 255, 100, 125));
+ scene->addRect(rect, highlightOutline, highlightFill);
text->highlighted(true);
}
}
@@ -143,23 +162,25 @@ void PrintWidget::highlightText(TextData *text) {
//Private functions
void PrintWidget::generatePreview() {
- populateScene(); // i.e. setPreviewPrintedPictures() e.l.
- layoutPages();
- curPage = qBound(1, curPage, pages.count());
- publicPageNum = curPage;
- emit currentPageChanged();
- if (fitting){ fit(); }
+ qDebug() << "Generating Preview";
+ populateScene(); // i.e. setPreviewPrintedPictures() e.l.
+ layoutPages();
+ curPage = qBound(1, curPage, pages.count());
+ publicPageNum = curPage;
+ emit currentPageChanged();
+ if (fitting){ fit(); }
}
void PrintWidget::layoutPages() {
- int numPages = pages.count();
- if (numPages < 1)
- return;
-
- int numPagePlaces = numPages;
- int cols = 1; // singleMode and default
- if (viewMode == AllPagesView) {
- cols = ((pictures->value(0)).width() > (pictures->value(0)).height()) ? qFloor(qSqrt(numPages)) : qCeil(qSqrt(numPages));
+ int numPages = pages.count();
+ if (numPages < 1)
+ return;
+
+ int numPagePlaces = numPages;
+ int cols = 1; // singleMode and default
+ QSize pageSize = BACKEND->imageHash(0).size();
+ if (viewMode == AllPagesView) {
+ cols = pageSize.width() > pageSize.height() ? qFloor(qSqrt(numPages)) : qCeil(qSqrt(numPages));
cols += cols % 2; // Nicer with an even number of cols
} else if (viewMode == FacingPagesView) {
cols = 2;
@@ -177,152 +198,120 @@ void PrintWidget::layoutPages() {
pages.at(pageNum-1)->setPos(QPointF(j*itemWidth, i*itemHeight));
pageNum++;
}
- }
- }
- scene->setSceneRect(scene->itemsBoundingRect());
+ }
+ }
+ scene->setSceneRect(scene->itemsBoundingRect());
+ qDebug() << "Finished Page Layout";
}
void PrintWidget::populateScene()
{
for (int i = 0; i < pages.size(); i++){
- scene->removeItem(pages.at(i));
+ scene->removeItem(pages.at(i));
}
qDeleteAll(pages);
pages.clear();
- //qDebug() << "populateScene";
- if(pictures==0){ return; } //nothing to show yet
- int numPages = pictures->count();
+ qDebug() << "populateScene";
+ int numPages = BACKEND->numPages();
+ if(BACKEND->hashSize() < numPages){ return; } //nothing to show yet
for (int i = 0; i < numPages; i++) {
- QImage pagePicture = pictures->value(i);
-
- QSize paperSize = pictures->value(i).size();
+ QImage pagePicture = BACKEND->imageHash(i);
- //Changes the paper orientation if rotated by 90 or 270 degrees
- if(degrees == 90 or degrees == 270)
- paperSize.transpose();
+ QSize paperSize = pagePicture.size();
- if(degrees != 0) {
- pagePicture = pagePicture.transformed(rotMatrix, Qt::SmoothTransformation);
- //qDebug() << "Rotating by: " << degrees << " degrees";
- }
if(pagePicture.isNull()) {
qDebug() << "NULL IMAGE ON PAGE " << i;
continue;
}
- PageItem* item = new PageItem(i+1, pagePicture, paperSize);
- scene->addItem(item);
- pages.append(item);
+ PageItem* item = new PageItem(i+1, pagePicture, paperSize);
+ scene->addItem(item);
+ pages.append(item);
}
}
//Private Slots
void PrintWidget::updateCurrentPage() {
- if (viewMode == AllPagesView)
- return;
-
- int newPage = calcCurrentPage();
- if (newPage != curPage) {
- curPage = newPage;
- publicPageNum = curPage;
- emit currentPageChanged();
- }
+ if (viewMode == AllPagesView)
+ return;
+
+ int newPage = calcCurrentPage();
+ if (newPage != curPage) {
+ curPage = newPage;
+ publicPageNum = curPage;
+ emit currentPageChanged();
+ }
}
int PrintWidget::calcCurrentPage() {
- int maxArea = 0;
- int newPage = curPage;
- QRect viewRect = this->viewport()->rect();
- QList<QGraphicsItem*> items = this->items(viewRect);
- for (int i=0; i<items.size(); ++i) {
- PageItem* pg = static_cast<PageItem*>(items.at(i));
- QRect overlap = this->mapFromScene(pg->sceneBoundingRect()).boundingRect() & viewRect;
- int area = overlap.width() * overlap.height();
- if (area > maxArea) {
- maxArea = area;
- newPage = pg->pageNumber();
- } else if (area == maxArea && pg->pageNumber() < newPage) {
- newPage = pg->pageNumber();
- }
- }
- return newPage;
+ int maxArea = 0;
+ int newPage = curPage;
+ QRect viewRect = this->viewport()->rect();
+ QList<QGraphicsItem*> items = this->items(viewRect);
+ for (int i=0; i<items.size(); ++i) {
+ PageItem* pg = static_cast<PageItem*>(items.at(i));
+ QRect overlap = this->mapFromScene(pg->sceneBoundingRect()).boundingRect() & viewRect;
+ int area = overlap.width() * overlap.height();
+ if (area > maxArea) {
+ maxArea = area;
+ newPage = pg->pageNumber();
+ } else if (area == maxArea && pg->pageNumber() < newPage) {
+ newPage = pg->pageNumber();
+ }
+ }
+ return newPage;
}
void PrintWidget::fit(bool doFitting) {
- if (curPage < 1 || curPage > pages.count())
- return;
- if (!doFitting && !fitting)
- return;
-
- if (doFitting && fitting) {
- QRect viewRect = this->viewport()->rect();
- if (zoomMode == FitInView) {
- QList<QGraphicsItem*> containedItems = this->items(viewRect, Qt::ContainsItemBoundingRect);
- foreach(QGraphicsItem* item, containedItems) {
- PageItem* pg = static_cast<PageItem*>(item);
- if (pg->pageNumber() == curPage)
- return;
- }
- }
-
- int newPage = calcCurrentPage();
- if (newPage != curPage)
- curPage = newPage;
- }
-
- QRectF target = pages.at(curPage-1)->sceneBoundingRect();
- if (viewMode == FacingPagesView) {
- if (curPage % 2)
- target.setLeft(target.left() - target.width());
- else
- target.setRight(target.right() + target.width());
- } else if (viewMode == AllPagesView) {
- target = scene->itemsBoundingRect();
- }
-
- if (zoomMode == FitToWidth) {
- QTransform t;
- qreal scale = this->viewport()->width() / target.width();
- t.scale(scale, scale);
- this->setTransform(t);
- if (doFitting && fitting) {
- QRectF viewSceneRect = this->viewportTransform().mapRect(this->viewport()->rect());
- viewSceneRect.moveTop(target.top());
- this->ensureVisible(viewSceneRect); // Nah...
- }
- } else {
- this->fitInView(target, Qt::KeepAspectRatio);
- if (zoomMode == FitInView) {
- int step = qRound(this->matrix().mapRect(target).height());
- this->verticalScrollBar()->setSingleStep(step);
- this->verticalScrollBar()->setPageStep(step);
- }
- }
-
- //zoomFactor = this->transform().m11() * (float(printer->logicalDpiY()) / this->logicalDpiY());
-}
+ if (curPage < 1 || curPage > pages.count())
+ return;
+ if (!doFitting && !fitting)
+ return;
+
+ if (doFitting && fitting) {
+ QRect viewRect = this->viewport()->rect();
+ if (zoomMode == FitInView) {
+ QList<QGraphicsItem*> containedItems = this->items(viewRect, Qt::ContainsItemBoundingRect);
+ foreach(QGraphicsItem* item, containedItems) {
+ PageItem* pg = static_cast<PageItem*>(item);
+ if (pg->pageNumber() == curPage)
+ return;
+ }
+ }
-void PrintWidget::setPictures(QHash<int, QImage> *hash) {
- pictures = hash;
- this->setVisible(hash!=0);
-}
+ int newPage = calcCurrentPage();
+ if (newPage != curPage)
+ curPage = newPage;
+ }
-//Sets how much to rotate the image, by either 90, 180, or 270 degrees. Adds 90 degrees for cw and -90 for ccw.
-void PrintWidget::setDegrees(int degrees) {
- //Mods by 360, but adds and remods because of how C++ treats negative mods
- this->degrees = ( ( ( this->degrees + degrees ) % 360 ) + 360 ) % 360;
- switch(this->degrees) {
- case 270:
- rotMatrix = QMatrix(0, -1, 1, 0, 0, 0);
- break;
- case 90:
- rotMatrix = QMatrix(0, 1, -1, 0, 0, 0);
- break;
- case 180:
- rotMatrix = QMatrix(-1, 0, 0, -1, 0, 0);
- break;
- default:
- rotMatrix = QMatrix(1, 0, 0, 1, 0 ,0);
+ QRectF target = pages.at(curPage-1)->sceneBoundingRect();
+ if (viewMode == FacingPagesView) {
+ if (curPage % 2)
+ target.setLeft(target.left() - target.width());
+ else
+ target.setRight(target.right() + target.width());
+ } else if (viewMode == AllPagesView) {
+ target = scene->itemsBoundingRect();
}
- this->updatePreview();
+
+ if (zoomMode == FitToWidth) {
+ QTransform t;
+ qreal scale = this->viewport()->width() / target.width();
+ t.scale(scale, scale);
+ this->setTransform(t);
+ if (doFitting && fitting) {
+ QRectF viewSceneRect = this->viewportTransform().mapRect(this->viewport()->rect());
+ viewSceneRect.moveTop(target.top());
+ this->ensureVisible(viewSceneRect); // Nah...
+ }
+ } else {
+ this->fitInView(target, Qt::KeepAspectRatio);
+ if (zoomMode == FitInView) {
+ int step = qRound(this->matrix().mapRect(target).height());
+ this->verticalScrollBar()->setSingleStep(step);
+ this->verticalScrollBar()->setPageStep(step);
+ }
+ }
+
+ //zoomFactor = this->transform().m11() * (float(printer->logicalDpiY()) / this->logicalDpiY());
}
bgstack15