Ian Jauslin
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdfWindow.cpp')
-rw-r--r--src/pdfWindow.cpp139
1 files changed, 139 insertions, 0 deletions
diff --git a/src/pdfWindow.cpp b/src/pdfWindow.cpp
new file mode 100644
index 0000000..e4ca3e4
--- /dev/null
+++ b/src/pdfWindow.cpp
@@ -0,0 +1,139 @@
+/*
+Copyright 2015 Ian Jauslin
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+#include "pdfWindow.h"
+
+// constructor
+pdfWindow::pdfWindow(QWidget *parent) :
+ QMainWindow(parent)
+{
+ // set defaults
+ fullscreen=0;
+ curpage=0;
+ totalpages=0;
+ verticalOffset=0;
+ document=NULL;
+
+ //scene to draw the view
+ pdfViewScene=new QGraphicsScene;
+ pdfView=new QGraphicsView(pdfViewScene);
+}
+
+// set PDF document
+void pdfWindow::setDoc(char* file){
+ if(document){delete document;}
+ doc=file;
+
+ QString filename=file;
+ document = Poppler::Document::load(filename);
+ if(document){
+ // display options
+ document->setRenderHint(Poppler::Document::Antialiasing,true);
+ document->setRenderHint(Poppler::Document::TextAntialiasing,true);
+
+ curpage=0;
+ totalpages=document->numPages();
+ this->updatePDF();
+ }
+}
+
+void pdfWindow::gotoPage(int page){
+ if(page<totalpages && page>=0){
+ curpage=page;
+ this->updatePDF();
+ }
+}
+void pdfWindow::nextPage(){
+ if(curpage<totalpages-1){
+ curpage++;
+ this->updatePDF();
+ }
+}
+void pdfWindow::previousPage(){
+ if(curpage>0){
+ curpage--;
+ this->updatePDF();
+ }
+}
+
+// toggle fullscreen
+void pdfWindow::fullscreenPDF(){
+ if(!fullscreen){
+ fullscreen=1;
+ this->showFullScreen();
+ }
+ else{
+ fullscreen=0;
+ this->showNormal();
+ }
+}
+
+// draw (or redraw) PDF
+void pdfWindow::updatePDF(){
+ // current page
+ Poppler::Page* pdfPage = document->page(curpage);
+ if(!pdfPage){
+ std::cout << "Error: could not load page " << curpage << '\n';
+ return;
+ }
+
+ // total size available
+ QSize windowsize=this->size();
+ // verticalOffset to allow timebar
+ QSize viewSize(windowsize.width()+2,windowsize.height()+2-verticalOffset);
+ pdfView->setGeometry(-1,-1,viewSize.width(),viewSize.height());
+
+ // page size in points (1/72 inch)
+ QSize pageSize=pdfPage->pageSize();
+ // aspect ratio
+ double aspect=double(pageSize.width())/double(pageSize.height());
+ // an image to display the page
+ QImage image;
+ // keep aspect ratop
+ if(viewSize.width()<=aspect*viewSize.height()){
+ // render PDF page with appropriate resolution (pix/inch)
+ image = pdfPage->renderToImage(72*viewSize.width()/pageSize.width(),72*viewSize.width()/aspect/pageSize.height(),0,0,viewSize.width(),viewSize.width()/aspect);
+ }
+ else{
+ // render PDF page with appropriate resolution (pix/inch)
+ image = pdfPage->renderToImage(72*viewSize.height()*aspect/pageSize.width(),72*viewSize.height()/pageSize.height(),0,0,viewSize.height()*aspect,viewSize.height());
+ }
+ delete pdfPage;
+
+ // update scene
+ delete pdfViewScene;
+ pdfViewScene=new QGraphicsScene;
+ pdfView->setScene(pdfViewScene);
+ pdfViewScene->setBackgroundBrush(Qt::black);
+ // draw image
+ pdfViewScene->addPixmap(QPixmap::fromImage(image));
+}
+
+// respond to resize
+void pdfWindow::resizeEvent(QResizeEvent* event){
+ if(document){
+ this->updatePDF();
+ }
+
+ QMainWindow::resizeEvent(event);
+}
+
+// destructor
+pdfWindow::~pdfWindow(){
+ if(document){delete document;}
+ delete pdfView;
+ delete pdfViewScene;
+}