diff --git a/bin/hpdf.pro b/bin/hpdf.pro
index 8f52170..9325d7b 100644
--- a/bin/hpdf.pro
+++ b/bin/hpdf.pro
@@ -1,49 +1,30 @@
QT += widgets
-
TEMPLATE = app
-TARGET = hpdf
-DEPENDPATH += .
-INCLUDEPATH += /usr/include/poppler/qt5/
-LIBS += -L/usr/lib -lpoppler-qt5
+TARGET = hpdf
+DEPENDPATH += .
+INCLUDEPATH += /usr/include/poppler/qt5
+LIBS += -L/usr/lib -lpoppler-qt5
-HEADERS += \
- ../src/pdf_factory.h \
- ../src/pdf_page_widget.h \
- ../src/pdf_table_widget.h \
- ../src/pdf_file_widget.h \
- ../src/pdf_jam.h \
- ../src/thumbgen.h \
- ../src/pdf_preview_widget.h
+# Input
+HEADERS += ../src/PDFExportDialog.h \
+ ../src/PDFFactory.h \
+ ../src/PDFFileWidget.h \
+ ../src/PDFJam.h \
+ ../src/PDFPageWidget.h \
+ ../src/PDFPreviewWidget.h \
+ ../src/PDFTableWidget.h \
+ ../src/PreviewGen.h \
+ ../src/ThumbGen.h
-SOURCES += \
- ../src/main.cpp \
- ../src/pdf_factory.cpp \
- ../src/pdf_page_widget.cpp \
- ../src/pdf_table_widget.cpp \
- ../src/pdf_file_widget.cpp \
- ../src/pdf_jam.cpp \
- ../src/thumbgen.cpp \
- ../src/pdf_preview_widget.cpp
+SOURCES += ../src/main.cpp \
+ ../src/PDFExportDialog.cpp \
+ ../src/PDFFactory.cpp \
+ ../src/PDFFileWidget.cpp \
+ ../src/PDFJam.cpp \
+ ../src/PDFPageWidget.cpp \
+ ../src/PDFPreviewWidget.cpp \
+ ../src/PDFTableWidget.cpp \
+ ../src/PreviewGen.cpp \
+ ../src/ThumbGen.cpp
RESOURCES += hpdf.qrc
-
-#CONFIG += console
-
-macx {
- CONFIG(release, debug|release) {
- DESTDIR = ../bin/
- }
-}
-
-win32 {
- CONFIG(release, debug|release) {
- DESTDIR = ../bin/
- }
-}
-
-linux {
- CONFIG(release, debug|release) {
- DESTDIR = ../bin/
- }
-}
-
diff --git a/bin/hpdf.qrc b/bin/hpdf.qrc
index da6679d..114f0b2 100644
--- a/bin/hpdf.qrc
+++ b/bin/hpdf.qrc
@@ -13,5 +13,6 @@
../img/expand.png
../img/remove.png
../img/rotate.png
+ ../img/delete.png
diff --git a/img/collapse.png b/img/collapse.png
index 93cadf8..d31bb94 100644
Binary files a/img/collapse.png and b/img/collapse.png differ
diff --git a/img/expand.png b/img/expand.png
index eb3ad6e..7ab3357 100644
Binary files a/img/expand.png and b/img/expand.png differ
diff --git a/img/export.png b/img/export.png
index 4bf2cba..f69e5ff 100644
Binary files a/img/export.png and b/img/export.png differ
diff --git a/src/PDFExportDialog.cpp b/src/PDFExportDialog.cpp
new file mode 100644
index 0000000..60a137d
--- /dev/null
+++ b/src/PDFExportDialog.cpp
@@ -0,0 +1,229 @@
+#include
+#include
+#include "PDFExportDialog.h"
+
+PDFExportDialog::PDFExportDialog(QWidget *parent) :
+ QDialog(parent) {
+ mainLayout = new QGridLayout();
+ mainLayout->setSpacing(15);
+
+ // File list
+ fileListBox = new QGroupBox("Selected files");
+ QVBoxLayout *fileListLayout = new QVBoxLayout();
+ fileList = new QListWidget();
+ connect(fileList, SIGNAL(currentRowChanged(int)), this, SLOT(fileListChanged(int)));
+ fileListLayout->addWidget(fileList);
+ fileListLayout->setContentsMargins(0, 20, 6, 6);
+ fileListBox->setLayout(fileListLayout);
+ mainLayout->addWidget(fileListBox, 0, 0, 4, 2);
+
+ // is landscape
+ landscapeBox = new QGroupBox("Output orientation");
+ QVBoxLayout *landscapeLayout = new QVBoxLayout();
+ chkPortrait = new QRadioButton("Portrait");
+ chkPortrait->setChecked(true);
+ chkLandscape = new QRadioButton("Landscape");
+ connect(chkLandscape, SIGNAL(toggled(bool)), this, SLOT(chkLandscapeChanged(bool)));
+ landscapeLayout->addWidget(chkPortrait);
+ landscapeLayout->addWidget(chkLandscape);
+ landscapeBox->setLayout(landscapeLayout);
+
+ // n-up
+ nupBox = new QGroupBox("N-up option");
+ nupBox->setCheckable(true);
+ nupBox->setChecked(false);
+ connect(nupBox, SIGNAL(toggled(bool)), this, SLOT(nupBoxToggled(bool)));
+ QGridLayout *nupLayout = new QGridLayout();
+ QLabel *lblRow = new QLabel("Col:");
+ QLabel *lblCol = new QLabel("Row:");
+ txtRow = new QLineEdit("1");
+ connect(txtRow, SIGNAL(textEdited(const QString &)), this, SLOT(txtRowChanged(const QString &)));
+ txtCol = new QLineEdit("1");
+ connect(txtCol, SIGNAL(textEdited(const QString &)), this, SLOT(txtColChanged(const QString &)));
+ nupLayout->addWidget(lblRow, 0, 0, 1, 1);
+ nupLayout->addWidget(txtRow, 0, 1, 1, 2);
+ nupLayout->addWidget(lblCol, 1, 0, 1, 1);
+ nupLayout->addWidget(txtCol, 1, 1, 1, 2);
+ nupBox->setLayout(nupLayout);
+
+ // offsets
+ offsetBox = new QGroupBox("Two-sided offset");
+ offsetBox->setCheckable(true);
+ offsetBox->setChecked(false);
+ connect(offsetBox, SIGNAL(toggled(bool)), this, SLOT(offsetBoxToggled(bool)));
+ QGridLayout *offsetLayout = new QGridLayout();
+ QLabel *lblLeft = new QLabel("Left Offset:");
+ txtLeftOffset = new QLineEdit("0");
+ connect(txtLeftOffset, SIGNAL(textEdited(const QString &)), this, SLOT(txtLeftChanged(const QString &)));
+ offsetLayout->addWidget(lblLeft, 0, 0, 1, 1);
+ offsetLayout->addWidget(txtLeftOffset, 0, 1, 1, 2);
+ offsetBox->setLayout(offsetLayout);
+
+ QVBoxLayout *midLayout = new QVBoxLayout();
+ midLayout->addWidget(landscapeBox);midLayout->addWidget(nupBox);midLayout->addWidget(offsetBox);
+ midLayout->addStretch(1);
+ midLayout->setSpacing(10);
+ QFrame *midFrame = new QFrame();
+ midFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Plain);
+ midFrame->setLayout(midLayout);
+ mainLayout->addWidget(midFrame, 0, 2, 4, 2);
+
+ // buttons
+ QVBoxLayout *rightLayout = new QVBoxLayout();
+ btnSave = new QPushButton("&Export...");
+ connect(btnSave, SIGNAL(clicked()), this, SLOT(btnSaveClicked()));
+ rightLayout->addWidget(btnSave);
+ btnSaveAll = new QPushButton("Export &all files using\nthese settings...");
+ connect(btnSaveAll, SIGNAL(clicked()), this, SLOT(btnSaveAllClicked()));
+ rightLayout->addWidget(btnSaveAll);
+ btnCancel = new QPushButton("&Done");
+ connect(btnCancel, SIGNAL(clicked()), this, SLOT(btnCancelClicked()));
+ rightLayout->addWidget(btnCancel);
+ rightLayout->addStretch(1);
+ mainLayout->addLayout(rightLayout, 0, 4, 2, 1);
+
+ setLayout(mainLayout);
+ setGeometry(400, 400, 800, 450);
+ setWindowTitle("Export to file");
+}
+
+void PDFExportDialog::setFilesToExport(QVector fileWidgets,
+ QVector fileNames,
+ QVector fileIndices) {
+ this->fileWidgets = fileWidgets;
+ this->fileNames = fileNames;
+ this->fileIndices = fileIndices;
+
+ QStringList modelList;
+
+ foreach (const QString str, fileNames) {
+ modelList << str;
+
+ QVector option; // Landscape, row, col, left, right, twosided
+ bool ok;
+ option.append(QVariant(chkLandscape->isChecked()));
+ option.append(QVariant(nupBox->isChecked()));
+ option.append(QVariant(txtRow->text().toInt(&ok)));
+ option.append(QVariant(txtCol->text().toInt(&ok)));
+ option.append(QVariant(offsetBox->isChecked()));
+ option.append(QVariant(txtLeftOffset->text().toInt(&ok)));
+
+ options.append(option);
+ }
+
+ fileList->addItems(modelList);
+}
+
+void PDFExportDialog::btnSaveClicked(void) {
+ int selectedIndex = fileList->currentRow();
+ QVector option = options.at(selectedIndex);
+
+ QString fileName = QFileDialog::getSaveFileName(this,
+ tr("Save PDF file"), ".",
+ tr("PDF file (*.pdf)"));
+ if (!fileName.isEmpty()) {
+ QSize nup;
+ //if (option.at(0).toBool())
+ //nup = QSize(option.at(3).toInt(), option.at(2).toInt());
+ //else
+ nup = QSize(option.at(2).toInt(), option.at(3).toInt());
+
+ pdfJam.exportFile(fileIndices.at(selectedIndex), fileWidgets.at(selectedIndex)->getChildCount(), fileName,
+ option.at(1).toBool(), nup, // nup
+ option.at(0).toBool(), // landscape
+ option.at(4).toBool(), option.at(5).toInt()); //offset
+
+ QMessageBox::information(this, tr("PDFFactory"), tr("Exported succesfully to\n%1.").arg(fileName));
+ }
+}
+
+void PDFExportDialog::btnSaveAllClicked(void) {
+ bool ok;
+ for (int i = 0; i < fileNames.size(); i++) {
+ QString fileName = QFileDialog::getSaveFileName(this,
+ tr("Save PDF file"), ".",
+ tr("PDF file (*.pdf)"));
+
+ QSize nup;
+ //if (chkLandscape->isChecked())
+ //nup = QSize(txtCol->text().toInt(&ok), txtRow->text().toInt(&ok));
+ //else
+ nup = QSize(txtRow->text().toInt(&ok), txtCol->text().toInt(&ok));
+
+ if (!fileName.isEmpty()) {
+ pdfJam.exportFile(fileIndices.at(i), fileWidgets.at(i)->getChildCount(), fileName,
+ nupBox->isChecked(), nup,
+ chkLandscape->isChecked(),
+ offsetBox->isChecked(), txtLeftOffset->text().toInt(&ok));
+ QMessageBox::information(this, tr("PDFFactory"), tr("Exported succesfully to\n%1.").arg(fileName));
+ }
+ }
+}
+
+void PDFExportDialog::btnCancelClicked(void) {
+ accept();
+}
+
+void PDFExportDialog::fileListChanged(int row) {
+ QVector option = options.at(row);
+ chkLandscape->setChecked(option.at(0).toBool());
+ nupBox->setChecked(option.at(1).toBool());
+ txtRow->setText(QString::number(option.at(2).toInt()));
+ txtCol->setText(QString::number(option.at(3).toInt()));
+ offsetBox->setChecked(option.at(4).toBool());
+ txtLeftOffset->setText(QString::number(option.at(5).toInt()));
+}
+
+void PDFExportDialog::txtRowChanged(const QString &txt) {
+ bool ok;
+ QVector option = options.at(fileList->currentRow());
+ option.remove(2);
+ option.insert(2, QVariant(txt.toInt(&ok)));
+ options.remove(fileList->currentRow());
+ options.insert(fileList->currentRow(), option);
+}
+
+void PDFExportDialog::txtColChanged(const QString &txt) {
+ bool ok;
+ QVector option = options.at(fileList->currentRow());
+ option.remove(3);
+ option.insert(3, QVariant(txt.toInt(&ok)));
+ options.remove(fileList->currentRow());
+ options.insert(fileList->currentRow(), option);
+}
+
+void PDFExportDialog::txtLeftChanged(const QString &txt) {
+ bool ok;
+ QVector option = options.at(fileList->currentRow());
+ option.remove(5);
+ option.insert(5, QVariant(txt.toInt(&ok)));
+ options.remove(fileList->currentRow());
+ options.insert(fileList->currentRow(), option);
+}
+
+void PDFExportDialog::chkLandscapeChanged(bool state) {
+ (void) state;
+ QVector option = options.at(fileList->currentRow());
+ option.remove(0);
+ option.insert(0, QVariant(chkLandscape->isChecked()));
+ options.remove(fileList->currentRow());
+ options.insert(fileList->currentRow(), option);
+}
+
+void PDFExportDialog::nupBoxToggled(bool checked) {
+ (void) checked;
+ QVector option = options.at(fileList->currentRow());
+ option.remove(1);
+ option.insert(1, QVariant(nupBox->isChecked()));
+ options.remove(fileList->currentRow());
+ options.insert(fileList->currentRow(), option);
+}
+
+void PDFExportDialog::offsetBoxToggled(bool checked) {
+ (void) checked;
+ QVector option = options.at(fileList->currentRow());
+ option.remove(4);
+ option.insert(4, QVariant(offsetBox->isChecked()));
+ options.remove(fileList->currentRow());
+ options.insert(fileList->currentRow(), option);
+}
diff --git a/src/PDFExportDialog.h b/src/PDFExportDialog.h
new file mode 100644
index 0000000..87eed5b
--- /dev/null
+++ b/src/PDFExportDialog.h
@@ -0,0 +1,50 @@
+#pragma once
+#include
+#include "PDFFileWidget.h"
+#include "PDFJam.h"
+
+class QGridLayout;
+class QGroupBox;
+class QListWidget;
+class QLineEdit;
+class QRadioButton;
+
+class PDFExportDialog : public QDialog {
+ Q_OBJECT
+
+public:
+ explicit PDFExportDialog(QWidget *parent = 0);
+
+private:
+ QVector fileWidgets;
+ QVector fileNames;
+ QVector fileIndices;
+ QVector > options;
+
+private:
+ PDFJam pdfJam;
+ QGroupBox *fileListBox, *landscapeBox, *nupBox, *offsetBox;
+
+ QPushButton *btnSave, *btnSaveAll, *btnCancel;
+ QGridLayout *mainLayout;
+
+ QListWidget *fileList;
+ QLineEdit *txtRow, *txtCol;
+ QRadioButton *chkPortrait, *chkLandscape;
+ QLineEdit *txtLeftOffset;
+
+public:
+ void setFilesToExport(QVector fileWidgets, QVector fileNames, QVector fileIndices);
+
+private slots:
+ void fileListChanged(int);
+ void btnSaveClicked(void);
+ void btnSaveAllClicked(void);
+ void btnCancelClicked(void);
+ void txtRowChanged(const QString &);
+ void txtColChanged(const QString &);
+ void txtLeftChanged(const QString &);
+ void chkLandscapeChanged(bool);
+ void nupBoxToggled(bool);
+ void offsetBoxToggled(bool);
+};
diff --git a/src/PDFFactory.cpp b/src/PDFFactory.cpp
new file mode 100644
index 0000000..fa30f5b
--- /dev/null
+++ b/src/PDFFactory.cpp
@@ -0,0 +1,218 @@
+#include
+#include
+#include "PDFFactory.h"
+#include "PDFExportDialog.h"
+#include "PDFTableWidget.h"
+#include "PDFPreviewWidget.h"
+#include "PDFPageWidget.h"
+
+PDFFactory::PDFFactory()
+{
+ createWidgets();
+ createActions();
+ createToolBars();
+ createRibbon();
+ createStatusBar();
+}
+
+void PDFFactory::createWidgets()
+{
+ // Set central widget to be the container root
+ centralWidget = new QWidget();
+ QVBoxLayout *layout = new QVBoxLayout();
+ layout->setContentsMargins(2,2,2,2);
+ centralWidget->setLayout(layout);
+ setCentralWidget(centralWidget);
+
+ // Create ribbon
+ ribbon = new QTabWidget();
+ ribbon->addTab(new QWidget(), tr("File"));
+ ribbon->addTab(new QWidget(), tr("Edit"));
+ ribbon->addTab(new QWidget(), tr("Tools"));
+ ribbon->addTab(new QWidget(), tr("Help"));
+ ribbon->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ ribbon->setFixedHeight(100);
+ layout->addWidget(ribbon);
+
+ // Create main area (table)
+
+ pdfTableView = new PDFTableWidget();
+ pdfPreview = new PDFPreviewWidget();
+ pdfPreview->setMinimumWidth(100);
+ splitter = new QSplitter();
+ splitter->setOrientation(Qt::Horizontal);
+ splitter->addWidget(pdfTableView);
+ splitter->addWidget(pdfPreview);
+ QList splitterWidgetSizes;
+ splitterWidgetSizes << 200 << 1000;
+ splitter->setSizes(splitterWidgetSizes);
+ splitter->setStretchFactor(0, 1);
+ splitter->setStretchFactor(1, 0.5);
+ layout->addWidget(splitter);
+
+ connect(pdfTableView, SIGNAL(previewUpdate(Poppler::Page*, Poppler::Page::Rotation)), pdfPreview, SLOT(previewUpdate(Poppler::Page*, Poppler::Page::Rotation)));
+ connect(pdfTableView, SIGNAL(checkPreviewUpdate(Poppler::Page*, Poppler::Page::Rotation)), pdfPreview, SLOT(checkPreviewUpdate(Poppler::Page*, Poppler::Page::Rotation)));
+ connect(pdfTableView, SIGNAL(checkPagePreviewExisted(Poppler::Page*)), pdfPreview, SLOT(checkPagePreviewExisted(Poppler::Page*)));
+
+ setWindowIcon(QIcon(":/img/hpdf.png"));
+ setWindowTitle(tr("PDF Factory"));
+ setGeometry(0, 0, 1300, 650);
+}
+
+
+void PDFFactory::createActions()
+{
+ openAction = new QAction(tr("&Open"), this);
+ openAction->setIcon(QIcon(":/img/open.png"));
+ openAction->setShortcut(tr("Ctrl+O"));
+ openAction->setStatusTip(tr("Open a PDF"));
+ connect(openAction, SIGNAL(triggered()), this, SLOT(openFile()));
+
+ exportAction = new QAction(tr("&Export a single file"), this);
+ exportAction->setIcon(QIcon(":/img/export.png"));
+ exportAction->setShortcut(tr("Ctrl+S"));
+ exportAction->setStatusTip(tr("Export the selected file to a new PDF"));
+ connect(exportAction, SIGNAL(triggered()), this, SLOT(exportFile()));
+
+ exportAllAction = new QAction(tr("Export all"), this);
+ exportAllAction->setIcon(QIcon(":/img/exportall.png"));
+ exportAllAction->setShortcut(tr("Shift+Ctrl+S"));
+ exportAllAction->setStatusTip(tr("Export all to multiple PDF files"));
+ connect(exportAllAction, SIGNAL(triggered()), this, SLOT(exportAllFiles()));
+
+ cutAction = new QAction(tr("C&ut"), this);
+ cutAction->setIcon(QIcon(":/img/cut.png"));
+ cutAction->setShortcut(tr("Ctrl+X"));
+ cutAction->setStatusTip(tr("Cut selected contents to clipboard"));
+ connect(cutAction, SIGNAL(triggered()), pdfTableView, SLOT(cutSelected()));
+
+ copyAction = new QAction(tr("&Copy"), this);
+ copyAction->setIcon(QIcon(":/img/copy.png"));
+ copyAction->setShortcut(tr("Ctrl+C"));
+ copyAction->setStatusTip(tr("Copy selected contents to clipboard"));
+ connect(copyAction, SIGNAL(triggered()), pdfTableView, SLOT(copySelected()));
+
+ pasteAction = new QAction(tr("&Paste"), this);
+ pasteAction->setIcon(QIcon(":/img/paste.png"));
+ pasteAction->setShortcut(tr("Ctrl+V"));
+ pasteAction->setStatusTip(tr("Paste clipboard's contents into current selection"));
+ //connect(pasteAction, SIGNAL(triggered()), textEdit, SLOT(paste()));
+
+ deleteAction = new QAction(tr("&Delete"), this);
+ deleteAction->setIcon(QIcon(":/img/delete.png"));
+ deleteAction->setShortcut(tr("Ctrl+D"));
+ deleteAction->setStatusTip(tr("Delete selected contents"));
+ connect(deleteAction, SIGNAL(triggered()), pdfTableView, SLOT(deleteSelected()));
+
+ rotateAction = new QAction(tr("&Rotate"), this);
+ rotateAction->setIcon(QIcon(":/img/rotate.png"));
+ rotateAction->setShortcut(tr("Ctrl+R"));
+ rotateAction->setStatusTip(tr("Rotate selected pages"));
+ connect(rotateAction, SIGNAL(triggered()), pdfTableView, SLOT(rotateSelected()));
+
+ aboutAction = new QAction(tr("A&bout"), this);
+ aboutAction->setIcon(QIcon(":/img/about.png"));
+ aboutAction->setStatusTip(tr("About this program"));
+ connect(aboutAction, SIGNAL(triggered()), this, SLOT(about()));
+}
+
+void PDFFactory::createToolBars()
+{
+ fileToolBar = new QToolBar(tr("File"));
+ fileToolBar->addAction(openAction);
+ fileToolBar->addAction(exportAction);
+ fileToolBar->addAction(exportAllAction);
+ fileToolBar->setIconSize(QSize(48, 48));
+
+ editToolBar = new QToolBar(tr("Edit"));
+ editToolBar->addAction(cutAction);
+ editToolBar->addAction(copyAction);
+ editToolBar->addAction(pasteAction);
+ editToolBar->addSeparator();
+ editToolBar->addAction(deleteAction);
+ editToolBar->setIconSize(QSize(48, 48));
+
+ toolsToolBar = new QToolBar(tr("Tools"));
+ toolsToolBar->addAction(rotateAction);
+ toolsToolBar->setIconSize(QSize(48, 48));
+
+ helpToolBar = new QToolBar(tr("Help"));
+ helpToolBar->addAction(aboutAction);
+ helpToolBar->setIconSize(QSize(48, 48));
+}
+
+void PDFFactory::createRibbon()
+{
+ QWidget *tabFile = ribbon->widget(0);
+ QVBoxLayout *layoutTabFile = new QVBoxLayout();
+ layoutTabFile->setContentsMargins(2,0,2,0);
+ layoutTabFile->addWidget(fileToolBar);
+ tabFile->setLayout(layoutTabFile);
+
+ QWidget *tabEdit = ribbon->widget(1);
+ QVBoxLayout *layoutTabEdit = new QVBoxLayout();
+ layoutTabEdit->setContentsMargins(2,0,2,0);
+ layoutTabEdit->addWidget(editToolBar);
+ tabEdit->setLayout(layoutTabEdit);
+
+ QWidget *tabTools = ribbon->widget(2);
+ QVBoxLayout *layoutTabTools = new QVBoxLayout();
+ layoutTabTools->setContentsMargins(2,0,2,0);
+ layoutTabTools->addWidget(toolsToolBar);
+ tabTools->setLayout(layoutTabTools);
+
+ QWidget *tabHelp = ribbon->widget(3);
+ QVBoxLayout *layoutTabHelp = new QVBoxLayout();
+ layoutTabHelp->setContentsMargins(2,0,2,0);
+ layoutTabHelp->addWidget(helpToolBar);
+ tabHelp->setLayout(layoutTabHelp);
+}
+
+void PDFFactory::createStatusBar()
+{
+ statusBar()->showMessage(tr(""));
+}
+
+void PDFFactory::openFile(void) {
+ QStringList fileNames = QFileDialog::getOpenFileNames(this,
+ tr("Open PDF file"), ".",
+ tr("PDF file (*.pdf)"));
+
+ for (int i = 0; i < fileNames.size(); i++) {
+ QString fileName = fileNames.at(i);
+ if (!fileName.isEmpty()) {
+ pdfTableView->loadFile(fileName);
+ }
+ }
+}
+
+void PDFFactory::exportFile(void) {
+ PDFExportDialog *exportDialog = new PDFExportDialog();
+
+ QVector selectedFiles = pdfTableView->getSelectedFiles();
+ if (selectedFiles.size() > 0) {
+ exportDialog->setFilesToExport(selectedFiles, pdfTableView->getSelectedFileNames(), pdfTableView->getSelectedIndices());
+ exportDialog->show();
+ }
+}
+
+void PDFFactory::exportAllFiles(void) {
+ PDFExportDialog *exportDialog = new PDFExportDialog();
+
+ QVector visibleFiles = pdfTableView->getVisibleFiles();
+
+ if (visibleFiles.size() > 0) {
+ exportDialog->setFilesToExport(visibleFiles, pdfTableView->getVisibleFileNames(), pdfTableView->getVisibleIndices());
+ exportDialog->show();
+ }
+}
+
+void PDFFactory::about(void) {
+ QMessageBox::information(this, tr("PDFFactory"), tr("HPDF (Harringtons PDF) "
+ "version 0.1.0\nWritten by: Ritchie Cunningham\n\n"
+ "HPDF is primarily a PDF viewer with the prospect of becoming a full "
+ "featured PDF editor.\n\n"
+ "This software is unique in the fact that it automates tasks "
+ "unique to Harringtons Advisory.\n\n"
+ "Need support? Email customerservice@sccsolutions.biz"));
+}
diff --git a/src/PDFFactory.h b/src/PDFFactory.h
new file mode 100644
index 0000000..e5086df
--- /dev/null
+++ b/src/PDFFactory.h
@@ -0,0 +1,55 @@
+#pragma once
+#include
+
+class PDFTableWidget;
+class PDFPreviewWidget;
+
+class QAction;
+class QWidget;
+class QTabWidget;
+class QScrollArea;
+class QSplitter;
+class QToolBar;
+
+class PDFFactory: public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ PDFFactory();
+
+private slots:
+ void openFile(void);
+ void exportFile(void);
+ void exportAllFiles(void);
+ void about(void);
+
+private:
+ void createWidgets(void);
+ void createActions(void);
+ void createToolBars(void);
+ void createRibbon(void);
+ void createStatusBar(void);
+
+ QAction *openAction;
+ QAction *exportAction;
+ QAction *exportAllAction;
+ QAction *cutAction;
+ QAction *copyAction;
+ QAction *pasteAction;
+ QAction *deleteAction;
+ QAction *rotateAction;
+ QAction *aboutAction;
+
+ QWidget *centralWidget;
+
+ QTabWidget *ribbon;
+ QSplitter *splitter;
+ PDFTableWidget *pdfTableView;
+ PDFPreviewWidget *pdfPreview;
+
+ QToolBar *fileToolBar;
+ QToolBar *editToolBar;
+ QToolBar *toolsToolBar;
+ QToolBar *helpToolBar;
+};
diff --git a/src/PDFFileWidget.cpp b/src/PDFFileWidget.cpp
new file mode 100644
index 0000000..df23fa7
--- /dev/null
+++ b/src/PDFFileWidget.cpp
@@ -0,0 +1,232 @@
+#include
+#include
+
+#include "PDFFileWidget.h"
+#include "PDFPageWidget.h"
+#include "PDFTableWidget.h"
+
+#define COLLAPSE_BUTTON_WIDTH 32
+#define COLLAPSE_BUTTON_HEIGHT 32
+
+#define CHILD_AREA_WIDTH 150
+#define CHILD_AREA_HEIGHT 150
+#define CHILD_AREA_SIDE_MARGIN 20
+
+#define DEFAULT_CHILD_SIZE 169
+
+PagesContainerWidget::PagesContainerWidget(QWidget *parent) {
+ (void) parent;
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ setAcceptDrops(true);
+ mainLayout = new QHBoxLayout();
+
+ this->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(this, SIGNAL(customContextMenuRequested(const QPoint&)),
+ this, SLOT(ShowContextMenu(const QPoint&)));
+
+ setLayout(mainLayout);
+}
+
+void PagesContainerWidget::ShowContextMenu(const QPoint& pos){
+ if (((PDFTableWidget*)ancestor)->hasClipboard()){
+ QPoint globalPos = this->mapToGlobal(pos);
+
+ QMenu myMenu;
+ myMenu.addAction(QIcon(":/img/remove.png"), "Paste");
+
+ QAction* selectedItem = myMenu.exec(globalPos);
+ if (selectedItem)
+ {
+ int page;
+
+ if (pageWidgets.size()>=2)
+ page = (pos.x() / (pageWidgets.at(1)->geometry().x() -
+ pageWidgets.at(0)->geometry().x()) );
+ else
+ page = (pos.x() / DEFAULT_CHILD_SIZE );
+
+
+ PDFTableWidget *tableview = (PDFTableWidget*) ancestor;
+ tableview->pastePage((PDFFileWidget*)father, page);
+ }
+ }
+
+}
+int PagesContainerWidget::getPagesCount() const {
+ return pageWidgets.size();
+}
+
+QSize PagesContainerWidget::sizeHint() const {
+ QSize temp = QSize((CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH) * getPagesCount(), CHILD_AREA_HEIGHT + 30);
+ return temp;
+}
+
+void PagesContainerWidget::addPageWidget(PDFPageWidget *pageWidget){
+ pageWidgets.append(pageWidget);
+ mainLayout->addWidget(pageWidget);
+ adjustSize();
+}
+
+void PagesContainerWidget::dragEnterEvent(QDragEnterEvent *event) {
+ event->acceptProposedAction();
+}
+
+void PagesContainerWidget::dropEvent(QDropEvent *event) {
+ QPoint pos = event->pos();
+ int page = (pos.x() / (CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH));
+ ((PDFTableWidget*)ancestor)->moveSelectedPages(event->mimeData()->text() , pageWidgets.at(page));
+ event->acceptProposedAction();
+}
+
+// ======================================================================
+
+PDFFileWidget::PDFFileWidget(QWidget *parent):QFrame(parent){
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ setFrameStyle(QFrame::Box);
+
+ topLayout = new QGridLayout();
+
+ collapseButton = new QPushButton();
+ collapseButton->resize(QSize(COLLAPSE_BUTTON_WIDTH,COLLAPSE_BUTTON_HEIGHT));
+ collapseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ collapseButton->setIcon(QIcon(":/img/collapse.png"));
+ connect(collapseButton, SIGNAL(released()), this, SLOT(collapsedButtonClicked()));
+ topLayout->addWidget(collapseButton, 0, 0);
+
+ fileNameLabel = new QLabel();
+ fileNameLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ topLayout->addWidget(fileNameLabel, 0, 1);
+
+ removeButton = new QPushButton();
+ removeButton->resize(QSize(COLLAPSE_BUTTON_WIDTH,COLLAPSE_BUTTON_HEIGHT));
+ removeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ removeButton->setIcon(QIcon(":/img/remove.png"));
+ connect(removeButton, SIGNAL(released()), this, SLOT(removeButtonClicked()));
+ topLayout->addWidget(removeButton, 0, 2);
+
+ pagesContainerWidget = new PagesContainerWidget();
+ pagesContainerWidget->setFather(this);
+ scrollArea = new QScrollArea();
+ scrollArea->setWidget(pagesContainerWidget);
+ scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
+ topLayout->addWidget(scrollArea, 1, 0, 1, 3);
+
+ topLayout->setContentsMargins(6, 10, 6, 10);
+ setLayout(topLayout);
+
+ setCollapsed(false);
+ selected = false;
+
+ connect(&tgen, SIGNAL(updateThumbnail(QImage,PDFPageWidget*)), this, SLOT(updateThumbnail(QImage,PDFPageWidget*)));
+}
+
+void PDFFileWidget::setAncestor(QWidget* ancestor) {
+ this->ancestor = ancestor;
+ pagesContainerWidget->setAncestor(ancestor);
+ connect(this, SIGNAL(fileClicked(PDFFileWidget*, QMouseEvent*)), ancestor, SLOT(fileClicked(PDFFileWidget*, QMouseEvent*)));
+}
+
+void PDFFileWidget::setSelected(bool select) {
+ selected = select;
+ update();
+}
+
+void PDFFileWidget::mousePressEvent(QMouseEvent *event) {
+ emit fileClicked(this, event);
+}
+
+void PDFFileWidget::paintEvent(QPaintEvent *event) {
+ QPalette palette = this->palette();
+ QPalette labelPalette = fileNameLabel->palette();
+ if (selected) {
+ palette.setColor( foregroundRole(), palette.color(QPalette::Highlight) );
+ labelPalette.setColor( foregroundRole(), palette.color(QPalette::Highlight) );
+ } else {
+ palette.setColor( foregroundRole(), palette.color(QPalette::Dark) );
+ labelPalette.setColor( foregroundRole(), palette.color(QPalette::Text) );
+ }
+ this->setPalette(palette);
+ fileNameLabel->setPalette(labelPalette);
+
+ QFrame::paintEvent(event);
+}
+
+void PDFFileWidget::updateThumbnail(QImage img, PDFPageWidget* pageWidget){
+ pageWidget->setThumbnail(img);
+}
+
+void PDFFileWidget::setCollapsed(bool state){
+ collapsed = state;
+ if (state == true) {
+ scrollArea->hide();
+ collapseButton->setIcon(QIcon(":/img/expand.png"));
+ } else {
+ scrollArea->show();
+ collapseButton->setIcon(QIcon(":/img/collapse.png"));
+ }
+}
+
+void PDFFileWidget::collapsedButtonClicked(){
+ setCollapsed(!collapsed);
+}
+
+void PDFFileWidget::removeButtonClicked() {
+ emit fileRemoveButtonClicked(this);
+}
+
+void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName){
+ document->setRenderHint(Poppler::Document::TextAntialiasing);
+ Poppler::Document *previewDoc = Poppler::Document::load(fileName);
+ previewDoc->setRenderHint(Poppler::Document::TextAntialiasing);
+ Poppler::Document *thumbDoc = Poppler::Document::load(fileName);
+ thumbDoc->setRenderHint(Poppler::Document::TextAntialiasing);
+
+ int numPages = document -> numPages();
+ for (int i = 0; i < numPages; i++){
+ Poppler::Page *pdfPage = document->page(i);
+
+ PDFPageWidget *pageWidget = new PDFPageWidget();
+
+ pageWidget->setAncestor(ancestor);
+ pageWidget->setFather(this);
+ pageWidget->setPopplerPage(previewDoc->page(i));
+ pageWidget->setThumbPopplerPage(thumbDoc->page(i));
+ pageWidget->setOriginInfo(fileName,i);
+ tgen.render(pageWidget,pdfPage);
+
+ pagesContainerWidget->addPageWidget(pageWidget);
+ }
+ tgen.start();
+
+ fileNameLabel->setText(fileName);
+}
+
+int PDFFileWidget::removeChild(PDFPageWidget* child){
+ int pos = pagesContainerWidget->pageWidgets.indexOf(child);
+ pagesContainerWidget->pageWidgets.remove(pos);
+ pagesContainerWidget->mainLayout->removeWidget(child);
+ child->hide();
+ //pagesContainerWidget->mainLayout->removeItem(pagesContainerWidget->mainLayout->itemAt(pos));
+
+ pagesContainerWidget->adjustSize();
+ return pos;
+}
+
+int PDFFileWidget::indexChild(PDFPageWidget* child){
+ return pagesContainerWidget->pageWidgets.indexOf(child);
+}
+
+void PDFFileWidget::insertChildAt(PDFPageWidget* child, int pos){
+ child->setFather(this);
+ pagesContainerWidget->mainLayout->insertWidget(pos, child);
+ pagesContainerWidget->pageWidgets.insert(pos,child);
+ tgen.render(child,child->getNewThumbPopplerPage());
+ tgen.start();
+ child->show();
+
+ pagesContainerWidget->adjustSize();
+}
+
+int PDFFileWidget::getChildCount() {
+ return pagesContainerWidget->getPagesCount();
+}
diff --git a/src/PDFFileWidget.h b/src/PDFFileWidget.h
new file mode 100644
index 0000000..32d3458
--- /dev/null
+++ b/src/PDFFileWidget.h
@@ -0,0 +1,102 @@
+#pragma once
+#include
+#include "ThumbGen.h"
+
+#include
+#include
+
+class QImage;
+class QHBoxLayout;
+class QGridLayout;
+class QScrollArea;
+class QPushButton;
+class QLabel;
+class QString;
+class QSize;
+class QPoint;
+class QDragEnterEvent;
+class QDropEvent;
+class QMouseEvent;
+class QPaintEvent;
+class ThumbGen;
+
+class PDFPageWidget;
+
+class PagesContainerWidget : public QWidget {
+
+ Q_OBJECT
+
+public:
+ PagesContainerWidget(QWidget *parent = 0);
+ QSize sizeHint() const;
+ QVector pageWidgets;
+ QHBoxLayout *mainLayout;
+
+ void addPageWidget(PDFPageWidget *pageWidget);
+ void setAncestor(QWidget* ancestor){ this-> ancestor = ancestor;}
+ void setFather(QWidget* father){this->father = father;}
+ int getPagesCount() const;
+ QWidget* getFather(){return father;}
+
+protected:
+ void dragEnterEvent(QDragEnterEvent *event);
+ void dropEvent(QDropEvent *event);
+
+private:
+ QWidget *ancestor;
+ QWidget *father;
+private slots:
+ void ShowContextMenu(const QPoint&);
+};
+
+// ========================================
+
+class PDFFileWidget : public QFrame {
+
+ Q_OBJECT
+ Q_PROPERTY(bool collapsed READ isCollapsed WRITE setCollapsed)
+
+public:
+ PDFFileWidget(QWidget *parent = 0);
+
+public:
+ void setAncestor(QWidget* ancestor);
+ void setDocument(Poppler::Document* document, QString fileName);
+ int removeChild(PDFPageWidget* child);
+ int indexChild(PDFPageWidget* child);
+ void insertChildAt(PDFPageWidget* child, int pos);
+ int getChildCount();
+
+ void setSelected(bool select);
+ bool isSelected() {return selected;}
+ bool isCollapsed(){ return collapsed; }
+ void setCollapsed(bool collapsed);
+
+protected:
+ void mousePressEvent(QMouseEvent *event);
+ void paintEvent(QPaintEvent *event);
+
+private slots:
+ void removeButtonClicked(void);
+ void collapsedButtonClicked(void);
+ void updateThumbnail(QImage,PDFPageWidget*);
+
+public :
+ PagesContainerWidget *pagesContainerWidget;
+private:
+ ThumbGen tgen;
+ QGridLayout *topLayout;
+
+ QLabel *fileNameLabel;
+ QPushButton *collapseButton;
+ QPushButton *removeButton;
+ QScrollArea *scrollArea;
+ QWidget *ancestor;
+
+ bool collapsed;
+ bool selected;
+
+signals:
+ void fileRemoveButtonClicked(PDFFileWidget*);
+ void fileClicked(PDFFileWidget*, QMouseEvent*);
+};
diff --git a/src/PDFJam.cpp b/src/PDFJam.cpp
new file mode 100644
index 0000000..ac5c740
--- /dev/null
+++ b/src/PDFJam.cpp
@@ -0,0 +1,183 @@
+#include
+#include
+#include
+#include "stdlib.h"
+#include "PDFJam.h"
+
+PDFJam::PDFJam()
+{
+
+}
+//to make sure this folder exists and has no file inside
+void PDFJam::makeCleanFolder(QString path){
+ QString temp = "mkdir -p %1 && rm %2*";
+ int value = system(temp.arg(path).arg(path).toStdString().c_str());
+}
+
+void PDFJam::pushCommand(QString cmd){
+ mutex.lock();
+ cmdQueue.push_back(cmd);
+ mutex.unlock();
+ if(!isRunning()) start();
+
+}
+//to rotate a page in a pdf file, clockwise direction
+bool PDFJam::rotatePage(int fileIndex,int rotatedPageIndex,int degree){
+ if ((degree!=90) && (degree!=180) && (degree!=270)){
+ return false;
+ }
+
+ QString rtTemp = "pdf%1 /tmp/pdffactory/%2/%3.pdf --outfile /tmp/pdffactory/%4/%5.pdf ";
+ QString cmd = rtTemp.arg(QString::number(degree)).arg(QString::number(fileIndex)).arg(QString::number(rotatedPageIndex)).arg(QString::number(fileIndex)).arg(QString::number(rotatedPageIndex));
+ pushCommand(cmd);
+
+}
+
+//to remove a page in a pdf file
+bool PDFJam::removePage(int fileIndex,int numPages, int deletedPageIndex){
+ if ((deletedPageIndex<0)||(deletedPageIndex>=numPages)) {
+ return false;
+ }
+ //QString temp = "file1.pdf '-' file2.pdf '1,2' file3.pdf '2-' --outfile output.pdf"
+ QString rmTemp = "rm /tmp/pdffactory/%1/%2.pdf ";
+ QString cmd = rmTemp.arg(QString::number(fileIndex)).arg(QString::number(deletedPageIndex));
+ QString temp = "mv /tmp/pdffactory/%1/%2.pdf /tmp/pdffactory/%3/%4.pdf ";
+
+
+
+ for (int i = deletedPageIndex+1; i < numPages; i++) {
+ cmd += "&& " + temp.arg(QString::number(fileIndex)).arg(QString::number(i)).arg(QString::number(fileIndex)).arg(QString::number(i-1));
+ }
+ pushCommand(cmd);
+
+}
+void PDFJam::cutPage(int fileIndex,int numPages, int pageIndex,int slot=0) {
+ qDebug()<<"cuting page"<=numPages)) {
+ return ;
+ }
+
+ copyPage(fileIndex,pageIndex,slot);
+ removePage(fileIndex,numPages,pageIndex);
+
+}
+void PDFJam::copyPage(int fileIndex,int pageIndex,int slot=0){
+ QString cpTemp = "cp /tmp/pdffactory/%1/%2.pdf /tmp/pdffactory/clipboard%3.pdf";
+ QString cmd = cpTemp.arg(QString::number(fileIndex)).arg(QString::number(pageIndex)).arg(QString::number(slot));
+ pushCommand(cmd);
+}
+void PDFJam::pastePage(int fileIndex,int numPages, int pageIndex, int slot=0){
+ QString cmd = "";
+ QString mvTemp = "mv /tmp/pdffactory/%1/%2.pdf /tmp/pdffactory/%3/%4.pdf ";
+ for (int i = numPages-1; i >= pageIndex; i--) {
+ cmd += mvTemp.arg(QString::number(fileIndex)).arg(QString::number(i)).arg(QString::number(fileIndex)).arg(QString::number(i+1));
+ if (i>pageIndex) cmd+=" && ";
+ }
+
+ QString pasteTemp = "cp /tmp/pdffactory/clipboard%1.pdf /tmp/pdffactory/%2/%3.pdf ";
+ cmd += " && " + pasteTemp.arg(QString::number(slot)).arg(QString::number(fileIndex)).arg(QString::number(pageIndex));
+ pushCommand(cmd);
+
+}
+void PDFJam::movePage(int fromFileIndex, int fromFileNumPage, int fromPageIndex, int toFileIndex, int toFileNumPage, int toPageIndex ){
+ //TODO:back up clipboard
+
+ //if this is page moving within files, update file Index.
+ if (toFileIndex == fromFileIndex) {
+ toFileNumPage--;
+ if(toPageIndex>fromPageIndex)
+ toPageIndex--;
+ toPageIndex--;
+ }
+ cutPage(fromFileIndex,fromFileNumPage,fromPageIndex,0);
+ pastePage(toFileIndex,toFileNumPage,toPageIndex,0);
+}
+void PDFJam::savePageAsImage(Poppler::Page pp, QString dest,double dpi = 72){
+ (void)pp;
+ (void)dest;
+ (void)dpi;
+}
+//to export file number "fileIndex" to destination
+//support n-up, orientation, offset options
+void PDFJam::exportFile(int fileIndex,int numPages, QString dest, bool isNup,QSize nup, bool isLandscape , bool hasTwoSidedOffset, int leftOffset){
+
+ QString cmd = "pdfjam ";
+ QString temp = "/tmp/pdffactory/%1/%2.pdf '-' ";
+
+ for (int i = 0; i < numPages; i++) {
+ cmd += temp.arg(QString::number(fileIndex)).arg(QString::number(i));
+ }
+ QString orientation = isLandscape?" --landscape ": " --no-landscape ";
+ cmd += orientation;
+
+ if (isNup) {
+ QString nupTemp = " --nup '%1x%2' --frame true ";
+ cmd += nupTemp.arg(QString::number(nup.width())).arg(QString::number(nup.height()));
+ }
+ //offset
+ if(hasTwoSidedOffset){
+ //pipe to another pdfjam to do offset, after other things are done
+ QString outStdout = " --outfile /dev/stdout | pdfjam ";
+ cmd += outStdout.arg(dest);
+
+ cmd+=" --twoside ";
+ QString offsetTemp =" --offset \"%1cm 0cm\" ";
+ cmd+=offsetTemp.arg(QString::number(leftOffset));
+
+ //TODO - extension: 2 orientations, this one is after n-up, can extend later
+ QString orientation = isLandscape?" --landscape ": " --no-landscape ";
+ cmd += orientation;
+
+ }
+
+ QString outTemp = " --outfile %1 ";
+ cmd += outTemp.arg(dest);
+ pushCommand(cmd);
+
+
+}
+
+void PDFJam::loadFile(QString fileName, int fileIndex,Poppler::Document* pd){
+ int numPages = pd->numPages();
+ QString path= "/tmp/pdffactory/%1/";
+ path = path.arg(QString::number(fileIndex));
+ makeCleanFolder(path);
+
+ QString temp = "pdfjam %1 %2 --outfile %3%4.pdf %5";
+ QString cmd="";
+ for (int i = 0; i < numPages; i++) {
+ QString orientation = " --no-landscape ";
+ QSizeF pageSize = pd->page(i)->pageSizeF();
+ if(pageSize.width() > pageSize.height()){
+ orientation = " --landscape ";
+ }
+ cmd += temp.arg(fileName).arg(QString::number(i+1)).arg(path).arg(QString::number(i)).arg(orientation) + " ; ";
+ }
+ pushCommand(cmd);
+}
+QString PDFJam::nextCommand(){
+
+ QString cmd;
+
+ mutex.lock();
+ cmd = cmdQueue.first();
+ cmdQueue.pop_front();
+ mutex.unlock();
+
+ return cmd;
+}
+bool PDFJam::isQueueEmpty(){
+ return (cmdQueue.size()==0);
+}
+
+void PDFJam::run(){
+ while(!isQueueEmpty()){
+ QString cmd = nextCommand();
+ //int value = system(cmd.toStdString().c_str());
+
+ //if(value)
+ //qDebug() << "ERROR: Failed to execute " << cmd;
+ //else
+ //qDebug() << "SUCCESS: executed " << cmd;
+ }
+}
diff --git a/src/PDFJam.h b/src/PDFJam.h
new file mode 100644
index 0000000..598fe9d
--- /dev/null
+++ b/src/PDFJam.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include
+#include
+#include
+#include
+class PDFPageWidget;
+class QImage;
+
+class PDFJam: public QThread
+{
+ Q_OBJECT
+public:
+ PDFJam();
+ void pushCommand(QString);
+ void loadFile(QString fileName,int,Poppler::Document*);
+ void exportFile(int ,int , QString , bool ,QSize , bool , bool , int );
+
+ void savePageAsImage(Poppler::Page pp, QString dest, double);
+ void movePage(int , int , int , int , int , int );
+
+ void pastePage(int ,int , int ,int);
+ void copyPage(int , int , int );
+ void cutPage(int ,int , int ,int);
+
+ bool removePage(int ,int , int );
+ bool rotatePage(int,int,int);
+protected:
+ void run();
+private:
+ void makeCleanFolder(QString);
+ QVector cmdQueue;
+ QString nextCommand();
+ bool isQueueEmpty();
+ QMutex mutex;
+
+};
diff --git a/src/PDFPageWidget.cpp b/src/PDFPageWidget.cpp
new file mode 100644
index 0000000..4392e4a
--- /dev/null
+++ b/src/PDFPageWidget.cpp
@@ -0,0 +1,187 @@
+#include
+#include
+#include "ThumbGen.h"
+#include "PDFPageWidget.h"
+#include "PDFTableWidget.h"
+
+#define PAGE_WIDTH 150
+#define PAGE_HEIGHT 150
+
+PDFPageWidget::PDFPageWidget(QWidget *parent) :
+ QFrame(parent)
+{
+ selected = false;
+ rotation = 0;
+ setAcceptDrops(true);
+
+ this->resize(PAGE_WIDTH, PAGE_HEIGHT);
+ this->setMinimumSize(PAGE_WIDTH, PAGE_HEIGHT);
+ this->setMaximumSize(PAGE_WIDTH, PAGE_HEIGHT);
+ this->setAutoFillBackground(true);
+
+ this->setMouseTracking(true);
+ this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+
+ QHBoxLayout *topHBox = new QHBoxLayout();
+ btnRotate = new QPushButton("", this);
+ btnRotate->setObjectName("rotate");
+ btnRotate->setIcon(QPixmap::fromImage(QImage(":/img/rotate.png")));
+ btnRotate->hide();
+ topHBox->addWidget(btnRotate, 0, Qt::AlignLeft);
+
+ btnDelete = new QPushButton("", this);
+ btnDelete->setObjectName("rotate");
+ btnDelete->setIcon(QPixmap::fromImage(QImage(":/img/remove.png")));
+ btnDelete->hide();
+ topHBox->addWidget(btnDelete, 1, Qt::AlignRight);
+
+ QHBoxLayout *bottomHBox = new QHBoxLayout();
+ btnCut = new QPushButton("", this);
+ btnCut->setObjectName("cut");
+ btnCut->setIcon(QPixmap::fromImage(QImage(":/img/cut.png")));
+ btnCut->hide();
+
+ btnCopy = new QPushButton("", this);
+ btnCopy->setObjectName("copy");
+ btnCopy->setIcon(QPixmap::fromImage(QImage(":/img/copy.png")));
+ btnCopy->hide();
+
+ bottomHBox->addWidget(btnCut, 0, Qt::AlignLeft);
+ bottomHBox->addWidget(btnCopy, 1, Qt::AlignRight);
+
+ QVBoxLayout *vbox = new QVBoxLayout();
+ vbox->addLayout(topHBox);
+ vbox->addStretch(1);
+ vbox->addLayout(bottomHBox);
+ vbox->setContentsMargins(0, 3, 0, 3);
+ this->setLayout(vbox);
+}
+
+void PDFPageWidget::setAncestor(QWidget* ancestor){
+ this->ancestor = ancestor;
+ ((PDFTableWidget*)ancestor)->registerPage(this);
+ connect(this, SIGNAL(pageClicked(PDFPageWidget*, QMouseEvent*, QString)), ancestor, SLOT(pageClicked(PDFPageWidget*, QMouseEvent*, QString)));
+ connect(this, SIGNAL(pageDropped(PDFPageWidget*, QDropEvent*, QString, QString)), ancestor, SLOT(pageDropped(PDFPageWidget*, QDropEvent*, QString, QString)));
+ connect(btnDelete, SIGNAL(clicked()), this, SLOT(pageDelete()));
+ connect(btnCopy, SIGNAL(clicked()), this, SLOT(pageCopy()));
+ connect(btnRotate, SIGNAL(clicked()), this, SLOT(pageRotate()));
+ connect(btnCut, SIGNAL(clicked()), this, SLOT(pageCut()));
+}
+
+void PDFPageWidget::pageCut(){
+ ((PDFTableWidget*)ancestor)->clearClipboard();
+ ((PDFTableWidget*)ancestor)->cutPage(this);
+}
+
+void PDFPageWidget::pageDelete(){
+ ((PDFTableWidget*)ancestor)->deletePage(this);
+}
+
+void PDFPageWidget::pageCopy(){
+ ((PDFTableWidget*)ancestor)->clearClipboard();
+ ((PDFTableWidget*)ancestor)->copyPage(this);
+}
+
+void PDFPageWidget::pageRotate(){
+ ((PDFTableWidget*)ancestor)->rotatePage(this);
+}
+
+void PDFPageWidget::rotate90() {
+ rotation += 90;
+ if (rotation == 360) rotation = 0;
+
+ ThumbGen *tgen = new ThumbGen();
+ double dpi=tgen->calcDpi(thumbPage,size());
+
+ image = thumbPage->renderToImage(dpi, dpi, -1, -1, -1, -1, getRotation());
+ setThumbnail(image);
+}
+
+Poppler::Page::Rotation PDFPageWidget::getRotation() {
+ if (rotation == 0) return Poppler::Page::Rotate0;
+ else if (rotation == 90) return Poppler::Page::Rotate90;
+ else if (rotation == 180) return Poppler::Page::Rotate180;
+ else if (rotation == 270) return Poppler::Page::Rotate270;
+}
+
+void PDFPageWidget::setFather(QWidget *father){
+ this->father = father;
+}
+
+void PDFPageWidget::setPopplerPage(Poppler::Page* pp) {
+ previewPage = pp;
+}
+Poppler::Page* PDFPageWidget::getNewThumbPopplerPage(){
+ Poppler::Document *thumbDoc = Poppler::Document::load(oriFilePath);
+ thumbDoc->setRenderHint(Poppler::Document::TextAntialiasing);
+ return thumbDoc->page(pageNo);
+}
+void PDFPageWidget::setThumbPopplerPage(Poppler::Page* pp) {
+ thumbPage = pp;
+}
+
+
+void PDFPageWidget::setThumbnail(QImage pageImage) {
+ image = pageImage;
+ pixmap = QPixmap::fromImage(image);
+ pixmap = pixmap.scaled(size() - QSize(6, 6), Qt::KeepAspectRatio);
+
+ update();
+}
+
+void PDFPageWidget::setSelected(bool select) {
+ selected = select;
+ update();
+}
+
+void PDFPageWidget::mousePressEvent(QMouseEvent *event) {
+ if (previewPage!=NULL){
+ emit pageClicked(this, event, path);
+ }
+}
+
+void PDFPageWidget::dragEnterEvent(QDragEnterEvent *event) {
+ event->acceptProposedAction();
+}
+
+void PDFPageWidget::dropEvent(QDropEvent *event) {
+ emit pageDropped(this, event, event->mimeData()->text(), path);
+ event->acceptProposedAction();
+}
+
+void PDFPageWidget::leaveEvent(QEvent *event) {
+ (void)event;
+ btnRotate->hide();
+ btnCut->hide();
+ btnCopy->hide();
+ btnDelete->hide();
+
+ this->setFrameStyle(QFrame::Plain);
+}
+
+void PDFPageWidget::enterEvent(QEvent *event) {
+ (void)event;
+ btnRotate->show();
+ btnCut->show();
+ btnCopy->show();
+ btnDelete->show();
+
+ this->setFrameStyle(QFrame::StyledPanel | QFrame::Raised);
+}
+
+void PDFPageWidget::paintEvent(QPaintEvent *event) {
+ QPalette palette = this->palette();
+ if (selected)
+ palette.setColor( backgroundRole(), palette.color(QPalette::Highlight) );
+ else
+ palette.setColor( backgroundRole(), palette.color(QPalette::AlternateBase) );
+ this->setPalette( palette );
+
+ QFrame::paintEvent(event);
+ QPainter painter(this);
+ painter.drawPixmap(QRect((size().width() - pixmap.width()) / 2, (size().height() - pixmap.height()) / 2, pixmap.width(), pixmap.height()), pixmap);
+}
+
+QSize PDFPageWidget::sizeHint() const {
+ return size();
+}
diff --git a/src/PDFPageWidget.h b/src/PDFPageWidget.h
new file mode 100644
index 0000000..2ecfc68
--- /dev/null
+++ b/src/PDFPageWidget.h
@@ -0,0 +1,84 @@
+#pragma once
+
+#include
+#include
+
+class QWidget;
+class QPushButton;
+class QImage;
+class QPixmap;
+class QEvent;
+class QMouseEvent;
+class QPaintEvent;
+class QDragEnterEvent;
+class QDropEvent;
+class QSize;
+class QString;
+
+class PDFPageWidget : public QFrame
+{
+ Q_OBJECT
+
+public:
+ PDFPageWidget(QWidget *parent = 0);
+ QSize sizeHint() const;
+
+ void setThumbnail(QImage pageImage);
+ void setOriginInfo(QString path,int num){pageNo = num;oriFilePath=path;};
+ void setPopplerPage(Poppler::Page*);
+ void setThumbPopplerPage(Poppler::Page*);
+ void setAncestor(QWidget *ancestor);
+ void setFather(QWidget *father);
+ void rotate90();
+ Poppler::Page::Rotation getRotation();
+ int getIntRotation(){return rotation;};
+ int setIntRotation(int r){rotation = r;};
+ QWidget* getFather() const { return father;}
+ void registerName(QString name) { path = name;}
+ QString getName() { return path;}
+ int getPageNo() { return pageNo;}
+ QString getOriFilePath() { return oriFilePath;}
+ Poppler::Page* getNewThumbPopplerPage();
+
+ void setSelected(bool select);
+ bool isSelected() {return selected;}
+
+ Poppler::Page* getPage(){return previewPage;}
+ Poppler::Page* getThumbPage(){return thumbPage;}
+
+protected:
+ void paintEvent(QPaintEvent *event);
+ void enterEvent(QEvent *event);
+ void leaveEvent(QEvent *event);
+ void mousePressEvent(QMouseEvent *event);
+ void dragEnterEvent(QDragEnterEvent *event);
+ void dropEvent(QDropEvent *event);
+
+private:
+ //QVector buttons;
+ QString path;
+ int pageNo;
+ QString oriFilePath;
+ QWidget *ancestor;
+ QWidget *father;
+
+ QImage image;
+ Poppler::Page *previewPage,*thumbPage;
+ QPixmap pixmap;
+ QPushButton *btnRotate, *btnCut, *btnCopy, *btnDelete;
+
+ int rotation;
+
+
+ bool selected;
+
+signals:
+ void pageClicked(PDFPageWidget*, QMouseEvent*, QString);
+ void pageDropped(PDFPageWidget*, QDropEvent*, QString, QString);
+
+private slots:
+ void pageDelete();
+ void pageCopy();
+ void pageRotate();
+ void pageCut();
+};
diff --git a/src/PDFPreviewWidget.cpp b/src/PDFPreviewWidget.cpp
new file mode 100644
index 0000000..d1e3ce6
--- /dev/null
+++ b/src/PDFPreviewWidget.cpp
@@ -0,0 +1,158 @@
+#include
+#include "PDFPreviewWidget.h"
+
+PreviewGen pgen;
+
+PDFPreviewWidget::PDFPreviewWidget(QWidget *parent) :
+ QFrame(parent)
+{
+
+ setCursor(Qt::OpenHandCursor);
+ setFrameStyle(QFrame::StyledPanel | QFrame::Plain);
+ pPage = NULL;
+ currentPixmapSize = QSize(0,0);
+ connect(&pgen, SIGNAL(updatePreview(QImage)),
+ this, SLOT(updateImage(QImage)));
+}
+
+void PDFPreviewWidget::updateImage(QImage qimg) {
+ previewImage = qimg;
+ regenPixmap();
+ repositionPixmap();
+ update();
+}
+
+void PDFPreviewWidget::regenImage() {
+ double dpi;
+ double dpi2;
+ QSize targetSize;
+
+ if (currentPixmapSize == QSize(0,0))
+ currentPixmapSize = this->size();
+
+ targetSize = currentPixmapSize;
+
+ QSizeF oriSize = pPage->pageSizeF();
+ double oriDpi = 72;
+ dpi = targetSize.height()/(float)oriSize.height()*oriDpi;
+ dpi2= targetSize.width()/(float)oriSize.width()*oriDpi;
+ dpi = dpirenderToImage(dpi,dpi, -1, -1, -1, -1, rotation);
+ pgen.render(pPage,dpi,rotation);
+ pgen.start();
+}
+
+void PDFPreviewWidget::regenPixmap() {
+ pixmap = QPixmap::fromImage(previewImage);
+ pixmap = pixmap.scaled(currentPixmapSize, Qt::KeepAspectRatioByExpanding);
+ currentPixmapSize = pixmap.size();
+}
+
+void PDFPreviewWidget::repositionPixmap() {
+ currentPixmapPos = QPoint((size().width() - pixmap.width()) / 2, (size().height() - pixmap.height()) / 2);
+}
+
+void PDFPreviewWidget::previewUpdate(Poppler::Page* pp, Poppler::Page::Rotation rotation) {
+ pPage = pp;
+ this->rotation = rotation;
+ currentPixmapSize = this->size();
+ regenImage();
+ //regenPixmap();
+ //repositionPixmap();
+ //update();
+}
+
+void PDFPreviewWidget::checkPreviewUpdate(Poppler::Page* pp, Poppler::Page::Rotation rotation) {
+ //if (pPage != NULL && pPage == pp) {
+ previewUpdate(pp, rotation);
+ //}
+}
+
+void PDFPreviewWidget::checkPagePreviewExisted(Poppler::Page* pp) {
+ (void) pp;
+ //if (pPage != NULL && pPage == pp) {
+ pPage = NULL;
+ rotation = Poppler::Page::Rotate0;
+
+ QPainter painter(this);
+ painter.drawPixmap(QRect(0, 0, 0, 0), pixmap);
+ update();
+ //}
+}
+
+void PDFPreviewWidget::resizeEvent(QResizeEvent *event) {
+ (void) event;
+ if (pPage!=NULL) {
+ repositionPixmap();
+ update();
+ }
+}
+
+void PDFPreviewWidget::wheelEvent(QWheelEvent *event) {
+ if (pPage!=NULL) {
+ if (event->delta() > 0)
+ currentPixmapSize += QSize(30, 30);
+ else if (event->delta() < 0)
+ currentPixmapSize -= QSize(30, 30);
+
+ if (currentPixmapSize.width() < 150 || currentPixmapSize.height() < 150) {
+ currentPixmapSize = QSize(150, 150);
+ }
+
+ regenImage();
+ regenPixmap();
+ repositionPixmap();
+ update();
+ }
+}
+
+void PDFPreviewWidget::mousePressEvent(QMouseEvent *event)
+{
+ if (pPage!=NULL) {
+ setCursor(Qt::ClosedHandCursor);
+
+ if (event->button() == Qt::LeftButton) {
+ dragStartPos = event->pos();
+ lastPixmapPos = currentPixmapPos;
+ }
+ }
+}
+
+void PDFPreviewWidget::mouseMoveEvent(QMouseEvent *event) {
+ if (pPage!=NULL) {
+ if (!(event->buttons() & Qt::LeftButton)) {
+ return;
+ }
+
+ QPoint currentPos = event->pos();
+ QPoint vector = currentPos - dragStartPos;
+ QPoint newPos = lastPixmapPos + vector;
+
+ if (pixmap.width() > size().width()) {
+ if (newPos.x() <= 0 && newPos.x() >= size().width() - pixmap.width())
+ currentPixmapPos.setX(newPos.x());
+ }
+
+ if (pixmap.height() > size().height()) {
+ if (newPos.y() <= 0 && newPos.y() >= size().height() - pixmap.height())
+ currentPixmapPos.setY(newPos.y());
+ }
+
+ update();
+ }
+}
+
+void PDFPreviewWidget::mouseReleaseEvent(QMouseEvent *event) {
+ (void) event;
+ setCursor(Qt::OpenHandCursor);
+}
+
+void PDFPreviewWidget::paintEvent(QPaintEvent *event) {
+ (void) event;
+ if (pPage!=NULL) {
+ QPainter painter(this);
+ painter.drawPixmap(QRect(currentPixmapPos.x(), currentPixmapPos.y(), pixmap.width(), pixmap.height()), pixmap);
+ }
+ QFrame::paintEvent(event);
+}
diff --git a/src/PDFPreviewWidget.h b/src/PDFPreviewWidget.h
new file mode 100644
index 0000000..fac7abe
--- /dev/null
+++ b/src/PDFPreviewWidget.h
@@ -0,0 +1,58 @@
+#pragma once
+
+#include
+#include
+#include "PreviewGen.h"
+
+
+class QImage;
+class QPixmap;
+class QSize;
+class QPoint;
+class QResizeEvent;
+class QWheelEvent;
+class QPaintEvent;
+class QMouseEvent;
+class PreviewGen;
+
+class PDFPreviewWidget : public QFrame
+{
+ Q_OBJECT
+public:
+ explicit PDFPreviewWidget(QWidget *parent = 0);
+
+public slots:
+ void regenImage();
+ void regenPixmap();
+ void repositionPixmap();
+ void previewUpdate(Poppler::Page*, Poppler::Page::Rotation);
+ void checkPreviewUpdate(Poppler::Page*, Poppler::Page::Rotation);
+ void checkPagePreviewExisted(Poppler::Page*);
+
+protected:
+ void wheelEvent(QWheelEvent *event);
+ void paintEvent(QPaintEvent *event);
+ void resizeEvent(QResizeEvent *event);
+ void mousePressEvent(QMouseEvent *event);
+ void mouseMoveEvent(QMouseEvent *event);
+ void mouseReleaseEvent(QMouseEvent *event);
+
+public:
+ Poppler::Page* pPage;
+
+private:
+ QImage previewImage;
+ QPixmap pixmap;
+ Poppler::Page::Rotation rotation;
+
+ QSize currentPixmapSize;
+ QPoint currentPixmapPos;
+ QPoint lastPixmapPos;
+ QPoint dragStartPos;
+
+private slots:
+ void updateImage(QImage);
+
+signals:
+ void updatePreview(QImage);
+};
diff --git a/src/PDFTableWidget.cpp b/src/PDFTableWidget.cpp
new file mode 100644
index 0000000..9d9eabc
--- /dev/null
+++ b/src/PDFTableWidget.cpp
@@ -0,0 +1,421 @@
+#include
+
+#include "PDFTableWidget.h"
+#include "PDFPageWidget.h"
+#include "PDFFileWidget.h"
+#include
+#include "PDFJam.h"
+
+// Constructor
+PDFTableWidget::PDFTableWidget(QWidget* parent) : QFrame(parent)
+{
+ // Frame (Expanding with VBox) - Scroll Area (Expanding) - Container (Expanding with VBox) - Children
+
+ setFrameStyle(QFrame::StyledPanel | QFrame::Plain);
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+ outerLayout = new QVBoxLayout();
+ outerLayout->setContentsMargins(0,0,0,0);
+
+ scrollArea = new QScrollArea();
+ scrollArea -> setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ scrollArea -> setWidgetResizable(true);
+ scrollArea -> setFrameStyle(QFrame::Plain);
+
+ containerLayout = new QVBoxLayout();
+ containerLayout -> setSpacing(10);
+ containerWidget = new QWidget();
+ containerWidget -> setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ QWidget *spacer = new QWidget();
+ spacer -> setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ containerLayout -> addWidget(spacer);
+ containerWidget -> setLayout(containerLayout);
+
+ scrollArea -> setWidget(containerWidget);
+
+ outerLayout -> addWidget(scrollArea);
+
+ setLayout(outerLayout);
+}
+
+void PDFTableWidget::loadFile(QString fileName){
+ Poppler::Document *doc = Poppler::Document::load(fileName);
+ files.append(doc);
+
+ PDFFileWidget *fileWidget = new PDFFileWidget();
+ fileWidget->setAncestor(this);
+ fileWidget->setDocument(doc,fileName);
+ pdfJam.loadFile(fileName,files.size()-1,doc);
+
+ fileWidgets.append(fileWidget);
+ fileNames.append(fileName);
+
+ containerLayout->insertWidget(containerLayout->count() - 1, fileWidget);
+ connect(fileWidget, SIGNAL(fileRemoveButtonClicked(PDFFileWidget*)), this, SLOT(fileRemoveButtonClicked(PDFFileWidget*)));
+}
+
+QVector PDFTableWidget::getSelectedFiles() {
+ return selectedFiles;
+}
+
+QVector PDFTableWidget::getSelectedIndices() {
+ QVector retVector;
+ for (int i = 0; i < selectedFiles.size(); i++) {
+ retVector.append(fileWidgets.indexOf(selectedFiles.at(i)));
+ }
+ return retVector;
+}
+
+QVector PDFTableWidget::getSelectedFileNames() {
+ QVector retVector;
+ QVector indices = getSelectedIndices();
+ for (int i = 0; i < indices.size(); i++) {
+ retVector.append(fileNames.at(indices.at(i)));
+ }
+ return retVector;
+}
+
+QVector PDFTableWidget::getVisibleFiles() {
+ QVector retVector;
+ for (int i = 0; i < fileWidgets.size(); i++) {
+ if (fileWidgets.at(i)->isVisible())
+ retVector.append(fileWidgets.at(i));
+ }
+ return retVector;
+}
+
+QVector PDFTableWidget::getVisibleIndices() {
+ QVector retVector;
+ QVector visibleFiles = getVisibleFiles();
+ for (int i = 0; i < visibleFiles.size(); i++) {
+ retVector.append(fileWidgets.indexOf(visibleFiles.at(i)));
+ }
+ return retVector;
+}
+
+QVector PDFTableWidget::getVisibleFileNames() {
+ QVector retVector;
+ QVector indices = getVisibleIndices();
+ for (int i = 0; i < indices.size(); i++) {
+ retVector.append(fileNames.at(indices.at(i)));
+ }
+ return retVector;
+}
+
+void PDFTableWidget::registerPage(PDFPageWidget* child){
+ //come up with a new name here
+ QString name = QString("/home/pdfpage").append(QString::number(pageChilds.size()));
+ pageChilds[name] = child;
+ child->registerName(name);
+}
+
+void PDFTableWidget::copySelected(){
+ clearClipboard();
+ for (int i = 0;ibutton() == Qt::LeftButton){
+ if (event->modifiers() != Qt::ControlModifier) {
+ for (int i = 0; i < selectedFiles.size(); i++) {
+ selectedFiles.at(i)->setSelected(false);
+ }
+
+ selectedFiles.clear();
+
+ if (!sender->isSelected()) {
+ sender->setSelected(true);
+ selectedFiles.append(sender);
+ }
+ } else {
+ if (!sender->isSelected()) {
+ sender->setSelected(true);
+ selectedFiles.append(sender);
+ } else {
+ sender->setSelected(false);
+ selectedFiles.remove(selectedFiles.indexOf(sender));
+ }
+ }
+ }
+}
+
+void PDFTableWidget::fileRemoveButtonClicked(PDFFileWidget* sender) {
+ if (selectedFiles.indexOf(sender) > 0)
+ selectedFiles.remove(selectedFiles.indexOf(sender));
+
+ for (int i = 0; i < sender->getChildCount(); i++) {
+ PDFPageWidget *pageWidget = sender->pagesContainerWidget->pageWidgets.at(i);
+ pageWidget->setSelected(false);
+ emit checkPagePreviewExisted(pageWidget->getPage());
+ if (selectedPages.indexOf(pageWidget) > 0)
+ selectedPages.remove(selectedPages.indexOf(pageWidget));
+ }
+
+ // Handle remove file
+ sender->hide();
+}
+
+void PDFTableWidget::pageClicked(PDFPageWidget *sender, QMouseEvent* event, QString path){
+ if (event->button() == Qt::LeftButton){
+ // Handle selection
+ if (selectedPages.size() > 0 && event->modifiers() != Qt::ControlModifier) {
+
+ if (sender->isSelected() ){
+ QDrag *drag = new QDrag(this);
+ QMimeData *mimeData = new QMimeData;
+
+ mimeData->setText(path);
+ drag->setMimeData(mimeData);
+ drag->setPixmap(QPixmap(":/img/copy.png"));
+
+ drag->exec();
+ }else {
+ for (int i = 0; i < selectedPages.size(); i++) {
+ selectedPages.at(i)->setSelected(false);
+ }
+ selectedPages.clear();
+ sender->setSelected(true);
+
+ selectedPages.insert(0,sender);
+ emit previewUpdate(sender->getNewThumbPopplerPage(), sender->getRotation());
+ }
+
+ } else {
+ if (!sender->isSelected()) {
+ sender->setSelected(true);
+ emit previewUpdate(sender->getNewThumbPopplerPage(), sender->getRotation());
+
+ PDFFileWidget* senderF = (PDFFileWidget*)sender->getFather();
+ int senderPID = senderF->indexChild(sender);
+ int senderFID = fileWidgets.indexOf(senderF);
+
+ int i = 0;
+ for (i = 0;igetFather();
+ int targetPID = targetF->indexChild(target);
+ int targetFID = fileWidgets.indexOf(targetF);
+
+ if (targetFID == senderFID && targetPID > senderPID)
+ break;
+
+ if (targetFID > senderFID)
+ break;
+ }
+
+ selectedPages.insert(i,sender);
+ } else {
+ sender->setSelected(false);
+ selectedPages.remove(selectedPages.indexOf(sender));
+ }
+ }
+ }
+
+ if (event->button() == Qt::RightButton){
+ for (int i = 0; i < selectedPages.size(); i++) {
+ selectedPages.at(i)->setSelected(false);
+ }
+ selectedPages.clear();
+ }
+}
+
+void PDFTableWidget::pageDropped(PDFPageWidget *sender, QDropEvent *event, QString pathFrom, QString pathTo){
+ (void)sender;
+ (void)event;
+ moveSelectedPages(pathFrom, pathTo);
+}
+
+void PDFTableWidget::moveSelectedPages(QString pathFrom, PDFPageWidget* page){
+ moveSelectedPages(pathFrom, page->getName());
+}
+
+void PDFTableWidget::deletePageSkipSelection(PDFPageWidget* pageWidget){
+ if (pageWidget->isSelected())
+ emit checkPagePreviewExisted(pageWidget->getPage());
+
+ PDFFileWidget *daddy = (PDFFileWidget*)pageWidget->getFather();
+ int daddyID = fileWidgets.indexOf(daddy);
+ int pageID = daddy->indexChild(pageWidget);
+
+ pdfJam.removePage(daddyID, daddy->pagesContainerWidget->pageWidgets.size(),pageID);
+ daddy->removeChild(pageWidget);
+
+ int spos = copiedPages.indexOf(pageWidget);
+ if (spos!=-1){
+ copiedPages.remove(spos);
+ }
+ pageChilds.remove(pageWidget->getName());
+
+
+ // PLS ACTIVATE THIS LINE ONCE EVERYTHING HAS BEEN FIXED
+ // :D :D :D :D :D :D
+ //delete page;
+
+}
+
+void PDFTableWidget::deletePage(PDFPageWidget* pageWidget){
+ if (pageWidget->isSelected())
+ emit checkPagePreviewExisted(pageWidget->getPage());
+
+ PDFFileWidget *daddy = (PDFFileWidget*)pageWidget->getFather();
+ int daddyID = fileWidgets.indexOf(daddy);
+ int pageID = daddy->indexChild(pageWidget);
+
+ pdfJam.removePage(daddyID, daddy->pagesContainerWidget->pageWidgets.size(),pageID);
+ daddy->removeChild(pageWidget);
+
+ int spos = selectedPages.indexOf(pageWidget);
+ if (spos!=-1){
+ selectedPages.remove(spos);
+ }
+ spos = copiedPages.indexOf(pageWidget);
+ if (spos!=-1){
+ copiedPages.remove(spos);
+ }
+ pageChilds.remove(pageWidget->getName());
+
+
+ // PLS ACTIVATE THIS LINE ONCE EVERYTHING HAS BEEN FIXED
+ // :D :D :D :D :D :D
+ //delete page;
+
+}
+
+void PDFTableWidget::cutPage(PDFPageWidget* pageWidget){
+ deletePage(pageWidget);
+ int id = copiedPages.size();
+ copiedPages.push_back(pageWidget);
+
+ PDFFileWidget *daddy = (PDFFileWidget*)pageWidget->getFather();
+ int daddyID = fileWidgets.indexOf(daddy);
+ int pageID = daddy->indexChild(pageWidget);
+
+ pdfJam.cutPage(daddyID, daddy->pagesContainerWidget->pageWidgets.size(),pageID, id);
+}
+
+void PDFTableWidget::clearClipboard(){
+ copiedPages.clear();
+}
+
+void PDFTableWidget::copyPage(PDFPageWidget* pageWidget){
+ int id = copiedPages.size();
+ copiedPages.push_back(pageWidget);
+
+ PDFFileWidget *daddy = (PDFFileWidget*)pageWidget->getFather();
+ int daddyID = fileWidgets.indexOf(daddy);
+ int pageID = daddy->indexChild(pageWidget);
+
+ pdfJam.copyPage(daddyID, pageID, id);
+}
+
+void PDFTableWidget::pastePage(PDFFileWidget* fileWidget, int pageID){
+ if (copiedPages.size() > 0){
+ for (int i = 0;isetAncestor(this);
+ pageWidget->setFather(page->getFather());
+ pageWidget->setPopplerPage(page->getNewThumbPopplerPage());
+ pageWidget->setThumbPopplerPage(page->getNewThumbPopplerPage());
+ pageWidget->setOriginInfo(page->getOriFilePath(),page->getPageNo());
+ pageWidget->setIntRotation(page->getIntRotation());
+
+ int fileID = fileWidgets.indexOf(fileWidget);
+ pdfJam.pastePage(fileID, fileWidget->pagesContainerWidget->pageWidgets.size(), pageID, i);
+
+ fileWidget->insertChildAt(pageWidget,pageID+i);
+ }
+ }
+}
+
+void PDFTableWidget::rotatePage(PDFPageWidget* pageWidget) {
+ pageWidget->rotate90();
+
+ int fileIndex = fileWidgets.indexOf((PDFFileWidget *)pageWidget->getFather());
+ int pageIndex = fileWidgets.at(fileIndex)->indexChild(pageWidget);
+ pdfJam.rotatePage(fileIndex, pageIndex, pageWidget->getIntRotation());
+
+ if (pageWidget->isSelected())
+ emit checkPreviewUpdate(pageWidget->getPage(), pageWidget->getRotation());
+}
+
+void PDFTableWidget::rotateSelected() {
+ for (int i = 0; i < selectedPages.size(); i++) {
+ rotatePage(selectedPages.at(i));
+ }
+}
+
+void PDFTableWidget::moveSelectedPages(QString pathFrom, QString pathTo){
+ if (selectedPages.size() == 0)
+ return;
+
+ bool accept = false;
+ for (int i = 0;igetName() == pathFrom)
+ accept=true;
+ if (!accept)
+ return;
+ /*
+ for (int i = 0;igetName() == pathTo)
+ return;*/
+
+ PDFPageWidget* childTo = pageChilds[pathTo];
+ PDFFileWidget* fileTo = (PDFFileWidget*) childTo->getFather();
+
+ int posTo= -1;
+ PDFFileWidget* file = NULL;
+ for (int i = selectedPages.size() - 1; i>=0 ;i--){
+ PDFPageWidget* childFrom = selectedPages[i];
+ PDFFileWidget* fileFrom = (PDFFileWidget*) childFrom->getFather();
+ if (file == fileFrom){
+ posTo-=1;
+ }
+
+ if (pathTo==childFrom->getName() ){
+ file = fileFrom;
+ posTo = fileFrom->indexChild(childFrom);
+ }
+
+
+ pdfJam.cutPage(
+ fileWidgets.indexOf(fileFrom),
+ fileFrom->pagesContainerWidget->pageWidgets.size(),
+ fileFrom->indexChild(childFrom),
+ i
+ );
+
+ fileFrom->removeChild(childFrom);
+
+ }
+ if (posTo ==-1)
+ posTo = fileTo->indexChild(childTo);
+ for (int i = selectedPages.size() - 1; i>=0 ;i--){
+ pdfJam.pastePage(
+ fileWidgets.indexOf(fileTo),
+ fileTo->pagesContainerWidget->pageWidgets.size(),
+ posTo,
+ i
+ );
+
+ PDFPageWidget* childFrom = selectedPages[i];
+ //PDFFileWidget* fileFrom = (PDFFileWidget*) childFrom->getFather();
+ fileTo->insertChildAt(childFrom, posTo);
+
+ //fileFrom->insertChildAt(childTo, posFrom);
+ }
+}
diff --git a/src/PDFTableWidget.h b/src/PDFTableWidget.h
new file mode 100644
index 0000000..43c9270
--- /dev/null
+++ b/src/PDFTableWidget.h
@@ -0,0 +1,87 @@
+#pragma once
+#include
+#include "PDFJam.h"
+
+#include
+#include
+#include "PDFPageWidget.h"
+#include "ThumbGen.h"
+
+class QImage;
+class QVBoxLayout;
+class QString;
+class QScrollArea;
+class QMouseEvent;
+class QPoint;
+
+class PDFFileWidget;
+
+class PDFTableWidget: public QFrame
+{
+ Q_OBJECT
+public:
+ PDFTableWidget(QWidget *parent = 0);
+ void loadFile (QString fileName);
+ void registerPage(PDFPageWidget *child);
+
+
+public:
+ PDFJam pdfJam;
+ ThumbGen mainTgen;
+
+private:
+ QVBoxLayout *outerLayout;
+ QScrollArea *scrollArea;
+ QWidget *containerWidget;
+ QVBoxLayout *containerLayout;
+
+ QVector files;
+ QVector fileNames;
+ QVector fileWidgets;
+
+ QHash pageChilds;
+
+signals:
+ void previewUpdate(Poppler::Page*, Poppler::Page::Rotation);
+ void checkPreviewUpdate(Poppler::Page*, Poppler::Page::Rotation);
+ void checkPagePreviewExisted(Poppler::Page*);
+
+private slots:
+ void fileRemoveButtonClicked(PDFFileWidget*);
+ void pageClicked(PDFPageWidget*, QMouseEvent*, QString);
+ void pageDropped(PDFPageWidget*, QDropEvent*, QString, QString);
+
+ void fileClicked(PDFFileWidget*, QMouseEvent*);
+
+private:
+ QVector selectedPages;
+ QVector selectedFiles;
+
+ QVector copiedPages;
+public:
+ QVector getSelectedFiles();
+ QVector getSelectedIndices();
+ QVector getSelectedFileNames();
+
+ QVector getVisibleFiles();
+ QVector getVisibleIndices();
+ QVector getVisibleFileNames();
+
+public:
+ void moveSelectedPages(QString, QString);
+ void moveSelectedPages(QString, PDFPageWidget* page);
+ void deletePage(PDFPageWidget* pageWidget);
+ void deletePageSkipSelection(PDFPageWidget* pageWidget);
+ void copyPage(PDFPageWidget* pageWidget);
+ void pastePage(PDFFileWidget* fileWidget, int pageID);
+ void rotatePage(PDFPageWidget* pageWidget);
+ void cutPage(PDFPageWidget* pageWidget);
+ void clearClipboard();
+ bool hasClipboard(){ return copiedPages.size() > 0; }
+
+public slots:
+ void rotateSelected();
+ void copySelected();
+ void cutSelected();
+ void deleteSelected();
+};
diff --git a/src/PreviewGen.cpp b/src/PreviewGen.cpp
new file mode 100644
index 0000000..405a306
--- /dev/null
+++ b/src/PreviewGen.cpp
@@ -0,0 +1,25 @@
+#include
+#include
+#include "PreviewGen.h"
+PreviewGen::PreviewGen()
+{
+
+}
+void PreviewGen::run(){
+ mutex.lock();
+ Poppler::Page *pp =pPage;
+ double instantDpi =dpi;
+ double instantRotation = rotation;
+ mutex.unlock();
+
+ QImage pageImage = pp->renderToImage(instantDpi, instantDpi,-1,-1,-1,-1,rotation);
+ emit updatePreview(pageImage);
+}
+void PreviewGen::render(Poppler::Page* pp,double aDpi,Poppler::Page::Rotation r){
+ mutex.lock();
+ pPage = pp;
+ dpi = aDpi;
+ rotation = r;
+ mutex.unlock();
+}
+
diff --git a/src/PreviewGen.h b/src/PreviewGen.h
new file mode 100644
index 0000000..d8abea6
--- /dev/null
+++ b/src/PreviewGen.h
@@ -0,0 +1,30 @@
+#pragma once
+#include
+#include
+#include
+#include
+#include "PDFPreviewWidget.h"
+
+class QImage;
+
+class PreviewGen: public QThread
+{
+ Q_OBJECT
+
+public:
+ PreviewGen();
+ void render(Poppler::Page*,double,Poppler::Page::Rotation);
+
+protected:
+ void run();
+ Poppler::Page* pPage;
+ double dpi;
+ Poppler::Page::Rotation rotation;
+ QMutex mutex;
+
+public:
+ double calcDpi(Poppler::Page *pdfPage, double dpi);
+
+signals:
+ void updatePreview(QImage);
+};
diff --git a/src/ThumbGen.cpp b/src/ThumbGen.cpp
new file mode 100644
index 0000000..a956e0f
--- /dev/null
+++ b/src/ThumbGen.cpp
@@ -0,0 +1,46 @@
+#include
+#include
+#include "ThumbGen.h"
+
+
+#include "PDFPageWidget.h"
+ThumbGen::ThumbGen()
+{
+
+}
+
+double ThumbGen::calcDpi(Poppler::Page *pdfPage, QSize targetSize){
+ double dpi;
+ QSizeF oriSize = pdfPage->pageSizeF();
+ double oriDpi = 72;
+ if (targetSize.width() > targetSize.height()){
+ dpi = targetSize.height()/(float)oriSize.height()*72;
+ }else {
+ dpi= targetSize.width()/(float)oriSize.width()*72;
+ }
+ return dpi;
+
+}
+
+void ThumbGen::run(){
+ while(pWidgets.size()!=0){
+ mutex.lock();
+ PDFPageWidget *pw = pWidgets.first();
+ pWidgets.pop_front();
+ Poppler::Page *pp = pPages.first();
+ pPages.pop_front();
+ mutex.unlock();
+
+ double dpi=calcDpi(pp,pw->size());
+ QImage pageImage = pp->renderToImage(dpi, dpi);
+ emit updateThumbnail(pageImage,pw);
+ }
+}
+void ThumbGen::render(PDFPageWidget* pw,Poppler::Page* pp){
+ mutex.lock();
+ pWidgets.append(pw);
+ pPages.append(pp);
+ mutex.unlock();
+
+}
+
diff --git a/src/thumbgen.h b/src/ThumbGen.h
similarity index 62%
rename from src/thumbgen.h
rename to src/ThumbGen.h
index d758923..c44fac6 100644
--- a/src/thumbgen.h
+++ b/src/ThumbGen.h
@@ -1,30 +1,30 @@
#pragma once
+
#include
#include
-#include
#include
-
+#include
class PDFPageWidget;
class QImage;
-class ThumbGen : public QThread {
+class ThumbGen: public QThread
+{
Q_OBJECT
+
public:
- ThumbGen(void);
- void render(PDFPageWidget*, Poppler::Page*);
+ ThumbGen();
+ void render(PDFPageWidget*,Poppler::Page*);
protected:
- void run(void);
+ void run();
QVector pWidgets;
QVector pPages;
QMutex mutex;
-private:
- double calcDpi(Poppler::Page* pdfPage, QSize targetSize);
+public:
+ double calcDpi(Poppler::Page *pdfPage, QSize targetSize);
signals:
void updateThumbnail(QImage, PDFPageWidget*);
-
};
-
diff --git a/src/main.cpp b/src/main.cpp
index 19f7a9b..fe4c97a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,10 +1,13 @@
-#include
-#include "pdf_factory.h"
+// main.cpp
-int main(int argc, char* argv[]) {
- QApplication a(argc, argv);
+#include
+#include "PDFFactory.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
PDFFactory pdffactory;
pdffactory.show();
-
- return a.exec();
+ return app.exec();
}
+
diff --git a/src/main_window.cpp b/src/main_window.cpp
deleted file mode 100644
index 62ca750..0000000
--- a/src/main_window.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "main_window.h"
-#include "ui_main_window.h"
-
-MainWindow::Mainwindow(Qwidget* parent) :
- QMainWindow(parent),
- ui(new UI::MainWindow {
-
- ui->setupUI(this);
-}
-
-MainWindow::~MainWindow(void) {
- delete ui;
-}
-
diff --git a/src/main_window.h b/src/main_window.h
deleted file mode 100644
index 3ccfcbf..0000000
--- a/src/main_window.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#pragma once
-#include
-
-namespace Ui {
- class MainWindow;
-}
-
-class MainWindow : public QMainWindow {
- Q_OBJECT
-public:
- explicit MainWindow(QWidget* parent = 0);
- ~MainWindow(void);
-
-private:
- Ui::MainWindow* ui;
-};
-
diff --git a/src/main_window.ui b/src/main_window.ui
deleted file mode 100644
index 6050363..0000000
--- a/src/main_window.ui
+++ /dev/null
@@ -1,24 +0,0 @@
-
- MainWindow
-
-
-
- 0
- 0
- 400
- 300
-
-
-
- MainWindow
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/pdf_factory.cpp b/src/pdf_factory.cpp
deleted file mode 100644
index 8811473..0000000
--- a/src/pdf_factory.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-#include
-#include
-#include "pdf_factory.h"
-#include "pdf_table_widget.h"
-#include "pdf_preview_widget.h"
-#include "pdf_page_widget.h"
-
-PDFFactory::PDFFactory(void) {
- createWidgets();
- createActions();
- createToolBars();
- createRibbon();
- createStatusBar();
-}
-
-/* Create the shit we need for our window. */
-void PDFFactory::createWidgets(void) {
- /* Set central widget to be the container root. */
- centralWidget = new QWidget();
- QVBoxLayout* layout = new QVBoxLayout();
- layout->setContentsMargins(2, 2, 2, 2);
- centralWidget->setLayout(layout);
- setCentralWidget(centralWidget);
-
- /* Create ribbon. */
- ribbon = new QTabWidget();
- ribbon->addTab(new QWidget(), tr("File"));
- ribbon->addTab(new QWidget(), tr("Edit"));
- ribbon->addTab(new QWidget(), tr("View"));
- ribbon->addTab(new QWidget(), tr("Help"));
- ribbon->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
- ribbon->setFixedHeight(100);
- layout->addWidget(ribbon);
-
- /* Create main area (table). */
- pdfTableView = new PDFTableWidget();
-
- pdfPreview = new PDFPreviewWidget();
- pdfPreview->setMinimumWidth(100);
- splitter = new QSplitter();
- splitter->setOrientation(Qt::Horizontal);
- splitter->addWidget(pdfTableView);
- splitter->addWidget(pdfPreview);
- QList splitterWidgetSizes;
- splitterWidgetSizes << 200 << 1000;
- splitter->setSizes(splitterWidgetSizes);
- splitter->setStretchFactor(0, 1);
- splitter->setStretchFactor(1, 0.5);
- layout->addWidget(splitter);
-
- connect(pdfTableView, SIGNAL(previewUpdate(Poppler::Page*)), pdfPreview,
- SLOT(previewUpdate(Poppler::Page*)));
-
- setWindowIcon(QIcon(":/img/hpdf.png"));
- setWindowTitle(tr("HPDF"));
- setGeometry(0, 0, 1300, 650);
-}
-
-void PDFFactory::createActions(void) {
- openAction = new QAction(tr("&Open"), this);
- openAction->setIcon(QIcon(":/img/open.png"));
- openAction->setShortcut(tr("Ctrl+O"));
- openAction->setStatusTip(tr("Open a PDF"));
- connect(openAction, SIGNAL(triggered()), this, SLOT(openFile()));
-
- exportAction = new QAction(tr("&Export a single file"), this);
- exportAction->setIcon(QIcon(":/img/export.png"));
- exportAction->setShortcut(tr("Ctrl+S"));
- exportAction->setStatusTip(tr("Export the selected file to a new PDF"));
- /*connect(saveAction, SIGNAL(triggered()), this, SLOT(save()))*/
-
- exportAllAction = new QAction(tr("Combine all"), this);
- exportAllAction->setIcon(QIcon(":/img/exportall.png"));
- exportAllAction->setShortcut(tr("Shift+Ctrl+S"));
- exportAllAction->setStatusTip(tr("Export all to multiple PDF files"));
- /*connect(saveAsAction, SIGNAL(triggered()), this, SLOT(saveAs()))*/
-
- cutAction = new QAction(tr("C&ut"), this);
- cutAction->setIcon(QIcon(":/img/cut.png"));
- cutAction->setShortcut(tr("Ctrl+X"));
- cutAction->setStatusTip(tr("Cut selected contents to clipboard"));
- /*connect(cutAction, SIGNAL(triggered()), this, SLOT(cut()))*/
-
- copyAction = new QAction(tr("&Copy"), this);
- copyAction->setIcon(QIcon(":/img/copy.png"));
- copyAction->setShortcut(tr("Ctrl+C"));
- copyAction->setStatusTip(tr("Copy selected contents to clipboard"));
- /*connect(copyAction, SIGNAL(triggered()), this, SLOT(copy()))*/
-
- pasteAction = new QAction(tr("&Paste"), this);
- pasteAction->setIcon(QIcon(":/img/paste.png"));
- pasteAction->setShortcut(tr("Ctrl+V"));
- pasteAction->setStatusTip(tr("Paste clipboard's contents into current selection"));
- /*connect(pasteAction, SIGNAL(triggered()), this, SLOT(paste()))*/
-
- aboutAction = new QAction(tr("A&bout"), this);
- aboutAction->setIcon(QIcon(":/img/about.png"));
- aboutAction->setStatusTip(tr("About this program"));
-}
-
-void PDFFactory::createToolBars() {
- fileToolBar = new QToolBar(tr("File"));
- fileToolBar->addAction(openAction);
- fileToolBar->addAction(exportAction);
- fileToolBar->addAction(exportAllAction);
- fileToolBar->setIconSize(QSize(48, 48));
-
- editToolBar = new QToolBar(tr("Edit"));
- editToolBar->addAction(cutAction);
- editToolBar->addAction(copyAction);
- editToolBar->addAction(pasteAction);
- editToolBar->setIconSize(QSize(48, 48));
-
- helpToolBar = new QToolBar(tr("Help"));
- helpToolBar->addAction(aboutAction);
- helpToolBar->setIconSize(QSize(48, 48));
-}
-
-void PDFFactory::createRibbon(void) {
- QWidget* tabFile = ribbon->widget(0);
- QVBoxLayout* layoutTabFile = new QVBoxLayout();
- layoutTabFile->setContentsMargins(2, 0, 2, 0);
- layoutTabFile->addWidget(fileToolBar);
- tabFile->setLayout(layoutTabFile);
-
- QWidget* tabEdit = ribbon->widget(1);
- QVBoxLayout* layoutTabEdit = new QVBoxLayout();
- layoutTabEdit->setContentsMargins(2, 0, 2, 0);
- layoutTabEdit->addWidget(editToolBar);
- tabEdit->setLayout(layoutTabEdit);
-
- QWidget* tabHelp = ribbon->widget(3);
- QVBoxLayout* layoutTabHelp = new QVBoxLayout();
- layoutTabHelp->setContentsMargins(2, 0, 2, 0);
- layoutTabHelp->addWidget(helpToolBar);
- tabHelp->setLayout(layoutTabHelp);
-}
-
-void PDFFactory::createStatusBar(void) {
- statusBar()->showMessage(tr(""));
-}
-
-void PDFFactory::openFile(void) {
- QStringList fileNames = QFileDialog::getOpenFileNames(this,
- tr("Open PDF file"), ".",
- tr("PDF file (*.pdf)"));
-
- for(int i = 0; i < fileNames.size(); i++) {
- QString fileName = fileNames.at(i);
- if(!fileName.isEmpty()) {
- pdfTableView->loadFile(fileName);
- }
- }
-}
-
diff --git a/src/pdf_factory.h b/src/pdf_factory.h
deleted file mode 100644
index 6ed4549..0000000
--- a/src/pdf_factory.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#pragma once
-#include
-
-class QAction;
-class QWidget;
-class QTabWidget;
-class QScrollArea;
-class QSplitter;
-class QToolBar;
-class PDFTableWidget;
-class PDFPreviewWidget;
-
-class PDFFactory : public QMainWindow {
- Q_OBJECT
-public:
- PDFFactory();
-
-protected:
- /*void closeEvent(QCloseEvent* event);*/
-
-private slots:
- void openFile(void);
- /*void exportFile(void);
- void exportAllFiles(void);*/
-
-private:
- void createWidgets(void);
- void createActions(void);
- void createToolBars(void);
- void createRibbon();
- void createStatusBar();
-
- QAction* openAction;
- QAction* exportAction;
- QAction* exportAllAction;
- QAction* cutAction;
- QAction* copyAction;
- QAction* pasteAction;
- QAction* aboutAction;
-
- QWidget* centralWidget;
-
- QTabWidget* ribbon;
- QSplitter* splitter;
- PDFTableWidget* pdfTableView;
- PDFPreviewWidget* pdfPreview;
-
- QToolBar* fileToolBar;
- QToolBar* editToolBar;
- QToolBar* helpToolBar;
-};
-
diff --git a/src/pdf_file_widget.cpp b/src/pdf_file_widget.cpp
deleted file mode 100644
index 46ef26f..0000000
--- a/src/pdf_file_widget.cpp
+++ /dev/null
@@ -1,185 +0,0 @@
-#include
-#include
-#include "pdf_file_widget.h"
-#include "pdf_page_widget.h"
-#include "pdf_table_widget.h"
-
-#define COLLAPSE_BUTTON_WIDTH 32
-#define COLLAPSE_BUTTON_HEIGHT 32
-
-#define CHILD_AREA_WIDTH 150
-#define CHILD_AREA_HEIGHT 150
-
-#define CHILD_AREA_SIDE_MARGIN 20
-
-PagesContainerWidget::PagesContainerWidget(QWidget* parent) {
- setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
- setAcceptDrops(true);
- mainLayout = new QHBoxLayout();
-
- setLayout(mainLayout);
-}
-
-int PagesContainerWidget::getPagesCount() const {
- return pageWidgets.size();
-}
-
-QSize PagesContainerWidget::sizeHint() const {
- return QSize((CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH)*getPagesCount(), CHILD_AREA_HEIGHT + 30);
-}
-
-void PagesContainerWidget::addPageWidget(PDFPageWidget* pageWidget) {
- pageWidgets.append(pageWidget);
- mainLayout->addWidget(pageWidget);
- adjustSize();
-}
-
-void PagesContainerWidget::dragEnterEvent(QDragEnterEvent* event) {
- event->acceptProposedAction();
-}
-
-void PagesContainerWidget::dropEvent(QDropEvent* event) {
- QPoint pos = event->pos();
- int page = (pos.x() / (CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH));
- ((PDFTableWidget*)ancestor)->moveSelectedPages(event->mimeData()->text(), pageWidgets.at(page));
- event->acceptProposedAction();
-}
-
-PDFFileWidget::PDFFileWidget(QWidget* parent) :QFrame(parent) {
- setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
- setFrameStyle(QFrame::Box);
-
- topLayout = new QGridLayout();
-
- collapseButton = new QPushButton();
- collapseButton->resize(QSize(COLLAPSE_BUTTON_WIDTH, COLLAPSE_BUTTON_HEIGHT));
- collapseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- collapseButton->setIcon(QIcon(":/img/collapse.png"));
- connect(collapseButton, SIGNAL(released()), this, SLOT(collapsedButtonClicked()));
- topLayout->addWidget(collapseButton, 0, 0);
-
- fileNameLabel = new QLabel();
- fileNameLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- topLayout->addWidget(fileNameLabel, 0, 1);
-
- removeButton = new QPushButton();
- removeButton->resize(QSize(COLLAPSE_BUTTON_WIDTH, COLLAPSE_BUTTON_HEIGHT));
- removeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- removeButton->setIcon(QIcon(":img/remove.png"));
- connect(collapseButton, SIGNAL(released()), this, SLOT(collapsedButtonClicked()));
- topLayout->addWidget(removeButton, 0, 2);
-
- pagesContainerWidget = new PagesContainerWidget();
- scrollArea = new QScrollArea();
- scrollArea->setWidget(pagesContainerWidget);
- scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- topLayout->addWidget(scrollArea, 1, 0, 1, 3);
-
- topLayout->setContentsMargins(6, 10, 6, 10);
- setLayout(topLayout);
-
- setCollapsed(false);
- selected = false;
-
- connect(&tgen, SIGNAL(updateThumbnail(QImage,PDFPageWidget*)), this,
- SLOT(updateThumbnail(QImage,PDFPageWidget*)));
-}
-
-void PDFFileWidget::setAncestor(QWidget* ancestor) {
- this->ancestor = ancestor;
- pagesContainerWidget->setAncestor(ancestor);
- connect(this, SIGNAL(fileClicked(PDFFileWidget*, QMouseEvent*)), ancestor,
- SLOT(fileClicked(PDFFileWidget*, QMouseEvent*)));
-}
-
-void PDFFileWidget::setSelected(bool select) {
- selected = select;
- update();
-}
-
-void PDFFileWidget::mousePressEvent(QMouseEvent* event) {
- emit fileClicked(this, event);
-}
-
-void PDFFileWidget::paintEvent(QPaintEvent* event) {
- QPalette palette = this->palette();
- QPalette labelPalette = fileNameLabel->palette();
- if(selected) {
- palette.setColor(foregroundRole(), palette.color(QPalette::Highlight));
- labelPalette.setColor(foregroundRole(), palette.color(QPalette::Highlight));
- } else {
- palette.setColor(foregroundRole(), palette.color(QPalette::Dark));
- labelPalette.setColor(foregroundRole(), palette.color(QPalette::Text));
- }
- this->setPalette(palette);
- fileNameLabel->setPalette(labelPalette);
-
- QFrame::paintEvent(event);
-}
-
-void PDFFileWidget::updateThumbnail(QImage img, PDFPageWidget* pw) {
- pw->setThumbnail(img);
-}
-
-void PDFFileWidget::setCollapsed(bool state) {
- collapsed = state;
- if(state == true) {
- scrollArea->hide();
- collapseButton->setIcon(QIcon(":/img/expand.png"));
- } else {
- scrollArea->show();
- collapseButton->setIcon(QIcon(":img/collapse.png"));
- }
-}
-
-void PDFFileWidget::collapsedButtonClicked(void) {
- setCollapsed(!collapsed);
-}
-
-void PDFFileWidget::removeButtonClicked(void) {
- emit fileRemoveButtonClicked(this);
-}
-
-void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName) {
- document->setRenderHint(Poppler::Document::TextAntialiasing);
- Poppler::Document* doc = Poppler::Document::load(fileName);
- doc->setRenderHint(Poppler::Document::TextAntialiasing);
-
- int numPages = document->numPages();
- for(int i = 0; i < numPages; i++) {
- Poppler::Page* pdfPage = document->page(i);
-
- PDFPageWidget* pageWidget = new PDFPageWidget();
-
- pageWidget->setAncestor(ancestor);
- pageWidget->setFather(this);
- pageWidget->setPopplerPage(doc->page(i));
- tgen.render(pageWidget, pdfPage);
-
- pagesContainerWidget->addPageWidget(pageWidget);
- }
- tgen.start();
- fileNameLabel->setText(fileName);
-}
-
-int PDFFileWidget::removeChild(PDFPageWidget* child) {
- int pos = pagesContainerWidget->pageWidgets.indexOf(child);
- pagesContainerWidget->pageWidgets.remove(pos);
- pagesContainerWidget->mainLayout->removeItem(pagesContainerWidget->mainLayout->itemAt(pos));
-
- pagesContainerWidget->adjustSize();
- return pos;
-}
-
-int PDFFileWidget::indexChild(PDFPageWidget* child) {
- return pagesContainerWidget->pageWidgets.indexOf(child);
-}
-
-void PDFFileWidget::insertChildAt(PDFPageWidget* child, int pos) {
- child->setFather(this);
- pagesContainerWidget->mainLayout->insertWidget(pos, child);
- pagesContainerWidget->pageWidgets.insert(pos, child);
-
- pagesContainerWidget->adjustSize();
-}
-
diff --git a/src/pdf_file_widget.h b/src/pdf_file_widget.h
deleted file mode 100644
index d180ccf..0000000
--- a/src/pdf_file_widget.h
+++ /dev/null
@@ -1,88 +0,0 @@
-#pragma once
-#include
-#include
-#include
-#include "pdf_page_widget.h"
-#include "thumbgen.h"
-
-class QImage;
-class QHBoxLayout;
-class QGridLayout;
-class QScrollArea;
-class QPushButton;
-class QLabel;
-class QString;
-class QSize;
-class QPoint;
-class QDragEnterEvent;
-class QDropEvent;
-class QMouseEvent;
-class QPaintEvent;
-class ThumbGen;
-class PDFPageWidget;
-
-class PagesContainerWidget : public QWidget {
- Q_OBJECT
-public:
- PagesContainerWidget(QWidget* parent = 0);
- QSize sizeHint() const;
- QVector pageWidgets;
- QHBoxLayout* mainLayout;
-
- void addPageWidget(PDFPageWidget* image);
- void setAncestor(QWidget* ancestor) {this->ancestor = ancestor; }
-
-protected:
- void dragEnterEvent(QDragEnterEvent* event);
- void dropEvent(QDropEvent* event);
-
-private:
- int getPagesCount() const;
- QWidget* ancestor;
-};
-
-class PDFFileWidget : public QFrame {
- Q_OBJECT
- Q_PROPERTY(bool collapsed READ isCollapsed WRITE setCollapsed)
-
-public:
- PDFFileWidget(QWidget* parent = 0);
-
- void setAncestor(QWidget* ancestor);
- void setDocument(Poppler::Document* document, QString fileName);
- int removeChild(PDFPageWidget* child);
- int indexChild(PDFPageWidget* child);
- void insertChildAt(PDFPageWidget* child, int pos);
-
- void setSelected(bool select);
- bool isSelected(void) { return selected; }
- bool isCollapsed(void) { return collapsed; }
- void setCollapsed(bool collapsed);
-
-protected:
- void mousePressEvent(QMouseEvent* event);
- void paintEvent(QPaintEvent* event);
-
-private slots:
- void removeButtonClicked(void);
- void collapsedButtonClicked(void);
- void updateThumbnail(QImage, PDFPageWidget*);
-
-private:
- ThumbGen tgen;
- QGridLayout* topLayout;
-
- QLabel* fileNameLabel;
- QPushButton* collapseButton;
- QPushButton* removeButton;
- PagesContainerWidget* pagesContainerWidget;
- QScrollArea* scrollArea;
- QWidget* ancestor;
- bool collapsed;
- bool selected;
-
-signals:
- void fileRemoveButtonClicked(PDFFileWidget*);
- void fileClicked(PDFFileWidget*, QMouseEvent*);
-};
-
diff --git a/src/pdf_jam.cpp b/src/pdf_jam.cpp
deleted file mode 100644
index b7c232f..0000000
--- a/src/pdf_jam.cpp
+++ /dev/null
@@ -1,185 +0,0 @@
-#include
-#include
-#include
-#include
-#include "pdf_jam.h"
-
-PDFJam::PDFJam(void) {
-
-}
-
-/* Ensure the folder exists. */
-void PDFJam::makeFolder(QString path) {
- QString tmp = "mkdir -p %1 && rm %2*";
- int value = system(tmp.arg(path).arg(path).toStdString().c_str());
- /*if(value != 0)
- qDebug() << "ERROR: Failed to make " << path;*/
-}
-
-void PDFJam::pushCommand(QString cmd) {
- mutex.lock();
- cmdQueue.push_back(cmd);
- mutex.unlock();
- if(!isRunning()) start();
-}
-
-/* Rotate PDF page clockwise. */
-bool PDFJam::rotatePage(int fileIndex, int rotatedPageIndex, int degree) {
- if((degree != 90) && (degree != 180) && (degree != 270)) {
- return false;
- }
-
- QString rtTmp = "pdf%1 /tmp/hpdf/%2/%3.pdf --outfile /tmp/hpdf/%4/%5.pdf ";
- QString cmd = rtTmp.arg(QString::number(degree)).arg(QString::number(fileIndex))
- .arg(QString::number(rotatedPageIndex)).arg(QString::number(fileIndex))
- .arg(QString::number(rotatedPageIndex));
- pushCommand(cmd);
-}
-
-/* Remove page in a pdf file. */
-bool PDFJam::removePage(int fileIndex, int numPages, int deletedPageIndex) {
- if((deletedPageIndex < 0) || (deletedPageIndex >= numPages)) {
- return false;
- }
- /*QString tmp = "file1.pdf '-' file2.pdf '1,2' file3.pdf '2-2' --outfile output.pdf"*/
- QString rmTmp = "rm /tmp/hpdf/%1/%2.pdf ";
- QString cmd = rmTmp.arg(QString::number(fileIndex)).arg(QString::number(deletedPageIndex));
- QString tmp = "mv /tmp/hpdf/%1/%2.pdf /tmp/hpdf/%3/%4.pdf ";
-
- for(int i = deletedPageIndex+1; i < numPages; i++) {
- cmd += "&& " + tmp.arg(QString::number(fileIndex)).arg(QString::number(i))
- .arg(QString::number(fileIndex)).arg(QString::number(i-1));
- }
-
- pushCommand(cmd);
-}
-
-void PDFJam::cutPage(int fileIndex, int numPages, int pageIndex, int slot) {
- if((pageIndex < 0) || (pageIndex >= numPages)) {
- return;
- }
-
- copyPage(fileIndex, numPages, pageIndex, 0);
- removePage(fileIndex, numPages, pageIndex);
-}
-
-void PDFJam::copyPage(int fileIndex, int numPages, int pageIndex, int slot) {
- QString cpTmp = "cp /tmp/hpdf/%1/%2.pdf /tmp/hpdf/clipboard%3.pdf";
- QString cmd = cpTmp.arg(QString::number(fileIndex)).arg(QString::number(pageIndex))
- .arg(QString::number(slot));
- pushCommand(cmd);
-}
-
-void PDFJam::pastePage(int fileIndex, int numPages, int pageIndex, int slot) {
- /* TODO: Check if the clipboard file exists. */
- QString cmd = "";
- QString mvTmp = "mv /tmp/hpdf/%1/%2.pdf /tmp/hpdf/%3/%4.pdf ";
- for(int i = numPages-1; i >= pageIndex; i--) {
- cmd += mvTmp.arg(QString::number(fileIndex)).arg(QString::number(i))
- .arg(QString::number(fileIndex)).arg(QString::number(i+1));
- if(i > pageIndex) cmd += " && ";
- }
-
- QString pasteTmp = "cp /tmp/hpdf/clipboard%3.pdf /tmp/hpdf/%1/%2.pdf ";
- cmd += " && " + pasteTmp.arg(QString::number(fileIndex))
- .arg(QString::number(pageIndex)).arg(QString::number(slot));
- pushCommand(cmd);
-}
-
-void PDFJam::movePage(int fromFileIndex, int fromFileNumPage, int fromPageIndex,
- int toFileIndex, int toFileNumPage, int toPageIndex) {
- /* TODO: Back up clipboard. */
- /* If this page is moving with files update to file index. */
- if(toFileIndex == fromFileIndex) {
- toFileNumPage--;
- if(toPageIndex > fromPageIndex)
- toPageIndex--;
- toPageIndex--;
- }
-
- cutPage(fromFileIndex, fromFileNumPage, fromPageIndex, 0);
- pastePage(toFileIndex, toFileNumPage, toPageIndex, 0);
-}
-
-void PDFJam::savePageAsImage(Poppler::Page pp, QString dst, double dpi = 72) {
-
-}
-
-
-/* Export file number 'fileIndex' to destination. */
-/* Supported n-up, orientation, offset options. */
-void PDFJam::exportFile(int fileIndex, int numPages, QString dst,
- QSize nup = QSize(1,1), bool isLandscape = false, bool hasTwoSideOffset = false,
- int leftOffset = 0, int rightOffset = 0) {
-
- QString cmd = "pdfjam ";
- QString tmp = "/tmp/hpdf/%1/%2.pdf '-' ";
-
- for(int i = 0; i < numPages; i++) {
- cmd += tmp.arg(QString::number(fileIndex)).arg(QString::number(i));
- }
-
- QString orientation = isLandscape?" --landscape ": " --no-landscape ";
- cmd = orientation;
- if((nup.width() == 1) || (nup.height() != 1)) {
- QString nupTmp = " --nup '%1x%1' --frame true ";
- cmd += nupTmp.arg(QString::number(nup.width())).arg(QString::number(nup.height()));
- }
-
- QString outTmp = " --outfile %1 ";
- cmd += outTmp.arg(dst);
- pushCommand(cmd);
- /* Offset comes next. */
-}
-
-void PDFJam::loadFile(QString fileName, int fileIndex, Poppler::Document* pd) {
- int numPages = pd->numPages();
- QString path = "/tmp/hpdf/%1/";
- path = path.arg(QString::number(fileIndex));
- makeFolder(path);
-
- QString tmp = "pdfjam %1 %2 --outfile %3%4.pdf %5";
- QString cmd = "";
- for(int i = 0; i <= numPages; i++) {
- QString orientation = " --no-landscape ";
- QSizeF pageSize = pd->page(i)->pageSizeF();
- if(pageSize.width() > pageSize.height()) {
- orientation = " --landscape ";
- }
- cmd += tmp.arg(fileName).arg(QString::number(i+1)).arg(path)
- .arg(QString::number(i)).arg(orientation) + " ; ";
- }
- pushCommand(cmd);
-
- /* Test the backend functions. */
- rotatePage(0, 5, 270);
- movePage(0, numPages, 5, 0, numPages, 10);
- /*removePage(0, numPages, 5);*/
- exportFile(0, numPages, "/home/allanis/conco.pdf", QSize(2, 2), true, true, 1, 0);
- /* End test. */
-}
-
-QString PDFJam::nextCommand(void) {
- QString cmd;
- mutex.lock();
- cmd = cmdQueue.first();
- cmdQueue.pop_front();
- mutex.unlock();
- return cmd;
-}
-
-bool PDFJam::isQueueEmpty(void) {
- return (cmdQueue.size()==0);
-}
-
-void PDFJam::run(void) {
- while(!isQueueEmpty()) {
- QString cmd = nextCommand();
- int value = system(cmd.toStdString().c_str());
- if(value != 0)
- qDebug() << "ERROR: Failed to execute " << cmd;
- else
- qDebug() << "SUCCESS: executed " << cmd;
- }
-}
-
diff --git a/src/pdf_jam.h b/src/pdf_jam.h
deleted file mode 100644
index b1b6487..0000000
--- a/src/pdf_jam.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#pragma once
-#include
-#include
-#include
-#include
-
-class PDFPageWidget;
-class QImage;
-
-class PDFJam : public QThread {
- Q_OBJECT
-public:
- PDFJam(void);
-
- void pushCommand(QString);
- void loadFile(QString fileName, int, Poppler::Document*);
- void exportFile(int, int, QString, QSize, bool, bool, int, int);
- void savePageAsImage(Poppler::Page pp, QString dst, double);
- void movePage(int, int, int, int, int, int);
-
- void pastePage(int, int, int, int);
- void copyPage(int, int, int, int);
- void cutPage(int, int, int, int);
-
- bool removePage(int, int, int);
- bool rotatePage(int, int, int);
- void makeFolder(QString);
-
-protected:
- void run(void);
-
-private:
- QVector cmdQueue;
- QString nextCommand(void);
- bool isQueueEmpty(void);
- QMutex mutex;
-};
-
diff --git a/src/pdf_page_widget.cpp b/src/pdf_page_widget.cpp
deleted file mode 100644
index 3c73db3..0000000
--- a/src/pdf_page_widget.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-#include
-#include
-#include "pdf_page_widget.h"
-#include "pdf_table_widget.h"
-
-PDFPageWidget::PDFPageWidget(QWidget* parent) :
- QFrame(parent) {
-
- selected = false;
- setAcceptDrops(true);
-
- this->resize(150, 150);
- this->setMinimumSize(150, 150);
- this->setMaximumSize(150, 150);
- this->setAutoFillBackground(true);
-
- this->setMouseTracking(true);
- this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
-
-
- QHBoxLayout* topHBox = new QHBoxLayout();
- btnRotate = new QPushButton("", this);
- btnRotate->setObjectName("rotate");
- btnRotate->setIcon(QPixmap::fromImage(QImage("img/rotate.png")));
- btnRotate->hide();
- topHBox->addWidget(btnRotate, 0, Qt::AlignLeft);
-
- QHBoxLayout* bottomHBox = new QHBoxLayout();
- btnCut = new QPushButton("", this);
- btnCut->setObjectName("cut");
- btnCut->setIcon(QPixmap::fromImage(QImage("img/cut.png")));
- btnCut->hide();
-
- btnCopy = new QPushButton("", this);
- btnCopy->setObjectName("copy");
-
- btnCopy->setIcon(QPixmap::fromImage(QImage("img/copy.png")));
- btnCopy->hide();
-
- bottomHBox->addWidget(btnCut, 0, Qt::AlignLeft);
- bottomHBox->addWidget(btnCopy, 1, Qt::AlignRight);
-
- QVBoxLayout* vbox = new QVBoxLayout();
- vbox->addLayout(topHBox);
- vbox->addStretch(1);
- vbox->addLayout(bottomHBox);
- vbox->setContentsMargins(0, 3, 0, 3);
- this->setLayout(vbox);
-}
-
-void PDFPageWidget::setAncestor(QWidget* ancestor) {
- this->ancestor = ancestor;
- ((PDFTableWidget*)ancestor)->registerPage(this);
- connect(this, SIGNAL(previewUpdate(Poppler::Page*)), ancestor,
- SIGNAL(previewUpdate(Poppler::Page*)));
-
- connect(this, SIGNAL(pageClicked(PDFPageWidget*, QMouseEvent*, QString)),
- ancestor, SLOT(pageClicked(PDFPageWidget*, QMouseEvent*, QString)));
- connect(this, SIGNAL(pageDropped(PDFPageWidget*, QDropEvent*, QString,QString)),
- ancestor, SLOT(pageDropped(PDFPageWidget*, QDropEvent*, QString,QString)));
-}
-
-void PDFPageWidget::setFather(QWidget* father) {
- this->father = father;
-}
-
-void PDFPageWidget::setPopplerPage(Poppler::Page* pp) {
- pPage = pp;
-}
-
-void PDFPageWidget::setThumbnail(QImage pageImage) {
- image = pageImage;
- pixmap = QPixmap::fromImage(image);
- pixmap = pixmap.scaled(size() - QSize(6,6), Qt::KeepAspectRatio);
-
- update();
-}
-
-void PDFPageWidget::setSelected(bool select) {
- selected = select;
- update();
-}
-
-void PDFPageWidget::mousePressEvent(QMouseEvent* event) {
- if(pPage != NULL) {
- emit pageClicked(this, event, path);
- emit previewUpdate(pPage);
-
- selected = !selected;
- update();
- }
-}
-
-void PDFPageWidget::dragEnterEvent(QDragEnterEvent* event) {
- event->acceptProposedAction();
-}
-
-void PDFPageWidget::dropEvent(QDropEvent* event) {
- emit pageDropped(this, event, event->mimeData()->text(), path);
- event->acceptProposedAction();
-}
-
-void PDFPageWidget::leaveEvent(QEvent* event) {
- btnRotate->hide();
- btnCut->hide();
- btnCopy->hide();
-
- this->setFrameStyle(QFrame::Plain);
-}
-
-void PDFPageWidget::enterEvent(QEvent* event) {
- btnRotate->show();
- btnCut->show();
- btnCopy->show();
-
- this->setFrameStyle(QFrame::StyledPanel | QFrame::Raised);
-}
-
-void PDFPageWidget::paintEvent(QPaintEvent* event) {
- QPalette palette = this->palette();
- if(selected)
- palette.setColor(backgroundRole(), palette.color(QPalette::Highlight));
- else
- palette.setColor(backgroundRole(), palette.color(QPalette::AlternateBase));
- this->setPalette(palette);
-
- QFrame::paintEvent(event);
- QPainter painter(this);
- painter.drawPixmap(QRect((size().width() - pixmap.width()) / 2,
- (size().height() - pixmap.height()) / 2,
- pixmap.width(), pixmap.height()), pixmap);
-}
-
-QSize PDFPageWidget::sizeHint() const {
- return size();
-}
-
diff --git a/src/pdf_page_widget.h b/src/pdf_page_widget.h
deleted file mode 100644
index a7bd7eb..0000000
--- a/src/pdf_page_widget.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#pragma once
-#include
-#include
-
-class QWidget;
-class QPushButton;
-class QImage;
-class QPixmap;
-class QPaintEvent;
-class QEvent;
-class QMouseEvent;
-class QSize;
-
-class PDFPageWidget : public QFrame {
- Q_OBJECT
-public:
- PDFPageWidget(QWidget* parent = 0);
- QSize sizeHint(void) const;
-
- void setThumbnail(QImage pageImage);
- void setPopplerPage(Poppler::Page*);
- void setAncestor(QWidget* ancestor);
- void setFather(QWidget* father);
- QWidget* getFather(void) const { return father; }
- void registerName(QString name) { path = name; }
- QString getName(void) { return path; }
-
- void setSelected(bool select);
- bool isSelected(void) { return selected; }
-
-protected:
- void paintEvent(QPaintEvent* event);
- void enterEvent(QEvent* event);
- void leaveEvent(QEvent* event);
- void mousePressEvent(QMouseEvent* event);
- void dragEnterEvent(QDragEnterEvent* event);
- void dropEvent(QDropEvent* event);
-
-private:
- /*QVector buttons;*/
- QString path;
- QWidget* ancestor;
- QWidget* father;
-
- QImage image;
- Poppler::Page* pPage;
- QPixmap pixmap;
- QPushButton* btnRotate, *btnCut, *btnCopy;
-
- bool selected;
-
-signals:
- void pageClicked(PDFPageWidget*, QMouseEvent*, QString);
- void pageDropped(PDFPageWidget*, QDropEvent*, QString, QString);
- void previewUpdate(Poppler::Page*);
-};
-
diff --git a/src/pdf_preview_widget.cpp b/src/pdf_preview_widget.cpp
deleted file mode 100644
index 1194d21..0000000
--- a/src/pdf_preview_widget.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-#include
-#include "pdf_preview_widget.h"
-
-PDFPreviewWidget::PDFPreviewWidget(QWidget* parent) : QFrame(parent) {
- setCursor(Qt::OpenHandCursor);
- setFrameStyle(QFrame::StyledPanel | QFrame::Plain);
- pPage = NULL;
- currentPixmapSize = QSize(0,0);
-}
-
-void PDFPreviewWidget::regenImage(void) {
- double dpi;
- double dpi2;
- QSize targetSize;
-
- if(currentPixmapSize == QSize(0,0))
- currentPixmapSize = this->size();
-
- targetSize = currentPixmapSize;
- QSizeF oriSize = pPage->pageSizeF();
- double oriDpi = 72;
- dpi = targetSize.height() / (float)oriSize.height()*oriDpi;
- dpi2 = targetSize.width() / (float)oriSize.width()*oriDpi;
- dpi = dpirenderToImage(dpi, dpi);
-}
-
-void PDFPreviewWidget::regenPixmap(void) {
- pixmap = QPixmap::fromImage(previewImage);
- pixmap = pixmap.scaled(currentPixmapSize, Qt::KeepAspectRatioByExpanding);
- currentPixmapSize = pixmap.size();
-}
-
-void PDFPreviewWidget::repositionPixmap(void) {
- currentPixmapPos = QPoint((size().width() - pixmap.width()) / 2,
- (size().height() - pixmap.height()) / 2);
-}
-
-void PDFPreviewWidget::previewUpdate(Poppler::Page* pp) {
- pPage = pp;
- regenImage();
- regenPixmap();
- repositionPixmap();
- update();
-}
-
-void PDFPreviewWidget::resizeEvent(QResizeEvent* event) {
- if(pPage != NULL) {
- repositionPixmap();
- update();
- }
-}
-
-void PDFPreviewWidget::wheelEvent(QWheelEvent* event) {
- if(pPage != NULL) {
- if(event->delta() > 0)
- currentPixmapSize += QSize(30, 30);
- else if(event->delta() < 0)
- currentPixmapSize -= QSize(30, 30);
-
- if(currentPixmapSize.width() < 150 || currentPixmapSize.height() < 150) {
- currentPixmapSize = QSize(150, 150);
- }
-
- regenImage();
- regenPixmap();
- repositionPixmap();
- update();
- }
-}
-
-void PDFPreviewWidget::mousePressEvent(QMouseEvent* event) {
- if(pPage != NULL) {
- setCursor(Qt::ClosedHandCursor);
-
- if(event->button() == Qt::LeftButton) {
- dragStartPos = event->pos();
- lastPixmapPos = currentPixmapPos;
- }
- }
-}
-
-void PDFPreviewWidget::mouseMoveEvent(QMouseEvent* event) {
- if(pPage != NULL) {
- if(!(event->buttons() & Qt::LeftButton)) {
- return;
- }
-
- QPoint currentPos = event->pos();
- QPoint vector = currentPos - dragStartPos;
- QPoint newPos = lastPixmapPos + vector;
-
- if(pixmap.width() > size().width()) {
- if(newPos.x() <= 0 && newPos.x() >= size().width() - pixmap.width())
- currentPixmapPos.setX(newPos.x());
- }
-
- if(pixmap.height() > size().height()) {
- if(newPos.y() <= 0 && newPos.y() >= size().height() - pixmap.height())
- currentPixmapPos.setY(newPos.y());
- }
-
- update();
- }
-}
-
-void PDFPreviewWidget::mouseReleaseEvent(QMouseEvent* event) {
- setCursor(Qt::OpenHandCursor);
-}
-
-void PDFPreviewWidget::paintEvent(QPaintEvent* event) {
- if(pPage != NULL) {
-
- QPainter painter(this);
- painter.drawPixmap(QRect(currentPixmapPos.x(), currentPixmapPos.y(),
- pixmap.width(), pixmap.height()), pixmap);
-
- QFrame::paintEvent(event);
- }
-}
-
diff --git a/src/pdf_preview_widget.h b/src/pdf_preview_widget.h
deleted file mode 100644
index dbfb659..0000000
--- a/src/pdf_preview_widget.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#pragma once
-#include
-#include
-
-class QImage;
-class QPixmap;
-class QSize;
-class QPoint;
-class QResizeEvent;
-class QWheelEvent;
-class QPaintEvent;
-class QMouseEvent;
-
-class PDFPreviewWidget : public QFrame {
- Q_OBJECT
-public:
- explicit PDFPreviewWidget(QWidget* parent = 0);
-
-public slots:
- void regenImage(void);
- void regenPixmap(void);
- void repositionPixmap(void);
- void previewUpdate(Poppler::Page*);
-
-protected:
- void wheelEvent(QWheelEvent* event);
- void paintEvent(QPaintEvent* event);
- void resizeEvent(QResizeEvent* event);
- void mousePressEvent(QMouseEvent* event);
- void mouseMoveEvent(QMouseEvent* event);
- void mouseReleaseEvent(QMouseEvent* event);
-
-private:
- QImage previewImage;
- QPixmap pixmap;
- Poppler::Page* pPage;
-
- QSize currentPixmapSize;
- QPoint currentPixmapPos;
- QPoint lastPixmapPos;
- QPoint dragStartPos;
-
-signals:
- void updatePreview(QImage);
-};
-
diff --git a/src/pdf_table_widget.cpp b/src/pdf_table_widget.cpp
deleted file mode 100644
index 639ea6f..0000000
--- a/src/pdf_table_widget.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-#include
-#include
-#include "pdf_table_widget.h"
-#include "pdf_page_widget.h"
-#include "pdf_file_widget.h"
-
-PDFTableWidget::PDFTableWidget(QWidget* parent) : QFrame(parent) {
- /* Frame (Expanding with VBox) - Scroll Area (Expanding)
- * Container (Expanding with VBox) - Children.
- */
- setFrameStyle(QFrame::StyledPanel | QFrame::Plain);
- setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-
- outerLayout = new QVBoxLayout();
- outerLayout->setContentsMargins(0, 0, 0, 0);
-
- scrollArea = new QScrollArea();
- scrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- scrollArea->setWidgetResizable(true);
- scrollArea->setFrameStyle(QFrame::Plain);
-
- containerLayout = new QVBoxLayout();
- containerLayout->setSpacing(10);
- containerWidget = new QWidget();
- containerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- QWidget* spacer = new QWidget();
- spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- containerLayout->addWidget(spacer);
- containerWidget->setLayout(containerLayout);
-
- scrollArea->setWidget(containerWidget);
-
- outerLayout->addWidget(scrollArea);
-
- setLayout(outerLayout);
-}
-
-void PDFTableWidget::loadFile(QString fileName) {
- Poppler::Document* doc = Poppler::Document::load(fileName);
- files.append(doc);
-
- PDFFileWidget* fileWidget = new PDFFileWidget();
- fileWidget->setAncestor(this);
- fileWidget->setDocument(doc, fileName);
- pdfJam.loadFile(fileName, files.size()-1, doc);
-
- fileWidgets.append(fileWidget);
-
- fileNames.append(fileName);
-
- containerLayout->insertWidget(containerLayout->count()-1, fileWidget);
- connect(fileWidget, SIGNAL(fileRemoveButtonClicked(PDFFileWidget*)), this,
- SLOT(fileRemoveButtonClicked(PDFFileWidget*)));
-}
-
-void PDFTableWidget::registerPage(PDFPageWidget* child) {
- /* Need new name? */
- QString name = QString("/home/pdfpage").append(QString::number(pageChilds.size()));
- qDebug() << "Registering name:";
- qDebug() << name;
- pageChilds[name] = child;
- child->registerName(name);
-}
-
-void PDFTableWidget::fileClicked(PDFFileWidget* sender, QMouseEvent* event) {
- if(event->button() == Qt::LeftButton) {
- if(event->modifiers() != Qt::LeftButton) {
- for(int i = 0; i < selectedFiles.size(); i++) {
- selectedFiles.at(i)->setSelected(false);
- }
-
- selectedFiles.clear();
-
- if(!sender->isSelected()) {
- sender->setSelected(true);
- selectedFiles.append(sender);
- }
- } else {
- if(!sender->isSelected()) {
- sender->setSelected(true);
- selectedFiles.append(sender);
- } else {
- sender->setSelected(false);
- selectedFiles.remove(selectedFiles.indexOf(sender));
- }
- }
- }
-}
-
-void PDFTableWidget::fileRemoveButtonClicked(PDFFileWidget* sender) {
- selectedFiles.remove(selectedFiles.indexOf(sender));
-
- QVector pagesToRemove;
- for(int i = 0; i < selectedPages.size(); i++) {
- if(selectedPages.at(i)->getFather() == sender) {
- pagesToRemove.append(i);
- }
- }
-
- for(int i = 0; i < pagesToRemove.size(); i++) {
- selectedPages.remove(pagesToRemove.at(i));
- }
-
- /* Handle remove file here. */
-}
-
-void PDFTableWidget::pageClicked(PDFPageWidget* sender, QMouseEvent* event, QString path) {
- if(event->button() == Qt::LeftButton) {
- /* Handle selection. */
- if(selectedPages.size() > 0 && event->modifiers() != Qt::ControlModifier) {
- /* Handle Drag. */
- QDrag* drag = new QDrag(this);
- QMimeData* mimeData = new QMimeData;
-
- mimeData->setText(path);
- drag->setMimeData(mimeData);
- drag->setPixmap(QPixmap(":/img/copy.png"));
-
- drag->exec();
- } else {
- if(!sender->isSelected()) {
- sender->setSelected(true);
- PDFFileWidget* senderF = (PDFFileWidget*)sender->getFather();
- int senderPID = senderF->indexChild(sender);
- int senderFID = fileWidgets.indexOf(senderF);
-
- int i = 0;
- for(i = 0; i < selectedPages.size(); i++) {
- PDFPageWidget* target = selectedPages.at(i);
- PDFFileWidget* targetF = (PDFFileWidget*)target->getFather();
- int targetPID = targetF->indexChild(target);
- int targetFID = fileWidgets.indexOf(targetF);
-
- if(targetFID == senderFID && targetFID > senderFID)
- break;
-
- if(targetFID > senderFID)
- break;
- }
-
- selectedPages.insert(i, sender);
- } else {
- sender->setSelected(false);
- selectedPages.remove(selectedPages.indexOf(sender));
- }
- }
- }
- if(event->button() == Qt::RightButton) {
- for(int i = 0; i < selectedPages.size(); i++) {
- selectedPages.at(i)->setSelected(false);
- }
-
- selectedPages.clear();
- }
-}
-
-void PDFTableWidget::pageDropped(PDFPageWidget* sender, QDropEvent* event,
- QString pathFrom, QString pathTo) {
-
- moveSelectedPages(pathFrom, pathTo);
-}
-
-void PDFTableWidget::moveSelectedPages(QString pathFrom, PDFPageWidget* page) {
- moveSelectedPages(pathFrom, page->getName());
-}
-
-void PDFTableWidget::moveSelectedPages(QString pathFrom, QString pathTo) {
- if(selectedPages.size() == 0)
- return;
-
- bool accept = false;
- for(int i = 0; i < selectedPages.size(); i++)
- if(selectedPages.at(i)->getName() == pathFrom)
- accept = true;
-
- if(!accept)
- return;
-
- for(int i = 0; i < selectedPages.size(); i++)
- if(selectedPages.at(i)->getName() == pathTo)
- return;
-
- PDFPageWidget* childTo = pageChilds[pathTo];
- PDFFileWidget* fileTo = (PDFFileWidget*) childTo->getFather();
-
- for(int i = selectedPages.size() - 1; i >= 0; i--) {
- PDFPageWidget* childFrom = selectedPages[i];
- PDFFileWidget* fileFrom = (PDFFileWidget*) childFrom->getFather();
- fileFrom->removeChild(childFrom);
- /*PDFFileWidget* fileFrom = (PDFFileWidget*) childFrom->getFather();*/
-
- /*int posFrom = fileFrom->removeChild(childFrom);*/
- }
- int posTo = fileTo->indexChild(childTo);
-
- for(int i = selectedPages.size() - 1; i >= 0; i--) {
- PDFPageWidget* childFrom = selectedPages[i];
- PDFFileWidget* fileFrom = (PDFFileWidget*)childFrom->getFather();
- fileTo->insertChildAt(childFrom, posTo);
- /*fileFrom->insertChildAt(childTo, posFrom);*/
- }
-}
-
diff --git a/src/pdf_table_widget.h b/src/pdf_table_widget.h
deleted file mode 100644
index 914f171..0000000
--- a/src/pdf_table_widget.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#pragma once
-#include
-#include
-#include
-
-#include "pdf_jam.h"
-#include "pdf_page_widget.h"
-
-class QImage;
-class QVBoxLayout;
-class QString;
-class QScrollArea;
-class QMouseEvent;
-class QPoint;
-class PDFFileWidget;
-
-class PDFTableWidget : public QFrame {
- Q_OBJECT
-public:
- PDFTableWidget(QWidget* parent = 0);
- void loadFile(QString fileName);
- void registerPage(PDFPageWidget* child);
-
-protected:
- PDFJam pdfJam;
-
-private:
- QVBoxLayout* outerLayout;
- QScrollArea* scrollArea;
- QWidget* containerWidget;
- QVBoxLayout* containerLayout;
-
- QVector files;
- QVector fileNames;
- QVector fileWidgets;
-
- QHash pageChilds;
-
-signals:
- void pageClicked(QMouseEvent*, QImage);
- void previewUpdate(Poppler::Page*);
-
-private slots:
- void fileRemoveButtonClicked(PDFFileWidget*);
- void pageClicked(PDFPageWidget*, QMouseEvent*, QString);
- void pageDropped(PDFPageWidget*, QDropEvent*, QString, QString);
-
- void fileClicked(PDFFileWidget*, QMouseEvent*);
-
-private:
- QVector selectedPages;
- QVector selectedFiles;
-
- /*bool operator()(PDFPageWidget* e1, PDFPageWidget* e2);*/
-public:
- void moveSelectedPages(QString, QString);
- void moveSelectedPages(QString, PDFPageWidget* page);
-};
-
diff --git a/src/thumbgen.cpp b/src/thumbgen.cpp
deleted file mode 100644
index d66b975..0000000
--- a/src/thumbgen.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#include
-#include
-#include "thumbgen.h"
-#include "pdf_page_widget.h"
-
-ThumbGen::ThumbGen(void) {
-
-}
-
-double ThumbGen::calcDpi(Poppler::Page* pdfPage, QSize targetSize) {
- double dpi;
- QSizeF oriSize = pdfPage->pageSizeF();
- double oriDpi = 72;
-
- if(targetSize.width() > targetSize.height()) {
- dpi = targetSize.height() / (float)oriSize.height()*72;
- } else {
- dpi = targetSize.width() / (float)oriSize.width()*72;
- }
-
- return dpi;
-}
-
-void ThumbGen::run(void) {
- while(pWidgets.size() != 0) {
- mutex.lock();
- PDFPageWidget* pw = pWidgets.first();
- pWidgets.pop_front();
- Poppler::Page* pp = pPages.first();
- pPages.pop_front();
- mutex.unlock();
-
- double dpi = calcDpi(pp, pw->size());
- QImage pageImage = pp->renderToImage(dpi, dpi);
- emit updateThumbnail(pageImage, pw);
- }
-}
-
-void ThumbGen::render(PDFPageWidget* pw, Poppler::Page* pp) {
- mutex.lock();
- pWidgets.append(pw);
- pPages.append(pp);
- mutex.unlock();
-}
-