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(); -} -