diff options
-rw-r--r-- | src-qt5/desktop-utils/lumina-pdf/lumina-pdf.desktop | 10 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-pdf/lumina-pdf.pro | 101 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-pdf/main.cpp | 29 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-pdf/mainUI.cpp | 341 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-pdf/mainUI.h | 108 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-pdf/mainUI.ui | 153 |
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> |