aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Moore <ken@ixsystems.com>2017-03-13 15:41:39 -0400
committerKen Moore <ken@ixsystems.com>2017-03-13 15:41:39 -0400
commitcbef967cead76a6e465d534284acdd1927ad632e (patch)
tree74e336cb732edb37495f1312ce15135830c7ec51
parentMerge branch 'master' of github.com:trueos/lumina (diff)
downloadlumina-cbef967cead76a6e465d534284acdd1927ad632e.tar.gz
lumina-cbef967cead76a6e465d534284acdd1927ad632e.tar.bz2
lumina-cbef967cead76a6e465d534284acdd1927ad632e.zip
Add a new desktop application: lumina-pdf
This is a basic PDF file viewer application, with printing capabilities. NOTE: This is not quite done yet - the basic PDF viewer works if an input file is supplied, but I have not finished adding all the normal window operations around it yet (menu bar with close, open file options, progress bar for loading status rather than using a message box, etc...)
-rw-r--r--src-qt5/desktop-utils/lumina-pdf/lumina-pdf.desktop10
-rw-r--r--src-qt5/desktop-utils/lumina-pdf/lumina-pdf.pro99
-rw-r--r--src-qt5/desktop-utils/lumina-pdf/main.cpp31
-rw-r--r--src-qt5/desktop-utils/lumina-pdf/mainUI.cpp102
-rw-r--r--src-qt5/desktop-utils/lumina-pdf/mainUI.h33
5 files changed, 275 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..31815629
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-pdf/lumina-pdf.pro
@@ -0,0 +1,99 @@
+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
+
+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..ad0797d7
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-pdf/main.cpp
@@ -0,0 +1,31 @@
+#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();
+ QApplication a(argc, argv);
+ LUtils::LoadTranslation(&a, "l-pdf");
+ //LuminaThemeEngine theme(&a);
+
+
+ //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
+ }
+if(path.isEmpty()){ return 1; }
+ MainUI w;
+ //QObject::connect(&theme, SIGNAL(updateIcons()), &w, SLOT(UpdateIcons()) );
+ 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..22e41dbb
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-pdf/mainUI.cpp
@@ -0,0 +1,102 @@
+//===========================================
+// 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 <QPainter>
+#include <QImage>
+#include <QSize>
+#include <QMessageBox>
+#include <QDebug>
+#include <QApplication>
+
+#include <LuminaXDG.h>
+
+MainUI::MainUI() : QPrintPreviewDialog(0, Qt::Window){
+
+ //this->addStatusBar();
+
+ connect(this, SIGNAL(paintRequested(QPrinter*)), this, SLOT(paintOnWidget(QPrinter*)) );
+ DOC = 0;
+}
+
+MainUI::~MainUI(){
+
+}
+
+void MainUI::loadFile(QString path){
+ if(DOC!=0){
+ //Clear out the old document first
+ delete DOC;
+ }
+ if(!QFile::exists(path) || path.isEmpty() ){QApplication::exit(1); }
+ DOC = Poppler::Document::load(path);
+ if(DOC!=0){ this->setWindowTitle(DOC->title()); }
+ if(this->windowTitle().isEmpty()){ this->setWindowTitle(path.section("/",-1)); }
+ this->setWindowIcon( LXDG::findIcon("application-pdf","unknown"));
+ //Setup the Document
+ Poppler::Page *PAGE = DOC->page(0);
+ if(PAGE!=0){
+ this->printer()->setPageSize( QPageSize(PAGE->pageSize(), QPageSize::Point) );
+ switch(PAGE->orientation()){
+ case Poppler::Page::Landscape:
+ this->printer()->setOrientation(QPrinter::Landscape); break;
+ default:
+ this->printer()->setOrientation(QPrinter::Portrait);
+ }
+ delete PAGE;
+ }
+
+}
+
+void MainUI::done(int val){
+ //This is automatically called with value=1 when the "print()" function finishes
+ //Otherwise close down the application
+ if(val==0){ QApplication::exit(0); }
+}
+
+void MainUI::paintOnWidget(QPrinter *PRINTER){
+ if(DOC==0){ return; }
+ int pages = DOC->numPages();
+ int firstpage = 0;
+ //qDebug() << "Start Rendering PDF:" << PRINTER->fromPage() << PRINTER->toPage();
+ if(PRINTER->fromPage() != PRINTER->toPage() || PRINTER->fromPage()!=0){
+ firstpage = PRINTER->fromPage() - 1;
+ pages = PRINTER->toPage();
+ }
+ qDebug() << " - Generating Pages:" << firstpage << pages;
+ //Now start painting all the pages onto the widget
+ QRectF size = PRINTER->pageRect(QPrinter::DevicePixel);
+ QSize DPI(PRINTER->resolution(),PRINTER->resolution());
+ QPainter painter(PRINTER);
+ Poppler::Page *PAGE = 0;
+ QMessageBox wait(QMessageBox::NoIcon, tr("Opening PDF..."), QString(tr("Preparing Document (%1 pages)")).arg(QString::number(pages)), QMessageBox::Abort, this);
+ wait.setInformativeText(" "); //Make sure the window is the right size before showing it
+ wait.setStandardButtons(QMessageBox::Abort); //make sure that no buttons are used
+ wait.show();
+ for(int i=firstpage; i<pages && wait.isVisible(); i++){
+ wait.setInformativeText( QString(tr("Loading Page: %1")).arg(i+1) );
+ //qDebug() << "Loading Page:" << i;
+ QApplication::processEvents();
+ //Now paint this page on the printer
+ if(PAGE!=0){ delete PAGE; PRINTER->newPage(); } //this is the start of the next page (not needed for first)
+ PAGE = DOC->page(i);
+ if(PAGE!=0){
+ painter.drawImage(0,0,PAGE->renderToImage(DPI.width(), DPI.height()).scaled(size.width(), size.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation) );
+ }else{
+ painter.drawImage(0,0,QImage());
+ }
+ QApplication::processEvents();
+ }
+ if(PAGE!=0){ delete PAGE; }
+ wait.close();
+}
+
+void MainUI::OpenNewFile(){
+ //Prompt for a file
+
+ //Now Open it
+
+}
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..34bbc801
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-pdf/mainUI.h
@@ -0,0 +1,33 @@
+//===========================================
+// 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 <QPrintPreviewDialog>
+#include <QPrinter>
+
+#include <poppler-qt5.h>
+
+class MainUI : public QPrintPreviewDialog{
+ Q_OBJECT
+public:
+ MainUI();
+ ~MainUI();
+
+ void loadFile(QString path);
+
+ virtual void done(int);
+
+private:
+ Poppler::Document *DOC;
+
+private slots:
+ void paintOnWidget(QPrinter *PRINTER);
+ void OpenNewFile();
+
+};
+#endif
bgstack15