aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/desktop-utils
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/desktop-utils')
-rw-r--r--src-qt5/desktop-utils/lumina-pdf/lumina-pdf.desktop10
-rw-r--r--src-qt5/desktop-utils/lumina-pdf/lumina-pdf.pro101
-rw-r--r--src-qt5/desktop-utils/lumina-pdf/main.cpp29
-rw-r--r--src-qt5/desktop-utils/lumina-pdf/mainUI.cpp341
-rw-r--r--src-qt5/desktop-utils/lumina-pdf/mainUI.h108
-rw-r--r--src-qt5/desktop-utils/lumina-pdf/mainUI.ui153
6 files changed, 742 insertions, 0 deletions
diff --git a/src-qt5/desktop-utils/lumina-pdf/lumina-pdf.desktop b/src-qt5/desktop-utils/lumina-pdf/lumina-pdf.desktop
new file mode 100644
index 00000000..c9632c9f
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-pdf/lumina-pdf.desktop
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Exec=lumina-pdf %f
+Icon=application-pdf
+Terminal=false
+Type=Application
+StartupNotify=true
+Categories=Utility;
+MimeType=application/pdf;
+Name=Lumina PDF Viewer
+Comment=View PDF Files
diff --git a/src-qt5/desktop-utils/lumina-pdf/lumina-pdf.pro b/src-qt5/desktop-utils/lumina-pdf/lumina-pdf.pro
new file mode 100644
index 00000000..c1c1c681
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-pdf/lumina-pdf.pro
@@ -0,0 +1,101 @@
+include("$${PWD}/../../OS-detect.pri")
+
+QT += core gui
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets concurrent
+
+
+TARGET = lumina-pdf
+TEMPLATE = app
+
+QT += printsupport
+
+target.path = $${L_BINDIR}
+
+#include all the special classes from the Lumina tree
+include(../../core/libLumina/LUtils.pri) #includes LUtils
+include(../../core/libLumina/LuminaXDG.pri)
+
+SOURCES += main.cpp \
+ mainUI.cpp
+
+HEADERS += mainUI.h
+
+FORMS += mainUI.ui
+
+LIBS += -lpoppler-qt5
+INCLUDEPATH+= $${L_INCLUDEDIR}/poppler/qt5
+
+TRANSLATIONS = i18n/l-pdf_af.ts \
+ i18n/l-pdf_ar.ts \
+ i18n/l-pdf_az.ts \
+ i18n/l-pdf_bg.ts \
+ i18n/l-pdf_bn.ts \
+ i18n/l-pdf_bs.ts \
+ i18n/l-pdf_ca.ts \
+ i18n/l-pdf_cs.ts \
+ i18n/l-pdf_cy.ts \
+ i18n/l-pdf_da.ts \
+ i18n/l-pdf_de.ts \
+ i18n/l-pdf_el.ts \
+ i18n/l-pdf_en_GB.ts \
+ i18n/l-pdf_en_ZA.ts \
+ i18n/l-pdf_es.ts \
+ i18n/l-pdf_et.ts \
+ i18n/l-pdf_eu.ts \
+ i18n/l-pdf_fa.ts \
+ i18n/l-pdf_fi.ts \
+ i18n/l-pdf_fr.ts \
+ i18n/l-pdf_fr_CA.ts \
+ i18n/l-pdf_gl.ts \
+ i18n/l-pdf_he.ts \
+ i18n/l-pdf_hi.ts \
+ i18n/l-pdf_hr.ts \
+ i18n/l-pdf_hu.ts \
+ i18n/l-pdf_id.ts \
+ i18n/l-pdf_is.ts \
+ i18n/l-pdf_it.ts \
+ i18n/l-pdf_ja.ts \
+ i18n/l-pdf_ka.ts \
+ i18n/l-pdf_ko.ts \
+ i18n/l-pdf_lt.ts \
+ i18n/l-pdf_lv.ts \
+ i18n/l-pdf_mk.ts \
+ i18n/l-pdf_mn.ts \
+ i18n/l-pdf_ms.ts \
+ i18n/l-pdf_mt.ts \
+ i18n/l-pdf_nb.ts \
+ i18n/l-pdf_nl.ts \
+ i18n/l-pdf_pa.ts \
+ i18n/l-pdf_pl.ts \
+ i18n/l-pdf_pt.ts \
+ i18n/l-pdf_pt_BR.ts \
+ i18n/l-pdf_ro.ts \
+ i18n/l-pdf_ru.ts \
+ i18n/l-pdf_sk.ts \
+ i18n/l-pdf_sl.ts \
+ i18n/l-pdf_sr.ts \
+ i18n/l-pdf_sv.ts \
+ i18n/l-pdf_sw.ts \
+ i18n/l-pdf_ta.ts \
+ i18n/l-pdf_tg.ts \
+ i18n/l-pdf_th.ts \
+ i18n/l-pdf_tr.ts \
+ i18n/l-pdf_uk.ts \
+ i18n/l-pdf_uz.ts \
+ i18n/l-pdf_vi.ts \
+ i18n/l-pdf_zh_CN.ts \
+ i18n/l-pdf_zh_HK.ts \
+ i18n/l-pdf_zh_TW.ts \
+ i18n/l-pdf_zu.ts
+
+dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/
+dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/
+
+desktop.files=lumina-pdf.desktop
+desktop.path=$${L_SHAREDIR}/applications/
+
+INSTALLS += target desktop
+
+WITH_I18N{
+ INSTALLS += dotrans
+}
diff --git a/src-qt5/desktop-utils/lumina-pdf/main.cpp b/src-qt5/desktop-utils/lumina-pdf/main.cpp
new file mode 100644
index 00000000..f0430fc8
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-pdf/main.cpp
@@ -0,0 +1,29 @@
+#include <QTranslator>
+#include <QApplication>
+#include <QDebug>
+#include <QFile>
+
+#include "mainUI.h"
+#include <LUtils.h>
+//#include <LuminaThemes.h>
+
+int main(int argc, char ** argv)
+{
+ //LTHEME::LoadCustomEnvSettings();
+ unsetenv("QT_AUTO_SCREEN_SCALE_FACTOR"); //need pixel-perfect geometries
+ QApplication a(argc, argv);
+ LUtils::LoadTranslation(&a, "l-pdf");
+
+ //Read the input variables
+ QString path = "";
+ for(int i=1; i<argc; i++){
+ path = LUtils::PathToAbsolute( argv[i] );
+ if(QFile::exists(path)){ break; } //already found a valid file
+ }
+
+ MainUI w;
+ if(!path.isEmpty()){ w.loadFile(path); }
+ w.show();
+ int retCode = a.exec();
+ return retCode;
+}
diff --git a/src-qt5/desktop-utils/lumina-pdf/mainUI.cpp b/src-qt5/desktop-utils/lumina-pdf/mainUI.cpp
new file mode 100644
index 00000000..ad6dc560
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-pdf/mainUI.cpp
@@ -0,0 +1,341 @@
+//===========================================
+// Lumina Desktop source code
+// Copyright (c) 2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "mainUI.h"
+#include "ui_mainUI.h"
+
+#include <QPainter>
+#include <QImage>
+#include <QSize>
+#include <QFileDialog>
+#include <QInputDialog>
+#include <QDebug>
+#include <QApplication>
+#include <QScreen>
+#include <QTimer>
+
+#include <QtConcurrent>
+
+#include <LuminaXDG.h>
+
+MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI()){
+ ui->setupUi(this);
+ presentationLabel = 0;
+ this->setWindowTitle(tr("Lumina PDF Viewer"));
+ this->setWindowIcon( LXDG::findIcon("application-pdf","unknown"));
+ CurrentPage = 0;
+ lastdir = QDir::homePath();
+ Printer = new QPrinter();
+ WIDGET = new QPrintPreviewWidget(Printer,this);
+ this->setCentralWidget(WIDGET);
+ connect(WIDGET, SIGNAL(paintRequested(QPrinter*)), this, SLOT(paintOnWidget(QPrinter*)) );
+ DOC = 0;
+ connect(this, SIGNAL(PageLoaded(int)), this, SLOT(slotPageLoaded(int)) );
+
+ PrintDLG = new QPrintDialog(this);
+ connect(PrintDLG, SIGNAL(accepted(QPrinter*)), this, SLOT(paintToPrinter(QPrinter*)) );
+ connect(ui->menuStart_Presentation, SIGNAL(triggered(QAction*)), this, SLOT(slotStartPresentation(QAction*)) );
+
+ //Create the other interface widgets
+ progress = new QProgressBar(this);
+ progress->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ progress->setFormat("%v/%m (%p%)"); // [current]/[total]
+ progAct = ui->toolBar->addWidget(progress);
+ progAct->setVisible(false);
+ //Put the various actions into logical groups
+ QActionGroup *tmp = new QActionGroup(this);
+ tmp->setExclusive(true);
+ tmp->addAction(ui->actionFit_Width);
+ tmp->addAction(ui->actionFit_Page);
+ ui->actionFit_Page->setChecked(true);
+
+ tmp = new QActionGroup(this);
+ tmp->setExclusive(true);
+ tmp->addAction(ui->actionSingle_Page);
+ tmp->addAction(ui->actionDual_Pages);
+ tmp->addAction(ui->actionAll_Pages);
+ ui->actionSingle_Page->setChecked(true);
+
+ //Connect up the buttons
+ connect(ui->actionClose, SIGNAL(triggered()), this, SLOT(close()) );
+ connect(ui->actionPrint, SIGNAL(triggered()), PrintDLG, SLOT(open()) );
+ connect(ui->actionFit_Width, SIGNAL(triggered()), WIDGET, SLOT(fitToWidth()) );
+ connect(ui->actionFit_Page, SIGNAL(triggered()), WIDGET, SLOT(fitInView()) );
+ connect(ui->actionOpen_PDF, SIGNAL(triggered()), this, SLOT(OpenNewFile()) );
+ connect(ui->actionSingle_Page, SIGNAL(triggered()), WIDGET, SLOT(setSinglePageViewMode()) );
+ connect(ui->actionDual_Pages, SIGNAL(triggered()), WIDGET, SLOT(setFacingPagesViewMode()) );
+ connect(ui->actionAll_Pages, SIGNAL(triggered()), WIDGET, SLOT(setAllPagesViewMode()) );
+
+ //Setup all the icons
+ ui->actionPrint->setIcon( LXDG::findIcon("document-print",""));
+ ui->actionClose->setIcon( LXDG::findIcon("window-close",""));
+ ui->actionFit_Width->setIcon(LXDG::findIcon("arrow-expand-all",""));
+ ui->actionFit_Page->setIcon(LXDG::findIcon("zoom-fit-best",""));
+ ui->actionOpen_PDF->setIcon(LXDG::findIcon("document-open",""));
+ ui->actionSingle_Page->setIcon(LXDG::findIcon("view-preview",""));
+ ui->actionDual_Pages->setIcon(LXDG::findIcon("format-view-agenda",""));
+ ui->actionAll_Pages->setIcon(LXDG::findIcon("format-view-grid-small",""));
+}
+
+MainUI::~MainUI(){
+
+}
+
+void MainUI::loadFile(QString path){
+
+ if(!QFile::exists(path) || path.isEmpty() ){ return; }
+ Poppler::Document *TDOC = Poppler::Document::load(path);
+ if(TDOC==0){
+ qDebug() << "Could not open file:" << path;
+ return;
+ }else if(TDOC->isLocked()){
+ //Prompt for password to unlock the document
+ QString pass = "";
+ bool ok = true; //flag this to go into the loop the first time (if password prompt is cancelled - this becomes false)
+ while( (ok ? true : !TDOC->unlock(QByteArray(), pass.toLocal8Bit())) ){ //make sure the unlock function is only called when ok is true
+ pass = QInputDialog::getText(this, tr("Unlock PDF"), tr("Password:"), QLineEdit::Password, "", &ok);
+ }
+ if(TDOC->isLocked()){ return; } //Cancelled - still locked
+ }
+
+ if(DOC!=0){
+ //Clear out the old document first
+ delete DOC;
+ DOC=0;
+ }
+ loadingHash.clear(); //clear out this hash
+ numPages = -1;
+ DOC = TDOC; //Save this for later
+ qDebug() << "Opening File:" << path;
+ this->setWindowTitle(DOC->title());
+ if(this->windowTitle().isEmpty()){ this->setWindowTitle(path.section("/",-1)); }
+
+ //Setup the Document
+ Poppler::Page *PAGE = DOC->page(0);
+ if(PAGE!=0){
+ lastdir = path.section("/",0,-2); //save this for later
+ Printer->setPageSize( QPageSize(PAGE->pageSize(), QPageSize::Point) );
+ Printer->setPageMargins(QMarginsF(0,0,0,0), QPageLayout::Point);
+ switch(PAGE->orientation()){
+ case Poppler::Page::Landscape:
+ Printer->setOrientation(QPrinter::Landscape); break;
+ default:
+ Printer->setOrientation(QPrinter::Portrait);
+ }
+ delete PAGE;
+ qDebug() << " - Document Setup";
+ QTimer::singleShot(10, WIDGET, SLOT(updatePreview())); //start loading the file preview
+ }
+
+}
+
+void MainUI::loadPage(int num, Poppler::Document *doc, MainUI *obj, QSize dpi, QSizeF page){
+ //qDebug() << " - Render Page:" << num;
+ Poppler::Page *PAGE = doc->page(num);
+ if(PAGE!=0){
+ loadingHash.insert(num, PAGE->renderToImage(3*dpi.width(), 3*dpi.height()).scaled(page.width(), page.height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation) );
+ }else{
+ loadingHash.insert(num, QImage());
+ }
+ if(PAGE!=0){ delete PAGE; }
+ obj->emit PageLoaded(num);
+}
+
+QScreen* MainUI::getScreen(bool current, bool &cancelled){
+ //Note: the "cancelled" boolian is actually an output - not an input
+ QList<QScreen*> screens = QApplication::screens();
+ cancelled = false;
+ if(screens.length() ==1){ return screens[0]; } //only one option
+ //Multiple screens available - figure it out
+ if(current){
+ //Just return the screen the window is currently on
+ for(int i=0; i<screens.length(); i++){
+ if(screens[i]->geometry().contains( this->mapToGlobal(this->pos()) )){
+ return screens[i];
+ }
+ }
+ //If it gets this far, there was an error and it should just return the primary screen
+ return QApplication::primaryScreen();
+ }else{
+ //Ask the user to select a screen (for presentations, etc..)
+ QStringList names;
+ for(int i=0; i<screens.length(); i++){
+ QString screensize = QString::number(screens[i]->size().width())+"x"+QString::number(screens[i]->size().height());
+ names << QString(tr("%1 (%2)")).arg(screens[i]->name(), screensize);
+ }
+ bool ok = false;
+ QString sel = QInputDialog::getItem(this, tr("Select Screen"), tr("Screen:"), names, 0, false, &ok);
+ cancelled = !ok;
+ if(!ok){ return screens[0]; } //cancelled - just return the first one
+ int index = names.indexOf(sel);
+ if(index < 0){ return screens[0]; } //error - should never happen though
+ return screens[index]; //return the selected screen
+ }
+}
+
+void MainUI::startPresentation(bool atStart){
+ if(DOC==0){ return; } //just in case
+ bool cancelled = false;
+ QScreen *screen = getScreen(false, cancelled); //let the user select which screen to use (if multiples)
+ if(cancelled){ return;}
+ int page = 0;
+ if(!atStart){ page = CurrentPage; }
+ //PDPI = QSize(SCALEFACTOR*screen->physicalDotsPerInchX(), SCALEFACTOR*screen->physicalDotsPerInchY());
+ //Now create the full-screen window on the selected screen
+ if(presentationLabel == 0){
+ //Create the label and any special flags for it
+ presentationLabel = new QLabel(0, Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
+ presentationLabel->setStyleSheet("background-color: black;");
+ presentationLabel->setAlignment(Qt::AlignCenter);
+ }
+ //Now put the label in the proper location
+ presentationLabel->setGeometry(screen->geometry());
+ presentationLabel->showFullScreen();
+
+ ui->actionStop_Presentation->setEnabled(true);
+ ui->menuStart_Presentation->setEnabled(false);
+ QApplication::processEvents();
+ //Now start at the proper page
+ ShowPage(page);
+ this->grabKeyboard(); //Grab any keyboard events - even from the presentation window
+}
+
+void MainUI::ShowPage(int page){
+ if(presentationLabel == 0 || !presentationLabel->isVisible()){ return; }
+ //Check for valid document/page
+ if(page<0 || page >=numPages ){
+ endPresentation();
+ return; //invalid - no document loaded or invalid page specified
+ }
+ CurrentPage = page;
+ QImage PAGEIMAGE = loadingHash[page];
+
+ //Now scale the image according to the user-designations and show it
+ if(!PAGEIMAGE.isNull()){
+ QPixmap pix;
+ pix.convertFromImage( PAGEIMAGE.scaled( presentationLabel->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation) );
+ presentationLabel->setPixmap(pix);
+ presentationLabel->show(); //always make sure it was not hidden
+ }else{
+ presentationLabel->setPixmap(QPixmap());
+ endPresentation();
+ }
+}
+
+void MainUI::endPresentation(){
+ if(presentationLabel==0 || !presentationLabel->isVisible()){ return; } //not in presentation mode
+ presentationLabel->hide(); //just hide this (no need to re-create the label for future presentations)
+ ui->actionStop_Presentation->setEnabled(false);
+ ui->menuStart_Presentation->setEnabled(true);
+ this->releaseKeyboard();
+}
+
+void MainUI::startLoadingPages(QPrinter *printer){
+ if(numPages>0){ return; } //currently loaded[ing]
+ //qDebug() << " - Start Loading Pages";
+ numPages = DOC->numPages();
+ progress->setRange(0,numPages);
+ progress->setValue(0);
+ progAct->setVisible(true);
+ QRectF pageSize = printer->pageRect(QPrinter::DevicePixel);
+ QSize DPI(printer->resolution(),printer->resolution());
+ for(int i=0; i<numPages; i++){
+ //qDebug() << " - Kickoff page load:" << i;
+ QtConcurrent::run(this, &MainUI::loadPage, i, DOC, this, DPI, pageSize.size() );
+ }
+}
+
+void MainUI::slotPageLoaded(int page){
+ //qDebug() << "Page Loaded:" << page;
+ int finished = loadingHash.keys().length();
+ if(finished == numPages){
+ progress->setVisible(false);
+ progAct->setVisible(false);
+ QTimer::singleShot(0, WIDGET, SLOT(updatePreview()));
+ }else{
+ progress->setValue(finished);
+ }
+}
+
+void MainUI::slotStartPresentation(QAction *act){
+ startPresentation(act == ui->actionAt_Beginning);
+}
+
+void MainUI::paintOnWidget(QPrinter *PRINTER){
+ if(DOC==0){ return; }
+ //this->show();
+ if(loadingHash.keys().length() != numPages){ startLoadingPages(PRINTER); return; }
+
+ QPainter painter(PRINTER);
+ for(int i=0; i<numPages; i++){
+ if(i != 0){ PRINTER->newPage(); } //this is the start of the next page (not needed for first)
+ if(loadingHash.contains(i)){ painter.drawImage(0,0, loadingHash[i]); }
+ else{ painter.drawImage(0,0, QImage()); }
+ }
+}
+
+void MainUI::paintToPrinter(QPrinter *PRINTER){
+ if(loadingHash.keys().length() != numPages){ return; }
+
+ int pages = DOC->numPages();
+ int firstpage = 0;
+ int copies = PRINTER->copyCount();
+ bool collate = PRINTER->collateCopies();
+ bool duplex = (PRINTER->duplex()!=QPrinter::DuplexNone);
+ //Determine the first page that needs to be printed, and the range
+ if((PRINTER->fromPage() != PRINTER->toPage() || PRINTER->fromPage()!=0 ) && PRINTER->printRange()==QPrinter::PageRange ){
+ firstpage = PRINTER->fromPage() - 1;
+ pages = PRINTER->toPage();
+ }
+ qDebug() << "Start Printing PDF: Pages" << PRINTER->fromPage() <<" to "<< PRINTER->toPage()<< " Copies:" << copies << " collate:" << collate;
+ QList<int> pageCount;
+ //Assemble the page order/count based on printer settings
+ for(int i=firstpage; i<pages; i++){
+ //Make sure even/odd pages are not selected as desired
+ //Qt 5.7.1 does not seem to have even/odd page selections - 8/11/2017
+ pageCount << i; //add this page to the list
+ for(int c=1; c<copies && !collate; c++){ pageCount << i; } //add any copies of this page as needed
+ }
+ //qDebug() << "Got Page Range:" << pageCount;
+ if(PRINTER->pageOrder()==QPrinter::LastPageFirst){
+ //Need to reverse the order of the list
+ QList<int> tmp = pageCount;
+ pageCount.clear();
+ for(int i=tmp.length()-1; i>=0; i--){ pageCount << tmp[i]; }
+ //qDebug() << " - reversed:" << pageCount;
+ }
+ if(collate && copies>0){
+ QList<int> orig = pageCount; //original array of pages
+ for(int c=1; c<copies; c++){
+ pageCount << orig; //add a new copy of the entire page range
+ }
+ }
+ //qDebug() << "Final Page Range:" << pageCount;
+ //return;
+ //Generate the sizing information for the printer
+ QSize sz(PRINTER->pageRect().width(), PRINTER->pageRect().height());
+ bool landscape = PRINTER->orientation()==QPrinter::Landscape;
+ if(landscape){ sz = QSize(sz.height(), sz.width() ); } //flip the size dimensions as needed
+ //Now send out the pages in the right order/format
+ QPainter painter(PRINTER);
+ QTransform transF;
+ transF.rotate(90);
+ for(int i=0; i<pageCount.length(); i++){
+ if(i!=0){ PRINTER->newPage(); }
+ QImage img = loadingHash[pageCount[i]].scaled(sz, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ qDebug() << "Image Size:" << img.size();
+ //if(landscape){ img = img.transformed(transF, Qt::SmoothTransformation); qDebug() << " - rotated image size:" << img.size(); }
+ //Now draw the image
+ painter.drawImage(0,0,img);
+ }
+}
+
+void MainUI::OpenNewFile(){
+ //Prompt for a file
+ QString path = QFileDialog::getOpenFileName(this, tr("Open PDF"), lastdir, tr("PDF Documents (*.pdf)"));
+ //Now Open it
+ if(!path.isEmpty()){ loadFile(path); }
+}
diff --git a/src-qt5/desktop-utils/lumina-pdf/mainUI.h b/src-qt5/desktop-utils/lumina-pdf/mainUI.h
new file mode 100644
index 00000000..c1fc7c7c
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-pdf/mainUI.h
@@ -0,0 +1,108 @@
+//===========================================
+// Lumina Desktop source code
+// Copyright (c) 2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_PDF_VIEWER_MAIN_WINDOW_H
+#define _LUMINA_PDF_VIEWER_MAIN_WINDOW_H
+
+#include <QPrintPreviewWidget>
+#include <QPrintDialog>
+#include <QPrinter>
+#include <QMainWindow>
+#include <QProgressBar>
+#include <QLabel>
+#include <QKeyEvent>
+#include <QDebug>
+
+#include <poppler-qt5.h>
+
+namespace Ui{
+ class MainUI;
+};
+
+class MainUI : public QMainWindow{
+ Q_OBJECT
+public:
+ MainUI();
+ ~MainUI();
+
+ void loadFile(QString path);
+
+
+private:
+ Poppler::Document *DOC;
+ QPrintPreviewWidget *WIDGET;
+ Ui::MainUI *ui;
+ QPrinter* Printer;
+ QPrintDialog *PrintDLG;
+
+ QString lastdir;
+
+ //Other Interface elements
+ QProgressBar *progress;
+ QAction *progAct; //action associated with the progressbar
+
+ //PDF Page Loading cache variables
+ QHash<int, QImage> loadingHash;
+ int numPages;
+
+ void loadPage(int num, Poppler::Document *doc, MainUI *obj, QSize dpi, QSizeF page);
+
+ //Functions/variables for the presentation mode
+ QLabel *presentationLabel;
+ QScreen *getScreen(bool current, bool &cancelled);
+ int CurrentPage;
+ void startPresentation(bool atStart);
+ void ShowPage(int page);
+ void endPresentation();
+
+private slots:
+ void startLoadingPages(QPrinter *printer);
+ void slotPageLoaded(int);
+ void slotStartPresentation(QAction *act);
+
+ void paintOnWidget(QPrinter *PRINTER);
+ void paintToPrinter(QPrinter *PRINTER);
+
+ //Button Slots
+ void OpenNewFile();
+
+signals:
+ void PageLoaded(int);
+
+protected:
+ void keyPressEvent(QKeyEvent *event){
+ //See if this is one of the special hotkeys and act appropriately
+ // NOTE: Some of this is duplicated with the QShortcut definitions (for non-presentation mode)
+ // This routine does not always work for the main window viewer due to differing widget focus policies
+ if(presentationLabel!=0 && presentationLabel->isVisible()){
+ //qDebug() << "Got Key Press:";
+ if( event->key()==Qt::Key_Escape || event->key()==Qt::Key_Backspace){
+ //qDebug() << " - Escape/Backspace";
+ endPresentation();
+ }else if(event->key()==Qt::Key_Right || event->key()==Qt::Key_Down || event->key()==Qt::Key_Space){
+ //qDebug() << " - Right/Down/Spacebar";
+ ShowPage( CurrentPage+1 );
+ }else if(event->key()==Qt::Key_Left || event->key()==Qt::Key_Up){
+ //qDebug() << " - Left/Up";
+ ShowPage( CurrentPage-1 );
+ }else if(event->key()==Qt::Key_Home){
+ //qDebug() << " - Home";
+ ShowPage(0); //go to the first page
+ }else if(event->key()==Qt::Key_End){
+ //qDebug() << " - End";
+ ShowPage( numPages-1 ); //go to the last page
+ }else if(event->key()==Qt::Key_F11){
+ //qDebug() << " - F11";
+ endPresentation();
+ }else{
+ QMainWindow::keyPressEvent(event);
+ }
+ }else{
+ QMainWindow::keyPressEvent(event);
+ }
+ }
+};
+#endif
diff --git a/src-qt5/desktop-utils/lumina-pdf/mainUI.ui b/src-qt5/desktop-utils/lumina-pdf/mainUI.ui
new file mode 100644
index 00000000..bbc76bab
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-pdf/mainUI.ui
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainUI</class>
+ <widget class="QMainWindow" name="MainUI">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>659</width>
+ <height>588</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>MainWindow</string>
+ </property>
+ <widget class="QWidget" name="centralwidget"/>
+ <widget class="QMenuBar" name="menubar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>659</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuFile">
+ <property name="title">
+ <string>File</string>
+ </property>
+ <addaction name="actionPrint"/>
+ <addaction name="separator"/>
+ <addaction name="actionOpen_PDF"/>
+ <addaction name="separator"/>
+ <addaction name="actionClose"/>
+ </widget>
+ <widget class="QMenu" name="menuPresentation">
+ <property name="title">
+ <string>Presentation</string>
+ </property>
+ <widget class="QMenu" name="menuStart_Presentation">
+ <property name="title">
+ <string>Start Presentation</string>
+ </property>
+ <addaction name="actionAt_Beginning"/>
+ </widget>
+ <addaction name="menuStart_Presentation"/>
+ <addaction name="actionStop_Presentation"/>
+ </widget>
+ <addaction name="menuFile"/>
+ <addaction name="menuPresentation"/>
+ </widget>
+ <widget class="QStatusBar" name="statusbar"/>
+ <widget class="QToolBar" name="toolBar">
+ <property name="windowTitle">
+ <string>toolBar</string>
+ </property>
+ <property name="movable">
+ <bool>false</bool>
+ </property>
+ <property name="floatable">
+ <bool>false</bool>
+ </property>
+ <attribute name="toolBarArea">
+ <enum>TopToolBarArea</enum>
+ </attribute>
+ <attribute name="toolBarBreak">
+ <bool>false</bool>
+ </attribute>
+ <addaction name="actionFit_Page"/>
+ <addaction name="actionFit_Width"/>
+ <addaction name="separator"/>
+ <addaction name="actionSingle_Page"/>
+ <addaction name="actionDual_Pages"/>
+ <addaction name="actionAll_Pages"/>
+ </widget>
+ <action name="actionOpen_PDF">
+ <property name="text">
+ <string>Open PDF</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+O</string>
+ </property>
+ </action>
+ <action name="actionClose">
+ <property name="text">
+ <string>Close</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+Q</string>
+ </property>
+ </action>
+ <action name="actionFit_Page">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Fit Page</string>
+ </property>
+ </action>
+ <action name="actionFit_Width">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Fit Width</string>
+ </property>
+ </action>
+ <action name="actionPrint">
+ <property name="text">
+ <string>Print</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+P</string>
+ </property>
+ </action>
+ <action name="actionSingle_Page">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Single Page</string>
+ </property>
+ </action>
+ <action name="actionDual_Pages">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Dual Pages</string>
+ </property>
+ </action>
+ <action name="actionAll_Pages">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>All Pages</string>
+ </property>
+ </action>
+ <action name="actionAt_Beginning">
+ <property name="text">
+ <string>At Beginning</string>
+ </property>
+ </action>
+ <action name="actionStop_Presentation">
+ <property name="text">
+ <string>Stop Presentation</string>
+ </property>
+ </action>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
bgstack15