diff --git a/src/pdf_file_widget.cpp b/src/pdf_file_widget.cpp index ae2c437..46ef26f 100644 --- a/src/pdf_file_widget.cpp +++ b/src/pdf_file_widget.cpp @@ -2,6 +2,7 @@ #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 @@ -39,8 +40,8 @@ void PagesContainerWidget::dragEnterEvent(QDragEnterEvent* event) { void PagesContainerWidget::dropEvent(QDropEvent* event) { QPoint pos = event->pos(); - qDebug() << "FILE DROP"; - qDebug() << (pos.x() / (CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH)); + int page = (pos.x() / (CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH)); + ((PDFTableWidget*)ancestor)->moveSelectedPages(event->mimeData()->text(), pageWidgets.at(page)); event->acceptProposedAction(); } @@ -86,6 +87,7 @@ PDFFileWidget::PDFFileWidget(QWidget* parent) :QFrame(parent) { void PDFFileWidget::setAncestor(QWidget* ancestor) { this->ancestor = ancestor; + pagesContainerWidget->setAncestor(ancestor); connect(this, SIGNAL(fileClicked(PDFFileWidget*, QMouseEvent*)), ancestor, SLOT(fileClicked(PDFFileWidget*, QMouseEvent*))); } @@ -165,12 +167,19 @@ int PDFFileWidget::removeChild(PDFPageWidget* 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 index 6ca5edb..d180ccf 100644 --- a/src/pdf_file_widget.h +++ b/src/pdf_file_widget.h @@ -30,6 +30,7 @@ public: QHBoxLayout* mainLayout; void addPageWidget(PDFPageWidget* image); + void setAncestor(QWidget* ancestor) {this->ancestor = ancestor; } protected: void dragEnterEvent(QDragEnterEvent* event); @@ -37,6 +38,7 @@ protected: private: int getPagesCount() const; + QWidget* ancestor; }; class PDFFileWidget : public QFrame { @@ -49,6 +51,7 @@ 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); void setSelected(bool select); diff --git a/src/pdf_jam.cpp b/src/pdf_jam.cpp index 61b49ae..7278e9e 100644 --- a/src/pdf_jam.cpp +++ b/src/pdf_jam.cpp @@ -54,8 +54,49 @@ bool PDFJam::removePage(int fileIndex, int numPages, int deletedPageIndex) { pushCommand(cmd); } -void PDFJam::movePage(int fromFileIndex, int fromPageIndex, int toFileIndex, int toPageIndex) { - +void PDFJam::cutPage(int fileIndex, int numPages, int pageIndex) { + if((pageIndex < 0) || (pageIndex >= numPages)) { + return; + } + + copyPage(fileIndex, numPages, pageIndex); + removePage(fileIndex, numPages, pageIndex); +} + +void PDFJam::copyPage(int fileIndex, int numPages, int pageIndex) { + QString cpTmp = "cp /tmp/hpdf/%1%2.pdf /tmp/hpdf/clipboard.pdf "; + QString cmd = cpTmp.arg(QString::number(fileIndex)).arg(QString::number(pageIndex)); + pushCommand(cmd); +} + +void PDFJam::pastePage(int fileIndex, int numPages, int pageIndex) { + /* 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.pdf /tmp/hpdf/%1/%2.pdf "; + cmd += " && " + pasteTmp.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 page is moving with files update to file index. */ + if(toFileIndex == fromFileIndex) { + toFileNumPage--; + if(toPageIndex > fromPageIndex) + toPageIndex--; + toPageIndex--; + } + + cutPage(fromFileIndex, fromFileNumPage, fromPageIndex); + pastePage(toFileIndex, toFileNumPage, toPageIndex); } void PDFJam::savePageAsImage(Poppler::Page pp, QString dst, double dpi = 72) { @@ -109,9 +150,10 @@ void PDFJam::loadFile(QString fileName, int fileIndex, Poppler::Document* pd) { pushCommand(cmd); /* Test the backend functions. */ - /*removePage(0, numPages, 5); rotatePage(0, 5, 270); - exportFile(0, numPages-1, "/home/allanis/conco.pdf", QSize(2, 2), true, true, 1, 0);*/ + 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. */ } diff --git a/src/pdf_jam.h b/src/pdf_jam.h index 1f1ba3b..e19909e 100644 --- a/src/pdf_jam.h +++ b/src/pdf_jam.h @@ -16,8 +16,11 @@ public: 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 fromFileIndex, int fromPageIndex, int toFileIndex, int toPageIndex); - + void movePage(int, int, int, int, int, int); + void pastePage(int, int, int); + void copyPage(int, int, int); + void cutPage(int, int, int); + bool removePage(int, int, int); bool rotatePage(int, int, int); void makeFolder(QString); diff --git a/src/pdf_page_widget.h b/src/pdf_page_widget.h index b38b0fc..a7bd7eb 100644 --- a/src/pdf_page_widget.h +++ b/src/pdf_page_widget.h @@ -21,8 +21,9 @@ public: void setPopplerPage(Poppler::Page*); void setAncestor(QWidget* ancestor); void setFather(QWidget* father); - QWidget* getFather() { return 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; } diff --git a/src/pdf_table_widget.cpp b/src/pdf_table_widget.cpp index 3f3d758..639ea6f 100644 --- a/src/pdf_table_widget.cpp +++ b/src/pdf_table_widget.cpp @@ -1,4 +1,5 @@ #include +#include #include "pdf_table_widget.h" #include "pdf_page_widget.h" #include "pdf_file_widget.h" @@ -106,61 +107,97 @@ void PDFTableWidget::fileRemoveButtonClicked(PDFFileWidget* sender) { void PDFTableWidget::pageClicked(PDFPageWidget* sender, QMouseEvent* event, QString path) { if(event->button() == Qt::LeftButton) { /* Handle selection. */ - if(event->modifiers() != Qt::ControlModifier) { - for(int i = 0; i < selectedPages.size(); i++) { - selectedPages.at(i)->setSelected(false); - } + if(selectedPages.size() > 0 && event->modifiers() != Qt::ControlModifier) { + /* Handle Drag. */ + QDrag* drag = new QDrag(this); + QMimeData* mimeData = new QMimeData; - selectedPages.clear(); + mimeData->setText(path); + drag->setMimeData(mimeData); + drag->setPixmap(QPixmap(":/img/copy.png")); - if(!sender->isSelected()) { - sender->setSelected(true); - selectedPages.append(sender); - } + drag->exec(); } else { if(!sender->isSelected()) { sender->setSelected(true); - selectedPages.append(sender); + 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); + } - /* 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(); + selectedPages.clear(); } } void PDFTableWidget::pageDropped(PDFPageWidget* sender, QDropEvent* event, QString pathFrom, QString pathTo) { - /* - * We have dragged the page and dropped it. - * So we'll handle backend operations here. - */ - - /* Frontend operations here.. */ - if(pathFrom == pathTo) - return; - qDebug() << pathFrom; - qDebug() << pathTo; - PDFPageWidget* childFrom = pageChilds[pathFrom]; - PDFPageWidget* childTo = pageChilds[pathTo]; - - PDFFileWidget* fileFrom = (PDFFileWidget*) childFrom->getFather(); - PDFFileWidget* fileTo = (PDFFileWidget*) childTo->getFather(); - - int posFrom = fileFrom->removeChild(childFrom); - int posTo = fileTo->removeChild(childTo); - - fileTo->insertChildAt(childFrom, posTo); - fileFrom->insertChildAt(childTo, posFrom); + + 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 index df16b43..914f171 100644 --- a/src/pdf_table_widget.h +++ b/src/pdf_table_widget.h @@ -50,5 +50,10 @@ private slots: private: QVector selectedPages; QVector selectedFiles; + + /*bool operator()(PDFPageWidget* e1, PDFPageWidget* e2);*/ +public: + void moveSelectedPages(QString, QString); + void moveSelectedPages(QString, PDFPageWidget* page); };